Local AI MCP
OfficialLocal AI MCP is an MCP server for discovering, managing, benchmarking, and using local model runtimes with hardware-aware routing and local-by-default privacy.
List configured runtimes, installed models, loaded models, and model metadata.
Pull, load, unload, remove, and ensure models are ready, including background pull jobs and LRU/all eviction.
Check provider health, diagnostics, system resources, and estimate GPU/CPU fit for models at a given context length and KV-cache precision.
Benchmark real inference for time-to-first-token, generation speed, and prompt throughput.
Search an offline catalog or live Hugging Face GGUF models, and suggest best models for tasks on the current machine.
Run completions and embeddings, with JSON/JSON-Schema output, vision inputs, streaming progress, seeds, sampling controls, and context-length control.
Delegate tasks to the best local model in one call, preferring loaded/fitting models and explaining routing decisions.
Keep inference local by default; hosted providers are opt-in, and results report provider, host, and local status.
Support multiple runtimes and extra provider instances, exposed via 19 tools, resources, and prompts over stdio only.
Allows managing local Ollama models: discover installed and loaded models, pull/remove models, load/unload from memory, check hardware fit, and offload inference (completion and embedding) to local Ollama instances.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Local AI MCP list installed models"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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/sWhy 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.
Related MCP server: Ollama MCP Server
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-mcpClaude 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 |
| ✓ / ✓ | ✓ progress | ✓ ( | ✓ | ✓ | Native |
LM Studio | always |
| ✓ / ✓ | ✓ via | ✓ via | ✓ via | ✓ | Lifecycle needs the |
llama.cpp ( | always |
| ✓ / ✓ ( | – | – | – | ✓ | One model per server; start with |
Docker Model Runner | always |
| ✓ / – | ✓ progress | on first request | ✓ | ✓ | Enable host-side TCP support in Docker Desktop |
MLX ( |
| – | ✓ / – | – | on first request | – | – | Apple Silicon; switches models per request |
vLLM |
| – | ✓ / ✓ | – | – | – | ✓ |
|
Foundry Local |
| dynamic port | ✓ / ✓ | ✓ progress | ✓ (TTL) | – | – | Find the port with |
OpenAI-compatible (Jan, LocalAI, …) |
| – | ✓ / ✓ | – | – | – | ✓ | Local or hosted, inferred from the host |
Moonshot AI (Kimi) |
|
| ✓ / – | – | – | – | – | 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_checkanddiagnosticscontact 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 |
| Configured runtimes: kind (local/hosted), live status, capabilities |
| Installed models on each live provider | |
| Models resident in memory, with VRAM use and context length | |
| Family, size, quantization, context length and layer architecture | |
Lifecycle |
| Heavy. Downloads to one provider, streaming progress notifications. |
| Check or stop background pulls | |
| Destructive. | |
| One provider, with optional | |
| Pull (if allowed), fit check, evict others ( | |
Ops |
| Reachability, version, runtime metrics |
| Effective config (keys redacted), per-provider detection with latency and errors, speed cache, hardware probe sources. Paste it into bug reports | |
| RAM and GPUs (NVIDIA, AMD, Intel, Apple Silicon), each tagged with its data source | |
| Returns | |
| Heavy. Warmup, then N runs: time-to-first-token, generation and prompt tokens/sec. | |
Registry |
| Built-in offline catalog |
| Best models for a task on this machine: largest that fits on the GPU first, flags installed ones | |
| Live Hugging Face GGUF search with per-quantization fit and pull references ( | |
Delegation |
| Run a completion on a model you choose: system prompt, JSON / JSON-schema output (validated), seed, sampling, images, |
| Embeddings, always one vector per input | |
| 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 |
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 |
| standard local ports | Always-on runtimes |
| unset | Opt-in runtimes |
| unset | JSON array of extra instances |
| unset | Comma-separated types or names to skip |
| unset, | Hosted Moonshot provider |
| off | Let calls without a |
| off | Forbid Hugging Face search |
| per-user cache dir | Where |
|
| Non-streamed requests |
|
| Detection probes |
|
| Downloads ( |
|
| Abort a stream only if no token arrives for this long |
|
| Hard cap on a streamed completion ( |
|
| Detection and model-list cache |
Troubleshooting
A provider isn't detected. Run
diagnostics(orhealth_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 stdioCI runs on Linux, Windows and macOS with Node 22 (the minimum supported) and 24. 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
Available Tools
22 toolsbenchmarkBenchmarkA
HEAVY: Runs REAL inference. Measures a model on this machine with a warmup (absorbs load time) plus N streamed runs: time-to-first-token, generation tokens/sec (runtime-reported when available, else measured after the first token), and prompt-processing speed. Pass models[] to compare several models with the same prompt, ranked by generation speed.
Inputs: runs, model, models, prompt, +3 more. Returns: results
completeDelegated completionARead-only
DELEGATED INFERENCE: Offload a completion to a model you choose for cost savings and privacy. Without provider, runs on the live LOCAL provider that has the model (never a hosted API unless LOCAL_AI_ALLOW_HOSTED_FALLBACK is set); the result's 'provider', 'host' and 'local' fields say where it ran. Supports system prompts, JSON / JSON-Schema output (validated 'parsed' field), seed/topP/topK, image inputs for vision models, and contextLength for long inputs. Streams tokens via MCP progress notifications when the client sends a progressToken.
Inputs: model (required), seed, stop, topK, +13 more. Returns: host, text, local, model, +2 more
delegateDelegate a task to the best local modelA
ONE CALL to offload work locally: pick the best model for a task on THIS machine, make it ready, and run it. Prefers models already loaded (no load cost), then installed models that fit your free VRAM, then (with allowPull) the best catalog model that fits. Task specialists (coder, vision, reasoning) win over general models; then larger fitting models win, grouped into size tiers (within ~20% parameter count); inside a tier, the model benchmarked fastest on this machine wins (run benchmark to record speeds; results expire after 14 days). Never uses a hosted provider unless allowHosted is true (or, when allowHosted is omitted, LOCAL_AI_ALLOW_HOSTED_FALLBACK is set), and even then any suitable local model is preferred. Models that only fit in system RAM run on CPU when nothing fits the GPU. Returns the completion plus a 'routing' block explaining the choice.
Inputs: task (required), seed, stop, topK, +17 more. Returns: text, model, routing, provider
diagnosticsDiagnosticsARead-onlyIdempotent
One read-only snapshot for troubleshooting: the effective configuration (API keys never shown, only whether one is set), every configured provider with its detection result, latency and error, the benchmark speed cache, and how hardware was probed. Paste its output into bug reports.
Inputs: no named parameters. Returns: config, hardware, providers, speedCache
embedDelegated embeddingsARead-onlyIdempotent
DELEGATED EMBEDDINGS: Generate embeddings for a string or an array of texts. Without provider, runs on the live local provider that has the model. Always returns one vector per input.
Inputs: input (required), model (required), provider. Returns: host, local, model, provider, +2 more
ensure_modelEnsure model is readyAIdempotent
Make a model ready in one call: optionally pull it, check it fits current free VRAM, unload other models if needed (evict: 'lru' or 'all'), load it, and verify. Use dryRun:true to get the plan without changing anything.
Inputs: model (required), evict, dryRun, provider, +4 more. Returns: fit, plan, model, ready, +2 more
fit_checkFit checkARead-onlyIdempotent
Will a model run on this machine, and where? Uses the installed model's size and exact layer architecture when the runtime exposes it (else parameter-count or catalog estimates) to size weights + KV cache for a context length, then compares with free VRAM summed across GPUs and available RAM. Returns target gpu / partial (GPU+CPU split) / cpu / none, with the numbers and how the KV estimate was made. Credits back memory the model already uses if it is loaded.
Inputs: model (required), provider, sizeBytes, kvCacheType, +2 more. Returns: fits, note, model, loaded, +4 more
health_checkHealth checkARead-onlyIdempotent
Check whether each provider is reachable and report its version (and live metrics such as vLLM KV-cache usage). Without provider, checks every configured provider, including hosted ones.
Inputs: provider. Returns: health
list_loadedList loaded modelsARead-onlyIdempotent
List models currently loaded into memory on each live provider, with VRAM use and context length where the runtime reports them.
Inputs: provider. Returns: loaded
list_modelsList installed modelsARead-onlyIdempotent
List models installed/available on each live provider, keyed by provider. Pass provider to query just one.
Inputs: provider. Returns: models
list_providersList providersARead-onlyIdempotent
List configured model runtimes (Ollama, LM Studio, llama.cpp, Docker Model Runner, and any opt-in MLX / vLLM / Foundry Local / OpenAI-compatible / hosted instances) with host, kind (local or hosted), live status, and capabilities.
Inputs: provider. Returns: providers
load_modelLoad modelAIdempotent
Load a model into memory on ONE provider so it is ready for inference. Optional keepAlive (e.g. '5m', '1h') and contextLength. Without provider, uses the live local provider that has the model.
Inputs: model (required), provider, keepAlive, contextLength. Returns: load
model_infoModel infoARead-onlyIdempotent
Detailed metadata for one model (family, parameter size, quantization, context length, and layer architecture where available). Without provider, queries the live local providers that have the model.
Inputs: model (required), provider. Returns: info, model
pull_cancelCancel pullAIdempotent
Stop a background pull started with pull_model { background: true }. Finished jobs are returned unchanged.
Inputs: jobId (required). Returns: job
pull_modelPull modelAIdempotent
HEAVY: Download a model onto ONE provider (multiple GB, can take a long time). Streams download progress via MCP progress notifications when the client sends a progressToken. With background:true, returns a jobId immediately instead; poll pull_status and stop it with pull_cancel (use this when the client has no progress display or a short tool timeout). Without provider, uses the provider that already has the model, else the first live local provider that can pull.
Inputs: model (required), provider, background. Returns: job, pull
pull_statusPull statusARead-onlyIdempotent
Status of background pulls started with pull_model { background: true }: state (running, done, failed, cancelled), progress, and result or error. Without jobId, lists every job this server remembers (finished jobs are kept for an hour; jobs are forgotten on restart).
Inputs: jobId. Returns: jobs
remove_modelRemove modelADestructive
DESTRUCTIVE: Permanently delete a model from one provider. provider is REQUIRED (no fan-out). If the client supports elicitation the user is asked to confirm directly; otherwise confirm:true is required.
Inputs: model (required), provider (required), confirm. Returns: remove
search_availableSearch catalogARead-onlyIdempotent
Search the built-in curated catalog of well-known local models (Ollama tags) by name, family, or task. Offline and instant. For live results with per-quant fit, use search_models with source 'huggingface'.
Inputs: query (required). Returns: note, query, results
search_modelsSearch models (live)ARead-onlyIdempotent
Find models to download, annotated with whether each fits this machine. source 'huggingface' searches GGUF repos on the Hugging Face Hub and returns per-quant sizes, the best quant for this hardware, and pullable references (Ollama: hf.co/:). source 'catalog' searches the offline curated list. The Ollama library has no public search API, so it is not a source.
Inputs: query (required), task, limit, source, +2 more. Returns: query, source, results
suggest_modelSuggest modelARead-onlyIdempotent
Recommend catalog models for a task, ranked for THIS machine: fully-on-GPU first, then partial GPU offload, then CPU-only. Within a tier the largest (most capable) model comes first unless preferSpeed is true. Flags models already installed on a live provider and explains each pick.
Inputs: task (required), kvCacheType, preferSpeed, contextLength. Returns: task, suggestions
system_resourcesSystem resourcesARead-onlyIdempotent
Report local hardware: platform, total/available RAM, CPU count, and GPUs with total/free VRAM (NVIDIA via nvidia-smi, AMD/Intel via sysfs or the Windows registry, Apple Silicon unified memory). Each GPU names its data source.
Inputs: no named parameters. Returns: gpus, cpuCount, platform, ramFreeBytes, +1 more
unload_modelUnload modelAIdempotent
Unload a model from memory to free VRAM/RAM on ONE provider. Without provider, uses the live local provider that has it loaded.
Inputs: model (required), provider. Returns: unload
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 22 tools
Most tools map to a distinct resource (providers, models, hardware, pulls), but several pairs overlap meaningfully: search_available is explicitly a subset of search_models (source 'catalog'), diagnostics partially duplicates health_check + system_resources, and ensure_model overlaps with the pull_model/load_model/fit_check combination. complete vs delegate is also a judgement call for an agent, since both run inference and only the description clarifies which to pick. Descriptions do a lot of work to disambiguate, keeping this above a 2.
The dominant pattern is snake_case verb_noun (pull_model, list_models, search_models, remove_model, suggest_model), but it is mixed with noun_noun (model_info, system_resources, health_check, fit_check) and bare single-word tools (complete, delegate, embed, benchmark, diagnostics). Everything is readable and there is some within-family consistency (list_*, pull_*, search_*), but the overall set does not follow one predictable convention.
22 tools is on the heavy side for a local-runtime manager, and a few do not clearly earn their place: search_available is redundant with search_models, and pull_status/pull_cancel are arguably one job-status tool. The remaining surface (lifecycle, discovery, hardware, inference) is defensible, so this sits at borderline rather than excessive.
The model lifecycle is well covered end to end: search/suggest, pull with background jobs, load/unload, fit check, benchmark, delete, plus inference (complete/delegate/embed) and hardware/diagnostics. Minor gaps remain, notably no way to add or edit provider configuration, no model copy/alias/rename, and no way to cancel long-running non-pull work such as benchmark. These are workaround-able rather than blocking.
Maintenance
Related MCP Connectors
Chat, image, video, and audio models from many vendors behind one remote MCP server and one key.
MCP server for building and testing AI agents with multi-model experimentation and insights.
An MCP server that provides an API to LLMs to manage their JumpCloud resources.
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
Related MCP Servers
- AlicenseAqualityBmaintenanceDiscovers local model runtimes such as Ollama, LM Studio, and LocalAI, and exposes their endpoint metadata to MCP clients like Copilot.38 npmMIT
- AlicenseNot gradedqualityAmaintenanceEnables MCP-compatible applications to interact with local and cloud-hosted LLM models for model management, text generation, chat, embeddings, and web search/fetch.956 npmAGPL 3.0
- AlicenseNot gradedqualityAmaintenanceEnables MCP-compatible clients to manage, run, and interact with local or cloud LLM models through exposed tools for listing, pulling, generating, chatting, embeddings, and web search/fetch. Supports Claude Desktop, Cline, and hybrid local/cloud setups.956 npmAGPL 3.0
- AlicenseNot gradedqualityAmaintenanceEnables MCP-compatible applications to manage and use local or cloud-hosted models, including listing, pulling, generating, chatting, embeddings, and web search/fetch through a unified tool interface.956 npmAGPL 3.0