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.
- package/CHANGELOG.md +25 -0
- package/LICENSE +21 -0
- package/README.md +241 -0
- package/dist/client.d.ts +49 -0
- package/dist/client.js +197 -0
- package/dist/client.js.map +1 -0
- package/dist/helpers.d.ts +53 -0
- package/dist/helpers.js +132 -0
- package/dist/helpers.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.js +86 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts.d.ts +9 -0
- package/dist/prompts.js +144 -0
- package/dist/prompts.js.map +1 -0
- package/dist/resources.d.ts +10 -0
- package/dist/resources.js +197 -0
- package/dist/resources.js.map +1 -0
- package/dist/tools/config.d.ts +3 -0
- package/dist/tools/config.js +33 -0
- package/dist/tools/config.js.map +1 -0
- package/dist/tools/events.d.ts +6 -0
- package/dist/tools/events.js +59 -0
- package/dist/tools/events.js.map +1 -0
- package/dist/tools/file.d.ts +3 -0
- package/dist/tools/file.js +127 -0
- package/dist/tools/file.js.map +1 -0
- package/dist/tools/global.d.ts +3 -0
- package/dist/tools/global.js +12 -0
- package/dist/tools/global.js.map +1 -0
- package/dist/tools/message.d.ts +3 -0
- package/dist/tools/message.js +151 -0
- package/dist/tools/message.js.map +1 -0
- package/dist/tools/misc.d.ts +3 -0
- package/dist/tools/misc.js +143 -0
- package/dist/tools/misc.js.map +1 -0
- package/dist/tools/project.d.ts +3 -0
- package/dist/tools/project.js +20 -0
- package/dist/tools/project.js.map +1 -0
- package/dist/tools/provider.d.ts +3 -0
- package/dist/tools/provider.js +58 -0
- package/dist/tools/provider.js.map +1 -0
- package/dist/tools/session.d.ts +3 -0
- package/dist/tools/session.js +223 -0
- package/dist/tools/session.js.map +1 -0
- package/dist/tools/tui.d.ts +7 -0
- package/dist/tools/tui.js +106 -0
- package/dist/tools/tui.js.map +1 -0
- package/dist/tools/workflow.d.ts +7 -0
- package/dist/tools/workflow.js +215 -0
- package/dist/tools/workflow.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { toolJson, toolError, toolResult } from "../helpers.js";
|
|
3
|
+
export function registerProviderTools(server, client) {
|
|
4
|
+
server.tool("opencode_provider_list", "List all providers, default models, and connected providers", {}, async () => {
|
|
5
|
+
try {
|
|
6
|
+
return toolJson(await client.get("/provider"));
|
|
7
|
+
}
|
|
8
|
+
catch (e) {
|
|
9
|
+
return toolError(e);
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
server.tool("opencode_provider_auth_methods", "Get available authentication methods for all providers", {}, async () => {
|
|
13
|
+
try {
|
|
14
|
+
return toolJson(await client.get("/provider/auth"));
|
|
15
|
+
}
|
|
16
|
+
catch (e) {
|
|
17
|
+
return toolError(e);
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
server.tool("opencode_provider_oauth_authorize", "Start OAuth authorization for a provider", {
|
|
21
|
+
providerId: z.string().describe("Provider ID to authorize"),
|
|
22
|
+
}, async ({ providerId }) => {
|
|
23
|
+
try {
|
|
24
|
+
return toolJson(await client.post(`/provider/${providerId}/oauth/authorize`));
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
return toolError(e);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
server.tool("opencode_provider_oauth_callback", "Handle OAuth callback for a provider", {
|
|
31
|
+
providerId: z.string().describe("Provider ID"),
|
|
32
|
+
callbackData: z
|
|
33
|
+
.record(z.string(), z.unknown())
|
|
34
|
+
.describe("OAuth callback data"),
|
|
35
|
+
}, async ({ providerId, callbackData }) => {
|
|
36
|
+
try {
|
|
37
|
+
await client.post(`/provider/${providerId}/oauth/callback`, callbackData);
|
|
38
|
+
return toolResult("OAuth callback processed.");
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
return toolError(e);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
server.tool("opencode_auth_set", "Set authentication credentials for a provider (e.g. API key)", {
|
|
45
|
+
providerId: z.string().describe("Provider ID (e.g. 'anthropic')"),
|
|
46
|
+
type: z.string().describe("Auth type (e.g. 'api')"),
|
|
47
|
+
key: z.string().describe("API key or credential value"),
|
|
48
|
+
}, async ({ providerId, type, key }) => {
|
|
49
|
+
try {
|
|
50
|
+
await client.put(`/auth/${providerId}`, { type, key });
|
|
51
|
+
return toolResult(`Auth credentials set for ${providerId}.`);
|
|
52
|
+
}
|
|
53
|
+
catch (e) {
|
|
54
|
+
return toolError(e);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/tools/provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { toolJson, toolError, formatSessionList, toolResult } from "../helpers.js";
|
|
3
|
+
export function registerSessionTools(server, client) {
|
|
4
|
+
server.tool("opencode_session_list", "List all sessions", {}, async () => {
|
|
5
|
+
try {
|
|
6
|
+
const sessions = (await client.get("/session"));
|
|
7
|
+
return toolResult(formatSessionList(sessions));
|
|
8
|
+
}
|
|
9
|
+
catch (e) {
|
|
10
|
+
return toolError(e);
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
server.tool("opencode_session_create", "Create a new session. Optionally provide a parentID to create a child session, and a title.", {
|
|
14
|
+
parentID: z.string().optional().describe("Parent session ID"),
|
|
15
|
+
title: z.string().optional().describe("Session title"),
|
|
16
|
+
}, async ({ parentID, title }) => {
|
|
17
|
+
try {
|
|
18
|
+
const body = {};
|
|
19
|
+
if (parentID)
|
|
20
|
+
body.parentID = parentID;
|
|
21
|
+
if (title)
|
|
22
|
+
body.title = title;
|
|
23
|
+
return toolJson(await client.post("/session", body));
|
|
24
|
+
}
|
|
25
|
+
catch (e) {
|
|
26
|
+
return toolError(e);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
server.tool("opencode_session_get", "Get details of a specific session by ID", {
|
|
30
|
+
id: z.string().describe("Session ID"),
|
|
31
|
+
}, async ({ id }) => {
|
|
32
|
+
try {
|
|
33
|
+
return toolJson(await client.get(`/session/${id}`));
|
|
34
|
+
}
|
|
35
|
+
catch (e) {
|
|
36
|
+
return toolError(e);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
server.tool("opencode_session_delete", "Delete a session and all its data", {
|
|
40
|
+
id: z.string().describe("Session ID to delete"),
|
|
41
|
+
}, async ({ id }) => {
|
|
42
|
+
try {
|
|
43
|
+
await client.delete(`/session/${id}`);
|
|
44
|
+
return toolResult(`Session ${id} deleted.`);
|
|
45
|
+
}
|
|
46
|
+
catch (e) {
|
|
47
|
+
return toolError(e);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
server.tool("opencode_session_update", "Update session properties (e.g. title)", {
|
|
51
|
+
id: z.string().describe("Session ID"),
|
|
52
|
+
title: z.string().optional().describe("New title for the session"),
|
|
53
|
+
}, async ({ id, title }) => {
|
|
54
|
+
try {
|
|
55
|
+
const body = {};
|
|
56
|
+
if (title !== undefined)
|
|
57
|
+
body.title = title;
|
|
58
|
+
return toolJson(await client.patch(`/session/${id}`, body));
|
|
59
|
+
}
|
|
60
|
+
catch (e) {
|
|
61
|
+
return toolError(e);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
server.tool("opencode_session_children", "Get child sessions of a session", {
|
|
65
|
+
id: z.string().describe("Parent session ID"),
|
|
66
|
+
}, async ({ id }) => {
|
|
67
|
+
try {
|
|
68
|
+
return toolJson(await client.get(`/session/${id}/children`));
|
|
69
|
+
}
|
|
70
|
+
catch (e) {
|
|
71
|
+
return toolError(e);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
server.tool("opencode_session_status", "Get status for all sessions (running, idle, etc.)", {}, async () => {
|
|
75
|
+
try {
|
|
76
|
+
return toolJson(await client.get("/session/status"));
|
|
77
|
+
}
|
|
78
|
+
catch (e) {
|
|
79
|
+
return toolError(e);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
server.tool("opencode_session_todo", "Get the todo list for a session", {
|
|
83
|
+
id: z.string().describe("Session ID"),
|
|
84
|
+
}, async ({ id }) => {
|
|
85
|
+
try {
|
|
86
|
+
return toolJson(await client.get(`/session/${id}/todo`));
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
return toolError(e);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
server.tool("opencode_session_init", "Analyze the app and create AGENTS.md for a session", {
|
|
93
|
+
id: z.string().describe("Session ID"),
|
|
94
|
+
messageID: z.string().describe("Message ID"),
|
|
95
|
+
providerID: z.string().describe("Provider ID (e.g. 'anthropic')"),
|
|
96
|
+
modelID: z.string().describe("Model ID (e.g. 'claude-3-5-sonnet-20241022')"),
|
|
97
|
+
}, async ({ id, messageID, providerID, modelID }) => {
|
|
98
|
+
try {
|
|
99
|
+
await client.post(`/session/${id}/init`, { messageID, providerID, modelID });
|
|
100
|
+
return toolResult("AGENTS.md initialization started.");
|
|
101
|
+
}
|
|
102
|
+
catch (e) {
|
|
103
|
+
return toolError(e);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
server.tool("opencode_session_abort", "Abort a running session", {
|
|
107
|
+
id: z.string().describe("Session ID to abort"),
|
|
108
|
+
}, async ({ id }) => {
|
|
109
|
+
try {
|
|
110
|
+
await client.post(`/session/${id}/abort`);
|
|
111
|
+
return toolResult(`Session ${id} aborted.`);
|
|
112
|
+
}
|
|
113
|
+
catch (e) {
|
|
114
|
+
return toolError(e);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
server.tool("opencode_session_fork", "Fork an existing session, optionally at a specific message", {
|
|
118
|
+
id: z.string().describe("Session ID to fork"),
|
|
119
|
+
messageID: z.string().optional().describe("Message ID to fork at (optional)"),
|
|
120
|
+
}, async ({ id, messageID }) => {
|
|
121
|
+
try {
|
|
122
|
+
const body = {};
|
|
123
|
+
if (messageID)
|
|
124
|
+
body.messageID = messageID;
|
|
125
|
+
return toolJson(await client.post(`/session/${id}/fork`, body));
|
|
126
|
+
}
|
|
127
|
+
catch (e) {
|
|
128
|
+
return toolError(e);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
server.tool("opencode_session_share", "Share a session publicly", {
|
|
132
|
+
id: z.string().describe("Session ID to share"),
|
|
133
|
+
}, async ({ id }) => {
|
|
134
|
+
try {
|
|
135
|
+
return toolJson(await client.post(`/session/${id}/share`));
|
|
136
|
+
}
|
|
137
|
+
catch (e) {
|
|
138
|
+
return toolError(e);
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
server.tool("opencode_session_unshare", "Unshare a previously shared session", {
|
|
142
|
+
id: z.string().describe("Session ID to unshare"),
|
|
143
|
+
}, async ({ id }) => {
|
|
144
|
+
try {
|
|
145
|
+
return toolJson(await client.delete(`/session/${id}/share`));
|
|
146
|
+
}
|
|
147
|
+
catch (e) {
|
|
148
|
+
return toolError(e);
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
server.tool("opencode_session_diff", "Get the diff for a session, optionally for a specific message", {
|
|
152
|
+
id: z.string().describe("Session ID"),
|
|
153
|
+
messageID: z.string().optional().describe("Message ID (optional)"),
|
|
154
|
+
}, async ({ id, messageID }) => {
|
|
155
|
+
try {
|
|
156
|
+
const query = {};
|
|
157
|
+
if (messageID)
|
|
158
|
+
query.messageID = messageID;
|
|
159
|
+
return toolJson(await client.get(`/session/${id}/diff`, query));
|
|
160
|
+
}
|
|
161
|
+
catch (e) {
|
|
162
|
+
return toolError(e);
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
server.tool("opencode_session_summarize", "Summarize a session using a specified model", {
|
|
166
|
+
id: z.string().describe("Session ID"),
|
|
167
|
+
providerID: z.string().describe("Provider ID (e.g. 'anthropic')"),
|
|
168
|
+
modelID: z.string().describe("Model ID (e.g. 'claude-3-5-sonnet-20241022')"),
|
|
169
|
+
}, async ({ id, providerID, modelID }) => {
|
|
170
|
+
try {
|
|
171
|
+
await client.post(`/session/${id}/summarize`, { providerID, modelID });
|
|
172
|
+
return toolResult("Session summarization started.");
|
|
173
|
+
}
|
|
174
|
+
catch (e) {
|
|
175
|
+
return toolError(e);
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
server.tool("opencode_session_revert", "Revert a message in a session", {
|
|
179
|
+
id: z.string().describe("Session ID"),
|
|
180
|
+
messageID: z.string().describe("Message ID to revert"),
|
|
181
|
+
partID: z.string().optional().describe("Part ID to revert (optional)"),
|
|
182
|
+
}, async ({ id, messageID, partID }) => {
|
|
183
|
+
try {
|
|
184
|
+
const body = { messageID };
|
|
185
|
+
if (partID)
|
|
186
|
+
body.partID = partID;
|
|
187
|
+
await client.post(`/session/${id}/revert`, body);
|
|
188
|
+
return toolResult(`Message ${messageID} reverted.`);
|
|
189
|
+
}
|
|
190
|
+
catch (e) {
|
|
191
|
+
return toolError(e);
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
server.tool("opencode_session_unrevert", "Restore all reverted messages in a session", {
|
|
195
|
+
id: z.string().describe("Session ID"),
|
|
196
|
+
}, async ({ id }) => {
|
|
197
|
+
try {
|
|
198
|
+
await client.post(`/session/${id}/unrevert`);
|
|
199
|
+
return toolResult("All reverted messages restored.");
|
|
200
|
+
}
|
|
201
|
+
catch (e) {
|
|
202
|
+
return toolError(e);
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
server.tool("opencode_session_permission", "Respond to a permission request in a session", {
|
|
206
|
+
id: z.string().describe("Session ID"),
|
|
207
|
+
permissionID: z.string().describe("Permission request ID"),
|
|
208
|
+
response: z.string().describe("Response to the permission request"),
|
|
209
|
+
remember: z.boolean().optional().describe("Whether to remember this decision"),
|
|
210
|
+
}, async ({ id, permissionID, response, remember }) => {
|
|
211
|
+
try {
|
|
212
|
+
const body = { response };
|
|
213
|
+
if (remember !== undefined)
|
|
214
|
+
body.remember = remember;
|
|
215
|
+
await client.post(`/session/${id}/permissions/${permissionID}`, body);
|
|
216
|
+
return toolResult("Permission response sent.");
|
|
217
|
+
}
|
|
218
|
+
catch (e) {
|
|
219
|
+
return toolError(e);
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/tools/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TUI control tools — drive the OpenCode TUI remotely.
|
|
3
|
+
* Useful for IDE integrations and automation.
|
|
4
|
+
*/
|
|
5
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
6
|
+
import { OpenCodeClient } from "../client.js";
|
|
7
|
+
export declare function registerTuiTools(server: McpServer, client: OpenCodeClient): void;
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TUI control tools — drive the OpenCode TUI remotely.
|
|
3
|
+
* Useful for IDE integrations and automation.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { toolResult, toolError } from "../helpers.js";
|
|
7
|
+
export function registerTuiTools(server, client) {
|
|
8
|
+
server.tool("opencode_tui_append_prompt", "Append text to the TUI's prompt input field", {
|
|
9
|
+
text: z.string().describe("Text to append to the prompt"),
|
|
10
|
+
}, async ({ text }) => {
|
|
11
|
+
try {
|
|
12
|
+
await client.post("/tui/append-prompt", { text });
|
|
13
|
+
return toolResult("Text appended to prompt.");
|
|
14
|
+
}
|
|
15
|
+
catch (e) {
|
|
16
|
+
return toolError(e);
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
server.tool("opencode_tui_submit_prompt", "Submit the current prompt in the TUI (equivalent to pressing Enter)", {}, async () => {
|
|
20
|
+
try {
|
|
21
|
+
await client.post("/tui/submit-prompt");
|
|
22
|
+
return toolResult("Prompt submitted.");
|
|
23
|
+
}
|
|
24
|
+
catch (e) {
|
|
25
|
+
return toolError(e);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
server.tool("opencode_tui_clear_prompt", "Clear the current prompt text in the TUI", {}, async () => {
|
|
29
|
+
try {
|
|
30
|
+
await client.post("/tui/clear-prompt");
|
|
31
|
+
return toolResult("Prompt cleared.");
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
return toolError(e);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
server.tool("opencode_tui_execute_command", "Execute a slash command through the TUI (e.g. '/init', '/undo')", {
|
|
38
|
+
command: z.string().describe("Command to execute (e.g. '/init')"),
|
|
39
|
+
}, async ({ command }) => {
|
|
40
|
+
try {
|
|
41
|
+
await client.post("/tui/execute-command", { command });
|
|
42
|
+
return toolResult(`Command '${command}' executed.`);
|
|
43
|
+
}
|
|
44
|
+
catch (e) {
|
|
45
|
+
return toolError(e);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
server.tool("opencode_tui_show_toast", "Show a toast notification in the TUI", {
|
|
49
|
+
message: z.string().describe("Toast message text"),
|
|
50
|
+
title: z.string().optional().describe("Optional toast title"),
|
|
51
|
+
variant: z
|
|
52
|
+
.enum(["info", "success", "warning", "error"])
|
|
53
|
+
.optional()
|
|
54
|
+
.describe("Toast variant (default: info)"),
|
|
55
|
+
}, async ({ message, title, variant }) => {
|
|
56
|
+
try {
|
|
57
|
+
const body = { message };
|
|
58
|
+
if (title)
|
|
59
|
+
body.title = title;
|
|
60
|
+
if (variant)
|
|
61
|
+
body.variant = variant;
|
|
62
|
+
await client.post("/tui/show-toast", body);
|
|
63
|
+
return toolResult("Toast shown.");
|
|
64
|
+
}
|
|
65
|
+
catch (e) {
|
|
66
|
+
return toolError(e);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
server.tool("opencode_tui_open_help", "Open the help dialog in the TUI", {}, async () => {
|
|
70
|
+
try {
|
|
71
|
+
await client.post("/tui/open-help");
|
|
72
|
+
return toolResult("Help dialog opened.");
|
|
73
|
+
}
|
|
74
|
+
catch (e) {
|
|
75
|
+
return toolError(e);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
server.tool("opencode_tui_open_sessions", "Open the session selector in the TUI", {}, async () => {
|
|
79
|
+
try {
|
|
80
|
+
await client.post("/tui/open-sessions");
|
|
81
|
+
return toolResult("Session selector opened.");
|
|
82
|
+
}
|
|
83
|
+
catch (e) {
|
|
84
|
+
return toolError(e);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
server.tool("opencode_tui_open_models", "Open the model selector in the TUI", {}, async () => {
|
|
88
|
+
try {
|
|
89
|
+
await client.post("/tui/open-models");
|
|
90
|
+
return toolResult("Model selector opened.");
|
|
91
|
+
}
|
|
92
|
+
catch (e) {
|
|
93
|
+
return toolError(e);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
server.tool("opencode_tui_open_themes", "Open the theme selector in the TUI", {}, async () => {
|
|
97
|
+
try {
|
|
98
|
+
await client.post("/tui/open-themes");
|
|
99
|
+
return toolResult("Theme selector opened.");
|
|
100
|
+
}
|
|
101
|
+
catch (e) {
|
|
102
|
+
return toolError(e);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=tui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui.js","sourceRoot":"","sources":["../../src/tools/tui.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* High-level workflow tools — composite operations that make it easy
|
|
3
|
+
* for an LLM to accomplish common tasks in a single call.
|
|
4
|
+
*/
|
|
5
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
6
|
+
import { OpenCodeClient } from "../client.js";
|
|
7
|
+
export declare function registerWorkflowTools(server: McpServer, client: OpenCodeClient): void;
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* High-level workflow tools — composite operations that make it easy
|
|
3
|
+
* for an LLM to accomplish common tasks in a single call.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { formatMessageResponse, formatMessageList, formatSessionList, toolResult, toolError, } from "../helpers.js";
|
|
7
|
+
export function registerWorkflowTools(server, client) {
|
|
8
|
+
// ─── One-shot: create session + send prompt + return answer ─────────
|
|
9
|
+
server.tool("opencode_ask", "Ask OpenCode a question in one step. Creates a new session, sends your prompt, and returns the AI response. This is the easiest way to interact with OpenCode.", {
|
|
10
|
+
prompt: z.string().describe("The question or instruction to send"),
|
|
11
|
+
title: z
|
|
12
|
+
.string()
|
|
13
|
+
.optional()
|
|
14
|
+
.describe("Optional title for the session"),
|
|
15
|
+
providerID: z
|
|
16
|
+
.string()
|
|
17
|
+
.optional()
|
|
18
|
+
.describe("Provider ID (e.g. 'anthropic')"),
|
|
19
|
+
modelID: z
|
|
20
|
+
.string()
|
|
21
|
+
.optional()
|
|
22
|
+
.describe("Model ID (e.g. 'claude-3-5-sonnet-20241022')"),
|
|
23
|
+
agent: z
|
|
24
|
+
.string()
|
|
25
|
+
.optional()
|
|
26
|
+
.describe("Agent to use (e.g. 'build', 'plan')"),
|
|
27
|
+
system: z
|
|
28
|
+
.string()
|
|
29
|
+
.optional()
|
|
30
|
+
.describe("Optional system prompt override"),
|
|
31
|
+
}, async ({ prompt, title, providerID, modelID, agent, system }) => {
|
|
32
|
+
try {
|
|
33
|
+
// 1. Create session
|
|
34
|
+
const session = (await client.post("/session", {
|
|
35
|
+
title: title ?? prompt.slice(0, 80),
|
|
36
|
+
}));
|
|
37
|
+
const sessionId = session.id;
|
|
38
|
+
// 2. Send prompt
|
|
39
|
+
const body = {
|
|
40
|
+
parts: [{ type: "text", text: prompt }],
|
|
41
|
+
};
|
|
42
|
+
if (providerID && modelID) {
|
|
43
|
+
body.model = { providerID, modelID };
|
|
44
|
+
}
|
|
45
|
+
if (agent)
|
|
46
|
+
body.agent = agent;
|
|
47
|
+
if (system)
|
|
48
|
+
body.system = system;
|
|
49
|
+
const response = await client.post(`/session/${sessionId}/message`, body);
|
|
50
|
+
// 3. Format and return
|
|
51
|
+
const formatted = formatMessageResponse(response);
|
|
52
|
+
return toolResult(`Session: ${sessionId}\n\n${formatted}`);
|
|
53
|
+
}
|
|
54
|
+
catch (e) {
|
|
55
|
+
return toolError(e);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
// ─── Continue a conversation ────────────────────────────────────────
|
|
59
|
+
server.tool("opencode_reply", "Send a follow-up message to an existing session. Use this to continue a conversation started with opencode_ask or opencode_session_create.", {
|
|
60
|
+
sessionId: z.string().describe("Session ID to reply in"),
|
|
61
|
+
prompt: z.string().describe("The follow-up message"),
|
|
62
|
+
providerID: z.string().optional().describe("Provider ID"),
|
|
63
|
+
modelID: z.string().optional().describe("Model ID"),
|
|
64
|
+
agent: z.string().optional().describe("Agent to use"),
|
|
65
|
+
}, async ({ sessionId, prompt, providerID, modelID, agent }) => {
|
|
66
|
+
try {
|
|
67
|
+
const body = {
|
|
68
|
+
parts: [{ type: "text", text: prompt }],
|
|
69
|
+
};
|
|
70
|
+
if (providerID && modelID) {
|
|
71
|
+
body.model = { providerID, modelID };
|
|
72
|
+
}
|
|
73
|
+
if (agent)
|
|
74
|
+
body.agent = agent;
|
|
75
|
+
const response = await client.post(`/session/${sessionId}/message`, body);
|
|
76
|
+
const formatted = formatMessageResponse(response);
|
|
77
|
+
return toolResult(formatted);
|
|
78
|
+
}
|
|
79
|
+
catch (e) {
|
|
80
|
+
return toolError(e);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
// ─── Get conversation history (formatted) ──────────────────────────
|
|
84
|
+
server.tool("opencode_conversation", "Get the full conversation history of a session, formatted for easy reading. Shows all messages with their roles and content.", {
|
|
85
|
+
sessionId: z.string().describe("Session ID"),
|
|
86
|
+
limit: z
|
|
87
|
+
.number()
|
|
88
|
+
.optional()
|
|
89
|
+
.describe("Max messages to return (default: all)"),
|
|
90
|
+
}, async ({ sessionId, limit }) => {
|
|
91
|
+
try {
|
|
92
|
+
const query = {};
|
|
93
|
+
if (limit !== undefined)
|
|
94
|
+
query.limit = String(limit);
|
|
95
|
+
const messages = await client.get(`/session/${sessionId}/message`, query);
|
|
96
|
+
const formatted = formatMessageList(messages);
|
|
97
|
+
return toolResult(formatted);
|
|
98
|
+
}
|
|
99
|
+
catch (e) {
|
|
100
|
+
return toolError(e);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
// ─── Quick session overview ────────────────────────────────────────
|
|
104
|
+
server.tool("opencode_sessions_overview", "Get a quick overview of all sessions with their titles and status. Useful to find which session to continue working in.", {}, async () => {
|
|
105
|
+
try {
|
|
106
|
+
const [sessions, statuses] = await Promise.all([
|
|
107
|
+
client.get("/session"),
|
|
108
|
+
client.get("/session/status"),
|
|
109
|
+
]);
|
|
110
|
+
// Merge status into session info
|
|
111
|
+
const enriched = sessions.map((s) => ({
|
|
112
|
+
...s,
|
|
113
|
+
status: statuses[s.id] ?? "unknown",
|
|
114
|
+
}));
|
|
115
|
+
const formatted = formatSessionList(enriched);
|
|
116
|
+
return toolResult(formatted);
|
|
117
|
+
}
|
|
118
|
+
catch (e) {
|
|
119
|
+
return toolError(e);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
// ─── Project context ──────────────────────────────────────────────
|
|
123
|
+
server.tool("opencode_context", "Get full project context in one call: current project, path, VCS info, config, and available agents. Useful to understand the current state before starting work.", {}, async () => {
|
|
124
|
+
try {
|
|
125
|
+
const [project, path, vcs, config, agents] = await Promise.all([
|
|
126
|
+
client.get("/project/current").catch(() => null),
|
|
127
|
+
client.get("/path").catch(() => null),
|
|
128
|
+
client.get("/vcs").catch(() => null),
|
|
129
|
+
client.get("/config").catch(() => null),
|
|
130
|
+
client.get("/agent").catch(() => null),
|
|
131
|
+
]);
|
|
132
|
+
const sections = [];
|
|
133
|
+
if (project) {
|
|
134
|
+
sections.push(`## Project\n${JSON.stringify(project, null, 2)}`);
|
|
135
|
+
}
|
|
136
|
+
if (path) {
|
|
137
|
+
sections.push(`## Path\n${JSON.stringify(path, null, 2)}`);
|
|
138
|
+
}
|
|
139
|
+
if (vcs) {
|
|
140
|
+
sections.push(`## VCS (Git)\n${JSON.stringify(vcs, null, 2)}`);
|
|
141
|
+
}
|
|
142
|
+
if (config) {
|
|
143
|
+
sections.push(`## Config\n${JSON.stringify(config, null, 2)}`);
|
|
144
|
+
}
|
|
145
|
+
if (agents) {
|
|
146
|
+
const agentList = agents;
|
|
147
|
+
sections.push(`## Agents (${agentList.length})\n${agentList.map((a) => `- ${a.name ?? a.id}: ${a.description ?? "(no description)"} [${a.mode ?? "?"}]`).join("\n")}`);
|
|
148
|
+
}
|
|
149
|
+
return toolResult(sections.join("\n\n"));
|
|
150
|
+
}
|
|
151
|
+
catch (e) {
|
|
152
|
+
return toolError(e);
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
// ─── Wait for async session to complete ───────────────────────────
|
|
156
|
+
server.tool("opencode_wait", "Poll a session until it finishes processing. Use this after opencode_message_send_async to wait for the AI to complete its response.", {
|
|
157
|
+
sessionId: z.string().describe("Session ID to wait on"),
|
|
158
|
+
timeoutSeconds: z
|
|
159
|
+
.number()
|
|
160
|
+
.optional()
|
|
161
|
+
.describe("Max seconds to wait (default: 120)"),
|
|
162
|
+
pollIntervalMs: z
|
|
163
|
+
.number()
|
|
164
|
+
.optional()
|
|
165
|
+
.describe("Polling interval in ms (default: 2000)"),
|
|
166
|
+
}, async ({ sessionId, timeoutSeconds, pollIntervalMs }) => {
|
|
167
|
+
try {
|
|
168
|
+
const timeout = (timeoutSeconds ?? 120) * 1000;
|
|
169
|
+
const interval = pollIntervalMs ?? 2000;
|
|
170
|
+
const start = Date.now();
|
|
171
|
+
while (Date.now() - start < timeout) {
|
|
172
|
+
const statuses = (await client.get("/session/status"));
|
|
173
|
+
const status = statuses[sessionId];
|
|
174
|
+
if (!status || status === "idle" || status === "completed") {
|
|
175
|
+
// Fetch latest messages
|
|
176
|
+
const messages = await client.get(`/session/${sessionId}/message`, { limit: "1" });
|
|
177
|
+
const arr = messages;
|
|
178
|
+
if (arr.length > 0) {
|
|
179
|
+
return toolResult(`Session completed.\n\n${formatMessageResponse(arr[arr.length - 1])}`);
|
|
180
|
+
}
|
|
181
|
+
return toolResult("Session completed (no messages).");
|
|
182
|
+
}
|
|
183
|
+
if (status === "error") {
|
|
184
|
+
return toolResult(`Session ended with error status.`, true);
|
|
185
|
+
}
|
|
186
|
+
await new Promise((r) => setTimeout(r, interval));
|
|
187
|
+
}
|
|
188
|
+
return toolResult(`Timeout: session still processing after ${timeoutSeconds ?? 120}s`, true);
|
|
189
|
+
}
|
|
190
|
+
catch (e) {
|
|
191
|
+
return toolError(e);
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
// ─── Review changes ────────────────────────────────────────────────
|
|
195
|
+
server.tool("opencode_review_changes", "Get a formatted summary of all file changes made in a session. Shows diffs in a readable format.", {
|
|
196
|
+
sessionId: z.string().describe("Session ID"),
|
|
197
|
+
messageID: z
|
|
198
|
+
.string()
|
|
199
|
+
.optional()
|
|
200
|
+
.describe("Specific message ID to get diff for"),
|
|
201
|
+
}, async ({ sessionId, messageID }) => {
|
|
202
|
+
try {
|
|
203
|
+
const query = {};
|
|
204
|
+
if (messageID)
|
|
205
|
+
query.messageID = messageID;
|
|
206
|
+
const diffs = await client.get(`/session/${sessionId}/diff`, query);
|
|
207
|
+
const { formatDiffResponse } = await import("../helpers.js");
|
|
208
|
+
return toolResult(formatDiffResponse(diffs));
|
|
209
|
+
}
|
|
210
|
+
catch (e) {
|
|
211
|
+
return toolError(e);
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=workflow.js.map
|