mcp-server-opencode 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +103 -34
- package/build/src/modules/prompts/delegate_task.d.ts.map +1 -1
- package/build/src/modules/prompts/delegate_task.js +22 -1
- package/build/src/modules/prompts/delegate_task.js.map +1 -1
- package/build/src/modules/shared/opencode-client.d.ts +17 -1
- package/build/src/modules/shared/opencode-client.d.ts.map +1 -1
- package/build/src/modules/shared/opencode-client.js +44 -2
- package/build/src/modules/shared/opencode-client.js.map +1 -1
- package/build/src/modules/tools/cancel_task.d.ts +3 -0
- package/build/src/modules/tools/cancel_task.d.ts.map +1 -0
- package/build/src/modules/tools/cancel_task.js +33 -0
- package/build/src/modules/tools/cancel_task.js.map +1 -0
- package/build/src/modules/tools/continue_task.d.ts +3 -0
- package/build/src/modules/tools/continue_task.d.ts.map +1 -0
- package/build/src/modules/tools/continue_task.js +71 -0
- package/build/src/modules/tools/continue_task.js.map +1 -0
- package/build/src/modules/tools/get_task_status.d.ts.map +1 -1
- package/build/src/modules/tools/get_task_status.js +8 -2
- package/build/src/modules/tools/get_task_status.js.map +1 -1
- package/build/src/modules/tools/index.d.ts.map +1 -1
- package/build/src/modules/tools/index.js +4 -0
- package/build/src/modules/tools/index.js.map +1 -1
- package/build/src/modules/tools/start_task.d.ts.map +1 -1
- package/build/src/modules/tools/start_task.js +5 -2
- package/build/src/modules/tools/start_task.js.map +1 -1
- package/build/src/modules/tools/wait_for_task.d.ts.map +1 -1
- package/build/src/modules/tools/wait_for_task.js +38 -4
- package/build/src/modules/tools/wait_for_task.js.map +1 -1
- package/package.json +16 -3
package/README.md
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
# opencode-mcp
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://github.com/alejandro-technology/opencode-mcp/actions/workflows/ci.yml)
|
|
4
|
+
[](https://github.com/alejandro-technology/opencode-mcp/blob/main/vitest.config.ts)
|
|
5
|
+
[](https://www.npmjs.com/package/mcp-server-opencode)
|
|
6
|
+
|
|
7
|
+
An MCP (Model Context Protocol) server that lets any MCP host — Claude Code, Codex CLI, Cursor, etc. — drive an [OpenCode](https://opencode.ai) instance and delegate work to its subagents — so orchestrator models like Opus or Fable can hand off tasks to the other models OpenCode exposes.
|
|
4
8
|
|
|
5
9
|
```
|
|
6
10
|
Claude Code
|
|
@@ -15,31 +19,106 @@ OpenCode SDK / CLI
|
|
|
15
19
|
Subagents
|
|
16
20
|
```
|
|
17
21
|
|
|
18
|
-
## Status
|
|
19
|
-
|
|
20
|
-
Functional. All tools are wired to real OpenCode instances via `@opencode-ai/sdk` (`createOpencodeServer` / `createOpencodeClient`), covered by a Vitest suite. The server also installs `SIGHUP`/`SIGINT`/`SIGTERM`/`exit` handlers so no `opencode serve` child process outlives the MCP process.
|
|
21
|
-
|
|
22
22
|
## Design
|
|
23
23
|
|
|
24
24
|
Task delegation is **asynchronous**: starting a task returns immediately with a `task_id` instead of blocking until the subagent finishes. This lets Claude Code fire multiple `opencode_start_task` calls in parallel — each one opens an isolated OpenCode `Session` — without hitting MCP client timeouts on long-running work. Status and results are fetched separately via polling.
|
|
25
25
|
|
|
26
26
|
## Tools
|
|
27
27
|
|
|
28
|
-
| Tool
|
|
29
|
-
|
|
|
30
|
-
| `opencode_start_server`
|
|
31
|
-
| `opencode_stop_server`
|
|
32
|
-
| `opencode_list_agents`
|
|
33
|
-
| `opencode_start_task`
|
|
34
|
-
| `
|
|
35
|
-
| `
|
|
36
|
-
| `
|
|
28
|
+
| Tool | Description |
|
|
29
|
+
| -------------------------- | --------------------------------------------------------------------------------------------------------- |
|
|
30
|
+
| `opencode_start_server` | Start (or attach to) an OpenCode server instance |
|
|
31
|
+
| `opencode_stop_server` | Stop a running OpenCode server instance |
|
|
32
|
+
| `opencode_list_agents` | List agents/models available on a server instance |
|
|
33
|
+
| `opencode_start_task` | Delegate a task to an agent by starting a new session and prompt (optional `agent` / `model` override) |
|
|
34
|
+
| `opencode_continue_task` | Send a follow-up prompt to an existing task's session for iterative back-and-forth with the subagent |
|
|
35
|
+
| `opencode_cancel_task` | Abort a running delegated task by cancelling its session |
|
|
36
|
+
| `opencode_get_task_status` | Poll the status of a delegated task (`pending` / `running` / `completed` / `failed`); optional `include_progress` adds a partial output snippet and the currently running tool while it's still running |
|
|
37
|
+
| `opencode_get_task_result` | Fetch the final result of a completed task |
|
|
38
|
+
| `opencode_wait_for_task` | Long-poll one or more delegated tasks until they finish (`mode: "all"` or `"any"`) or the timeout elapses; optional `include_progress` enriches any still-unfinished tasks in the final result with a partial output snippet and the currently running tool |
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
| Prompt | Description |
|
|
42
|
+
| --------------- | ---------------------------------------------------------------------------------------------------- |
|
|
43
|
+
| `delegate_task` | Guides the host through delegating one or more tasks to OpenCode agents (start/wait/result workflow), including a model selection guide that maps each OpenCode model tier to the task difficulty it should handle |
|
|
44
|
+
|
|
45
|
+
## Installation
|
|
46
|
+
|
|
47
|
+
### Prerequisites
|
|
48
|
+
|
|
49
|
+
- **Node.js 18+**
|
|
50
|
+
- **[OpenCode](https://opencode.ai)** installed and configured (`opencode` must be on your `PATH`, with at least one provider/model set up) — this server spawns and drives OpenCode instances.
|
|
51
|
+
|
|
52
|
+
### Option 1 — npm (recommended)
|
|
53
|
+
|
|
54
|
+
The package is published as [`mcp-server-opencode`](https://www.npmjs.com/package/mcp-server-opencode). No cloning or building needed — point your MCP host at `npx`:
|
|
55
|
+
|
|
56
|
+
For **Claude Code**, one command does it:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
claude mcp add opencode -- npx -y mcp-server-opencode
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Or manually
|
|
63
|
+
|
|
64
|
+
```json
|
|
65
|
+
{
|
|
66
|
+
"mcpServers": {
|
|
67
|
+
"opencode": {
|
|
68
|
+
"command": "npx",
|
|
69
|
+
"args": ["-y", "mcp-server-opencode"]
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
For **Codex CLI**, add the server to `~/.codex/config.toml`:
|
|
76
|
+
|
|
77
|
+
```toml
|
|
78
|
+
[mcp_servers.opencode]
|
|
79
|
+
command = "npx"
|
|
80
|
+
args = ["-y", "mcp-server-opencode"]
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Or install it globally and use the binary directly:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
npm install -g mcp-server-opencode
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
```json
|
|
90
|
+
{
|
|
91
|
+
"mcpServers": {
|
|
92
|
+
"opencode": {
|
|
93
|
+
"command": "opencode-mcp"
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Option 2 — from source
|
|
37
100
|
|
|
38
|
-
|
|
101
|
+
```bash
|
|
102
|
+
git clone https://github.com/alejandro-technology/opencode-mcp.git
|
|
103
|
+
cd opencode-mcp
|
|
104
|
+
pnpm install
|
|
105
|
+
pnpm build
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Then point your MCP host at the built entrypoint:
|
|
109
|
+
|
|
110
|
+
```json
|
|
111
|
+
{
|
|
112
|
+
"mcpServers": {
|
|
113
|
+
"opencode": {
|
|
114
|
+
"command": "node",
|
|
115
|
+
"args": ["/path/to/opencode-mcp/build/src/index.js"]
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
```
|
|
39
120
|
|
|
40
|
-
|
|
41
|
-
| --- | --- |
|
|
42
|
-
| `delegate_task` | Guides the host through delegating one or more tasks to OpenCode agents (start/wait/result workflow) |
|
|
121
|
+
Restart your MCP host after editing the config; the `opencode_*` tools should appear in its tool list.
|
|
43
122
|
|
|
44
123
|
## Configuration
|
|
45
124
|
|
|
@@ -70,7 +149,10 @@ Task delegation is **asynchronous**: starting a task returns immediately with a
|
|
|
70
149
|
"mcpServers": {
|
|
71
150
|
"opencode": {
|
|
72
151
|
"command": "node",
|
|
73
|
-
"args": [
|
|
152
|
+
"args": [
|
|
153
|
+
"/path/to/opencode-mcp/build/src/index.js",
|
|
154
|
+
"MCP_TOOL_TIMEOUT=1200000"
|
|
155
|
+
]
|
|
74
156
|
}
|
|
75
157
|
}
|
|
76
158
|
}
|
|
@@ -78,7 +160,7 @@ Task delegation is **asynchronous**: starting a task returns immediately with a
|
|
|
78
160
|
|
|
79
161
|
If both are present, the **environment variable takes precedence** over the CLI argument. Invalid or non-numeric values fall back to the 300000 ms default.
|
|
80
162
|
|
|
81
|
-
Note that raising this value only raises the server-side clamp — the MCP
|
|
163
|
+
Note that raising this value only raises the server-side clamp — the MCP _client's_ own tool-call timeout (e.g. Claude Code's) must also be set to a value **greater than or equal to** this max, or the client will abort the call before `opencode_wait_for_task` has a chance to return.
|
|
82
164
|
|
|
83
165
|
## Project structure
|
|
84
166
|
|
|
@@ -96,7 +178,7 @@ src/
|
|
|
96
178
|
└── mcp-result.ts # jsonResult / jsonError MCP output helpers
|
|
97
179
|
```
|
|
98
180
|
|
|
99
|
-
Each module ships with a
|
|
181
|
+
Each module ships with a `*.test.ts` Vitest suite under the parallel `tests/` tree mirroring `src/`.
|
|
100
182
|
|
|
101
183
|
## Getting started
|
|
102
184
|
|
|
@@ -114,16 +196,3 @@ pnpm lint # biome check
|
|
|
114
196
|
pnpm lint:write # biome check --write
|
|
115
197
|
pnpm build # clean tsc build to ./build (also the typecheck)
|
|
116
198
|
```
|
|
117
|
-
|
|
118
|
-
To use it from an MCP host, build and point the host at the executable entrypoint:
|
|
119
|
-
|
|
120
|
-
```json
|
|
121
|
-
{
|
|
122
|
-
"mcpServers": {
|
|
123
|
-
"opencode": {
|
|
124
|
-
"command": "node",
|
|
125
|
-
"args": ["/path/to/opencode-mcp/build/src/index.js"]
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
```
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delegate_task.d.ts","sourceRoot":"","sources":["../../../../src/modules/prompts/delegate_task.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"delegate_task.d.ts","sourceRoot":"","sources":["../../../../src/modules/prompts/delegate_task.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAwCzE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,QAoB3D"}
|
|
@@ -1,6 +1,27 @@
|
|
|
1
1
|
const DELEGATE_TASK_INSTRUCTIONS = `You have access to the opencode-mcp server, which lets you delegate work to OpenCode agents. Follow this workflow whenever you delegate tasks:
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Model selection guide — pick the model per task via the optional "model" input of opencode_start_task ('providerID/modelID'). Match the model tier to the task's difficulty; do not burn a scarce frontier model on work a cheap model handles well. Usage quotas (requests per 5h) are noted as a scarcity signal — lower quota means reserve it for harder work.
|
|
4
|
+
|
|
5
|
+
Frontier tier (scarce — architecture, hard debugging, critical decisions):
|
|
6
|
+
- Grok 4.5 (~80 req/5h): top-end reasoning and coding; reserve for the hardest problems, cross-cutting refactors, and tasks where a wrong answer is expensive.
|
|
7
|
+
- Kimi K3 (~140 req/5h): frontier reasoning with very strong agentic stability and tool calling over long sessions; best for long-horizon multi-step tasks that must not derail.
|
|
8
|
+
|
|
9
|
+
High tier (strong daily drivers — feature implementation, non-trivial debugging, review):
|
|
10
|
+
- GLM-5.2 (~880 req/5h): open-weight leader on coding and agentic-coding benchmarks (SWE-bench Pro ~62%); best default for substantial implementation and refactoring work.
|
|
11
|
+
- Qwen3.7 Max (~950 req/5h): near-tie with GLM-5.2 on real-world software engineering; strong multilingual and long-context work.
|
|
12
|
+
- Kimi K2.7 Code (~1,150 req/5h): coding-specialized; ~30% fewer thinking tokens, excellent precise tool invocation (MCP-heavy pipelines) and 4,000+ tool-call sequences; best for long agentic coding runs.
|
|
13
|
+
|
|
14
|
+
Mid tier (high volume — standard features, tests, medium complexity):
|
|
15
|
+
- MiniMax M3 (~3,200 req/5h): frontier-adjacent coding plus 1M context and native multimodality; best for large-codebase context ingestion or tasks involving images/video.
|
|
16
|
+
- MiMo-V2.5-Pro (~3,250 req/5h): strong general agentic capability and complex software engineering (high SWE-bench Pro rankings); good GLM alternative at higher volume.
|
|
17
|
+
- DeepSeek V4 Pro (~3,450 req/5h): solid all-round flagship; good balance of capability and quota for everyday implementation tasks.
|
|
18
|
+
- Qwen3.7 Plus (~4,300 req/5h): capable mid-range generalist; good for standard features and tests at volume.
|
|
19
|
+
|
|
20
|
+
Fast tier (near-unlimited — mechanical work, boilerplate, formatting, simple fixes, docs, exploration):
|
|
21
|
+
- MiMo-V2.5 (~30,100 req/5h): lightweight reasoning model; better than Flash on agentic tasks, at some latency/token cost.
|
|
22
|
+
- DeepSeek V4 Flash (~31,650 req/5h): cheapest and fastest, non-reasoning; best for mechanical edits, boilerplate, renames, doc updates, and quick lookups where latency matters.
|
|
23
|
+
|
|
24
|
+
Rule of thumb: exploration/mechanical → Fast tier; standard implementation → Mid tier; complex features and long agentic runs → High tier; architecture or hardest debugging → Frontier tier.
|
|
4
25
|
|
|
5
26
|
Workflow:
|
|
6
27
|
1. Ensure an OpenCode server is running. If you don't already have a server_id from a previous opencode_start_server call, call opencode_start_server first.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delegate_task.js","sourceRoot":"","sources":["../../../../src/modules/prompts/delegate_task.ts"],"names":[],"mappings":"AAEA,MAAM,0BAA0B,GAAG
|
|
1
|
+
{"version":3,"file":"delegate_task.js","sourceRoot":"","sources":["../../../../src/modules/prompts/delegate_task.ts"],"names":[],"mappings":"AAEA,MAAM,0BAA0B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sJAoCmH,CAAC;AAEvJ,MAAM,UAAU,0BAA0B,CAAC,MAAiB;IAC1D,MAAM,CAAC,cAAc,CACnB,eAAe,EACf;QACE,KAAK,EAAE,2BAA2B;QAClC,WAAW,EACT,gGAAgG;KACnG,EACD,GAAG,EAAE,CAAC,CAAC;QACL,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,0BAA0B;iBACjC;aACF;SACF;KACF,CAAC,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -13,15 +13,31 @@ export interface AssistantEntry {
|
|
|
13
13
|
/** Fetch the most recent assistant message (with its parts) for a session. */
|
|
14
14
|
export declare function lastAssistantEntry(client: OpencodeClient, sessionId: string): Promise<AssistantEntry | undefined>;
|
|
15
15
|
export type TaskStatus = "pending" | "running" | "completed" | "failed";
|
|
16
|
+
export interface TaskProgress {
|
|
17
|
+
/** Last ~500 chars of concatenated TextPart text from the last assistant message. */
|
|
18
|
+
text_snippet: string;
|
|
19
|
+
/** Count of ToolPart parts whose state.status is "completed". */
|
|
20
|
+
tool_calls_completed: number;
|
|
21
|
+
/** Tool name of the last ToolPart whose state.status is "running" or "pending". */
|
|
22
|
+
current_tool?: string;
|
|
23
|
+
/** state.status of that tool part. */
|
|
24
|
+
current_tool_status?: string;
|
|
25
|
+
}
|
|
16
26
|
export interface TaskStatusResult {
|
|
17
27
|
task_id: string;
|
|
18
28
|
status: TaskStatus;
|
|
19
29
|
error?: string;
|
|
30
|
+
progress?: TaskProgress;
|
|
31
|
+
}
|
|
32
|
+
/** Build a TaskProgress summary from a message's parts. */
|
|
33
|
+
export declare function buildProgress(parts: Part[]): TaskProgress;
|
|
34
|
+
export interface DeriveTaskStatusOptions {
|
|
35
|
+
includeProgress?: boolean;
|
|
20
36
|
}
|
|
21
37
|
/**
|
|
22
38
|
* Derive the current status of a task by inspecting session busy state and
|
|
23
39
|
* the last assistant message. Shared by opencode_get_task_status and
|
|
24
40
|
* opencode_wait_for_task so both use identical status derivation.
|
|
25
41
|
*/
|
|
26
|
-
export declare function deriveTaskStatus(client: OpencodeClient, sessionId: string, taskId: string): Promise<TaskStatusResult>;
|
|
42
|
+
export declare function deriveTaskStatus(client: OpencodeClient, sessionId: string, taskId: string, options?: DeriveTaskStatusOptions): Promise<TaskStatusResult>;
|
|
27
43
|
//# sourceMappingURL=opencode-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencode-client.d.ts","sourceRoot":"","sources":["../../../../src/modules/shared/opencode-client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,gBAAgB,EAErB,KAAK,cAAc,EACnB,KAAK,IAAI,EACV,MAAM,kBAAkB,CAAC;AAI1B,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAI5E;AAED,mFAAmF;AACnF,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,GACb;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAM3D;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,IAAI,EAAE,CAAC;CACf;AAED,8EAA8E;AAC9E,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,cAAc,EACtB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAUrC;AAED,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AAExE,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"opencode-client.d.ts","sourceRoot":"","sources":["../../../../src/modules/shared/opencode-client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,gBAAgB,EAErB,KAAK,cAAc,EACnB,KAAK,IAAI,EACV,MAAM,kBAAkB,CAAC;AAI1B,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAI5E;AAED,mFAAmF;AACnF,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,GACb;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAM3D;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,IAAI,EAAE,CAAC;CACf;AAED,8EAA8E;AAC9E,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,cAAc,EACtB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAUrC;AAED,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AAExE,MAAM,WAAW,YAAY;IAC3B,qFAAqF;IACrF,YAAY,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mFAAmF;IACnF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sCAAsC;IACtC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAID,2DAA2D;AAC3D,wBAAgB,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,YAAY,CA2BzD;AAED,MAAM,WAAW,uBAAuB;IACtC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,cAAc,EACtB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,gBAAgB,CAAC,CAkC3B"}
|
|
@@ -30,16 +30,54 @@ export async function lastAssistantEntry(client, sessionId) {
|
|
|
30
30
|
}
|
|
31
31
|
return undefined;
|
|
32
32
|
}
|
|
33
|
+
const TEXT_SNIPPET_MAX_LENGTH = 500;
|
|
34
|
+
/** Build a TaskProgress summary from a message's parts. */
|
|
35
|
+
export function buildProgress(parts) {
|
|
36
|
+
let text = "";
|
|
37
|
+
let toolCallsCompleted = 0;
|
|
38
|
+
let currentTool;
|
|
39
|
+
let currentToolStatus;
|
|
40
|
+
for (const part of parts) {
|
|
41
|
+
if (part.type === "text") {
|
|
42
|
+
text += part.text;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
if (part.type === "tool") {
|
|
46
|
+
if (part.state.status === "completed") {
|
|
47
|
+
toolCallsCompleted++;
|
|
48
|
+
}
|
|
49
|
+
else if (part.state.status === "running" || part.state.status === "pending") {
|
|
50
|
+
currentTool = part.tool;
|
|
51
|
+
currentToolStatus = part.state.status;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
text_snippet: text.slice(-TEXT_SNIPPET_MAX_LENGTH),
|
|
57
|
+
tool_calls_completed: toolCallsCompleted,
|
|
58
|
+
current_tool: currentTool,
|
|
59
|
+
current_tool_status: currentToolStatus,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
33
62
|
/**
|
|
34
63
|
* Derive the current status of a task by inspecting session busy state and
|
|
35
64
|
* the last assistant message. Shared by opencode_get_task_status and
|
|
36
65
|
* opencode_wait_for_task so both use identical status derivation.
|
|
37
66
|
*/
|
|
38
|
-
export async function deriveTaskStatus(client, sessionId, taskId) {
|
|
67
|
+
export async function deriveTaskStatus(client, sessionId, taskId, options) {
|
|
68
|
+
const includeProgress = options?.includeProgress ?? false;
|
|
39
69
|
// The status map only lists sessions that are actively working.
|
|
40
70
|
const statusRes = await client.session.status();
|
|
41
71
|
const sessionStatus = statusRes.data?.[sessionId];
|
|
42
72
|
if (sessionStatus?.type === "busy" || sessionStatus?.type === "retry") {
|
|
73
|
+
if (includeProgress) {
|
|
74
|
+
const entry = await lastAssistantEntry(client, sessionId);
|
|
75
|
+
return {
|
|
76
|
+
task_id: taskId,
|
|
77
|
+
status: "running",
|
|
78
|
+
progress: entry ? buildProgress(entry.parts) : undefined,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
43
81
|
return { task_id: taskId, status: "running" };
|
|
44
82
|
}
|
|
45
83
|
// Not busy: inspect the last assistant message to tell pending from done.
|
|
@@ -53,6 +91,10 @@ export async function deriveTaskStatus(client, sessionId, taskId) {
|
|
|
53
91
|
if (entry.info.time.completed) {
|
|
54
92
|
return { task_id: taskId, status: "completed" };
|
|
55
93
|
}
|
|
56
|
-
return {
|
|
94
|
+
return {
|
|
95
|
+
task_id: taskId,
|
|
96
|
+
status: "running",
|
|
97
|
+
progress: includeProgress ? buildProgress(entry.parts) : undefined,
|
|
98
|
+
};
|
|
57
99
|
}
|
|
58
100
|
//# sourceMappingURL=opencode-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencode-client.js","sourceRoot":"","sources":["../../../../src/modules/shared/opencode-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,oBAAoB,GAGrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,oFAAoF;AACpF,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,OAAO,oBAAoB,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,aAAa,CAC3B,MAAc;IAEd,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9C,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;AAC/C,CAAC;AAOD,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAsB,EACtB,SAAiB;IAEjB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;IACvE,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACpC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;QAClD,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;
|
|
1
|
+
{"version":3,"file":"opencode-client.js","sourceRoot":"","sources":["../../../../src/modules/shared/opencode-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cancel_task.d.ts","sourceRoot":"","sources":["../../../../src/modules/tools/cancel_task.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,QAiC3D"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { jsonError, jsonResult } from "../shared/mcp-result.js";
|
|
3
|
+
import { clientForTask } from "../shared/opencode-client.js";
|
|
4
|
+
export function registerOpencodeCancelTask(server) {
|
|
5
|
+
server.registerTool("opencode_cancel_task", {
|
|
6
|
+
description: "Cancel a delegated task by aborting its OpenCode session",
|
|
7
|
+
inputSchema: {
|
|
8
|
+
task_id: z.string().describe("Id of the task to cancel"),
|
|
9
|
+
},
|
|
10
|
+
}, async ({ task_id }) => {
|
|
11
|
+
const resolved = clientForTask(task_id);
|
|
12
|
+
if (!resolved) {
|
|
13
|
+
return jsonError({ task_id, status: "task_not_found" });
|
|
14
|
+
}
|
|
15
|
+
const { client, sessionId } = resolved;
|
|
16
|
+
try {
|
|
17
|
+
await client.session.abort({ path: { id: sessionId } });
|
|
18
|
+
return jsonResult({
|
|
19
|
+
task_id,
|
|
20
|
+
session_id: sessionId,
|
|
21
|
+
status: "cancelled",
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
return jsonError({
|
|
26
|
+
task_id,
|
|
27
|
+
status: "error",
|
|
28
|
+
message: error instanceof Error ? error.message : String(error),
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=cancel_task.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cancel_task.js","sourceRoot":"","sources":["../../../../src/modules/tools/cancel_task.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE7D,MAAM,UAAU,0BAA0B,CAAC,MAAiB;IAC1D,MAAM,CAAC,YAAY,CACjB,sBAAsB,EACtB;QACE,WAAW,EAAE,0DAA0D;QACvE,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;SACzD;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QACpB,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAC;QAEvC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;YAExD,OAAO,UAAU,CAAC;gBAChB,OAAO;gBACP,UAAU,EAAE,SAAS;gBACrB,MAAM,EAAE,WAAW;aACpB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,SAAS,CAAC;gBACf,OAAO;gBACP,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAChE,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"continue_task.d.ts","sourceRoot":"","sources":["../../../../src/modules/tools/continue_task.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAYzE,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,SAAS,QAqE7D"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { jsonError, jsonResult } from "../shared/mcp-result.js";
|
|
3
|
+
import { clientForTask } from "../shared/opencode-client.js";
|
|
4
|
+
/** Parse a "providerID/modelID" string into the shape the SDK expects. */
|
|
5
|
+
function parseModel(model) {
|
|
6
|
+
const slash = model.indexOf("/");
|
|
7
|
+
if (slash <= 0 || slash === model.length - 1)
|
|
8
|
+
return undefined;
|
|
9
|
+
return { providerID: model.slice(0, slash), modelID: model.slice(slash + 1) };
|
|
10
|
+
}
|
|
11
|
+
export function registerOpencodeContinueTask(server) {
|
|
12
|
+
server.registerTool("opencode_continue_task", {
|
|
13
|
+
description: "Send a follow-up prompt to an existing delegated task's session",
|
|
14
|
+
inputSchema: {
|
|
15
|
+
task_id: z
|
|
16
|
+
.string()
|
|
17
|
+
.describe("Id of the task whose session should receive the follow-up prompt"),
|
|
18
|
+
prompt: z.string().describe("Follow-up prompt/instructions for the agent"),
|
|
19
|
+
agent: z
|
|
20
|
+
.string()
|
|
21
|
+
.optional()
|
|
22
|
+
.describe("Agent name to delegate to (e.g. 'build', 'plan'). Discover available agents with opencode_list_agents. Omit to use the session's current agent"),
|
|
23
|
+
model: z
|
|
24
|
+
.string()
|
|
25
|
+
.optional()
|
|
26
|
+
.describe("Model override as 'providerID/modelID' (e.g. 'opencode/glm-5.2'). Overrides the agent's pre-assigned model for this follow-up only. Discover available models with opencode_list_agents"),
|
|
27
|
+
},
|
|
28
|
+
}, async ({ task_id, prompt, agent, model }) => {
|
|
29
|
+
const resolved = clientForTask(task_id);
|
|
30
|
+
if (!resolved) {
|
|
31
|
+
return jsonError({ task_id, status: "task_not_found" });
|
|
32
|
+
}
|
|
33
|
+
const { client, sessionId } = resolved;
|
|
34
|
+
let parsedModel;
|
|
35
|
+
if (model !== undefined) {
|
|
36
|
+
parsedModel = parseModel(model);
|
|
37
|
+
if (!parsedModel) {
|
|
38
|
+
return jsonError({
|
|
39
|
+
task_id,
|
|
40
|
+
status: "invalid_model",
|
|
41
|
+
message: "model must be in 'providerID/modelID' format",
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
// Fire-and-forget: promptAsync returns as soon as the prompt is accepted,
|
|
47
|
+
// the agent keeps working in the background. Poll with get_task_status.
|
|
48
|
+
await client.session.promptAsync({
|
|
49
|
+
path: { id: sessionId },
|
|
50
|
+
body: {
|
|
51
|
+
parts: [{ type: "text", text: prompt }],
|
|
52
|
+
...(agent ? { agent } : {}),
|
|
53
|
+
...(parsedModel ? { model: parsedModel } : {}),
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
return jsonResult({
|
|
57
|
+
task_id,
|
|
58
|
+
session_id: sessionId,
|
|
59
|
+
status: "pending",
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
return jsonError({
|
|
64
|
+
task_id,
|
|
65
|
+
status: "error",
|
|
66
|
+
message: error instanceof Error ? error.message : String(error),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=continue_task.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"continue_task.js","sourceRoot":"","sources":["../../../../src/modules/tools/continue_task.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get_task_status.d.ts","sourceRoot":"","sources":["../../../../src/modules/tools/get_task_status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"get_task_status.d.ts","sourceRoot":"","sources":["../../../../src/modules/tools/get_task_status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,SAAS,QAoC9D"}
|
|
@@ -6,15 +6,21 @@ export function registerOpencodeGetTaskStatus(server) {
|
|
|
6
6
|
description: "Get the current status of a delegated task",
|
|
7
7
|
inputSchema: {
|
|
8
8
|
task_id: z.string().describe("Id of the task to check"),
|
|
9
|
+
include_progress: z
|
|
10
|
+
.boolean()
|
|
11
|
+
.optional()
|
|
12
|
+
.describe("If true, include a partial output snippet and the currently running tool while the task is still running"),
|
|
9
13
|
},
|
|
10
|
-
}, async ({ task_id }) => {
|
|
14
|
+
}, async ({ task_id, include_progress }) => {
|
|
11
15
|
const resolved = clientForTask(task_id);
|
|
12
16
|
if (!resolved) {
|
|
13
17
|
return jsonError({ task_id, status: "not_found" });
|
|
14
18
|
}
|
|
15
19
|
const { client, sessionId } = resolved;
|
|
16
20
|
try {
|
|
17
|
-
const result = await deriveTaskStatus(client, sessionId, task_id
|
|
21
|
+
const result = await deriveTaskStatus(client, sessionId, task_id, {
|
|
22
|
+
includeProgress: include_progress,
|
|
23
|
+
});
|
|
18
24
|
return jsonResult(result);
|
|
19
25
|
}
|
|
20
26
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get_task_status.js","sourceRoot":"","sources":["../../../../src/modules/tools/get_task_status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAE/E,MAAM,UAAU,6BAA6B,CAAC,MAAiB;IAC7D,MAAM,CAAC,YAAY,CACjB,0BAA0B,EAC1B;QACE,WAAW,EAAE,4CAA4C;QACzD,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"get_task_status.js","sourceRoot":"","sources":["../../../../src/modules/tools/get_task_status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAE/E,MAAM,UAAU,6BAA6B,CAAC,MAAiB;IAC7D,MAAM,CAAC,YAAY,CACjB,0BAA0B,EAC1B;QACE,WAAW,EAAE,4CAA4C;QACzD,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;YACvD,gBAAgB,EAAE,CAAC;iBAChB,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CACP,0GAA0G,CAC3G;SACJ;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE,EAAE,EAAE;QACtC,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAC;QAEvC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE;gBAChE,eAAe,EAAE,gBAAgB;aAClC,CAAC,CAAC;YACH,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,SAAS,CAAC;gBACf,OAAO;gBACP,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAChE,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/modules/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/modules/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAYzE,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,QAU9C"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
// Tools
|
|
2
|
+
import { registerOpencodeCancelTask } from "./cancel_task.js";
|
|
3
|
+
import { registerOpencodeContinueTask } from "./continue_task.js";
|
|
2
4
|
import { registerOpencodeGetTaskResult } from "./get_task_result.js";
|
|
3
5
|
import { registerOpencodeGetTaskStatus } from "./get_task_status.js";
|
|
4
6
|
import { registerOpencodeListAgents } from "./list_agents.js";
|
|
@@ -14,5 +16,7 @@ export function registerTools(server) {
|
|
|
14
16
|
registerOpencodeGetTaskStatus(server);
|
|
15
17
|
registerOpencodeGetTaskResult(server);
|
|
16
18
|
registerOpencodeWaitForTask(server);
|
|
19
|
+
registerOpencodeContinueTask(server);
|
|
20
|
+
registerOpencodeCancelTask(server);
|
|
17
21
|
}
|
|
18
22
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/tools/index.ts"],"names":[],"mappings":"AACA,QAAQ;AACR,OAAO,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AAEjE,MAAM,UAAU,aAAa,CAAC,MAAiB;IAC7C,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACpC,0BAA0B,CAAC,MAAM,CAAC,CAAC;IACnC,0BAA0B,CAAC,MAAM,CAAC,CAAC;IACnC,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClC,6BAA6B,CAAC,MAAM,CAAC,CAAC;IACtC,6BAA6B,CAAC,MAAM,CAAC,CAAC;IACtC,2BAA2B,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/tools/index.ts"],"names":[],"mappings":"AACA,QAAQ;AACR,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AAEjE,MAAM,UAAU,aAAa,CAAC,MAAiB;IAC7C,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACpC,0BAA0B,CAAC,MAAM,CAAC,CAAC;IACnC,0BAA0B,CAAC,MAAM,CAAC,CAAC;IACnC,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClC,6BAA6B,CAAC,MAAM,CAAC,CAAC;IACtC,6BAA6B,CAAC,MAAM,CAAC,CAAC;IACtC,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACpC,4BAA4B,CAAC,MAAM,CAAC,CAAC;IACrC,0BAA0B,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start_task.d.ts","sourceRoot":"","sources":["../../../../src/modules/tools/start_task.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAazE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"start_task.d.ts","sourceRoot":"","sources":["../../../../src/modules/tools/start_task.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAazE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,QA6E1D"}
|
|
@@ -16,11 +16,14 @@ export function registerOpencodeStartTask(server) {
|
|
|
16
16
|
inputSchema: {
|
|
17
17
|
server_id: z.string().describe("Id of the server instance to run the task on"),
|
|
18
18
|
prompt: z.string().describe("Prompt/instructions for the agent"),
|
|
19
|
-
agent: z
|
|
19
|
+
agent: z
|
|
20
|
+
.string()
|
|
21
|
+
.optional()
|
|
22
|
+
.describe("Agent name to delegate to (e.g. 'build', 'plan'). Discover available agents with opencode_list_agents. Omit to use the server's default agent"),
|
|
20
23
|
model: z
|
|
21
24
|
.string()
|
|
22
25
|
.optional()
|
|
23
|
-
.describe("Model as 'providerID/modelID' (e.g. '
|
|
26
|
+
.describe("Model override as 'providerID/modelID' (e.g. 'opencode/glm-5.2'). Overrides the agent's pre-assigned model for this task only. Discover available models with opencode_list_agents; see the delegate_task prompt for guidance on matching model tier to task difficulty"),
|
|
24
27
|
},
|
|
25
28
|
}, async ({ server_id, prompt, agent, model }) => {
|
|
26
29
|
const client = clientForServer(server_id);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start_task.js","sourceRoot":"","sources":["../../../../src/modules/tools/start_task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,0EAA0E;AAC1E,SAAS,UAAU,CAAC,KAAa;IAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/D,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,MAAiB;IACzD,MAAM,CAAC,YAAY,CACjB,qBAAqB,EACrB;QACE,WAAW,EACT,8GAA8G;QAChH,WAAW,EAAE;YACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;YAC9E,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;YAChE,KAAK,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"start_task.js","sourceRoot":"","sources":["../../../../src/modules/tools/start_task.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wait_for_task.d.ts","sourceRoot":"","sources":["../../../../src/modules/tools/wait_for_task.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"wait_for_task.d.ts","sourceRoot":"","sources":["../../../../src/modules/tools/wait_for_task.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAwDzE,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,QAuG5D"}
|
|
@@ -12,9 +12,33 @@ function isFinished(result) {
|
|
|
12
12
|
function sleep(ms) {
|
|
13
13
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
14
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Re-derive status with progress for every task that is not yet finished.
|
|
17
|
+
* Only called once, right before returning a final result, never inside the
|
|
18
|
+
* poll loop. Failures are swallowed per-task so one bad re-derivation doesn't
|
|
19
|
+
* fail the whole call.
|
|
20
|
+
*/
|
|
21
|
+
async function enrichUnfinishedWithProgress(tasks, taskData) {
|
|
22
|
+
const clientByTaskId = new Map(taskData.map((entry) => [entry.task_id, entry.client]));
|
|
23
|
+
return Promise.all(tasks.map(async (task) => {
|
|
24
|
+
if (isFinished(task))
|
|
25
|
+
return task;
|
|
26
|
+
// Every task_id in `tasks` was resolved into taskData before polling started.
|
|
27
|
+
// biome-ignore lint/style/noNonNullAssertion: guaranteed present, see comment above
|
|
28
|
+
const client = clientByTaskId.get(task.task_id);
|
|
29
|
+
try {
|
|
30
|
+
return await deriveTaskStatus(client.client, client.sessionId, task.task_id, {
|
|
31
|
+
includeProgress: true,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return task;
|
|
36
|
+
}
|
|
37
|
+
}));
|
|
38
|
+
}
|
|
15
39
|
export function registerOpencodeWaitForTask(server) {
|
|
16
40
|
server.registerTool("opencode_wait_for_task", {
|
|
17
|
-
description: "Long-poll one or more delegated tasks until they finish or the timeout elapses. Use mode 'all' to wait for all tasks, or 'any' to return as soon as one completes.",
|
|
41
|
+
description: "Long-poll one or more delegated tasks until they finish or the timeout elapses. Use mode 'all' to wait for all tasks, or 'any' to return as soon as one completes. Set include_progress to enrich still-running tasks in the final result with a partial output snippet and the currently running tool.",
|
|
18
42
|
inputSchema: {
|
|
19
43
|
task_ids: z.string().array().min(1).describe("IDs of tasks to wait for"),
|
|
20
44
|
mode: z
|
|
@@ -29,8 +53,12 @@ export function registerOpencodeWaitForTask(server) {
|
|
|
29
53
|
.number()
|
|
30
54
|
.optional()
|
|
31
55
|
.describe(`Time between status checks in milliseconds (default ${DEFAULT_POLL_INTERVAL_MS})`),
|
|
56
|
+
include_progress: z
|
|
57
|
+
.boolean()
|
|
58
|
+
.optional()
|
|
59
|
+
.describe("If true, enrich tasks that are still not finished in the returned result with a partial output snippet and the currently running tool (not used during polling, only on the final result)"),
|
|
32
60
|
},
|
|
33
|
-
}, async ({ task_ids, mode = "all", timeout_ms, poll_interval_ms }) => {
|
|
61
|
+
}, async ({ task_ids, mode = "all", timeout_ms, poll_interval_ms, include_progress }) => {
|
|
34
62
|
// Fail-fast: check for unknown task IDs before polling starts
|
|
35
63
|
const unknownIds = [];
|
|
36
64
|
const taskData = [];
|
|
@@ -74,10 +102,16 @@ export function registerOpencodeWaitForTask(server) {
|
|
|
74
102
|
return jsonResult({ mode, tasks, timed_out: false });
|
|
75
103
|
}
|
|
76
104
|
if (mode === "any" && tasks.some(isFinished)) {
|
|
77
|
-
|
|
105
|
+
const enriched = include_progress
|
|
106
|
+
? await enrichUnfinishedWithProgress(tasks, taskData)
|
|
107
|
+
: tasks;
|
|
108
|
+
return jsonResult({ mode, tasks: enriched, timed_out: false });
|
|
78
109
|
}
|
|
79
110
|
if (Date.now() >= deadline) {
|
|
80
|
-
|
|
111
|
+
const enriched = include_progress
|
|
112
|
+
? await enrichUnfinishedWithProgress(tasks, taskData)
|
|
113
|
+
: tasks;
|
|
114
|
+
return jsonResult({ mode, tasks: enriched, timed_out: true });
|
|
81
115
|
}
|
|
82
116
|
await sleep(pollInterval);
|
|
83
117
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wait_for_task.js","sourceRoot":"","sources":["../../../../src/modules/tools/wait_for_task.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EACL,aAAa,EACb,gBAAgB,GAEjB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AACnC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AACvC,MAAM,oBAAoB,GAAG,GAAG,CAAC;AAKjC,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AAEpE,SAAS,UAAU,CAAC,MAAkC;IACpD,OAAO,MAAM,KAAK,SAAS,IAAI,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,MAAiB;IAC3D,MAAM,CAAC,YAAY,CACjB,wBAAwB,EACxB;QACE,WAAW,EACT,
|
|
1
|
+
{"version":3,"file":"wait_for_task.js","sourceRoot":"","sources":["../../../../src/modules/tools/wait_for_task.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mcp-server-opencode",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "MCP server that lets any MCP host (Claude Code, Codex CLI, Cursor, etc.) drive OpenCode and delegate tasks asynchronously to its agents",
|
|
5
5
|
"main": "./build/src/index.js",
|
|
6
6
|
"types": "./build/src/index.d.ts",
|
|
7
|
-
"keywords": [
|
|
7
|
+
"keywords": [
|
|
8
|
+
"mcp",
|
|
9
|
+
"mcp-server",
|
|
10
|
+
"model-context-protocol",
|
|
11
|
+
"opencode",
|
|
12
|
+
"agent",
|
|
13
|
+
"subagent",
|
|
14
|
+
"delegation",
|
|
15
|
+
"async",
|
|
16
|
+
"orchestration",
|
|
17
|
+
"claude-code",
|
|
18
|
+
"codex",
|
|
19
|
+
"ai-agents"
|
|
20
|
+
],
|
|
8
21
|
"author": "alejandro-technology",
|
|
9
22
|
"license": "MIT",
|
|
10
23
|
"repository": {
|