mcp-server-opencode 1.1.0 → 1.1.2

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 CHANGED
@@ -4,29 +4,29 @@
4
4
  [![coverage](https://img.shields.io/badge/coverage-100%25-brightgreen)](https://github.com/alejandro-technology/opencode-mcp/blob/main/vitest.config.ts)
5
5
  [![npm](https://img.shields.io/npm/v/mcp-server-opencode)](https://www.npmjs.com/package/mcp-server-opencode)
6
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.
7
+ An MCP (Model Context Protocol) server that lets any MCP host — Claude Code, Codex, 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.
8
8
 
9
- ```
10
- Claude Code
11
-
12
-
13
- MCP Server (this project)
14
-
15
-
16
- OpenCode SDK / CLI
17
-
18
-
19
- Subagents
9
+ ## Quick install
10
+
11
+ Requires **Node.js 18+** and **[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.
12
+
13
+ For **Claude Code**:
14
+
15
+ ```bash
16
+ claude mcp add opencode -- npx -y mcp-server-opencode
20
17
  ```
21
18
 
22
- ## Design
19
+ For **Codex**:
20
+ ```bash
21
+ codex mcp add opencode -- npx -y mcp-server-opencode
22
+ ```
23
23
 
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.
24
+ See [Installation](#installation) for manual config, and from-source options.
25
25
 
26
26
  ## Tools
27
27
 
28
28
  | Tool | Description |
29
- | -------------------------- | --------------------------------------------------------------------------------------------------------- |
29
+ | --------------------------- | -------------------------------------------------------------------------------------------------------- |
30
30
  | `opencode_start_server` | Start (or attach to) an OpenCode server instance |
31
31
  | `opencode_stop_server` | Stop a running OpenCode server instance |
32
32
  | `opencode_list_agents` | List agents/models available on a server instance |
@@ -37,11 +37,27 @@ Task delegation is **asynchronous**: starting a task returns immediately with a
37
37
  | `opencode_get_task_result` | Fetch the final result of a completed task |
38
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
39
 
40
-
41
40
  | Prompt | Description |
42
41
  | --------------- | ---------------------------------------------------------------------------------------------------- |
43
42
  | `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
43
 
44
+ ## How it works
45
+
46
+ ```
47
+ Claude Code
48
+
49
+
50
+ MCP Server (this project)
51
+
52
+
53
+ OpenCode SDK / CLI
54
+
55
+
56
+ Subagents
57
+ ```
58
+
59
+ 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.
60
+
45
61
  ## Installation
46
62
 
47
63
  ### Prerequisites
@@ -72,7 +88,7 @@ Or manually
72
88
  }
73
89
  ```
74
90
 
75
- For **Codex CLI**, add the server to `~/.codex/config.toml`:
91
+ For **Codex**, add the server to `~/.codex/config.toml`:
76
92
 
77
93
  ```toml
78
94
  [mcp_servers.opencode]
@@ -160,9 +176,9 @@ Restart your MCP host after editing the config; the `opencode_*` tools should ap
160
176
 
161
177
  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.
162
178
 
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.
179
+ ## Development
164
180
 
165
- ## Project structure
181
+ ### Project structure
166
182
 
167
183
  ```
168
184
  src/
@@ -180,7 +196,7 @@ src/
180
196
 
181
197
  Each module ships with a `*.test.ts` Vitest suite under the parallel `tests/` tree mirroring `src/`.
182
198
 
183
- ## Getting started
199
+ ### Getting started
184
200
 
185
201
  ```bash
186
202
  pnpm install
@@ -1,13 +1,19 @@
1
1
  #!/usr/bin/env node
2
2
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
3
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
- import { registerPrompts } from "./modules/prompts/index.js";
4
+ import { DELEGATE_TASK_INSTRUCTIONS } from "./modules/resources/delegate-task-instructions.js";
5
+ import { registerResources } from "./modules/resources/index.js";
5
6
  import { killAllServers } from "./modules/shared/server-registry.js";
6
7
  import { registerTools } from "./modules/tools/index.js";
7
8
  // Create server instance
8
9
  const server = new McpServer({
9
10
  name: "opencode-mcp",
10
11
  version: "1.0.0",
12
+ title: "OpenCode MCP",
13
+ description: "MCP server that drives an OpenCode instance and delegates work asynchronously to its agents",
14
+ websiteUrl: "https://opencode-mcp.alejandrotechnology.com",
15
+ }, {
16
+ instructions: DELEGATE_TASK_INSTRUCTIONS,
11
17
  });
12
18
  function shutdown(signal) {
13
19
  console.error(`Received ${signal}, stopping tracked OpenCode servers...`);
@@ -22,8 +28,8 @@ process.on("SIGTERM", shutdown);
22
28
  // Safety net for any other exit path (uncaught exception, process.exit elsewhere).
23
29
  process.on("exit", killAllServers);
24
30
  async function main() {
31
+ registerResources(server);
25
32
  registerTools(server);
26
- registerPrompts(server);
27
33
  const transport = new StdioServerTransport();
28
34
  await server.connect(transport);
29
35
  console.error("OpenCode MCP Server running on stdio");
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,yBAAyB;AACzB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,cAAc;IACpB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,SAAS,QAAQ,CAAC,MAAsB;IACtC,OAAO,CAAC,KAAK,CAAC,YAAY,MAAM,wCAAwC,CAAC,CAAC;IAC1E,cAAc,EAAE,CAAC;IACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,yEAAyE;AACzE,kEAAkE;AAClE,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC/B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAChC,mFAAmF;AACnF,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAEnC,KAAK,UAAU,IAAI;IACjB,aAAa,CAAC,MAAM,CAAC,CAAC;IACtB,eAAe,CAAC,MAAM,CAAC,CAAC;IACxB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;AACxD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;IAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,0BAA0B,EAAE,MAAM,mDAAmD,CAAC;AAC/F,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,yBAAyB;AACzB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,cAAc;IACpB,OAAO,EAAE,OAAO;IAChB,KAAK,EAAE,cAAc;IACrB,WAAW,EACT,6FAA6F;IAC/F,UAAU,EAAE,8CAA8C;CAC3D,EAAE;IACD,YAAY,EAAE,0BAA0B;CACzC,CAAC,CAAC;AAEH,SAAS,QAAQ,CAAC,MAAsB;IACtC,OAAO,CAAC,KAAK,CAAC,YAAY,MAAM,wCAAwC,CAAC,CAAC;IAC1E,cAAc,EAAE,CAAC;IACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,yEAAyE;AACzE,kEAAkE;AAClE,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC/B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAChC,mFAAmF;AACnF,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAEnC,KAAK,UAAU,IAAI;IACjB,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,aAAa,CAAC,MAAM,CAAC,CAAC;IACtB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;AACxD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;IAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare 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:\n\nModel selection guide \u2014 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 \u2014 lower quota means reserve it for harder work.\n\nFrontier tier (scarce \u2014 architecture, hard debugging, critical decisions):\n- 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.\n- 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.\n\nHigh tier (strong daily drivers \u2014 feature implementation, non-trivial debugging, review):\n- 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.\n- Qwen3.7 Max (~950 req/5h): near-tie with GLM-5.2 on real-world software engineering; strong multilingual and long-context work.\n- 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.\n\nMid tier (high volume \u2014 standard features, tests, medium complexity):\n- 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.\n- 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.\n- DeepSeek V4 Pro (~3,450 req/5h): solid all-round flagship; good balance of capability and quota for everyday implementation tasks.\n- Qwen3.7 Plus (~4,300 req/5h): capable mid-range generalist; good for standard features and tests at volume.\n\nFast tier (near-unlimited \u2014 mechanical work, boilerplate, formatting, simple fixes, docs, exploration):\n- MiMo-V2.5 (~30,100 req/5h): lightweight reasoning model; better than Flash on agentic tasks, at some latency/token cost.\n- 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.\n\nRule of thumb: exploration/mechanical \u2192 Fast tier; standard implementation \u2192 Mid tier; complex features and long agentic runs \u2192 High tier; architecture or hardest debugging \u2192 Frontier tier.\n\nWorkflow:\n1. 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.\n2. Call opencode_list_agents with the server_id to discover the available agents (native and custom) and models. Agents may have a pre-assigned model (\"provider/model\"); you can still override it per task.\n3. For each task, call opencode_start_task with the server_id and the task's prompt. Optionally pass an agent name and/or a model override. Collect the returned task_id for every call.\n4. Wait for completion with opencode_wait_for_task:\n - Single task: mode \"all\" with the single task_id.\n - Multiple tasks, incremental results: call it repeatedly with mode \"any\", removing completed task_ids each time.\n - Multiple tasks, all at once: call it once with mode \"all\" and every task_id.\n5. Once a task is reported finished, call opencode_get_task_result for that task_id to retrieve its output.\n6. Use opencode_get_task_status only for quick, non-blocking checks on a task's progress (e.g. to report status to the user) \u2014 it does not replace opencode_wait_for_task or opencode_get_task_result.\n\nDo not call opencode_get_task_result before the task has finished, and prefer opencode_wait_for_task over polling opencode_get_task_status in a loop.";
3
+ export declare function registerDelegateTaskResource(server: McpServer): void;
4
+ //# sourceMappingURL=delegate-task-instructions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegate-task-instructions.d.ts","sourceRoot":"","sources":["../../../../src/modules/resources/delegate-task-instructions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,eAAO,MAAM,0BAA0B,6lIAoC+G,CAAC;AAEvJ,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,SAAS,QAoB7D"}
@@ -1,4 +1,4 @@
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:
1
+ export 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
4
 
@@ -35,20 +35,19 @@ Workflow:
35
35
  6. Use opencode_get_task_status only for quick, non-blocking checks on a task's progress (e.g. to report status to the user) — it does not replace opencode_wait_for_task or opencode_get_task_result.
36
36
 
37
37
  Do not call opencode_get_task_result before the task has finished, and prefer opencode_wait_for_task over polling opencode_get_task_status in a loop.`;
38
- export function registerDelegateTaskPrompt(server) {
39
- server.registerPrompt("delegate_task", {
38
+ export function registerDelegateTaskResource(server) {
39
+ server.registerResource("delegate-task-instructions", "opencode://instructions/delegate-task", {
40
40
  title: "Delegate task to OpenCode",
41
41
  description: "Instructions for the correct workflow to delegate tasks to OpenCode agents via this MCP server",
42
+ mimeType: "text/plain",
42
43
  }, () => ({
43
- messages: [
44
+ contents: [
44
45
  {
45
- role: "user",
46
- content: {
47
- type: "text",
48
- text: DELEGATE_TASK_INSTRUCTIONS,
49
- },
46
+ uri: "opencode://instructions/delegate-task",
47
+ text: DELEGATE_TASK_INSTRUCTIONS,
48
+ mimeType: "text/plain",
50
49
  },
51
50
  ],
52
51
  }));
53
52
  }
54
- //# sourceMappingURL=delegate_task.js.map
53
+ //# sourceMappingURL=delegate-task-instructions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegate-task-instructions.js","sourceRoot":"","sources":["../../../../src/modules/resources/delegate-task-instructions.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,0BAA0B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sJAoC4G,CAAC;AAEvJ,MAAM,UAAU,4BAA4B,CAAC,MAAiB;IAC5D,MAAM,CAAC,gBAAgB,CACrB,4BAA4B,EAC5B,uCAAuC,EACvC;QACE,KAAK,EAAE,2BAA2B;QAClC,WAAW,EACT,gGAAgG;QAClG,QAAQ,EAAE,YAAY;KACvB,EACD,GAAG,EAAE,CAAC,CAAC;QACL,QAAQ,EAAE;YACR;gBACE,GAAG,EAAE,uCAAuC;gBAC5C,IAAI,EAAE,0BAA0B;gBAChC,QAAQ,EAAE,YAAY;aACvB;SACF;KACF,CAAC,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerResources(server: McpServer): void;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/modules/resources/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,QAElD"}
@@ -0,0 +1,5 @@
1
+ import { registerDelegateTaskResource } from "./delegate-task-instructions.js";
2
+ export function registerResources(server) {
3
+ registerDelegateTaskResource(server);
4
+ }
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/resources/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAE/E,MAAM,UAAU,iBAAiB,CAAC,MAAiB;IACjD,4BAA4B,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC"}
@@ -1,10 +1,10 @@
1
1
  import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- /** Minimal stand-in for McpServer that captures the registered tool/prompt handlers. */
2
+ /** Minimal stand-in for McpServer that captures the registered tool/resource handlers. */
3
3
  export declare function createFakeMcpServer(): {
4
4
  server: McpServer;
5
5
  registerTool: import("vitest").Mock<(_name: string, _config: unknown, handler: ((...args: any[]) => unknown) | undefined) => void>;
6
- registerPrompt: import("vitest").Mock<(_name: string, _config: unknown, handler: ((...args: any[]) => unknown) | undefined) => void>;
6
+ registerResource: import("vitest").Mock<(_name: string, _uriOrTemplate: string, _config: unknown, handler: ((...args: any[]) => unknown) | undefined) => void>;
7
7
  getHandler: <T extends (...args: any[]) => unknown>() => T;
8
- getPromptHandler: <T extends (...args: any[]) => unknown>() => T;
8
+ getResourceHandler: <T extends (...args: any[]) => unknown>() => T;
9
9
  };
10
10
  //# sourceMappingURL=fake-mcp-server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fake-mcp-server.d.ts","sourceRoot":"","sources":["../../../src/test-utils/fake-mcp-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,wFAAwF;AACxF,wBAAgB,mBAAmB;;gDAGE,MAAM,WAAW,OAAO,sBAD3B,GAAG,EAAE,KAAK,OAAO;kDAQvC,MAAM,WAAW,OAAO,sBAFI,GAAG,EAAE,KAAK,OAAO;iBAcxC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,OAEtB,CAAC;uBAGV,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,OAEtB,CAAC;EAGtC"}
1
+ {"version":3,"file":"fake-mcp-server.d.ts","sourceRoot":"","sources":["../../../src/test-utils/fake-mcp-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,0FAA0F;AAC1F,wBAAgB,mBAAmB;;gDAGE,MAAM,WAAW,OAAO,sBAD3B,GAAG,EAAE,KAAK,OAAO;oDAStC,MAAM,kBACG,MAAM,WACb,OAAO,sBALoB,GAAG,EAAE,KAAK,OAAO;iBAmB1C,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,OAEtB,CAAC;yBAGR,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,OAEtB,CAAC;EAGxC"}
@@ -1,32 +1,32 @@
1
1
  import { vi } from "vitest";
2
- /** Minimal stand-in for McpServer that captures the registered tool/prompt handlers. */
2
+ /** Minimal stand-in for McpServer that captures the registered tool/resource handlers. */
3
3
  export function createFakeMcpServer() {
4
4
  // biome-ignore lint/suspicious/noExplicitAny: handler signature varies per tool
5
5
  let capturedHandler;
6
6
  const registerTool = vi.fn((_name, _config, handler) => {
7
7
  capturedHandler = handler;
8
8
  });
9
- // biome-ignore lint/suspicious/noExplicitAny: handler signature varies per prompt
10
- let capturedPromptHandler;
11
- const registerPrompt = vi.fn((_name, _config, handler) => {
12
- capturedPromptHandler = handler;
9
+ // biome-ignore lint/suspicious/noExplicitAny: handler signature varies per resource
10
+ let capturedResourceHandler;
11
+ const registerResource = vi.fn((_name, _uriOrTemplate, _config, handler) => {
12
+ capturedResourceHandler = handler;
13
13
  });
14
- const server = { registerTool, registerPrompt };
14
+ const server = { registerTool, registerResource };
15
15
  return {
16
16
  server,
17
17
  registerTool,
18
- registerPrompt,
18
+ registerResource,
19
19
  // biome-ignore lint/suspicious/noExplicitAny: input shape varies per tool
20
20
  getHandler: () => {
21
21
  if (!capturedHandler)
22
22
  throw new Error("registerTool was not called");
23
23
  return capturedHandler;
24
24
  },
25
- // biome-ignore lint/suspicious/noExplicitAny: input shape varies per prompt
26
- getPromptHandler: () => {
27
- if (!capturedPromptHandler)
28
- throw new Error("registerPrompt was not called");
29
- return capturedPromptHandler;
25
+ // biome-ignore lint/suspicious/noExplicitAny: input shape varies per resource
26
+ getResourceHandler: () => {
27
+ if (!capturedResourceHandler)
28
+ throw new Error("registerResource was not called");
29
+ return capturedResourceHandler;
30
30
  },
31
31
  };
32
32
  }
@@ -1 +1 @@
1
- {"version":3,"file":"fake-mcp-server.js","sourceRoot":"","sources":["../../../src/test-utils/fake-mcp-server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE5B,wFAAwF;AACxF,MAAM,UAAU,mBAAmB;IACjC,gFAAgF;IAChF,IAAI,eAA0D,CAAC;IAC/D,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,KAAa,EAAE,OAAgB,EAAE,OAA+B,EAAE,EAAE;QAC9F,eAAe,GAAG,OAAO,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,kFAAkF;IAClF,IAAI,qBAAgE,CAAC;IACrE,MAAM,cAAc,GAAG,EAAE,CAAC,EAAE,CAC1B,CAAC,KAAa,EAAE,OAAgB,EAAE,OAAqC,EAAE,EAAE;QACzE,qBAAqB,GAAG,OAAO,CAAC;IAClC,CAAC,CACF,CAAC;IAEF,MAAM,MAAM,GAAG,EAAE,YAAY,EAAE,cAAc,EAA0B,CAAC;IAExE,OAAO;QACL,MAAM;QACN,YAAY;QACZ,cAAc;QACd,0EAA0E;QAC1E,UAAU,EAAE,GAA0C,EAAE;YACtD,IAAI,CAAC,eAAe;gBAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;YACrE,OAAO,eAAoB,CAAC;QAC9B,CAAC;QACD,4EAA4E;QAC5E,gBAAgB,EAAE,GAA0C,EAAE;YAC5D,IAAI,CAAC,qBAAqB;gBAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAC7E,OAAO,qBAA0B,CAAC;QACpC,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"fake-mcp-server.js","sourceRoot":"","sources":["../../../src/test-utils/fake-mcp-server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE5B,0FAA0F;AAC1F,MAAM,UAAU,mBAAmB;IACjC,gFAAgF;IAChF,IAAI,eAA0D,CAAC;IAC/D,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,KAAa,EAAE,OAAgB,EAAE,OAA+B,EAAE,EAAE;QAC9F,eAAe,GAAG,OAAO,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,oFAAoF;IACpF,IAAI,uBAAkE,CAAC;IACvE,MAAM,gBAAgB,GAAG,EAAE,CAAC,EAAE,CAC5B,CACE,KAAa,EACb,cAAsB,EACtB,OAAgB,EAChB,OAAuC,EACvC,EAAE;QACF,uBAAuB,GAAG,OAAO,CAAC;IACpC,CAAC,CACF,CAAC;IAEF,MAAM,MAAM,GAAG,EAAE,YAAY,EAAE,gBAAgB,EAA0B,CAAC;IAE1E,OAAO;QACL,MAAM;QACN,YAAY;QACZ,gBAAgB;QAChB,0EAA0E;QAC1E,UAAU,EAAE,GAA0C,EAAE;YACtD,IAAI,CAAC,eAAe;gBAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;YACrE,OAAO,eAAoB,CAAC;QAC9B,CAAC;QACD,8EAA8E;QAC9E,kBAAkB,EAAE,GAA0C,EAAE;YAC9D,IAAI,CAAC,uBAAuB;gBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;YACjF,OAAO,uBAA4B,CAAC;QACtC,CAAC;KACF,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcp-server-opencode",
3
- "version": "1.1.0",
3
+ "version": "1.1.2",
4
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",
@@ -27,7 +27,7 @@
27
27
  "bugs": {
28
28
  "url": "https://github.com/alejandro-technology/opencode-mcp/issues"
29
29
  },
30
- "homepage": "https://github.com/alejandro-technology/opencode-mcp",
30
+ "homepage": "https://opencode-mcp.alejandrotechnology.com",
31
31
  "publishConfig": {
32
32
  "access": "public"
33
33
  },
@@ -1,3 +0,0 @@
1
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerDelegateTaskPrompt(server: McpServer): void;
3
- //# sourceMappingURL=delegate_task.d.ts.map
@@ -1 +0,0 @@
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 +0,0 @@
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"}
@@ -1,3 +0,0 @@
1
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerPrompts(server: McpServer): void;
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/modules/prompts/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,QAEhD"}
@@ -1,5 +0,0 @@
1
- import { registerDelegateTaskPrompt } from "./delegate_task.js";
2
- export function registerPrompts(server) {
3
- registerDelegateTaskPrompt(server);
4
- }
5
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/prompts/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAEhE,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C,0BAA0B,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC"}