opencode-mcp 1.0.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.
Files changed (52) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/LICENSE +21 -0
  3. package/README.md +241 -0
  4. package/dist/client.d.ts +49 -0
  5. package/dist/client.js +197 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/helpers.d.ts +53 -0
  8. package/dist/helpers.js +132 -0
  9. package/dist/helpers.js.map +1 -0
  10. package/dist/index.d.ts +25 -0
  11. package/dist/index.js +86 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/prompts.d.ts +9 -0
  14. package/dist/prompts.js +144 -0
  15. package/dist/prompts.js.map +1 -0
  16. package/dist/resources.d.ts +10 -0
  17. package/dist/resources.js +197 -0
  18. package/dist/resources.js.map +1 -0
  19. package/dist/tools/config.d.ts +3 -0
  20. package/dist/tools/config.js +33 -0
  21. package/dist/tools/config.js.map +1 -0
  22. package/dist/tools/events.d.ts +6 -0
  23. package/dist/tools/events.js +59 -0
  24. package/dist/tools/events.js.map +1 -0
  25. package/dist/tools/file.d.ts +3 -0
  26. package/dist/tools/file.js +127 -0
  27. package/dist/tools/file.js.map +1 -0
  28. package/dist/tools/global.d.ts +3 -0
  29. package/dist/tools/global.js +12 -0
  30. package/dist/tools/global.js.map +1 -0
  31. package/dist/tools/message.d.ts +3 -0
  32. package/dist/tools/message.js +151 -0
  33. package/dist/tools/message.js.map +1 -0
  34. package/dist/tools/misc.d.ts +3 -0
  35. package/dist/tools/misc.js +143 -0
  36. package/dist/tools/misc.js.map +1 -0
  37. package/dist/tools/project.d.ts +3 -0
  38. package/dist/tools/project.js +20 -0
  39. package/dist/tools/project.js.map +1 -0
  40. package/dist/tools/provider.d.ts +3 -0
  41. package/dist/tools/provider.js +58 -0
  42. package/dist/tools/provider.js.map +1 -0
  43. package/dist/tools/session.d.ts +3 -0
  44. package/dist/tools/session.js +223 -0
  45. package/dist/tools/session.js.map +1 -0
  46. package/dist/tools/tui.d.ts +7 -0
  47. package/dist/tools/tui.js +106 -0
  48. package/dist/tools/tui.js.map +1 -0
  49. package/dist/tools/workflow.d.ts +7 -0
  50. package/dist/tools/workflow.js +215 -0
  51. package/dist/tools/workflow.js.map +1 -0
  52. package/package.json +57 -0
@@ -0,0 +1,33 @@
1
+ import { z } from "zod";
2
+ import { toolJson, toolError } from "../helpers.js";
3
+ export function registerConfigTools(server, client) {
4
+ server.tool("opencode_config_get", "Get the current opencode configuration", {}, async () => {
5
+ try {
6
+ return toolJson(await client.get("/config"));
7
+ }
8
+ catch (e) {
9
+ return toolError(e);
10
+ }
11
+ });
12
+ server.tool("opencode_config_update", "Update the opencode configuration. Pass a partial config object with fields to update.", {
13
+ config: z
14
+ .record(z.string(), z.unknown())
15
+ .describe("Partial config object with fields to update"),
16
+ }, async ({ config }) => {
17
+ try {
18
+ return toolJson(await client.patch("/config", config));
19
+ }
20
+ catch (e) {
21
+ return toolError(e);
22
+ }
23
+ });
24
+ server.tool("opencode_config_providers", "List all configured providers and their default models", {}, async () => {
25
+ try {
26
+ return toolJson(await client.get("/config/providers"));
27
+ }
28
+ catch (e) {
29
+ return toolError(e);
30
+ }
31
+ });
32
+ }
33
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/tools/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAEpD,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,MAAsB;IAC3E,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,wCAAwC,EACxC,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,OAAO,QAAQ,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,wBAAwB,EACxB,wFAAwF,EACxF;QACE,MAAM,EAAE,CAAC;aACN,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;aAC/B,QAAQ,CAAC,6CAA6C,CAAC;KAC3D,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,IAAI,CAAC;YACH,OAAO,QAAQ,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,2BAA2B,EAC3B,wDAAwD,EACxD,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,OAAO,QAAQ,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Event streaming tools — subscribe to real-time events from OpenCode.
3
+ */
4
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ import { OpenCodeClient } from "../client.js";
6
+ export declare function registerEventTools(server: McpServer, client: OpenCodeClient): void;
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Event streaming tools — subscribe to real-time events from OpenCode.
3
+ */
4
+ import { z } from "zod";
5
+ import { toolResult, toolError } from "../helpers.js";
6
+ export function registerEventTools(server, client) {
7
+ server.tool("opencode_events_poll", "Poll for recent events from the OpenCode server. Collects events for the specified duration and returns them. Useful for monitoring session activity, deployments, and system changes.", {
8
+ durationMs: z
9
+ .number()
10
+ .optional()
11
+ .describe("How long to collect events in milliseconds (default: 3000, max: 30000)"),
12
+ maxEvents: z
13
+ .number()
14
+ .optional()
15
+ .describe("Maximum number of events to collect (default: 50)"),
16
+ }, async ({ durationMs, maxEvents }) => {
17
+ try {
18
+ const duration = Math.min(durationMs ?? 3000, 30000);
19
+ const max = maxEvents ?? 50;
20
+ const events = [];
21
+ const controller = new AbortController();
22
+ const timeout = setTimeout(() => controller.abort(), duration);
23
+ try {
24
+ for await (const evt of client.subscribeSSE("/event")) {
25
+ events.push(evt);
26
+ if (events.length >= max)
27
+ break;
28
+ if (controller.signal.aborted)
29
+ break;
30
+ }
31
+ }
32
+ catch {
33
+ // SSE connection will error when aborted — that's expected
34
+ }
35
+ finally {
36
+ clearTimeout(timeout);
37
+ }
38
+ if (events.length === 0) {
39
+ return toolResult("No events received during the polling period.");
40
+ }
41
+ const formatted = events
42
+ .map((e) => {
43
+ try {
44
+ const parsed = JSON.parse(e.data);
45
+ return `[${e.event}] ${JSON.stringify(parsed, null, 2)}`;
46
+ }
47
+ catch {
48
+ return `[${e.event}] ${e.data}`;
49
+ }
50
+ })
51
+ .join("\n\n");
52
+ return toolResult(`Collected ${events.length} event(s):\n\n${formatted}`);
53
+ }
54
+ catch (e) {
55
+ return toolError(e);
56
+ }
57
+ });
58
+ }
59
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/tools/events.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAEtD,MAAM,UAAU,kBAAkB,CAChC,MAAiB,EACjB,MAAsB;IAEtB,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,wLAAwL,EACxL;QACE,UAAU,EAAE,CAAC;aACV,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,wEAAwE,CACzE;QACH,SAAS,EAAE,CAAC;aACT,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,mDAAmD,CAAC;KACjE,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE;QAClC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI,EAAE,KAAK,CAAC,CAAC;YACrD,MAAM,GAAG,GAAG,SAAS,IAAI,EAAE,CAAC;YAC5B,MAAM,MAAM,GAA2C,EAAE,CAAC;YAE1D,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,QAAQ,CAAC,CAAC;YAE/D,IAAI,CAAC;gBACH,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACtD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBACjB,IAAI,MAAM,CAAC,MAAM,IAAI,GAAG;wBAAE,MAAM;oBAChC,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;wBAAE,MAAM;gBACvC,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,2DAA2D;YAC7D,CAAC;oBAAS,CAAC;gBACT,YAAY,CAAC,OAAO,CAAC,CAAC;YACxB,CAAC;YAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,OAAO,UAAU,CAAC,+CAA+C,CAAC,CAAC;YACrE,CAAC;YAED,MAAM,SAAS,GAAG,MAAM;iBACrB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACT,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBAClC,OAAO,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;gBAC3D,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;gBAClC,CAAC;YACH,CAAC,CAAC;iBACD,IAAI,CAAC,MAAM,CAAC,CAAC;YAEhB,OAAO,UAAU,CACf,aAAa,MAAM,CAAC,MAAM,iBAAiB,SAAS,EAAE,CACvD,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { OpenCodeClient } from "../client.js";
3
+ export declare function registerFileTools(server: McpServer, client: OpenCodeClient): void;
@@ -0,0 +1,127 @@
1
+ import { z } from "zod";
2
+ import { toolJson, toolError, toolResult } from "../helpers.js";
3
+ export function registerFileTools(server, client) {
4
+ server.tool("opencode_find_text", "Search for text patterns in project files (regex supported). Returns file paths, line numbers, and matching lines.", {
5
+ pattern: z
6
+ .string()
7
+ .describe("Text or regex pattern to search for in files"),
8
+ }, async ({ pattern }) => {
9
+ try {
10
+ const results = (await client.get("/find", { pattern }));
11
+ if (!results || results.length === 0) {
12
+ return toolResult(`No matches found for pattern: ${pattern}`);
13
+ }
14
+ // Format results for readability
15
+ const formatted = results.map((r) => {
16
+ const path = r.path ?? "";
17
+ const lineNum = r.line_number ?? "?";
18
+ const lines = r.lines ?? "";
19
+ return `${path}:${lineNum} ${typeof lines === "string" ? lines.trim() : JSON.stringify(lines)}`;
20
+ }).join("\n");
21
+ return toolResult(`${results.length} match(es):\n\n${formatted}`);
22
+ }
23
+ catch (e) {
24
+ return toolError(e);
25
+ }
26
+ });
27
+ server.tool("opencode_find_file", "Find files and directories by name (fuzzy match)", {
28
+ query: z.string().describe("Search string for file/directory names"),
29
+ type: z
30
+ .enum(["file", "directory"])
31
+ .optional()
32
+ .describe("Limit results to 'file' or 'directory'"),
33
+ directory: z
34
+ .string()
35
+ .optional()
36
+ .describe("Override the project root for the search"),
37
+ limit: z
38
+ .number()
39
+ .optional()
40
+ .describe("Max number of results (1-200)"),
41
+ }, async ({ query, type, directory, limit }) => {
42
+ try {
43
+ const q = { query };
44
+ if (type)
45
+ q.type = type;
46
+ if (directory)
47
+ q.directory = directory;
48
+ if (limit !== undefined)
49
+ q.limit = String(limit);
50
+ const files = (await client.get("/find/file", q));
51
+ if (!files || files.length === 0) {
52
+ return toolResult(`No files found matching: ${query}`);
53
+ }
54
+ return toolResult(files.join("\n"));
55
+ }
56
+ catch (e) {
57
+ return toolError(e);
58
+ }
59
+ });
60
+ server.tool("opencode_find_symbol", "Find workspace symbols by name (functions, classes, variables, etc.)", {
61
+ query: z.string().describe("Symbol name to search for"),
62
+ }, async ({ query }) => {
63
+ try {
64
+ return toolJson(await client.get("/find/symbol", { query }));
65
+ }
66
+ catch (e) {
67
+ return toolError(e);
68
+ }
69
+ });
70
+ server.tool("opencode_file_list", "List files and directories at a path", {
71
+ path: z
72
+ .string()
73
+ .optional()
74
+ .describe("Path to list (defaults to project root)"),
75
+ }, async ({ path }) => {
76
+ try {
77
+ const q = {};
78
+ if (path)
79
+ q.path = path;
80
+ const nodes = (await client.get("/file", q));
81
+ if (!nodes || nodes.length === 0) {
82
+ return toolResult("Empty directory.");
83
+ }
84
+ const formatted = nodes.map((n) => {
85
+ const type = n.type === "directory" ? "[DIR]" : " ";
86
+ return `${type} ${n.name ?? n.path ?? "?"}`;
87
+ }).join("\n");
88
+ return toolResult(formatted);
89
+ }
90
+ catch (e) {
91
+ return toolError(e);
92
+ }
93
+ });
94
+ server.tool("opencode_file_read", "Read the content of a file", {
95
+ path: z.string().describe("File path to read"),
96
+ }, async ({ path }) => {
97
+ try {
98
+ const result = (await client.get("/file/content", { path }));
99
+ // Return the content directly if it's a string
100
+ if (typeof result.content === "string") {
101
+ return toolResult(`File: ${path}\n\n${result.content}`);
102
+ }
103
+ return toolJson(result);
104
+ }
105
+ catch (e) {
106
+ return toolError(e);
107
+ }
108
+ });
109
+ server.tool("opencode_file_status", "Get status for tracked files (VCS changes: modified, added, deleted, etc.)", {}, async () => {
110
+ try {
111
+ const files = (await client.get("/file/status"));
112
+ if (!files || files.length === 0) {
113
+ return toolResult("No tracked file changes.");
114
+ }
115
+ const formatted = files.map((f) => {
116
+ const status = f.status ?? f.type ?? "?";
117
+ const path = f.path ?? f.file ?? "?";
118
+ return `[${status}] ${path}`;
119
+ }).join("\n");
120
+ return toolResult(formatted);
121
+ }
122
+ catch (e) {
123
+ return toolError(e);
124
+ }
125
+ });
126
+ }
127
+ //# sourceMappingURL=file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.js","sourceRoot":"","sources":["../../src/tools/file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { OpenCodeClient } from "../client.js";
3
+ export declare function registerGlobalTools(server: McpServer, client: OpenCodeClient): void;
@@ -0,0 +1,12 @@
1
+ import { toolJson, toolError } from "../helpers.js";
2
+ export function registerGlobalTools(server, client) {
3
+ server.tool("opencode_health", "Check server health and version", {}, async () => {
4
+ try {
5
+ return toolJson(await client.get("/global/health"));
6
+ }
7
+ catch (e) {
8
+ return toolError(e);
9
+ }
10
+ });
11
+ }
12
+ //# sourceMappingURL=global.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global.js","sourceRoot":"","sources":["../../src/tools/global.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAEpD,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,MAAsB;IAC3E,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,iCAAiC,EACjC,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,OAAO,QAAQ,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { OpenCodeClient } from "../client.js";
3
+ export declare function registerMessageTools(server: McpServer, client: OpenCodeClient): void;
@@ -0,0 +1,151 @@
1
+ import { z } from "zod";
2
+ import { toolResult, toolError, formatMessageResponse, formatMessageList, } from "../helpers.js";
3
+ export function registerMessageTools(server, client) {
4
+ server.tool("opencode_message_list", "List all messages in a session with formatted output showing roles and content", {
5
+ sessionId: z.string().describe("Session ID"),
6
+ limit: z
7
+ .number()
8
+ .optional()
9
+ .describe("Maximum number of messages to return"),
10
+ }, async ({ sessionId, limit }) => {
11
+ try {
12
+ const query = {};
13
+ if (limit !== undefined)
14
+ query.limit = String(limit);
15
+ const messages = await client.get(`/session/${sessionId}/message`, query);
16
+ return toolResult(formatMessageList(messages));
17
+ }
18
+ catch (e) {
19
+ return toolError(e);
20
+ }
21
+ });
22
+ server.tool("opencode_message_get", "Get details of a specific message in a session", {
23
+ sessionId: z.string().describe("Session ID"),
24
+ messageId: z.string().describe("Message ID"),
25
+ }, async ({ sessionId, messageId }) => {
26
+ try {
27
+ const msg = await client.get(`/session/${sessionId}/message/${messageId}`);
28
+ return toolResult(formatMessageResponse(msg));
29
+ }
30
+ catch (e) {
31
+ return toolError(e);
32
+ }
33
+ });
34
+ server.tool("opencode_message_send", "Send a prompt message to a session and wait for the AI response. Use parts to send text, and optionally specify a model.", {
35
+ sessionId: z.string().describe("Session ID"),
36
+ text: z.string().describe("The text message to send"),
37
+ providerID: z
38
+ .string()
39
+ .optional()
40
+ .describe("Provider ID (e.g. 'anthropic')"),
41
+ modelID: z
42
+ .string()
43
+ .optional()
44
+ .describe("Model ID (e.g. 'claude-3-5-sonnet-20241022')"),
45
+ agent: z.string().optional().describe("Agent to use"),
46
+ noReply: z
47
+ .boolean()
48
+ .optional()
49
+ .describe("If true, inject context without triggering AI response (useful for plugins)"),
50
+ system: z.string().optional().describe("System prompt override"),
51
+ }, async ({ sessionId, text, providerID, modelID, agent, noReply, system, }) => {
52
+ try {
53
+ const body = {
54
+ parts: [{ type: "text", text }],
55
+ };
56
+ if (providerID && modelID) {
57
+ body.model = { providerID, modelID };
58
+ }
59
+ if (agent)
60
+ body.agent = agent;
61
+ if (noReply !== undefined)
62
+ body.noReply = noReply;
63
+ if (system)
64
+ body.system = system;
65
+ const response = await client.post(`/session/${sessionId}/message`, body);
66
+ return toolResult(formatMessageResponse(response));
67
+ }
68
+ catch (e) {
69
+ return toolError(e);
70
+ }
71
+ });
72
+ server.tool("opencode_message_send_async", "Send a prompt message asynchronously (fire-and-forget, does not wait for response). Use opencode_wait to poll for completion.", {
73
+ sessionId: z.string().describe("Session ID"),
74
+ text: z.string().describe("The text message to send"),
75
+ providerID: z
76
+ .string()
77
+ .optional()
78
+ .describe("Provider ID (e.g. 'anthropic')"),
79
+ modelID: z
80
+ .string()
81
+ .optional()
82
+ .describe("Model ID (e.g. 'claude-3-5-sonnet-20241022')"),
83
+ agent: z.string().optional().describe("Agent to use"),
84
+ }, async ({ sessionId, text, providerID, modelID, agent }) => {
85
+ try {
86
+ const body = {
87
+ parts: [{ type: "text", text }],
88
+ };
89
+ if (providerID && modelID) {
90
+ body.model = { providerID, modelID };
91
+ }
92
+ if (agent)
93
+ body.agent = agent;
94
+ await client.post(`/session/${sessionId}/prompt_async`, body);
95
+ return toolResult("Message sent asynchronously. Use opencode_wait or opencode_message_list to check for responses.");
96
+ }
97
+ catch (e) {
98
+ return toolError(e);
99
+ }
100
+ });
101
+ server.tool("opencode_command_execute", "Execute a slash command in a session (e.g. /init, /undo, /redo)", {
102
+ sessionId: z.string().describe("Session ID"),
103
+ command: z
104
+ .string()
105
+ .describe("The slash command to execute (e.g. 'init', 'undo')"),
106
+ arguments: z
107
+ .string()
108
+ .optional()
109
+ .describe("Arguments for the command"),
110
+ agent: z.string().optional().describe("Agent to use"),
111
+ providerID: z.string().optional().describe("Provider ID"),
112
+ modelID: z.string().optional().describe("Model ID"),
113
+ }, async ({ sessionId, command, arguments: args, agent, providerID, modelID, }) => {
114
+ try {
115
+ const body = {
116
+ command,
117
+ arguments: args ?? "",
118
+ };
119
+ if (agent)
120
+ body.agent = agent;
121
+ if (providerID && modelID) {
122
+ body.model = { providerID, modelID };
123
+ }
124
+ const result = await client.post(`/session/${sessionId}/command`, body);
125
+ return toolResult(formatMessageResponse(result));
126
+ }
127
+ catch (e) {
128
+ return toolError(e);
129
+ }
130
+ });
131
+ server.tool("opencode_shell_execute", "Run a shell command through the opencode session", {
132
+ sessionId: z.string().describe("Session ID"),
133
+ command: z.string().describe("Shell command to execute"),
134
+ agent: z.string().describe("Agent to use for the shell command"),
135
+ providerID: z.string().optional().describe("Provider ID"),
136
+ modelID: z.string().optional().describe("Model ID"),
137
+ }, async ({ sessionId, command, agent, providerID, modelID }) => {
138
+ try {
139
+ const body = { command, agent };
140
+ if (providerID && modelID) {
141
+ body.model = { providerID, modelID };
142
+ }
143
+ const result = await client.post(`/session/${sessionId}/shell`, body);
144
+ return toolResult(formatMessageResponse(result));
145
+ }
146
+ catch (e) {
147
+ return toolError(e);
148
+ }
149
+ });
150
+ }
151
+ //# sourceMappingURL=message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/tools/message.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { OpenCodeClient } from "../client.js";
3
+ export declare function registerMiscTools(server: McpServer, client: OpenCodeClient): void;
@@ -0,0 +1,143 @@
1
+ import { z } from "zod";
2
+ import { toolJson, toolError, toolResult } from "../helpers.js";
3
+ export function registerMiscTools(server, client) {
4
+ // --- Path & VCS ---
5
+ server.tool("opencode_path_get", "Get the current working path of the opencode server", {}, async () => {
6
+ try {
7
+ return toolJson(await client.get("/path"));
8
+ }
9
+ catch (e) {
10
+ return toolError(e);
11
+ }
12
+ });
13
+ server.tool("opencode_vcs_info", "Get VCS (version control) info for the current project (branch, remote, status)", {}, async () => {
14
+ try {
15
+ return toolJson(await client.get("/vcs"));
16
+ }
17
+ catch (e) {
18
+ return toolError(e);
19
+ }
20
+ });
21
+ // --- Instance ---
22
+ server.tool("opencode_instance_dispose", "Dispose the current opencode instance (shuts it down)", {}, async () => {
23
+ try {
24
+ await client.post("/instance/dispose");
25
+ return toolResult("Instance disposed.");
26
+ }
27
+ catch (e) {
28
+ return toolError(e);
29
+ }
30
+ });
31
+ // --- Agents ---
32
+ server.tool("opencode_agent_list", "List all available agents with their names, descriptions, and modes (primary/subagent)", {}, async () => {
33
+ try {
34
+ const agents = (await client.get("/agent"));
35
+ if (!agents || agents.length === 0) {
36
+ return toolResult("No agents found.");
37
+ }
38
+ const formatted = agents.map((a) => {
39
+ const name = a.name ?? a.id ?? "?";
40
+ const mode = a.mode ?? "?";
41
+ const desc = a.description ?? "(no description)";
42
+ return `- ${name} [${mode}]: ${desc}`;
43
+ }).join("\n");
44
+ return toolResult(formatted);
45
+ }
46
+ catch (e) {
47
+ return toolError(e);
48
+ }
49
+ });
50
+ // --- Commands ---
51
+ server.tool("opencode_command_list", "List all available commands (built-in and custom slash commands)", {}, async () => {
52
+ try {
53
+ return toolJson(await client.get("/command"));
54
+ }
55
+ catch (e) {
56
+ return toolError(e);
57
+ }
58
+ });
59
+ // --- LSP ---
60
+ server.tool("opencode_lsp_status", "Get the status of LSP (Language Server Protocol) servers", {}, async () => {
61
+ try {
62
+ return toolJson(await client.get("/lsp"));
63
+ }
64
+ catch (e) {
65
+ return toolError(e);
66
+ }
67
+ });
68
+ // --- Formatter ---
69
+ server.tool("opencode_formatter_status", "Get the status of configured formatters", {}, async () => {
70
+ try {
71
+ return toolJson(await client.get("/formatter"));
72
+ }
73
+ catch (e) {
74
+ return toolError(e);
75
+ }
76
+ });
77
+ // --- MCP servers ---
78
+ server.tool("opencode_mcp_status", "Get the status of all MCP servers configured in opencode", {}, async () => {
79
+ try {
80
+ return toolJson(await client.get("/mcp"));
81
+ }
82
+ catch (e) {
83
+ return toolError(e);
84
+ }
85
+ });
86
+ server.tool("opencode_mcp_add", "Add an MCP server dynamically to opencode", {
87
+ name: z.string().describe("Name for the MCP server"),
88
+ config: z
89
+ .record(z.string(), z.unknown())
90
+ .describe("MCP server configuration object"),
91
+ }, async ({ name, config }) => {
92
+ try {
93
+ return toolJson(await client.post("/mcp", { name, config }));
94
+ }
95
+ catch (e) {
96
+ return toolError(e);
97
+ }
98
+ });
99
+ // --- Tools (Experimental) ---
100
+ server.tool("opencode_tool_ids", "List all available tool IDs that the LLM can use (experimental)", {}, async () => {
101
+ try {
102
+ return toolJson(await client.get("/experimental/tool/ids"));
103
+ }
104
+ catch (e) {
105
+ return toolError(e);
106
+ }
107
+ });
108
+ server.tool("opencode_tool_list", "List tools with JSON schemas for a given provider and model (experimental)", {
109
+ provider: z.string().describe("Provider ID"),
110
+ model: z.string().describe("Model ID"),
111
+ }, async ({ provider, model }) => {
112
+ try {
113
+ return toolJson(await client.get("/experimental/tool", { provider, model }));
114
+ }
115
+ catch (e) {
116
+ return toolError(e);
117
+ }
118
+ });
119
+ // --- Logging ---
120
+ server.tool("opencode_log", "Write a log entry to the opencode server", {
121
+ service: z.string().describe("Service name for the log entry"),
122
+ level: z
123
+ .enum(["debug", "info", "warn", "error"])
124
+ .describe("Log level"),
125
+ message: z.string().describe("Log message"),
126
+ extra: z
127
+ .record(z.string(), z.unknown())
128
+ .optional()
129
+ .describe("Extra data to include in the log entry"),
130
+ }, async ({ service, level, message, extra }) => {
131
+ try {
132
+ const body = { service, level, message };
133
+ if (extra)
134
+ body.extra = extra;
135
+ await client.post("/log", body);
136
+ return toolResult(`Log entry written [${level}] ${service}: ${message}`);
137
+ }
138
+ catch (e) {
139
+ return toolError(e);
140
+ }
141
+ });
142
+ }
143
+ //# sourceMappingURL=misc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"misc.js","sourceRoot":"","sources":["../../src/tools/misc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { OpenCodeClient } from "../client.js";
3
+ export declare function registerProjectTools(server: McpServer, client: OpenCodeClient): void;
@@ -0,0 +1,20 @@
1
+ import { toolJson, toolError } from "../helpers.js";
2
+ export function registerProjectTools(server, client) {
3
+ server.tool("opencode_project_list", "List all projects known to the opencode server", {}, async () => {
4
+ try {
5
+ return toolJson(await client.get("/project"));
6
+ }
7
+ catch (e) {
8
+ return toolError(e);
9
+ }
10
+ });
11
+ server.tool("opencode_project_current", "Get the current active project", {}, async () => {
12
+ try {
13
+ return toolJson(await client.get("/project/current"));
14
+ }
15
+ catch (e) {
16
+ return toolError(e);
17
+ }
18
+ });
19
+ }
20
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/tools/project.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAEpD,MAAM,UAAU,oBAAoB,CAClC,MAAiB,EACjB,MAAsB;IAEtB,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,gDAAgD,EAChD,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,OAAO,QAAQ,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,0BAA0B,EAC1B,gCAAgC,EAChC,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,OAAO,QAAQ,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { OpenCodeClient } from "../client.js";
3
+ export declare function registerProviderTools(server: McpServer, client: OpenCodeClient): void;