openai-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| LOCAL_LLM_MODEL | No | Default model name to use, used in quick single-provider env mode. | |
| LOCAL_LLM_CONFIG | No | Path to the configuration file for the MCP server. Example: ~/.config/openai-mcp/config.json. Written by `npm run configure`. | |
| LOCAL_LLM_BASE_URL | No | Base URL of the OpenAI-compatible or Ollama provider, used in quick single-provider env mode (no config file). | |
| LOCAL_LLM_API_KEY_ENV | No | Name of the environment variable holding the API key for the provider, used in quick single-provider env mode. | |
| LOCAL_LLM_RUN_COMMAND | No | Set to enable shell command execution via `run_command`. Omit to disable shell access entirely. | |
| LOCAL_LLM_DYNAMIC_TOOLS | No | Set to enable dynamic tools (register_tool/unregister_tool). Omit to disable dynamic tools entirely. | |
| LOCAL_LLM_PROVIDER_TYPE | No | Provider type (e.g., `ollama` or `openai`), used in quick single-provider env mode. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| chatA | Chat-completion passthrough to the cheap/local model — cheapest way to offload a small mechanical task. Pass |
| summarizeA | Summarize files or text with the local model. File contents are read server-side and NEVER enter your context — only the summaries come back. Prefer this over reading large files yourself. |
| extractB | Extract structured data from text/files with the local model. Optionally validate output against a JSON schema (one automatic retry on invalid output). |
| classifyC | Classify text/file content into one or more labels with the local model. |
| decideA | Decision-model scoring (ollama /v1/systemone — clef / clef-flash / nimble / tev). Scores 1–64 TYPED questions about a state in ONE forward pass and returns calibrated probabilities per option — no text generation, no output parsing, no retries. Prefer over |
| map_filesA | Run one instruction over many files with the local model (batch job). output='report': get per-file results. output='stage_writes': the model rewrites each file and every change is staged as a diff for your review — NOTHING hits disk until you commit_write. |
| embedA | Embed text/files with an embedding model on the local provider — for semantic dedup, clustering, or find-similar work that generation can't do. Needs an embedding model (e.g. |
| count_tokensA | Estimate token counts for text/files (chars/4 heuristic — ±20% vs a real tokenizer; for input sizing, not billing). Use before run_local_agent/summarize to check fit vs num_ctx. |
| run_local_agentA | Delegate a low-complexity task to the LOCAL SUBAGENT: the cheap model runs its own tool loop (read_file, list_dir, search_files, stage_write, whitelisted run_command, plus any registered dynamic tools) entirely server-side. File contents and intermediate steps never enter your context — you get back a compact final answer + staged-write op ids to review. Use for mechanical, monotonous, or bulk work: finding things, transforming files, answering questions over many files. Do NOT delegate work needing real reasoning, security judgment, or architecture decisions. |
| propose_writeA | Have the local model rewrite/create ONE file per your instruction, staged for review. Returns an op id + diff. Nothing is written until commit_write. Use for mechanical rewrites where the file content shouldn't flow through your own context. |
| propose_editA | Like propose_write, but the local model emits SEARCH/REPLACE hunks instead of the whole file — much more reliable on large files and small models. Server applies the hunks and stages the result as a normal op (same diff/commit flow). |
| stage_deleteA | Stage a file DELETION for review — nothing touches disk until commit_write. The diff shows all lines removed; uncommit_write restores the file afterwards. Use for dead-code cleanup instead of emptying a file with propose_write. |
| list_stagedA | List pending staged writes (proposed changes not yet on disk). |
| get_diffC | Show the unified diff for a staged write op. |
| set_write_modeA | Switch the server's write posture. 'propose' (default): staged writes only — commit_write is refused; you apply diffs with your own tools. 'write': commit_write applies staged ops to disk. persist=true also writes the choice to the server config file. |
| commit_writeA | Apply a staged write to disk (atomic: tmp+rename). Call only AFTER reviewing the diff with get_diff. Refuses if the file changed since it was staged — pass force=true to overwrite anyway. Only works when write_mode is 'write' — do NOT call it in 'propose' mode (it refuses and the permission prompt would just show an opaque op_id). |
| verify_stagedA | Run a whitelisted command against a staged write WITHOUT touching the target file: the op's content is materialized to a temp file in the same directory (import/path resolution matches the real file), '{file}' in argv is replaced by the temp path (appended if absent), and the command runs under the command_whitelist. Use it to typecheck/lint a staged op before commit_write — running a checker on the original path sees the OLD on-disk content, not the stage. restore_paths lists files the command may rewrite (e.g. an auto-updated lint baseline) — snapshotted before, restored after. The temp file is always removed. |
| discard_writeC | Drop a staged write op without applying it. |
| list_commitsA | List recently committed writes (last 20) — for revert_write. |
| revert_writeA | Undo a committed write: stages a NEW op restoring the pre-commit content (goes through normal review — commit_write applies it). |
| uncommit_writeA | One-call undo of a committed write — restores the pre-commit content atomically (deletes files the commit created), no re-staging/re-commit needed. Refuses if the file changed since the commit unless force:true. Requires write_mode 'write' — in 'propose' mode use revert_write + commit_write for the reviewed path. |
| list_modelsA | List models available on a provider. For ollama providers includes size, parameter count, quantization and capabilities — use this plus get_system_resources to pick the biggest model that fits VRAM. |
| get_system_resourcesA | Report host RAM + GPU VRAM and currently-loaded models. Only works for LOCAL ollama providers — returns {unavailable: true} for remote/openai-type providers. Use before picking a model or num_ctx for heavy jobs. Includes |
| pull_modelA | Download a model on an ollama provider (e.g. 'qwen2.5-coder:7b'). Runs as a background job — returns a job_id; poll progress with get_job. Only for ollama providers. |
| search_modelsA | Search the public ollama registry (ollama.com) for models to pull_model. Returns name, description, capability chips (tools/thinking/vision), available parameter sizes, and whether the family is already installed. Requires internet access. |
| list_model_tagsA | List pullable tags for a model in the ollama registry (e.g. model 'gemma4' -> e4b, 12b, 26b, ...). With include_sizes=true, fetches each tag's download size from the registry manifest API (one request per tag). Requires internet access. |
| download_modelA | Download a model from Hugging Face via the |
| get_jobB | Get status/progress of a background job (e.g. a model pull). |
| list_jobsB | List background jobs (most recent first). |
| wait_jobA | Sleep for a number of seconds (max 600), then return. With job_id, returns early as soon as that job reaches done/error — use to poll pull_model/run_local_agent without busy-looping get_job. |
| control_jobA | Steer a running background job: pause (halt between agent steps), resume, cancel (aborts in-flight work too), or inject (append an operator instruction the local agent sees on its next step — for course-correcting a run_local_agent mid-flight). |
| recommend_modelA | Analyze installed models against detected hardware and recommend a default_model for a provider. Prefers tool-calling models that fit the target GPU's free VRAM (or free RAM for CPU-only). With apply=true, writes the pick to the provider's default_model in the config file AND applies it live to this server. |
| delete_modelA | Permanently delete a model from an ollama provider (DELETE /api/delete). Irreversible — the model must be re-pulled to restore. Refuses to delete the provider's default_model or a currently-loaded model unless force=true. |
| prune_modelsA | Bulk-delete old models from an ollama provider. dry_run=true (default) only reports candidates. Always keeps: keep[] ids, the provider default_model, currently-loaded models, and the keep_recent most recently modified others. With dry_run=false, deletes the rest. |
| unload_modelC | Unload a model from VRAM on an ollama provider (frees memory immediately). |
| get_usage_statsA | Session totals: local LLM calls, tokens consumed on the cheap model, and delegated_bytes (bytes of file content processed server-side that never entered your context — i.e. the savings). |
| get_server_infoA | Show this server's config: providers (sanitized), allowed_roots, feature flags, limits. Call this first if unsure what's configured. |
| register_agent_toolA | Register a NEW tool that the local model can call during run_local_agent (persists for this server session; persist=true saves it across restarts). kind='shell': an executable + argv template with ${param} placeholders (execFile, no shell). kind='js': a JS function body run in node:vm as (body)(args). Requires LOCAL_LLM_DYNAMIC_TOOLS=1 on the server. |
| unregister_agent_toolC | Remove a runtime-registered dynamic tool. |
| list_agent_toolsB | List runtime-registered tools available to the local agent. |
| get_command_whitelistA | Show which commands the local agent's run_command tool may execute (argv-level whitelist, no shell). |
| update_command_whitelistB | Add/remove commands the local agent may run. Writes the server config file — prefer tight allow_args over broad access. This tool should stay in Devin's 'ask' permissions. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| delegate | Hand a low-complexity task to the local model via run_local_agent, then review any staged writes. |
| cheap_summary | Summarize a file or directory glob without pulling its contents into context. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 42 tools
The 42 tools cover distinct sub-domains, and detailed descriptions differentiate overlapping pairs like propose_write/propose_edit and revert_write/uncommit_write. However, a few pairs (e.g., decide vs classify, revert_write vs uncommit_write) could still cause misselection without careful reading.
Nearly all tools use snake_case verb_noun (list_staged, commit_write, pull_model), with a few single-verb actions (chat, summarize, extract) that remain stylistically consistent. No mixed camelCase or chaotic patterns.
42 tools is heavy for a single MCP server, exceeding the typical 3-15 range, though the server's broad scope (staged writes, model management, jobs, local LLM tasks, config) justifies many of them. It risks overwhelming an agent's tool selection.
The surface covers full lifecycle for staged writes (stage, review, commit, revert, uncommit, verify, discard), model management (search, pull, download, delete, prune, unload, recommend), jobs, local inference tasks, and config. No obvious gaps in the stated domain.