@sammorrowdrums/mcpi-ext 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/.github/workflows/ci.yml +1 -1
  2. package/README.md +109 -139
  3. package/docs/code-mode.md +38 -0
  4. package/docs/skills.md +57 -0
  5. package/docs/tool-cli.md +54 -0
  6. package/images/code-mode-histogram.png +0 -0
  7. package/images/skills-enabling-mcp-tools.png +0 -0
  8. package/images/tool-cli-grep.png +0 -0
  9. package/mise.toml +1 -13
  10. package/package.json +5 -7
  11. package/scripts/test-tool-cli-smoke.mjs +40 -9
  12. package/src/index.ts +24 -3
  13. package/src/tool-cli/index.ts +2 -2
  14. package/dist/code-mode/code-mode-integration.test.d.ts +0 -2
  15. package/dist/code-mode/code-mode-integration.test.d.ts.map +0 -1
  16. package/dist/code-mode/code-mode-integration.test.js +0 -116
  17. package/dist/code-mode/code-mode-integration.test.js.map +0 -1
  18. package/dist/code-mode/eligibility.d.ts +0 -10
  19. package/dist/code-mode/eligibility.d.ts.map +0 -1
  20. package/dist/code-mode/eligibility.js +0 -14
  21. package/dist/code-mode/eligibility.js.map +0 -1
  22. package/dist/code-mode/eligibility.test.d.ts +0 -2
  23. package/dist/code-mode/eligibility.test.d.ts.map +0 -1
  24. package/dist/code-mode/eligibility.test.js +0 -53
  25. package/dist/code-mode/eligibility.test.js.map +0 -1
  26. package/dist/code-mode/executor.d.ts +0 -35
  27. package/dist/code-mode/executor.d.ts.map +0 -1
  28. package/dist/code-mode/executor.js +0 -120
  29. package/dist/code-mode/executor.js.map +0 -1
  30. package/dist/code-mode/executor.test.d.ts +0 -2
  31. package/dist/code-mode/executor.test.d.ts.map +0 -1
  32. package/dist/code-mode/executor.test.js +0 -130
  33. package/dist/code-mode/executor.test.js.map +0 -1
  34. package/dist/code-mode/index.d.ts +0 -65
  35. package/dist/code-mode/index.d.ts.map +0 -1
  36. package/dist/code-mode/index.js +0 -175
  37. package/dist/code-mode/index.js.map +0 -1
  38. package/dist/code-mode/tools.d.ts +0 -45
  39. package/dist/code-mode/tools.d.ts.map +0 -1
  40. package/dist/code-mode/tools.js +0 -70
  41. package/dist/code-mode/tools.js.map +0 -1
  42. package/dist/code-mode/type-hints.d.ts +0 -20
  43. package/dist/code-mode/type-hints.d.ts.map +0 -1
  44. package/dist/code-mode/type-hints.js +0 -189
  45. package/dist/code-mode/type-hints.js.map +0 -1
  46. package/dist/code-mode/type-hints.test.d.ts +0 -2
  47. package/dist/code-mode/type-hints.test.d.ts.map +0 -1
  48. package/dist/code-mode/type-hints.test.js +0 -157
  49. package/dist/code-mode/type-hints.test.js.map +0 -1
  50. package/dist/docker-e2e.d.ts +0 -55
  51. package/dist/docker-e2e.d.ts.map +0 -1
  52. package/dist/docker-e2e.js +0 -235
  53. package/dist/docker-e2e.js.map +0 -1
  54. package/dist/docker-e2e.test.d.ts +0 -2
  55. package/dist/docker-e2e.test.d.ts.map +0 -1
  56. package/dist/docker-e2e.test.js +0 -176
  57. package/dist/docker-e2e.test.js.map +0 -1
  58. package/dist/index.d.ts +0 -3
  59. package/dist/index.d.ts.map +0 -1
  60. package/dist/index.js +0 -128
  61. package/dist/index.js.map +0 -1
  62. package/dist/index.test.d.ts +0 -2
  63. package/dist/index.test.d.ts.map +0 -1
  64. package/dist/index.test.js +0 -8
  65. package/dist/index.test.js.map +0 -1
  66. package/dist/mcp/client-manager.d.ts +0 -46
  67. package/dist/mcp/client-manager.d.ts.map +0 -1
  68. package/dist/mcp/client-manager.js +0 -148
  69. package/dist/mcp/client-manager.js.map +0 -1
  70. package/dist/mcp/client-manager.test.d.ts +0 -2
  71. package/dist/mcp/client-manager.test.d.ts.map +0 -1
  72. package/dist/mcp/client-manager.test.js +0 -204
  73. package/dist/mcp/client-manager.test.js.map +0 -1
  74. package/dist/mcp/config-loader.d.ts +0 -8
  75. package/dist/mcp/config-loader.d.ts.map +0 -1
  76. package/dist/mcp/config-loader.js +0 -43
  77. package/dist/mcp/config-loader.js.map +0 -1
  78. package/dist/mcp/config-loader.test.d.ts +0 -2
  79. package/dist/mcp/config-loader.test.d.ts.map +0 -1
  80. package/dist/mcp/config-loader.test.js +0 -93
  81. package/dist/mcp/config-loader.test.js.map +0 -1
  82. package/dist/mcp/config.d.ts +0 -46
  83. package/dist/mcp/config.d.ts.map +0 -1
  84. package/dist/mcp/config.js +0 -28
  85. package/dist/mcp/config.js.map +0 -1
  86. package/dist/mcp/index.d.ts +0 -5
  87. package/dist/mcp/index.d.ts.map +0 -1
  88. package/dist/mcp/index.js +0 -4
  89. package/dist/mcp/index.js.map +0 -1
  90. package/dist/skills/discover.d.ts +0 -10
  91. package/dist/skills/discover.d.ts.map +0 -1
  92. package/dist/skills/discover.js +0 -60
  93. package/dist/skills/discover.js.map +0 -1
  94. package/dist/skills/format.d.ts +0 -10
  95. package/dist/skills/format.d.ts.map +0 -1
  96. package/dist/skills/format.js +0 -38
  97. package/dist/skills/format.js.map +0 -1
  98. package/dist/skills/format.test.d.ts +0 -2
  99. package/dist/skills/format.test.d.ts.map +0 -1
  100. package/dist/skills/format.test.js +0 -63
  101. package/dist/skills/format.test.js.map +0 -1
  102. package/dist/skills/index.d.ts +0 -6
  103. package/dist/skills/index.d.ts.map +0 -1
  104. package/dist/skills/index.js +0 -6
  105. package/dist/skills/index.js.map +0 -1
  106. package/dist/skills/load-skill-tool.d.ts +0 -40
  107. package/dist/skills/load-skill-tool.d.ts.map +0 -1
  108. package/dist/skills/load-skill-tool.js +0 -104
  109. package/dist/skills/load-skill-tool.js.map +0 -1
  110. package/dist/skills/mcp-tool-proxy.d.ts +0 -11
  111. package/dist/skills/mcp-tool-proxy.d.ts.map +0 -1
  112. package/dist/skills/mcp-tool-proxy.js +0 -116
  113. package/dist/skills/mcp-tool-proxy.js.map +0 -1
  114. package/dist/skills/skill-integration.test.d.ts +0 -2
  115. package/dist/skills/skill-integration.test.d.ts.map +0 -1
  116. package/dist/skills/skill-integration.test.js +0 -119
  117. package/dist/skills/skill-integration.test.js.map +0 -1
  118. package/dist/skills/skill-registry.d.ts +0 -39
  119. package/dist/skills/skill-registry.d.ts.map +0 -1
  120. package/dist/skills/skill-registry.js +0 -48
  121. package/dist/skills/skill-registry.js.map +0 -1
  122. package/dist/skills/skill-registry.test.d.ts +0 -2
  123. package/dist/skills/skill-registry.test.d.ts.map +0 -1
  124. package/dist/skills/skill-registry.test.js +0 -67
  125. package/dist/skills/skill-registry.test.js.map +0 -1
  126. package/dist/test-servers/weather-server.d.ts +0 -12
  127. package/dist/test-servers/weather-server.d.ts.map +0 -1
  128. package/dist/test-servers/weather-server.js +0 -139
  129. package/dist/test-servers/weather-server.js.map +0 -1
  130. package/dist/test-servers/weather-stdio.d.ts +0 -2
  131. package/dist/test-servers/weather-stdio.d.ts.map +0 -1
  132. package/dist/test-servers/weather-stdio.js +0 -11
  133. package/dist/test-servers/weather-stdio.js.map +0 -1
  134. package/dist/tool-cli/cli.d.ts +0 -3
  135. package/dist/tool-cli/cli.d.ts.map +0 -1
  136. package/dist/tool-cli/cli.js +0 -179
  137. package/dist/tool-cli/cli.js.map +0 -1
  138. package/dist/tool-cli/constants.d.ts +0 -7
  139. package/dist/tool-cli/constants.d.ts.map +0 -1
  140. package/dist/tool-cli/constants.js +0 -15
  141. package/dist/tool-cli/constants.js.map +0 -1
  142. package/dist/tool-cli/format.d.ts +0 -8
  143. package/dist/tool-cli/format.d.ts.map +0 -1
  144. package/dist/tool-cli/format.js +0 -57
  145. package/dist/tool-cli/format.js.map +0 -1
  146. package/dist/tool-cli/format.test.d.ts +0 -2
  147. package/dist/tool-cli/format.test.d.ts.map +0 -1
  148. package/dist/tool-cli/format.test.js +0 -30
  149. package/dist/tool-cli/format.test.js.map +0 -1
  150. package/dist/tool-cli/index.d.ts +0 -4
  151. package/dist/tool-cli/index.d.ts.map +0 -1
  152. package/dist/tool-cli/index.js +0 -4
  153. package/dist/tool-cli/index.js.map +0 -1
  154. package/dist/tool-cli/rpc-client.d.ts +0 -6
  155. package/dist/tool-cli/rpc-client.d.ts.map +0 -1
  156. package/dist/tool-cli/rpc-client.js +0 -25
  157. package/dist/tool-cli/rpc-client.js.map +0 -1
  158. package/dist/tool-cli/rpc-server.d.ts +0 -48
  159. package/dist/tool-cli/rpc-server.d.ts.map +0 -1
  160. package/dist/tool-cli/rpc-server.js +0 -220
  161. package/dist/tool-cli/rpc-server.js.map +0 -1
  162. package/dist/tool-cli/rpc-server.test.d.ts +0 -2
  163. package/dist/tool-cli/rpc-server.test.d.ts.map +0 -1
  164. package/dist/tool-cli/rpc-server.test.js +0 -154
  165. package/dist/tool-cli/rpc-server.test.js.map +0 -1
  166. package/src/tool-cli/cli.ts +0 -232
  167. package/src/tool-cli/constants.ts +0 -15
  168. package/src/tool-cli/rpc-client.ts +0 -39
  169. package/src/tool-cli/rpc-server.test.ts +0 -193
  170. package/src/tool-cli/rpc-server.ts +0 -287
@@ -1,204 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from "vitest";
2
- import { McpClientManager } from "./client-manager.js";
3
- // Mock the MCP SDK transports and client
4
- vi.mock("@modelcontextprotocol/sdk/client/index.js", () => {
5
- class MockClient {
6
- _onToolsChanged;
7
- constructor(_info, options) {
8
- this._onToolsChanged = options?.listChanged?.tools?.onChanged;
9
- }
10
- async connect(_transport) {
11
- // no-op for tests
12
- }
13
- async close() {
14
- // no-op for tests
15
- }
16
- async listTools() {
17
- return {
18
- tools: [
19
- {
20
- name: "mock_tool",
21
- description: "A mock tool for testing",
22
- inputSchema: { type: "object", properties: { arg: { type: "string" } } },
23
- annotations: { readOnlyHint: true },
24
- },
25
- {
26
- name: "mock_tool_2",
27
- description: "Another mock tool",
28
- inputSchema: { type: "object", properties: {} },
29
- },
30
- ],
31
- };
32
- }
33
- /** Test helper to simulate tools/list_changed notification. */
34
- _simulateToolsChanged(tools) {
35
- this._onToolsChanged?.(null, tools);
36
- }
37
- }
38
- return { Client: MockClient };
39
- });
40
- vi.mock("@modelcontextprotocol/sdk/client/stdio.js", () => ({
41
- // eslint-disable-next-line @typescript-eslint/no-extraneous-class
42
- StdioClientTransport: class {
43
- // eslint-disable-next-line @typescript-eslint/no-useless-constructor
44
- constructor(_params) {
45
- // no-op mock
46
- }
47
- },
48
- }));
49
- vi.mock("@modelcontextprotocol/sdk/client/streamableHttp.js", () => ({
50
- // eslint-disable-next-line @typescript-eslint/no-extraneous-class
51
- StreamableHTTPClientTransport: class {
52
- // eslint-disable-next-line @typescript-eslint/no-useless-constructor
53
- constructor(_url, _opts) {
54
- // no-op mock
55
- }
56
- },
57
- }));
58
- describe("McpClientManager", () => {
59
- let manager;
60
- beforeEach(() => {
61
- manager = new McpClientManager();
62
- });
63
- it("connects to a stdio server and discovers tools", async () => {
64
- await manager.connectAll({
65
- mcpServers: {
66
- "test-stdio": {
67
- type: "stdio",
68
- command: "node",
69
- args: ["test-server.js"],
70
- },
71
- },
72
- });
73
- expect(manager.getConnectedServers()).toEqual(["test-stdio"]);
74
- const tools = manager.getTools();
75
- expect(tools).toHaveLength(2);
76
- expect(tools[0].name).toBe("mock_tool");
77
- expect(tools[0].serverName).toBe("test-stdio");
78
- expect(tools[0].description).toBe("A mock tool for testing");
79
- expect(tools[0].annotations).toEqual({ readOnlyHint: true });
80
- expect(tools[1].name).toBe("mock_tool_2");
81
- });
82
- it("connects to a remote server and discovers tools", async () => {
83
- await manager.connectAll({
84
- mcpServers: {
85
- "test-remote": {
86
- type: "remote",
87
- url: "https://example.com/mcp",
88
- headers: { Authorization: "Bearer test" },
89
- },
90
- },
91
- });
92
- expect(manager.getConnectedServers()).toEqual(["test-remote"]);
93
- expect(manager.getTools()).toHaveLength(2);
94
- });
95
- it("connects to multiple servers and aggregates tools", async () => {
96
- await manager.connectAll({
97
- mcpServers: {
98
- server1: { type: "stdio", command: "node", args: ["s1.js"] },
99
- server2: { type: "remote", url: "https://example.com/mcp" },
100
- },
101
- });
102
- expect(manager.getConnectedServers()).toHaveLength(2);
103
- // 2 tools per server
104
- expect(manager.getTools()).toHaveLength(4);
105
- });
106
- it("getToolsForServer returns tools for a specific server", async () => {
107
- await manager.connectAll({
108
- mcpServers: {
109
- srv: { type: "stdio", command: "echo" },
110
- },
111
- });
112
- expect(manager.getToolsForServer("srv")).toHaveLength(2);
113
- expect(manager.getToolsForServer("nonexistent")).toEqual([]);
114
- });
115
- it("getClient returns the client for a connected server", async () => {
116
- await manager.connectAll({
117
- mcpServers: {
118
- srv: { type: "stdio", command: "echo" },
119
- },
120
- });
121
- expect(manager.getClient("srv")).toBeDefined();
122
- expect(manager.getClient("nonexistent")).toBeUndefined();
123
- });
124
- it("disconnectOne removes a server", async () => {
125
- await manager.connectAll({
126
- mcpServers: {
127
- srv: { type: "stdio", command: "echo" },
128
- },
129
- });
130
- expect(manager.getConnectedServers()).toEqual(["srv"]);
131
- await manager.disconnectOne("srv");
132
- expect(manager.getConnectedServers()).toEqual([]);
133
- expect(manager.getTools()).toEqual([]);
134
- });
135
- it("disconnectAll removes all servers", async () => {
136
- await manager.connectAll({
137
- mcpServers: {
138
- s1: { type: "stdio", command: "echo" },
139
- s2: { type: "remote", url: "https://example.com/mcp" },
140
- },
141
- });
142
- expect(manager.getConnectedServers()).toHaveLength(2);
143
- await manager.disconnectAll();
144
- expect(manager.getConnectedServers()).toEqual([]);
145
- });
146
- it("handles empty config gracefully", async () => {
147
- await manager.connectAll({ mcpServers: {} });
148
- expect(manager.getConnectedServers()).toEqual([]);
149
- expect(manager.getTools()).toEqual([]);
150
- });
151
- it("reconnects when connecting to an already-connected server name", async () => {
152
- await manager.connectOne("srv", { type: "stdio", command: "node" });
153
- expect(manager.getConnectedServers()).toEqual(["srv"]);
154
- // Connect again with same name — should replace
155
- await manager.connectOne("srv", { type: "remote", url: "https://example.com/mcp" });
156
- expect(manager.getConnectedServers()).toEqual(["srv"]);
157
- expect(manager.getTools()).toHaveLength(2);
158
- });
159
- it("logs failures but continues connecting other servers", async () => {
160
- const logs = [];
161
- // Patch Client.connect to fail for a specific transport
162
- const { Client } = await import("@modelcontextprotocol/sdk/client/index.js");
163
- const origConnect = Client.prototype.connect;
164
- let callCount = 0;
165
- Client.prototype.connect = async function (transport) {
166
- callCount++;
167
- if (callCount === 1)
168
- throw new Error("Connection refused");
169
- return origConnect.call(this, transport);
170
- };
171
- try {
172
- await manager.connectAll({
173
- mcpServers: {
174
- failing: { type: "stdio", command: "bad-command" },
175
- working: { type: "stdio", command: "good-command" },
176
- },
177
- }, (msg) => logs.push(msg));
178
- // The working server should still be connected
179
- expect(manager.getConnectedServers()).toContain("working");
180
- expect(logs.some((l) => l.includes("Failed to connect") && l.includes("failing"))).toBe(true);
181
- }
182
- finally {
183
- Client.prototype.connect = origConnect;
184
- }
185
- });
186
- it("updates tools when list_changed notification fires", async () => {
187
- const logs = [];
188
- await manager.connectAll({ mcpServers: { srv: { type: "stdio", command: "echo" } } }, (msg) => logs.push(msg));
189
- expect(manager.getToolsForServer("srv")).toHaveLength(2);
190
- // Simulate a tools/list_changed notification via the mock
191
- const client = manager.getClient("srv");
192
- client._simulateToolsChanged([
193
- {
194
- name: "new_tool",
195
- description: "A dynamically added tool",
196
- inputSchema: { type: "object", properties: {} },
197
- },
198
- ]);
199
- expect(manager.getToolsForServer("srv")).toHaveLength(1);
200
- expect(manager.getToolsForServer("srv")[0].name).toBe("new_tool");
201
- expect(logs.some((l) => l.includes("Tools updated"))).toBe(true);
202
- });
203
- });
204
- //# sourceMappingURL=client-manager.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client-manager.test.js","sourceRoot":"","sources":["../../src/mcp/client-manager.test.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- import { McpConfig } from "./config.js";
2
- /**
3
- * Load and validate an MCP config file.
4
- * Returns an empty config if the file doesn't exist.
5
- * Throws on invalid JSON or schema violations.
6
- */
7
- export declare function loadMcpConfig(configPath?: string): Promise<McpConfig>;
8
- //# sourceMappingURL=config-loader.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/mcp/config-loader.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAIxC;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAgC3E"}
@@ -1,43 +0,0 @@
1
- import { readFile } from "node:fs/promises";
2
- import { homedir } from "node:os";
3
- import { join } from "node:path";
4
- import { Value } from "typebox/value";
5
- import { McpConfig } from "./config.js";
6
- const DEFAULT_CONFIG_PATH = join(homedir(), ".config", "mcpi-ext", "mcp.json");
7
- /**
8
- * Load and validate an MCP config file.
9
- * Returns an empty config if the file doesn't exist.
10
- * Throws on invalid JSON or schema violations.
11
- */
12
- export async function loadMcpConfig(configPath) {
13
- const path = configPath ?? DEFAULT_CONFIG_PATH;
14
- let raw;
15
- try {
16
- raw = await readFile(path, "utf-8");
17
- }
18
- catch (err) {
19
- if (err.code === "ENOENT") {
20
- return { mcpServers: {} };
21
- }
22
- throw new Error(`Failed to read MCP config at ${path}: ${err.message}`, {
23
- cause: err,
24
- });
25
- }
26
- let parsed;
27
- try {
28
- parsed = JSON.parse(raw);
29
- }
30
- catch {
31
- throw new Error(`Invalid JSON in MCP config at ${path}`);
32
- }
33
- if (!Value.Check(McpConfig, parsed)) {
34
- const errors = Value.Errors(McpConfig, parsed);
35
- const details = errors
36
- .slice(0, 5)
37
- .map((e) => ` ${e.instancePath || "/"}: ${e.message}`)
38
- .join("\n");
39
- throw new Error(`Invalid MCP config at ${path}:\n${details}`);
40
- }
41
- return parsed;
42
- }
43
- //# sourceMappingURL=config-loader.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/mcp/config-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAE/E;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAmB;IACrD,MAAM,IAAI,GAAG,UAAU,IAAI,mBAAmB,CAAC;IAE/C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrD,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;QAC5B,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,KAAM,GAAa,CAAC,OAAO,EAAE,EAAE;YACjF,KAAK,EAAE,GAAG;SACX,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,MAAM;aACnB,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,YAAY,IAAI,GAAG,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;aACtD,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,MAAM,OAAO,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=config-loader.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-loader.test.d.ts","sourceRoot":"","sources":["../../src/mcp/config-loader.test.ts"],"names":[],"mappings":""}
@@ -1,93 +0,0 @@
1
- import { describe, it, expect, afterEach } from "vitest";
2
- import { writeFile, mkdtemp, rm } from "node:fs/promises";
3
- import { join } from "node:path";
4
- import { tmpdir } from "node:os";
5
- import { loadMcpConfig } from "./config-loader.js";
6
- describe("loadMcpConfig", () => {
7
- let dir;
8
- async function writeConfig(content) {
9
- dir = await mkdtemp(join(tmpdir(), "mcp-config-test-"));
10
- const path = join(dir, "mcp.json");
11
- await writeFile(path, content, "utf-8");
12
- return path;
13
- }
14
- // Clean up temp dir after each test
15
- afterEach(async () => {
16
- if (dir) {
17
- await rm(dir, { recursive: true, force: true }).catch(() => undefined);
18
- }
19
- });
20
- it("returns empty config when file does not exist", async () => {
21
- const config = await loadMcpConfig("/tmp/does-not-exist-" + Date.now() + ".json");
22
- expect(config).toEqual({ mcpServers: {} });
23
- });
24
- it("loads a valid stdio server config", async () => {
25
- const path = await writeConfig(JSON.stringify({
26
- mcpServers: {
27
- "test-server": {
28
- type: "stdio",
29
- command: "node",
30
- args: ["server.js"],
31
- env: { API_KEY: "secret" },
32
- },
33
- },
34
- }));
35
- const config = await loadMcpConfig(path);
36
- expect(config.mcpServers["test-server"]).toEqual({
37
- type: "stdio",
38
- command: "node",
39
- args: ["server.js"],
40
- env: { API_KEY: "secret" },
41
- });
42
- });
43
- it("loads a valid remote server config", async () => {
44
- const path = await writeConfig(JSON.stringify({
45
- mcpServers: {
46
- "remote-server": {
47
- type: "remote",
48
- url: "https://example.com/mcp",
49
- headers: { Authorization: "Bearer tok" },
50
- },
51
- },
52
- }));
53
- const config = await loadMcpConfig(path);
54
- expect(config.mcpServers["remote-server"]).toEqual({
55
- type: "remote",
56
- url: "https://example.com/mcp",
57
- headers: { Authorization: "Bearer tok" },
58
- });
59
- });
60
- it("loads mixed server types", async () => {
61
- const path = await writeConfig(JSON.stringify({
62
- mcpServers: {
63
- local: { type: "stdio", command: "python", args: ["-m", "mcp_server"] },
64
- cloud: { type: "remote", url: "https://api.example.com/mcp" },
65
- },
66
- }));
67
- const config = await loadMcpConfig(path);
68
- expect(Object.keys(config.mcpServers)).toEqual(["local", "cloud"]);
69
- expect(config.mcpServers["local"].type).toBe("stdio");
70
- expect(config.mcpServers["cloud"].type).toBe("remote");
71
- });
72
- it("throws on invalid JSON", async () => {
73
- const path = await writeConfig("not json {{{");
74
- await expect(loadMcpConfig(path)).rejects.toThrow("Invalid JSON");
75
- });
76
- it("throws on schema violation (missing required fields)", async () => {
77
- const path = await writeConfig(JSON.stringify({
78
- mcpServers: {
79
- bad: { type: "stdio" }, // missing "command"
80
- },
81
- }));
82
- await expect(loadMcpConfig(path)).rejects.toThrow("Invalid MCP config");
83
- });
84
- it("throws on unknown server type", async () => {
85
- const path = await writeConfig(JSON.stringify({
86
- mcpServers: {
87
- bad: { type: "websocket", url: "ws://localhost" },
88
- },
89
- }));
90
- await expect(loadMcpConfig(path)).rejects.toThrow("Invalid MCP config");
91
- });
92
- });
93
- //# sourceMappingURL=config-loader.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-loader.test.js","sourceRoot":"","sources":["../../src/mcp/config-loader.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAI,GAAW,CAAC;IAEhB,KAAK,UAAU,WAAW,CAAC,OAAe;QACxC,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;QACxD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QACnC,MAAM,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,oCAAoC;IACpC,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACzE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,sBAAsB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC;QAClF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,IAAI,GAAG,MAAM,WAAW,CAC5B,IAAI,CAAC,SAAS,CAAC;YACb,UAAU,EAAE;gBACV,aAAa,EAAE;oBACb,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,MAAM;oBACf,IAAI,EAAE,CAAC,WAAW,CAAC;oBACnB,GAAG,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE;iBAC3B;aACF;SACF,CAAC,CACH,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC;YAC/C,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,MAAM;YACf,IAAI,EAAE,CAAC,WAAW,CAAC;YACnB,GAAG,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE;SAC3B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,IAAI,GAAG,MAAM,WAAW,CAC5B,IAAI,CAAC,SAAS,CAAC;YACb,UAAU,EAAE;gBACV,eAAe,EAAE;oBACf,IAAI,EAAE,QAAQ;oBACd,GAAG,EAAE,yBAAyB;oBAC9B,OAAO,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE;iBACzC;aACF;SACF,CAAC,CACH,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC;YACjD,IAAI,EAAE,QAAQ;YACd,GAAG,EAAE,yBAAyB;YAC9B,OAAO,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE;SACzC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,IAAI,GAAG,MAAM,WAAW,CAC5B,IAAI,CAAC,SAAS,CAAC;YACb,UAAU,EAAE;gBACV,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE;gBACvE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,6BAA6B,EAAE;aAC9D;SACF,CAAC,CACH,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QACnE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,cAAc,CAAC,CAAC;QAC/C,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,IAAI,GAAG,MAAM,WAAW,CAC5B,IAAI,CAAC,SAAS,CAAC;YACb,UAAU,EAAE;gBACV,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,oBAAoB;aAC7C;SACF,CAAC,CACH,CAAC;QACF,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,IAAI,GAAG,MAAM,WAAW,CAC5B,IAAI,CAAC,SAAS,CAAC;YACb,UAAU,EAAE;gBACV,GAAG,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,gBAAgB,EAAE;aAClD;SACF,CAAC,CACH,CAAC;QACF,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,46 +0,0 @@
1
- import { Type, type Static } from "typebox";
2
- /** Configuration for a stdio-based MCP server (spawns a child process). */
3
- export declare const StdioServerConfig: Type.TObject<{
4
- type: Type.TLiteral<"stdio">;
5
- command: Type.TString;
6
- args: Type.TOptional<Type.TArray<Type.TString>>;
7
- env: Type.TOptional<Type.TRecord<"^.*$", Type.TString>>;
8
- cwd: Type.TOptional<Type.TString>;
9
- }>;
10
- /** Configuration for a remote MCP server (Streamable HTTP). */
11
- export declare const RemoteServerConfig: Type.TObject<{
12
- type: Type.TLiteral<"remote">;
13
- url: Type.TString;
14
- headers: Type.TOptional<Type.TRecord<"^.*$", Type.TString>>;
15
- }>;
16
- /** A single MCP server entry — either stdio or remote. */
17
- export declare const ServerConfig: Type.TUnion<[Type.TObject<{
18
- type: Type.TLiteral<"stdio">;
19
- command: Type.TString;
20
- args: Type.TOptional<Type.TArray<Type.TString>>;
21
- env: Type.TOptional<Type.TRecord<"^.*$", Type.TString>>;
22
- cwd: Type.TOptional<Type.TString>;
23
- }>, Type.TObject<{
24
- type: Type.TLiteral<"remote">;
25
- url: Type.TString;
26
- headers: Type.TOptional<Type.TRecord<"^.*$", Type.TString>>;
27
- }>]>;
28
- /** Top-level configuration file schema. */
29
- export declare const McpConfig: Type.TObject<{
30
- mcpServers: Type.TRecord<"^.*$", Type.TUnion<[Type.TObject<{
31
- type: Type.TLiteral<"stdio">;
32
- command: Type.TString;
33
- args: Type.TOptional<Type.TArray<Type.TString>>;
34
- env: Type.TOptional<Type.TRecord<"^.*$", Type.TString>>;
35
- cwd: Type.TOptional<Type.TString>;
36
- }>, Type.TObject<{
37
- type: Type.TLiteral<"remote">;
38
- url: Type.TString;
39
- headers: Type.TOptional<Type.TRecord<"^.*$", Type.TString>>;
40
- }>]>>;
41
- }>;
42
- export type StdioServerConfig = Static<typeof StdioServerConfig>;
43
- export type RemoteServerConfig = Static<typeof RemoteServerConfig>;
44
- export type ServerConfig = Static<typeof ServerConfig>;
45
- export type McpConfig = Static<typeof McpConfig>;
46
- //# sourceMappingURL=config.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/mcp/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,MAAM,EAAE,MAAM,SAAS,CAAC;AAE5C,2EAA2E;AAC3E,eAAO,MAAM,iBAAiB;;;;;;EAU5B,CAAC;AAEH,+DAA+D;AAC/D,eAAO,MAAM,kBAAkB;;;;EAQ7B,CAAC;AAEH,0DAA0D;AAC1D,eAAO,MAAM,YAAY;;;;;;;;;;IAAsD,CAAC;AAEhF,2CAA2C;AAC3C,eAAO,MAAM,SAAS;;;;;;;;;;;;EAIpB,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,iBAAiB,CAAC,CAAC;AACjE,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,OAAO,kBAAkB,CAAC,CAAC;AACnE,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,YAAY,CAAC,CAAC;AACvD,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,SAAS,CAAC,CAAC"}
@@ -1,28 +0,0 @@
1
- import { Type } from "typebox";
2
- /** Configuration for a stdio-based MCP server (spawns a child process). */
3
- export const StdioServerConfig = Type.Object({
4
- type: Type.Literal("stdio"),
5
- command: Type.String({ description: "Executable to run" }),
6
- args: Type.Optional(Type.Array(Type.String(), { description: "Command-line arguments" })),
7
- env: Type.Optional(Type.Record(Type.String(), Type.String(), {
8
- description: "Extra environment variables for the child process",
9
- })),
10
- cwd: Type.Optional(Type.String({ description: "Working directory for the child process" })),
11
- });
12
- /** Configuration for a remote MCP server (Streamable HTTP). */
13
- export const RemoteServerConfig = Type.Object({
14
- type: Type.Literal("remote"),
15
- url: Type.String({ description: "HTTP(S) endpoint URL" }),
16
- headers: Type.Optional(Type.Record(Type.String(), Type.String(), {
17
- description: "Extra HTTP headers (e.g. Authorization)",
18
- })),
19
- });
20
- /** A single MCP server entry — either stdio or remote. */
21
- export const ServerConfig = Type.Union([StdioServerConfig, RemoteServerConfig]);
22
- /** Top-level configuration file schema. */
23
- export const McpConfig = Type.Object({
24
- mcpServers: Type.Record(Type.String(), ServerConfig, {
25
- description: "Named MCP server configurations",
26
- }),
27
- });
28
- //# sourceMappingURL=config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/mcp/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAe,MAAM,SAAS,CAAC;AAE5C,2EAA2E;AAC3E,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3C,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IAC3B,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,mBAAmB,EAAE,CAAC;IAC1D,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,wBAAwB,EAAE,CAAC,CAAC;IACzF,GAAG,EAAE,IAAI,CAAC,QAAQ,CAChB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE;QACxC,WAAW,EAAE,mDAAmD;KACjE,CAAC,CACH;IACD,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,yCAAyC,EAAE,CAAC,CAAC;CAC5F,CAAC,CAAC;AAEH,+DAA+D;AAC/D,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC;IAC5C,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC5B,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,sBAAsB,EAAE,CAAC;IACzD,OAAO,EAAE,IAAI,CAAC,QAAQ,CACpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE;QACxC,WAAW,EAAE,yCAAyC;KACvD,CAAC,CACH;CACF,CAAC,CAAC;AAEH,0DAA0D;AAC1D,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAAC,CAAC;AAEhF,2CAA2C;AAC3C,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;IACnC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,YAAY,EAAE;QACnD,WAAW,EAAE,iCAAiC;KAC/C,CAAC;CACH,CAAC,CAAC"}
@@ -1,5 +0,0 @@
1
- export type { McpConfig, ServerConfig, StdioServerConfig, RemoteServerConfig } from "./config.js";
2
- export { McpConfig as McpConfigSchema } from "./config.js";
3
- export { loadMcpConfig } from "./config-loader.js";
4
- export { McpClientManager, type McpTool } from "./client-manager.js";
5
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAClG,OAAO,EAAE,SAAS,IAAI,eAAe,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/mcp/index.js DELETED
@@ -1,4 +0,0 @@
1
- export { McpConfig as McpConfigSchema } from "./config.js";
2
- export { loadMcpConfig } from "./config-loader.js";
3
- export { McpClientManager } from "./client-manager.js";
4
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,IAAI,eAAe,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAgB,MAAM,qBAAqB,CAAC"}
@@ -1,10 +0,0 @@
1
- import type { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
- import type { McpSkillMetadata } from "./skill-registry.js";
3
- /**
4
- * Discover skills from a connected MCP server by reading its resources.
5
- *
6
- * Looks for resources with `skill://` URIs ending in `/SKILL.md`,
7
- * reads each one, and parses YAML frontmatter for skill metadata.
8
- */
9
- export declare function discoverSkillsFromServer(client: Client, serverName: string, log?: (msg: string) => void): Promise<McpSkillMetadata[]>;
10
- //# sourceMappingURL=discover.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/skills/discover.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAExE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAoB,GACzC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA2D7B"}
@@ -1,60 +0,0 @@
1
- import { parseFrontmatter } from "@sammorrowdrums/mcpi";
2
- /**
3
- * Discover skills from a connected MCP server by reading its resources.
4
- *
5
- * Looks for resources with `skill://` URIs ending in `/SKILL.md`,
6
- * reads each one, and parses YAML frontmatter for skill metadata.
7
- */
8
- export async function discoverSkillsFromServer(client, serverName, log = console.error) {
9
- const skills = [];
10
- let resources;
11
- try {
12
- const result = await client.listResources();
13
- resources = result.resources;
14
- }
15
- catch {
16
- log(`[skills] Server "${serverName}" does not support resources/list, skipping skill discovery`);
17
- return skills;
18
- }
19
- const skillResources = resources.filter((r) => r.uri.startsWith("skill://") && r.uri.endsWith("/SKILL.md"));
20
- if (skillResources.length === 0)
21
- return skills;
22
- for (const resource of skillResources) {
23
- try {
24
- const result = await client.readResource({ uri: resource.uri });
25
- const textContent = result.contents.find((c) => "text" in c);
26
- if (!textContent) {
27
- log(`[skills] Skill resource ${resource.uri} returned no text content, skipping`);
28
- continue;
29
- }
30
- const parsed = parseFrontmatter(textContent.text);
31
- const fm = parsed.frontmatter;
32
- const name = fm.name ?? resource.name;
33
- const description = fm.description ?? "";
34
- const allowedTools = parseAllowedTools(fm["allowed-tools"]);
35
- if (!name) {
36
- log(`[skills] Skill at ${resource.uri} has no name, skipping`);
37
- continue;
38
- }
39
- skills.push({
40
- name,
41
- description,
42
- uri: resource.uri,
43
- serverName,
44
- allowedTools,
45
- });
46
- log(`[skills] Discovered skill "${name}" from "${serverName}" (${allowedTools.length} gated tools)`);
47
- }
48
- catch (err) {
49
- log(`[skills] Failed to read skill ${resource.uri}: ${err.message}`);
50
- }
51
- }
52
- return skills;
53
- }
54
- function parseAllowedTools(value) {
55
- if (Array.isArray(value)) {
56
- return value.filter((v) => typeof v === "string");
57
- }
58
- return [];
59
- }
60
- //# sourceMappingURL=discover.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/skills/discover.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGxD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,MAAc,EACd,UAAkB,EAClB,MAA6B,OAAO,CAAC,KAAK;IAE1C,MAAM,MAAM,GAAuB,EAAE,CAAC;IAEtC,IAAI,SAA0C,CAAC;IAC/C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;QAC5C,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,CACD,oBAAoB,UAAU,6DAA6D,CAC5F,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,CACrC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CACnE,CAAC;IAEF,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAE/C,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;YAChE,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CACtC,CAAC,CAAC,EAAsC,EAAE,CAAC,MAAM,IAAI,CAAC,CACvD,CAAC;YACF,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,GAAG,CAAC,2BAA2B,QAAQ,CAAC,GAAG,qCAAqC,CAAC,CAAC;gBAClF,SAAS;YACX,CAAC;YAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAClD,MAAM,EAAE,GAAG,MAAM,CAAC,WAAsC,CAAC;YACzD,MAAM,IAAI,GAAI,EAAE,CAAC,IAA2B,IAAI,QAAQ,CAAC,IAAI,CAAC;YAC9D,MAAM,WAAW,GAAI,EAAE,CAAC,WAAkC,IAAI,EAAE,CAAC;YACjE,MAAM,YAAY,GAAG,iBAAiB,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;YAE5D,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,GAAG,CAAC,qBAAqB,QAAQ,CAAC,GAAG,wBAAwB,CAAC,CAAC;gBAC/D,SAAS;YACX,CAAC;YAED,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI;gBACJ,WAAW;gBACX,GAAG,EAAE,QAAQ,CAAC,GAAG;gBACjB,UAAU;gBACV,YAAY;aACb,CAAC,CAAC;YAEH,GAAG,CACD,8BAA8B,IAAI,WAAW,UAAU,MAAM,YAAY,CAAC,MAAM,eAAe,CAChG,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,iCAAiC,QAAQ,CAAC,GAAG,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -1,10 +0,0 @@
1
- import type { McpSkillMetadata } from "./skill-registry.js";
2
- /**
3
- * Format MCP-discovered skills for inclusion in the system prompt.
4
- *
5
- * Produces XML matching Pi's native `formatSkillsForPrompt` structure,
6
- * but references the `load_skill` tool instead of `read` and uses
7
- * `mcp:<serverName>` as the location.
8
- */
9
- export declare function formatMcpSkillsForPrompt(skills: McpSkillMetadata[]): string;
10
- //# sourceMappingURL=format.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/skills/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAW5D;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAuB3E"}
@@ -1,38 +0,0 @@
1
- function escapeXml(str) {
2
- return str
3
- .replace(/&/g, "&amp;")
4
- .replace(/</g, "&lt;")
5
- .replace(/>/g, "&gt;")
6
- .replace(/"/g, "&quot;")
7
- .replace(/'/g, "&apos;");
8
- }
9
- /**
10
- * Format MCP-discovered skills for inclusion in the system prompt.
11
- *
12
- * Produces XML matching Pi's native `formatSkillsForPrompt` structure,
13
- * but references the `load_skill` tool instead of `read` and uses
14
- * `mcp:<serverName>` as the location.
15
- */
16
- export function formatMcpSkillsForPrompt(skills) {
17
- if (skills.length === 0)
18
- return "";
19
- const lines = [
20
- "",
21
- "",
22
- "The following MCP skills provide specialized instructions and tools for specific tasks.",
23
- "MCP tools are deferred — they are available but not described in this prompt.",
24
- "You MUST call load_skill to get usage instructions before using a skill's tools.",
25
- "",
26
- "<available_mcp_skills>",
27
- ];
28
- for (const skill of skills) {
29
- lines.push(" <skill>");
30
- lines.push(` <name>${escapeXml(skill.name)}</name>`);
31
- lines.push(` <description>${escapeXml(skill.description)}</description>`);
32
- lines.push(` <server>${escapeXml(skill.serverName)}</server>`);
33
- lines.push(" </skill>");
34
- }
35
- lines.push("</available_mcp_skills>");
36
- return lines.join("\n");
37
- }
38
- //# sourceMappingURL=format.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/skills/format.ts"],"names":[],"mappings":"AAEA,SAAS,SAAS,CAAC,GAAW;IAC5B,OAAO,GAAG;SACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAA0B;IACjE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEnC,MAAM,KAAK,GAAG;QACZ,EAAE;QACF,EAAE;QACF,yFAAyF;QACzF,+EAA+E;QAC/E,kFAAkF;QAClF,EAAE;QACF,wBAAwB;KACzB,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,aAAa,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxD,KAAK,CAAC,IAAI,CAAC,oBAAoB,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;QAC7E,KAAK,CAAC,IAAI,CAAC,eAAe,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAClE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACtC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}