mcptools
Click on "Install 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., "@mcptoolssearch the web for latest AI news"
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.
web-tools-mcp-server (mcptools)
An all-in-one MCP server for local LLMs (Gemma, gpt-oss, Qwen, etc. via LM Studio, Ollama, or any MCP client). It gives a model the capabilities small local models lack: live web access, precise math, the current date, shell + code execution, filesystem and SQLite access, a persistent memory, and semantic search (RAG) over your own files using LM Studio embeddings.
Transport: stdio (local).
Config:
~/.config/mcptools/config.json(auto-created on first run).No cloud keys required — search is Startpage (+ Google headless fallback), weather is open-meteo, embeddings are your local LM Studio.
39 tools in 10 config-gated groups.
Table of contents
Related MCP server: MCP Server
Tools (39, in 10 groups)
Group | Tools | Notes |
web |
| Mojeek; HTML→text/markdown |
compute |
| mathjs; IANA timezones |
system |
| unrestricted, timeout-guarded; python/node/bash |
files |
| grep/glob/exact + line-based edits without shell quoting; PDF→JSON; binary-safe downloads |
data |
| any local |
knowledge |
| keyless |
feeds |
| keyless live sources |
memory |
| persistent SQLite at |
tasks |
| persistent checklist at |
rag |
| embeddings via LM Studio; vectors in |
⚠️ Security:
run_command,execute_code,write_file,edit_file,download_fileand unrestricted filesystem access run with your user's full privileges (only timeouts, no sandbox — as configured). Run this server only with clients/models you trust, or disable those groups in the config (see Configuration).
Tool reference
Every tool returns human-readable text plus structuredContent for programmatic
clients. Responses are capped to limits.characterLimit and truncated with a note.
web
Tool | Key arguments | Returns |
|
| Ranked results: title, url, snippet |
|
| Cleaned page content (scripts/nav stripped) |
|
| Absolute links with anchor text |
|
| title, description, canonical, OpenGraph |
|
| status, headers, body (any REST API) |
compute
Tool | Key arguments | Returns |
|
| mathjs result (functions, constants, units) |
|
| ISO + human time + unix seconds |
system
Tool | Key arguments | Returns |
|
| File contents, pageable with line numbers (PDFs auto-detected, text extracted per page) |
|
| Bytes written (creates parent dirs) |
|
| Entries with type + size |
|
| exit code, stdout, stderr (system shell) |
|
| exit code, stdout, stderr |
|
| Desktop notification via |
| — | mcptools version, enabled/disabled groups, config + data paths |
files
Tool | Key arguments | Returns |
|
| Matches as |
|
| Matching paths with sizes |
|
| Exact in-place replacement (errors if not found / ambiguous); returns edited region |
|
| Line-based edits (use |
|
| PDF as JSON: metadata + per-page text (write to file for big PDFs, then |
|
| Binary-safe download to disk (pairs with |
data
Tool | Key arguments | Returns |
|
| Rows (SELECT) or change count |
|
| Matching slice as JSON |
knowledge
Tool | Key arguments | Returns |
|
| Article title, summary, url |
|
| Current conditions + daily forecast |
feeds
Tool | Key arguments | Returns |
|
| Feed items: title, link, date, summary (RSS 2.0 + Atom) |
|
| Stories with points, comments, discussion link (Algolia, keyless) |
|
| Papers with abstract + |
|
| Full caption transcript as text |
memory
Tool | Key arguments | Returns |
|
| Confirmation (upsert) |
|
| Matching notes |
| — | All keys with tags + timestamps |
|
| Confirmation |
tasks
Tool | Key arguments | Returns |
|
| New task id |
|
| Checklist with ids |
|
| Marks done (or deletes with |
rag
Tool | Key arguments | Returns |
|
| Files + chunks indexed (skips on backend error) |
|
| Ranked passages with source + score |
| (none) | Indexed sources with chunk counts + store totals |
|
| Chunks deleted + updated store totals |
Install & build
cd ~/Code/mcptools
npm install
npm run build # compiles to dist/Requires Node ≥ 22 (uses the built-in node:sqlite). python3 is needed
for execute_code with language: "python".
Run
node dist/index.js # speaks MCP over stdioThe first run writes a default ~/.config/mcptools/config.json.
Register with a client
Install script (recommended)
npm run install:claude # Claude Code (~/.claude.json, user scope)
npm run install:opencode # OpenCode (~/.config/opencode/opencode.json)
npm run install:all # bothMerges the mcptools entry into the client's user-level config (everything
else in the file is preserved; re-running updates the entry in place). Build
first — the script points the client at dist/index.js.
Claude Code (manual)
claude mcp add mcptools -- node ./dist/index.jsOpenCode
Add to ~/.config/opencode/config.json (global) or a project opencode.json,
under the mcp key:
{
"mcp": {
"mcptools": {
"type": "local",
"command": ["node", "./dist/index.js"],
"enabled": true
}
}
}Restart OpenCode (or start a new session) to spawn the server. Verify with
/mcp inside OpenCode, or list tools from the TUI.
Generic MCP client (mcpServers JSON)
{
"mcpServers": {
"mcptools": {
"command": "node",
"args": ["./dist/index.js"]
}
}
}💡 Small local models choose tools more reliably with fewer of them. If 39 tools is too many for your model, disable groups in the config rather than the client — see below.
Configuration (~/.config/mcptools/config.json)
{
"groups": { // turn whole tool groups on/off
"web": true, "compute": true, "system": true, "data": true,
"knowledge": true, "memory": true, "rag": true
},
"tools": { // per-tool overrides win over group, e.g.:
// "run_command": false,
// "write_file": false
},
"limits": {
"timeoutMs": 30000, // network/exec timeout
"characterLimit": 25000, // max chars per tool response
"maxOutputBytes": 1000000 // max bytes captured from a process/file/fetch
},
"lmstudio": {
"baseUrl": "http://localhost:1234/v1",
"embeddingModel": "text-embedding-nomic-embed-text-v1.5"
},
"paths": { "dataDir": "~/.config/mcptools" }
}Per-tool overrides (
tools) take precedence over the group switch.Hot env overrides:
MCPTOOLS_LMSTUDIO_URL,MCPTOOLS_EMBED_MODEL.For a safe, read-only-ish profile set
"system": false(and optionally"data": false) ingroups.
A copy of the defaults lives in config.example.json.
RAG / embedding server
rag_index and rag_search call any OpenAI-compatible
/v1/embeddings endpoint. At startup, the server auto-detects which
embedding backend is running and uses it:
The URL in
lmstudio.baseUrl(orMCPTOOLS_LMSTUDIO_URLenv var) — primary.http://localhost:1234/v1— LM Studio.http://localhost:8089/v1— highllama / llama.cpp.
For each, it hits /v1/models with a 2 s timeout, picks the most promising
embedding model (configured id, then anything with embed/bge/minilm/e5
in its id), and verifies with a real probe /v1/embeddings call that the
model actually returns a numeric vector. This rejects llama.cpp servers that
are currently serving a chat model (the common case — llama.cpp loads one
model at a time, so if it's busy with gemma-4-26B for chat, it can't also
serve embeddings). For single-model servers with a name that doesn't match
the patterns, the same probe is used as a fallback so custom-named embedding
models are still discovered. The chosen endpoint is logged to stderr on
startup, e.g.:
[mcptools/rag] using LM Studio (1234) with model "text-embedding-nomic-embed-text-v1.5"If nothing is reachable, the configured values are used and the embedding call will fail with a clear error.
⚠️ Embedding model crashing on GPU — load it on CPU
Observed with text-embedding-nomic-embed-text-v1.5: the model crashes
mid-request ("The model has crashed... Exit code: null") and then fails to reload
("unable to allocate CUDA0 buffer"). Root cause is GPU/CUDA, not the input —
the same chunks embed fine on CPU. This tiny (~84 MB) model runs fast on CPU.
Load it CPU-only (the lms CLI is the only place that sets the GPU layer-offload
ratio — the REST API does not):
~/.lmstudio/bin/lms unload --all
~/.lmstudio/bin/lms load text-embedding-nomic-embed-text-v1.5 --gpu off -yLoads in ~0.5 s and embeds reliably. An explicitly-loaded model has no TTL and stays resident until LM Studio restarts, so JIT won't reload it on the GPU.
Persisting it (headless / no GUI). The GUI "per-model default" is the correct knob and applies to JIT loading, but LM Studio only writes it from the GUI (into an undocumented internal file — don't hand-edit it). Headless options:
Run the
lms load ... --gpu offcommand at login (e.g. asystemd --useroneshot unit, or append it to your existing~/.lmstudio/load-optimized.sh).Or just run it once per LM Studio session before using RAG.
If you have the GUI on another machine: My Models → ⚙️ → set GPU offload = 0.
Defensive hardening (any backend)
Inputs are embedded one at a time (batched array input crashes some backends).
Each embed call retries with backoff.
rag_indexskips any chunk that still fails and reports the count, instead of aborting the whole index.
Development
npm run dev # tsx watch (no build step)
npm run build # type-check + compile
npm run clean # remove dist/Project layout:
src/
index.ts entry: load config, register enabled tools, stdio
config.ts config load/merge + defaults (~/.config/mcptools)
registry.ts group/tool enable gating
types.ts shared types
services/ search (mojeek), lmstudio (embeddings), vectorstore
tools/ web, compute, system, data, knowledge, memory, rag
util/ http, html, exec, sqlite, format, errorsData files created at runtime under paths.dataDir (default
~/.config/mcptools): config.json, memory.db, rag.db.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Appeared in Searches
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/highercomve/mcptools'
If you have feedback or need assistance with the MCP directory API, please join our Discord server