-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Expand file tree
/
Copy pathtools.ts
More file actions
76 lines (69 loc) · 2.02 KB
/
tools.ts
File metadata and controls
76 lines (69 loc) · 2.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import { McpContext } from "./context.js";
import { deployTool, listDeploysTool } from "./tools/deploys.js";
import { searchDocsTool } from "./tools/docs.js";
import {
createProjectInOrgTool,
initializeProjectTool,
listOrgsTool,
listProjectsTool,
} from "./tools/orgs.js";
import { listPreviewBranchesTool } from "./tools/previewBranches.js";
import {
cancelRunTool,
getRunDetailsTool,
listRunsTool,
waitForRunToCompleteTool,
} from "./tools/runs.js";
import { getCurrentWorker, triggerTaskTool } from "./tools/tasks.js";
import { respondWithError } from "./utils.js";
export function registerTools(context: McpContext) {
// Always available read-only tools
const readOnlyTools = [
searchDocsTool,
listOrgsTool,
listProjectsTool,
getCurrentWorker,
listRunsTool,
getRunDetailsTool,
waitForRunToCompleteTool,
listPreviewBranchesTool,
listDeploysTool, // This is a read operation, not a write
];
// Write tools that are disabled in readonly mode
const writeTools = [
createProjectInOrgTool,
initializeProjectTool,
triggerTaskTool,
cancelRunTool,
];
// Deployment tools that can be independently disabled
const deploymentTools = [
deployTool, // Only the actual deploy command is a write operation
];
let tools = [...readOnlyTools];
// Add write tools if not in readonly mode
if (!context.options.readonly) {
tools = [...tools, ...writeTools];
}
// Add deployment tools if not disabled and not in readonly mode
if (!context.options.disableDeployment && !context.options.readonly) {
tools = [...tools, ...deploymentTools];
}
for (const tool of tools) {
context.server.registerTool(
tool.name,
{
annotations: { title: tool.title },
description: tool.description,
inputSchema: tool.inputSchema,
},
async (input, extra) => {
try {
return tool.handler(input, { ...extra, ctx: context });
} catch (error) {
return respondWithError(error);
}
}
);
}
}