mcp-test-kits 0.0.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 (69) hide show
  1. package/README.md +94 -0
  2. package/dist/capabilities/prompts.d.ts +9 -0
  3. package/dist/capabilities/prompts.d.ts.map +1 -0
  4. package/dist/capabilities/prompts.js +76 -0
  5. package/dist/capabilities/prompts.js.map +1 -0
  6. package/dist/capabilities/resources.d.ts +9 -0
  7. package/dist/capabilities/resources.d.ts.map +1 -0
  8. package/dist/capabilities/resources.js +76 -0
  9. package/dist/capabilities/resources.js.map +1 -0
  10. package/dist/capabilities/tools.d.ts +9 -0
  11. package/dist/capabilities/tools.d.ts.map +1 -0
  12. package/dist/capabilities/tools.js +77 -0
  13. package/dist/capabilities/tools.js.map +1 -0
  14. package/dist/config.d.ts +35 -0
  15. package/dist/config.d.ts.map +1 -0
  16. package/dist/config.js +30 -0
  17. package/dist/config.js.map +1 -0
  18. package/dist/extract-spec.d.ts +14 -0
  19. package/dist/extract-spec.d.ts.map +1 -0
  20. package/dist/extract-spec.js +117 -0
  21. package/dist/extract-spec.js.map +1 -0
  22. package/dist/index.d.ts +6 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +97 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/introspection.d.ts +68 -0
  27. package/dist/introspection.d.ts.map +1 -0
  28. package/dist/introspection.js +135 -0
  29. package/dist/introspection.js.map +1 -0
  30. package/dist/server.d.ts +10 -0
  31. package/dist/server.d.ts.map +1 -0
  32. package/dist/server.js +28 -0
  33. package/dist/server.js.map +1 -0
  34. package/dist/transports/http.d.ts +10 -0
  35. package/dist/transports/http.d.ts.map +1 -0
  36. package/dist/transports/http.js +31 -0
  37. package/dist/transports/http.js.map +1 -0
  38. package/dist/transports/index.d.ts +7 -0
  39. package/dist/transports/index.d.ts.map +1 -0
  40. package/dist/transports/index.js +7 -0
  41. package/dist/transports/index.js.map +1 -0
  42. package/dist/transports/sse.d.ts +10 -0
  43. package/dist/transports/sse.d.ts.map +1 -0
  44. package/dist/transports/sse.js +44 -0
  45. package/dist/transports/sse.js.map +1 -0
  46. package/dist/transports/stdio.d.ts +10 -0
  47. package/dist/transports/stdio.d.ts.map +1 -0
  48. package/dist/transports/stdio.js +14 -0
  49. package/dist/transports/stdio.js.map +1 -0
  50. package/eslint.config.js +22 -0
  51. package/package.json +51 -0
  52. package/src/capabilities/prompts.ts +108 -0
  53. package/src/capabilities/resources.ts +108 -0
  54. package/src/capabilities/tools.ts +124 -0
  55. package/src/config.ts +60 -0
  56. package/src/extract-spec.ts +189 -0
  57. package/src/index.ts +110 -0
  58. package/src/introspection.ts +216 -0
  59. package/src/server.ts +34 -0
  60. package/src/transports/http.ts +42 -0
  61. package/src/transports/index.ts +7 -0
  62. package/src/transports/sse.ts +60 -0
  63. package/src/transports/stdio.ts +21 -0
  64. package/tests/fixtures.ts +146 -0
  65. package/tests/http.test.ts +34 -0
  66. package/tests/sse.test.ts +34 -0
  67. package/tests/stdio.test.ts +98 -0
  68. package/tsconfig.json +27 -0
  69. package/vitest.config.ts +8 -0
package/README.md ADDED
@@ -0,0 +1,94 @@
1
+ # MCP Test Kits - TypeScript
2
+
3
+ Build from source using the official MCP SDK.
4
+
5
+ ## Build
6
+
7
+ ```bash
8
+ cd typescript
9
+ npm install
10
+ npm run build
11
+ ```
12
+
13
+ ---
14
+
15
+ ## stdio
16
+
17
+ ```json
18
+ {
19
+ "mcpServers": {
20
+ "mcp-test-kits": {
21
+ "command": "node",
22
+ "args": ["dist/index.js"],
23
+ "cwd": "/path/to/mcp-test-kits/typescript"
24
+ }
25
+ }
26
+ }
27
+ ```
28
+
29
+ ---
30
+
31
+ ## HTTP
32
+
33
+ Start server:
34
+ ```bash
35
+ node dist/index.js --transport http --port 3000
36
+ ```
37
+
38
+ MCP client config:
39
+ ```json
40
+ {
41
+ "mcpServers": {
42
+ "mcp-test-kits": {
43
+ "url": "http://localhost:3000/sse"
44
+ }
45
+ }
46
+ }
47
+ ```
48
+
49
+ ---
50
+
51
+ ## SSE
52
+
53
+ Start server:
54
+ ```bash
55
+ node dist/index.js --transport sse --port 3000
56
+ ```
57
+
58
+ MCP client config:
59
+ ```json
60
+ {
61
+ "mcpServers": {
62
+ "mcp-test-kits": {
63
+ "url": "http://localhost:3000/mcp"
64
+ }
65
+ }
66
+ }
67
+ ```
68
+
69
+ ---
70
+
71
+ ## Test with MCP Inspector
72
+
73
+ ```bash
74
+ # stdio
75
+ npx @modelcontextprotocol/inspector node dist/index.js
76
+
77
+ # HTTP (start server first: node dist/index.js --transport http --port 3000)
78
+ npx @modelcontextprotocol/inspector --transport http --server-url http://localhost:3000/mcp
79
+
80
+ # SSE (start server first: node dist/index.js --transport sse --port 3000)
81
+ npx @modelcontextprotocol/inspector --transport sse --server-url http://localhost:3000/sse
82
+ ```
83
+
84
+ ---
85
+
86
+ ## Development
87
+
88
+ ```bash
89
+ npm run dev # Run with tsx
90
+ npm run build # Build to dist/
91
+ npm run typecheck # Type check
92
+ npm run lint # Lint code
93
+ npm test # Run tests
94
+ ```
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Prompt implementations for MCP Test Kits
3
+ */
4
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ /**
6
+ * Register all prompts with the MCP server
7
+ */
8
+ export declare function registerPrompts(server: McpServer): void;
9
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/capabilities/prompts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiGvD"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Prompt implementations for MCP Test Kits
3
+ */
4
+ import { z } from "zod";
5
+ /**
6
+ * Register all prompts with the MCP server
7
+ */
8
+ export function registerPrompts(server) {
9
+ // Simple prompt
10
+ server.prompt("simple_prompt", "A basic prompt with no arguments", async () => ({
11
+ messages: [
12
+ {
13
+ role: "user",
14
+ content: {
15
+ type: "text",
16
+ text: "You are a helpful assistant. Please respond concisely and accurately.",
17
+ },
18
+ },
19
+ ],
20
+ }));
21
+ // Greeting prompt
22
+ server.prompt("greeting_prompt", "Generate a greeting message", {
23
+ name: z.string().describe("Name of the person to greet"),
24
+ style: z
25
+ .string()
26
+ .optional()
27
+ .describe("Greeting style (formal, casual, friendly)"),
28
+ }, async ({ name, style }) => ({
29
+ messages: [
30
+ {
31
+ role: "user",
32
+ content: {
33
+ type: "text",
34
+ text: `Generate a ${style ?? "friendly"} greeting for ${name}.`,
35
+ },
36
+ },
37
+ ],
38
+ }));
39
+ // Template prompt
40
+ server.prompt("template_prompt", "A template with multiple arguments", {
41
+ topic: z.string().describe("Main topic"),
42
+ context: z.string().optional().describe("Additional context"),
43
+ length: z
44
+ .string()
45
+ .optional()
46
+ .describe("Desired length (short, medium, long)"),
47
+ }, async ({ topic, context, length, }) => {
48
+ let text = `Write a ${length ?? "medium"} explanation about ${topic}.`;
49
+ if (context) {
50
+ text += ` Context: ${context}`;
51
+ }
52
+ return {
53
+ messages: [
54
+ {
55
+ role: "user",
56
+ content: { type: "text", text },
57
+ },
58
+ ],
59
+ };
60
+ });
61
+ // Multi-message prompt
62
+ server.prompt("multi_message_prompt", "Prompt that returns multiple messages", {
63
+ count: z.string().describe("Number of messages to generate"),
64
+ }, async ({ count }) => {
65
+ const numMessages = Math.max(1, Math.min(parseInt(count, 10) || 1, 10));
66
+ const messages = Array.from({ length: numMessages }, (_, i) => ({
67
+ role: "user",
68
+ content: {
69
+ type: "text",
70
+ text: `Message ${i + 1} of ${numMessages}: Generate a helpful response.`,
71
+ },
72
+ }));
73
+ return { messages };
74
+ });
75
+ }
76
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/capabilities/prompts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C,gBAAgB;IAChB,MAAM,CAAC,MAAM,CACX,eAAe,EACf,kCAAkC,EAClC,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,uEAAuE;iBAC9E;aACF;SACF;KACF,CAAC,CACH,CAAC;IAEF,kBAAkB;IAClB,MAAM,CAAC,MAAM,CACX,iBAAiB,EACjB,6BAA6B,EAC7B;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QACxD,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,2CAA2C,CAAC;KACzD,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAoC,EAAE,EAAE,CAAC,CAAC;QAC5D,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,cAAc,KAAK,IAAI,UAAU,iBAAiB,IAAI,GAAG;iBAChE;aACF;SACF;KACF,CAAC,CACH,CAAC;IAEF,kBAAkB;IAClB,MAAM,CAAC,MAAM,CACX,iBAAiB,EACjB,oCAAoC,EACpC;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;QACxC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QAC7D,MAAM,EAAE,CAAC;aACN,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,sCAAsC,CAAC;KACpD,EACD,KAAK,EAAE,EACL,KAAK,EACL,OAAO,EACP,MAAM,GAKP,EAAE,EAAE;QACH,IAAI,IAAI,GAAG,WAAW,MAAM,IAAI,QAAQ,sBAAsB,KAAK,GAAG,CAAC;QACvE,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,IAAI,aAAa,OAAO,EAAE,CAAC;QACjC,CAAC;QACD,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;iBAChC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,uBAAuB;IACvB,MAAM,CAAC,MAAM,CACX,sBAAsB,EACtB,uCAAuC,EACvC;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;KAC7D,EACD,KAAK,EAAE,EAAE,KAAK,EAAqB,EAAE,EAAE;QACrC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACxE,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9D,IAAI,EAAE,MAAe;YACrB,OAAO,EAAE;gBACP,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,OAAO,WAAW,gCAAgC;aACzE;SACF,CAAC,CAAC,CAAC;QACJ,OAAO,EAAE,QAAQ,EAAE,CAAC;IACtB,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Resource implementations for MCP Test Kits
3
+ */
4
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ /**
6
+ * Register all resources with the MCP server
7
+ */
8
+ export declare function registerResources(server: McpServer): void;
9
+ //# sourceMappingURL=resources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../src/capabilities/resources.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAczE;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsFzD"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Resource implementations for MCP Test Kits
3
+ */
4
+ // Large text content for testing
5
+ const LARGE_TEXT_CONTENT = `
6
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor
7
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
8
+ nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
9
+
10
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
11
+ fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
12
+ culpa qui officia deserunt mollit anim id est laborum.
13
+
14
+ `.repeat(100);
15
+ /**
16
+ * Register all resources with the MCP server
17
+ */
18
+ export function registerResources(server) {
19
+ // Static greeting resource
20
+ server.registerResource("static-greeting", "test://static/greeting", { title: "Static Greeting", mimeType: "text/plain" }, async () => ({
21
+ contents: [
22
+ {
23
+ uri: "test://static/greeting",
24
+ mimeType: "text/plain",
25
+ text: "Hello from mcp-test-kits!",
26
+ },
27
+ ],
28
+ }));
29
+ // Static numbers resource
30
+ server.registerResource("static-numbers", "test://static/numbers", { title: "Number List", mimeType: "application/json" }, async () => ({
31
+ contents: [
32
+ {
33
+ uri: "test://static/numbers",
34
+ mimeType: "application/json",
35
+ text: JSON.stringify({ numbers: [1, 2, 3, 4, 5] }),
36
+ },
37
+ ],
38
+ }));
39
+ // Dynamic timestamp resource
40
+ server.registerResource("dynamic-timestamp", "test://dynamic/timestamp", { title: "Current Timestamp", mimeType: "application/json" }, async () => {
41
+ const now = new Date();
42
+ return {
43
+ contents: [
44
+ {
45
+ uri: "test://dynamic/timestamp",
46
+ mimeType: "application/json",
47
+ text: JSON.stringify({
48
+ timestamp: now.toISOString(),
49
+ unix: Math.floor(now.getTime() / 1000),
50
+ }),
51
+ },
52
+ ],
53
+ };
54
+ });
55
+ // Dynamic random resource
56
+ server.registerResource("dynamic-random", "test://dynamic/random", { title: "Random Number", mimeType: "application/json" }, async () => ({
57
+ contents: [
58
+ {
59
+ uri: "test://dynamic/random",
60
+ mimeType: "application/json",
61
+ text: JSON.stringify({ random: Math.floor(Math.random() * 101) }),
62
+ },
63
+ ],
64
+ }));
65
+ // Large text resource
66
+ server.registerResource("large-text", "test://large-text", { title: "Large Text Resource", mimeType: "text/plain" }, async () => ({
67
+ contents: [
68
+ {
69
+ uri: "test://large-text",
70
+ mimeType: "text/plain",
71
+ text: LARGE_TEXT_CONTENT,
72
+ },
73
+ ],
74
+ }));
75
+ }
76
+ //# sourceMappingURL=resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.js","sourceRoot":"","sources":["../../src/capabilities/resources.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,iCAAiC;AACjC,MAAM,kBAAkB,GAAG;;;;;;;;;CAS1B,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAEd;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAiB;IACjD,2BAA2B;IAC3B,MAAM,CAAC,gBAAgB,CACrB,iBAAiB,EACjB,wBAAwB,EACxB,EAAE,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,YAAY,EAAE,EACpD,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE;YACR;gBACE,GAAG,EAAE,wBAAwB;gBAC7B,QAAQ,EAAE,YAAY;gBACtB,IAAI,EAAE,2BAA2B;aAClC;SACF;KACF,CAAC,CACH,CAAC;IAEF,0BAA0B;IAC1B,MAAM,CAAC,gBAAgB,CACrB,gBAAgB,EAChB,uBAAuB,EACvB,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,kBAAkB,EAAE,EACtD,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE;YACR;gBACE,GAAG,EAAE,uBAAuB;gBAC5B,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;aACnD;SACF;KACF,CAAC,CACH,CAAC;IAEF,6BAA6B;IAC7B,MAAM,CAAC,gBAAgB,CACrB,mBAAmB,EACnB,0BAA0B,EAC1B,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,kBAAkB,EAAE,EAC5D,KAAK,IAAI,EAAE;QACT,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,0BAA0B;oBAC/B,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE;wBAC5B,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC;qBACvC,CAAC;iBACH;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,0BAA0B;IAC1B,MAAM,CAAC,gBAAgB,CACrB,gBAAgB,EAChB,uBAAuB,EACvB,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,kBAAkB,EAAE,EACxD,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE;YACR;gBACE,GAAG,EAAE,uBAAuB;gBAC5B,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;aAClE;SACF;KACF,CAAC,CACH,CAAC;IAEF,sBAAsB;IACtB,MAAM,CAAC,gBAAgB,CACrB,YAAY,EACZ,mBAAmB,EACnB,EAAE,KAAK,EAAE,qBAAqB,EAAE,QAAQ,EAAE,YAAY,EAAE,EACxD,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE;YACR;gBACE,GAAG,EAAE,mBAAmB;gBACxB,QAAQ,EAAE,YAAY;gBACtB,IAAI,EAAE,kBAAkB;aACzB;SACF;KACF,CAAC,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Tool implementations for MCP Test Kits
3
+ */
4
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ /**
6
+ * Register all tools with the MCP server
7
+ */
8
+ export declare function registerTools(server: McpServer): void;
9
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/capabilities/tools.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiHrD"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Tool implementations for MCP Test Kits
3
+ */
4
+ import { z } from "zod";
5
+ /**
6
+ * Register all tools with the MCP server
7
+ */
8
+ export function registerTools(server) {
9
+ // echo tool
10
+ server.tool("echo", "Returns the input message unchanged", { message: z.string().describe("The message to echo") }, async ({ message }) => ({
11
+ content: [{ type: "text", text: message }],
12
+ }));
13
+ // add tool
14
+ server.tool("add", "Adds two numbers together", {
15
+ a: z.number().describe("First number"),
16
+ b: z.number().describe("Second number"),
17
+ }, async ({ a, b }) => ({
18
+ content: [{ type: "text", text: String(a + b) }],
19
+ }));
20
+ // multiply tool
21
+ server.tool("multiply", "Multiplies two numbers", {
22
+ x: z.number().describe("First number"),
23
+ y: z.number().describe("Second number"),
24
+ }, async ({ x, y }) => ({
25
+ content: [{ type: "text", text: String(x * y) }],
26
+ }));
27
+ // reverse_string tool
28
+ server.tool("reverse_string", "Reverses a string", { text: z.string().describe("Text to reverse") }, async ({ text }) => ({
29
+ content: [{ type: "text", text: text.split("").reverse().join("") }],
30
+ }));
31
+ // generate_uuid tool
32
+ server.tool("generate_uuid", "Generates a random UUID", {}, async () => ({
33
+ content: [{ type: "text", text: crypto.randomUUID() }],
34
+ }));
35
+ // get_timestamp tool
36
+ server.tool("get_timestamp", "Returns the current timestamp", {
37
+ format: z
38
+ .enum(["unix", "iso"])
39
+ .default("iso")
40
+ .describe("Format: 'unix' or 'iso'"),
41
+ }, async ({ format }) => {
42
+ const now = new Date();
43
+ const result = format === "unix"
44
+ ? String(Math.floor(now.getTime() / 1000))
45
+ : now.toISOString();
46
+ return { content: [{ type: "text", text: result }] };
47
+ });
48
+ // sample_error tool
49
+ server.tool("sample_error", "Always throws an error (for testing error handling)", {
50
+ error_message: z
51
+ .string()
52
+ .default("This is a test error")
53
+ .describe("Custom error message"),
54
+ }, async ({ error_message }) => {
55
+ throw new Error(error_message);
56
+ });
57
+ // long_running_task tool
58
+ server.tool("long_running_task", "Simulates a long-running operation", {
59
+ duration: z
60
+ .number()
61
+ .min(0)
62
+ .max(10)
63
+ .describe("Duration in seconds (max 10)"),
64
+ }, async ({ duration }) => {
65
+ const actualDuration = Math.min(Math.max(duration, 0), 10);
66
+ await new Promise((resolve) => setTimeout(resolve, actualDuration * 1000));
67
+ return {
68
+ content: [
69
+ {
70
+ type: "text",
71
+ text: `Task completed after ${actualDuration} seconds`,
72
+ },
73
+ ],
74
+ };
75
+ });
76
+ }
77
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/capabilities/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Configuration types for MCP Test Kits
3
+ */
4
+ export interface ServerConfig {
5
+ name: string;
6
+ version: string;
7
+ }
8
+ export interface NetworkConfig {
9
+ host: string;
10
+ port: number;
11
+ }
12
+ export interface TransportConfig {
13
+ type: "stdio" | "http" | "sse";
14
+ network: NetworkConfig;
15
+ }
16
+ export interface CapabilitiesConfig {
17
+ tools: boolean;
18
+ resources: boolean;
19
+ prompts: boolean;
20
+ }
21
+ export interface ConfigOptions {
22
+ server: ServerConfig;
23
+ transport: TransportConfig;
24
+ capabilities: CapabilitiesConfig;
25
+ }
26
+ /**
27
+ * Configuration class with default values
28
+ */
29
+ export declare class Config implements ConfigOptions {
30
+ server: ServerConfig;
31
+ transport: TransportConfig;
32
+ capabilities: CapabilitiesConfig;
33
+ constructor(options?: Partial<ConfigOptions>);
34
+ }
35
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;IAC/B,OAAO,EAAE,aAAa,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,EAAE,eAAe,CAAC;IAC3B,YAAY,EAAE,kBAAkB,CAAC;CAClC;AAED;;GAEG;AACH,qBAAa,MAAO,YAAW,aAAa;IAC1C,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,EAAE,eAAe,CAAC;IAC3B,YAAY,EAAE,kBAAkB,CAAC;gBAErB,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC;CAoB7C"}
package/dist/config.js ADDED
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Configuration types for MCP Test Kits
3
+ */
4
+ /**
5
+ * Configuration class with default values
6
+ */
7
+ export class Config {
8
+ server;
9
+ transport;
10
+ capabilities;
11
+ constructor(options) {
12
+ this.server = {
13
+ name: options?.server?.name ?? "mcp-test-kits",
14
+ version: options?.server?.version ?? "1.0.0",
15
+ };
16
+ this.transport = {
17
+ type: options?.transport?.type ?? "stdio",
18
+ network: {
19
+ host: options?.transport?.network?.host ?? "127.0.0.1",
20
+ port: options?.transport?.network?.port ?? 3000,
21
+ },
22
+ };
23
+ this.capabilities = {
24
+ tools: options?.capabilities?.tools ?? true,
25
+ resources: options?.capabilities?.resources ?? true,
26
+ prompts: options?.capabilities?.prompts ?? true,
27
+ };
28
+ }
29
+ }
30
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AA6BH;;GAEG;AACH,MAAM,OAAO,MAAM;IACjB,MAAM,CAAe;IACrB,SAAS,CAAkB;IAC3B,YAAY,CAAqB;IAEjC,YAAY,OAAgC;QAC1C,IAAI,CAAC,MAAM,GAAG;YACZ,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,IAAI,eAAe;YAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,OAAO;SAC7C,CAAC;QAEF,IAAI,CAAC,SAAS,GAAG;YACf,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,OAAO;YACzC,OAAO,EAAE;gBACP,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,IAAI,WAAW;gBACtD,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,IAAI,IAAI;aAChD;SACF,CAAC;QAEF,IAAI,CAAC,YAAY,GAAG;YAClB,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,IAAI,IAAI;YAC3C,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,IAAI,IAAI;YACnD,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,IAAI,IAAI;SAChD,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Extract specification from MCP Test Kits server.
4
+ *
5
+ * This script extracts the tools, resources, and prompts specification
6
+ * from the TypeScript implementation and outputs JSON that can be compared
7
+ * against the shared specification.
8
+ *
9
+ * Usage:
10
+ * node dist/extract-spec.js > extracted_spec.json
11
+ * node dist/extract-spec.js --compare
12
+ */
13
+ export {};
14
+ //# sourceMappingURL=extract-spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-spec.d.ts","sourceRoot":"","sources":["../src/extract-spec.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG"}
@@ -0,0 +1,117 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Extract specification from MCP Test Kits server.
4
+ *
5
+ * This script extracts the tools, resources, and prompts specification
6
+ * from the TypeScript implementation and outputs JSON that can be compared
7
+ * against the shared specification.
8
+ *
9
+ * Usage:
10
+ * node dist/extract-spec.js > extracted_spec.json
11
+ * node dist/extract-spec.js --compare
12
+ */
13
+ import { readFileSync, existsSync } from "node:fs";
14
+ import { join, dirname } from "node:path";
15
+ import { fileURLToPath } from "node:url";
16
+ import { parseArgs } from "node:util";
17
+ import { Config } from "./config.js";
18
+ import { createServer } from "./server.js";
19
+ import { extractSpec } from "./introspection.js";
20
+ const __dirname = dirname(fileURLToPath(import.meta.url));
21
+ /**
22
+ * Load shared specification from JSON files
23
+ */
24
+ function loadSharedSpec() {
25
+ // Navigate from dist/ to project root, then to shared/
26
+ const projectRoot = join(__dirname, "..", "..");
27
+ const sharedDir = join(projectRoot, "shared", "test-data");
28
+ const tools = [];
29
+ const resources = [];
30
+ const prompts = [];
31
+ const toolsFile = join(sharedDir, "tools.json");
32
+ if (existsSync(toolsFile)) {
33
+ const data = JSON.parse(readFileSync(toolsFile, "utf-8"));
34
+ tools.push(...(data.tools || []));
35
+ }
36
+ const resourcesFile = join(sharedDir, "resources.json");
37
+ if (existsSync(resourcesFile)) {
38
+ const data = JSON.parse(readFileSync(resourcesFile, "utf-8"));
39
+ resources.push(...(data.resources || []));
40
+ }
41
+ const promptsFile = join(sharedDir, "prompts.json");
42
+ if (existsSync(promptsFile)) {
43
+ const data = JSON.parse(readFileSync(promptsFile, "utf-8"));
44
+ prompts.push(...(data.prompts || []));
45
+ }
46
+ return {
47
+ tools: tools.sort((a, b) => a.name.localeCompare(b.name)),
48
+ resources: resources.sort((a, b) => a.uri.localeCompare(b.uri)),
49
+ prompts: prompts.sort((a, b) => a.name.localeCompare(b.name)),
50
+ };
51
+ }
52
+ /**
53
+ * Compare extracted spec against shared spec
54
+ */
55
+ function compareSpecs(extracted, shared) {
56
+ const results = {
57
+ tools: { match: true, missing: [], extra: [] },
58
+ resources: { match: true, missing: [], extra: [] },
59
+ prompts: { match: true, missing: [], extra: [] },
60
+ };
61
+ // Compare tools by name
62
+ const extractedToolNames = new Set(extracted.tools.map((t) => t.name));
63
+ const sharedToolNames = new Set(shared.tools.map((t) => t.name));
64
+ results.tools.missing = [...sharedToolNames].filter((n) => !extractedToolNames.has(n));
65
+ results.tools.extra = [...extractedToolNames].filter((n) => !sharedToolNames.has(n));
66
+ results.tools.match =
67
+ results.tools.missing.length === 0 && results.tools.extra.length === 0;
68
+ // Compare resources by URI
69
+ const extractedResourceUris = new Set(extracted.resources.map((r) => r.uri));
70
+ const sharedResourceUris = new Set(shared.resources.map((r) => r.uri));
71
+ results.resources.missing = [...sharedResourceUris].filter((u) => !extractedResourceUris.has(u));
72
+ results.resources.extra = [...extractedResourceUris].filter((u) => !sharedResourceUris.has(u));
73
+ results.resources.match =
74
+ results.resources.missing.length === 0 &&
75
+ results.resources.extra.length === 0;
76
+ // Compare prompts by name
77
+ const extractedPromptNames = new Set(extracted.prompts.map((p) => p.name));
78
+ const sharedPromptNames = new Set(shared.prompts.map((p) => p.name));
79
+ results.prompts.missing = [...sharedPromptNames].filter((n) => !extractedPromptNames.has(n));
80
+ results.prompts.extra = [...extractedPromptNames].filter((n) => !sharedPromptNames.has(n));
81
+ results.prompts.match =
82
+ results.prompts.missing.length === 0 && results.prompts.extra.length === 0;
83
+ return results;
84
+ }
85
+ async function main() {
86
+ const { values } = parseArgs({
87
+ options: {
88
+ compare: { type: "boolean" },
89
+ output: { type: "string", short: "o" },
90
+ },
91
+ allowPositionals: true,
92
+ });
93
+ // Create server instance with default config
94
+ const config = new Config();
95
+ const server = createServer(config);
96
+ // Extract specifications automatically via introspection
97
+ const extracted = extractSpec(server);
98
+ if (values.compare) {
99
+ const shared = loadSharedSpec();
100
+ const results = compareSpecs(extracted, shared);
101
+ const allMatch = results.tools.match && results.resources.match && results.prompts.match;
102
+ const output = {
103
+ status: allMatch ? "pass" : "fail",
104
+ comparison: results,
105
+ };
106
+ console.log(JSON.stringify(output, null, 2));
107
+ process.exit(allMatch ? 0 : 1);
108
+ }
109
+ else {
110
+ console.log(JSON.stringify(extracted, null, 2));
111
+ }
112
+ }
113
+ main().catch((error) => {
114
+ console.error("Error:", error);
115
+ process.exit(1);
116
+ });
117
+ //# sourceMappingURL=extract-spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-spec.js","sourceRoot":"","sources":["../src/extract-spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Entry point for MCP Test Kits server (TypeScript)
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;GAEG"}