@tenb/skill-forge-mcp 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/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +117 -0
- package/dist/index.js.map +1 -0
- package/package.json +26 -0
package/dist/index.d.ts
ADDED
|
@@ -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,117 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
5
|
+
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
6
|
+
const zod_1 = require("zod");
|
|
7
|
+
const args = process.argv.slice(2);
|
|
8
|
+
function getArg(name) {
|
|
9
|
+
const idx = args.indexOf(`--${name}`);
|
|
10
|
+
return idx >= 0 && idx + 1 < args.length ? args[idx + 1] : undefined;
|
|
11
|
+
}
|
|
12
|
+
const SERVER_URL = getArg('server') || process.env.SKILLFORGE_SERVER_URL || 'https://skillforge.ibea.ai';
|
|
13
|
+
const API_KEY = getArg('key') || process.env.SKILLFORGE_API_KEY || '';
|
|
14
|
+
async function fetchJSON(path) {
|
|
15
|
+
const headers = {};
|
|
16
|
+
if (API_KEY)
|
|
17
|
+
headers['X-SF-Key'] = API_KEY;
|
|
18
|
+
const res = await fetch(`${SERVER_URL}${path}`, { headers });
|
|
19
|
+
if (!res.ok) {
|
|
20
|
+
throw new Error(`API error ${res.status}: ${await res.text()}`);
|
|
21
|
+
}
|
|
22
|
+
return res.json();
|
|
23
|
+
}
|
|
24
|
+
const server = new mcp_js_1.McpServer({
|
|
25
|
+
name: 'skill-forge',
|
|
26
|
+
version: '0.1.0',
|
|
27
|
+
});
|
|
28
|
+
// Tool: search-skills
|
|
29
|
+
server.tool('search-skills', 'Search the skill ecosystem database for similar or competing skills', {
|
|
30
|
+
query: zod_1.z.string().describe('Search query (skill name, description, or keywords)'),
|
|
31
|
+
limit: zod_1.z.number().optional().describe('Max results to return (default: 10)'),
|
|
32
|
+
}, async ({ query, limit }) => {
|
|
33
|
+
try {
|
|
34
|
+
const results = await fetchJSON(`/search?q=${encodeURIComponent(query)}&limit=${limit || 10}`);
|
|
35
|
+
if (!results.length) {
|
|
36
|
+
return {
|
|
37
|
+
content: [{ type: 'text', text: `No skills found for: "${query}"` }],
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
const formatted = results.map((s, i) => `${i + 1}. **${s.name}** (${s.slug})\n ${s.description}\n Platform: ${s.platform} | Installs: ${s.installs} | Tags: ${(s.tags || []).join(', ')}`);
|
|
41
|
+
return {
|
|
42
|
+
content: [
|
|
43
|
+
{
|
|
44
|
+
type: 'text',
|
|
45
|
+
text: `Found ${results.length} skills for "${query}":\n\n${formatted.join('\n\n')}`,
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
return {
|
|
52
|
+
content: [{ type: 'text', text: `Error searching skills: ${e.message}` }],
|
|
53
|
+
isError: true,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
// Tool: get-benchmarks
|
|
58
|
+
server.tool('get-benchmarks', 'Get benchmark data for a skill category (avg installs, top keywords, description patterns)', {
|
|
59
|
+
category: zod_1.z.string().describe('Skill category or tag to benchmark against'),
|
|
60
|
+
}, async ({ category }) => {
|
|
61
|
+
try {
|
|
62
|
+
const data = await fetchJSON(`/skills/benchmarks?category=${encodeURIComponent(category)}`);
|
|
63
|
+
if (!data.totalSkills) {
|
|
64
|
+
return {
|
|
65
|
+
content: [
|
|
66
|
+
{ type: 'text', text: `No skills found in category: "${category}"` },
|
|
67
|
+
],
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const text = [
|
|
71
|
+
`## Benchmarks for "${category}"`,
|
|
72
|
+
`- **Total skills**: ${data.totalSkills}`,
|
|
73
|
+
`- **Avg installs**: ${data.avgInstalls}`,
|
|
74
|
+
`- **Median installs**: ${data.medianInstalls}`,
|
|
75
|
+
`- **Avg description length**: ${data.avgDescriptionLength} chars`,
|
|
76
|
+
`- **Top keywords/tags**: ${(data.topKeywords || []).join(', ') || 'none'}`,
|
|
77
|
+
``,
|
|
78
|
+
`### Top 5 by installs:`,
|
|
79
|
+
...(data.top5 || []).map((s, i) => `${i + 1}. ${s.name} (${s.slug}) — ${s.installs} installs`),
|
|
80
|
+
].join('\n');
|
|
81
|
+
return { content: [{ type: 'text', text }] };
|
|
82
|
+
}
|
|
83
|
+
catch (e) {
|
|
84
|
+
return {
|
|
85
|
+
content: [{ type: 'text', text: `Error fetching benchmarks: ${e.message}` }],
|
|
86
|
+
isError: true,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
// Tool: get-analytics
|
|
91
|
+
server.tool('get-analytics', 'Get usage analytics (call count, success rate, errors) for a deployed skill', {
|
|
92
|
+
skillSlug: zod_1.z.string().describe('The skill slug to get analytics for'),
|
|
93
|
+
}, async ({ skillSlug }) => {
|
|
94
|
+
try {
|
|
95
|
+
const metrics = await fetchJSON(`/telemetry/${skillSlug}`);
|
|
96
|
+
const text = [
|
|
97
|
+
`## Analytics for "${skillSlug}"`,
|
|
98
|
+
`- **Total calls**: ${metrics.totalCalls ?? 0}`,
|
|
99
|
+
`- **Success rate**: ${metrics.successRate != null ? (metrics.successRate * 100).toFixed(1) + '%' : 'N/A'}`,
|
|
100
|
+
`- **Avg duration**: ${metrics.avgDuration != null ? metrics.avgDuration + 'ms' : 'N/A'}`,
|
|
101
|
+
].join('\n');
|
|
102
|
+
return { content: [{ type: 'text', text }] };
|
|
103
|
+
}
|
|
104
|
+
catch (e) {
|
|
105
|
+
return {
|
|
106
|
+
content: [{ type: 'text', text: `Error fetching analytics: ${e.message}` }],
|
|
107
|
+
isError: true,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
async function main() {
|
|
112
|
+
const transport = new stdio_js_1.StdioServerTransport();
|
|
113
|
+
await server.connect(transport);
|
|
114
|
+
console.error('SkillForge MCP Server running on stdio');
|
|
115
|
+
}
|
|
116
|
+
main().catch(console.error);
|
|
117
|
+
//# 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,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tenb/skill-forge-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "SkillForge MCP Server - ecosystem data tools for AI skill development",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"skill-forge-mcp": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsc --noCheck",
|
|
14
|
+
"start": "ts-node src/index.ts",
|
|
15
|
+
"dev": "ts-node --watch src/index.ts"
|
|
16
|
+
},
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"@modelcontextprotocol/sdk": "^1.22.0",
|
|
19
|
+
"zod": "^3.24.4"
|
|
20
|
+
},
|
|
21
|
+
"devDependencies": {
|
|
22
|
+
"@types/node": "^22.0.0",
|
|
23
|
+
"ts-node": "^10.9.0",
|
|
24
|
+
"typescript": "^5.7.0"
|
|
25
|
+
}
|
|
26
|
+
}
|