claude-opencode-mcp
Summary: This MCP server lets Claude Code delegate software-engineering work to OpenCode agents (DeepSeek by default) running in your own project worktree, then inspect and control those runs.
Delegate a one-off task (
delegate_task) — hand a coding, research, review, or testing job to an agent and get back a JSON summary, structured findings, and files changed.Choose the agent —
deepseek-researcher,deepseek-reviewer,deepseek-coder(edits + runs tests), ordeepseek-tester, plus project-local agents under.claude-opencode/agents/.Run agent work in your real workspace — pass
cwd(defaults toCLAUDE_PROJECT_DIR) so the agent reads and edits the same files Claude Code uses; usepathsas exploration hints.Override the model per call — e.g.
deepseek/deepseek-v4-pro.Create persistent sessions (
create_session) — open a session without running a task, then continue it later.Continue a session with context (
send_message) — follow-up instructions build on earlier exploration and edits.Inspect session state (
get_session) — stored session details plus live OpenCode status (idle/busy/retry).Review what changed (
get_diff) — OpenCode's session diff, or a git diff against the session-creation baseline.Stop runaway work (
abort_session) — cancel a long or unwanted delegation; safe when idle.Discover available agents (
list_agents) — built-ins plus project-local agents, with read-only/can-edit/can-run-bash flags.Constrain permissions —
allow_edits(schema-level) restricts edit tools per call, on top of the bridge's built-in protections for.env/credential files, git commit/push, external directories, and headless auto-reject of approval prompts.
Note: the schema exposes fewer per-call permission controls than the README describes — allow_bash is absent everywhere, and send_message/create_session accept no allow_edits, so permission grants there aren't callable as documented.
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., "@claude-opencode-mcpDelegate fixing the failing tests in src/ to the coder agent and show me the diff."
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.
claude-opencode-mcp
An MCP server that lets Claude Code delegate software-engineering tasks to OpenCode agents — DeepSeek by default — while keeping every agent inside the same workspace/worktree.
Claude Code (orchestrator)
│ MCP
▼
claude-opencode-mcp (this bridge)
│ workspace + task + agent
▼
OpenCode (agent runtime: tools, sessions, permissions)
│
▼
DeepSeek (or any provider configured in OpenCode)
│
▼
your repository — the same working tree Claude Code is usingClaude Code stays in charge: it decomposes the work, picks agents, reviews the results and integrates changes. OpenCode does the repository exploration, editing and test execution. The bridge is deliberately thin.
Features
Seven focused MCP tools —
delegate_task,create_session,send_message,get_session,get_diff,abort_session,list_agents.Same worktree — the delegated OpenCode server runs with your project as its working directory; the agent reads and edits the real files.
Persistent sessions — follow-up messages keep the agent's context across separate MCP calls.
Four agent profiles — researcher, reviewer, coder, tester, each with permissions enforced by OpenCode (not by prompt wording).
Workspace boundaries — canonical paths, allowed roots, path-traversal rejection, and a per-run probe that proves the server is serving the right directory.
Safety defaults —
.env/credential protection,git commit/git pushdenied, external directories denied, noaskrules that could hang a headless run.Structured results — every tool returns JSON with stable error codes, and
get_diffgives Claude Code the exact changes a coding session made.Reliability — timeouts, cancellation, health checks, crash detection, graceful shutdown, request IDs and a rotating log file.
Related MCP server: devin-mcp
Requirements
Component | Version |
Node.js | 20 or newer |
recent 2.x | |
1.18+ (tested against 1.18.32) | |
Model provider | DeepSeek by default; any provider OpenCode supports |
Install
npm install -g claude-opencode-mcpor run it on demand with npx -y claude-opencode-mcp (recommended for
.mcp.json).
The bridge can also use an OpenCode installation from PATH, from
node_modules/.bin, from ~/.opencode/bin, or from an explicit
OPENCODE_BIN.
From source
git clone https://github.com/putuandy/claude-opencode-mcp.git
cd claude-opencode-mcp
npm install
npm run build
npm install -g .Claude Code setup
Option A — project .mcp.json (recommended)
Create .mcp.json in your project root:
{
"mcpServers": {
"opencode": {
"command": "npx",
"args": ["-y", "claude-opencode-mcp"],
"type": "stdio",
"timeout": 600000
}
}
}timeout is milliseconds and is a per-tool-call wall-clock limit. Delegated
runs are long; without it Claude Code falls back to MCP_TOOL_TIMEOUT.
Claude Code also moves main-conversation tool calls to a background task after
two minutes, which is fine — the result arrives when the run finishes.
Option B — claude mcp add
claude mcp add opencode --scope project -- npx -y claude-opencode-mcpOr for one machine only:
claude mcp add opencode --scope user -- npx -y claude-opencode-mcpVerify:
claude mcp list # opencode ... ✔ ConnectedInside Claude Code, /mcp shows the server and its seven tools.
The bridge reads
CLAUDE_PROJECT_DIR, which Claude Code sets for stdio MCP servers, so delegation defaults to the project you launched Claude Code in.
OpenCode + DeepSeek setup
The bridge starts and stops its own headless OpenCode server, so you do not need
to run opencode serve yourself. You only need OpenCode installed and a
provider authenticated.
Install OpenCode
npm install -g opencode-ai # or: brew install sst/tap/opencode opencode --versionAuthenticate DeepSeek (once)
opencode auth login # choose DeepSeek, paste your API keyAlternatively export
DEEPSEEK_API_KEYbefore starting Claude Code; OpenCode reads it for thedeepseekprovider.Check the models
opencode models | grep deepseek # deepseek/deepseek-flash # deepseek/deepseek-v4-pro(Optional) validate the project
cd my-project claude-opencode initinitonly creates.claude-opencode/and validates the environment; it never modifies source code and is not required for delegation.
If you prefer to control OpenCode yourself, start opencode serve and point
the bridge at it with opencode.url; see
docs/configuration.md.
Quick start
Restart Claude Code, then ask:
Use the
opencodeMCP server to havedeepseek-researchermap this repository: entry points, main modules, and where authentication lives.
Then something that edits:
Have
deepseek-coderadd input validation tosrc/api/users.ts, run the tests, and report what changed. Then show me the diff withget_diff.
And a full workflow:
Ask DeepSeek to inspect the authentication system, identify potential issues, implement a fix, and review the changes.
Claude Code typically orchestrates: deepseek-researcher → deepseek-coder
→ deepseek-reviewer → deepseek-tester, calling get_diff between steps.
Tools
All tools return JSON in content[0].text (mirrored in structuredContent).
Errors return isError: true with { "error": { "code", "message", ... } }.
delegate_task
Run one task in a fresh session and wait for the agent's answer.
{
"task": "Review the authentication implementation for bugs and security issues.",
"agent": "deepseek-reviewer",
"cwd": "/Users/andy/projects/my-app",
"paths": ["src/auth", "src/middleware", "tests/auth"],
"model": "deepseek/deepseek-v4-pro",
"timeout": 600000,
"allow_edits": false
}Returns { status, session_id, agent, cwd, model, summary, findings, files_changed, duration_ms, truncated, error? }.
pathsare exploration hints, not a boundary — the agent may inspect the whole workspace.allow_edits/allow_bashgrant or revoke edits and shell commands for the run (safe permission profiles; sensitive files and git history stay protected).findingsare parsed from a## Findingssection:- [severity: high] Title (path/to/file:42) — detail.
create_session
{ "cwd": "/abs/path", "agent": "deepseek-researcher", "model": null, "title": "auth investigation", "allow_edits": true }Returns { session_id, cwd, agent, model, title, status, can_edit, can_run_bash, created_at }.
Permission overrides set here persist for the session.
send_message
Continue a session; the agent keeps its context and permission level.
{ "session_id": "ses_...", "message": "Now implement the fix.", "allow_edits": true }allow_edits / allow_bash may change the level from this message onward.
get_session
Returns the stored session state plus live OpenCode status
(opencode.status is idle, busy or retry when a server is running).
get_diff
Returns the changes associated with a session:
OpenCode's own session diff when the server reports one, otherwise
a git diff against a baseline captured when the session was created, so pre-existing uncommitted work is not attributed to the agent.
Returns { source, files, diff, truncated, note? }.
abort_session
Stops a running delegation. Safe to call when the session is idle.
list_agents
Lists the built-in agents plus project-local agents from
.claude-opencode/agents/, with read_only, can_edit, can_run_bash flags.
Agents
Agent | Purpose | Edit default | Shell default |
| architecture, exploration, dependency analysis, recommendations | deny | deny |
| code review, bugs, regressions, security, architecture | deny | deny |
| implementation, refactoring, running tests and fixing failures | allow | allow (no |
| run tests, inspect failures, root causes, suggested fixes | deny | allow (no |
The orchestrator is not limited to those defaults: every tool that starts or
continues a run accepts allow_edits and allow_bash (true grants, false
revokes, omitted keeps the default). Grants map to safe permission profiles, so
allow_edits: true still protects .env/credential files and allow_bash: true
still denies git history changes. A researcher with write access is one call:
{
"agent": "deepseek-researcher",
"task": "Investigate the caching layer, then implement and test the fix.",
"allow_edits": true,
"allow_bash": true
}Agent prompts live in agents/ and are loaded into the OpenCode
server configuration at startup. Project-local copies in
.claude-opencode/agents/*.md override the prompt, description, model and
temperature; permissions always come from the bridge policy (configurable
through security.* and the per-call overrides).
See docs/agent-configuration.md for frontmatter details and custom agents.
Workspace model
Resolution order for every call:
explicit
cwdargumentCLAUDE_PROJECT_DIR(set by Claude Code)the MCP server process working directory
workspace.defaultCwdfrom configuration
The first two are required: if they are present but invalid, the call fails instead of silently using a different directory.
Validation happens before any session is created:
the path must exist, be a directory, and be readable;
it is canonicalized with
realpath;when
workspace.allowedRootsis set, the canonical path must live inside one of those roots (traversal is rejected);the git root is detected for diff isolation.
During the first request for a workspace the bridge reads back directory from
the OpenCode server and compares it with the requested path, so a misrouted
request can never reach the wrong repository.
One OpenCode server is started per workspace directory and reused for all sessions in that workspace; the server process itself runs with the workspace as its working directory.
Security
Control | Default | Where |
Workspace must exist, be readable, be a directory | always | bridge |
| disabled (empty) | config |
Path hints cannot escape the workspace | always | bridge |
| on, even when edits are granted | OpenCode permissions |
| denied, even when shell is granted | OpenCode permissions |
Paths outside the workspace | denied | OpenCode |
Subagent spawning ( | denied | OpenCode permissions |
Interactive questions ( | denied (headless) | OpenCode permissions |
| never emitted by the bridge | OpenCode permissions |
The bridge also listens to OpenCode's event stream and auto-rejects any permission request that would otherwise wait for a human, so a delegated run can never hang on approval.
Caveats, stated plainly:
A shell-enabled agent (
coder,tester) can technically write files through shell commands. The bridge denies theedittools for the tester and forbids git history changes for both, but shell access is inherently powerful..envprotection applies to the file tools. A shell-enabled agent could stillcata file throughbash; the OpenCode project permission model has the same property.When connecting to an external OpenCode server (
opencode.url), the bridge cannot inject agent permissions. It verifies the agents exist and refuses to run otherwise.
Details and hardening options: docs/security.md.
Configuration
Global file: ~/.config/claude-opencode-mcp/config.json (honours
XDG_CONFIG_HOME).
Project file: <project>/.claude-opencode/config.json (overrides global).
Extra file: CLAUDE_OPENCODE_CONFIG=/path/to/config.json (highest precedence).
{
"opencode": {
"url": null,
"autoStart": true,
"hostname": "127.0.0.1",
"port": 0,
"startupTimeout": 30000,
"binary": null,
"username": null,
"password": null,
"maxServers": 4
},
"workspace": {
"allowedRoots": [],
"defaultCwd": null
},
"defaults": {
"agent": "deepseek-researcher",
"provider": "deepseek",
"model": null
},
"timeouts": {
"execution": 600000
},
"security": {
"protectEnvFiles": true,
"denyGitPush": true,
"denyGitCommit": true,
"externalDirectory": "deny",
"extraProtectedPatterns": []
},
"limits": {
"summaryChars": 6000,
"sessionChars": 20000,
"diffChars": 60000
},
"agents": {
"deepseek-researcher": { "model": "deepseek/deepseek-v4-pro" }
}
}defaults.modelacceptsprovider/modelor a bare model id (combined withdefaults.provider). Whennull, the provider's default model from OpenCode is used.Provider credentials stay in OpenCode (
opencode auth login) or environment variables; they are never duplicated in this config.For auto-started servers the bridge passes
OPENCODE_SERVER_USERNAME/OPENCODE_SERVER_PASSWORDthrough and authenticates its own requests. For external URLs it only uses credentials you configure.
Full reference: docs/configuration.md.
Sessions
Sessions are OpenCode sessions; the bridge keeps a small registry at
~/.local/state/claude-opencode-mcp/sessions.json(override withCLAUDE_OPENCODE_STATE_DIR) soget_session,get_diffandsend_messagesurvive a bridge restart.Records older than 14 days are pruned at startup.
If an OpenCode server restarts, persisted sessions are still addressable;
get_sessionreports live status when a server is running.Logs:
~/.local/state/claude-opencode-mcp/bridge.log(rotated at 5 MB). SetCLAUDE_OPENCODE_LOG=debug|info|warn|error|silent.
Troubleshooting
Symptom | Fix |
|
|
| run |
| authenticate a provider ( |
| DeepSeek credentials are missing/expired; re-run |
| add the four agents to that server's config or stop using |
| raise |
| add the project to |
Tool call seems to hang in Claude Code | Claude Code backgrounds long calls after 2 minutes; progress notifications are sent, and the bridge always resolves or aborts — check |
Claude Code kills the call at 60s | set |
More: docs/troubleshooting.md.
Development
npm install
npm run lint # Biome
npm run typecheck
npm test # unit + integration (no OpenCode needed)
npm run buildReal end-to-end tests need an OpenCode install with DeepSeek authenticated:
npm run test:e2e # checkpoints: workspace, agents, sessions, diff, abort, stdio
CLAUDE_OPENCODE_E2E_WORKFLOW=1 npm run test:e2e # full researcher → coder → reviewer → tester workflowLayout:
src/
index.ts CLI entry (MCP server + `init`)
cli/ `claude-opencode init`
config/ configuration loading and merging
workspace/ resolver, validator, task context
security/ path policy + OpenCode permission profiles
opencode/ binary resolution, manager, client, agents, sessions, runner
mcp/ MCP server and the seven tools
agents/ built-in agent prompts
tests/ unit, integration, e2e
docs/ documentationSee docs/development.md and docs/architecture.md.
Documentation
Contributing
Bug reports, feature requests, and pull requests are welcome. Start with CONTRIBUTING.md; for vulnerabilities use SECURITY.md instead of a public issue.
License
MIT — see LICENSE.
Available Tools
7 toolsabort_sessionAbort a running delegated sessionADestructive
Stop a long-running or unwanted delegated task. Safe to call when the session is already idle.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Session id returned by delegate_task/create_session. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, so the destructive nature is covered structurally. The description adds a useful nuance—that calling it on an idle session is safe—which goes beyond the annotation. However, it does not disclose whether aborting is irreversible, whether a running computation is killed, or what happens to partial results.
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?
Two short sentences, no filler, and the core action is stated first. The safety note is useful and earns 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 one-parameter destructive action with no output schema, the description is nearly complete: it states purpose and a safe-call condition. It could be slightly richer by explaining the post-abort state of the session, but an agent can invoke this tool correctly with what is provided.
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 parameter session_id is already fully documented as the session id returned by create_session. The tool description adds no further parameter guidance, so the baseline score of 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 ('Stop') with a clear resource ('a long-running or unwanted delegated task'), and the title names the action and object. It is immediately distinguishable from siblings like create_session and get_session.
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 clear signals about when to use it: for long-running or unwanted delegated tasks. It also provides a useful safety condition ('Safe to call when the session is already idle'). It does not explicitly name alternatives or describe when not to use it, but the context is sufficient for most selection decisions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_sessionCreate a persistent OpenCode agent sessionA
Create a persistent delegation session in a workspace without running a task yet. Follow up with send_message to keep the agent's context between calls.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | Yes | Workspace directory for the session. | |
| agent | No | Agent to use (default: deepseek-researcher). See list_agents. | |
| model | No | Override the model, e.g. "deepseek/deepseek-v4-pro". | |
| title | No | Human-readable session title. | |
| allow_bash | No | Grant (true) or revoke (false) shell commands for this session. | |
| allow_edits | No | Grant (true) or revoke (false) file edits for this session. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only carry openWorldHint=true, so the description must carry behavioral load. It does disclose the central trait — the session is persistent and preserves context across calls — which is genuinely useful. But it says nothing about what the create returns, whether sessions expire, or the effect of the allow_bash/allow_edits permission grants beyond the schema's own wording.
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?
Two sentences, zero filler, with the core purpose and the deferred-execution caveat front-loaded. Nothing could be cut without losing meaning.
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 create-only tool with no output schema and rich 100%-covered params, the description plus schema give an agent enough to invoke it correctly, including the follow-up pattern with send_message. It could be more complete by noting what happens to the session on subsequent calls or how sessions are terminated (abort_session), but nothing critical is missing.
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 every parameter (cwd, agent, model, title, allow_bash, allow_edits) is already documented in the schema. The description adds no syntax, format, or default information beyond that, 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?
States a specific verb and resource (create a persistent delegation session) and immediately scopes it with 'without running a task yet', which is the key distinction from the delegate_task sibling. An agent can tell from the description alone what this tool does and does not do.
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?
Explicitly prescribes the follow-up workflow: 'Follow up with send_message to keep the agent's context between calls.' This routes the agent to the right sibling and explains the reason (context retention). It does not state the inverse case (use delegate_task when you want to run a task immediately), so it stops short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delegate_taskDelegate task to OpenCode agentA
Delegate a software-engineering task to an OpenCode agent (DeepSeek by default) that runs in the same workspace. The agent explores the repository itself and returns a concise summary plus structured findings. Every agent can be granted or denied edits and shell access per call with allow_edits / allow_bash; grants still enforce the bridge security policy (sensitive-file protection for edits, no git history changes for shell). Returns { status, session_id, summary, findings, files_changed }.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | No | Workspace directory. Defaults to CLAUDE_PROJECT_DIR / the server working directory. | |
| task | Yes | The task to delegate, written as a clear instruction. | |
| agent | No | Agent to use (default: deepseek-researcher). See list_agents. | |
| model | No | Override the model, e.g. "deepseek/deepseek-v4-pro". | |
| paths | No | Starting path hints relative to the workspace. Hints only, not a restriction. | |
| timeout | No | Execution timeout in milliseconds (default from bridge config). | |
| allow_bash | No | Grant (true) or revoke (false) shell commands for this call. Omit to use the agent's default. | |
| allow_edits | No | Grant (true) or revoke (false) file edits for this call. Omit to use the agent's default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only openWorldHint in annotations, the description carries the burden well: it discloses that the agent explores the repo itself, that grants are per-call, that the bridge security policy still applies (sensitive-file protection for edits, no git history changes for shell), and it names the exact return shape. This is rich behavioral context beyond the structured fields.
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?
Three dense sentences, front-loaded with the core purpose before permissions and return shape. Efficient, though the return-shape enumeration at the end adds a little bulk that an output schema would otherwise carry.
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 tool with 8 parameters, no output schema, and only an openWorldHint annotation, the description covers purpose, permission model, and return fields adequately. Minor gaps remain around timeout behavior and how findings are scoped, but nothing critical for correct invocation is missing.
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 the schema already documents all 8 parameters, setting a baseline of 3. The description adds real value beyond it by explaining the security semantics of allow_edits/allow_bash (grants are constrained, omission falls back to agent defaults), which the schema alone does not convey.
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 (delegate) and resource (a software-engineering task to an OpenCode agent), plus the runtime model and workspace scope. It is clearly distinguishable from session-oriented siblings like create_session/send_message, which manage a conversation rather than running a full delegated task.
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 implies usage by naming the task type (software-engineering) and pointing to list_agents for agent selection, and explains allow_edits/allow_bash per-call granting. However, it never says when to prefer this over send_message/create_session, or what conditions make this the wrong choice, leaving alternative routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_diffInspect changes made in a sessionARead-only
Return the file changes associated with a delegated session: OpenCode's own session diff when available, otherwise a git diff against the baseline captured when the session was created.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Session id returned by delegate_task/create_session. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, and the description adds meaningful behavioral context by explaining the fallback from OpenCode's session diff to a git diff against the baseline. This goes beyond the annotation's safety signal, though it doesn't mention what happens when no diff exists.
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?
A single, front-loaded sentence that states the primary action first and then details the fallback. No filler or redundant information.
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 one-parameter, read-only tool with no output schema, the description adequately explains what is returned and how the diff is sourced. Minor omissions, such as behavior when no diff is available, are acceptable given the tool's simplicity.
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 explains session_id as 'Session id returned by delegate_task/create_session.' The description does not add any further parameter semantics, so the baseline score of 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 ('Return'), names the resource ('file changes associated with a delegated session'), and specifies the diff-source fallback logic. This clearly distinguishes it from siblings like get_session, which deals with session metadata rather than file changes.
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 implies when to use the tool: to inspect file changes for a delegated session. The sibling list makes alternative purposes evident, but the description does not explicitly state exclusions or alternative tool names, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sessionGet delegated session stateARead-only
Return the stored state of a delegated session plus its live OpenCode status when a server is running. Use get_diff to inspect file changes.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Session id returned by delegate_task/create_session. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already covers the safety profile, and the description adds useful behavioral nuance: the stored session state is always returned, while live OpenCode status is only included when a server is running. This conditional behavior is valuable context beyond the annotation.
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?
Two short sentences with no filler. The main purpose is front-loaded, and the sibling reference to get_diff earns its place by clarifying tool boundaries.
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 read-only tool with one well-documented parameter, the description provides sufficient invocation context. It could name the fields contained in 'stored state' or describe the no-server behavior more explicitly, but those are minor gaps given the schema and readOnlyHint.
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 the session_id parameter is already well-described as the ID returned by delegate_task/create_session. The description itself adds no further parameter meaning, 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 uses a specific verb ('Return') and names the exact resource: the stored state of a delegated session plus live OpenCode status. It also distinguishes itself from get_diff by telling the agent to use get_diff for file changes, which prevents confusion among siblings.
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 clear context for what get_session returns and points to get_diff as the alternative when inspecting file changes. It does not explicitly enumerate when not to use get_session, but the comparison to get_diff provides enough routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_agentsList available delegated agentsARead-only
List the agents that delegate_task and create_session can use, including project-local agents from .claude-opencode/agents.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | No | Workspace used to discover project-local agents (optional). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already covers the key safety behavior Photon, so the description does not need to restate that. It adds useful context by mentioning project-local agent discovery from .claude-opencode/agents and the role of cwd. It does not describe output format or failure behavior, but no contradiction exists and the annotation lowers the 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 a single sentence that leads with the core action and resource, then adds the most important scoping detail about project-local agents. Every part earns its place; there is no filler or 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?
This is a simple, read-only listing tool with no required parameters and no complex schema. The description plus the cwd parameter documentation is sufficient for an agent to know what the tool does and when to call it. The absence of an output schema is acceptable given the straightforward 'list' semantics.
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 only parameter, cwd, is already fully described in the schema with 'Workspace used to discover project-local agents (optional).' The description adds a small amount of context by linking cwd to the .claude-opencode/agents discovery mechanism, but schema coverage is 100%, so the baseline 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 names a specific verb ('List') and resource ('agents that delegate_task and create_session can use'), making the tool's purpose immediately clear. It also distinguishes this listing tool from the action-oriented siblings like delegate_task and create_session. The inclusion of project-local agents adds useful scope.
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 when this tool is useful: before delegating or creating a session, to discover available agent names. It names the consumer tools explicitly and clarifies the optional cwd behavior for project-local discovery, but it does not state formal exclusions or contrast directly with sibling listing tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_messageSend a follow-up message to a sessionA
Continue an existing delegated session with another message. The agent keeps its previous context and its permission level; allow_edits / allow_bash can change that level for this and later messages.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | Follow-up instruction or question. | |
| allow_bash | No | Grant (true) or revoke (false) shell commands from this message onward. Omit to keep the session's current level. | |
| session_id | Yes | Session id returned by delegate_task/create_session. | |
| allow_edits | No | Grant (true) or revoke (false) file edits from this message onward. Omit to keep the session's current level. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only openWorldHint in annotations, the description carries the behavioral burden and does add real value: it discloses that the agent retains prior context and permission level, and that allow_edits/allow_bash mutate that level persisting into later messages. It does not describe errors on invalid/expired sessions or what the call returns.
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?
Two tight sentences, zero waste, and the core action (continue an existing session) is front-loaded before the permission-state detail.
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 4-param stateful tool with no output schema and only an openWorldHint annotation, the description covers continuation semantics, context retention, and permission persistence adequately. Minor gaps remain around failure modes and return value, but nothing essential for correct invocation is missing.
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 documents all four parameters, including the 'from this message onward' semantics of the allow_* flags. The description largely restates that, adding only the framing that the level change persists across messages – the baseline 3 for fully covered 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 (continue/send) and resource (existing delegated session), and the phrasing 'Continue an existing delegated session' contrasts cleanly with the sibling delegate_task, which starts a new one. An agent can distinguish it from create_session and delegate_task without reading schemas.
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?
'Continue an existing delegated session with another message' establishes the context of use, and the session_id schema note ties it to delegate_task/create_session. It never explicitly says when NOT to use it (e.g. for a new task use delegate_task), so it falls short of full routing guidance.
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.
3 tool updates
v1.1.0- Changed
create_session2 fields changed- added
Input schema / properties / allow_bashAdded value: +{ + "description": "Grant (true) or revoke (false) shell commands for this session.", + "type": "boolean" +} - added
Input schema / properties / allow_editsAdded value: +{ + "description": "Grant (true) or revoke (false) file edits for this session.", + "type": "boolean" +}
- Changed
delegate_task2 fields changed- added
Input schema / properties / allow_bashAdded value: +{ + "description": "Grant (true) or revoke (false) shell commands for this call. Omit to use the agent's default.", + "type": "boolean" +} - changed
Input schema / properties / allow_edits / descriptionPrevious value: -"When false, edit/write tools are disabled for this call."New value: +"Grant (true) or revoke (false) file edits for this call. Omit to use the agent's default."
- Changed
send_message2 fields changed- added
Input schema / properties / allow_bashAdded value: +{ + "description": "Grant (true) or revoke (false) shell commands from this message onward. Omit to keep the session's current level.", + "type": "boolean" +} - added
Input schema / properties / allow_editsAdded value: +{ + "description": "Grant (true) or revoke (false) file edits from this message onward. Omit to keep the session's current level.", + "type": "boolean" +}
7 tool updates
v1.0.0- First observed
abort_session - First observed
create_session - First observed
delegate_task - First observed
get_diff - First observed
get_session - First observed
list_agents - First observed
send_message
TDQS
Scored across 7 tools
Most tools are clearly distinct: abort_session, get_diff, get_session, and list_agents target unique actions. However, delegate_task overlaps somewhat with create_session + send_message since delegate_task essentially creates a session and runs a task in one call, so an agent could wonder which entry point to use.
Every tool follows a strict snake_case verb_noun pattern: abort_session, delegate_task, create_session, send_message, get_diff, get_session, list_agents. No deviations or mixed conventions.
Seven tools is well-scoped for a delegation bridge: session lifecycle (create/send/abort), task execution, inspection (get_session/get_diff), and discovery (list_agents). Each tool earns its place without bloat.
The lifecycle is largely covered: create, delegate, continue, abort, and inspect sessions and diffs. A minor gap is the lack of a list_sessions operation, meaning an agent must track session IDs itself rather than rediscovering existing sessions.
Maintenance
Related MCP Connectors
- AxisOAuthdev.useaxis
Coding agents from Claude Code, Cursor and Codex claim jobs and lock files on one shared board.
Cross-agent artifact workspace with provenance across Claude Code, Codex, Cursor, LangGraph.
- ParleyOAuthdev.weldra
Coordination hub for AI coding agents: message teammates, ask humans, audit every event.
One shared project for a team's coding agents: decisions, a task board and handoffs.
Related MCP Servers
- AlicenseAqualityBmaintenanceEnables Claude Code to delegate tasks to OpenCode subagents asynchronously, with tools for starting tasks, polling status, and fetching results.775 npm3MIT
- AlicenseAqualityDmaintenanceEnables Claude Code to delegate implementation tasks to Devin.4MIT
- AlicenseNot gradedqualityBmaintenanceEnables Claude Code to delegate prompts to an OpenCode agent session for cheaper executor-role work, supporting different providers and session persistence.21,417 npmMIT
- FlicenseCqualityCmaintenanceEnables Claude Desktop to act as a planning agent while delegating coding tasks to OpenCode CLI, returning execution status, file diffs, and output, with support for continuing sessions and opening workspaces in IDEs.151-