Local AI MCP
Run, fit, and route work to local LLMs (Ollama, LM Studio, llama.cpp, MLX, vLLM, and more).
التثبيت
أضف هذا إلى إعدادات MCP في عميلك (Claude Desktop: claude_desktop_config.json، وCursor: .cursor/mcp.json، ويستخدم VS Code وغيره الصيغة نفسها «mcpServers»).
@tmhs/local-ai-mcpclaude mcp add local-ai-mcp -e 'OLLAMA_HOST=http://localhost:11434' -e 'LMSTUDIO_HOST=http://localhost:1234' -e 'LLAMACPP_HOST=http://localhost:8080' -e 'DOCKER_MODEL_RUNNER_HOST=http://localhost:12434' -e 'MLX_HOST=<MLX_HOST>' -e 'VLLM_HOST=<VLLM_HOST>' -e 'VLLM_API_KEY=<your vllm_api_key>' -e 'FOUNDRY_LOCAL_HOST=<FOUNDRY_LOCAL_HOST>' -e 'OPENAI_COMPAT_HOST=<OPENAI_COMPAT_HOST>' -e 'OPENAI_COMPAT_API_KEY=<your openai_compat_api_key>' -e 'MOONSHOT_API_KEY=<your moonshot_api_key>' -e 'LOCAL_AI_ALLOW_HOSTED_FALLBACK=<LOCAL_AI_ALLOW_HOSTED_FALLBACK>' -e 'MOONSHOT_HOST=https://api.moonshot.ai/v1' -e 'LOCAL_AI_DISABLE=<LOCAL_AI_DISABLE>' -e 'LOCAL_AI_PROVIDERS=<LOCAL_AI_PROVIDERS>' -e 'LOCAL_AI_DISABLE_NETWORK_SEARCH=<LOCAL_AI_DISABLE_NETWORK_SEARCH>' -e 'LOCAL_AI_BENCHMARK_CACHE=<LOCAL_AI_BENCHMARK_CACHE>' -- npx -y @tmhs/local-ai-mcp@0.6.1
{
"mcpServers": {
"local-ai-mcp": {
"command": "npx",
"args": [
"-y",
"@tmhs/local-ai-mcp@0.6.1"
],
"env": {
"OLLAMA_HOST": "http://localhost:11434",
"LMSTUDIO_HOST": "http://localhost:1234",
"LLAMACPP_HOST": "http://localhost:8080",
"DOCKER_MODEL_RUNNER_HOST": "http://localhost:12434",
"MLX_HOST": "<MLX_HOST>",
"VLLM_HOST": "<VLLM_HOST>",
"VLLM_API_KEY": "<your vllm_api_key>",
"FOUNDRY_LOCAL_HOST": "<FOUNDRY_LOCAL_HOST>",
"OPENAI_COMPAT_HOST": "<OPENAI_COMPAT_HOST>",
"OPENAI_COMPAT_API_KEY": "<your openai_compat_api_key>",
"MOONSHOT_API_KEY": "<your moonshot_api_key>",
"LOCAL_AI_ALLOW_HOSTED_FALLBACK": "<LOCAL_AI_ALLOW_HOSTED_FALLBACK>",
"MOONSHOT_HOST": "https://api.moonshot.ai/v1",
"LOCAL_AI_DISABLE": "<LOCAL_AI_DISABLE>",
"LOCAL_AI_PROVIDERS": "<LOCAL_AI_PROVIDERS>",
"LOCAL_AI_DISABLE_NETWORK_SEARCH": "<LOCAL_AI_DISABLE_NETWORK_SEARCH>",
"LOCAL_AI_BENCHMARK_CACHE": "<LOCAL_AI_BENCHMARK_CACHE>"
}
}
}
}
متغيرات البيئة
OLLAMA_HOSTOllama base URLLMSTUDIO_HOSTLM Studio server base URLLLAMACPP_HOSTllama.cpp server (llama-server) base URLDOCKER_MODEL_RUNNER_HOSTDocker Model Runner host TCP endpointMLX_HOSTmlx_lm.server base URL (opt-in; Apple Silicon)VLLM_HOSTvLLM OpenAI server base URL (opt-in)VLLM_API_KEYسري Bearer token for VLLM_HOST (when vLLM runs with --api-key)FOUNDRY_LOCAL_HOSTFoundry Local service URL (opt-in; port from `foundry service status`)OPENAI_COMPAT_HOSTAny OpenAI-compatible /v1 server (opt-in)OPENAI_COMPAT_API_KEYسري Bearer token for OPENAI_COMPAT_HOSTMOONSHOT_API_KEYسري Moonshot AI (Kimi) key. Hosted: only used when named explicitly.LOCAL_AI_ALLOW_HOSTED_FALLBACKAllow implicit routing to hosted providers (default: off)MOONSHOT_HOSTMoonshot API base URLLOCAL_AI_DISABLEComma-separated provider names to skip probingLOCAL_AI_PROVIDERSJSON array of extra provider instances: {type, host, name?, apiKey?, kind?}LOCAL_AI_DISABLE_NETWORK_SEARCHKeep search_models offline (catalog only)LOCAL_AI_BENCHMARK_CACHEBenchmark results file used to rank delegate by measured speed (default: per-user cache dir; off disables)
التوثيق
مأخوذ من ملف README للمشروع على GitHub ويُحدَّث أسبوعيًا. تفتح الروابط على GitHub.
المحتويات
Local AI MCP
One MCP server for every local model runtime on your machine. It knows what fits your GPU, and it never sends a prompt to the cloud unless you tell it to.
Local AI MCP gives your agent (Claude, Cursor, VS Code, and others) one control plane for Ollama, LM Studio, llama.cpp, Docker Model Runner, MLX, vLLM and Foundry Local. Your agent can see what's installed and loaded, check what will actually fit in your VRAM, get models ready, and hand work off to the best local model with a single delegate call.
# illustrative session
You: Summarise these 40 pages of meeting notes locally, I don't want them in the cloud.
Agent: → delegate { task: "summarize", prompt: "...", contextLength: 32768 }
← routing: ollama / qwen3:14b — already loaded (no load cost); general model; fits: gpu
local: true · 412 tokens · 38 tok/s
Why use it
- It knows your hardware.
fit_checksizes the KV cache from the model's actual layer architecture, adds up VRAM across GPUs, models partial GPU/CPU offload, and understands Apple Silicon unified memory. It answers "will this model run, and where?" with numbers rather than guesses. - It works across runtimes. If you run Ollama and LM Studio, each call goes to the runtime that actually has the model. Lifecycle actions such as pull, load and unload affect exactly one runtime.
- It keeps data local by default. Hosted providers such as Moonshot are opt-in, and a call without a
providerargument never uses one. Every result reportsprovider,hostandlocal, so you can see where inference ran. - It handles operations, not just chat. Pull with progress, load with a context size, evict least-recently-used models to make room, benchmark time-to-first-token and tokens per second, and search Hugging Face for GGUF quantizations that fit your machine.
Things to ask your agent
- "What can I run for coding on this laptop?" →
suggest_model, thenensure_model - "Free up my GPU." →
list_loaded, thenunload_model(or use thefree-vramprompt) - "Benchmark my installed coder models and tell me which is fastest." →
benchmark { models: [...] } - "Find a newer Gemma build that fits my 12 GB card." →
search_models { source: "huggingface" } - "Extract the invoice fields from this text as JSON, locally." →
delegate { task: "extract", responseFormat: { type: "json_schema", ... } } - "Will Llama 3.1 70B run here with 32K context?" →
fit_check { model, contextLength: 32768 }
Quick start
Install at least one runtime (Ollama, LM Studio, llama.cpp, Docker Model Runner, MLX, vLLM or Foundry Local), then add the server to your client. No configuration is needed for runtimes on their default ports.
Claude Code
claude mcp add local-ai -- npx -y @tmhs/local-ai-mcp
Claude Desktop. Download the .mcpb file from the latest release and open it. You get a settings screen for hosts and no JSON to edit. Alternatively, add this to claude_desktop_config.json:
{
"mcpServers": {
"local-ai": { "command": "npx", "args": ["-y", "@tmhs/local-ai-mcp"] }
}
}
Cursor / VS Code. Use the install buttons above, or add the same command/args to .cursor/mcp.json or .vscode/mcp.json (VS Code uses a top-level "servers" key instead of "mcpServers").
Windsurf, Cline, Zed and other clients. Any stdio MCP client works: the command is npx, the args are ["-y", "@tmhs/local-ai-mcp"].
Windows: a few clients can't launch
npxdirectly. If the server doesn't start, use"command": "cmd", "args": ["/c", "npx", "-y", "@tmhs/local-ai-mcp"].
Adding a hosted provider (optional). Put MOONSHOT_API_KEY in the server's env. It is only used when a tool call names provider: "moonshot", unless you also set LOCAL_AI_ALLOW_HOSTED_FALLBACK=1.
Supported runtimes
| Runtime | Enabled | Default host | List / loaded | Pull | Load / unload | Remove | Embed | Notes |
|---|---|---|---|---|---|---|---|---|
| Ollama | always | localhost:11434 | ✓ / ✓ | ✓ progress | ✓ (keep_alive, num_ctx) | ✓ | ✓ | Native /api/chat: contextLength sets num_ctx, exact timings, JSON-schema format |
| LM Studio | always | localhost:1234 | ✓ / ✓ | ✓ via lms | ✓ via lms (TTL, context) | ✓ via lms | ✓ | Lifecycle needs the lms CLI; without it, models load on first request |
llama.cpp (llama-server) | always | localhost:8080 | ✓ / ✓ (/slots) | – | – | – | ✓ | One model per server; start with --embeddings for embed |
| Docker Model Runner | always | localhost:12434 | ✓ / – | ✓ progress | on first request | ✓ | ✓ | Enable host-side TCP support in Docker Desktop |
MLX (mlx_lm.server) | MLX_HOST | – | ✓ / – | – | on first request | – | – | Apple Silicon; switches models per request |
| vLLM | VLLM_HOST | – | ✓ / ✓ | – | – | – | ✓ | health_check reports KV-cache usage and queue depth from /metrics |
| Foundry Local | FOUNDRY_LOCAL_HOST | dynamic port | ✓ / ✓ | ✓ progress | ✓ (TTL) | – | – | Find the port with foundry service status |
| OpenAI-compatible (Jan, LocalAI, …) | OPENAI_COMPAT_HOST | – | ✓ / ✓ | – | – | – | ✓ | Local or hosted, inferred from the host |
| Moonshot AI (Kimi) | MOONSHOT_API_KEY | api.moonshot.ai/v1 | ✓ / – | – | – | – | – | Hosted: never selected implicitly |
You can run more than one instance of a runtime, for example a second Ollama box on your LAN, with LOCAL_AI_PROVIDERS='[{"type":"ollama","name":"ollama-gpu2","host":"http://192.168.1.20:11434"}]'. Use LOCAL_AI_DISABLE=lmstudio,dockermodelrunner to skip probing runtimes you don't use.
Privacy model
- Each provider is either local or hosted. The kind is inferred from its host: loopback, private LAN ranges,
*.local, Tailscale CGNAT andhost.docker.internalcount as local. You can override it per instance inLOCAL_AI_PROVIDERS. - With no
providerargument,complete,embed,delegate,benchmark,load_modeland the other model-scoped tools only consider live local providers that have the model. If the model exists only on a hosted provider, the call fails and tells you how to opt in. - Hosted providers are never probed on routine calls. Only
health_checkcontacts them. search_modelswithsource: "huggingface"queries the Hugging Face Hub, and only when you ask it to. SetLOCAL_AI_DISABLE_NETWORK_SEARCH=1to forbid it.- The server uses stdio only. It never opens a network listener.
Tools (19)
Every tool declares MCP annotations (read-only, destructive, open-world) and an output schema, and returns structured content.
| Group | Tool | What it does |
|---|---|---|
| Discovery | list_providers | Configured runtimes: kind (local/hosted), live status, capabilities |
list_models | Installed models on each live provider | |
list_loaded | Models resident in memory, with VRAM use and context length | |
model_info | Family, size, quantization, context length and layer architecture | |
| Lifecycle | pull_model | Heavy. Downloads to one provider, streaming progress notifications |
remove_model | Destructive. provider is required; asks you directly through MCP elicitation when the client supports it, otherwise needs confirm: true | |
load_model / unload_model | One provider, with optional keepAlive and contextLength | |
ensure_model | Pull (if allowed), fit check, evict others (lru / all), load and verify. dryRun returns the plan only | |
| Ops | health_check | Reachability, version, runtime metrics |
system_resources | RAM and GPUs (NVIDIA, AMD, Intel, Apple Silicon), each tagged with its data source | |
fit_check | Returns gpu / partial / cpu / none for a model at a given context length and KV-cache precision | |
benchmark | Heavy. Warmup, then N runs: time-to-first-token, generation and prompt tokens/sec. models: [...] to compare | |
| Registry | search_available | Built-in offline catalog |
suggest_model | Best models for a task on this machine: largest that fits on the GPU first, flags installed ones | |
search_models | Live Hugging Face GGUF search with per-quantization fit and pull references (hf.co/<repo>:<quant>) | |
| Delegation | complete | Run a completion on a model you choose: system prompt, JSON / JSON-schema output (validated), seed, sampling, images, contextLength |
embed | Embeddings, always one vector per input | |
delegate | One call: picks the best local model for a task (loaded, then installed and fitting, then optionally pulled; larger size tiers first, with speed measured by benchmark on this machine breaking ties within a tier), runs it, and explains the choice |
Resources: local-ai://system, local-ai://loaded (subscribable; updates when models load or unload), and local-ai://models/{provider}.
Prompts: setup, free-vram, benchmark-my-models, pick-model.
Configuration
Every setting is an environment variable, and blank means the default. See .env.example for the full annotated list.
| Variable | Default | Purpose |
|---|---|---|
OLLAMA_HOST, LMSTUDIO_HOST, LLAMACPP_HOST, DOCKER_MODEL_RUNNER_HOST | standard local ports | Always-on runtimes |
MLX_HOST, VLLM_HOST (+VLLM_API_KEY), FOUNDRY_LOCAL_HOST, OPENAI_COMPAT_HOST (+OPENAI_COMPAT_API_KEY) | unset | Opt-in runtimes |
LOCAL_AI_PROVIDERS | unset | JSON array of extra instances {type, host, name?, apiKey?, kind?} |
LOCAL_AI_DISABLE | unset | Comma-separated types or names to skip |
MOONSHOT_API_KEY, MOONSHOT_HOST | unset, https://api.moonshot.ai/v1 | Hosted Moonshot provider |
LOCAL_AI_ALLOW_HOSTED_FALLBACK | off | Let calls without a provider use hosted providers |
LOCAL_AI_DISABLE_NETWORK_SEARCH | off | Forbid Hugging Face search |
LOCAL_AI_BENCHMARK_CACHE | per-user cache dir | Where benchmark results are kept for delegate ranking (expire after 14 days); off disables |
LOCAL_AI_REQUEST_TIMEOUT_MS | 120000 | Non-streamed requests |
LOCAL_AI_DETECT_TIMEOUT_MS | 1500 | Detection probes |
LOCAL_AI_PULL_TIMEOUT_MS | 3600000 | Downloads (0 = no limit) |
LOCAL_AI_STREAM_IDLE_TIMEOUT_MS | 60000 | Abort a stream only if no token arrives for this long |
LOCAL_AI_STREAM_MAX_MS | 1800000 | Hard cap on a streamed completion (0 = none) |
LOCAL_AI_CACHE_TTL_MS | 10000 | Detection and model-list cache |
Troubleshooting
- A provider isn't detected. Run
health_check. Check the host and port. From WSL, use the Windows host IP. From a container, usehost.docker.internal. For Docker Model Runner, enable host-side TCP support. - LM Studio pull/load fails with "requires the lms CLI". Install the
lmsCLI as described in the LM Studio CLI docs so it is onPATH, then restart your MCP client. - llama.cpp
embedfails. Startllama-serverwith--embeddingsand an embedding-capable model. - Answers about long inputs look truncated (Ollama). Pass
contextLength(it setsnum_ctx). The result includes a warning when truncation is likely. - "was not found on any live local provider". The model is either not installed (check
list_models) or only available on a hosted provider. Name that provider explicitly to use it. - macOS memory numbers look low.
system_resourcesreports available memory (free, inactive and purgeable pages) and the Metal working-set limit, not total RAM.
Development
npm install
npm run build # tsc -> dist/
npm test # vitest, fully offline (mocked HTTP, stubbed hardware)
npm run lint # Biome
npm run typecheck # src and tests
npm run gen:tools # regenerate mcp-tools.json after changing tools
npm run smoke # boot the built server over stdio
CI runs on Linux, Windows and macOS with Node 22 and 24, plus a Node 20 runtime check. A nightly workflow tests the adapters against real Ollama and llama.cpp. See CONTRIBUTING.md, including Adding a runtime adapter.
Support
Questions and ideas go in Discussions. Report bugs with the issue templates, and security problems through private reporting. If this saves you time, consider sponsoring.
License
CC-BY-NC-ND-4.0. See LICENSE. Contributions are accepted under the DCO and the inbound grant described in CONTRIBUTING.md.
Built by TMHSDigital
الأسئلة الشائعة
ما هو Local AI MCP؟
Run, fit, and route work to local LLMs (Ollama, LM Studio, llama.cpp, MLX, vLLM, and more).
كيف أثبّت Local AI MCP؟
يعمل على جهازك. في Claude Code: claude mcp add local-ai-mcp -e 'OLLAMA_HOST=http://localhost:11434' -e 'LMSTUDIO_HOST=http://localhost:1234' -e 'LLAMACPP_HOST=http://localhost:8080' -e 'DOCKER_MODEL_RUNNER_HOST=http://localhost:12434' -e 'MLX_HOST=<MLX_HOST>' -e 'VLLM_HOST=<VLLM_HOST>' -e 'VLLM_API_KEY=<your vllm_api_key>' -e 'FOUNDRY_LOCAL_HOST=<FOUNDRY_LOCAL_HOST>' -e 'OPENAI_COMPAT_HOST=<OPENAI_COMPAT_HOST>' -e 'OPENAI_COMPAT_API_KEY=<your openai_compat_api_key>' -e 'MOONSHOT_API_KEY=<your moonshot_api_key>' -e 'LOCAL_AI_ALLOW_HOSTED_FALLBACK=<LOCAL_AI_ALLOW_HOSTED_FALLBACK>' -e 'MOONSHOT_HOST=https://api.moonshot.ai/v1' -e 'LOCAL_AI_DISABLE=<LOCAL_AI_DISABLE>' -e 'LOCAL_AI_PROVIDERS=<LOCAL_AI_PROVIDERS>' -e 'LOCAL_AI_DISABLE_NETWORK_SEARCH=<LOCAL_AI_DISABLE_NETWORK_SEARCH>' -e 'LOCAL_AI_BENCHMARK_CACHE=<LOCAL_AI_BENCHMARK_CACHE>' -- npx -y @tmhs/local-ai-mcp@0.6.1. وفي العملاء الآخرين، الصق إعداد JSON من هذه الصفحة في إعدادات MCP الخاصة بهم.
هل يحتاج Local AI MCP إلى مفتاح API؟
نعم. يتطلب VLLM_API_KEY, OPENAI_COMPAT_API_KEY, MOONSHOT_API_KEY، وتضبطها في إعداداته.
هل Local AI MCP مفتوح المصدر؟
شيفرته علنية على GitHub، لكن المستودع لا يعلن ترخيصًا قياسيًا.
من يصون Local AI MCP؟
ينشره TMHSDigital. يدرجه AI.tn لكنه لا يصونه ولا يوصي به.
من سجل MCP الرسمي. الإدراج ليس توصية: راجع شيفرة الخادم وصلاحياته قبل منحه الوصول إلى بياناتك.