data-ai MCP Server
MCP server that saves Claude Code tokens by delegating bounded tasks to local or cloud LLMs. Works with LM Studio, Ollama, vLLM, DeepSeek, Groq, Cerebras.
Discovered via github-topic:claude-mcp and last synced 3mo ago.
1. Install the package
npx @houtini/lm
2. Add to claude_desktop_config.json
{
"mcpServers": {
"-houtini-lm": {
"command": "npx",
"args": [
"@houtini/lm"
]
}
}
}Config file location: ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) / %APPDATA%\Claude\claude_desktop_config.json (Windows)
no
no
`http://localhost:1234`
yes
yes
*(auto-detect)*
*(none)*
no
yes
yes
URL
no
`100000`
213
yes
yes
Calls
36.9
*(auto-detect)*
7
embed
no
`100000`
### Reasoning-token overhead (lifetime) 124 / 47,183 completion tokens spent on hidden reasoning (0.3%). Low — reasoning is effectively suppressed. ``` The reasoning-token overhead line is the canary for "is `reasoning_effort` actually being honoured on this model and this backend?" — above ~30% is a signal to investigate. ## Structured JSON output Both `chat` and `custom_prompt` accept a `json_schema` parameter that forces the response to conform to a JSON Schema. LM Studio uses grammar-based sampling to guarantee valid output - no hoping the model remembers to close its brackets. ```json { "json_schema": { "name": "code_review", "schema": { "type": "object", "properties": { "issues": { "type": "array", "items": { "type": "object", "properties": { "line": { "type": "number" }, "severity": { "type": "string" }, "description": { "type": "string" } }, "required": ["line", "severity", "description"] } } }, "required": ["issues"] } } } ``` ## Getting good results from local models Qwen, Llama, Nemotron, GLM - they score brilliantly on coding benchmarks now. The gap between a good and bad result is almost always prompt quality, not model capability. I've spent a fair bit of time on this. **Send complete code.** Local models hallucinate details when you give them truncated input. If a file's too large, send the relevant function - not a snippet with `...` in the middle. **Be explicit about output format.** "Return a JSON array" or "respond in bullet points" - don't leave it open-ended. Smaller models need this. **Set a specific persona.** "Expert Rust developer who cares about memory safety" gets noticeably better results than "helpful assistant." **State constraints.** "No preamble", "reference line numbers", "max 5 bullet points" - tell the model what *not* to do as well as what to do. **Include surrounding context.** For code generation, send imports, types, and function signatures - not just the function body. **One call at a time.** As of v2.8.0, houtini-lm enforces this automatically with a request semaphore. Parallel calls queue up and run one at a time, so each gets the full timeout budget instead of stacking. ## Self-test (shakedown) The canonical way to verify an install and get an honest read on what the loaded model can do on your hardware: ```bash npm run shakedown ``` This runs [`shakedown.mjs`](./shakedown.mjs) — an end-to-end test that exercises all seven tools (`discover` → `list_models` → `chat` → `custom_prompt` → `code_task` → `code_task_files` → `embed`) and prints a summary table with real TTFT, tok/s, token counts, and reasoning-token split for each call. Takes under a minute on a decent rig. Sample output tail: ``` Summary 7/7 steps passed on LM Studio, model=nvidia/nemotron-3-nano
custom_prompt
Why it works locally
Required
TTFT (ms)
Default
no
7
✅
*(none)*
no
213
*(auto-detect)*
Scope
43.9
Notes
`http://localhost:1234`
✅