@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.
- package/LICENSE +21 -0
- package/README.md +328 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +17 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/create.d.ts +3 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +564 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/inspect.d.ts +3 -0
- package/dist/commands/inspect.d.ts.map +1 -0
- package/dist/commands/inspect.js +140 -0
- package/dist/commands/inspect.js.map +1 -0
- package/dist/commands/test.d.ts +3 -0
- package/dist/commands/test.d.ts.map +1 -0
- package/dist/commands/test.js +125 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/commands/wrap.d.ts +3 -0
- package/dist/commands/wrap.d.ts.map +1 -0
- package/dist/commands/wrap.js +114 -0
- package/dist/commands/wrap.js.map +1 -0
- package/dist/core/client.d.ts +21 -0
- package/dist/core/client.d.ts.map +1 -0
- package/dist/core/client.js +144 -0
- package/dist/core/client.js.map +1 -0
- package/dist/core/validator.d.ts +13 -0
- package/dist/core/validator.d.ts.map +1 -0
- package/dist/core/validator.js +120 -0
- package/dist/core/validator.js.map +1 -0
- package/dist/core/wrap-cli.d.ts +3 -0
- package/dist/core/wrap-cli.d.ts.map +1 -0
- package/dist/core/wrap-cli.js +144 -0
- package/dist/core/wrap-cli.js.map +1 -0
- package/dist/core/wrap-rest.d.ts +4 -0
- package/dist/core/wrap-rest.d.ts.map +1 -0
- package/dist/core/wrap-rest.js +157 -0
- package/dist/core/wrap-rest.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +93 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- 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 @@
|
|
|
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":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,kCAAkC,CAAC;KAC/C,cAAc,CAAC,yBAAyB,EAAE,iCAAiC,CAAC;KAC5E,MAAM,CAAC,sBAAsB,EAAE,kCAAkC,CAAC;KAClE,MAAM,CAAC,YAAY,EAAE,qCAAqC,EAAE,KAAK,CAAC;KAClE,MAAM,CAAC,QAAQ,EAAE,wBAAwB,EAAE,KAAK,CAAC;KACjD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,OAAO,GAAG,GAAG,CAAC,6BAA6B,CAAC,CAAC,KAAK,EAAE,CAAC;IAE3D,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,IAAI,EAAE,OAAO,CAAC,IAAI;KACnB,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,OAAO,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;QAE3C,aAAa;QACb,MAAM,YAAY,GAAG,GAAG,CAAC,mBAAmB,CAAC,CAAC,KAAK,EAAE,CAAC;QACtD,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QACvC,YAAY,CAAC,OAAO,CAAC,SAAS,KAAK,CAAC,MAAM,UAAU,CAAC,CAAC;QAEtD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,IAAI,kBAAkB,EAAE,CAAC,CAAC;gBACtF,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;oBACrB,MAAM,KAAK,GAAI,IAAI,CAAC,WAAuC,CAAC,UAAU,CAAC;oBACvE,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;wBACvC,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgE,CAAC,EAAE,CAAC;4BAC1G,OAAO,CAAC,GAAG,CACT,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACzH,CAAC;wBACJ,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,iBAAiB;QACjB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;YAC/C,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;gBACtC,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;oBAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACvG,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,mCAAmC;QACrC,CAAC;QAED,eAAe;QACf,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;YAC3C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;gBACpC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;oBACxB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,IAAI,kBAAkB,EAAE,CAAC,CAAC;gBAClF,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,iCAAiC;QACnC,CAAC;QAED,wBAAwB;QACxB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;YACvC,MAAM,SAAS,GAAG,IAAI,YAAY,EAAE,CAAC;YAErC,IAAI,QAAQ,GAAG,IAAI,CAAC;YACpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,MAAM,GAAG,SAAS,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;gBACtD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBACjB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,IAAI,YAAY,CAAC,CAAC;gBACpE,CAAC;qBAAM,CAAC;oBACN,QAAQ,GAAG,KAAK,CAAC;oBACjB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,IAAI,eAAe,CAAC,CAAC;oBACnE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;wBAChC,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;oBACnD,CAAC;gBACH,CAAC;gBACD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;oBACnC,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC;YAED,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QAED,cAAc;QACd,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG;gBACb,KAAK;gBACL,SAAS,EAAE,EAAe;gBAC1B,OAAO,EAAE,EAAe;aACzB,CAAC;YACF,IAAI,CAAC;gBACH,MAAM,CAAC,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;YAClD,CAAC;YAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;YACtB,IAAI,CAAC;gBACH,MAAM,CAAC,OAAO,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;YAC9C,CAAC;YAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;YAEtB,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAiB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;IAC5B,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -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"}
|