@filiksyos/mcptoskill 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
File without changes
@@ -0,0 +1,24 @@
1
+ export interface ToolParam {
2
+ name: string;
3
+ type: string;
4
+ description?: string;
5
+ required: boolean;
6
+ }
7
+ export interface Tool {
8
+ name: string;
9
+ description: string;
10
+ params: ToolParam[];
11
+ }
12
+ export interface McpServerInfo {
13
+ name: string;
14
+ version: string;
15
+ instructions?: string;
16
+ }
17
+ export interface McpClientResult {
18
+ serverInfo: McpServerInfo;
19
+ tools: Tool[];
20
+ sessionId: string | null;
21
+ serverUrl: string;
22
+ }
23
+ export declare function connectAndDiscover(serverUrl: string): Promise<McpClientResult>;
24
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,aAAa,CAAC;IAC1B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAgBD,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA6EpF"}
package/dist/client.js ADDED
@@ -0,0 +1,67 @@
1
+ function extractParams(inputSchema) {
2
+ const properties = inputSchema.properties;
3
+ const required = inputSchema.required ?? [];
4
+ if (!properties)
5
+ return [];
6
+ return Object.entries(properties).map(([name, schema]) => ({
7
+ name,
8
+ type: schema.type ?? "string",
9
+ description: schema.description,
10
+ required: required.includes(name),
11
+ }));
12
+ }
13
+ export async function connectAndDiscover(serverUrl) {
14
+ const headers = {
15
+ "Content-Type": "application/json",
16
+ "Accept": "application/json, text/event-stream",
17
+ };
18
+ // Step 1: initialize
19
+ const initRes = await fetch(serverUrl, {
20
+ method: "POST",
21
+ headers,
22
+ body: JSON.stringify({
23
+ jsonrpc: "2.0",
24
+ id: 0,
25
+ method: "initialize",
26
+ params: {
27
+ protocolVersion: "2024-11-05",
28
+ capabilities: {},
29
+ clientInfo: { name: "mcptoskill", version: "0.1.0" },
30
+ },
31
+ }),
32
+ });
33
+ if (!initRes.ok) {
34
+ throw new Error(`initialize failed: ${initRes.status} ${initRes.statusText}`);
35
+ }
36
+ const sessionId = initRes.headers.get("mcp-session-id");
37
+ const initData = await initRes.json();
38
+ const serverInfo = {
39
+ ...initData.result.serverInfo,
40
+ instructions: initData.result.instructions,
41
+ };
42
+ // Step 2: tools/list
43
+ const requestHeaders = sessionId
44
+ ? { ...headers, "Mcp-Session-Id": sessionId }
45
+ : headers;
46
+ const toolsRes = await fetch(serverUrl, {
47
+ method: "POST",
48
+ headers: requestHeaders,
49
+ body: JSON.stringify({
50
+ jsonrpc: "2.0",
51
+ id: 1,
52
+ method: "tools/list",
53
+ params: {},
54
+ }),
55
+ });
56
+ if (!toolsRes.ok) {
57
+ throw new Error(`tools/list failed: ${toolsRes.status} ${toolsRes.statusText}`);
58
+ }
59
+ const toolsData = await toolsRes.json();
60
+ const tools = toolsData.result.tools.map((t) => ({
61
+ name: t.name,
62
+ description: t.description,
63
+ params: extractParams(t.inputSchema),
64
+ }));
65
+ return { serverInfo, tools, sessionId, serverUrl };
66
+ }
67
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { McpClientResult } from "./client.js";
2
+ export interface GeneratedSkill {
3
+ skillName: string;
4
+ skillMd: string;
5
+ shellScript: string;
6
+ }
7
+ export declare function generate(result: McpClientResult, nameOverride?: string): GeneratedSkill;
8
+ //# sourceMappingURL=generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,aAAa,CAAC;AAmIpE,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,eAAe,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,cAAc,CAOvF"}
@@ -0,0 +1,125 @@
1
+ function slugify(name) {
2
+ return name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
3
+ }
4
+ function buildExampleArgs(params) {
5
+ const required = params.filter((p) => p.required);
6
+ if (required.length === 0)
7
+ return "'{}'";
8
+ const example = {};
9
+ for (const p of required) {
10
+ example[p.name] = `<${p.name}>`;
11
+ }
12
+ return `'${JSON.stringify(example)}'`;
13
+ }
14
+ function generateSkillMd(result, skillName) {
15
+ const { serverInfo, tools, serverUrl } = result;
16
+ const triggerPhrases = tools
17
+ .map((t) => t.name.replace(/-/g, " "))
18
+ .join(", ");
19
+ const toolDocs = tools
20
+ .map((t) => {
21
+ const paramLines = t.params.map((p) => {
22
+ const req = p.required ? " (required)" : " (optional)";
23
+ const desc = p.description ? `: ${p.description}` : "";
24
+ return ` - \`${p.name}\` (${p.type})${req}${desc}`;
25
+ });
26
+ const exampleArgs = buildExampleArgs(t.params);
27
+ return [
28
+ `### ${t.name}`,
29
+ "",
30
+ t.description,
31
+ "",
32
+ ...(paramLines.length > 0 ? ["**Parameters:**", ...paramLines, ""] : []),
33
+ "```bash",
34
+ `{baseDir}/scripts/${skillName}.sh ${t.name} ${exampleArgs}`,
35
+ "```",
36
+ ].join("\n");
37
+ })
38
+ .join("\n\n");
39
+ const metadataJson = JSON.stringify({ clawdbot: {} });
40
+ return [
41
+ "---",
42
+ `name: ${skillName}`,
43
+ `description: ${serverInfo.instructions ?? `Use ${serverInfo.name} tools.`} Triggers on: ${triggerPhrases}.`,
44
+ `homepage: ${serverUrl}`,
45
+ `metadata: ${metadataJson}`,
46
+ "---",
47
+ "",
48
+ `# ${serverInfo.name}`,
49
+ "",
50
+ serverInfo.instructions ?? "",
51
+ "",
52
+ "## Quick Start",
53
+ "",
54
+ "```bash",
55
+ `{baseDir}/scripts/${skillName}.sh <tool-name> '<json-args>'`,
56
+ "```",
57
+ "",
58
+ "## Tools",
59
+ "",
60
+ toolDocs,
61
+ ]
62
+ .join("\n")
63
+ .trim() + "\n";
64
+ }
65
+ function generateShellScript(result, skillName) {
66
+ const { serverUrl } = result;
67
+ const initBody = JSON.stringify({
68
+ jsonrpc: "2.0",
69
+ id: 0,
70
+ method: "initialize",
71
+ params: {
72
+ protocolVersion: "2024-11-05",
73
+ capabilities: {},
74
+ clientInfo: { name: "mcptoskill", version: "0.1.0" },
75
+ },
76
+ });
77
+ const lines = [
78
+ "#!/bin/bash",
79
+ `# Generated by mcptoskill — https://mcptoskill.com`,
80
+ `# Server: ${result.serverInfo.name} v${result.serverInfo.version}`,
81
+ `# URL: ${serverUrl}`,
82
+ "set -euo pipefail",
83
+ "",
84
+ `TOOL_NAME="\${1:?Usage: ${skillName}.sh <tool-name> '<json-args>'}"`,
85
+ `ARGS="\${2:-}"`,
86
+ `[ -z "$ARGS" ] && ARGS='{}'`,
87
+ `MCP_URL="${serverUrl}"`,
88
+ "",
89
+ "# Capture session ID from initialize (required for stateful servers; no-op for stateless)",
90
+ "TEMP_HEADERS=$(mktemp)",
91
+ "curl -s -X POST \"$MCP_URL\" \\",
92
+ " -H \"Content-Type: application/json\" \\",
93
+ " -H \"Accept: application/json, text/event-stream\" \\",
94
+ " -D \"$TEMP_HEADERS\" \\",
95
+ ` -d '${initBody}' > /dev/null`,
96
+ "",
97
+ "SESSION_ID=$(grep -i \"^mcp-session-id:\" \"$TEMP_HEADERS\" | awk '{print $2}' | tr -d '\\r' || true)",
98
+ "rm -f \"$TEMP_HEADERS\"",
99
+ "",
100
+ "# Call the tool",
101
+ "if [ -n \"$SESSION_ID\" ]; then",
102
+ " curl -s -X POST \"$MCP_URL\" \\",
103
+ " -H \"Content-Type: application/json\" \\",
104
+ " -H \"Accept: application/json, text/event-stream\" \\",
105
+ " -H \"Mcp-Session-Id: $SESSION_ID\" \\",
106
+ ` -d "{\\"jsonrpc\\":\\"2.0\\",\\"id\\":1,\\"method\\":\\"tools/call\\",\\"params\\":{\\"name\\":\\"$TOOL_NAME\\",\\"arguments\\":$ARGS}}"`,
107
+ "else",
108
+ " curl -s -X POST \"$MCP_URL\" \\",
109
+ " -H \"Content-Type: application/json\" \\",
110
+ " -H \"Accept: application/json, text/event-stream\" \\",
111
+ ` -d "{\\"jsonrpc\\":\\"2.0\\",\\"id\\":1,\\"method\\":\\"tools/call\\",\\"params\\":{\\"name\\":\\"$TOOL_NAME\\",\\"arguments\\":$ARGS}}"`,
112
+ "fi",
113
+ "",
114
+ ];
115
+ return lines.join("\n");
116
+ }
117
+ export function generate(result, nameOverride) {
118
+ const skillName = nameOverride ?? slugify(result.serverInfo.name);
119
+ return {
120
+ skillName,
121
+ skillMd: generateSkillMd(result, skillName),
122
+ shellScript: generateShellScript(result, skillName),
123
+ };
124
+ }
125
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env node
2
+ import { mkdir, writeFile, chmod } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import { connectAndDiscover } from "./client.js";
5
+ import { generate } from "./generator.js";
6
+ function parseArgs(argv) {
7
+ const args = argv.slice(2);
8
+ const url = args.find((a) => !a.startsWith("--"));
9
+ const nameFlag = args.find((a) => a.startsWith("--name="));
10
+ const outFlag = args.find((a) => a.startsWith("--out="));
11
+ if (!url) {
12
+ console.error("Usage: mcptoskill <mcp-server-url> [--name=<skill-name>] [--out=<output-dir>]");
13
+ console.error("");
14
+ console.error("Examples:");
15
+ console.error(" mcptoskill https://mcp.context7.com/mcp");
16
+ console.error(" mcptoskill https://mcp.context7.com/mcp --name=context7 --out=./skills");
17
+ process.exit(1);
18
+ }
19
+ return {
20
+ url,
21
+ name: nameFlag?.split("=")[1],
22
+ outDir: outFlag?.split("=")[1] ?? "./output",
23
+ };
24
+ }
25
+ async function main() {
26
+ const { url, name, outDir } = parseArgs(process.argv);
27
+ console.log(`Connecting to ${url} ...`);
28
+ const result = await connectAndDiscover(url);
29
+ console.log(`Found: ${result.serverInfo.name} v${result.serverInfo.version} — ${result.tools.length} tool(s)`);
30
+ for (const t of result.tools) {
31
+ console.log(` • ${t.name}: ${t.description.slice(0, 80)}${t.description.length > 80 ? "…" : ""}`);
32
+ }
33
+ const { skillName, skillMd, shellScript } = generate(result, name);
34
+ const skillDir = join(outDir, skillName);
35
+ const scriptsDir = join(skillDir, "scripts");
36
+ await mkdir(scriptsDir, { recursive: true });
37
+ const skillMdPath = join(skillDir, "SKILL.md");
38
+ const scriptPath = join(scriptsDir, `${skillName}.sh`);
39
+ await writeFile(skillMdPath, skillMd, "utf8");
40
+ await writeFile(scriptPath, shellScript, "utf8");
41
+ await chmod(scriptPath, 0o755);
42
+ console.log("");
43
+ console.log(`Generated skill: ${skillName}`);
44
+ console.log(` ${skillMdPath}`);
45
+ console.log(` ${scriptPath}`);
46
+ console.log("");
47
+ console.log("Test it:");
48
+ console.log(` ${scriptPath} ${result.tools[0]?.name ?? "tool-name"} '{}'`);
49
+ }
50
+ main().catch((err) => {
51
+ console.error("Error:", err.message);
52
+ process.exit(1);
53
+ });
54
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@filiksyos/mcptoskill",
3
+ "version": "0.1.0",
4
+ "description": "Turn any MCP server into an OpenClaw skill",
5
+ "type": "module",
6
+ "bin": {
7
+ "mcptoskill": "dist/index.js"
8
+ },
9
+ "scripts": {
10
+ "start": "tsx src/index.ts",
11
+ "build": "tsc",
12
+ "prepublishOnly": "pnpm build"
13
+ },
14
+ "files": [
15
+ "dist/",
16
+ "README.md"
17
+ ],
18
+ "engines": {
19
+ "node": ">=18"
20
+ },
21
+ "keywords": [
22
+ "mcp",
23
+ "openclaw",
24
+ "skill",
25
+ "agent",
26
+ "ai",
27
+ "cli"
28
+ ],
29
+ "author": "mcptoskill",
30
+ "license": "MIT",
31
+ "devDependencies": {
32
+ "@types/node": "^25.3.0",
33
+ "tsx": "^4.19.0",
34
+ "typescript": "^5.7.0"
35
+ }
36
+ }