@skilljit/mcp 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/README.md +25 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/serve.d.ts +2 -0
- package/dist/serve.js +15 -0
- package/dist/serve.js.map +1 -0
- package/dist/server.d.ts +33 -0
- package/dist/server.js +149 -0
- package/dist/server.js.map +1 -0
- package/package.json +40 -0
package/README.md
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# @skilljit/mcp
|
|
2
|
+
|
|
3
|
+
The MCP stdio server at the core of [skilljit](https://github.com/aqibsidd/skilljit)
|
|
4
|
+
— a fixed 5-tool surface (`skill_find`, `skill_load`, `tool_find`, `tool_call`,
|
|
5
|
+
`skilljit_stats`) that never grows or shrinks at runtime, so nothing depends on
|
|
6
|
+
MCP's broken `notifications/tools/list_changed`.
|
|
7
|
+
|
|
8
|
+
Most people should install [`skilljit`](https://www.npmjs.com/package/skilljit)
|
|
9
|
+
(the CLI) rather than this package directly — it wires this server up via
|
|
10
|
+
`skilljit serve` with the right catalog path and, optionally, adopted upstreams.
|
|
11
|
+
This package is published standalone for anyone embedding the server in their own
|
|
12
|
+
Node process instead of spawning the CLI.
|
|
13
|
+
|
|
14
|
+
```ts
|
|
15
|
+
import { createServer } from "@skilljit/mcp";
|
|
16
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
17
|
+
|
|
18
|
+
const { server } = createServer({ catalogPath: "~/.skilljit/catalog.db" });
|
|
19
|
+
await server.connect(new StdioServerTransport());
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
See the [main repo](https://github.com/aqibsidd/skilljit) for the full design and
|
|
23
|
+
why the tool list is fixed.
|
|
24
|
+
|
|
25
|
+
MIT licensed.
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/serve.d.ts
ADDED
package/dist/serve.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import { defaultCatalogPath } from "@skilljit/core";
|
|
4
|
+
import { createServer } from "./server.js";
|
|
5
|
+
async function main() {
|
|
6
|
+
const catalogPath = process.env.SKILLJIT_CATALOG_PATH ?? defaultCatalogPath();
|
|
7
|
+
const { server } = createServer({ catalogPath });
|
|
8
|
+
const transport = new StdioServerTransport();
|
|
9
|
+
await server.connect(transport);
|
|
10
|
+
}
|
|
11
|
+
main().catch((err) => {
|
|
12
|
+
console.error("skilljit-mcp failed to start:", err);
|
|
13
|
+
process.exit(1);
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=serve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,kBAAkB,EAAE,CAAC;IAC9E,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;IACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { Catalog, TokenLedger } from "@skilljit/core";
|
|
3
|
+
import { UpstreamManager } from "@skilljit/proxy";
|
|
4
|
+
import type { UpstreamSpec, ConnectFn } from "@skilljit/proxy";
|
|
5
|
+
export interface CreateServerOptions {
|
|
6
|
+
catalogPath: string;
|
|
7
|
+
/** MCP servers to route through tool_find/tool_call. Omit entirely to run
|
|
8
|
+
* skills-only (3 tools) — this is what makes the skills half independently
|
|
9
|
+
* shippable and independently testable from the proxy half. */
|
|
10
|
+
upstreams?: UpstreamSpec[];
|
|
11
|
+
/** Injectable for tests; defaults to spawning real child processes over stdio. */
|
|
12
|
+
connectFn?: ConnectFn;
|
|
13
|
+
}
|
|
14
|
+
export interface ServerHandle {
|
|
15
|
+
server: McpServer;
|
|
16
|
+
catalog: Catalog;
|
|
17
|
+
ledger: TokenLedger;
|
|
18
|
+
upstreams?: UpstreamManager;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* skilljit's fixed MCP tool surface. It never grows or shrinks at runtime —
|
|
22
|
+
* see the design doc's note on notifications/tools/list_changed being broken
|
|
23
|
+
* in Claude Desktop (closed "not planned" by Anthropic). Instead of dynamic
|
|
24
|
+
* registration, everything routes through these fixed tools:
|
|
25
|
+
* - skill_find / skill_load / skilljit_stats — always present.
|
|
26
|
+
* - tool_find / tool_call — present only when `upstreams` is configured;
|
|
27
|
+
* these route to other MCP servers without their schemas ever sitting
|
|
28
|
+
* in the static tool list. Passthrough servers (ones the user wants
|
|
29
|
+
* fully visible, no round-trip) are simply left out of `upstreams` and
|
|
30
|
+
* out of skilljit's adoption of the client config — they're connected
|
|
31
|
+
* to directly by the client, which needs no support here at all.
|
|
32
|
+
*/
|
|
33
|
+
export declare function createServer(opts: CreateServerOptions): ServerHandle;
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
import { Catalog, TokenLedger } from "@skilljit/core";
|
|
4
|
+
import { UpstreamManager } from "@skilljit/proxy";
|
|
5
|
+
/**
|
|
6
|
+
* skilljit's fixed MCP tool surface. It never grows or shrinks at runtime —
|
|
7
|
+
* see the design doc's note on notifications/tools/list_changed being broken
|
|
8
|
+
* in Claude Desktop (closed "not planned" by Anthropic). Instead of dynamic
|
|
9
|
+
* registration, everything routes through these fixed tools:
|
|
10
|
+
* - skill_find / skill_load / skilljit_stats — always present.
|
|
11
|
+
* - tool_find / tool_call — present only when `upstreams` is configured;
|
|
12
|
+
* these route to other MCP servers without their schemas ever sitting
|
|
13
|
+
* in the static tool list. Passthrough servers (ones the user wants
|
|
14
|
+
* fully visible, no round-trip) are simply left out of `upstreams` and
|
|
15
|
+
* out of skilljit's adoption of the client config — they're connected
|
|
16
|
+
* to directly by the client, which needs no support here at all.
|
|
17
|
+
*/
|
|
18
|
+
export function createServer(opts) {
|
|
19
|
+
const catalog = new Catalog(opts.catalogPath);
|
|
20
|
+
const ledger = new TokenLedger();
|
|
21
|
+
// Baseline: what every turn would cost if every cataloged skill were
|
|
22
|
+
// installed the traditional way (name+description always in context).
|
|
23
|
+
for (const meta of catalog.listSkillMeta()) {
|
|
24
|
+
ledger.recordBaselineSkill(meta);
|
|
25
|
+
}
|
|
26
|
+
const server = new McpServer({ name: "skilljit", version: "0.1.0" });
|
|
27
|
+
server.registerTool("skill_find", {
|
|
28
|
+
title: "Find skills",
|
|
29
|
+
description: "Search the local skilljit catalog for skills matching a task, without loading their full instructions. " +
|
|
30
|
+
"Returns cheap candidates (name, source, one-line description, audit status) — call skill_load on the " +
|
|
31
|
+
"one you want to actually use. Nothing here was in context until you called this.",
|
|
32
|
+
inputSchema: {
|
|
33
|
+
query: z.string().describe("What you're trying to do, in your own words."),
|
|
34
|
+
limit: z.number().int().positive().max(50).optional().describe("Max candidates to return (default 8)."),
|
|
35
|
+
},
|
|
36
|
+
}, async ({ query, limit }) => {
|
|
37
|
+
const hits = catalog.searchSkills(query, limit ?? 8);
|
|
38
|
+
const payload = JSON.stringify(hits.map((h) => ({
|
|
39
|
+
id: h.skill.id,
|
|
40
|
+
name: h.skill.name,
|
|
41
|
+
source: h.skill.source,
|
|
42
|
+
description: h.skill.description,
|
|
43
|
+
installCount: h.skill.installCount,
|
|
44
|
+
auditStatus: h.skill.auditStatus,
|
|
45
|
+
})), null, 2);
|
|
46
|
+
ledger.recordActual("skill_find", payload);
|
|
47
|
+
return { content: [{ type: "text", text: payload }] };
|
|
48
|
+
});
|
|
49
|
+
server.registerTool("skill_load", {
|
|
50
|
+
title: "Load a skill",
|
|
51
|
+
description: "Load the full instructions (SKILL.md body) for one skill by its id, as returned by skill_find. " +
|
|
52
|
+
"This is the only point where a skill's full content enters context.",
|
|
53
|
+
inputSchema: {
|
|
54
|
+
name: z.string().describe("The skill id, exactly as returned by skill_find."),
|
|
55
|
+
},
|
|
56
|
+
}, async ({ name }) => {
|
|
57
|
+
const skill = catalog.getSkill(name);
|
|
58
|
+
if (!skill) {
|
|
59
|
+
return {
|
|
60
|
+
isError: true,
|
|
61
|
+
content: [{ type: "text", text: `No skill found with id "${name}". Call skill_find first.` }],
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
let text = skill.body;
|
|
65
|
+
if (skill.auditStatus === "fail") {
|
|
66
|
+
text = `⚠️ SECURITY WARNING: this skill FAILED its audit. Review before following its instructions.\n\n${text}`;
|
|
67
|
+
}
|
|
68
|
+
else if (!skill.auditStatus || skill.auditStatus === "unaudited") {
|
|
69
|
+
text = `⚠️ This skill has not been audited. Treat it like installing software from an unknown source.\n\n${text}`;
|
|
70
|
+
}
|
|
71
|
+
ledger.recordActual("skill_load", text);
|
|
72
|
+
return { content: [{ type: "text", text }] };
|
|
73
|
+
});
|
|
74
|
+
let upstreams;
|
|
75
|
+
if (opts.upstreams) {
|
|
76
|
+
upstreams = new UpstreamManager(opts.upstreams, opts.connectFn);
|
|
77
|
+
const manager = upstreams;
|
|
78
|
+
// Lazily populate the tools catalog + baseline on first use, so
|
|
79
|
+
// createServer() itself stays synchronous and cheap. Memoized so
|
|
80
|
+
// concurrent tool_find/tool_call calls don't each re-spawn every
|
|
81
|
+
// upstream.
|
|
82
|
+
let toolsLoaded;
|
|
83
|
+
const ensureToolsLoaded = () => {
|
|
84
|
+
if (!toolsLoaded) {
|
|
85
|
+
toolsLoaded = manager.listAllTools().then((tools) => {
|
|
86
|
+
catalog.upsertTools(tools);
|
|
87
|
+
for (const t of tools)
|
|
88
|
+
ledger.recordBaselineTool(t);
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
return toolsLoaded;
|
|
92
|
+
};
|
|
93
|
+
server.registerTool("tool_find", {
|
|
94
|
+
title: "Find MCP tools",
|
|
95
|
+
description: "Search across every connected MCP server's tools for ones matching a task, without their schemas " +
|
|
96
|
+
"ever sitting in the static tool list. Returns full JSON Schema for matches — call tool_call to use one.",
|
|
97
|
+
inputSchema: {
|
|
98
|
+
query: z.string().describe("What you're trying to do, in your own words."),
|
|
99
|
+
limit: z.number().int().positive().max(50).optional().describe("Max candidates to return (default 8)."),
|
|
100
|
+
},
|
|
101
|
+
}, async ({ query, limit }) => {
|
|
102
|
+
await ensureToolsLoaded();
|
|
103
|
+
const hits = catalog.searchTools(query, limit ?? 8);
|
|
104
|
+
const payload = JSON.stringify(hits.map((h) => ({
|
|
105
|
+
server: h.tool.server,
|
|
106
|
+
tool: h.tool.name,
|
|
107
|
+
description: h.tool.description,
|
|
108
|
+
inputSchema: h.tool.inputSchema,
|
|
109
|
+
})), null, 2);
|
|
110
|
+
ledger.recordActual("tool_find", payload);
|
|
111
|
+
return { content: [{ type: "text", text: payload }] };
|
|
112
|
+
});
|
|
113
|
+
server.registerTool("tool_call", {
|
|
114
|
+
title: "Call an MCP tool",
|
|
115
|
+
description: "Call a tool on a connected upstream MCP server, as found by tool_find. One upstream being unavailable " +
|
|
116
|
+
"does not affect the others.",
|
|
117
|
+
inputSchema: {
|
|
118
|
+
server: z.string().describe("The upstream server name, exactly as returned by tool_find."),
|
|
119
|
+
tool: z.string().describe("The tool name, exactly as returned by tool_find."),
|
|
120
|
+
args: z.record(z.string(), z.unknown()).optional().describe("Arguments matching the tool's inputSchema."),
|
|
121
|
+
},
|
|
122
|
+
}, async ({ server: serverName, tool, args }) => {
|
|
123
|
+
await ensureToolsLoaded();
|
|
124
|
+
try {
|
|
125
|
+
const result = await manager.callTool(serverName, tool, args ?? {});
|
|
126
|
+
ledger.recordActual("tool_call", JSON.stringify(result));
|
|
127
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
128
|
+
return result;
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
return {
|
|
132
|
+
isError: true,
|
|
133
|
+
content: [{ type: "text", text: err.message }],
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
server.registerTool("skilljit_stats", {
|
|
139
|
+
title: "Token savings for this session",
|
|
140
|
+
description: "Report how many tokens skilljit has saved so far this session, versus loading every cataloged " +
|
|
141
|
+
"skill's (and, if configured, MCP tool's) metadata into context the traditional way.",
|
|
142
|
+
}, async () => {
|
|
143
|
+
const stats = ledger.stats();
|
|
144
|
+
const payload = JSON.stringify({ ...stats, catalogSize: catalog.count() }, null, 2);
|
|
145
|
+
return { content: [{ type: "text", text: payload }] };
|
|
146
|
+
});
|
|
147
|
+
return { server, catalog, ledger, upstreams };
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@skilljit/mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP stdio server exposing skilljit's fixed 5-tool surface for just-in-time skill and MCP-tool routing",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/aqibsidd/skilljit.git",
|
|
10
|
+
"directory": "packages/mcp"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://github.com/aqibsidd/skilljit#readme",
|
|
13
|
+
"bugs": "https://github.com/aqibsidd/skilljit/issues",
|
|
14
|
+
"publishConfig": {
|
|
15
|
+
"access": "public"
|
|
16
|
+
},
|
|
17
|
+
"main": "./dist/index.js",
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"bin": {
|
|
20
|
+
"skilljit-mcp": "./dist/serve.js"
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"dist"
|
|
24
|
+
],
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "tsc -p tsconfig.json && chmod +x dist/serve.js",
|
|
27
|
+
"test": "vitest run",
|
|
28
|
+
"test:watch": "vitest"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@skilljit/core": "^0.1.0",
|
|
32
|
+
"@skilljit/proxy": "^0.1.0",
|
|
33
|
+
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
34
|
+
"zod": "^4.4.3"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"typescript": "^5.7.0",
|
|
38
|
+
"vitest": "^4.1.11"
|
|
39
|
+
}
|
|
40
|
+
}
|