Skip to main content
Glama

claude-opencode-mcp

CI License: MIT Node

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 using

Claude 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 toolsdelegate_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 push denied, external directories denied, no ask rules that could hang a headless run.

  • Structured results — every tool returns JSON with stable error codes, and get_diff gives 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

Claude Code

recent 2.x

OpenCode

1.18+ (tested against 1.18.32)

Model provider

DeepSeek by default; any provider OpenCode supports

Install

npm install -g claude-opencode-mcp

or 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-mcp

Or for one machine only:

claude mcp add opencode --scope user -- npx -y claude-opencode-mcp

Verify:

claude mcp list        # opencode ... ✔ Connected

Inside 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.

  1. Install OpenCode

    npm install -g opencode-ai
    # or: brew install sst/tap/opencode
    opencode --version
  2. Authenticate DeepSeek (once)

    opencode auth login      # choose DeepSeek, paste your API key

    Alternatively export DEEPSEEK_API_KEY before starting Claude Code; OpenCode reads it for the deepseek provider.

  3. Check the models

    opencode models | grep deepseek
    # deepseek/deepseek-flash
    # deepseek/deepseek-v4-pro
  4. (Optional) validate the project

    cd my-project
    claude-opencode init

    init only 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 opencode MCP server to have deepseek-researcher map this repository: entry points, main modules, and where authentication lives.

Then something that edits:

Have deepseek-coder add input validation to src/api/users.ts, run the tests, and report what changed. Then show me the diff with get_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-researcherdeepseek-coderdeepseek-reviewerdeepseek-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? }.

  • paths are exploration hints, not a boundary — the agent may inspect the whole workspace.

  • allow_edits: false disables the edit/write/apply_patch tools for that call (the agent's own profile still applies; see Security).

  • findings are parsed from a ## Findings section: - [severity: high] Title (path/to/file:42) — detail.

create_session

{ "cwd": "/abs/path", "agent": "deepseek-researcher", "model": null, "title": "auth investigation" }

Returns { session_id, cwd, agent, model, title, status, created_at }.

send_message

Continue a session; the agent keeps its context.

{ "session_id": "ses_...", "message": "Now inspect the database layer for the same issue." }

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

Shell

deepseek-researcher

architecture, exploration, dependency analysis, recommendations

deny

deny

deepseek-reviewer

code review, bugs, regressions, security, architecture

deny

deny

deepseek-coder

implementation, refactoring, running tests and fixing failures

allow

allow (no git commit/git push)

deepseek-tester

run tests, inspect failures, root causes, suggested fixes

deny

allow (no git commit/git push)

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.*).

See docs/agent-configuration.md for frontmatter details and custom agents.

Workspace model

Resolution order for every call:

  1. explicit cwd argument

  2. CLAUDE_PROJECT_DIR (set by Claude Code)

  3. the MCP server process working directory

  4. workspace.defaultCwd from 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.allowedRoots is 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

workspace.allowedRoots containment

disabled (empty)

config

Path hints cannot escape the workspace

always

bridge

.env/.env.*, keys, credentials, .ssh/* protection

on

OpenCode permissions

git commit / git push for shell-enabled agents

denied

OpenCode permissions

Paths outside the workspace

denied

OpenCode external_directory

Subagent spawning (task)

denied

OpenCode permissions

Interactive questions (question)

denied (headless)

OpenCode permissions

ask permission rules

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 the edit tools for the tester and forbids git history changes for both, but shell access is inherently powerful.

  • .env protection applies to the file tools. A shell-enabled agent could still cat a file through bash; 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.model accepts provider/model or a bare model id (combined with defaults.provider). When null, 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_PASSWORD through 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 with CLAUDE_OPENCODE_STATE_DIR) so get_session, get_diff and send_message survive a bridge restart.

  • Records older than 14 days are pruned at startup.

  • If an OpenCode server restarts, persisted sessions are still addressable; get_session reports live status when a server is running.

  • Logs: ~/.local/state/claude-opencode-mcp/bridge.log (rotated at 5 MB). Set CLAUDE_OPENCODE_LOG=debug|info|warn|error|silent.

Troubleshooting

Symptom

Fix

OPENCODE_NOT_AVAILABLE

npm install -g opencode-ai or set OPENCODE_BIN / opencode.binary.

OPENCODE_START_TIMEOUT

run opencode serve manually to see the error; raise opencode.startupTimeout; check OPENCODE_SERVER_PASSWORD handling.

MODEL_NOT_AVAILABLE

authenticate a provider (opencode auth login) or set defaults.model, e.g. "deepseek/deepseek-v4-pro".

ProviderAuthError in a result

DeepSeek credentials are missing/expired; re-run opencode auth login.

AGENT_NOT_FOUND with an external server

add the four agents to that server's config or stop using opencode.url.

AGENT_TIMEOUT

raise timeouts.execution or the timeout argument; consider a narrower task.

WORKSPACE_NOT_ALLOWED

add the project to workspace.allowedRoots or clear the list.

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 bridge.log.

Claude Code kills the call at 60s

set "timeout": 600000 in the .mcp.json entry (or MCP_TOOL_TIMEOUT).

More: docs/troubleshooting.md.

Development

npm install
npm run lint        # Biome
npm run typecheck
npm test            # unit + integration (no OpenCode needed)
npm run build

Real 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 workflow

Layout:

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

See 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 tools
abort_sessionAbort a running delegated sessionA
Destructive

Stop a long-running or unwanted delegated task. Safe to call when the session is already idle.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYesSession id returned by delegate_task/create_session.

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cwdYesWorkspace directory for the session.
agentNoAgent to use (default: deepseek-researcher). See list_agents.
modelNoOverride the model, e.g. "deepseek/deepseek-v4-pro".
titleNoHuman-readable session title.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the minimal openWorldHint annotation, the description discloses meaningful behavior: the session is persistent, no task runs on creation, and the agent's context is retained between calls when used with send_message. This adds real behavioral context beyond what the structured annotation provides.

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?

Two sentences with zero filler. The core purpose and scope are front-loaded in the first sentence, and the second sentence earns its place by explaining the interaction protocol with send_message.

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 create operation with a fully documented schema, the description is mostly sufficient. However, with no output schema and an openWorldHint, it would help to state what the call returns (e.g., a session identifier to use with send_message) and any workspace requirements, so an agent is left with a small gap about the response.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the input schema already documents all four parameters. The description adds no parameter-level meaning, so the baseline of 3 applies; nothing is missing, but nothing extra is contributed either.

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 a specific action (create), a specific resource (persistent delegation session in a workspace), and a critical constraint ('without running a task yet'). This last phrase directly distinguishes it from the sibling delegate_task, so an agent can tell the tools apart without opening schemas.

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 gives a clear workflow context: create the session first, then follow up with send_message to keep the agent's context across calls. It does not explicitly name delegate_task as the alternative for one-shot task execution or state when not to use this tool, so it stops short of full when/when-not guidance.

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. Read-only agents (deepseek-researcher, deepseek-reviewer) cannot modify files; deepseek-coder can edit and run tests. Set allow_edits=false to force edit tools off for this call. Returns { status, session_id, summary, findings, files_changed }.

ParametersJSON Schema
NameRequiredDescriptionDefault
cwdNoWorkspace directory. Defaults to CLAUDE_PROJECT_DIR / the server working directory.
taskYesThe task to delegate, written as a clear instruction.
agentNoAgent to use (default: deepseek-researcher). See list_agents.
modelNoOverride the model, e.g. "deepseek/deepseek-v4-pro".
pathsNoStarting path hints relative to the workspace. Hints only, not a restriction.
timeoutNoExecution timeout in milliseconds (default from bridge config).
allow_editsNoWhen false, edit/write tools are disabled for this call.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only include openWorldHint, so the description carries the burden. It discloses that read-only agents cannot modify files, coder agents can edit and run tests, and that allow_edits=false disables edit tools. It also states the return object shape. This adds meaningful behavioral context beyond the minimal annotation, though it doesn't mention potential side effects like long execution times or concurrency limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a few dense sentences, front-loaded with the core purpose, then agent capabilities, then return format. There is no fluff; each sentence adds useful information. It could be slightly more structured with separators, but it is concise and effective.

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?

With 7 parameters and no output schema, the description compensates well by listing the return fields (status, session_id, summary, findings, files_changed) and explaining agent behavior. It does not cover error handling or timeout specifics, but the essential information for calling the tool correctly is present. Minor gaps remain but are not critical.

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?

Schema coverage is 100%, so the baseline is 3. The description adds value by clarifying agent capabilities (deepseek-researcher/reviewer vs coder) and the effect of allow_edits, which goes beyond the schema's generic descriptions. It also reiterates the 'hints only' nature of paths, reinforcing schema content. This exceeds the baseline.

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 a specific verb ('Delegate'), a specific resource (OpenCode agent in the same workspace), and the outcome (returns a summary plus structured findings). It clearly distinguishes this from the sibling session-management tools like create_session or send_message by framing it as a task delegation that includes agent exploration and structured findings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use different agents (read-only vs coder) and how to force edit tools off via allow_edits=false, which is useful. However, it does not explicitly contrast this tool with siblings such as create_session or send_message, so an agent might not know when to choose delegation over direct session operations. Usage context is implied but not fully explicit.

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 sessionA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYesSession id returned by delegate_task/create_session.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 stateA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYesSession id returned by delegate_task/create_session.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 agentsA
Read-only

List the agents that delegate_task and create_session can use, including project-local agents from .claude-opencode/agents.

ParametersJSON Schema
NameRequiredDescriptionDefault
cwdNoWorkspace used to discover project-local agents (optional).

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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, so follow-ups can build on earlier exploration and edits.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageYesFollow-up instruction or question.
session_idYesSession id returned by delegate_task/create_session.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The openWorldHint annotation already signals that the tool may interact with external systems. The description adds useful context by stating that the agent retains previous context and can build on earlier exploration and edits, but it does not describe side effects on the session, response format, or failure behavior. This is adequate but not richly transparent.

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 two sentences with no filler. The first sentence states the core purpose, and the second sentence adds valuable context about state retention. Every word contributes to an agent's ability to decide whether and how to use the tool.

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 simple two-parameter tool with openWorldHint and no output schema, the description provides sufficient context: it explains the stateful nature, when to use it, and what the message is for. It does not explain return values or error handling, but these are less critical given the tool's simplicity and the explicit session_id and message schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both session_id and message are already documented. The description's mention of 'follow-up' reinforces that message is an instruction building on prior context, but it adds no new meaning beyond the schema. Baseline 3 is appropriate because the schema carries the parameter documentation burden.

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 a specific action ('Continue an existing delegated session with another message') that clearly distinguishes it from sibling tools like create_session, delegate_task, get_session, and abort_session. The emphasis on 'existing' and 'follow-up' makes it unambiguous that this is not for initiating or inspecting sessions.

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 clearly indicates when to use this tool: when a delegated session already exists and the agent wants to continue it. It does not explicitly name alternatives or state when not to use it, but the context provided (existing session, previous context) is enough to infer that this is the follow-up tool rather than a session creation or retrieval tool.

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. 7 tool updatesv1.0.0
    • First observedabort_session
    • First observedcreate_session
    • First observeddelegate_task
    • First observedget_diff
    • First observedget_session
    • First observedlist_agents
    • First observedsend_message

TDQS

A4.3/5.0

Scored across 7 tools

Disambiguation5/5

Each tool targets a distinct stage in a delegation session lifecycle: creating/delegating, sending follow-ups, inspecting state/diff, aborting, and listing available agents. create_session and delegate_task could be confused since both initiate sessions, but their descriptions clearly separate 'no task yet' from 'run a task'.

Naming Consistency5/5

All tools follow a consistent verb_noun snake_case pattern: create_session, delegate_task, send_message, get_session, get_diff, abort_session, list_agents. The verbs are predictable and directly match the action performed.

Tool Count5/5

Seven tools is well-scoped for a delegation/session management server; each tool represents a meaningful lifecycle operation without overlap and none feel redundant.

Completeness4/5

The surface covers the core lifecycle: create/delegate, continue, inspect, diff, abort, and enumerate agents. Obvious minor gaps are session enumeration/list_sessions and explicit session deletion/cleanup, but an agent can operate from returned session IDs.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers