@sammorrowdrums/mcpi-ext 0.1.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/.dockerignore +6 -0
- package/.github/dependabot.yml +25 -0
- package/.github/workflows/ci.yml +50 -0
- package/.hadolint.yaml +6 -0
- package/.prettierignore +4 -0
- package/.prettierrc +7 -0
- package/AGENTS.md +118 -0
- package/DECISIONS.md +99 -0
- package/Dockerfile +39 -0
- package/README.md +278 -0
- package/aube-lock.yaml +4146 -0
- package/dist/code-mode/code-mode-integration.test.d.ts +2 -0
- package/dist/code-mode/code-mode-integration.test.d.ts.map +1 -0
- package/dist/code-mode/code-mode-integration.test.js +116 -0
- package/dist/code-mode/code-mode-integration.test.js.map +1 -0
- package/dist/code-mode/eligibility.d.ts +10 -0
- package/dist/code-mode/eligibility.d.ts.map +1 -0
- package/dist/code-mode/eligibility.js +14 -0
- package/dist/code-mode/eligibility.js.map +1 -0
- package/dist/code-mode/eligibility.test.d.ts +2 -0
- package/dist/code-mode/eligibility.test.d.ts.map +1 -0
- package/dist/code-mode/eligibility.test.js +53 -0
- package/dist/code-mode/eligibility.test.js.map +1 -0
- package/dist/code-mode/executor.d.ts +35 -0
- package/dist/code-mode/executor.d.ts.map +1 -0
- package/dist/code-mode/executor.js +120 -0
- package/dist/code-mode/executor.js.map +1 -0
- package/dist/code-mode/executor.test.d.ts +2 -0
- package/dist/code-mode/executor.test.d.ts.map +1 -0
- package/dist/code-mode/executor.test.js +130 -0
- package/dist/code-mode/executor.test.js.map +1 -0
- package/dist/code-mode/index.d.ts +65 -0
- package/dist/code-mode/index.d.ts.map +1 -0
- package/dist/code-mode/index.js +175 -0
- package/dist/code-mode/index.js.map +1 -0
- package/dist/code-mode/tools.d.ts +45 -0
- package/dist/code-mode/tools.d.ts.map +1 -0
- package/dist/code-mode/tools.js +70 -0
- package/dist/code-mode/tools.js.map +1 -0
- package/dist/code-mode/type-hints.d.ts +20 -0
- package/dist/code-mode/type-hints.d.ts.map +1 -0
- package/dist/code-mode/type-hints.js +189 -0
- package/dist/code-mode/type-hints.js.map +1 -0
- package/dist/code-mode/type-hints.test.d.ts +2 -0
- package/dist/code-mode/type-hints.test.d.ts.map +1 -0
- package/dist/code-mode/type-hints.test.js +157 -0
- package/dist/code-mode/type-hints.test.js.map +1 -0
- package/dist/docker-e2e.d.ts +55 -0
- package/dist/docker-e2e.d.ts.map +1 -0
- package/dist/docker-e2e.js +235 -0
- package/dist/docker-e2e.js.map +1 -0
- package/dist/docker-e2e.test.d.ts +2 -0
- package/dist/docker-e2e.test.d.ts.map +1 -0
- package/dist/docker-e2e.test.js +176 -0
- package/dist/docker-e2e.test.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +128 -0
- package/dist/index.js.map +1 -0
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +8 -0
- package/dist/index.test.js.map +1 -0
- package/dist/mcp/client-manager.d.ts +46 -0
- package/dist/mcp/client-manager.d.ts.map +1 -0
- package/dist/mcp/client-manager.js +148 -0
- package/dist/mcp/client-manager.js.map +1 -0
- package/dist/mcp/client-manager.test.d.ts +2 -0
- package/dist/mcp/client-manager.test.d.ts.map +1 -0
- package/dist/mcp/client-manager.test.js +204 -0
- package/dist/mcp/client-manager.test.js.map +1 -0
- package/dist/mcp/config-loader.d.ts +8 -0
- package/dist/mcp/config-loader.d.ts.map +1 -0
- package/dist/mcp/config-loader.js +43 -0
- package/dist/mcp/config-loader.js.map +1 -0
- package/dist/mcp/config-loader.test.d.ts +2 -0
- package/dist/mcp/config-loader.test.d.ts.map +1 -0
- package/dist/mcp/config-loader.test.js +93 -0
- package/dist/mcp/config-loader.test.js.map +1 -0
- package/dist/mcp/config.d.ts +46 -0
- package/dist/mcp/config.d.ts.map +1 -0
- package/dist/mcp/config.js +28 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/index.d.ts +5 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +4 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/skills/discover.d.ts +10 -0
- package/dist/skills/discover.d.ts.map +1 -0
- package/dist/skills/discover.js +60 -0
- package/dist/skills/discover.js.map +1 -0
- package/dist/skills/format.d.ts +10 -0
- package/dist/skills/format.d.ts.map +1 -0
- package/dist/skills/format.js +38 -0
- package/dist/skills/format.js.map +1 -0
- package/dist/skills/format.test.d.ts +2 -0
- package/dist/skills/format.test.d.ts.map +1 -0
- package/dist/skills/format.test.js +63 -0
- package/dist/skills/format.test.js.map +1 -0
- package/dist/skills/index.d.ts +6 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +6 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/load-skill-tool.d.ts +40 -0
- package/dist/skills/load-skill-tool.d.ts.map +1 -0
- package/dist/skills/load-skill-tool.js +104 -0
- package/dist/skills/load-skill-tool.js.map +1 -0
- package/dist/skills/mcp-tool-proxy.d.ts +11 -0
- package/dist/skills/mcp-tool-proxy.d.ts.map +1 -0
- package/dist/skills/mcp-tool-proxy.js +116 -0
- package/dist/skills/mcp-tool-proxy.js.map +1 -0
- package/dist/skills/skill-integration.test.d.ts +2 -0
- package/dist/skills/skill-integration.test.d.ts.map +1 -0
- package/dist/skills/skill-integration.test.js +119 -0
- package/dist/skills/skill-integration.test.js.map +1 -0
- package/dist/skills/skill-registry.d.ts +39 -0
- package/dist/skills/skill-registry.d.ts.map +1 -0
- package/dist/skills/skill-registry.js +48 -0
- package/dist/skills/skill-registry.js.map +1 -0
- package/dist/skills/skill-registry.test.d.ts +2 -0
- package/dist/skills/skill-registry.test.d.ts.map +1 -0
- package/dist/skills/skill-registry.test.js +67 -0
- package/dist/skills/skill-registry.test.js.map +1 -0
- package/dist/test-servers/weather-server.d.ts +12 -0
- package/dist/test-servers/weather-server.d.ts.map +1 -0
- package/dist/test-servers/weather-server.js +139 -0
- package/dist/test-servers/weather-server.js.map +1 -0
- package/dist/test-servers/weather-stdio.d.ts +2 -0
- package/dist/test-servers/weather-stdio.d.ts.map +1 -0
- package/dist/test-servers/weather-stdio.js +11 -0
- package/dist/test-servers/weather-stdio.js.map +1 -0
- package/dist/tool-cli/cli.d.ts +3 -0
- package/dist/tool-cli/cli.d.ts.map +1 -0
- package/dist/tool-cli/cli.js +179 -0
- package/dist/tool-cli/cli.js.map +1 -0
- package/dist/tool-cli/constants.d.ts +7 -0
- package/dist/tool-cli/constants.d.ts.map +1 -0
- package/dist/tool-cli/constants.js +15 -0
- package/dist/tool-cli/constants.js.map +1 -0
- package/dist/tool-cli/format.d.ts +8 -0
- package/dist/tool-cli/format.d.ts.map +1 -0
- package/dist/tool-cli/format.js +57 -0
- package/dist/tool-cli/format.js.map +1 -0
- package/dist/tool-cli/format.test.d.ts +2 -0
- package/dist/tool-cli/format.test.d.ts.map +1 -0
- package/dist/tool-cli/format.test.js +30 -0
- package/dist/tool-cli/format.test.js.map +1 -0
- package/dist/tool-cli/index.d.ts +4 -0
- package/dist/tool-cli/index.d.ts.map +1 -0
- package/dist/tool-cli/index.js +4 -0
- package/dist/tool-cli/index.js.map +1 -0
- package/dist/tool-cli/rpc-client.d.ts +6 -0
- package/dist/tool-cli/rpc-client.d.ts.map +1 -0
- package/dist/tool-cli/rpc-client.js +25 -0
- package/dist/tool-cli/rpc-client.js.map +1 -0
- package/dist/tool-cli/rpc-server.d.ts +48 -0
- package/dist/tool-cli/rpc-server.d.ts.map +1 -0
- package/dist/tool-cli/rpc-server.js +220 -0
- package/dist/tool-cli/rpc-server.js.map +1 -0
- package/dist/tool-cli/rpc-server.test.d.ts +2 -0
- package/dist/tool-cli/rpc-server.test.d.ts.map +1 -0
- package/dist/tool-cli/rpc-server.test.js +154 -0
- package/dist/tool-cli/rpc-server.test.js.map +1 -0
- package/eslint.config.js +27 -0
- package/images/banner.webp +0 -0
- package/images/code-c-maude.webp +0 -0
- package/images/nuclear-mcp-football.webp +0 -0
- package/images/the-skill-dealer.webp +0 -0
- package/mise.toml +65 -0
- package/package.json +46 -0
- package/scripts/docker-entrypoint.sh +29 -0
- package/scripts/test-echo-server.mjs +28 -0
- package/scripts/test-mcp-integration.mjs +59 -0
- package/scripts/test-tool-cli-smoke.mjs +62 -0
- package/src/code-mode/code-mode-integration.test.ts +135 -0
- package/src/code-mode/eligibility.test.ts +60 -0
- package/src/code-mode/eligibility.ts +16 -0
- package/src/code-mode/executor.test.ts +168 -0
- package/src/code-mode/executor.ts +163 -0
- package/src/code-mode/index.ts +208 -0
- package/src/code-mode/tools.ts +110 -0
- package/src/code-mode/type-hints.test.ts +187 -0
- package/src/code-mode/type-hints.ts +249 -0
- package/src/docker-e2e.test.ts +195 -0
- package/src/docker-e2e.ts +277 -0
- package/src/index.test.ts +8 -0
- package/src/index.ts +158 -0
- package/src/mcp/client-manager.test.ts +250 -0
- package/src/mcp/client-manager.ts +199 -0
- package/src/mcp/config-loader.test.ts +115 -0
- package/src/mcp/config-loader.ts +46 -0
- package/src/mcp/config.ts +40 -0
- package/src/mcp/index.ts +4 -0
- package/src/skills/discover.ts +81 -0
- package/src/skills/format.test.ts +70 -0
- package/src/skills/format.ts +42 -0
- package/src/skills/index.ts +9 -0
- package/src/skills/load-skill-tool.ts +136 -0
- package/src/skills/mcp-tool-proxy.ts +143 -0
- package/src/skills/skill-integration.test.ts +139 -0
- package/src/skills/skill-registry.test.ts +83 -0
- package/src/skills/skill-registry.ts +69 -0
- package/src/test-servers/weather-server.ts +171 -0
- package/src/test-servers/weather-stdio.ts +11 -0
- package/src/tool-cli/cli.ts +232 -0
- package/src/tool-cli/constants.ts +15 -0
- package/src/tool-cli/format.test.ts +33 -0
- package/src/tool-cli/format.ts +56 -0
- package/src/tool-cli/index.ts +3 -0
- package/src/tool-cli/rpc-client.ts +39 -0
- package/src/tool-cli/rpc-server.test.ts +193 -0
- package/src/tool-cli/rpc-server.ts +287 -0
- package/tsconfig.json +21 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test MCP weather server — exposes a weather skill with gated tools.
|
|
3
|
+
*
|
|
4
|
+
* Registers:
|
|
5
|
+
* - skill://weather/SKILL.md — a skill resource with frontmatter
|
|
6
|
+
* - check_weather_for_city — current weather (gated by skill)
|
|
7
|
+
* - check_weekly_forecast_for_city — 7-day forecast (gated by skill)
|
|
8
|
+
* - echo — ungated baseline tool
|
|
9
|
+
*/
|
|
10
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
11
|
+
import { z } from "zod";
|
|
12
|
+
const SKILL_CONTENT = `---
|
|
13
|
+
name: weather
|
|
14
|
+
description: Check current weather and weekly forecasts for any city
|
|
15
|
+
allowed-tools:
|
|
16
|
+
- check_weather_for_city
|
|
17
|
+
- check_weekly_forecast_for_city
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# Weather Forecasting Skill
|
|
21
|
+
|
|
22
|
+
Use the weather tools to look up conditions for any city.
|
|
23
|
+
|
|
24
|
+
- **check_weather_for_city** — returns current temperature, conditions, and humidity
|
|
25
|
+
- **check_weekly_forecast_for_city** — returns a 7-day forecast summary
|
|
26
|
+
|
|
27
|
+
Always confirm the city name with the user before calling.
|
|
28
|
+
`;
|
|
29
|
+
const WEATHER_DATA = {
|
|
30
|
+
london: { temp: 14, conditions: "Cloudy", humidity: 78 },
|
|
31
|
+
tokyo: { temp: 26, conditions: "Sunny", humidity: 55 },
|
|
32
|
+
"new york": { temp: 22, conditions: "Partly cloudy", humidity: 62 },
|
|
33
|
+
sydney: { temp: 19, conditions: "Clear", humidity: 45 },
|
|
34
|
+
};
|
|
35
|
+
const FORECAST_DATA = {
|
|
36
|
+
london: "Mon 13°C Rain | Tue 14°C Cloudy | Wed 15°C Cloudy | Thu 12°C Rain | Fri 14°C Sunny | Sat 16°C Sunny | Sun 15°C Cloudy",
|
|
37
|
+
tokyo: "Mon 27°C Sunny | Tue 28°C Sunny | Wed 25°C Rain | Thu 24°C Cloudy | Fri 26°C Sunny | Sat 27°C Sunny | Sun 26°C Partly cloudy",
|
|
38
|
+
"new york": "Mon 23°C Sunny | Tue 24°C Sunny | Wed 20°C Thunderstorms | Thu 18°C Cloudy | Fri 21°C Sunny | Sat 22°C Sunny | Sun 23°C Clear",
|
|
39
|
+
sydney: "Mon 18°C Clear | Tue 20°C Sunny | Wed 19°C Cloudy | Thu 17°C Rain | Fri 18°C Cloudy | Sat 21°C Sunny | Sun 20°C Clear",
|
|
40
|
+
};
|
|
41
|
+
export function createWeatherServer() {
|
|
42
|
+
const server = new McpServer({ name: "test-weather-server", version: "0.1.0" }, { capabilities: { resources: {} } });
|
|
43
|
+
// Skill resource
|
|
44
|
+
server.registerResource("weather-skill", "skill://weather/SKILL.md", {
|
|
45
|
+
description: "Weather forecasting skill instructions",
|
|
46
|
+
mimeType: "text/markdown",
|
|
47
|
+
}, async () => ({
|
|
48
|
+
contents: [
|
|
49
|
+
{
|
|
50
|
+
uri: "skill://weather/SKILL.md",
|
|
51
|
+
text: SKILL_CONTENT,
|
|
52
|
+
mimeType: "text/markdown",
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
}));
|
|
56
|
+
// Tool: current weather (gated by skill)
|
|
57
|
+
server.registerTool("check_weather_for_city", {
|
|
58
|
+
description: "Get current weather conditions for a city",
|
|
59
|
+
inputSchema: { city: z.string().describe("City name, e.g. 'London'") },
|
|
60
|
+
outputSchema: {
|
|
61
|
+
temperature: z.number().describe("Temperature in Celsius"),
|
|
62
|
+
conditions: z.string().describe("Weather conditions description"),
|
|
63
|
+
humidity: z.number().describe("Humidity percentage"),
|
|
64
|
+
city: z.string().describe("City name"),
|
|
65
|
+
},
|
|
66
|
+
annotations: { readOnlyHint: true },
|
|
67
|
+
}, async ({ city }) => {
|
|
68
|
+
const data = WEATHER_DATA[city.toLowerCase()];
|
|
69
|
+
if (!data) {
|
|
70
|
+
return {
|
|
71
|
+
content: [
|
|
72
|
+
{
|
|
73
|
+
type: "text",
|
|
74
|
+
text: `No weather data available for "${city}". Try: London, Tokyo, New York, or Sydney.`,
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
const structuredContent = {
|
|
80
|
+
temperature: data.temp,
|
|
81
|
+
conditions: data.conditions,
|
|
82
|
+
humidity: data.humidity,
|
|
83
|
+
city,
|
|
84
|
+
};
|
|
85
|
+
return {
|
|
86
|
+
content: [
|
|
87
|
+
{
|
|
88
|
+
type: "text",
|
|
89
|
+
text: `Weather in ${city}: ${data.conditions}, ${data.temp}°C, humidity ${data.humidity}%`,
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
structuredContent,
|
|
93
|
+
};
|
|
94
|
+
});
|
|
95
|
+
// Tool: weekly forecast (gated by skill)
|
|
96
|
+
server.registerTool("check_weekly_forecast_for_city", {
|
|
97
|
+
description: "Get a 7-day weather forecast for a city",
|
|
98
|
+
inputSchema: { city: z.string().describe("City name, e.g. 'Tokyo'") },
|
|
99
|
+
outputSchema: {
|
|
100
|
+
city: z.string().describe("City name"),
|
|
101
|
+
forecast: z.string().describe("7-day forecast summary"),
|
|
102
|
+
},
|
|
103
|
+
annotations: { readOnlyHint: true },
|
|
104
|
+
}, async ({ city }) => {
|
|
105
|
+
const forecast = FORECAST_DATA[city.toLowerCase()];
|
|
106
|
+
if (!forecast) {
|
|
107
|
+
return {
|
|
108
|
+
content: [
|
|
109
|
+
{
|
|
110
|
+
type: "text",
|
|
111
|
+
text: `No forecast data available for "${city}". Try: London, Tokyo, New York, or Sydney.`,
|
|
112
|
+
},
|
|
113
|
+
],
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
const structuredContent = { city, forecast };
|
|
117
|
+
return {
|
|
118
|
+
content: [{ type: "text", text: `Forecast for ${city}: ${forecast}` }],
|
|
119
|
+
structuredContent,
|
|
120
|
+
};
|
|
121
|
+
});
|
|
122
|
+
// Ungated tool (always available, not behind a skill)
|
|
123
|
+
server.registerTool("echo", {
|
|
124
|
+
description: "Echoes back the input message",
|
|
125
|
+
inputSchema: { message: z.string() },
|
|
126
|
+
outputSchema: {
|
|
127
|
+
echo: z.string().describe("The echoed message"),
|
|
128
|
+
},
|
|
129
|
+
annotations: { readOnlyHint: true },
|
|
130
|
+
}, async ({ message }) => {
|
|
131
|
+
const structuredContent = { echo: message };
|
|
132
|
+
return {
|
|
133
|
+
content: [{ type: "text", text: `Echo: ${message}` }],
|
|
134
|
+
structuredContent,
|
|
135
|
+
};
|
|
136
|
+
});
|
|
137
|
+
return server;
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=weather-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weather-server.js","sourceRoot":"","sources":["../../src/test-servers/weather-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;CAgBrB,CAAC;AAEF,MAAM,YAAY,GAA2E;IAC3F,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE;IACxD,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;IACtD,UAAU,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,EAAE,EAAE;IACnE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;CACxD,CAAC;AAEF,MAAM,aAAa,GAA2B;IAC5C,MAAM,EACJ,uHAAuH;IACzH,KAAK,EACH,8HAA8H;IAChI,UAAU,EACR,+HAA+H;IACjI,MAAM,EACJ,uHAAuH;CAC1H,CAAC;AAEF,MAAM,UAAU,mBAAmB;IACjC,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,OAAO,EAAE,EACjD,EAAE,YAAY,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,CACpC,CAAC;IAEF,iBAAiB;IACjB,MAAM,CAAC,gBAAgB,CACrB,eAAe,EACf,0BAA0B,EAC1B;QACE,WAAW,EAAE,wCAAwC;QACrD,QAAQ,EAAE,eAAe;KAC1B,EACD,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE;YACR;gBACE,GAAG,EAAE,0BAA0B;gBAC/B,IAAI,EAAE,aAAa;gBACnB,QAAQ,EAAE,eAAe;aAC1B;SACF;KACF,CAAC,CACH,CAAC;IAEF,yCAAyC;IACzC,MAAM,CAAC,YAAY,CACjB,wBAAwB,EACxB;QACE,WAAW,EAAE,2CAA2C;QACxD,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE;QACtE,YAAY,EAAE;YACZ,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;YAC1D,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;YACjE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;YACpD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;SACvC;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;KACpC,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACjB,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,kCAAkC,IAAI,6CAA6C;qBAC1F;iBACF;aACF,CAAC;QACJ,CAAC;QACD,MAAM,iBAAiB,GAAG;YACxB,WAAW,EAAE,IAAI,CAAC,IAAI;YACtB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI;SACL,CAAC;QACF,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,cAAc,IAAI,KAAK,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,IAAI,gBAAgB,IAAI,CAAC,QAAQ,GAAG;iBAC3F;aACF;YACD,iBAAiB;SAClB,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,yCAAyC;IACzC,MAAM,CAAC,YAAY,CACjB,gCAAgC,EAChC;QACE,WAAW,EAAE,yCAAyC;QACtD,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAAE;QACrE,YAAY,EAAE;YACZ,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;YACtC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;SACxD;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;KACpC,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACjB,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACnD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,mCAAmC,IAAI,6CAA6C;qBAC3F;iBACF;aACF,CAAC;QACJ,CAAC;QACD,MAAM,iBAAiB,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC7C,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,gBAAgB,IAAI,KAAK,QAAQ,EAAE,EAAE,CAAC;YAC/E,iBAAiB;SAClB,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,sDAAsD;IACtD,MAAM,CAAC,YAAY,CACjB,MAAM,EACN;QACE,WAAW,EAAE,+BAA+B;QAC5C,WAAW,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;QACpC,YAAY,EAAE;YACZ,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;SAChD;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;KACpC,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QACpB,MAAM,iBAAiB,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC5C,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,SAAS,OAAO,EAAE,EAAE,CAAC;YAC9D,iBAAiB;SAClB,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weather-stdio.d.ts","sourceRoot":"","sources":["../../src/test-servers/weather-stdio.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stdio entrypoint for the test weather server.
|
|
3
|
+
* Run with: node dist/test-servers/weather-stdio.js
|
|
4
|
+
*/
|
|
5
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
6
|
+
import { createWeatherServer } from "./weather-server.js";
|
|
7
|
+
const server = createWeatherServer();
|
|
8
|
+
const transport = new StdioServerTransport();
|
|
9
|
+
await server.connect(transport);
|
|
10
|
+
console.error("Test weather server running on stdio");
|
|
11
|
+
//# sourceMappingURL=weather-stdio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weather-stdio.js","sourceRoot":"","sources":["../../src/test-servers/weather-stdio.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;AACrC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAChC,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/tool-cli/cli.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { writeFileSync } from "node:fs";
|
|
3
|
+
import { rpcCall } from "./rpc-client.js";
|
|
4
|
+
async function main() {
|
|
5
|
+
const rawArgs = process.argv.slice(2);
|
|
6
|
+
// Extract --out <file> flag (can appear anywhere)
|
|
7
|
+
let outFile;
|
|
8
|
+
const args = [];
|
|
9
|
+
for (let i = 0; i < rawArgs.length; i++) {
|
|
10
|
+
if (rawArgs[i] === "--out" && i + 1 < rawArgs.length) {
|
|
11
|
+
outFile = rawArgs[++i];
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
args.push(rawArgs[i]);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
// No args or --help → list servers
|
|
19
|
+
if (args.length === 0 || (args.length === 1 && isHelp(args[0]))) {
|
|
20
|
+
await listServers();
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const server = args[0];
|
|
24
|
+
// <server> --help or just <server> → list tools
|
|
25
|
+
if (args.length === 1 || (args.length === 2 && isHelp(args[1]))) {
|
|
26
|
+
await listTools(server);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const tool = args[1];
|
|
30
|
+
// <server> <tool> --help or just <server> <tool> → describe tool
|
|
31
|
+
if (args.length === 2 || (args.length === 3 && isHelp(args[2]))) {
|
|
32
|
+
await describeTool(server, tool);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
// <server> <tool> <json-args> → call tool
|
|
36
|
+
await callTool(server, tool, args[2], outFile);
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
40
|
+
if (message.includes("ECONNREFUSED") || message.includes("fetch failed")) {
|
|
41
|
+
console.error("Error: tool-cli server not running. Is mcpi-ext loaded?");
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
console.error(`Error: ${message}`);
|
|
45
|
+
}
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async function listServers() {
|
|
50
|
+
const result = (await rpcCall("listServers"));
|
|
51
|
+
const { servers } = result;
|
|
52
|
+
if (servers.length === 0) {
|
|
53
|
+
console.log("No MCP servers connected.");
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
console.log("Available servers:");
|
|
57
|
+
for (const s of servers) {
|
|
58
|
+
const examples = s.examples.length > 0 ? ` (e.g. ${s.examples.join(", ")})` : "";
|
|
59
|
+
console.log(` ${s.name.padEnd(20)} ${s.toolCount} tool(s)${examples}`);
|
|
60
|
+
}
|
|
61
|
+
console.log("");
|
|
62
|
+
console.log("Use: tool-cli <server> to list tools");
|
|
63
|
+
}
|
|
64
|
+
async function listTools(server) {
|
|
65
|
+
const result = (await rpcCall("listTools", { server }));
|
|
66
|
+
if (result.tools.length === 0) {
|
|
67
|
+
console.log(`${server} — no tools`);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
console.log(`${server} — ${result.tools.length} tool(s):`);
|
|
71
|
+
for (const t of result.tools) {
|
|
72
|
+
const badge = t.hasStructuredOutput ? " [json]" : "";
|
|
73
|
+
console.log(` ${t.name.padEnd(30)} ${t.description}${badge}`);
|
|
74
|
+
}
|
|
75
|
+
console.log("");
|
|
76
|
+
console.log("Use: tool-cli <server> <tool> for full schema");
|
|
77
|
+
}
|
|
78
|
+
async function describeTool(server, tool) {
|
|
79
|
+
const result = (await rpcCall("describeTool", { server, tool }));
|
|
80
|
+
console.log(`${result.name} — ${result.description}`);
|
|
81
|
+
console.log("");
|
|
82
|
+
console.log("Input schema:");
|
|
83
|
+
console.log(formatSchema(result.inputSchema));
|
|
84
|
+
if (result.outputSchema) {
|
|
85
|
+
console.log("");
|
|
86
|
+
console.log("Output schema (structured JSON output):");
|
|
87
|
+
console.log(formatSchema(result.outputSchema));
|
|
88
|
+
}
|
|
89
|
+
if (result.annotations && Object.keys(result.annotations).length > 0) {
|
|
90
|
+
console.log("");
|
|
91
|
+
console.log("Annotations:");
|
|
92
|
+
for (const [key, val] of Object.entries(result.annotations)) {
|
|
93
|
+
console.log(` ${key}: ${JSON.stringify(val)}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
console.log("");
|
|
97
|
+
console.log(`Use: tool-cli ${server} ${tool} '{"key":"value"}' to call`);
|
|
98
|
+
}
|
|
99
|
+
async function callTool(server, tool, argsJson, outFile) {
|
|
100
|
+
let toolArgs;
|
|
101
|
+
try {
|
|
102
|
+
toolArgs = JSON.parse(argsJson);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
console.error(`Error: invalid JSON arguments: ${argsJson}`);
|
|
106
|
+
process.exit(1);
|
|
107
|
+
}
|
|
108
|
+
const result = (await rpcCall("callTool", { server, tool, arguments: toolArgs }));
|
|
109
|
+
if (result.isError) {
|
|
110
|
+
// Error content goes to stderr so stdout stays clean for piping
|
|
111
|
+
if (result.structuredContent) {
|
|
112
|
+
console.error(JSON.stringify(result.structuredContent, null, 2));
|
|
113
|
+
}
|
|
114
|
+
else if (result.content) {
|
|
115
|
+
for (const item of result.content) {
|
|
116
|
+
const entry = item;
|
|
117
|
+
if (entry.type === "text") {
|
|
118
|
+
console.error(entry.text);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
console.error(JSON.stringify(entry, null, 2));
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
process.exit(1);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const output = formatOutput(result.structuredContent, result.content);
|
|
129
|
+
if (!output)
|
|
130
|
+
return;
|
|
131
|
+
if (outFile) {
|
|
132
|
+
writeFileSync(outFile, output, "utf-8");
|
|
133
|
+
console.log(`Written to: ${outFile}`);
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
console.log(output);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/** Build the output string from structured or raw content. */
|
|
140
|
+
function formatOutput(structuredContent, content) {
|
|
141
|
+
if (structuredContent) {
|
|
142
|
+
return JSON.stringify(structuredContent, null, 2);
|
|
143
|
+
}
|
|
144
|
+
if (content) {
|
|
145
|
+
const parts = [];
|
|
146
|
+
for (const item of content) {
|
|
147
|
+
const entry = item;
|
|
148
|
+
if (entry.type === "text") {
|
|
149
|
+
parts.push(entry.text);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
parts.push(JSON.stringify(entry, null, 2));
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return parts.join("\n");
|
|
156
|
+
}
|
|
157
|
+
return "";
|
|
158
|
+
}
|
|
159
|
+
/** Format a JSON Schema as a compact, readable summary. */
|
|
160
|
+
function formatSchema(schema) {
|
|
161
|
+
const props = schema.properties;
|
|
162
|
+
const required = schema.required ?? [];
|
|
163
|
+
if (!props || Object.keys(props).length === 0) {
|
|
164
|
+
return " (no parameters)";
|
|
165
|
+
}
|
|
166
|
+
const lines = [];
|
|
167
|
+
for (const [name, prop] of Object.entries(props)) {
|
|
168
|
+
const type = prop.type ?? "unknown";
|
|
169
|
+
const req = required.includes(name) ? ", required" : "";
|
|
170
|
+
const desc = prop.description ? `: ${prop.description}` : "";
|
|
171
|
+
lines.push(` ${name} (${type}${req})${desc}`);
|
|
172
|
+
}
|
|
173
|
+
return lines.join("\n");
|
|
174
|
+
}
|
|
175
|
+
function isHelp(arg) {
|
|
176
|
+
return arg === "--help" || arg === "-h";
|
|
177
|
+
}
|
|
178
|
+
void main();
|
|
179
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/tool-cli/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Default port for the tool-cli JSON-RPC server. */
|
|
2
|
+
export declare const DEFAULT_PORT = 7179;
|
|
3
|
+
/** Environment variable to override the default port. */
|
|
4
|
+
export declare const PORT_ENV_VAR = "TOOL_CLI_PORT";
|
|
5
|
+
/** Resolve the port from environment or default. */
|
|
6
|
+
export declare function resolvePort(): number;
|
|
7
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/tool-cli/constants.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,eAAO,MAAM,YAAY,OAAO,CAAC;AAEjC,yDAAyD;AACzD,eAAO,MAAM,YAAY,kBAAkB,CAAC;AAE5C,oDAAoD;AACpD,wBAAgB,WAAW,IAAI,MAAM,CAOpC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Default port for the tool-cli JSON-RPC server. */
|
|
2
|
+
export const DEFAULT_PORT = 7179;
|
|
3
|
+
/** Environment variable to override the default port. */
|
|
4
|
+
export const PORT_ENV_VAR = "TOOL_CLI_PORT";
|
|
5
|
+
/** Resolve the port from environment or default. */
|
|
6
|
+
export function resolvePort() {
|
|
7
|
+
const envPort = process.env[PORT_ENV_VAR];
|
|
8
|
+
if (envPort) {
|
|
9
|
+
const parsed = parseInt(envPort, 10);
|
|
10
|
+
if (!isNaN(parsed) && parsed > 0 && parsed < 65536)
|
|
11
|
+
return parsed;
|
|
12
|
+
}
|
|
13
|
+
return DEFAULT_PORT;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/tool-cli/constants.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC;AAEjC,yDAAyD;AACzD,MAAM,CAAC,MAAM,YAAY,GAAG,eAAe,CAAC;AAE5C,oDAAoD;AACpD,MAAM,UAAU,WAAW;IACzB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC1C,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,KAAK;YAAE,OAAO,MAAM,CAAC;IACpE,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Format system prompt section advising the agent when and how to use tool-cli.
|
|
3
|
+
*
|
|
4
|
+
* Only included when MCP servers are connected. Tells the agent about
|
|
5
|
+
* progressive discovery via tool-cli as an alternative to skill-based access.
|
|
6
|
+
*/
|
|
7
|
+
export declare function formatToolCliForPrompt(serverCount: number): string;
|
|
8
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/tool-cli/format.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAiDlE"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Format system prompt section advising the agent when and how to use tool-cli.
|
|
3
|
+
*
|
|
4
|
+
* Only included when MCP servers are connected. Tells the agent about
|
|
5
|
+
* progressive discovery via tool-cli as an alternative to skill-based access.
|
|
6
|
+
*/
|
|
7
|
+
export function formatToolCliForPrompt(serverCount) {
|
|
8
|
+
if (serverCount === 0)
|
|
9
|
+
return "";
|
|
10
|
+
return `
|
|
11
|
+
|
|
12
|
+
<tool_cli>
|
|
13
|
+
You have access to \`tool-cli\`, a CLI for discovering and calling MCP server tools progressively.
|
|
14
|
+
|
|
15
|
+
Use tool-cli when:
|
|
16
|
+
- No skill covers the task you need to do
|
|
17
|
+
- You want to explore what tools are available on a server
|
|
18
|
+
- You need ad-hoc access to an MCP tool without loading a full skill
|
|
19
|
+
|
|
20
|
+
If a skill exists for the task, prefer the skill — it provides workflow instructions and curated tool access.
|
|
21
|
+
|
|
22
|
+
Discovery (progressive — only fetch what you need):
|
|
23
|
+
tool-cli --help # List MCP servers with tool counts
|
|
24
|
+
tool-cli <server> # List all tools on a server
|
|
25
|
+
tool-cli <server> <tool> # Show full schema for a tool
|
|
26
|
+
|
|
27
|
+
Calling tools:
|
|
28
|
+
tool-cli <server> <tool> '{"key":"value"}' # Call a tool with JSON arguments
|
|
29
|
+
tool-cli <server> <tool> '{}' --out /tmp/result.json # Save large output to file
|
|
30
|
+
|
|
31
|
+
tool-cli outputs plain text or JSON. When a tool provides structured output (typed JSON),
|
|
32
|
+
tool-cli returns it directly as JSON — use \`jq\` to query fields.
|
|
33
|
+
Chain calls, filter, and transform results using pipes and bash idioms:
|
|
34
|
+
|
|
35
|
+
# Search across tool results
|
|
36
|
+
tool-cli myserver search_docs '{"query":"auth"}' | grep -i "token"
|
|
37
|
+
|
|
38
|
+
# Query structured JSON output with jq
|
|
39
|
+
tool-cli myserver list_issues '{"repo":"owner/repo"}' | jq '.[].title'
|
|
40
|
+
|
|
41
|
+
# Chain tool calls — feed one result into another
|
|
42
|
+
tool-cli myserver list_items '{}' | jq -r '.[0].id' | xargs -I{} tool-cli myserver get_item '{"id":"{}"}'
|
|
43
|
+
|
|
44
|
+
# Process multiple items
|
|
45
|
+
for city in London Tokyo Paris; do
|
|
46
|
+
echo "=== $city ==="; tool-cli weather check_weather '{"city":"'$city'"}';
|
|
47
|
+
done
|
|
48
|
+
|
|
49
|
+
# Combine with standard tools
|
|
50
|
+
tool-cli myserver export_csv '{"table":"users"}' | sort -t, -k2 | head -20
|
|
51
|
+
|
|
52
|
+
Prefer piping and chaining over multiple separate tool calls when processing collections or filtering results.
|
|
53
|
+
Errors go to stderr with exit code 1 — use \`&&\` or \`set -e\` for safe chaining.
|
|
54
|
+
${serverCount} MCP server(s) currently connected.
|
|
55
|
+
</tool_cli>`;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/tool-cli/format.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,WAAmB;IACxD,IAAI,WAAW,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4CP,WAAW;YACD,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.test.d.ts","sourceRoot":"","sources":["../../src/tool-cli/format.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { formatToolCliForPrompt } from "./format.js";
|
|
3
|
+
describe("formatToolCliForPrompt", () => {
|
|
4
|
+
it("returns empty string when no servers connected", () => {
|
|
5
|
+
expect(formatToolCliForPrompt(0)).toBe("");
|
|
6
|
+
});
|
|
7
|
+
it("includes tool-cli usage instructions when servers are connected", () => {
|
|
8
|
+
const result = formatToolCliForPrompt(2);
|
|
9
|
+
expect(result).toContain("tool-cli");
|
|
10
|
+
expect(result).toContain("<tool_cli>");
|
|
11
|
+
expect(result).toContain("</tool_cli>");
|
|
12
|
+
expect(result).toContain("--help");
|
|
13
|
+
expect(result).toContain("<server>");
|
|
14
|
+
expect(result).toContain("<tool>");
|
|
15
|
+
expect(result).toContain("2 MCP server(s) currently connected");
|
|
16
|
+
});
|
|
17
|
+
it("advises preferring skills over tool-cli", () => {
|
|
18
|
+
const result = formatToolCliForPrompt(1);
|
|
19
|
+
expect(result).toContain("prefer the skill");
|
|
20
|
+
});
|
|
21
|
+
it("includes shell chaining and piping examples", () => {
|
|
22
|
+
const result = formatToolCliForPrompt(1);
|
|
23
|
+
expect(result).toContain("grep");
|
|
24
|
+
expect(result).toContain("|");
|
|
25
|
+
expect(result).toContain("jq");
|
|
26
|
+
expect(result).toContain("xargs");
|
|
27
|
+
expect(result).toContain("Prefer piping and chaining");
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=format.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.test.js","sourceRoot":"","sources":["../../src/tool-cli/format.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,MAAM,GAAG,sBAAsB,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qCAAqC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,sBAAsB,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,MAAM,GAAG,sBAAsB,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tool-cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tool-cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Send a JSON-RPC 2.0 request to the tool-cli RPC server.
|
|
3
|
+
* Throws on network errors and JSON-RPC error responses.
|
|
4
|
+
*/
|
|
5
|
+
export declare function rpcCall(method: string, params?: Record<string, unknown>): Promise<unknown>;
|
|
6
|
+
//# sourceMappingURL=rpc-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc-client.d.ts","sourceRoot":"","sources":["../../src/tool-cli/rpc-client.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,wBAAsB,OAAO,CAC3B,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACnC,OAAO,CAAC,OAAO,CAAC,CAsBlB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { resolvePort } from "./constants.js";
|
|
2
|
+
/**
|
|
3
|
+
* Send a JSON-RPC 2.0 request to the tool-cli RPC server.
|
|
4
|
+
* Throws on network errors and JSON-RPC error responses.
|
|
5
|
+
*/
|
|
6
|
+
export async function rpcCall(method, params = {}) {
|
|
7
|
+
const port = resolvePort();
|
|
8
|
+
const url = `http://127.0.0.1:${port}`;
|
|
9
|
+
const response = await fetch(url, {
|
|
10
|
+
method: "POST",
|
|
11
|
+
headers: { "Content-Type": "application/json" },
|
|
12
|
+
body: JSON.stringify({
|
|
13
|
+
jsonrpc: "2.0",
|
|
14
|
+
method,
|
|
15
|
+
params,
|
|
16
|
+
id: 1,
|
|
17
|
+
}),
|
|
18
|
+
});
|
|
19
|
+
const json = (await response.json());
|
|
20
|
+
if (json.error) {
|
|
21
|
+
throw new Error(json.error.message);
|
|
22
|
+
}
|
|
23
|
+
return json.result;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=rpc-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc-client.js","sourceRoot":"","sources":["../../src/tool-cli/rpc-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAS7C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAAc,EACd,SAAkC,EAAE;IAEpC,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAG,oBAAoB,IAAI,EAAE,CAAC;IAEvC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,OAAO,EAAE,KAAK;YACd,MAAM;YACN,MAAM;YACN,EAAE,EAAE,CAAC;SACN,CAAC;KACH,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAoB,CAAC;IAExD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,IAAI,CAAC,MAAM,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { McpClientManager } from "../mcp/index.js";
|
|
2
|
+
interface ServerInfo {
|
|
3
|
+
name: string;
|
|
4
|
+
toolCount: number;
|
|
5
|
+
examples: string[];
|
|
6
|
+
}
|
|
7
|
+
interface ToolSummary {
|
|
8
|
+
name: string;
|
|
9
|
+
description: string;
|
|
10
|
+
hasStructuredOutput: boolean;
|
|
11
|
+
}
|
|
12
|
+
interface ToolDetails {
|
|
13
|
+
name: string;
|
|
14
|
+
description: string;
|
|
15
|
+
inputSchema: Record<string, unknown>;
|
|
16
|
+
outputSchema?: Record<string, unknown>;
|
|
17
|
+
annotations?: Record<string, unknown>;
|
|
18
|
+
}
|
|
19
|
+
export type { ServerInfo, ToolSummary, ToolDetails };
|
|
20
|
+
/**
|
|
21
|
+
* JSON-RPC 2.0 server that exposes MCP tool discovery and execution.
|
|
22
|
+
*
|
|
23
|
+
* Methods:
|
|
24
|
+
* - listServers → server names + tool counts + random examples
|
|
25
|
+
* - listTools(server) → tool names + descriptions
|
|
26
|
+
* - describeTool(server, tool) → full schema
|
|
27
|
+
* - callTool(server, tool, arguments) → execute and return result
|
|
28
|
+
*/
|
|
29
|
+
export declare class ToolCliRpcServer {
|
|
30
|
+
private mcpManager;
|
|
31
|
+
private server;
|
|
32
|
+
private port;
|
|
33
|
+
constructor(mcpManager: McpClientManager, port?: number);
|
|
34
|
+
/** Start the HTTP server. Resolves once listening. */
|
|
35
|
+
start(log?: (msg: string) => void): Promise<void>;
|
|
36
|
+
/** Stop the HTTP server. */
|
|
37
|
+
stop(): Promise<void>;
|
|
38
|
+
/** Returns the port the server is listening on (resolved after start for port 0). */
|
|
39
|
+
getPort(): number;
|
|
40
|
+
private handleBody;
|
|
41
|
+
private dispatch;
|
|
42
|
+
private listServers;
|
|
43
|
+
private listTools;
|
|
44
|
+
private describeTool;
|
|
45
|
+
private callTool;
|
|
46
|
+
private assertServerExists;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=rpc-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc-server.d.ts","sourceRoot":"","sources":["../../src/tool-cli/rpc-server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAW,MAAM,iBAAiB,CAAC;AAiBjE,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;AAErD;;;;;;;;GAQG;AACH,qBAAa,gBAAgB;IAKzB,OAAO,CAAC,UAAU;IAJpB,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,IAAI,CAAS;gBAGX,UAAU,EAAE,gBAAgB,EACpC,IAAI,CAAC,EAAE,MAAM;IAKf,sDAAsD;IAChD,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IA6DvD,4BAA4B;IACtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3B,qFAAqF;IACrF,OAAO,IAAI,MAAM;YAQH,UAAU;YAsBV,QAAQ;IAetB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,SAAS;IAcjB,OAAO,CAAC,YAAY;YAmBN,QAAQ;IAwBtB,OAAO,CAAC,kBAAkB;CAQ3B"}
|