opencode-cli-mcp
MCP server wrapping the opencode CLI HTTP API, exposing 22 FastMCP tools to run agents, manage sessions, search eternal memory, back up data, and control opencode.
Run and supervise opencode agent jobs: start, poll status, list, cancel.
Inspect and interact with sessions: list, get, messages, send, diff, grep, export, rename, delete.
Search and manage eternal session memory: full-text wayback search, semantic RAG, code-recall, stats, archive/unarchive/rename/delete.
Back up and restore opencode database and config: create, list, prune, restore, delete, with rotation and disk guard.
Manage system: status, providers, project, launch UI, MCP pulse, config drift.
Install MCPB bundles into opencode config.
Shut down the MCP server gracefully.
Use legacy atomic tools as aliases for individual operations.
Show rich Prefab cards for runs, sessions, and status.
Extend opencode with custom tools for fleet, sessions, runs, system, providers, and tool discovery.
Access REST bridge and React dashboard on one port.
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., "@opencode-cli-mcprun agent to analyze the current project"
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.
opencode-cli-mcp
š Installation Guide - quick start, manual setup, and troubleshooting š Onboarding - 5-minute first-run guide š Full reference - tools, endpoints, env vars, architecture
MCP server wrapping opencode CLI's HTTP API (opencode serve) into 22 FastMCP tools (7 primary portmanteaus + 15 legacy aliases). Also includes a FastAPI REST bridge (unified with the MCP endpoint on one port), a Vite/React fleet-standard dashboard, and OpenCode custom tools that extend opencode itself.
Pattern: Plan with Claude, implement with opencode. Claude (expensive, high-judgment) orchestrates and supervises; opencode handles implementation grunt work on cheaper models (DeepSeek V4 Flash/Pro).
š§ Eternal Session Memory ā opencode stores every session since install in one searchable SQLite database. Ask it "what were we discussing last December about X?" ā no other agentic IDE can do that. opencode-cli-mcp makes that memory searchable, exportable, editable, and backed up.
What can you do?
Capability | How |
Wayback session find |
|
Semantic recall (RAG) |
|
Read the past |
|
Edit the past | rename / archive / unarchive / delete sessions (live API or offline depot) |
Never lose it |
|
Run agents |
|
Manage opencode |
|
Desktop sidebar |
|
Related MCP server: MCP Proxy Server
Install
Download: opencode-cli-mcp-0.2.11-setup.exe - installs the desktop app and its embedded backend in one step (Windows, current user, no admin).
The installer is unsigned, so SmartScreen will warn. Click More info ā Run anyway.
All releases, older versions, and the .mcpb bundle: Releases.
You want | Use |
Desktop app + backend |
|
MCP server inside Claude Desktop only |
|
Manual setup, prerequisites, troubleshooting | |
Development setup and build recipes |
Every path needs the opencode CLI installed (npm i -g opencode-ai).
MCP Tools
Primary surface - seven portmanteaus (operation discriminator):
Tool | Purpose |
| start / status / list / cancel agent runs |
| list / get / messages / send / diff / grep / export / rename / delete sessions (live |
| eternal memory - list/archive/unarchive/rename/delete/search/stats over the opencode SQLite DB. Full-text search across EVERY session since install, works offline (no |
| protect the memory - db + config snapshots (consistent online backup API), rotation, disk-space guard, guarded restore (refuses while serve runs unless force=True) |
| status / providers / project / launch_ui / mcp_pulse / config_drift |
| install |
| graceful self-termination |
15 legacy atomic tools remain mounted as aliases through 0.2.x (opencode_run_agent, opencode_get_run_status, opencode_list_runs, opencode_cancel_run, opencode_list_sessions, opencode_get_session, opencode_send_message, opencode_get_messages, opencode_session_diff, opencode_server_status, opencode_list_providers, opencode_get_project, opencode_get_config, opencode_get_health, opencode_launch_ui, plus opencode_session_grep / opencode_export_session / opencode_config_drift / opencode_mcp_pulse).
Prefab in-chat cards: show_runs_app, show_sessions_app, show_status_app.
Eternal Session Memory
opencode records every conversation and agent run since install into one
searchable SQLite database (~/.local/share/opencode/opencode.db). No other
agentic IDE has this ā you cannot ask Claude or Cursor "what were we discussing
last December about santiclaus-mcp?", but you can ask opencode:
opencode_depot(action="search", query="santiclaus") # wayback find - full-text across ALL transcripts
opencode_depot(action="rag", query="santiclaus") # semantic recall - embeddings over indexed transcripts
opencode_depot(action="rag_index") # build the RAG index (once)
opencode_sessions(action="get", session_id="ses_...") # metadata
opencode_sessions(action="messages", session_id="ses_...") # the transcript
opencode_sessions(action="export", session_id="ses_...") # markdown/html document
opencode_backups(action="create", kind="all") # protect it (autobackup 24h)Full walkthrough: docs/ETERNAL_MEMORY.md (also on the webapp Help page and History page).
Key Workflows
See Usage Guide for full details.
Basic: Launch -> Poll -> Review
opencode_run_agent(prompt="refactor main.py", wait=false)
-> { job_id: "abc" }
opencode_get_run_status("abc") -> poll until completed
opencode_session_diff("session-xyz") -> review changesMulti-Agent Sweep
Launch N agents across N repos in parallel, poll all, review diffs. Designed for fleet-wide operations.
Interactive Supervision
Start an agent, read its messages mid-task, send corrections, review final diff.
OpenCode Custom Tools
Copy .opencode/tools/*.ts into your opencode project to give opencode's LLM direct access to MCP fleet management, session inspection, and system diagnostics. 6 tools covering fleet, sessions, runs, system, providers, and tool discovery. See the OC Tools page in the webapp for full documentation and source.
Documentation
Doc | Description |
5-minute first-run guide | |
All tools, workflows, async patterns, webapp pages | |
MCP client config (Claude Desktop, Cursor, Windsurf) | |
Async patterns, session management, cross-project, custom tools | |
Known issues and roadmap | |
Version history |
Stack
Backend: Python 3.12+, FastMCP 3.4.4, FastAPI, uvicorn, httpx, pydantic v2, prefab-ui, psutil, SQLite (job store)
Frontend: React 18, Vite 5, TypeScript, TailwindCSS 3.4, Zustand, Framer Motion, Lucide, React Router, @tauri-apps/api
Native: Tauri 2 (NSIS installer, embedded PyInstaller backend)
Quality: ruff, biome, pytest (+coverage), Playwright e2e, pre-commit, just
Ports
Port | Service |
10950 | Frontend (Vite) |
10951 | Backend (FastAPI) |
4097 | opencode serve (dedicated; desktop app owns 4096) |
Security
This MCP server runs arbitrary shell commands (opencode run) from LLM prompts. Only install in environments where you trust your MCP client (Claude Desktop, Cursor) and the models it uses.
Fleet
Registered in
mcp-central-docs: ports 10950/10951fleet-registry.jsonandglama.jsonin repo rootWebapp dashboard:
http://localhost:10950(run.\start.ps1)
Available Tools
25 toolsopencode_backupsOpenCode BackupsDestructive
Backup the opencode database and config with rotation + disk guard; restore when needed.
Return Format
{"success": bool, "message": str, "data": dict}
Examples
opencode_backups(action="status") opencode_backups(action="create", kind="all") opencode_backups(action="list", kind="db") opencode_backups(action="restore", name="opencode-db-20260802-120000.sqlite3", confirm=True)
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Target: database, config directory, or both (create/prune) | all |
| name | No | Backup filename (required for restore/delete) | |
| force | No | Allow restore while opencode serve is running | |
| action | Yes | status: paths, free space, counts, last backup. create: take a snapshot of the database (kind=db), config (kind=config), or both (kind=all). list: backups with sizes/dates. prune: drop old backups beyond retention. restore: overwrite the database or config from a backup (confirm=True; refuses while opencode serve is running unless force=True). delete: remove one backup file. | |
| confirm | No | Must be True for restore (overwrites live data) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| message | Yes | |
| success | Yes |
opencode_cancel_runDestructive
Cancel a running or queued agent run.
Return Format
{"success": bool, "message": str, "data": {"job_id": str}}
Examples
opencode_cancel_run(job_id="abc123")
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | Job ID to cancel |
opencode_depotOpenCode Session DepotDestructive
Session depot: list, inspect, archive/unarchive, rename, delete, search transcripts, semantic RAG search, code-recall search, or stats.
Reads opencode's SQLite depot directly - works without opencode serve.
Archive/unarchive/rename are reversible; delete is permanent (FK cascade).
search = exact/full-text wayback find; rag = semantic similarity over
indexed transcripts; code = when an agent touched a file (patch paths +
edit tool inputs), by path or by content. rag/code need
uv sync --extra rag and an index pass (rag_index indexes both).
Return Format
{"success": bool, "message": str, "data": dict}
Examples
opencode_depot(action="list", status="archived", limit=20) opencode_depot(action="unarchive", session_id="sess_01") opencode_depot(action="search", query="power limit") opencode_depot(action="search", query="vienna", project="chitchat", timeframe_days=7) opencode_depot(action="rag", query="what did we decide about the power limit") opencode_depot(action="code", path_filter="auth_utils.py") opencode_depot(action="code", query="extracted the auth module", path_filter="src") opencode_depot(action="rag_index") opencode_depot(action="stats") opencode_depot(action="star", session_id="sess_01") opencode_depot(action="tag_add", session_id="sess_01", tags="neuro, vienna") opencode_depot(action="list", starred=True, sort="starred") opencode_depot(action="export", session_id="sess_01", format="docx") opencode_depot(action="memops", session_id="sess_01", tags="neuro")
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | List/search: only sessions carrying this tag | |
| sort | No | Sort order (list); 'starred' puts favourites first | updated |
| tags | No | tag_add/tag_remove: comma-separated tags, e.g. 'neuro, vienna' | |
| agent | No | Agent name filter (list) | |
| limit | No | Page size (list/search/rag/code) | |
| query | No | Search text (search/rag/code) | |
| title | No | New title (rename) | |
| action | Yes | list: sessions with filters. get: one session with counts. archive: hide from active list. unarchive: restore (missing in opencode UI). rename: set title. delete: permanently remove (cascades messages). search: full-text across transcripts and titles (wayback find). search filters: query + optional timeframe_days (last N days), project (directory/project_id substring), include_archived, starred (true = only favourites), tag. star / unstar: toggle a favourite (sidecar db, never touches opencode.db). tag_add / tag_remove: attach/detach tags (tags param, comma-separated). tags: list every tag with usage counts. export: write md/html/docx to out_path (docx needs LibreOffice). memops: drop a frontmatter note into the advanced-memory inbox. rag: semantic search over indexed transcripts (needs rag extras). rag_index: index new sessions for semantic search (text + code). rag_status: index state + availability. code: find WHEN an agent touched a file - by path (path_filter only) or by content (query): patch paths + edit tool inputs from every session. code_index: rebuild the code table from all sessions (code-only backfill). code_status: code index state. stats: aggregate cost/tokens by agent/project. | |
| format | No | export: output format (docx requires LibreOffice installed) | md |
| offset | No | Page offset (list) | |
| search | No | Title substring filter (list) | |
| status | No | Status filter (list): all, active, or archived | all |
| date_to | No | Search/list: explicit range end YYYY-MM-DD (takes precedence over timeframe_days) | |
| project | No | Project/directory substring filter (list) | |
| starred | No | List/search: true = only favourites, false = only unstarred, null = no constraint | |
| out_path | No | export: destination file (default ~/Downloads) | |
| date_from | No | Search/list: explicit range start YYYY-MM-DD (takes precedence over timeframe_days) | |
| session_id | No | Session ID (required for get/archive/unarchive/rename/delete) | |
| path_filter | No | File path substring (code): only rows whose path contains this | |
| timeframe_days | No | Search/list: parts/sessions from the last N days (e.g. 7 = last week) | |
| include_archived | No | Search: include archived sessions |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| message | Yes | |
| success | Yes |
opencode_get_configRead-onlyIdempotent
Read the full opencode configuration.
Returns model, provider, MCP server settings, and instructions.
Return Format
{"success": bool, "message": str, "data": {"config": dict}}
Examples
opencode_get_config()
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
opencode_get_healthRead-onlyIdempotent
Health check for the opencode server.
Returns basic connectivity status and uptime.
Return Format
{"success": bool, "message": str, "data": dict}
Examples
opencode_get_health()
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
opencode_get_messagesRead-onlyIdempotent
Retrieve message history from an opencode session.
Returns the conversation transcript between the user and the agent.
Return Format
{"success": bool, "message": str, "data": {"messages": [{"role": str}]}}
Examples
opencode_get_messages(session_id="sess_01", limit=100)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of messages to retrieve | |
| session_id | Yes | Session ID to retrieve messages from |
opencode_get_projectRead-onlyIdempotent
Get the current project context from opencode.
Returns the active project path and metadata.
Return Format
{"success": bool, "message": str, "data": {"project": dict}}
Examples
opencode_get_project()
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
opencode_get_run_statusRead-onlyIdempotent
Poll the status of a background agent run.
Returns stdout/stderr accumulated so far, status, and exit code.
Return Format
{"success": bool, "message": str, "data": {"job_id": str, "status": str, "stdout": str, "exit_code": int}}
Examples
opencode_get_run_status(job_id="abc123")
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | Job ID from opencode_run_agent |
opencode_get_sessionRead-onlyIdempotent
Get detailed information about a specific opencode session.
Returns its metadata and state.
Return Format
{"success": bool, "message": str, "data": {"session": dict}}
Examples
opencode_get_session(session_id="sess_01")
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Session ID to retrieve |
opencode_launch_ui
Launch opencode interactively - TUI, web UI, or background API server.
Use this to open the opencode interface for manual work.
Return Format
{"success": bool, "message": str, "data": {"mode": str, "project": str}}
Examples
opencode_launch_ui(mode="web") opencode_launch_ui(mode="serve")
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Launch mode: 'tui' (terminal UI), 'web' (browser), 'serve' (background API server) | tui |
| project | No | Project directory to open. Uses cwd if omitted. |
opencode_list_providersRead-onlyIdempotent
List configured LLM providers in opencode.
Return Format
{"success": bool, "message": str, "data": {"providers": [{"name": str}]}}
Examples
opencode_list_providers()
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
opencode_list_runsRead-onlyIdempotent
List all recent agent runs with their status and exit codes.
Return Format
{"success": bool, "message": str, "data": {"runs": [{"job_id": str, "status": str, "exit_code": int}]}}
Examples
opencode_list_runs(limit=20)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max jobs to return |
opencode_list_sessionsRead-onlyIdempotent
List all active and recent opencode sessions.
Return Format
{"success": bool, "message": str, "data": {"sessions": [{"id": str}]}}
Examples
opencode_list_sessions()
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
opencode_mcpb_install
OPENCODE_MCPB_INSTALL - Install an MCPB bundle into opencode config.
Unpacks the .mcpb (or reads an unpacked directory), extracts the manifest,
and merges the server definition into the opencode config file's mcp section.
Return Format
{"success": bool, "server_name": str, "config_path": str, "entry": {...}}
Examples
opencode_mcpb_install(source="./dist/arxiv-mcp-v1.0.0.mcpb") opencode_mcpb_install(source="./dist/arxiv-mcp-v1.0.0.mcpb", name_override="arxiv") opencode_mcpb_install(source="./mcpb/", dry_run=True)
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | Path to an .mcpb file or an unpacked MCPB directory. | |
| dry_run | No | Show what would be written without modifying the config. | |
| name_override | No | Override the server name in opencode config. Default: from manifest. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| message | Yes | |
| success | Yes |
opencode_run_agent
Run an opencode agent with a prompt, model, agent, and permission mode.
Launches as background job; returns job_id for polling. Set wait=true to
block until done. Unattended runs usually need auto=true - otherwise a
permission prompt stalls the run until the timeout.
Return Format
{"success": bool, "message": str, "data": {"job_id": str, "status": str, "options": dict}}
Examples
opencode_run_agent(prompt="Refactor main.py", wait=False) opencode_run_agent(prompt="Summarize README", format="json", wait=True, timeout=120) opencode_run_agent(prompt="Fix tests", model="deepseek/deepseek-flash", agent="build", auto=True) opencode_run_agent(prompt="Continue the migration", session_id="ses_123", fork=True)
| Name | Required | Description | Default |
|---|---|---|---|
| auto | No | Auto-approve permissions that are not explicitly denied (opencode --auto). Required for unattended runs that would otherwise block on an approval prompt. | |
| fork | No | Fork the session before continuing (requires session_id or continue_session) | |
| wait | No | Wait for completion (true) or return immediately with job_id (false) | |
| agent | No | Agent to use (opencode agent name, e.g. 'build' or 'plan'). Omit for the default agent | |
| files | No | File paths to attach to the message (opencode --file). Must exist on disk. | |
| model | No | Model as provider/model (e.g. 'deepseek/deepseek-flash'). Omit for opencode's default | |
| format | No | Output format: 'text' or 'json' | text |
| prompt | Yes | The prompt/message to send to the opencode agent | |
| project | No | Project directory path (optional) | |
| timeout | No | Max seconds to wait when wait=true (default 300) | |
| variant | No | Provider-specific reasoning variant, e.g. 'high', 'max', 'minimal' | |
| thinking | No | Include thinking blocks in the output | |
| session_id | No | Continue this session instead of starting a new one (opencode --session) | |
| continue_session | No | Continue the most recent session (opencode --continue); ignored when session_id is set |
opencode_runsOpenCode RunsDestructive
Manage opencode agent runs: start, poll status, list recent, or cancel.
Return Format
{"success": bool, "message": str, "data": dict} Fire-and-forget starts return a job_id; poll with action="status".
Examples
opencode_runs(action="start", prompt="Refactor main.py", wait=False) opencode_runs(action="start", prompt="Fix tests", model="deepseek/deepseek-flash", agent="build", auto=True) opencode_runs(action="start", prompt="Continue", session_id="ses_123", fork=True) opencode_runs(action="status", job_id="abc123") opencode_runs(action="list", limit=20, offset=0)
| Name | Required | Description | Default |
|---|---|---|---|
| auto | No | Auto-approve permissions not explicitly denied (start, opencode --auto). Needed for unattended runs; without it a prompt stalls the run. | |
| fork | No | Fork before continuing; requires session_id or continue_session (start) | |
| wait | No | Block until done (start; default false = fire-and-forget) | |
| agent | No | opencode agent name, e.g. 'build' or 'plan' (start) | |
| files | No | Files to attach to the message (start). Must exist on disk. | |
| limit | No | Page size (list) | |
| model | No | Model as provider/model, e.g. 'deepseek/deepseek-flash' (start). Default: opencode's | |
| action | Yes | start: launch an agent run. status: poll a run. list: recent runs. cancel: stop a run. | |
| job_id | No | Job ID (required for status/cancel) | |
| offset | No | Page offset (list) | |
| prompt | No | Agent prompt (required for start) | |
| project | No | Project directory (optional, start) | |
| timeout | No | Max seconds for the run (start) | |
| variant | No | Provider reasoning variant, e.g. 'high', 'max', 'minimal' (start) | |
| thinking | No | Include thinking blocks in output (start) | |
| session_id | No | Continue this session instead of a new one (start) | |
| output_format | No | Output format (start) | text |
| continue_session | No | Continue the most recent session (start; ignored when session_id is set) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| message | Yes | |
| success | Yes |
opencode_send_message
Send a message to an existing opencode session.
Use this to continue a conversation with a running agent.
Return Format
{"success": bool, "message": str, "data": {"result": dict}}
Examples
opencode_send_message(session_id="sess_01", message="continue")
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | Message text to send to the agent | |
| session_id | Yes | Session ID to send message to |
opencode_server_statusRead-onlyIdempotent
Check the status and health of the opencode server.
Returns health info, active session count, and config summary.
Return Format
{"success": bool, "message": str, "data": dict}
Examples
opencode_server_status()
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
opencode_session_diffRead-onlyIdempotent
Show files created, modified, and deleted in a session.
Returns a diff summary with file paths and change types.
Return Format
{"success": bool, "message": str, "data": {"diff": dict}}
Examples
opencode_session_diff(session_id="sess_01")
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Session ID to diff |
opencode_sessionsOpenCode Sessions
Inspect and interact with opencode sessions: list, get, transcript, send, diff, grep, export, share, unshare, rename, or delete.
Return Format
{"success": bool, "message": str, "data": dict}
Examples
opencode_sessions(action="list", limit=50) opencode_sessions(action="messages", session_id="sess_01", limit=100) opencode_sessions(action="send", session_id="sess_01", message="continue") opencode_sessions(action="share", session_id="sess_01") opencode_sessions(action="unshare", session_id="sess_01") opencode_sessions(action="rename", session_id="sess_01", title="Refactor auth module") opencode_sessions(action="delete", session_id="sess_01", confirm=True)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Page size (list/messages) | |
| query | No | Search query (required for grep) | |
| title | No | New title (required for rename) | |
| action | Yes | list: all sessions. get: one session. messages: transcript. send: message a session. diff: files changed. grep: search messages across sessions. export: render session as markdown/html. share: publish an unlisted share page (offline, revocable). unshare: revoke a session's share pages. rename: set title (serve API, live UI). delete: permanently remove (confirm=True). | |
| format | No | Export format: markdown or html (export) | markdown |
| offset | No | Page offset (list) | |
| confirm | No | Must be True to delete (permanent) | |
| message | No | Message text (required for send) | |
| session_id | No | Session ID (required for get/messages/send/diff/export/share/unshare/rename/delete) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| message | Yes | |
| success | Yes |
opencode_shutdownDestructive
Shut down this MCP server process gracefully.
Return Format
{"success": bool, "message": str, "data": dict}
Examples
opencode_shutdown(confirm=True, reason="maintenance window") opencode_shutdown(confirm=False)
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | Optional reason, recorded in stderr before exit. | |
| confirm | No | Must be True to shut down the server. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| message | Yes | |
| success | Yes |
opencode_systemOpenCode System
opencode server environment: health/status, providers, project, launch UI, MCP pulse, or config drift.
Return Format
{"success": bool, "message": str, "data": dict}
Examples
opencode_system(action="status") opencode_system(action="providers") opencode_system(action="launch_ui", mode="web")
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Launch mode (launch_ui) | tui |
| action | Yes | status: health + startup probe. providers: LLM providers. project: current project. launch_ui: open opencode. mcp_pulse: probe all MCP servers for liveness. config_drift: check local MCP server paths exist on disk. | |
| project | No | Project directory (launch_ui) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| message | Yes | |
| success | Yes |
show_runs_appA
Show recent agent runs as a rich Prefab card.
Lists recent opencode agent runs with status badges. Use the plain opencode_runs(action="list") tool when you need raw data instead.
Return Format
ToolResult with PrefabApp card and plain-text fallback.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden but does well by disclosing the rich Prefab card format, status badges, and the plain-text fallback return format. It does not mention any side effects or auth, but for a read-only display tool this is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is brief and well-organized: first sentence states purpose, second provides an alternative, and a 'Return Format' section clarifies output. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is largely complete for a simple tool: it gives purpose, alternative, and return format. The only gap is the unmentioned 'limit' parameter, which is a minor omission given the tool's simplicity and the parameter's self-descriptive name.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has one param 'limit' with a default but no description, and the description does not mention it. Schema description coverage is 0%, so the description fails to compensate. The parameter name is somewhat intuitive, but the agent is left guessing about its exact semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Show recent agent runs as a rich Prefab card' with a specific verb, resource, and output format, effectively distinguishing it from the sibling opencode_runs tool. It also explicitly names the alternative for raw data, reinforcing its unique purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance: 'Use the plain opencode_runs(action="list") tool when you need raw data instead.' This clearly states when to use this tool versus the alternative, covering the primary decision point.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
show_sessions_appA
Show opencode sessions as a rich Prefab card.
Lists recent opencode sessions. Use opencode_sessions(action="list") for raw data instead.
Return Format
ToolResult with PrefabApp card and plain-text fallback.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits itself. It mentions the return format ('ToolResult with PrefabApp card and plain-text fallback') and implies read-only behavior via 'Show' and 'Lists,' but does not explicitly state read-only status, permissions, or edge-case behavior. This is minimally adequate but not comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded with the core purpose, followed by a clear alternative and return format. It includes only necessary information with no redundancy, achieving high impact in few words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one optional parameter, the description covers purpose, return format, and an alternative, but omits any explanation of the 'limit' parameter. Since there is no output schema, the return format mention is helpful, but the missing parameter semantics leave the description incomplete for full agent decision-making.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has one parameter, 'limit,' with zero description, and schema description coverage is 0%. The description does not mention 'limit' at all, leaving its purpose, constraints, and optionality entirely up to inference from the name and default value. The description fails to compensate for the lack of schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Show opencode sessions as a rich Prefab card' and 'Lists recent opencode sessions,' clearly identifying the verb and resource. It also distinguishes from the sibling tool opencode_sessions by directing users to that tool for raw data, eliminating ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly names an alternative: 'Use opencode_sessions(action="list") for raw data instead,' which helps an agent decide between presentation and raw data access. However, it does not provide broader guidance for when to use this vs other session-related siblings like opencode_list_sessions, so it's not a full when/when-not set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
show_status_appA
Show opencode server status as a rich Prefab card.
Displays opencode serve reachability, startup probe result, and job counts. Use opencode_system(action="status") for raw data instead.
Return Format
ToolResult with PrefabApp card and plain-text fallback.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and discloses the return format (ToolResult with PrefabApp card and plain-text fallback), which is valuable behavioral context. It does not describe error handling or side effects, but for a read-only status tool the fallback behavior is a meaningful disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded, with a clear main sentence, an alternative usage note, and a structured return format section. Every sentence adds value without redundancy, and the length is appropriate for the tool's simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter status tool, the description covers the main purpose, displayed content, alternative raw-data tool, and return format. It could optionally mention it is read-only or contrast with the sibling opencode_server_status, but overall it provides sufficient information for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema requires no documentation. The baseline of 4 applies because no parameter descriptions are needed, and the description does not need to explain any input semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function with a specific verb ('Show') and resource ('opencode server status as a rich Prefab card'), and lists the exact content displayed (reachability, startup probe result, job counts). It distinguishes itself from raw data tools by explicitly naming opencode_system as an alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises using opencode_system(action="status") for raw data, which clarifies when not to use this tool. It does not provide extended scenario guidance, but the alternative is clearly stated and the context implies this tool is for rich UI presentation.
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.
22 tool updates
v0.2.11- Changed
opencode_backups3 fields changed- removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "data": { + "type": "object" + }, + "message": { + "type": "string" + }, + "success": { + "type": "boolean" + } +} - added
Output schema / requiredAdded value: +[ + "success", + "message", + "data" +]
- Changed
opencode_cancel_run1 field changed- changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Changed
opencode_depot16 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"list: sessions with filters. get: one session with counts. archive: hide from active list. unarchive: restore (missing in opencode UI). rename: set title. delete: permanently remove (cascades messages). search: full-text across transcripts and titles (wayback find). rag: semantic search over indexed transcripts (needs rag extras). rag_index: index new sessions for semantic search (text + code). rag_status: index state + availability. code: find WHEN an agent touched a file - by path (path_filter only) or by content (query): patch paths + edit tool inputs from every session. code_index: rebuild the code table from all sessions (code-only backfill). code_status: code index state. stats: aggregate cost/tokens by agent/project."New value: +"list: sessions with filters. get: one session with counts. archive: hide from active list. unarchive: restore (missing in opencode UI). rename: set title. delete: permanently remove (cascades messages). search: full-text across transcripts and titles (wayback find). search filters: query + optional timeframe_days (last N days), project (directory/project_id substring), include_archived, starred (true = only favourites), tag. star / unstar: toggle a favourite (sidecar db, never touches opencode.db). tag_add / tag_remove: attach/detach tags (tags param, comma-separated). tags: list every tag with usage counts. export: write md/html/docx to out_path (docx needs LibreOffice). memops: drop a frontmatter note into the advanced-memory inbox. rag: semantic search over indexed transcripts (needs rag extras). rag_index: index new sessions for semantic search (text + code). rag_status: index state + availability. code: find WHEN an agent touched a file - by path (path_filter only) or by content (query): patch paths + edit tool inputs from every session. code_index: rebuild the code table from all sessions (code-only backfill). code_status: code index state. stats: aggregate cost/tokens by agent/project." - changed
Input schema / properties / action / enumPrevious value: -[ - "list", - "get", - "archive", - "unarchive", - "rename", - "delete", - "search", - "stats", - "rag", - "rag_index", - "rag_status", - "code", - "code_index", - "code_status" -]New value: +[ + "list", + "get", + "archive", + "unarchive", + "rename", + "delete", + "search", + "stats", + "star", + "unstar", + "tag_add", + "tag_remove", + "tags", + "export", + "memops", + "rag", + "rag_index", + "rag_status", + "code", + "code_index", + "code_status" +] - added
Input schema / properties / date_fromAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Search/list: explicit range start YYYY-MM-DD (takes precedence over timeframe_days)" +} - added
Input schema / properties / date_toAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Search/list: explicit range end YYYY-MM-DD (takes precedence over timeframe_days)" +} - added
Input schema / properties / formatAdded value: +{ + "default": "md", + "description": "export: output format (docx requires LibreOffice installed)", + "enum": [ + "md", + "html", + "docx" + ], + "type": "string" +} - added
Input schema / properties / include_archivedAdded value: +{ + "default": true, + "description": "Search: include archived sessions", + "type": "boolean" +} - added
Input schema / properties / out_pathAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "export: destination file (default ~/Downloads)" +} - changed
Input schema / properties / sort / descriptionPrevious value: -"Sort order (list)"New value: +"Sort order (list); 'starred' puts favourites first" - changed
Input schema / properties / sort / enumPrevious value: -[ - "updated", - "created", - "archived", - "cost", - "tokens", - "title" -]New value: +[ + "updated", + "created", + "archived", + "cost", + "tokens", + "title", + "starred" +] - added
Input schema / properties / starredAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "List/search: true = only favourites, false = only unstarred, null = no constraint" +} - added
Input schema / properties / tagAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "List/search: only sessions carrying this tag" +} - added
Input schema / properties / tagsAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "tag_add/tag_remove: comma-separated tags, e.g. 'neuro, vienna'" +} - added
Input schema / properties / timeframe_daysAdded value: +{ + "anyOf": [ + { + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Search/list: parts/sessions from the last N days (e.g. 7 = last week)" +} - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "data": { + "type": "object" + }, + "message": { + "type": "string" + }, + "success": { + "type": "boolean" + } +} - added
Output schema / requiredAdded value: +[ + "success", + "message", + "data" +]
- Changed
opencode_get_config1 field changed- changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Changed
opencode_get_health1 field changed- changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Changed
opencode_get_messages1 field changed- changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Changed
opencode_get_project1 field changed- changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Changed
opencode_get_run_status1 field changed- changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Changed
opencode_get_session1 field changed- changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Changed
opencode_launch_ui1 field changed- changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Changed
opencode_list_providers1 field changed- changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Changed
opencode_list_runs1 field changed- changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Changed
opencode_list_sessions1 field changed- changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Changed
opencode_mcpb_install3 fields changed- removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "data": { + "type": "object" + }, + "message": { + "type": "string" + }, + "success": { + "type": "boolean" + } +} - added
Output schema / requiredAdded value: +[ + "success", + "message", + "data" +]
- Changed
opencode_run_agent10 fields changed- added
Input schema / properties / agentAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Agent to use (opencode agent name, e.g. 'build' or 'plan'). Omit for the default agent" +} - added
Input schema / properties / autoAdded value: +{ + "default": false, + "description": "Auto-approve permissions that are not explicitly denied (opencode --auto). Required for unattended runs that would otherwise block on an approval prompt.", + "type": "boolean" +} - added
Input schema / properties / continue_sessionAdded value: +{ + "default": false, + "description": "Continue the most recent session (opencode --continue); ignored when session_id is set", + "type": "boolean" +} - added
Input schema / properties / filesAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "File paths to attach to the message (opencode --file). Must exist on disk." +} - added
Input schema / properties / forkAdded value: +{ + "default": false, + "description": "Fork the session before continuing (requires session_id or continue_session)", + "type": "boolean" +} - added
Input schema / properties / modelAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Model as provider/model (e.g. 'deepseek/deepseek-flash'). Omit for opencode's default" +} - added
Input schema / properties / session_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Continue this session instead of starting a new one (opencode --session)" +} - added
Input schema / properties / thinkingAdded value: +{ + "default": false, + "description": "Include thinking blocks in the output", + "type": "boolean" +} - added
Input schema / properties / variantAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Provider-specific reasoning variant, e.g. 'high', 'max', 'minimal'" +} - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Changed
opencode_runs12 fields changed- added
Input schema / properties / agentAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "opencode agent name, e.g. 'build' or 'plan' (start)" +} - added
Input schema / properties / autoAdded value: +{ + "default": false, + "description": "Auto-approve permissions not explicitly denied (start, opencode --auto). Needed for unattended runs; without it a prompt stalls the run.", + "type": "boolean" +} - added
Input schema / properties / continue_sessionAdded value: +{ + "default": false, + "description": "Continue the most recent session (start; ignored when session_id is set)", + "type": "boolean" +} - added
Input schema / properties / filesAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Files to attach to the message (start). Must exist on disk." +} - added
Input schema / properties / forkAdded value: +{ + "default": false, + "description": "Fork before continuing; requires session_id or continue_session (start)", + "type": "boolean" +} - added
Input schema / properties / modelAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Model as provider/model, e.g. 'deepseek/deepseek-flash' (start). Default: opencode's" +} - added
Input schema / properties / session_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Continue this session instead of a new one (start)" +} - added
Input schema / properties / thinkingAdded value: +{ + "default": false, + "description": "Include thinking blocks in output (start)", + "type": "boolean" +} - added
Input schema / properties / variantAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Provider reasoning variant, e.g. 'high', 'max', 'minimal' (start)" +} - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "data": { + "type": "object" + }, + "message": { + "type": "string" + }, + "success": { + "type": "boolean" + } +} - added
Output schema / requiredAdded value: +[ + "success", + "message", + "data" +]
- Changed
opencode_send_message1 field changed- changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Changed
opencode_server_status1 field changed- changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Changed
opencode_session_diff1 field changed- changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Changed
opencode_sessions6 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"list: all sessions. get: one session. messages: transcript. send: message a session. diff: files changed. grep: search messages across sessions. export: render session as markdown/html. rename: set title (serve API, live UI). delete: permanently remove (confirm=True)."New value: +"list: all sessions. get: one session. messages: transcript. send: message a session. diff: files changed. grep: search messages across sessions. export: render session as markdown/html. share: publish an unlisted share page (offline, revocable). unshare: revoke a session's share pages. rename: set title (serve API, live UI). delete: permanently remove (confirm=True)." - changed
Input schema / properties / action / enumPrevious value: -[ - "list", - "get", - "messages", - "send", - "diff", - "grep", - "export", - "rename", - "delete" -]New value: +[ + "list", + "get", + "messages", + "send", + "diff", + "grep", + "export", + "share", + "unshare", + "rename", + "delete" +] - changed
Input schema / properties / session_id / descriptionPrevious value: -"Session ID (required for get/messages/send/diff/export/rename/delete)"New value: +"Session ID (required for get/messages/send/diff/export/share/unshare/rename/delete)" - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "data": { + "type": "object" + }, + "message": { + "type": "string" + }, + "success": { + "type": "boolean" + } +} - added
Output schema / requiredAdded value: +[ + "success", + "message", + "data" +]
- Changed
opencode_shutdown3 fields changed- removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "data": { + "type": "object" + }, + "message": { + "type": "string" + }, + "success": { + "type": "boolean" + } +} - added
Output schema / requiredAdded value: +[ + "success", + "message", + "data" +]
- Changed
opencode_system3 fields changed- removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "data": { + "type": "object" + }, + "message": { + "type": "string" + }, + "success": { + "type": "boolean" + } +} - added
Output schema / requiredAdded value: +[ + "success", + "message", + "data" +]
25 tool updates
v0.2.3- First observed
opencode_backups - First observed
opencode_cancel_run - First observed
opencode_depot - First observed
opencode_get_config - First observed
opencode_get_health - First observed
opencode_get_messages - First observed
opencode_get_project - First observed
opencode_get_run_status - First observed
opencode_get_session - First observed
opencode_launch_ui - First observed
opencode_list_providers - First observed
opencode_list_runs - First observed
opencode_list_sessions - First observed
opencode_mcpb_install - First observed
opencode_run_agent - First observed
opencode_runs - First observed
opencode_send_message - First observed
opencode_server_status - First observed
opencode_session_diff - First observed
opencode_sessions - First observed
opencode_shutdown - First observed
opencode_system - First observed
show_runs_app - First observed
show_sessions_app - First observed
show_status_app
TDQS
Scored across 25 tools
The tool set has severe overlap: opencode_runs duplicates opencode_run_agent, opencode_list_runs, opencode_get_run_status, and opencode_cancel_run via action parameters; opencode_sessions duplicates opencode_list_sessions, opencode_get_session, opencode_send_message, opencode_get_messages, and opencode_session_diff; opencode_system duplicates opencode_launch_ui, opencode_server_status, opencode_list_providers, opencode_get_project, opencode_get_health, and opencode_get_config. These overlapping action-based and individual tools create ambiguity about which to call, despite descriptions.
Names mix conventions: many use opencode_verb_noun (e.g., opencode_list_sessions, opencode_get_config), but others use opencode_noun with action parameters (opencode_runs, opencode_sessions, opencode_depot, opencode_backups, opencode_system), and the show_*_app tools deviate entirely (show_status_app, show_runs_app). This inconsistency across the set makes it hard to predict tool names.
At 25 tools, the server is at the high end of the borderline range for its scope, and many tools are redundant counterparts to the action-based aggregators, inflating the count without adding surface area. However, the domain (opencode CLI management) is broad enough that 25 isn't extreme.
The server covers the major workflows: installing bundles, running agents, inspecting sessions, backups, system status, and viewing rich UI cards. Minor gaps exist (no direct session creation, no config editing), but these can be worked around via existing actions like opencode_send_message or opencode_system.
Maintenance
Related MCP Connectors
Authenticated MCP server for ClearPolicy policy and compliance workflows.
Manage CloudPepper servers, Odoo instances, backups, and deployments over MCP.
Agent-first web hosting: deploy sites, apps, databases and domains over MCP.
Manage screenRIG screens, playlists, media, schedules, webhooks, and reports through MCP.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server that wraps CubeCoders AMP to list, inspect, and control game-server instances.84MIT
- AlicenseNot gradedqualityCmaintenanceAggregates multiple backend MCP servers into a single unified interface with optional web management UI for tool control and configuration.52 npm196MIT
- AlicenseNot gradedqualityBmaintenanceAggregates multiple MCP servers into a single HTTP endpoint with tool namespacing, dashboard, and REST API for management.9 npmMIT
- AlicenseBqualityDmaintenanceMCP Server for Git operations, agent templates, and project utilities.915 npmMIT