Skip to main content
Glama

English | Français

local-llm-mcp

An MCP server connecting Claude Code to LM Studio, to offload token-expensive work to a local model — without giving up the cloud model's agentic capabilities.

The idea

Claude keeps the driving seat; only the bulk work goes local.

The saving doesn't come from "use a cheaper model." It comes from keeping raw content out of the cloud context: the tools read the files themselves, on the server side, and only return the processed result.

Claude Code  ──(MCP call: "summarize src/**/*.cs")──►  local-llm-mcp
                                                              │
                                                              ├─ reads the files from disk
                                                              ├─ chunks if beyond local context
                                                              └─ queries LM Studio :1234
                                                                       │
Claude Code  ◄────────(≈700 tokens of summary)────────────────────────┘

Without this intermediary, reading a source tree burns tens of thousands of context tokens. With it, the cost shrinks to the size of the response.

Related MCP server: Claude Sidekick

Measurements

Recorded on a real Godot/C# project, with qwen3-coder-30b:

Target

Tokens read locally

Tokens returned

Duration

One 886-line file (46 KB)

13,462

757

49 s

8 JSON data files

35,537

674

50 s

The ratio depends entirely on the task: a summary compresses a lot, an exhaustive extraction much less.

Requirements

  • LM Studio with its local server running (port 1234 by default)

  • Node.js 18 or later

  • Claude Code

  • A loaded model — see Model choice below

Tested on Windows 11. server.js has no Windows-specific dependency (the LM Studio CLI path is resolved per platform), but the helper script start-local.ps1 is PowerShell-specific.

Installation

git clone https://github.com/drangoht/local-llm-mcp.git
cd local-llm-mcp
npm ci

Then register the server with Claude Code, giving the absolute path to server.js:

claude mcp add local-llm --scope user -- node /absolute/path/to/local-llm-mcp/server.js

--scope user makes it available across all your projects. Use --scope project to limit it to the current repo.

Verification: claude mcp list should show local-llm: ✔ Connected.

Exposed tools

Tool

Role

Savings

local_digest

Reads files (globs), applies an instruction, returns only the result. Automatic map-reduce beyond local context.

High — the main tool

local_map

Applies the same instruction to each file separately, one result per file. Batch processing.

High

local_ask

Free-form question, no file reading. Boilerplate, rewording, commit messages, regex.

Low

local_status

Diagnostics: models, aliases, context actually loaded.

Model choice

Two aliases are exposed:

Alias

Default model

Note

code (default)

qwen/qwen3-coder-30b

Answers directly, no reasoning phase.

light

google/gemma-4-e4b

Lighter on VRAM, but always reasons.

The chosen default is the larger model, which deserves an explanation since it's counter-intuitive. On the same short task, measured:

Raw throughput

Tokens produced

Of which discarded internal reasoning

gemma-4-e4b

67 tok/s

347

~85%

qwen3-coder-30b

13.5 tok/s

19

0

The smaller model is five times faster per token, but produces eighteen times more of them for an equivalent result. In useful output, the larger model wins. Also, the enable_thinking: false parameter has no effect on this model, and a max_tokens set too low makes it return an empty content — the server detects this case and reports it explicitly instead of silently returning an empty string.

Adjust to your hardware via LOCAL_MODEL_CODE / LOCAL_MODEL_LIGHT.

Automatic model loading

On startup, the server checks via lms ps --json that the model is loaded with sufficient context, and reloads it if not.

This check exists for a specific reason: LM Studio's defaultContextLength setting is 4096 tokens. Its just-in-time loading (justInTimeModelLoading) therefore brings the model back down to 4096 as soon as the TTL expires or the application restarts — and local_digest then breaks silently: truncated responses, no error raised. It's the most painful failure mode because it's invisible.

The check is non-blocking (the MCP handshake stays around 0.4 s) and costs nothing when the configuration is already correct. Disable it with LOCAL_AUTOLOAD=0.

start-local.ps1 (Windows) does the same thing from a terminal, useful for preloading the model before opening Claude Code to avoid waiting on the first call.

Configuration

All environment variables are optional.

Variable

Default

Role

LMSTUDIO_URL

http://localhost:1234/v1

LM Studio endpoint

LOCAL_MODEL_CODE

qwen/qwen3-coder-30b

Model for the code alias

LOCAL_MODEL_LIGHT

google/gemma-4-e4b

Model for the light alias

LOCAL_CONTEXT

32768

Context required at startup

LOCAL_AUTOLOAD

1

0 disables automatic reloading

LOCAL_TTL_SECONDS

28800

Unload the model after 8 h of inactivity

LOCAL_TIMEOUT_MS

600000

Max call duration (10 min)

LOCAL_ALLOWED_ROOTS

(none)

Roots allowed for reading, separated by ;

LMS_CLI

~/.lmstudio/bin/lms[.exe]

Path to the LM Studio CLI

Restricting reads

By default the server can read any file accessible to the user. To confine it to your code folders:

claude mcp add local-llm --scope user \
  --env LOCAL_ALLOWED_ROOTS="/path/to/projects" \
  -- node /absolute/path/to/local-llm-mcp/server.js

Timeouts on the Claude Code side

In ~/.claude/settings.json:

"env": {
  "MCP_TIMEOUT": "60000",
  "MCP_TOOL_TIMEOUT": "900000"
}

A generous MCP_TOOL_TIMEOUT is necessary: a local_map over several dozen files takes several minutes.

When to delegate locally, when to stay in the cloud

Delegate locally

Keep in the cloud

Summarizing a large file or a directory tree

Deciding on an architecture

Extracting a list (methods, TODOs, dependencies)

Writing code that must be right the first time

Classifying or sorting files by criteria

Debugging a subtle issue

First pass over unfamiliar code

Multi-step reasoning

Boilerplate, commit messages, regex

Anything that commits to functional correctness

Short rule: local is for reducing volume, not for settling a question.

Limitations

  • The local model makes mistakes. It misses edge cases and sometimes invents method names. Its output is a starting point to verify, never a conclusion on anything critical.

  • Modest throughput on a GPU that doesn't fully fit the model in VRAM. On the reference setup (Radeon RX 9070, 16 GB), a 30B model in Q4 overflows by about 3.5 GB and runs at ~13.5 tok/s. A local_map over 40 files takes several minutes.

  • No streaming: results arrive as a single block.

  • A single resident model if VRAM is limited; switching between aliases forces a reload (~16 s for an 18 GB model).

Troubleshooting

Symptom

Likely cause

Fix

LM Studio unreachable

Application closed or server stopped

Open LM Studio, or lms server start

Truncated or inconsistent responses

Context dropped back to 4096

local_status to confirm, then restart the MCP server

Empty response + message about reasoning

light alias with max_tokens too low

Switch to model: "code" or raise max_tokens

First call very slow (~20-30 s)

Model loading

Normal; preload with start-local.ps1

Timeout on the Claude Code side

MCP_TOOL_TIMEOUT too low

See Timeouts above

License

MIT — see LICENSE.

Available Tools

4 tools
local_askA

Pose une question libre au modele local, sans lecture de fichier. Utile pour du boilerplate, une reformulation, une traduction, un message de commit, une regex — tout ce qui ne merite pas le modele cloud.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelNoDefaut : code.
promptYesLa demande.
systemNoConsigne systeme optionnelle.
max_tokensNoDefaut : 1200.

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description must cover behavioral traits. It only states 'no file reading' and hints at local model usage. No mention of safety, side effects, rate limits, or auth. For a mutation-like tool (query), more transparency is needed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core purpose, no extraneous words. Efficient and clear about the tool's raison d'être.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 4 parameters, no output schema, and no annotations, the description is too brief. It lacks details on return format, error handling, token management, and the difference between 'code' and 'light' models.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. Description adds no parameter-specific semantics beyond the schema—e.g., it doesn't explain the 'model' enum values or 'max_tokens' default implications.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool poses a free-form question to the local model without file reading, and lists specific use cases (boilerplate, reformulation, translation, commit message, regex). This differentiates it from siblings like local_map, local_digest, which likely involve file processing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Description provides explicit use cases and notes it's for tasks not worthy of the cloud model. It implies file-reading tasks use siblings, but does not explicitly name alternatives or give when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

local_digestA

Lit un ou plusieurs fichiers EN LOCAL et applique une instruction dessus (resumer, extraire, analyser, repondre a une question), puis ne renvoie QUE le resultat. Le contenu brut des fichiers n'entre jamais dans le contexte de Claude — c'est le principal levier d'economie de tokens. A privilegier avant de lire soi-meme un gros fichier ou un ensemble de fichiers. Fait automatiquement du map-reduce si le volume depasse le contexte local.

ParametersJSON Schema
NameRequiredDescriptionDefault
cwdNoRepertoire de base. Defaut : repertoire courant du serveur.
modelNo"code" (qwen3-coder-30b, defaut, repond directement, recommande partout) ou "light" (gemma-4-e4b, plus leger en VRAM mais raisonne toujours : prevoir max_tokens >= 800).
patternsYesChemins ou globs relatifs a `cwd` (ex: ["src/**/*.cs", "docs/GDD.md"]).
max_tokensNoLongueur max de la reponse. Defaut : 1200.
instructionYesCe que le modele local doit faire du contenu (ex: "Liste les methodes publiques et leur role en une ligne chacune").

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden. It discloses that raw file content never enters Claude's context (token economy), that only the result is returned, and that map-reduce is automatic for large volumes. These are significant behavioral traits. Missing details like authorization or error handling are acceptable for a local read tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, each essential. First sentence states core functionality, second highlights the primary benefit (token savings), third gives usage guidance and map-reduce note. No fluff, front-loaded with key information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 5 parameters, all covered by schema with additional description, no output schema needed (description states only result returned). The description fully explains how the tool works, when to use it, and its token-saving behavior. An agent can correctly select and invoke this tool based solely on this definition.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds meaningful detail: 'model' enum values are explained with usage context (default 'code' is recommended everywhere, 'light' needs larger max_tokens), 'patterns' are clarified as globs relative to cwd, and 'instruction' is exemplified. This adds value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Lit' - reads) and resource ('fichiers EN LOCAL') and clearly states the action: apply an instruction to the content and return only the result. It distinguishes from manual reading by highlighting token savings and map-reduce behavior, and implicitly differentiates from siblings like local_map, local_ask, and local_status by focusing on digestion with an instruction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly recommends using this tool before reading a large file yourself ('A privilegier avant de lire soi-meme un gros fichier ou un ensemble de fichiers'). It also explains the map-reduce fallback for large volumes. However, it does not explicitly state when not to use it or provide direct comparisons to sibling tools beyond the implied purpose.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

local_mapA

Applique la MEME instruction a chaque fichier separement et renvoie un resultat par fichier. Pour le traitement par lot : classer des fichiers, extraire un champ de chacun, detecter un motif dans une arborescence. Traitement sequentiel (le GPU ne parallelise pas utilement) — compter quelques secondes par fichier.

ParametersJSON Schema
NameRequiredDescriptionDefault
cwdNoRepertoire de base.
modelNoDefaut : code.
patternsYesGlobs des fichiers a traiter.
max_filesNoGarde-fou. Defaut : 40.
max_tokensNoLongueur max par fichier. Defaut : 400.
instructionYesInstruction appliquee a chaque fichier individuellement.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully covers behavior: it states the operation is sequential, not parallelizable by GPU, and estimates seconds per file. It also mentions returning a result per file. This is good transparency, though it doesn't detail side effects or error handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is relatively compact, with three sentences: main purpose, examples, and performance note. It starts with the core function, so it's well front-loaded. Could be slightly more concise, but overall efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 6 parameters and no output schema, the description covers the core purpose and performance but does not specify the output format or structure (e.g., how results per file are returned). It is adequate for basic use but incomplete for an agent needing to parse results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the description does not need to add much. It repeats the 'instruction' purpose from the schema but adds no new meaning. The description does not elaborate on patterns, cwd, model, max_files, or max_tokens beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that local_map applies the same instruction to each file separately and returns one result per file. It provides specific examples like classifying files, extracting a field, and detecting patterns, which helps distinguish it from siblings like local_digest, local_ask, and local_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear use cases (batch processing, classification, extraction) and performance characteristics (sequential, seconds per file). However, it does not explicitly state when not to use this tool or compare it to alternatives, so it lacks exclusion guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

local_statusA

Etat de LM Studio : modeles disponibles, modele charge, contexte configure. A appeler en cas d'erreur ou de lenteur inattendue.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, but the description adequately describes the behavioral traits: it is a read-only status check that returns model availability, loaded model, and context. It implies no side effects, which is appropriate for a simple status tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that efficiently conveys the purpose and usage. No wasted words; front-loaded with the core function.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no parameters and no output schema, the description provides enough context about what it returns (available models, loaded model, configured context). It is complete enough for a simple status check, though a native English speaker might need translation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are no parameters, so schema coverage is 100%. The description does not add parameter details, but none are needed. Baseline for 0 parameters is 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns the state of LM Studio, listing available models, loaded model, and configured context. It includes a specific usage scenario (error or unexpected slowness), distinguishing it from siblings like local_digest, local_map, and local_ask.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to call the tool (in case of error or slowness). It does not mention when not to use it, but the context is clear given the sibling tools have different purposes.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 4 tool updatesv1.0.0
    • First observedlocal_ask
    • First observedlocal_digest
    • First observedlocal_map
    • First observedlocal_status

TDQS

A4.1/5.0
Disambiguation4/5

Most tools have distinct purposes: local_digest reads files and returns only the result, local_map processes each file separately, local_ask is a free-form query without file input, and local_status checks the LM Studio state. However, local_digest and local_map could be confused as both involve file processing with instructions, though descriptions clarify the difference.

Naming Consistency5/5

All tool names follow a consistent pattern: 'local_' prefix followed by a descriptive verb in lowercase snake_case (digest, map, ask, status). No mixing of conventions or unexpected variations.

Tool Count5/5

Four tools is well-scoped for a local LLM server. It covers file processing (digest and map), free-form queries (ask), and system status (status). This is neither too sparse nor too heavy for the domain.

Completeness4/5

The tool set covers the main interactions with a local LLM: processing files (digest, map), asking questions (ask), and checking status (status). Minor gaps exist, such as a tool to load/unload models or access raw file content, but these may be outside the intended scope.

Maintenance

ActivitySlowing
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    An MCP server that offloads bulk coding tasks to local LLMs, allowing Claude Code to delegate repetitive work like boilerplate generation and code polishing while preserving its context for complex reasoning.
    10
    1
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that allows Claude Code to offload mechanical tasks such as summarization, classification, and drafting to a local LLM, reducing API costs while keeping Claude in control of complex reasoning and quality review.
    12
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/drangoht/local-llm-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server