@titikaka2026/mcptools 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.
Files changed (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +328 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +17 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/create.d.ts +3 -0
  8. package/dist/commands/create.d.ts.map +1 -0
  9. package/dist/commands/create.js +564 -0
  10. package/dist/commands/create.js.map +1 -0
  11. package/dist/commands/inspect.d.ts +3 -0
  12. package/dist/commands/inspect.d.ts.map +1 -0
  13. package/dist/commands/inspect.js +140 -0
  14. package/dist/commands/inspect.js.map +1 -0
  15. package/dist/commands/test.d.ts +3 -0
  16. package/dist/commands/test.d.ts.map +1 -0
  17. package/dist/commands/test.js +125 -0
  18. package/dist/commands/test.js.map +1 -0
  19. package/dist/commands/wrap.d.ts +3 -0
  20. package/dist/commands/wrap.d.ts.map +1 -0
  21. package/dist/commands/wrap.js +114 -0
  22. package/dist/commands/wrap.js.map +1 -0
  23. package/dist/core/client.d.ts +21 -0
  24. package/dist/core/client.d.ts.map +1 -0
  25. package/dist/core/client.js +144 -0
  26. package/dist/core/client.js.map +1 -0
  27. package/dist/core/validator.d.ts +13 -0
  28. package/dist/core/validator.d.ts.map +1 -0
  29. package/dist/core/validator.js +120 -0
  30. package/dist/core/validator.js.map +1 -0
  31. package/dist/core/wrap-cli.d.ts +3 -0
  32. package/dist/core/wrap-cli.d.ts.map +1 -0
  33. package/dist/core/wrap-cli.js +144 -0
  34. package/dist/core/wrap-cli.js.map +1 -0
  35. package/dist/core/wrap-rest.d.ts +4 -0
  36. package/dist/core/wrap-rest.d.ts.map +1 -0
  37. package/dist/core/wrap-rest.js +157 -0
  38. package/dist/core/wrap-rest.js.map +1 -0
  39. package/dist/index.d.ts +6 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +5 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/types.d.ts +93 -0
  44. package/dist/types.d.ts.map +1 -0
  45. package/dist/types.js +2 -0
  46. package/dist/types.js.map +1 -0
  47. package/package.json +62 -0
@@ -0,0 +1,140 @@
1
+ import { Command } from "commander";
2
+ import { spawn } from "node:child_process";
3
+ import chalk from "chalk";
4
+ export const inspectCommand = new Command("inspect")
5
+ .description("Inspect and debug MCP server communication in real-time")
6
+ .requiredOption("-c, --command <command>", "Command to start the MCP server")
7
+ .option("-a, --args <args...>", "Arguments for the server command")
8
+ .option("--raw", "Show raw JSON messages without formatting", false)
9
+ .action(async (options) => {
10
+ console.log(chalk.bold("MCP Inspector"));
11
+ console.log(chalk.gray("Watching all JSON-RPC messages between client and server"));
12
+ console.log(chalk.gray("Press Ctrl+C to stop\n"));
13
+ const args = options.args ?? [];
14
+ const proc = spawn(options.command, args, {
15
+ stdio: ["pipe", "pipe", "pipe"],
16
+ });
17
+ let messageCount = 0;
18
+ // Send initialize
19
+ const initRequest = {
20
+ jsonrpc: "2.0",
21
+ id: 1,
22
+ method: "initialize",
23
+ params: {
24
+ protocolVersion: "2024-11-05",
25
+ capabilities: {},
26
+ clientInfo: { name: "mcptools-inspector", version: "0.1.0" },
27
+ },
28
+ };
29
+ logMessage("out", initRequest, options.raw);
30
+ proc.stdin?.write(JSON.stringify(initRequest) + "\n");
31
+ // Process server output
32
+ let buffer = "";
33
+ proc.stdout?.on("data", (chunk) => {
34
+ buffer += chunk.toString();
35
+ const lines = buffer.split("\n");
36
+ buffer = lines.pop() ?? "";
37
+ for (const line of lines) {
38
+ if (!line.trim())
39
+ continue;
40
+ try {
41
+ const msg = JSON.parse(line);
42
+ messageCount++;
43
+ logMessage("in", msg, options.raw);
44
+ // After init response, send tools/list
45
+ if (msg.id === 1 && msg.result) {
46
+ // Send initialized notification
47
+ const notification = {
48
+ jsonrpc: "2.0",
49
+ method: "notifications/initialized",
50
+ params: {},
51
+ };
52
+ logMessage("out", notification, options.raw);
53
+ proc.stdin?.write(JSON.stringify(notification) + "\n");
54
+ // List tools
55
+ const listTools = {
56
+ jsonrpc: "2.0",
57
+ id: 2,
58
+ method: "tools/list",
59
+ params: {},
60
+ };
61
+ logMessage("out", listTools, options.raw);
62
+ proc.stdin?.write(JSON.stringify(listTools) + "\n");
63
+ // List resources
64
+ const listResources = {
65
+ jsonrpc: "2.0",
66
+ id: 3,
67
+ method: "resources/list",
68
+ params: {},
69
+ };
70
+ logMessage("out", listResources, options.raw);
71
+ proc.stdin?.write(JSON.stringify(listResources) + "\n");
72
+ }
73
+ }
74
+ catch {
75
+ console.log(chalk.gray(` [non-JSON] ${line}`));
76
+ }
77
+ }
78
+ });
79
+ proc.stderr?.on("data", (chunk) => {
80
+ const text = chunk.toString().trim();
81
+ if (text) {
82
+ console.log(chalk.red(` [stderr] ${text}`));
83
+ }
84
+ });
85
+ proc.on("close", (code) => {
86
+ console.log();
87
+ console.log(chalk.gray(`Server exited with code ${code}`));
88
+ console.log(chalk.gray(`Total messages: ${messageCount}`));
89
+ });
90
+ // Handle Ctrl+C
91
+ process.on("SIGINT", () => {
92
+ proc.kill();
93
+ process.exit(0);
94
+ });
95
+ });
96
+ function logMessage(direction, msg, raw) {
97
+ const timestamp = new Date().toISOString().split("T")[1]?.slice(0, 12) ?? "";
98
+ const arrow = direction === "in" ? chalk.green("◄──") : chalk.blue("──►");
99
+ const label = direction === "in" ? chalk.green("SERVER") : chalk.blue("CLIENT");
100
+ if (raw) {
101
+ console.log(`${chalk.gray(timestamp)} ${arrow} ${label} ${JSON.stringify(msg)}`);
102
+ return;
103
+ }
104
+ const method = msg.method;
105
+ const id = msg.id;
106
+ const hasError = "error" in msg;
107
+ let summary;
108
+ if (method) {
109
+ summary = chalk.cyan(method);
110
+ if (id !== undefined) {
111
+ summary += chalk.gray(` (id: ${id})`);
112
+ }
113
+ }
114
+ else if (id !== undefined) {
115
+ summary = chalk.gray(`response (id: ${id})`);
116
+ if (hasError) {
117
+ const error = msg.error;
118
+ summary += chalk.red(` ERROR: ${error?.message ?? "unknown"}`);
119
+ }
120
+ }
121
+ else {
122
+ summary = chalk.gray("notification");
123
+ }
124
+ console.log(`${chalk.gray(timestamp)} ${arrow} ${label} ${summary}`);
125
+ // Show result summary for responses
126
+ if (msg.result && typeof msg.result === "object") {
127
+ const result = msg.result;
128
+ if (Array.isArray(result.tools)) {
129
+ console.log(chalk.gray(` ${result.tools.length} tool(s) available`));
130
+ }
131
+ if (Array.isArray(result.resources)) {
132
+ console.log(chalk.gray(` ${result.resources.length} resource(s) available`));
133
+ }
134
+ if (result.serverInfo) {
135
+ const info = result.serverInfo;
136
+ console.log(chalk.gray(` server: ${info.name} v${info.version}`));
137
+ }
138
+ }
139
+ }
140
+ //# sourceMappingURL=inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/commands/inspect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const testCommand: Command;
3
+ //# sourceMappingURL=test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,WAAW,SA6HpB,CAAC"}
@@ -0,0 +1,125 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import ora from "ora";
4
+ import { McpClient } from "../core/client.js";
5
+ import { McpValidator } from "../core/validator.js";
6
+ export const testCommand = new Command("test")
7
+ .description("Interactively test an MCP server")
8
+ .requiredOption("-c, --command <command>", "Command to start the MCP server")
9
+ .option("-a, --args <args...>", "Arguments for the server command")
10
+ .option("--validate", "Run validation checks on the server", false)
11
+ .option("--json", "Output results as JSON", false)
12
+ .action(async (options) => {
13
+ const spinner = ora("Connecting to MCP server...").start();
14
+ const client = new McpClient({
15
+ name: "test-server",
16
+ command: options.command,
17
+ args: options.args,
18
+ });
19
+ try {
20
+ await client.connect();
21
+ spinner.succeed("Connected to MCP server");
22
+ // List tools
23
+ const toolsSpinner = ora("Fetching tools...").start();
24
+ const tools = await client.listTools();
25
+ toolsSpinner.succeed(`Found ${tools.length} tool(s)`);
26
+ if (tools.length > 0) {
27
+ console.log();
28
+ console.log(chalk.bold("Tools:"));
29
+ for (const tool of tools) {
30
+ console.log(` ${chalk.cyan(tool.name)} — ${tool.description || "(no description)"}`);
31
+ if (tool.inputSchema) {
32
+ const props = tool.inputSchema.properties;
33
+ if (props && typeof props === "object") {
34
+ for (const [key, val] of Object.entries(props)) {
35
+ console.log(` ${chalk.gray("·")} ${key}: ${chalk.yellow(val.type ?? "unknown")} ${val.description ? `— ${val.description}` : ""}`);
36
+ }
37
+ }
38
+ }
39
+ }
40
+ }
41
+ // List resources
42
+ try {
43
+ const resources = await client.listResources();
44
+ if (resources.length > 0) {
45
+ console.log();
46
+ console.log(chalk.bold("Resources:"));
47
+ for (const r of resources) {
48
+ console.log(` ${chalk.cyan(r.uri)} — ${r.name} ${r.mimeType ? chalk.gray(`(${r.mimeType})`) : ""}`);
49
+ }
50
+ }
51
+ }
52
+ catch {
53
+ // Server may not support resources
54
+ }
55
+ // List prompts
56
+ try {
57
+ const prompts = await client.listPrompts();
58
+ if (prompts.length > 0) {
59
+ console.log();
60
+ console.log(chalk.bold("Prompts:"));
61
+ for (const p of prompts) {
62
+ console.log(` ${chalk.cyan(p.name)} — ${p.description || "(no description)"}`);
63
+ }
64
+ }
65
+ }
66
+ catch {
67
+ // Server may not support prompts
68
+ }
69
+ // Validate if requested
70
+ if (options.validate) {
71
+ console.log();
72
+ console.log(chalk.bold("Validation:"));
73
+ const validator = new McpValidator();
74
+ let allValid = true;
75
+ for (const tool of tools) {
76
+ const result = validator.validateToolDefinition(tool);
77
+ if (result.valid) {
78
+ console.log(` ${chalk.green("✓")} Tool "${tool.name}" is valid`);
79
+ }
80
+ else {
81
+ allValid = false;
82
+ console.log(` ${chalk.red("✗")} Tool "${tool.name}" has issues:`);
83
+ for (const err of result.errors) {
84
+ console.log(` ${chalk.red("error:")} ${err}`);
85
+ }
86
+ }
87
+ for (const warn of result.warnings) {
88
+ console.log(` ${chalk.yellow("warn:")} ${warn}`);
89
+ }
90
+ }
91
+ if (allValid) {
92
+ console.log();
93
+ console.log(chalk.green("All validations passed!"));
94
+ }
95
+ }
96
+ // JSON output
97
+ if (options.json) {
98
+ const output = {
99
+ tools,
100
+ resources: [],
101
+ prompts: [],
102
+ };
103
+ try {
104
+ output.resources = await client.listResources();
105
+ }
106
+ catch { /* skip */ }
107
+ try {
108
+ output.prompts = await client.listPrompts();
109
+ }
110
+ catch { /* skip */ }
111
+ console.log();
112
+ console.log(JSON.stringify(output, null, 2));
113
+ }
114
+ console.log();
115
+ console.log(chalk.green("Test completed successfully."));
116
+ }
117
+ catch (err) {
118
+ spinner.fail(chalk.red(`Test failed: ${err.message}`));
119
+ process.exit(1);
120
+ }
121
+ finally {
122
+ await client.disconnect();
123
+ }
124
+ });
125
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const wrapCommand: Command;
3
+ //# sourceMappingURL=wrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrap.d.ts","sourceRoot":"","sources":["../../src/commands/wrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,WAAW,SAGO,CAAC"}
@@ -0,0 +1,114 @@
1
+ import { Command } from "commander";
2
+ import { readFile, writeFile, mkdir } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import chalk from "chalk";
5
+ import ora from "ora";
6
+ import { wrapRestApi, generateToolRouter } from "../core/wrap-rest.js";
7
+ import { wrapCli } from "../core/wrap-cli.js";
8
+ export const wrapCommand = new Command("wrap")
9
+ .description("Convert a REST API or CLI tool into an MCP server")
10
+ .addCommand(wrapRestCommand())
11
+ .addCommand(wrapCliCommand());
12
+ function wrapRestCommand() {
13
+ return new Command("rest")
14
+ .description("Wrap a REST API as an MCP server")
15
+ .requiredOption("-c, --config <file>", "Path to API config JSON file")
16
+ .option("-o, --output <dir>", "Output directory", ".")
17
+ .action(async (options) => {
18
+ const spinner = ora("Generating MCP server from REST API config...").start();
19
+ try {
20
+ const configRaw = await readFile(options.config, "utf-8");
21
+ const config = JSON.parse(configRaw);
22
+ const { name, baseUrl, endpoints } = config;
23
+ if (!name || !baseUrl || !endpoints) {
24
+ spinner.fail("Config must have 'name', 'baseUrl', and 'endpoints' fields");
25
+ return;
26
+ }
27
+ const serverCode = wrapRestApi({
28
+ name,
29
+ baseUrl,
30
+ endpoints,
31
+ outputDir: options.output,
32
+ });
33
+ const routerCode = generateToolRouter(endpoints);
34
+ const fullCode = serverCode + "\n" + routerCode;
35
+ const outputDir = options.output;
36
+ await mkdir(outputDir, { recursive: true });
37
+ const outputFile = join(outputDir, `${name}-mcp-server.mjs`);
38
+ await writeFile(outputFile, fullCode);
39
+ spinner.succeed(chalk.green(`Generated MCP server: ${outputFile}`));
40
+ console.log();
41
+ console.log(chalk.bold("Usage:"));
42
+ console.log(` node ${outputFile}`);
43
+ console.log();
44
+ console.log(chalk.bold("Test:"));
45
+ console.log(` mcptools test --command "node ${outputFile}"`);
46
+ }
47
+ catch (err) {
48
+ spinner.fail(chalk.red(`Failed: ${err.message}`));
49
+ process.exit(1);
50
+ }
51
+ });
52
+ }
53
+ function wrapCliCommand() {
54
+ return new Command("cli")
55
+ .description("Wrap a CLI tool as an MCP server")
56
+ .requiredOption("-c, --config <file>", "Path to CLI config JSON file")
57
+ .option("-o, --output <dir>", "Output directory", ".")
58
+ .action(async (options) => {
59
+ const spinner = ora("Generating MCP server from CLI config...").start();
60
+ try {
61
+ const configRaw = await readFile(options.config, "utf-8");
62
+ const config = JSON.parse(configRaw);
63
+ const { name, command, description, subcommands } = config;
64
+ if (!name || !command || !subcommands) {
65
+ spinner.fail("Config must have 'name', 'command', and 'subcommands' fields");
66
+ return;
67
+ }
68
+ const serverCode = wrapCli({
69
+ name,
70
+ command,
71
+ description: description ?? "",
72
+ subcommands,
73
+ outputDir: options.output,
74
+ });
75
+ const outputDir = options.output;
76
+ await mkdir(outputDir, { recursive: true });
77
+ const outputFile = join(outputDir, `${name}-mcp-server.mjs`);
78
+ await writeFile(outputFile, serverCode);
79
+ spinner.succeed(chalk.green(`Generated MCP server: ${outputFile}`));
80
+ console.log();
81
+ console.log(chalk.bold("Usage:"));
82
+ console.log(` node ${outputFile}`);
83
+ console.log();
84
+ console.log(chalk.bold("Test:"));
85
+ console.log(` mcptools test --command "node ${outputFile}"`);
86
+ console.log();
87
+ console.log(chalk.bold("Example config format:"));
88
+ console.log(chalk.gray(JSON.stringify({
89
+ name: "my-cli",
90
+ command: "my-tool",
91
+ description: "My CLI tool as MCP server",
92
+ subcommands: [
93
+ {
94
+ name: "list",
95
+ description: "List items",
96
+ args: [
97
+ {
98
+ name: "format",
99
+ type: "string",
100
+ description: "Output format",
101
+ required: false,
102
+ },
103
+ ],
104
+ },
105
+ ],
106
+ }, null, 2)));
107
+ }
108
+ catch (err) {
109
+ spinner.fail(chalk.red(`Failed: ${err.message}`));
110
+ process.exit(1);
111
+ }
112
+ });
113
+ }
114
+ //# sourceMappingURL=wrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrap.js","sourceRoot":"","sources":["../../src/commands/wrap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { McpTool, McpResource, McpPrompt, McpServerConfig } from "../types.js";
2
+ export declare class McpClient {
3
+ private config;
4
+ private process;
5
+ private requestId;
6
+ private pending;
7
+ private buffer;
8
+ constructor(config: McpServerConfig);
9
+ connect(): Promise<void>;
10
+ listTools(): Promise<McpTool[]>;
11
+ listResources(): Promise<McpResource[]>;
12
+ listPrompts(): Promise<McpPrompt[]>;
13
+ callTool(name: string, args?: Record<string, unknown>): Promise<unknown>;
14
+ readResource(uri: string): Promise<unknown>;
15
+ getPrompt(name: string, args?: Record<string, string>): Promise<unknown>;
16
+ disconnect(): Promise<void>;
17
+ private send;
18
+ private notify;
19
+ private processBuffer;
20
+ }
21
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,OAAO,EACP,WAAW,EACX,SAAS,EACT,eAAe,EAChB,MAAM,aAAa,CAAC;AAErB,qBAAa,SAAS;IASR,OAAO,CAAC,MAAM;IAR1B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,OAAO,CAGX;IACJ,OAAO,CAAC,MAAM,CAAM;gBAEA,MAAM,EAAE,eAAe;IAErC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAyCxB,SAAS,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAM/B,aAAa,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAMvC,WAAW,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAMnC,QAAQ,CACZ,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,OAAO,CAAC;IAUb,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ3C,SAAS,CACb,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAChC,OAAO,CAAC,OAAO,CAAC;IAQb,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAOnB,IAAI;IAiClB,OAAO,CAAC,MAAM;IAYd,OAAO,CAAC,aAAa;CAsBtB"}
@@ -0,0 +1,144 @@
1
+ import { spawn } from "node:child_process";
2
+ export class McpClient {
3
+ config;
4
+ process = null;
5
+ requestId = 0;
6
+ pending = new Map();
7
+ buffer = "";
8
+ constructor(config) {
9
+ this.config = config;
10
+ }
11
+ async connect() {
12
+ if (this.config.transport === "sse" && this.config.url) {
13
+ throw new Error("SSE transport is not yet supported. Use stdio.");
14
+ }
15
+ const args = this.config.args ?? [];
16
+ this.process = spawn(this.config.command, args, {
17
+ stdio: ["pipe", "pipe", "pipe"],
18
+ env: { ...process.env, ...this.config.env },
19
+ });
20
+ this.process.stdout?.on("data", (chunk) => {
21
+ this.buffer += chunk.toString();
22
+ this.processBuffer();
23
+ });
24
+ this.process.on("error", (err) => {
25
+ for (const [, handler] of this.pending) {
26
+ handler.reject(err);
27
+ }
28
+ this.pending.clear();
29
+ });
30
+ this.process.on("close", () => {
31
+ for (const [, handler] of this.pending) {
32
+ handler.reject(new Error("MCP server process exited"));
33
+ }
34
+ this.pending.clear();
35
+ });
36
+ // Initialize the connection
37
+ await this.send("initialize", {
38
+ protocolVersion: "2024-11-05",
39
+ capabilities: {},
40
+ clientInfo: { name: "mcptools", version: "0.1.0" },
41
+ });
42
+ // Send initialized notification
43
+ this.notify("notifications/initialized", {});
44
+ }
45
+ async listTools() {
46
+ const response = await this.send("tools/list", {});
47
+ const result = response.result;
48
+ return result?.tools ?? [];
49
+ }
50
+ async listResources() {
51
+ const response = await this.send("resources/list", {});
52
+ const result = response.result;
53
+ return result?.resources ?? [];
54
+ }
55
+ async listPrompts() {
56
+ const response = await this.send("prompts/list", {});
57
+ const result = response.result;
58
+ return result?.prompts ?? [];
59
+ }
60
+ async callTool(name, args = {}) {
61
+ const response = await this.send("tools/call", { name, arguments: args });
62
+ if (response.error) {
63
+ throw new Error(`Tool call failed: ${response.error.message} (code: ${response.error.code})`);
64
+ }
65
+ return response.result;
66
+ }
67
+ async readResource(uri) {
68
+ const response = await this.send("resources/read", { uri });
69
+ if (response.error) {
70
+ throw new Error(`Resource read failed: ${response.error.message}`);
71
+ }
72
+ return response.result;
73
+ }
74
+ async getPrompt(name, args = {}) {
75
+ const response = await this.send("prompts/get", { name, arguments: args });
76
+ if (response.error) {
77
+ throw new Error(`Prompt get failed: ${response.error.message}`);
78
+ }
79
+ return response.result;
80
+ }
81
+ async disconnect() {
82
+ if (this.process) {
83
+ this.process.kill();
84
+ this.process = null;
85
+ }
86
+ }
87
+ async send(method, params) {
88
+ const id = ++this.requestId;
89
+ const request = {
90
+ jsonrpc: "2.0",
91
+ id,
92
+ method,
93
+ params,
94
+ };
95
+ return new Promise((resolve, reject) => {
96
+ this.pending.set(id, { resolve, reject });
97
+ const data = JSON.stringify(request) + "\n";
98
+ this.process?.stdin?.write(data, (err) => {
99
+ if (err) {
100
+ this.pending.delete(id);
101
+ reject(err);
102
+ }
103
+ });
104
+ // Timeout after 30 seconds
105
+ setTimeout(() => {
106
+ if (this.pending.has(id)) {
107
+ this.pending.delete(id);
108
+ reject(new Error(`Request ${method} timed out after 30s`));
109
+ }
110
+ }, 30000);
111
+ });
112
+ }
113
+ notify(method, params) {
114
+ const notification = {
115
+ jsonrpc: "2.0",
116
+ method,
117
+ params,
118
+ };
119
+ this.process?.stdin?.write(JSON.stringify(notification) + "\n");
120
+ }
121
+ processBuffer() {
122
+ const lines = this.buffer.split("\n");
123
+ this.buffer = lines.pop() ?? "";
124
+ for (const line of lines) {
125
+ const trimmed = line.trim();
126
+ if (!trimmed)
127
+ continue;
128
+ try {
129
+ const message = JSON.parse(trimmed);
130
+ if (message.id !== undefined) {
131
+ const handler = this.pending.get(Number(message.id));
132
+ if (handler) {
133
+ this.pending.delete(Number(message.id));
134
+ handler.resolve(message);
135
+ }
136
+ }
137
+ }
138
+ catch {
139
+ // Skip malformed JSON lines
140
+ }
141
+ }
142
+ }
143
+ }
144
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface ValidationResult {
2
+ valid: boolean;
3
+ errors: string[];
4
+ warnings: string[];
5
+ }
6
+ export declare class McpValidator {
7
+ validateMessage(data: unknown): ValidationResult;
8
+ validateToolDefinition(tool: unknown): ValidationResult;
9
+ validateResourceDefinition(resource: unknown): ValidationResult;
10
+ private validateRequest;
11
+ private validateResponse;
12
+ }
13
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/core/validator.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,qBAAa,YAAY;IACvB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB;IAkChD,sBAAsB,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB;IA8BvD,0BAA0B,CAAC,QAAQ,EAAE,OAAO,GAAG,gBAAgB;IAyB/D,OAAO,CAAC,eAAe;IA0CvB,OAAO,CAAC,gBAAgB;CAuBzB"}