@skills-hub-ai/mcp 0.1.0 → 0.1.2
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/dist/discover.d.ts +1 -1
- package/dist/discover.d.ts.map +1 -1
- package/dist/discover.js +1 -1
- package/dist/discover.js.map +1 -1
- package/dist/index.js +0 -0
- package/package.json +22 -10
- package/src/discover.ts +1 -1
- package/src/index.test.ts +1 -1
- package/.turbo/turbo-build.log +0 -4
- package/.turbo/turbo-test.log +0 -15
- package/dist/discover.test.d.ts +0 -2
- package/dist/discover.test.d.ts.map +0 -1
- package/dist/discover.test.js +0 -129
- package/dist/discover.test.js.map +0 -1
- package/dist/index.test.d.ts +0 -2
- package/dist/index.test.d.ts.map +0 -1
- package/dist/index.test.js +0 -138
- package/dist/index.test.js.map +0 -1
- package/tsconfig.json +0 -9
package/dist/discover.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type ParsedSkill } from "@skills-hub/skill-parser";
|
|
1
|
+
import { type ParsedSkill } from "@skills-hub-ai/skill-parser";
|
|
2
2
|
/** Discover all installed skills, cached for 30s */
|
|
3
3
|
export declare function discoverSkills(): Map<string, ParsedSkill>;
|
|
4
4
|
/** Clear the discovery cache (for testing) */
|
package/dist/discover.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,6BAA6B,CAAC;AA0C7E,oDAAoD;AACpD,wBAAgB,cAAc,IAAI,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAczD;AAED,8CAA8C;AAC9C,wBAAgB,UAAU,IAAI,IAAI,CAGjC"}
|
package/dist/discover.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
|
-
import { parseSkillMd } from "@skills-hub/skill-parser";
|
|
4
|
+
import { parseSkillMd } from "@skills-hub-ai/skill-parser";
|
|
5
5
|
const CACHE_TTL_MS = 30_000;
|
|
6
6
|
let cache = null;
|
|
7
7
|
let cacheTime = 0;
|
package/dist/discover.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,YAAY,EAAoB,MAAM,
|
|
1
|
+
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,YAAY,EAAoB,MAAM,6BAA6B,CAAC;AAE7E,MAAM,YAAY,GAAG,MAAM,CAAC;AAE5B,IAAI,KAAK,GAAoC,IAAI,CAAC;AAClD,IAAI,SAAS,GAAG,CAAC,CAAC;AAElB,gDAAgD;AAChD,SAAS,aAAa;IACpB,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,OAAO;QACL,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC;QAC/B,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC;KAChC,CAAC;AACJ,CAAC;AAED,+DAA+D;AAC/D,SAAS,OAAO,CAAC,GAAW,EAAE,GAA6B;IACzD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO;IAE7B,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;YAAE,SAAS;QAEnC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACxB,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS,CAAC,qCAAqC;QAElE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QAC9C,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,SAAS;QAErC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACnC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,uBAAuB;QACzB,CAAC;IACH,CAAC;AACH,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,cAAc;IAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,IAAI,KAAK,IAAI,GAAG,GAAG,SAAS,GAAG,YAAY,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC9C,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACvB,CAAC;IAED,KAAK,GAAG,MAAM,CAAC;IACf,SAAS,GAAG,GAAG,CAAC;IAChB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,UAAU;IACxB,KAAK,GAAG,IAAI,CAAC;IACb,SAAS,GAAG,CAAC,CAAC;AAChB,CAAC"}
|
package/dist/index.js
CHANGED
|
File without changes
|
package/package.json
CHANGED
|
@@ -1,33 +1,45 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@skills-hub-ai/mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "MCP server for skills-hub.ai — serve installed skills as prompts in any MCP-compatible AI tool",
|
|
5
5
|
"license": "MIT",
|
|
6
|
-
"keywords": [
|
|
6
|
+
"keywords": [
|
|
7
|
+
"mcp",
|
|
8
|
+
"model-context-protocol",
|
|
9
|
+
"claude-code",
|
|
10
|
+
"cursor",
|
|
11
|
+
"skills",
|
|
12
|
+
"ai",
|
|
13
|
+
"prompts"
|
|
14
|
+
],
|
|
7
15
|
"repository": {
|
|
8
16
|
"type": "git",
|
|
9
17
|
"url": "https://github.com/tinh2/skills-hub.git",
|
|
10
18
|
"directory": "apps/mcp"
|
|
11
19
|
},
|
|
12
20
|
"homepage": "https://skills-hub.ai",
|
|
21
|
+
"files": [
|
|
22
|
+
"dist",
|
|
23
|
+
"src"
|
|
24
|
+
],
|
|
13
25
|
"type": "module",
|
|
14
26
|
"bin": {
|
|
15
27
|
"skills-hub-mcp": "dist/index.js"
|
|
16
28
|
},
|
|
17
|
-
"scripts": {
|
|
18
|
-
"dev": "tsx src/index.ts",
|
|
19
|
-
"build": "tsc",
|
|
20
|
-
"test": "vitest run --passWithNoTests",
|
|
21
|
-
"lint": "tsc --noEmit"
|
|
22
|
-
},
|
|
23
29
|
"dependencies": {
|
|
24
30
|
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
25
|
-
"@skills-hub/skill-parser": "
|
|
31
|
+
"@skills-hub-ai/skill-parser": "0.1.0"
|
|
26
32
|
},
|
|
27
33
|
"devDependencies": {
|
|
28
34
|
"@types/node": "^22.0.0",
|
|
29
35
|
"tsx": "^4.0.0",
|
|
30
36
|
"typescript": "^5.7.0",
|
|
31
37
|
"vitest": "^2.0.0"
|
|
38
|
+
},
|
|
39
|
+
"scripts": {
|
|
40
|
+
"dev": "tsx src/index.ts",
|
|
41
|
+
"build": "tsc",
|
|
42
|
+
"test": "vitest run --passWithNoTests",
|
|
43
|
+
"lint": "tsc --noEmit"
|
|
32
44
|
}
|
|
33
|
-
}
|
|
45
|
+
}
|
package/src/discover.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
|
-
import { parseSkillMd, type ParsedSkill } from "@skills-hub/skill-parser";
|
|
4
|
+
import { parseSkillMd, type ParsedSkill } from "@skills-hub-ai/skill-parser";
|
|
5
5
|
|
|
6
6
|
const CACHE_TTL_MS = 30_000;
|
|
7
7
|
|
package/src/index.test.ts
CHANGED
package/.turbo/turbo-build.log
DELETED
package/.turbo/turbo-test.log
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
> @skills-hub-ai/mcp@0.1.0 test /Users/thole/personal/skills-hub/apps/mcp
|
|
3
|
-
> vitest run --passWithNoTests
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
RUN v2.1.9 /Users/thole/personal/skills-hub/apps/mcp
|
|
7
|
-
|
|
8
|
-
✓ src/index.test.ts (6 tests) 582ms
|
|
9
|
-
✓ src/discover.test.ts (8 tests) 8ms
|
|
10
|
-
|
|
11
|
-
Test Files 2 passed (2)
|
|
12
|
-
Tests 14 passed (14)
|
|
13
|
-
Start at 17:33:09
|
|
14
|
-
Duration 3.22s (transform 1.41s, setup 0ms, collect 1.91s, tests 590ms, environment 0ms, prepare 611ms)
|
|
15
|
-
|
package/dist/discover.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"discover.test.d.ts","sourceRoot":"","sources":["../src/discover.test.ts"],"names":[],"mappings":""}
|
package/dist/discover.test.js
DELETED
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
2
|
-
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
3
|
-
vi.mock("node:fs", () => ({
|
|
4
|
-
existsSync: vi.fn(() => false),
|
|
5
|
-
readdirSync: vi.fn(() => []),
|
|
6
|
-
readFileSync: vi.fn(() => ""),
|
|
7
|
-
}));
|
|
8
|
-
vi.mock("node:os", () => ({
|
|
9
|
-
homedir: vi.fn(() => "/home/user"),
|
|
10
|
-
}));
|
|
11
|
-
import { discoverSkills, clearCache } from "./discover.js";
|
|
12
|
-
const mockExistsSync = vi.mocked(existsSync);
|
|
13
|
-
const mockReaddirSync = vi.mocked(readdirSync);
|
|
14
|
-
const mockReadFileSync = vi.mocked(readFileSync);
|
|
15
|
-
const validSkillMd = `---
|
|
16
|
-
name: Code Review
|
|
17
|
-
description: Automated code review for quality and best practices
|
|
18
|
-
version: 1.0.0
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
Review the code carefully and suggest improvements.
|
|
22
|
-
`;
|
|
23
|
-
const anotherSkillMd = `---
|
|
24
|
-
name: Security Scan
|
|
25
|
-
description: Scan code for security vulnerabilities and common exploits
|
|
26
|
-
version: 2.0.0
|
|
27
|
-
---
|
|
28
|
-
|
|
29
|
-
Check for OWASP top 10 vulnerabilities.
|
|
30
|
-
`;
|
|
31
|
-
function makeDirent(name) {
|
|
32
|
-
return { name, isDirectory: () => true, isFile: () => false };
|
|
33
|
-
}
|
|
34
|
-
beforeEach(() => {
|
|
35
|
-
vi.clearAllMocks();
|
|
36
|
-
clearCache();
|
|
37
|
-
});
|
|
38
|
-
describe("discoverSkills", () => {
|
|
39
|
-
it("discovers skills from claude skills directory", () => {
|
|
40
|
-
mockExistsSync.mockImplementation((p) => {
|
|
41
|
-
const s = String(p);
|
|
42
|
-
return s === "/home/user/.claude/skills" || s.endsWith("SKILL.md");
|
|
43
|
-
});
|
|
44
|
-
mockReaddirSync.mockReturnValue([makeDirent("code-review")]);
|
|
45
|
-
mockReadFileSync.mockReturnValue(validSkillMd);
|
|
46
|
-
const skills = discoverSkills();
|
|
47
|
-
expect(skills.size).toBe(1);
|
|
48
|
-
expect(skills.has("code-review")).toBe(true);
|
|
49
|
-
expect(skills.get("code-review").name).toBe("Code Review");
|
|
50
|
-
expect(skills.get("code-review").instructions).toContain("Review the code carefully");
|
|
51
|
-
});
|
|
52
|
-
it("discovers skills from cursor skills directory", () => {
|
|
53
|
-
mockExistsSync.mockImplementation((p) => {
|
|
54
|
-
const s = String(p);
|
|
55
|
-
return s === "/home/user/.cursor/skills" || s.endsWith("SKILL.md");
|
|
56
|
-
});
|
|
57
|
-
mockReaddirSync.mockReturnValue([makeDirent("security-scan")]);
|
|
58
|
-
mockReadFileSync.mockReturnValue(anotherSkillMd);
|
|
59
|
-
const skills = discoverSkills();
|
|
60
|
-
expect(skills.size).toBe(1);
|
|
61
|
-
expect(skills.has("security-scan")).toBe(true);
|
|
62
|
-
});
|
|
63
|
-
it("scans both directories and deduplicates by slug", () => {
|
|
64
|
-
mockExistsSync.mockReturnValue(true);
|
|
65
|
-
mockReaddirSync.mockImplementation((dir) => {
|
|
66
|
-
const s = String(dir);
|
|
67
|
-
if (s.includes(".claude"))
|
|
68
|
-
return [makeDirent("code-review")];
|
|
69
|
-
if (s.includes(".cursor"))
|
|
70
|
-
return [makeDirent("code-review"), makeDirent("security-scan")];
|
|
71
|
-
return [];
|
|
72
|
-
});
|
|
73
|
-
mockReadFileSync.mockImplementation((p) => {
|
|
74
|
-
const s = String(p);
|
|
75
|
-
if (s.includes("code-review"))
|
|
76
|
-
return validSkillMd;
|
|
77
|
-
if (s.includes("security-scan"))
|
|
78
|
-
return anotherSkillMd;
|
|
79
|
-
return "";
|
|
80
|
-
});
|
|
81
|
-
const skills = discoverSkills();
|
|
82
|
-
// code-review from claude wins (first-found), security-scan from cursor
|
|
83
|
-
expect(skills.size).toBe(2);
|
|
84
|
-
expect(skills.has("code-review")).toBe(true);
|
|
85
|
-
expect(skills.has("security-scan")).toBe(true);
|
|
86
|
-
});
|
|
87
|
-
it("handles missing skills directories", () => {
|
|
88
|
-
mockExistsSync.mockReturnValue(false);
|
|
89
|
-
const skills = discoverSkills();
|
|
90
|
-
expect(skills.size).toBe(0);
|
|
91
|
-
});
|
|
92
|
-
it("skips directories without SKILL.md", () => {
|
|
93
|
-
mockExistsSync.mockImplementation((p) => {
|
|
94
|
-
const s = String(p);
|
|
95
|
-
// Directory exists but SKILL.md does not
|
|
96
|
-
return s === "/home/user/.claude/skills";
|
|
97
|
-
});
|
|
98
|
-
mockReaddirSync.mockReturnValue([makeDirent("orphan-dir")]);
|
|
99
|
-
const skills = discoverSkills();
|
|
100
|
-
expect(skills.size).toBe(0);
|
|
101
|
-
});
|
|
102
|
-
it("skips malformed SKILL.md files", () => {
|
|
103
|
-
mockExistsSync.mockReturnValue(true);
|
|
104
|
-
mockReaddirSync.mockReturnValue([makeDirent("bad-skill")]);
|
|
105
|
-
mockReadFileSync.mockReturnValue("this is not valid frontmatter");
|
|
106
|
-
const skills = discoverSkills();
|
|
107
|
-
expect(skills.size).toBe(0);
|
|
108
|
-
});
|
|
109
|
-
it("caches results for subsequent calls", () => {
|
|
110
|
-
mockExistsSync.mockReturnValue(true);
|
|
111
|
-
mockReaddirSync.mockReturnValue([makeDirent("code-review")]);
|
|
112
|
-
mockReadFileSync.mockReturnValue(validSkillMd);
|
|
113
|
-
discoverSkills();
|
|
114
|
-
discoverSkills();
|
|
115
|
-
// readdirSync called once per directory on first call, not on second
|
|
116
|
-
expect(mockReaddirSync).toHaveBeenCalledTimes(2); // once for claude, once for cursor
|
|
117
|
-
});
|
|
118
|
-
it("re-scans after cache is cleared", () => {
|
|
119
|
-
mockExistsSync.mockReturnValue(true);
|
|
120
|
-
mockReaddirSync.mockReturnValue([makeDirent("code-review")]);
|
|
121
|
-
mockReadFileSync.mockReturnValue(validSkillMd);
|
|
122
|
-
discoverSkills();
|
|
123
|
-
clearCache();
|
|
124
|
-
discoverSkills();
|
|
125
|
-
// 2 dirs × 2 scans = 4 calls
|
|
126
|
-
expect(mockReaddirSync).toHaveBeenCalledTimes(4);
|
|
127
|
-
});
|
|
128
|
-
});
|
|
129
|
-
//# sourceMappingURL=discover.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"discover.test.js","sourceRoot":"","sources":["../src/discover.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.test.d.ts
DELETED
package/dist/index.test.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":""}
|
package/dist/index.test.js
DELETED
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
2
|
-
vi.mock("./discover.js", () => ({
|
|
3
|
-
discoverSkills: vi.fn(),
|
|
4
|
-
}));
|
|
5
|
-
// Mock the MCP SDK — we test the handler logic, not the transport
|
|
6
|
-
vi.mock("@modelcontextprotocol/sdk/server/index.js", () => {
|
|
7
|
-
const handlers = new Map();
|
|
8
|
-
return {
|
|
9
|
-
Server: vi.fn().mockImplementation(() => ({
|
|
10
|
-
setRequestHandler: vi.fn((schema, handler) => {
|
|
11
|
-
handlers.set(schema.method, handler);
|
|
12
|
-
}),
|
|
13
|
-
connect: vi.fn(),
|
|
14
|
-
_handlers: handlers,
|
|
15
|
-
})),
|
|
16
|
-
};
|
|
17
|
-
});
|
|
18
|
-
vi.mock("@modelcontextprotocol/sdk/server/stdio.js", () => ({
|
|
19
|
-
StdioServerTransport: vi.fn(),
|
|
20
|
-
}));
|
|
21
|
-
vi.mock("@modelcontextprotocol/sdk/types.js", () => ({
|
|
22
|
-
ListPromptsRequestSchema: { method: "prompts/list" },
|
|
23
|
-
GetPromptRequestSchema: { method: "prompts/get" },
|
|
24
|
-
ErrorCode: { InvalidRequest: -32600 },
|
|
25
|
-
McpError: class McpError extends Error {
|
|
26
|
-
code;
|
|
27
|
-
constructor(code, message) {
|
|
28
|
-
super(message);
|
|
29
|
-
this.code = code;
|
|
30
|
-
}
|
|
31
|
-
},
|
|
32
|
-
}));
|
|
33
|
-
import { discoverSkills } from "./discover.js";
|
|
34
|
-
const mockDiscoverSkills = vi.mocked(discoverSkills);
|
|
35
|
-
function makeSkill(name, description, instructions) {
|
|
36
|
-
return {
|
|
37
|
-
name,
|
|
38
|
-
description,
|
|
39
|
-
version: "1.0.0",
|
|
40
|
-
category: undefined,
|
|
41
|
-
platforms: [],
|
|
42
|
-
instructions,
|
|
43
|
-
raw: "",
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
let handlers;
|
|
47
|
-
beforeEach(async () => {
|
|
48
|
-
vi.clearAllMocks();
|
|
49
|
-
// Re-import to trigger module-level server creation
|
|
50
|
-
vi.resetModules();
|
|
51
|
-
// Re-mock after resetModules
|
|
52
|
-
vi.doMock("./discover.js", () => ({
|
|
53
|
-
discoverSkills: mockDiscoverSkills,
|
|
54
|
-
}));
|
|
55
|
-
vi.doMock("@modelcontextprotocol/sdk/server/index.js", () => {
|
|
56
|
-
const h = new Map();
|
|
57
|
-
handlers = h;
|
|
58
|
-
return {
|
|
59
|
-
Server: vi.fn().mockImplementation(() => ({
|
|
60
|
-
setRequestHandler: vi.fn((schema, handler) => {
|
|
61
|
-
h.set(schema.method, handler);
|
|
62
|
-
}),
|
|
63
|
-
connect: vi.fn(),
|
|
64
|
-
})),
|
|
65
|
-
};
|
|
66
|
-
});
|
|
67
|
-
vi.doMock("@modelcontextprotocol/sdk/server/stdio.js", () => ({
|
|
68
|
-
StdioServerTransport: vi.fn(),
|
|
69
|
-
}));
|
|
70
|
-
vi.doMock("@modelcontextprotocol/sdk/types.js", () => ({
|
|
71
|
-
ListPromptsRequestSchema: { method: "prompts/list" },
|
|
72
|
-
GetPromptRequestSchema: { method: "prompts/get" },
|
|
73
|
-
ErrorCode: { InvalidRequest: -32600 },
|
|
74
|
-
McpError: class McpError extends Error {
|
|
75
|
-
code;
|
|
76
|
-
constructor(code, message) {
|
|
77
|
-
super(message);
|
|
78
|
-
this.code = code;
|
|
79
|
-
}
|
|
80
|
-
},
|
|
81
|
-
}));
|
|
82
|
-
// Suppress console.error from main()
|
|
83
|
-
vi.spyOn(console, "error").mockImplementation(() => { });
|
|
84
|
-
await import("./index.js");
|
|
85
|
-
});
|
|
86
|
-
describe("MCP server", () => {
|
|
87
|
-
it("registers prompts/list and prompts/get handlers", () => {
|
|
88
|
-
expect(handlers.has("prompts/list")).toBe(true);
|
|
89
|
-
expect(handlers.has("prompts/get")).toBe(true);
|
|
90
|
-
});
|
|
91
|
-
it("listPrompts returns discovered skills", async () => {
|
|
92
|
-
const skills = new Map();
|
|
93
|
-
skills.set("code-review", makeSkill("Code Review", "Review code quality", "Review carefully"));
|
|
94
|
-
skills.set("security-scan", makeSkill("Security Scan", "Find vulnerabilities", "Check OWASP"));
|
|
95
|
-
mockDiscoverSkills.mockReturnValue(skills);
|
|
96
|
-
const handler = handlers.get("prompts/list");
|
|
97
|
-
const result = (await handler({}));
|
|
98
|
-
expect(result.prompts).toHaveLength(2);
|
|
99
|
-
expect(result.prompts[0].name).toBe("code-review");
|
|
100
|
-
expect(result.prompts[0].description).toBe("Review code quality");
|
|
101
|
-
expect(result.prompts[1].name).toBe("security-scan");
|
|
102
|
-
});
|
|
103
|
-
it("listPrompts returns empty array when no skills installed", async () => {
|
|
104
|
-
mockDiscoverSkills.mockReturnValue(new Map());
|
|
105
|
-
const handler = handlers.get("prompts/list");
|
|
106
|
-
const result = (await handler({}));
|
|
107
|
-
expect(result.prompts).toEqual([]);
|
|
108
|
-
});
|
|
109
|
-
it("getPrompt returns skill instructions", async () => {
|
|
110
|
-
const skills = new Map();
|
|
111
|
-
skills.set("code-review", makeSkill("Code Review", "Review code quality", "Review carefully"));
|
|
112
|
-
mockDiscoverSkills.mockReturnValue(skills);
|
|
113
|
-
const handler = handlers.get("prompts/get");
|
|
114
|
-
const result = (await handler({
|
|
115
|
-
params: { name: "code-review", arguments: {} },
|
|
116
|
-
}));
|
|
117
|
-
expect(result.description).toBe("Review code quality");
|
|
118
|
-
expect(result.messages).toHaveLength(1);
|
|
119
|
-
expect(result.messages[0].role).toBe("user");
|
|
120
|
-
expect(result.messages[0].content.text).toBe("Review carefully");
|
|
121
|
-
});
|
|
122
|
-
it("getPrompt appends input argument to instructions", async () => {
|
|
123
|
-
const skills = new Map();
|
|
124
|
-
skills.set("code-review", makeSkill("Code Review", "Review code quality", "Review carefully"));
|
|
125
|
-
mockDiscoverSkills.mockReturnValue(skills);
|
|
126
|
-
const handler = handlers.get("prompts/get");
|
|
127
|
-
const result = (await handler({
|
|
128
|
-
params: { name: "code-review", arguments: { input: "Focus on error handling" } },
|
|
129
|
-
}));
|
|
130
|
-
expect(result.messages[0].content.text).toBe("Review carefully\n\nFocus on error handling");
|
|
131
|
-
});
|
|
132
|
-
it("getPrompt throws McpError for unknown skill", async () => {
|
|
133
|
-
mockDiscoverSkills.mockReturnValue(new Map());
|
|
134
|
-
const handler = handlers.get("prompts/get");
|
|
135
|
-
await expect(handler({ params: { name: "nonexistent", arguments: {} } })).rejects.toThrow('Unknown skill: nonexistent');
|
|
136
|
-
});
|
|
137
|
-
});
|
|
138
|
-
//# sourceMappingURL=index.test.js.map
|
package/dist/index.test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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"}
|