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-gw
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 BackupsBDestructive
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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, and the schema enumerates the confirm/force guards and the 'refuses while opencode serve is running' rule. The description adds only the phrases 'rotation + disk guard', which hint at retention and free-space checks without explaining either. Nothing contradicts the annotations, but little is added beyond them.
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 purpose sentence is front-loaded and tight. However, the '## Return Format' block restates a return shape that the output schema already defines, and the examples duplicate enum values already in the schema, so a portion of the text does not earn its place.
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?
An output schema exists, so the description needn't explain return values (and its return-format block is therefore redundant). It also leaves the destructive restore/delete paths to the schema rather than warning about overwriting live data in prose. Adequate, but with avoidable gaps for a destructive tool.
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?
Schema description coverage is 100%, including detailed per-action semantics and confirm/force rules, so the baseline is 3. The description's examples illustrate action/kind/name/confirm combinations but add no syntax or constraint information the schema lacks.
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 opening sentence names a specific resource (opencode database and config) and the two primary verbs (backup, restore), plus differentiating traits (rotation, disk guard). It doesn't cover the other four actions (status, list, prune, delete), which are only discoverable from the schema enum. No sibling does backups, so differentiation is not a concern.
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?
'restore when needed' is the only usage hint and it is essentially tautological. The examples show call shapes for status/create/list/restore but give no conditions for choosing prune over delete, or when to check status first. Usage is implied by the action examples rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opencode_cancel_runADestructive
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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is known. The description adds a return format and example, but does not explain irreversibility, permissions, or what happens if the run is already completed or missing.
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 action. The return format and example are compact and do not add unnecessary prose.
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 one-parameter destructive cancel tool, the description covers the action, return shape, and an example. It could be more complete by noting failure conditions or what happens when a run cannot be cancelled, but the core invocation context is present.
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?
Schema description coverage is 100%, and the sole job_id parameter is fully documented in the schema. The example shows an identifier format, but the description adds no semantic detail beyond the schema.
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 a specific verb and resource: cancel an agent run, scoped to running or queued runs. It is clear what the tool does, though it does not explicitly differentiate itself from sibling status/list tools.
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 phrase 'running or queued agent run' implies when cancellation is applicable, but there is no explicit guidance on when not to use it or which sibling to use to inspect run status first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opencode_depotOpenCode Session DepotADestructive
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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses exactly what the coarse destructiveHint=true annotation cannot: archive/unarchive/rename are reversible, delete is permanent with FK cascade into messages, star writes to a sidecar db and never touches opencode.db. It also notes the tool reads SQLite directly and works without `opencode serve`, and names the rag/code dependency and index requirement. That is meaningful per-action behavioral nuance layered on top of the annotations rather than repetition.
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 opening sentence front-loads purpose and the reversibility line is placed immediately after, so the highest-value information is early. The mechanism/rag-code paragraph and return-format block are tight. The 14-line examples block is somewhat heavy for the space available and partly duplicates the action enum's own descriptions, but it does earn its place for a 21-action tool by showing valid combinations.
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 21-action, 21-param tool this description covers purpose, action semantics, reversibility/destructiveness, prerequisites and return shape, and an output schema already exists so return values need not be detailed. It leaves some per-action return differences and edge cases (e.g. export out_path defaults, code_index rebuild scope) to the schema, which is acceptable but not fully rounded out.
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?
Schema coverage is already 100%, including a long per-action description in the action enum, so the baseline is 3. The description adds value by grouping which filters apply to which action (e.g. 'search filters: query + optional timeframe_days, project, include_archived, starred, tag') and by flagging comma-separated tag syntax, plus examples that show valid parameter pairings. It does not fully document date_from/date_to precedence or offset behavior beyond the schema.
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 first sentence states a concrete resource (opencode's SQLite session depot) and enumerates the operations it exposes: list, inspect, archive, rename, delete, search, rag, code, stats. It also distinguishes search (exact/full-text) from rag (semantic) and code (file-touch recall), which an agent cannot infer from the names alone. It stops short of naming overlapping siblings such as opencode_list_sessions or opencode_get_session, so sibling differentiation is incomplete.
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?
It gives real when-to-use guidance: 'search = exact/full-text wayback find; rag = semantic similarity; code = when an agent touched a file', and states the prerequisite that rag/code need `uv sync --extra rag` plus an index pass. The 14 examples demonstrate action/param combinations concretely. It never says when to use this instead of the sibling session tools (opencode_list_sessions, opencode_get_session), so there are no explicit alternatives/exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opencode_get_configBRead-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 | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds the return shape and warns implicitly that the payload includes bulk content (instructions), but says nothing about size, sensitivity of config values, or failure modes.
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?
Front-loaded one-line purpose followed by return format, with no filler prose. The '## Examples' block showing `opencode_get_config()` adds nothing for a zero-arg tool and could be dropped.
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?
No output schema exists, but the description compensates with an explicit return format ({success, message, data.config}). For a parameterless read, that is nearly everything an agent needs, short of noting that config may contain secrets or be large.
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?
Zero-parameter tool, so the baseline is 4; the empty schema with additionalProperties false leaves nothing for the description to explain.
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?
States a specific verb+resource ('Read the full opencode configuration') and enumerates what it contains (model, provider, MCP server settings, instructions), which clearly separates it from session/run siblings. It does not explicitly name which sibling to use instead for narrower reads like providers or project.
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?
There is no statement of when to use this versus opencode_list_providers, opencode_get_project, or opencode_system, nor any preconditions. Usage is only inferable from the tool name and the word 'full'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opencode_get_healthARead-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 | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds meaningful context in the return format and the fact that uptime is reported, but says nothing about timeouts, failure modes, or latency ā modest added value on top of annotations.
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?
Front-loaded with the purpose, then return format and example. The '## Examples' block for a zero-argument call is largely ceremonial and doesn't earn its space, but the rest is tight.
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?
With no output schema, the inline Return Format ({success, message, data}) usefully covers the return shape, and a zero-parameter health check needs little else. Lacking only explicit guidance on when to prefer it over its status-oriented siblings.
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?
Zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The explicit empty example opencode_get_health() confirms no arguments are needed.
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 gives a specific verb and resource (health check for the opencode server) plus what is returned (connectivity status and uptime). It's clear what the tool does, though it doesn't distinguish itself from the sibling opencode_server_status, which plausibly overlaps.
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?
Usage is implied by the name and the word 'health check', but the description never states when to call this versus opencode_server_status or opencode_system, nor any prerequisites. Adequate but with a clear routing gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opencode_get_messagesARead-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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds genuinely new context by disclosing the response envelope shape, which matters because no output schema exists. It stops short of explaining ordering, pagination, or what happens when limit truncates history.
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?
Purpose is front-loaded in the first sentence, followed by return format and a single example ā a sensible order with little waste. The return-format block is abbreviated ('{"role": str}' only) and slightly padded relative to its information content.
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 two-parameter read-only tool with full schema coverage and annotations, the description covers purpose, response envelope, and a usage example. Remaining gaps ā message ordering and truncation semantics for limit ā are modest but real for an agent interpreting the transcript.
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?
Schema coverage is 100% and both parameters are documented in the schema, so the baseline is 3. The example adds a concrete session_id format hint ('sess_01'), but no additional semantics for limit behavior (e.g., newest-first truncation) are supplied.
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?
States a specific verb and resource ('Retrieve message history from an opencode session') and clarifies the payload ('conversation transcript between the user and the agent'). It does not explicitly contrast with siblings like opencode_get_session or opencode_send_message, so an agent must infer the boundary itself.
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?
Usage is only implied by the phrase 'retrieve message history'; there is no statement of when to prefer this over opencode_get_session, opencode_list_sessions, or opencode_session_diff. The example shows a plausible call but not a decision rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opencode_get_projectBRead-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 | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so safety and repeatability are covered. The description adds the return shape ({success, message, data.project}), which is genuinely useful context beyond the annotations. It does not cover failure behavior or what happens when no project is active.
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?
Front-loaded with the purpose, followed by the return format. The Examples section containing just 'opencode_get_project()' adds nothing for a zero-arg tool and is the only wasted line.
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?
There is no output schema, so the description carries the burden of describing the response, and it does so with the exact return shape. The main missing piece is the no-active-project / failure case, which matters for a context-discovery tool.
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 takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a no-arg tool is 4.
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?
States a specific verb and resource ('Get the current project context') and narrows to 'active project path and metadata', which separates it from sibling getters like opencode_get_config and opencode_get_health. It does not explicitly name those siblings as alternatives, but the resource is distinct enough to be unambiguous.
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?
No statement of when to call this versus opencode_get_config, opencode_system, or opencode_get_session, and no prerequisites or exclusions. The only hint of usage is that it returns 'the active project', which an agent must infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opencode_get_run_statusARead-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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true. The description adds useful behavioral context by explaining that it returns stdout/stderr accumulated so far, status, and exit code, plus the exact return shape. It does not mention polling cadence or rate limits, but the annotations lower the disclosure burden.
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 front-loaded with purpose, followed by return format and a concise example. Every sentence contributes useful information without unnecessary repetition or filler.
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?
There is no output schema, but the description compensates by providing the exact return format, including the structure of the data object. It is nearly complete for a polling tool, though it could optionally mention possible status values or what happens after the job completes.
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?
Schema description coverage is 100%, and the schema already documents that job_id is a string 'Job ID from opencode_run_agent'. The description includes an example call but does not add meaning beyond the schema, so the baseline 3 applies.
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 uses a specific verb and resource: 'Poll the status of a background agent run.' It clearly distinguishes the tool from siblings such as opencode_run_agent, opencode_cancel_run, and opencode_list_runs by focusing on status polling for a single background job.
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 implies usage by saying 'Poll' and identifying the job_id as coming from opencode_run_agent, but it does not explicitly state when to use this tool versus opencode_list_runs or opencode_get_health, nor does it provide exclusions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opencode_get_sessionBRead-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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds a return-format sketch and an example call, which is useful since there is no output schema, but 'data': {'session': dict} is unspecified ā a caller still doesn't know what fields 'metadata and state' actually contain.
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?
Front-loaded one-line purpose followed by structured Return Format and Examples sections; short and scannable. The 'dict' placeholder in the return format is the only sentence that earns little.
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 single-param read tool this is nearly adequate, but with no output schema the return description must carry the load, and 'session': dict leaves the shape of metadata/state opaque. It also doesn't relate the tool to nearby siblings like opencode_get_messages or opencode_session_diff that an agent might want instead.
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?
Schema description coverage is 100% and the single session_id parameter is documented in the schema ('Session ID to retrieve'). The description's example shows the parameter name and a sample value format ('sess_01'), which is marginally additive but does not explain the ID source or format beyond the example.
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?
States a specific verb ('Get') and resource ('detailed information about a specific opencode session') and clarifies it returns metadata and state. This clearly distinguishes it from list-style siblings like opencode_list_sessions, though it never names those siblings explicitly.
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?
Usage is only implied: the required session_id and the word 'specific' suggest fetching one known session rather than enumerating. There is no explicit when-to-use statement, no exclusion, and no mention of opencode_list_sessions or opencode_get_messages as alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opencode_launch_uiA
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Only readOnlyHint=false is declared, so the description must carry behavioral weight. It usefully documents the return payload and the three modes, but omits key traits: whether the call blocks until the UI exits, what happens if a UI/server is already running, and what the 'serve' background mode implies for later shutdown (a sibling opencode_shutdown exists but isn't referenced).
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?
Front-loaded purpose sentence, then compact Return Format and Examples sections. Slightly more scaffolding than a 2-parameter tool strictly needs, but nothing is wasted or buried.
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?
No output schema exists, so the explicit Return Format block is valuable and covers the return contract. The remaining gap is lifecycle behavior (blocking, re-launch, pairing with opencode_shutdown), which matters for a tool that starts long-lived processes.
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?
Schema coverage is 100% with an enum on mode and a documented default, so the schema already does the heavy lifting. The two examples (mode="web", mode="serve") show call shape but add no semantic detail beyond the enum descriptions, so baseline 3 applies.
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?
States a specific verb (launch) and resource (opencode interface) plus three distinct modes (TUI, web UI, background API server). It is clearly distinct from the sibling tools, which manage sessions/runs/config, though it doesn't explicitly name a sibling to contrast against.
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?
'Use this to open the opencode interface for manual work' implies the context (interactive/manual use vs. the programmatic run/agent tools), but there is no explicit when-not guidance, no mention of conflicts with running instances, and no named alternative to route to instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opencode_list_providersARead-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 | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered; the description adds real value beyond that by disclosing the exact return envelope (success/message/data.providers[].name), which matters because no output schema exists. It stops short of covering failure modes (e.g. what happens when no providers are configured) or whether credentials/validation are involved.
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?
Front-loaded one-line purpose followed by a compact return schema; nothing is bloated. The '## Examples' section restates the zero-argument call with no added information, which is the only near-dead weight.
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, read-only listing tool with no output schema, the description supplies enough: purpose, return shape, and a call example. A brief note on what 'configured' means (e.g. whether unconfigured/available providers are excluded) would close the remaining gap.
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 takes zero parameters, so there is nothing for the description to disambiguate ā baseline 4 applies. The example call correctly reinforces the no-argument invocation.
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?
States a specific verb and resource ('List configured LLM providers in opencode'), which is unambiguous. It is implicitly distinguishable from siblings like opencode_get_config or opencode_get_health, but it never names or contrasts those alternatives explicitly.
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?
Usage is only implied by the tool's name and zero-parameter signature ā an agent will infer 'call this to discover available providers.' There is no statement of when to prefer it over opencode_get_config (which likely also exposes provider configuration) and no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opencode_list_runsBRead-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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered structurally. The description adds the return shape (job_id, status, exit_code), but leaves ambiguous what 'recent' means, how runs are ordered, or whether results are paginated beyond the limit cap.
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?
Purpose is front-loaded in a single sentence, followed by a compact return-format block and one example line. Nothing is repetitive, though the example adds little given a single bounded integer parameter.
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?
With no output schema, the description usefully supplies the exact return envelope, which is the main gap it needed to cover. It is slightly incomplete on ordering and the meaning of 'recent', but an agent can call it correctly from what is given.
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?
Schema description coverage is 100% and the limit parameter already documents its type, default of 20, and 1-100 bounds. The description only repeats the parameter in an example call, adding no semantics such as ordering or what happens when limit exceeds available runs.
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?
Specific verb and resource: 'List all recent agent runs with their status and exit codes' tells the agent exactly what is returned. It does not explicitly contrast itself with near-siblings like opencode_get_run_status (single run) or opencode_runs, so differentiation is left implicit.
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?
There is no statement of when to use this versus opencode_get_run_status or opencode_runs, and no prerequisites or exclusions. The only usage signal is an example call with limit=20, which demonstrates syntax rather than selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opencode_list_sessionsBRead-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 | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so safety behavior is covered. The description adds a return format and an example, which is useful given there is no output schema, but it does not disclose auth requirements, rate limits, or what 'recent' means operationally.
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?
Purpose is front-loaded and the return format is compact. The example 'opencode_list_sessions()' adds little for a zero-argument tool, but overall length is appropriate.
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, read-only listing tool with annotations and no output schema, the description supplies the missing return shape. The main remaining gap is sibling differentiation from opencode_sessions.
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 takes zero parameters, so the schema has nothing to document and the baseline is 4. The description correctly avoids burdening the reader with nonexistent parameter details.
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?
States the specific verb 'List' and resource 'opencode sessions' and adds the scope 'active and recent'. This helps distinguish it from a single-session getter, though it does not explicitly differentiate from the sibling opencode_sessions.
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?
Provides no explicit when-to-use guidance, no exclusions, and does not name alternatives such as opencode_sessions or opencode_get_session. The agent must infer selection from the purpose line alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opencode_mcpb_installA
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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only `readOnlyHint: false` in annotations, the description carries most of the behavioral burden and does well: it explains that the tool unpacks/reads a bundle, extracts a manifest, and merges a server definition into the config file. It does not explicitly describe overwrite/conflict behavior for existing server entries, but the mutation and `dry_run` semantics are sufficiently clear.
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 front-loaded with purpose and workflow, then provides return format and examples. It is generally well-structured and efficient, though the return format section is partly redundant because an output schema exists.
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?
Given the tool has an output schema, full parameter description coverage, and a clear mutation annotation, the description is nearly complete. It explains the mutation workflow and return shape; the main remaining gap is not explaining how existing server name conflicts are handled.
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?
Schema description coverage is 100%, and the schema already documents `source`, `dry_run`, and `name_override` meaningfully. The description's examples demonstrate usage scenarios but do not add significant parameter semantics beyond what the schema provides, so the baseline of 3 is appropriate.
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 a specific verb and resource: installing an MCPB bundle into opencode config. It also explains the core workflowāunpacking the bundle or reading a directory, extracting the manifest, and merging the server definition into the config's `mcp` sectionāso an agent can understand exactly what the tool does.
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 clearly establishes the context: use this when installing an MCPB bundle or unpacked MCPB directory into opencode config. The examples reinforce usage, but there are no explicit exclusions or alternative tools for other installation paths.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opencode_run_agentA
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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The only annotation is readOnlyHint=false, so the description must carry the behavioral load and it does: asynchronous background execution, job_id polling contract, wait/timeout interaction, and the specific unattended-run stall risk from permission prompts. It also spells out the return envelope (success/message/data.job_id/status/options), which the annotations do not cover at all.
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?
Front-loaded correctly: purpose and launch semantics come first, then the unattended-run caveat, then a clearly headed Return Format block, then examples. Each of the four examples demonstrates a distinct parameter combination rather than repeating the same call, so the length is justified. It is still a fairly long block for a tool whose core contract fits in two sentences.
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 14-parameter mutation tool with no output schema, the description supplies the missing return shape, the async lifecycle entry point, and the timeout/permission pitfall that would otherwise cause silent failures. An agent can construct a correct call and know how to follow up on the job_id from the description alone; remaining gaps (status vocabulary, cancellation via opencode_cancel_run) are minor and covered by siblings.
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?
Schema coverage is 100%, so a 3 is the baseline and the schema already explains each of the 14 parameters. The description adds compositional meaning the schema cannot convey: the wait/timeout pairing, auto=true as the fix for unattended stalls, and worked examples showing session_id+fork and model+agent+auto together. It does not clarify the relationship between continue_session and fork or what status values appear in data.status.
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 first line names a specific verb and resource ('Run an opencode agent') plus the key knobs (prompt, model, agent, permission mode), and the second line clarifies that it launches a background job returning a job_id. This implicitly separates it from the polling siblings (opencode_get_run_status, opencode_list_runs), but no sibling is ever named, so the differentiation is inferential rather than explicit.
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?
It gives concrete conditional guidance: set wait=true to block, unattended runs usually need auto=true or a permission prompt will stall the run until timeout. That is real when-to-use advice tied to failure modes. It stops short of a 5 because it never says when to prefer opencode_send_message (continue an existing session) or opencode_launch_ui over starting a new agent run, even though session_id/continue_session/fork make that choice relevant.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opencode_runsOpenCode RunsADestructive
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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is known. The description adds useful async semantics (fire-and-forget returns job_id, poll to retrieve results) and a return-shape hint, but it never mentions that cancel terminates a running agent or what auto/timeout imply behaviorally beyond the schema text.
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 purpose line is front-loaded and the return-format block is compact. Five examples is on the generous side for an 18-parameter tool, but each demonstrates a distinct action or flag combination, so they largely earn their space.
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?
An output schema exists, making the explicit return-format block somewhat redundant, and the async polling note plus examples cover the main calling patterns. The only real gap is the absence of any guidance distinguishing this tool from the single-action siblings that cover the same ground.
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?
Schema description coverage is 100%, so the baseline is 3 regardless of description content. The examples do add value by showing which parameters pair with which action (model/agent/auto with start, job_id with status, limit/offset with list), but no format or constraint detail beyond the schema.
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 specific verbs and the resource: 'start, poll status, list recent, or cancel' agent runs, and the action enum is labeled accordingly. It does not, however, distinguish this tool from direct siblings that appear to do the same individual jobs (opencode_run_agent, opencode_get_run_status, opencode_list_runs, opencode_cancel_run), so an agent has no signal for when to pick this multi-action tool over the narrow ones.
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?
Workflow guidance is implied through the note that fire-and-forget starts return a job_id which you poll with action="status", and the examples demonstrate realistic call shapes. There is no explicit when-to-use/when-not statement and no mention of the sibling alternatives, leaving the routing decision to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opencode_send_messageA
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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation only declares readOnlyHint=false; the description usefully adds the return envelope {"success", "message", "data": {"result"}} since there is no output schema. It does not disclose whether the call blocks until the agent replies, what happens on an invalid or busy session, or whether delivery is queued or immediate.
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?
Front-loaded two-sentence purpose followed by clearly labeled Return Format and Example sections; nothing is buried. The example largely restates the schema, which costs a little, but overall the text is tight.
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 2-required-parameter mutation tool with no output schema, supplying the return envelope is the key missing piece and it is present. The remaining gap is the lack of any error/edge-case behavior, which matters because sending to a nonexistent session is a realistic failure mode.
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?
Schema description coverage is 100%, so both parameters are already documented in-schema and the baseline is 3. The example adds a concrete shape (session_id="sess_01", message="continue") that hints at sending a short continuation prompt, but adds no real semantic depth beyond the schema.
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?
States a specific verb+resource (send a message to an existing session) and adds the intent (continue a conversation with a running agent). It implicitly separates itself from opencode_run_agent and the read-side opencode_get_messages, though it never names those siblings explicitly.
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?
'Use this to continue a conversation with a running agent' plus 'existing session' establishes the precondition that a session must already exist, which is useful. However, it names no alternatives (e.g. run_agent for new work, get_messages for reading) and gives no guidance for a missing, idle, or terminated session.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opencode_server_statusARead-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 | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds the shape of the response and the categories of data returned, but says nothing about cost, latency, auth prerequisites, or whether it fails when the server is down ā notable gaps for a health-check tool.
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 purpose is front-loaded in the first line and the return format is clearly sectioned. The '## Examples' block containing a bare no-argument call adds nothing an agent couldn't infer, which is the only wasted space.
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?
No output schema exists, but the description compensates by documenting the return envelope and the data categories. What's missing is failure-mode behavior (what happens when the server is unreachable), which matters for a status/health tool.
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?
There are zero parameters and the schema disallows additional properties, so there is nothing for the description to disambiguate. Baseline 4 applies.
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?
States a specific verb and resource: 'Check the status and health of the opencode server', with a summary of what comes back (health info, active session count, config summary). It does not distinguish itself from close siblings such as opencode_get_health or opencode_system, so it stops short of a 5.
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?
Usage is only implied ā an agent must infer from the returned fields (health, sessions, config) that this is a general-purpose overview. There is no explicit when-to-use/when-not guidance and no mention of the obvious alternatives opencode_get_health or opencode_system.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opencode_session_diffARead-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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds real value beyond that by specifying the return format and stating the diff includes file paths and change types, giving the agent a sense of output shape for a tool with no output schema.
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 core purpose is front-loaded in the first sentence, followed by output shape and a compact example. Slightly more scaffolding (labeled sections) than strictly needed for a one-parameter tool, but nothing is wasteful.
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?
With no output schema, the description appropriately explains the return structure and diff contents, which is exactly what an agent needs to interpret results. Only usage/differentiation guidance is missing, so it is nearly complete for a simple read tool.
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?
Schema coverage is 100% for the single session_id parameter, so the schema already documents it. The description's example (session_id="sess_01") adds only superficial format illustration, so baseline 3 applies.
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?
States a specific verb (show) and resource (files created/modified/deleted in a session), which is concrete and distinguishable from a generic session fetch. It does not, however, explicitly contrast itself with close siblings like opencode_get_session or opencode_get_messages.
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?
Usage is implied by the purpose ā diff a session's file changes ā but there is no explicit when-to-use/when-not or naming of alternatives such as opencode_get_session for metadata vs. this for file diffs. The example clarifies the call shape but not the routing decision.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opencode_sessionsOpenCode SessionsA
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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give readOnlyHint=false, so the description must carry the safety burden and it largely does: delete is flagged as permanent and gated on confirm=True, share is described as 'offline, revocable', unshare as revocation, and rename as affecting the serve API and live UI. What is missing is the auth/permission requirements and any note that this tool mixes read and write actions in one surface.
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 opening sentence simply re-lists the enum values already present in the schema, which is wasted text, and the 'Return Format' line duplicates a return value the tool already declares via output schema. The Examples block does earn its place, and the structure is front-loaded, but roughly a third of the description is redundant with structured fields.
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 nine-parameter, eleven-action tool with a full output schema, the description covers action scope and mutation behavior adequately. The gaps are the absence of any sibling routing guidance (critical given five near-duplicate siblings) and no error or failure-mode information for actions like send/grep on nonexistent sessions.
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?
Schema description coverage is 100%, so the baseline is 3; the description earns a bump because the Examples block ties parameters to specific actions (session_id with get/messages/send/diff/export/share/unshare/rename/delete, query with grep, format with export), which the flat schema does not express. It still doesn't clarify pagination semantics for offset/limit across list vs messages.
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?
States a specific verb ('Inspect and interact with') plus resource ('opencode sessions') and enumerates the twelve operations in scope, so an agent knows exactly what the tool covers. However, it never distinguishes itself from highly overlapping siblings such as opencode_list_sessions, opencode_get_session, opencode_send_message, opencode_get_messages, and opencode_session_diff, which is the main purpose-clarity gap for a facade tool.
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 Examples block implicitly demonstrates which action pairs with which parameters (action='messages' with session_id, action='rename' with title, action='delete' with confirm=True), which is real invocation guidance. But there is no explicit when-to-use-this-vs-alternative guidance, and nothing tells the agent why it should call this consolidated tool rather than the granular session siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opencode_shutdownADestructive
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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already flag destructiveHint=true and readOnlyHint=false, so the agent knows this is a destructive operation. The description adds that shutdown is graceful and that the optional reason is written to stderr, but it does not disclose the impact on active runs, sessions, or whether shutdown is irreversible.
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-loads the purpose before return format and examples. The return format section duplicates the existing output schema, but it is brief and does not significantly harm readability.
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 tool is low-complexity, has full schema descriptions, annotations, and an output schema, and the description provides enough to identify and invoke it. The main missing context is the operational impact of a destructive shutdown, which is only partially covered by the destructive annotation.
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?
Schema description coverage is 100%, so the schema already explains both parameters. The examples add invocation shape, but the confirm=False example is ambiguous because the schema says confirm must be True to shut down, and the description does not explain what that example would accomplish.
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 uses a specific verb and resource: 'Shut down this MCP server process gracefully.' It is unambiguous and clearly distinct from sibling tools such as opencode_server_status, opencode_get_health, and opencode_cancel_run.
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 examples imply the tool is used with confirm=True, but the description never explicitly states when to use this tool, when not to use it, or what confirm=False actually does. Usage is inferable from the name but not fully guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opencode_systemOpenCode SystemC
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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, and the description correctly implies most actions are reads while one (launch_ui) mutates ā no contradiction. However, it never says which of the six actions are side-effecting, nor what launch_ui actually does (spin up a long-running process? return immediately?), which is the main behavior risk an agent needs to know. The return-format block adds a little context, though it duplicates the output schema.
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?
Sized appropriately and the examples are genuinely useful for call shape, but the opening fragment is under-specified rather than concise, and the Return Format block restates an output schema that already exists ā a sentence that does not earn its place.
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 six-action multiplexer with a non-read-only annotation, the description should tell the agent which actions are safe probes versus which launch processes, and how this tool relates to its many single-purpose siblings. It instead provides a return-format restatement and three examples, leaving the routing and side-effect questions unanswered.
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?
Schema description coverage is 100% and the action enum already documents each value ('status: health + startup probe...', 'config_drift: check local MCP server paths exist on disk'), so the parameter work is done. The description's examples show realistic action/mode pairings (action="launch_ui", mode="web") but add no semantic detail beyond the schema.
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 first line is a noun-phrase fragment ('opencode server environment: health/status, providers, project, launch UI, MCP pulse, or config drift') that enumerates the six actions but never states what the tool does with them as a whole. It is distinguishable from individual siblings only obliquely ā opencode_server_status, opencode_list_providers, opencode_get_project and opencode_launch_ui all appear in the sibling list with overlapping scope, and the description never explains the difference between this multiplexer and those single-purpose tools.
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?
There is no when-to-use or when-not-to-use guidance at all. Several siblings (opencode_server_status, opencode_list_providers, opencode_get_project, opencode_launch_ui) cover the same ground as individual actions here, and the description gives no rule for choosing between the multiplexed action and the dedicated sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
Multiple tools appear to do the same thing: opencode_runs, opencode_run_agent, opencode_get_run_status, opencode_list_runs, and opencode_cancel_run overlap heavily with each other and with show_runs_app. Similarly opencode_sessions, opencode_depot, opencode_list_sessions, opencode_get_session, opencode_get_messages, opencode_send_message, and opencode_session_diff all target sessions, while opencode_system, opencode_server_status, opencode_get_health, show_status_app, and opencode_launch_ui overlap on server state/launch. An agent would struggle to pick the right tool without trial and error.
Most tools use an opencode_ prefix with a verb_noun shape, but the show_*_app tools break the pattern and singular/plural is inconsistent (opencode_run_agent vs opencode_runs, opencode_get_run_status vs opencode_runs status action). The mix of aggregate action-dispatch tools and thin single-purpose wrappers adds further naming drift.
25 tools is heavy for this domain, and much of the count comes from redundant legacy wrappers (opencode_list_sessions, opencode_get_session, opencode_get_messages, opencode_send_message, opencode_session_diff) that are already covered by opencode_sessions actions. The redundant Prefab card tools (show_*_app) further inflate the surface without adding capability.
Coverage of sessions, runs, depot, backups, config, system status, and MCPB install is broad with few obvious lifecycle gaps. The main weakness is that configuration is read-only (opencode_get_config with no set/update) and some operations are duplicated rather than complementary, but core workflows are covered.
Maintenance
Related MCP Connectors
Host any HTTP API as a standard MCP server; auto-distribute to 12+ mainstream agent platforms.
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.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceAggregates multiple backend MCP servers into a single unified interface with optional web management UI for tool control and configuration.105 npm196MIT
- AlicenseNot gradedqualityBmaintenanceAggregates multiple MCP servers into a single HTTP endpoint with tool namespacing, dashboard, and REST API for management.32 npmMIT
- AlicenseNot gradedqualityAmaintenanceConnects MCP clients such as Claude, Cursor, and VS Code to OpenCode's headless API so users can delegate coding work ā asking questions, implementing features, monitoring background jobs, answering prompts and permission requests, and reviewing changes across multiple projects. Supports synchronous runs, asynchronous jobs with polling and recovery, multi-project directory scoping, and configurable server authentication and tool profiles.24,321 npmMIT
- AlicenseCqualityBmaintenanceEnables MCP clients to interact with OpenCode 2.x/3.x servers through direct /api/... HTTP routing and ~85 tools spanning sessions, messages, files, config, providers, projects, input, TUI, and workflows. Runs as a zero-dependency, pure-JavaScript stdio bridge with no SDK or build step.85MIT