@mekareteriker/opencode-mcp 1.10.2-mekareteriker.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 +204 -0
- package/LICENSE +22 -0
- package/README.md +174 -0
- package/dist/client.d.ts +60 -0
- package/dist/client.js +282 -0
- package/dist/client.js.map +1 -0
- package/dist/helpers.d.ts +150 -0
- package/dist/helpers.js +575 -0
- package/dist/helpers.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.js +198 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts.d.ts +9 -0
- package/dist/prompts.js +210 -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/server-manager.d.ts +72 -0
- package/dist/server-manager.js +264 -0
- package/dist/server-manager.js.map +1 -0
- package/dist/tools/config.d.ts +3 -0
- package/dist/tools/config.js +105 -0
- package/dist/tools/config.js.map +1 -0
- package/dist/tools/events.d.ts +6 -0
- package/dist/tools/events.js +63 -0
- package/dist/tools/events.js.map +1 -0
- package/dist/tools/file.d.ts +3 -0
- package/dist/tools/file.js +153 -0
- package/dist/tools/file.js.map +1 -0
- package/dist/tools/global.d.ts +3 -0
- package/dist/tools/global.js +17 -0
- package/dist/tools/global.js.map +1 -0
- package/dist/tools/message.d.ts +3 -0
- package/dist/tools/message.js +169 -0
- package/dist/tools/message.js.map +1 -0
- package/dist/tools/misc.d.ts +3 -0
- package/dist/tools/misc.js +298 -0
- package/dist/tools/misc.js.map +1 -0
- package/dist/tools/project.d.ts +3 -0
- package/dist/tools/project.js +62 -0
- package/dist/tools/project.js.map +1 -0
- package/dist/tools/provider.d.ts +3 -0
- package/dist/tools/provider.js +175 -0
- package/dist/tools/provider.js.map +1 -0
- package/dist/tools/session.d.ts +3 -0
- package/dist/tools/session.js +392 -0
- package/dist/tools/session.js.map +1 -0
- package/dist/tools/tui.d.ts +7 -0
- package/dist/tools/tui.js +121 -0
- package/dist/tools/tui.js.map +1 -0
- package/dist/tools/workflow.d.ts +7 -0
- package/dist/tools/workflow.js +775 -0
- package/dist/tools/workflow.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { toolJson, toolError, toolResult, directoryParam, readOnly } 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
|
+
directory: directoryParam,
|
|
9
|
+
}, readOnly, async ({ pattern, directory }) => {
|
|
10
|
+
try {
|
|
11
|
+
const raw = await client.get("/find", { pattern }, directory);
|
|
12
|
+
const results = Array.isArray(raw) ? raw : [];
|
|
13
|
+
if (results.length === 0) {
|
|
14
|
+
return toolResult(`No matches found for pattern: ${pattern}`);
|
|
15
|
+
}
|
|
16
|
+
const formatted = results.map((r) => {
|
|
17
|
+
// The API returns path as {text: "file.ts"} and lines as {text: "content\n"}
|
|
18
|
+
const rawPath = r.path ?? r.file ?? r.name ?? "";
|
|
19
|
+
const filePath = typeof rawPath === "string"
|
|
20
|
+
? rawPath
|
|
21
|
+
: rawPath?.text ?? rawPath?.path ?? rawPath?.name ?? String(rawPath);
|
|
22
|
+
const lineNum = r.line_number ?? r.lineNumber ?? r.line ?? "?";
|
|
23
|
+
const rawLines = r.lines ?? r.text ?? r.content ?? "";
|
|
24
|
+
const lineText = typeof rawLines === "string"
|
|
25
|
+
? rawLines.trim()
|
|
26
|
+
: rawLines?.text != null
|
|
27
|
+
? String(rawLines.text).trim()
|
|
28
|
+
: JSON.stringify(rawLines);
|
|
29
|
+
return `${filePath}:${lineNum} ${lineText}`;
|
|
30
|
+
}).join("\n");
|
|
31
|
+
return toolResult(`${results.length} match(es):\n\n${formatted}`);
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
return toolError(e);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
server.tool("opencode_find_file", "Find files and directories by name (fuzzy match)", {
|
|
38
|
+
query: z.string().describe("Search string for file/directory names"),
|
|
39
|
+
type: z
|
|
40
|
+
.enum(["file", "directory"])
|
|
41
|
+
.optional()
|
|
42
|
+
.describe("Limit results to 'file' or 'directory'"),
|
|
43
|
+
searchDirectory: z
|
|
44
|
+
.string()
|
|
45
|
+
.optional()
|
|
46
|
+
.describe("Override the project root for the search"),
|
|
47
|
+
limit: z
|
|
48
|
+
.number()
|
|
49
|
+
.optional()
|
|
50
|
+
.describe("Max number of results (1-200)"),
|
|
51
|
+
directory: directoryParam,
|
|
52
|
+
}, readOnly, async ({ query, type, searchDirectory, limit, directory }) => {
|
|
53
|
+
try {
|
|
54
|
+
const q = { query };
|
|
55
|
+
if (type)
|
|
56
|
+
q.type = type;
|
|
57
|
+
if (searchDirectory)
|
|
58
|
+
q.directory = searchDirectory;
|
|
59
|
+
if (limit !== undefined)
|
|
60
|
+
q.limit = String(limit);
|
|
61
|
+
const files = (await client.get("/find/file", q, directory));
|
|
62
|
+
if (!files || files.length === 0) {
|
|
63
|
+
return toolResult(`No files found matching: ${query}`);
|
|
64
|
+
}
|
|
65
|
+
return toolResult(files.join("\n"));
|
|
66
|
+
}
|
|
67
|
+
catch (e) {
|
|
68
|
+
return toolError(e);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
server.tool("opencode_find_symbol", "Find workspace symbols by name (functions, classes, variables, etc.)", {
|
|
72
|
+
query: z.string().describe("Symbol name to search for"),
|
|
73
|
+
directory: directoryParam,
|
|
74
|
+
}, readOnly, async ({ query, directory }) => {
|
|
75
|
+
try {
|
|
76
|
+
const raw = await client.get("/find/symbol", { query }, directory);
|
|
77
|
+
const symbols = Array.isArray(raw) ? raw : [];
|
|
78
|
+
if (symbols.length === 0) {
|
|
79
|
+
return toolResult(`No symbols found matching: ${query}`);
|
|
80
|
+
}
|
|
81
|
+
const lines = symbols.map((s) => {
|
|
82
|
+
const name = s.name ?? s.symbol ?? "?";
|
|
83
|
+
const kind = s.kind ? ` (${s.kind})` : "";
|
|
84
|
+
const loc = s.location ?? s.path ?? s.file ?? "";
|
|
85
|
+
const line = s.line ?? s.lineNumber ?? "";
|
|
86
|
+
const locStr = loc ? ` — ${loc}${line ? `:${line}` : ""}` : "";
|
|
87
|
+
return `- ${name}${kind}${locStr}`;
|
|
88
|
+
});
|
|
89
|
+
return toolResult(`${symbols.length} symbol(s) matching "${query}":\n\n${lines.join("\n")}`);
|
|
90
|
+
}
|
|
91
|
+
catch (e) {
|
|
92
|
+
return toolError(e);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
server.tool("opencode_file_list", "List files and directories at a path", {
|
|
96
|
+
path: z
|
|
97
|
+
.string()
|
|
98
|
+
.optional()
|
|
99
|
+
.describe("Path to list (defaults to project root)"),
|
|
100
|
+
directory: directoryParam,
|
|
101
|
+
}, readOnly, async ({ path, directory }) => {
|
|
102
|
+
try {
|
|
103
|
+
const q = { path: path || "." };
|
|
104
|
+
const nodes = (await client.get("/file", q, directory));
|
|
105
|
+
if (!nodes || nodes.length === 0) {
|
|
106
|
+
return toolResult("Empty directory.");
|
|
107
|
+
}
|
|
108
|
+
const formatted = nodes.map((n) => {
|
|
109
|
+
const type = n.type === "directory" ? "[DIR]" : " ";
|
|
110
|
+
return `${type} ${n.name ?? n.path ?? "?"}`;
|
|
111
|
+
}).join("\n");
|
|
112
|
+
return toolResult(formatted);
|
|
113
|
+
}
|
|
114
|
+
catch (e) {
|
|
115
|
+
return toolError(e);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
server.tool("opencode_file_read", "Read the content of a file", {
|
|
119
|
+
path: z.string().describe("File path to read"),
|
|
120
|
+
directory: directoryParam,
|
|
121
|
+
}, readOnly, async ({ path, directory }) => {
|
|
122
|
+
try {
|
|
123
|
+
const result = (await client.get("/file/content", { path }, directory));
|
|
124
|
+
if (typeof result.content === "string") {
|
|
125
|
+
return toolResult(`File: ${path}\n\n${result.content}`);
|
|
126
|
+
}
|
|
127
|
+
return toolJson(result);
|
|
128
|
+
}
|
|
129
|
+
catch (e) {
|
|
130
|
+
return toolError(e);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
server.tool("opencode_file_status", "Get status for tracked files (VCS changes: modified, added, deleted, etc.)", {
|
|
134
|
+
directory: directoryParam,
|
|
135
|
+
}, readOnly, async ({ directory }) => {
|
|
136
|
+
try {
|
|
137
|
+
const files = (await client.get("/file/status", undefined, directory));
|
|
138
|
+
if (!files || files.length === 0) {
|
|
139
|
+
return toolResult("No tracked file changes.");
|
|
140
|
+
}
|
|
141
|
+
const formatted = files.map((f) => {
|
|
142
|
+
const status = f.status ?? f.type ?? "?";
|
|
143
|
+
const path = f.path ?? f.file ?? "?";
|
|
144
|
+
return `[${status}] ${path}`;
|
|
145
|
+
}).join("\n");
|
|
146
|
+
return toolResult(formatted);
|
|
147
|
+
}
|
|
148
|
+
catch (e) {
|
|
149
|
+
return toolError(e);
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
//# 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,17 @@
|
|
|
1
|
+
import { toolResult, toolError, directoryParam, readOnly } from "../helpers.js";
|
|
2
|
+
export function registerGlobalTools(server, client) {
|
|
3
|
+
server.tool("opencode_health", "Check server health and version", {
|
|
4
|
+
directory: directoryParam,
|
|
5
|
+
}, readOnly, async ({ directory }) => {
|
|
6
|
+
try {
|
|
7
|
+
const raw = await client.get("/global/health", undefined, directory);
|
|
8
|
+
const status = raw.healthy ? "healthy" : "unhealthy";
|
|
9
|
+
const version = raw.version ?? "unknown";
|
|
10
|
+
return toolResult(`Status: ${status}\nVersion: ${version}`);
|
|
11
|
+
}
|
|
12
|
+
catch (e) {
|
|
13
|
+
return toolError(e);
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=global.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global.js","sourceRoot":"","sources":["../../src/tools/global.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEhF,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,MAAsB;IAC3E,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,iCAAiC,EACjC;QACE,SAAS,EAAE,cAAc;KAC1B,EACD,QAAQ,EACR,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QACtB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,gBAAgB,EAAE,SAAS,EAAE,SAAS,CAA4B,CAAC;YAChG,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;YACrD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,SAAS,CAAC;YACzC,OAAO,UAAU,CAAC,WAAW,MAAM,cAAc,OAAO,EAAE,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { toolResult, toolError, formatMessageResponse, analyzeMessageResponse, formatMessageList, applyModelDefaults, directoryParam, } 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
|
+
directory: directoryParam,
|
|
11
|
+
}, async ({ sessionId, limit, directory }) => {
|
|
12
|
+
try {
|
|
13
|
+
const query = {};
|
|
14
|
+
if (limit !== undefined)
|
|
15
|
+
query.limit = String(limit);
|
|
16
|
+
const messages = await client.get(`/session/${sessionId}/message`, query, directory);
|
|
17
|
+
return toolResult(formatMessageList(messages));
|
|
18
|
+
}
|
|
19
|
+
catch (e) {
|
|
20
|
+
return toolError(e);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
server.tool("opencode_message_get", "Get details of a specific message in a session", {
|
|
24
|
+
sessionId: z.string().describe("Session ID"),
|
|
25
|
+
messageId: z.string().describe("Message ID"),
|
|
26
|
+
directory: directoryParam,
|
|
27
|
+
}, async ({ sessionId, messageId, directory }) => {
|
|
28
|
+
try {
|
|
29
|
+
const msg = await client.get(`/session/${sessionId}/message/${messageId}`, undefined, directory);
|
|
30
|
+
return toolResult(formatMessageResponse(msg));
|
|
31
|
+
}
|
|
32
|
+
catch (e) {
|
|
33
|
+
return toolError(e);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
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.", {
|
|
37
|
+
sessionId: z.string().describe("Session ID"),
|
|
38
|
+
text: z.string().describe("The text message to send"),
|
|
39
|
+
providerID: z
|
|
40
|
+
.string()
|
|
41
|
+
.optional()
|
|
42
|
+
.describe("Provider ID (e.g. 'anthropic')"),
|
|
43
|
+
modelID: z
|
|
44
|
+
.string()
|
|
45
|
+
.optional()
|
|
46
|
+
.describe("Model ID (e.g. 'claude-3-5-sonnet-20241022')"),
|
|
47
|
+
variant: z.string().optional().describe("Model variant (e.g. 'fast', 'smart')"),
|
|
48
|
+
agent: z.string().optional().describe("Agent to use"),
|
|
49
|
+
noReply: z
|
|
50
|
+
.boolean()
|
|
51
|
+
.optional()
|
|
52
|
+
.describe("If true, inject context without triggering AI response (useful for plugins)"),
|
|
53
|
+
system: z.string().optional().describe("System prompt override"),
|
|
54
|
+
directory: directoryParam,
|
|
55
|
+
}, async ({ sessionId, text, providerID, modelID, variant, agent, noReply, system, directory, }) => {
|
|
56
|
+
try {
|
|
57
|
+
const body = {
|
|
58
|
+
parts: [{ type: "text", text }],
|
|
59
|
+
};
|
|
60
|
+
const model = applyModelDefaults(providerID, modelID, variant);
|
|
61
|
+
if (model)
|
|
62
|
+
body.model = model;
|
|
63
|
+
if (agent)
|
|
64
|
+
body.agent = agent;
|
|
65
|
+
if (noReply !== undefined)
|
|
66
|
+
body.noReply = noReply;
|
|
67
|
+
if (system)
|
|
68
|
+
body.system = system;
|
|
69
|
+
const response = await client.post(`/session/${sessionId}/message`, body, { directory });
|
|
70
|
+
const analysis = analyzeMessageResponse(response);
|
|
71
|
+
const formatted = formatMessageResponse(response);
|
|
72
|
+
const parts = [];
|
|
73
|
+
if (formatted)
|
|
74
|
+
parts.push(formatted);
|
|
75
|
+
if (analysis.warning) {
|
|
76
|
+
parts.push(`\n--- WARNING ---\n${analysis.warning}`);
|
|
77
|
+
}
|
|
78
|
+
return toolResult(parts.join("\n\n") || "Empty response.", analysis.hasError);
|
|
79
|
+
}
|
|
80
|
+
catch (e) {
|
|
81
|
+
return toolError(e);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
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.", {
|
|
85
|
+
sessionId: z.string().describe("Session ID"),
|
|
86
|
+
text: z.string().describe("The text message to send"),
|
|
87
|
+
providerID: z
|
|
88
|
+
.string()
|
|
89
|
+
.optional()
|
|
90
|
+
.describe("Provider ID (e.g. 'anthropic')"),
|
|
91
|
+
modelID: z
|
|
92
|
+
.string()
|
|
93
|
+
.optional()
|
|
94
|
+
.describe("Model ID (e.g. 'claude-3-5-sonnet-20241022')"),
|
|
95
|
+
variant: z.string().optional().describe("Model variant (e.g. 'fast', 'smart')"),
|
|
96
|
+
agent: z.string().optional().describe("Agent to use"),
|
|
97
|
+
directory: directoryParam,
|
|
98
|
+
}, async ({ sessionId, text, providerID, modelID, variant, agent, directory }) => {
|
|
99
|
+
try {
|
|
100
|
+
const body = {
|
|
101
|
+
parts: [{ type: "text", text }],
|
|
102
|
+
};
|
|
103
|
+
const model = applyModelDefaults(providerID, modelID, variant);
|
|
104
|
+
if (model)
|
|
105
|
+
body.model = model;
|
|
106
|
+
if (agent)
|
|
107
|
+
body.agent = agent;
|
|
108
|
+
await client.post(`/session/${sessionId}/prompt_async`, body, { directory });
|
|
109
|
+
return toolResult("Message sent asynchronously. Use opencode_wait or opencode_message_list to check for responses.");
|
|
110
|
+
}
|
|
111
|
+
catch (e) {
|
|
112
|
+
return toolError(e);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
server.tool("opencode_command_execute", "Execute a slash command in a session (e.g. /init, /undo, /redo)", {
|
|
116
|
+
sessionId: z.string().describe("Session ID"),
|
|
117
|
+
command: z
|
|
118
|
+
.string()
|
|
119
|
+
.describe("The slash command to execute (e.g. 'init', 'undo')"),
|
|
120
|
+
arguments: z
|
|
121
|
+
.string()
|
|
122
|
+
.optional()
|
|
123
|
+
.describe("Arguments for the command"),
|
|
124
|
+
agent: z.string().optional().describe("Agent to use"),
|
|
125
|
+
providerID: z.string().optional().describe("Provider ID"),
|
|
126
|
+
modelID: z.string().optional().describe("Model ID"),
|
|
127
|
+
variant: z.string().optional().describe("Model variant"),
|
|
128
|
+
directory: directoryParam,
|
|
129
|
+
}, async ({ sessionId, command, arguments: args, agent, providerID, modelID, variant, directory, }) => {
|
|
130
|
+
try {
|
|
131
|
+
const body = {
|
|
132
|
+
command,
|
|
133
|
+
arguments: args ?? "",
|
|
134
|
+
};
|
|
135
|
+
if (agent)
|
|
136
|
+
body.agent = agent;
|
|
137
|
+
const cmdModel = applyModelDefaults(providerID, modelID, variant);
|
|
138
|
+
if (cmdModel)
|
|
139
|
+
body.model = cmdModel;
|
|
140
|
+
const result = await client.post(`/session/${sessionId}/command`, body, { directory });
|
|
141
|
+
return toolResult(formatMessageResponse(result));
|
|
142
|
+
}
|
|
143
|
+
catch (e) {
|
|
144
|
+
return toolError(e);
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
server.tool("opencode_shell_execute", "Run a shell command through the opencode session", {
|
|
148
|
+
sessionId: z.string().describe("Session ID"),
|
|
149
|
+
command: z.string().describe("Shell command to execute"),
|
|
150
|
+
agent: z.string().describe("Agent to use for the shell command"),
|
|
151
|
+
providerID: z.string().optional().describe("Provider ID"),
|
|
152
|
+
modelID: z.string().optional().describe("Model ID"),
|
|
153
|
+
variant: z.string().optional().describe("Model variant"),
|
|
154
|
+
directory: directoryParam,
|
|
155
|
+
}, async ({ sessionId, command, agent, providerID, modelID, variant, directory }) => {
|
|
156
|
+
try {
|
|
157
|
+
const body = { command, agent };
|
|
158
|
+
const shellModel = applyModelDefaults(providerID, modelID, variant);
|
|
159
|
+
if (shellModel)
|
|
160
|
+
body.model = shellModel;
|
|
161
|
+
const result = await client.post(`/session/${sessionId}/shell`, body, { directory });
|
|
162
|
+
return toolResult(formatMessageResponse(result));
|
|
163
|
+
}
|
|
164
|
+
catch (e) {
|
|
165
|
+
return toolError(e);
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
//# 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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"}
|