Skip to main content
Glama

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

opencode_depot(action="search", query="...") — full-text (FTS5) across every session transcript and title, ever. "What were we working on in December?"

Semantic recall (RAG)

opencode_depot(action="rag", query="...") — embeddings-based similarity over indexed transcripts; find it when you don't remember the words. rag_index builds the index, rag_status shows state

Read the past

opencode_sessions(action="messages"|"diff"|"export", session_id=...) — full transcript, file changes, or a clean markdown/html document

Edit the past

rename / archive / unarchive / delete sessions (live API or offline depot)

Never lose it

opencode_backups(action="create"|"restore", ...) — db + config snapshots, rotation, disk guard, autobackup every 24h

Run agents

opencode_runs(action="start"|"status"|"list"|"cancel", ...) — launch, supervise, review

Manage opencode

opencode_system(...) — status, providers, project, MCP pulse, config drift

Desktop sidebar

sidebar/opencode-sidebar.ahk (AHK v2 companion, outside the .mcpb) — docked session list, palette jump, right-click rename/archive/delete, hover previews. See docs/SIDEBAR.md

Related MCP server: MCP Proxy Server

Install

Download: opencode-cli-mcp-0.2.11-setup.exe - installs the desktop app and its embedded backend in one step (Windows, current user, no admin).

The installer is unsigned, so SmartScreen will warn. Click More info → Run anyway.

All releases, older versions, and the .mcpb bundle: Releases.

You want

Use

Desktop app + backend

opencode-cli-mcp-0.2.11-setup.exe above

MCP server inside Claude Desktop only

opencode-cli-mcp-0.2.11.mcpb from Releases

Manual setup, prerequisites, troubleshooting

INSTALL.md

Development setup and build recipes

docs/DEVELOPMENT.md

Every path needs the opencode CLI installed (npm i -g opencode-ai).

MCP Tools

Primary surface - seven portmanteaus (operation discriminator):

Tool

Purpose

opencode_runs(action=...)

start / status / list / cancel agent runs

opencode_sessions(action=...)

list / get / messages / send / diff / grep / export / rename / delete sessions (live opencode serve API - the opencode UI picks the changes up immediately)

opencode_depot(action=...)

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 opencode serve needed).

opencode_backups(action=...)

protect the memory - db + config snapshots (consistent online backup API), rotation, disk-space guard, guarded restore (refuses while serve runs unless force=True)

opencode_system(action=...)

status / providers / project / launch_ui / mcp_pulse / config_drift

opencode_mcpb_install(...)

install .mcpb bundles into opencode config

opencode_shutdown(confirm=...)

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 changes

Multi-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

Onboarding

5-minute first-run guide

Usage Guide

All tools, workflows, async patterns, webapp pages

Integration Guide

MCP client config (Claude Desktop, Cursor, Windsurf)

Advanced Usage

Async patterns, session management, cross-project, custom tools

Improvement Plan

Known issues and roadmap

Changelog

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/10951

  • fleet-registry.json and glama.json in repo root

  • Webapp dashboard: http://localhost:10950 (run .\start.ps1)

Available Tools

25 tools
opencode_backupsOpenCode Backups
Destructive

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoTarget: database, config directory, or both (create/prune)all
nameNoBackup filename (required for restore/delete)
forceNoAllow restore while opencode serve is running
actionYesstatus: 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.
confirmNoMust be True for restore (overwrites live data)

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
messageYes
successYes
opencode_cancel_run
Destructive

Cancel a running or queued agent run.

Return Format

{"success": bool, "message": str, "data": {"job_id": str}}

Examples

opencode_cancel_run(job_id="abc123")

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYesJob ID to cancel
opencode_depotOpenCode Session Depot
Destructive

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")

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoList/search: only sessions carrying this tag
sortNoSort order (list); 'starred' puts favourites firstupdated
tagsNotag_add/tag_remove: comma-separated tags, e.g. 'neuro, vienna'
agentNoAgent name filter (list)
limitNoPage size (list/search/rag/code)
queryNoSearch text (search/rag/code)
titleNoNew title (rename)
actionYeslist: 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.
formatNoexport: output format (docx requires LibreOffice installed)md
offsetNoPage offset (list)
searchNoTitle substring filter (list)
statusNoStatus filter (list): all, active, or archivedall
date_toNoSearch/list: explicit range end YYYY-MM-DD (takes precedence over timeframe_days)
projectNoProject/directory substring filter (list)
starredNoList/search: true = only favourites, false = only unstarred, null = no constraint
out_pathNoexport: destination file (default ~/Downloads)
date_fromNoSearch/list: explicit range start YYYY-MM-DD (takes precedence over timeframe_days)
session_idNoSession ID (required for get/archive/unarchive/rename/delete)
path_filterNoFile path substring (code): only rows whose path contains this
timeframe_daysNoSearch/list: parts/sessions from the last N days (e.g. 7 = last week)
include_archivedNoSearch: include archived sessions

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
messageYes
successYes
opencode_get_config
Read-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()

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

opencode_get_health
Read-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()

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

opencode_get_messages
Read-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)

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of messages to retrieve
session_idYesSession ID to retrieve messages from
opencode_get_project
Read-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()

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

opencode_get_run_status
Read-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")

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYesJob ID from opencode_run_agent
opencode_get_session
Read-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")

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYesSession ID to retrieve
opencode_launch_ui

Launch opencode interactively - TUI, web UI, or background API server.

Use this to open the opencode interface for manual work.

Return Format

{"success": bool, "message": str, "data": {"mode": str, "project": str}}

Examples

opencode_launch_ui(mode="web") opencode_launch_ui(mode="serve")

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoLaunch mode: 'tui' (terminal UI), 'web' (browser), 'serve' (background API server)tui
projectNoProject directory to open. Uses cwd if omitted.
opencode_list_providers
Read-onlyIdempotent

List configured LLM providers in opencode.

Return Format

{"success": bool, "message": str, "data": {"providers": [{"name": str}]}}

Examples

opencode_list_providers()

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

opencode_list_runs
Read-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)

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax jobs to return
opencode_list_sessions
Read-onlyIdempotent

List all active and recent opencode sessions.

Return Format

{"success": bool, "message": str, "data": {"sessions": [{"id": str}]}}

Examples

opencode_list_sessions()

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

opencode_mcpb_install

OPENCODE_MCPB_INSTALL - Install an MCPB bundle into opencode config.

Unpacks the .mcpb (or reads an unpacked directory), extracts the manifest, and merges the server definition into the opencode config file's mcp section.

Return Format

{"success": bool, "server_name": str, "config_path": str, "entry": {...}}

Examples

opencode_mcpb_install(source="./dist/arxiv-mcp-v1.0.0.mcpb") opencode_mcpb_install(source="./dist/arxiv-mcp-v1.0.0.mcpb", name_override="arxiv") opencode_mcpb_install(source="./mcpb/", dry_run=True)

ParametersJSON Schema
NameRequiredDescriptionDefault
sourceYesPath to an .mcpb file or an unpacked MCPB directory.
dry_runNoShow what would be written without modifying the config.
name_overrideNoOverride the server name in opencode config. Default: from manifest.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
messageYes
successYes
opencode_run_agent

Run an opencode agent with a prompt, model, agent, and permission mode.

Launches as background job; returns job_id for polling. Set wait=true to block until done. Unattended runs usually need auto=true - otherwise a permission prompt stalls the run until the timeout.

Return Format

{"success": bool, "message": str, "data": {"job_id": str, "status": str, "options": dict}}

Examples

opencode_run_agent(prompt="Refactor main.py", wait=False) opencode_run_agent(prompt="Summarize README", format="json", wait=True, timeout=120) opencode_run_agent(prompt="Fix tests", model="deepseek/deepseek-flash", agent="build", auto=True) opencode_run_agent(prompt="Continue the migration", session_id="ses_123", fork=True)

ParametersJSON Schema
NameRequiredDescriptionDefault
autoNoAuto-approve permissions that are not explicitly denied (opencode --auto). Required for unattended runs that would otherwise block on an approval prompt.
forkNoFork the session before continuing (requires session_id or continue_session)
waitNoWait for completion (true) or return immediately with job_id (false)
agentNoAgent to use (opencode agent name, e.g. 'build' or 'plan'). Omit for the default agent
filesNoFile paths to attach to the message (opencode --file). Must exist on disk.
modelNoModel as provider/model (e.g. 'deepseek/deepseek-flash'). Omit for opencode's default
formatNoOutput format: 'text' or 'json'text
promptYesThe prompt/message to send to the opencode agent
projectNoProject directory path (optional)
timeoutNoMax seconds to wait when wait=true (default 300)
variantNoProvider-specific reasoning variant, e.g. 'high', 'max', 'minimal'
thinkingNoInclude thinking blocks in the output
session_idNoContinue this session instead of starting a new one (opencode --session)
continue_sessionNoContinue the most recent session (opencode --continue); ignored when session_id is set
opencode_runsOpenCode Runs
Destructive

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
autoNoAuto-approve permissions not explicitly denied (start, opencode --auto). Needed for unattended runs; without it a prompt stalls the run.
forkNoFork before continuing; requires session_id or continue_session (start)
waitNoBlock until done (start; default false = fire-and-forget)
agentNoopencode agent name, e.g. 'build' or 'plan' (start)
filesNoFiles to attach to the message (start). Must exist on disk.
limitNoPage size (list)
modelNoModel as provider/model, e.g. 'deepseek/deepseek-flash' (start). Default: opencode's
actionYesstart: launch an agent run. status: poll a run. list: recent runs. cancel: stop a run.
job_idNoJob ID (required for status/cancel)
offsetNoPage offset (list)
promptNoAgent prompt (required for start)
projectNoProject directory (optional, start)
timeoutNoMax seconds for the run (start)
variantNoProvider reasoning variant, e.g. 'high', 'max', 'minimal' (start)
thinkingNoInclude thinking blocks in output (start)
session_idNoContinue this session instead of a new one (start)
output_formatNoOutput format (start)text
continue_sessionNoContinue the most recent session (start; ignored when session_id is set)

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
messageYes
successYes
opencode_send_message

Send a message to an existing opencode session.

Use this to continue a conversation with a running agent.

Return Format

{"success": bool, "message": str, "data": {"result": dict}}

Examples

opencode_send_message(session_id="sess_01", message="continue")

ParametersJSON Schema
NameRequiredDescriptionDefault
messageYesMessage text to send to the agent
session_idYesSession ID to send message to
opencode_server_status
Read-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()

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

opencode_session_diff
Read-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")

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYesSession ID to diff
opencode_sessionsOpenCode Sessions

Inspect and interact with opencode sessions: list, get, transcript, send, diff, grep, export, share, unshare, rename, or delete.

Return Format

{"success": bool, "message": str, "data": dict}

Examples

opencode_sessions(action="list", limit=50) opencode_sessions(action="messages", session_id="sess_01", limit=100) opencode_sessions(action="send", session_id="sess_01", message="continue") opencode_sessions(action="share", session_id="sess_01") opencode_sessions(action="unshare", session_id="sess_01") opencode_sessions(action="rename", session_id="sess_01", title="Refactor auth module") opencode_sessions(action="delete", session_id="sess_01", confirm=True)

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size (list/messages)
queryNoSearch query (required for grep)
titleNoNew title (required for rename)
actionYeslist: 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).
formatNoExport format: markdown or html (export)markdown
offsetNoPage offset (list)
confirmNoMust be True to delete (permanent)
messageNoMessage text (required for send)
session_idNoSession ID (required for get/messages/send/diff/export/share/unshare/rename/delete)

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
messageYes
successYes
opencode_shutdown
Destructive

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonNoOptional reason, recorded in stderr before exit.
confirmNoMust be True to shut down the server.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
messageYes
successYes
opencode_systemOpenCode System

opencode server environment: health/status, providers, project, launch UI, MCP pulse, or config drift.

Return Format

{"success": bool, "message": str, "data": dict}

Examples

opencode_system(action="status") opencode_system(action="providers") opencode_system(action="launch_ui", mode="web")

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoLaunch mode (launch_ui)tui
actionYesstatus: 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.
projectNoProject directory (launch_ui)

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
messageYes
successYes
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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 22 tool updatesv0.2.11
    • Changedopencode_backups3 fields changed
      • removedOutput schema / additionalProperties
        Removed value: -true
      • addedOutput schema / properties
        Added value: +{
        +  "data": {
        +    "type": "object"
        +  },
        +  "message": {
        +    "type": "string"
        +  },
        +  "success": {
        +    "type": "boolean"
        +  }
        +}
      • addedOutput schema / required
        Added value: +[
        +  "success",
        +  "message",
        +  "data"
        +]
    • Changedopencode_cancel_run1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedopencode_depot16 fields changed
      • changedInput schema / properties / action / description
        Previous 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."
      • changedInput schema / properties / action / enum
        Previous 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"
        +]
      • addedInput schema / properties / date_from
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Search/list: explicit range start YYYY-MM-DD (takes precedence over timeframe_days)"
        +}
      • addedInput schema / properties / date_to
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Search/list: explicit range end YYYY-MM-DD (takes precedence over timeframe_days)"
        +}
      • addedInput schema / properties / format
        Added value: +{
        +  "default": "md",
        +  "description": "export: output format (docx requires LibreOffice installed)",
        +  "enum": [
        +    "md",
        +    "html",
        +    "docx"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / include_archived
        Added value: +{
        +  "default": true,
        +  "description": "Search: include archived sessions",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / out_path
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "export: destination file (default ~/Downloads)"
        +}
      • changedInput schema / properties / sort / description
        Previous value: -"Sort order (list)"New value: +"Sort order (list); 'starred' puts favourites first"
      • changedInput schema / properties / sort / enum
        Previous value: -[
        -  "updated",
        -  "created",
        -  "archived",
        -  "cost",
        -  "tokens",
        -  "title"
        -]New value: +[
        +  "updated",
        +  "created",
        +  "archived",
        +  "cost",
        +  "tokens",
        +  "title",
        +  "starred"
        +]
      • addedInput schema / properties / starred
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "List/search: true = only favourites, false = only unstarred, null = no constraint"
        +}
      • addedInput schema / properties / tag
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "List/search: only sessions carrying this tag"
        +}
      • addedInput schema / properties / tags
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "tag_add/tag_remove: comma-separated tags, e.g. 'neuro, vienna'"
        +}
      • addedInput schema / properties / timeframe_days
        Added 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)"
        +}
      • removedOutput schema / additionalProperties
        Removed value: -true
      • addedOutput schema / properties
        Added value: +{
        +  "data": {
        +    "type": "object"
        +  },
        +  "message": {
        +    "type": "string"
        +  },
        +  "success": {
        +    "type": "boolean"
        +  }
        +}
      • addedOutput schema / required
        Added value: +[
        +  "success",
        +  "message",
        +  "data"
        +]
    • Changedopencode_get_config1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedopencode_get_health1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedopencode_get_messages1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedopencode_get_project1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedopencode_get_run_status1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedopencode_get_session1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedopencode_launch_ui1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedopencode_list_providers1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedopencode_list_runs1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedopencode_list_sessions1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedopencode_mcpb_install3 fields changed
      • removedOutput schema / additionalProperties
        Removed value: -true
      • addedOutput schema / properties
        Added value: +{
        +  "data": {
        +    "type": "object"
        +  },
        +  "message": {
        +    "type": "string"
        +  },
        +  "success": {
        +    "type": "boolean"
        +  }
        +}
      • addedOutput schema / required
        Added value: +[
        +  "success",
        +  "message",
        +  "data"
        +]
    • Changedopencode_run_agent10 fields changed
      • addedInput schema / properties / agent
        Added 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"
        +}
      • addedInput schema / properties / auto
        Added 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"
        +}
      • addedInput schema / properties / continue_session
        Added value: +{
        +  "default": false,
        +  "description": "Continue the most recent session (opencode --continue); ignored when session_id is set",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / files
        Added 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."
        +}
      • addedInput schema / properties / fork
        Added value: +{
        +  "default": false,
        +  "description": "Fork the session before continuing (requires session_id or continue_session)",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / model
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Model as provider/model (e.g. 'deepseek/deepseek-flash'). Omit for opencode's default"
        +}
      • addedInput schema / properties / session_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Continue this session instead of starting a new one (opencode --session)"
        +}
      • addedInput schema / properties / thinking
        Added value: +{
        +  "default": false,
        +  "description": "Include thinking blocks in the output",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / variant
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Provider-specific reasoning variant, e.g. 'high', 'max', 'minimal'"
        +}
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedopencode_runs12 fields changed
      • addedInput schema / properties / agent
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "opencode agent name, e.g. 'build' or 'plan' (start)"
        +}
      • addedInput schema / properties / auto
        Added 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"
        +}
      • addedInput schema / properties / continue_session
        Added value: +{
        +  "default": false,
        +  "description": "Continue the most recent session (start; ignored when session_id is set)",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / files
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Files to attach to the message (start). Must exist on disk."
        +}
      • addedInput schema / properties / fork
        Added value: +{
        +  "default": false,
        +  "description": "Fork before continuing; requires session_id or continue_session (start)",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / model
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Model as provider/model, e.g. 'deepseek/deepseek-flash' (start). Default: opencode's"
        +}
      • addedInput schema / properties / session_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Continue this session instead of a new one (start)"
        +}
      • addedInput schema / properties / thinking
        Added value: +{
        +  "default": false,
        +  "description": "Include thinking blocks in output (start)",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / variant
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Provider reasoning variant, e.g. 'high', 'max', 'minimal' (start)"
        +}
      • removedOutput schema / additionalProperties
        Removed value: -true
      • addedOutput schema / properties
        Added value: +{
        +  "data": {
        +    "type": "object"
        +  },
        +  "message": {
        +    "type": "string"
        +  },
        +  "success": {
        +    "type": "boolean"
        +  }
        +}
      • addedOutput schema / required
        Added value: +[
        +  "success",
        +  "message",
        +  "data"
        +]
    • Changedopencode_send_message1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedopencode_server_status1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedopencode_session_diff1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedopencode_sessions6 fields changed
      • changedInput schema / properties / action / description
        Previous 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)."
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "list",
        -  "get",
        -  "messages",
        -  "send",
        -  "diff",
        -  "grep",
        -  "export",
        -  "rename",
        -  "delete"
        -]New value: +[
        +  "list",
        +  "get",
        +  "messages",
        +  "send",
        +  "diff",
        +  "grep",
        +  "export",
        +  "share",
        +  "unshare",
        +  "rename",
        +  "delete"
        +]
      • changedInput schema / properties / session_id / description
        Previous 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)"
      • removedOutput schema / additionalProperties
        Removed value: -true
      • addedOutput schema / properties
        Added value: +{
        +  "data": {
        +    "type": "object"
        +  },
        +  "message": {
        +    "type": "string"
        +  },
        +  "success": {
        +    "type": "boolean"
        +  }
        +}
      • addedOutput schema / required
        Added value: +[
        +  "success",
        +  "message",
        +  "data"
        +]
    • Changedopencode_shutdown3 fields changed
      • removedOutput schema / additionalProperties
        Removed value: -true
      • addedOutput schema / properties
        Added value: +{
        +  "data": {
        +    "type": "object"
        +  },
        +  "message": {
        +    "type": "string"
        +  },
        +  "success": {
        +    "type": "boolean"
        +  }
        +}
      • addedOutput schema / required
        Added value: +[
        +  "success",
        +  "message",
        +  "data"
        +]
    • Changedopencode_system3 fields changed
      • removedOutput schema / additionalProperties
        Removed value: -true
      • addedOutput schema / properties
        Added value: +{
        +  "data": {
        +    "type": "object"
        +  },
        +  "message": {
        +    "type": "string"
        +  },
        +  "success": {
        +    "type": "boolean"
        +  }
        +}
      • addedOutput schema / required
        Added value: +[
        +  "success",
        +  "message",
        +  "data"
        +]
  2. 25 tool updatesv0.2.3
    • First observedopencode_backups
    • First observedopencode_cancel_run
    • First observedopencode_depot
    • First observedopencode_get_config
    • First observedopencode_get_health
    • First observedopencode_get_messages
    • First observedopencode_get_project
    • First observedopencode_get_run_status
    • First observedopencode_get_session
    • First observedopencode_launch_ui
    • First observedopencode_list_providers
    • First observedopencode_list_runs
    • First observedopencode_list_sessions
    • First observedopencode_mcpb_install
    • First observedopencode_run_agent
    • First observedopencode_runs
    • First observedopencode_send_message
    • First observedopencode_server_status
    • First observedopencode_session_diff
    • First observedopencode_sessions
    • First observedopencode_shutdown
    • First observedopencode_system
    • First observedshow_runs_app
    • First observedshow_sessions_app
    • First observedshow_status_app

TDQS

B3.3/5.0

Scored across 25 tools

Disambiguation1/5

The tool set has severe overlap: opencode_runs duplicates opencode_run_agent, opencode_list_runs, opencode_get_run_status, and opencode_cancel_run via action parameters; opencode_sessions duplicates opencode_list_sessions, opencode_get_session, opencode_send_message, opencode_get_messages, and opencode_session_diff; opencode_system duplicates opencode_launch_ui, opencode_server_status, opencode_list_providers, opencode_get_project, opencode_get_health, and opencode_get_config. These overlapping action-based and individual tools create ambiguity about which to call, despite descriptions.

Naming Consistency2/5

Names mix conventions: many use opencode_verb_noun (e.g., opencode_list_sessions, opencode_get_config), but others use opencode_noun with action parameters (opencode_runs, opencode_sessions, opencode_depot, opencode_backups, opencode_system), and the show_*_app tools deviate entirely (show_status_app, show_runs_app). This inconsistency across the set makes it hard to predict tool names.

Tool Count3/5

At 25 tools, the server is at the high end of the borderline range for its scope, and many tools are redundant counterparts to the action-based aggregators, inflating the count without adding surface area. However, the domain (opencode CLI management) is broad enough that 25 isn't extreme.

Completeness4/5

The server covers the major workflows: installing bundles, running agents, inspecting sessions, backups, system status, and viewing rich UI cards. Minor gaps exist (no direct session creation, no config editing), but these can be worked around via existing actions like opencode_send_message or opencode_system.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers