@skillkit/mcp 1.16.0 → 1.17.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/data/skills.json +125605 -0
- package/dist/index.js +14 -5
- package/dist/index.js.map +1 -1
- package/package.json +5 -3
package/dist/index.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
5
5
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
6
6
|
import { fileURLToPath } from "url";
|
|
7
|
+
import { realpathSync } from "fs";
|
|
7
8
|
import {
|
|
8
9
|
CallToolRequestSchema,
|
|
9
10
|
ListToolsRequestSchema,
|
|
@@ -216,10 +217,12 @@ var skills = [];
|
|
|
216
217
|
async function loadSkills() {
|
|
217
218
|
const { readFileSync } = await import("fs");
|
|
218
219
|
const { join, dirname } = await import("path");
|
|
220
|
+
const pkgDir = dirname(fileURLToPath(import.meta.url));
|
|
219
221
|
const possiblePaths = [
|
|
220
|
-
join(
|
|
221
|
-
join(
|
|
222
|
-
join(
|
|
222
|
+
join(pkgDir, "..", "data", "skills.json"),
|
|
223
|
+
join(pkgDir, "..", "..", "..", "marketplace", "skills.json"),
|
|
224
|
+
join(pkgDir, "..", "..", "marketplace", "skills.json"),
|
|
225
|
+
join(process.cwd(), "marketplace", "skills.json")
|
|
223
226
|
];
|
|
224
227
|
for (const path of possiblePaths) {
|
|
225
228
|
try {
|
|
@@ -243,7 +246,7 @@ async function loadSkills() {
|
|
|
243
246
|
var server = new Server(
|
|
244
247
|
{
|
|
245
248
|
name: "skillkit-discovery",
|
|
246
|
-
version: "1.
|
|
249
|
+
version: "1.17.0"
|
|
247
250
|
},
|
|
248
251
|
{
|
|
249
252
|
capabilities: {
|
|
@@ -392,7 +395,13 @@ async function main() {
|
|
|
392
395
|
await server.connect(transport);
|
|
393
396
|
console.error("SkillKit Discovery MCP Server running on stdio");
|
|
394
397
|
}
|
|
395
|
-
var isMain =
|
|
398
|
+
var isMain = false;
|
|
399
|
+
try {
|
|
400
|
+
const resolvedArgv = process.argv[1] ? realpathSync(process.argv[1]) : "";
|
|
401
|
+
const resolvedModule = realpathSync(fileURLToPath(import.meta.url));
|
|
402
|
+
isMain = resolvedArgv === resolvedModule;
|
|
403
|
+
} catch {
|
|
404
|
+
}
|
|
396
405
|
if (isMain) {
|
|
397
406
|
main().catch((error) => {
|
|
398
407
|
console.error("Fatal error:", error);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/tools.ts","../src/types.ts","../src/resources.ts"],"sourcesContent":["import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { fileURLToPath } from 'node:url';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport {\n handleSearchSkills,\n handleGetSkill,\n handleRecommendSkills,\n handleListCategories,\n} from './tools.js';\nimport type { SkillEntry } from './tools.js';\nimport { getTrendingResource, getCategoriesResource } from './resources.js';\n\nlet skills: SkillEntry[] = [];\n\nasync function loadSkills(): Promise<SkillEntry[]> {\n const { readFileSync } = await import('node:fs');\n const { join, dirname } = await import('node:path');\n\n const possiblePaths = [\n join(process.cwd(), 'marketplace', 'skills.json'),\n join(dirname(fileURLToPath(import.meta.url)), '..', '..', '..', 'marketplace', 'skills.json'),\n join(dirname(fileURLToPath(import.meta.url)), '..', '..', 'marketplace', 'skills.json'),\n ];\n\n for (const path of possiblePaths) {\n try {\n const data = JSON.parse(readFileSync(path, 'utf-8'));\n if (data.skills && Array.isArray(data.skills)) {\n return data.skills.map((s: Record<string, unknown>) => ({\n name: s.name as string,\n description: s.description as string | undefined,\n source: (s.source as string) || '',\n repo: s.repo as string | undefined,\n tags: s.tags as string[] | undefined,\n category: s.category as string | undefined,\n }));\n }\n } catch {\n continue;\n }\n }\n\n return [];\n}\n\nconst server = new Server(\n {\n name: 'skillkit-discovery',\n version: '1.12.0',\n },\n {\n capabilities: {\n tools: {},\n resources: {},\n },\n },\n);\n\nserver.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: [\n {\n name: 'search_skills',\n description: 'Search for AI agent skills by keyword, tag, or description. Returns ranked results from the SkillKit marketplace.',\n inputSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Search query' },\n limit: { type: 'number', minimum: 1, maximum: 50, default: 10, description: 'Max results' },\n include_content: { type: 'boolean', default: false, description: 'Include full content' },\n include_references: { type: 'boolean', default: false, description: 'Include references' },\n filters: {\n type: 'object',\n properties: {\n tags: { type: 'array', items: { type: 'string' }, description: 'Filter by tags' },\n category: { type: 'string', description: 'Filter by category' },\n source: { type: 'string', description: 'Filter by source repo' },\n },\n },\n },\n required: ['query'],\n },\n },\n {\n name: 'get_skill',\n description: 'Get details of a specific skill by source and ID.',\n inputSchema: {\n type: 'object',\n properties: {\n source: { type: 'string', description: 'Skill source (e.g. owner/repo)' },\n skill_id: { type: 'string', description: 'Skill name' },\n include_references: { type: 'boolean', default: false, description: 'Include references' },\n },\n required: ['source', 'skill_id'],\n },\n },\n {\n name: 'recommend_skills',\n description: 'Get skill recommendations based on your tech stack and current task.',\n inputSchema: {\n type: 'object',\n properties: {\n languages: { type: 'array', items: { type: 'string' }, description: 'Programming languages' },\n frameworks: { type: 'array', items: { type: 'string' }, description: 'Frameworks' },\n libraries: { type: 'array', items: { type: 'string' }, description: 'Libraries' },\n task: { type: 'string', description: 'Current task description' },\n limit: { type: 'number', minimum: 1, maximum: 20, default: 5, description: 'Max results' },\n },\n },\n },\n {\n name: 'list_categories',\n description: 'List all skill categories with their counts.',\n inputSchema: {\n type: 'object',\n properties: {},\n },\n },\n ],\n };\n});\n\nserver.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n try {\n switch (name) {\n case 'search_skills':\n return handleSearchSkills(skills, args);\n case 'get_skill':\n return handleGetSkill(skills, args);\n case 'recommend_skills':\n return handleRecommendSkills(skills, args);\n case 'list_categories':\n return handleListCategories(skills);\n default:\n return {\n content: [{ type: 'text', text: `Unknown tool: ${name}` }],\n isError: true,\n };\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return {\n content: [{ type: 'text', text: `Error: ${message}` }],\n isError: true,\n };\n }\n});\n\nserver.setRequestHandler(ListResourcesRequestSchema, async () => {\n return {\n resources: [\n {\n uri: 'skills://trending',\n name: 'Trending Skills',\n description: 'Top trending skills by relevance score',\n mimeType: 'application/json',\n },\n {\n uri: 'skills://categories',\n name: 'Skill Categories',\n description: 'All skill categories with counts',\n mimeType: 'application/json',\n },\n ],\n };\n});\n\nserver.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const { uri } = request.params;\n\n if (uri === 'skills://trending') {\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: getTrendingResource(skills),\n },\n ],\n };\n }\n\n if (uri === 'skills://categories') {\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: getCategoriesResource(skills),\n },\n ],\n };\n }\n\n throw new Error(`Unknown resource: ${uri}`);\n});\n\nasync function main() {\n skills = await loadSkills();\n console.error(`SkillKit Discovery MCP Server starting (${skills.length} skills loaded)`);\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error('SkillKit Discovery MCP Server running on stdio');\n}\n\nconst isMain = process.argv[1] === fileURLToPath(import.meta.url);\nif (isMain) {\n main().catch((error) => {\n console.error('Fatal error:', error);\n process.exit(1);\n });\n}\n\nexport { server };\n","import { RelevanceRanker } from '@skillkit/core';\nimport {\n SearchSkillsInputSchema,\n GetSkillInputSchema,\n RecommendSkillsInputSchema,\n} from './types.js';\n\nexport interface SkillEntry {\n name: string;\n description?: string;\n source: string;\n repo?: string;\n tags?: string[];\n category?: string;\n content?: string;\n}\n\nconst ranker = new RelevanceRanker();\n\nexport function handleSearchSkills(skills: SkillEntry[], args: unknown) {\n const input = SearchSkillsInputSchema.parse(args);\n let filtered = skills;\n\n if (input.filters) {\n if (input.filters.tags?.length) {\n filtered = filtered.filter((s) =>\n input.filters!.tags!.some((t) => s.tags?.includes(t)),\n );\n }\n if (input.filters.category) {\n filtered = filtered.filter((s) => s.category === input.filters!.category);\n }\n if (input.filters.source) {\n filtered = filtered.filter((s) => s.source.includes(input.filters!.source!));\n }\n }\n\n const skillMap = new Map(filtered.map((s) => [`${s.source}:${s.name}`, s]));\n\n const ranked = ranker.rank(\n filtered.map((s) => ({\n name: s.name,\n description: s.description,\n content: s.content,\n source: s.source,\n })),\n input.query,\n );\n\n const results = ranked.slice(0, input.limit).map((r) => {\n const key = `${(r.skill as Record<string, unknown>).source}:${r.skill.name}`;\n const original = skillMap.get(key) ?? filtered.find((s) => s.name === r.skill.name)!;\n const result: Record<string, unknown> = {\n name: original.name,\n description: original.description,\n source: original.source,\n tags: original.tags,\n score: r.score,\n };\n if (input.include_content) result.content = original.content;\n return result;\n });\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({ skills: results, total: ranked.length, query: input.query }, null, 2),\n },\n ],\n };\n}\n\nexport function handleGetSkill(skills: SkillEntry[], args: unknown) {\n const input = GetSkillInputSchema.parse(args);\n\n const skill = skills.find(\n (s) => s.source === input.source && s.name === input.skill_id,\n );\n\n if (!skill) {\n return {\n content: [{ type: 'text' as const, text: `Skill not found: ${input.source}/${input.skill_id}` }],\n isError: true,\n };\n }\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(skill, null, 2),\n },\n ],\n };\n}\n\nexport function handleRecommendSkills(skills: SkillEntry[], args: unknown) {\n const input = RecommendSkillsInputSchema.parse(args);\n const queryParts: string[] = [];\n\n if (input.languages?.length) queryParts.push(...input.languages);\n if (input.frameworks?.length) queryParts.push(...input.frameworks);\n if (input.libraries?.length) queryParts.push(...input.libraries);\n if (input.task) queryParts.push(input.task);\n\n const query = queryParts.join(' ');\n if (!query) {\n return {\n content: [{ type: 'text' as const, text: 'Provide at least one of: languages, frameworks, libraries, or task' }],\n isError: true,\n };\n }\n\n const ranked = ranker.rank(\n skills.map((s) => ({\n name: s.name,\n description: s.description,\n content: s.content,\n })),\n query,\n );\n\n const recommendMap = new Map(skills.map((s) => [s.name, s]));\n const results = ranked.slice(0, input.limit).map((r) => {\n const original = recommendMap.get(r.skill.name)!;\n return {\n name: original.name,\n description: original.description,\n source: original.source,\n tags: original.tags,\n score: r.score,\n };\n });\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({ recommendations: results, query }, null, 2),\n },\n ],\n };\n}\n\nexport function handleListCategories(skills: SkillEntry[]) {\n const tagCounts = new Map<string, number>();\n\n for (const skill of skills) {\n if (skill.tags) {\n for (const tag of skill.tags) {\n tagCounts.set(tag, (tagCounts.get(tag) || 0) + 1);\n }\n }\n }\n\n const categories = Array.from(tagCounts.entries())\n .map(([name, count]) => ({ name, count }))\n .sort((a, b) => b.count - a.count);\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({ categories, total: categories.length }, null, 2),\n },\n ],\n };\n}\n","import { z } from 'zod';\n\nexport const SearchSkillsInputSchema = z.object({\n query: z.string().describe('Search query for skills'),\n limit: z.number().min(1).max(50).default(10).describe('Maximum results'),\n include_content: z.boolean().default(false).describe('Include full skill content'),\n include_references: z.boolean().default(false).describe('Include reference file paths'),\n filters: z\n .object({\n tags: z.array(z.string()).optional(),\n category: z.string().optional(),\n source: z.string().optional(),\n })\n .optional()\n .describe('Optional filters'),\n});\n\nexport const GetSkillInputSchema = z.object({\n source: z.string().describe('Skill source (e.g. owner/repo)'),\n skill_id: z.string().describe('Skill name/identifier'),\n include_references: z.boolean().default(false).describe('Include reference file paths'),\n});\n\nexport const RecommendSkillsInputSchema = z.object({\n languages: z.array(z.string()).optional().describe('Programming languages'),\n frameworks: z.array(z.string()).optional().describe('Frameworks in use'),\n libraries: z.array(z.string()).optional().describe('Libraries in use'),\n task: z.string().optional().describe('Current task description'),\n limit: z.number().min(1).max(20).default(5).describe('Maximum results'),\n});\n\nexport const ListCategoriesInputSchema = z.object({});\n\nexport type SearchSkillsInput = z.infer<typeof SearchSkillsInputSchema>;\nexport type GetSkillInput = z.infer<typeof GetSkillInputSchema>;\nexport type RecommendSkillsInput = z.infer<typeof RecommendSkillsInputSchema>;\n","import { RelevanceRanker } from '@skillkit/core';\nimport type { SkillEntry } from './tools.js';\n\nconst ranker = new RelevanceRanker();\n\nexport function getTrendingResource(skills: SkillEntry[]) {\n const skillMap = new Map(skills.map((s) => [s.name, s]));\n\n const ranked = ranker.rank(\n skills.map((s) => ({\n name: s.name,\n description: s.description,\n content: s.content,\n })),\n );\n\n const trending = ranked.slice(0, 20).map((r) => {\n const original = skillMap.get(r.skill.name);\n if (!original) return null;\n return {\n name: original.name,\n description: original.description,\n source: original.source,\n tags: original.tags,\n score: r.score,\n };\n }).filter(Boolean);\n\n return JSON.stringify({ trending, count: trending.length }, null, 2);\n}\n\nexport function getCategoriesResource(skills: SkillEntry[]) {\n const tagCounts = new Map<string, number>();\n\n for (const skill of skills) {\n if (skill.tags) {\n for (const tag of skill.tags) {\n tagCounts.set(tag, (tagCounts.get(tag) || 0) + 1);\n }\n }\n }\n\n const categories = Array.from(tagCounts.entries())\n .map(([name, count]) => ({ name, count }))\n .sort((a, b) => b.count - a.count);\n\n return JSON.stringify({ categories, total: categories.length }, null, 2);\n}\n"],"mappings":"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","names":["skills","RelevanceRanker","ranker","skills"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/tools.ts","../src/types.ts","../src/resources.ts"],"sourcesContent":["import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { fileURLToPath } from 'node:url';\nimport { realpathSync } from 'node:fs';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport {\n handleSearchSkills,\n handleGetSkill,\n handleRecommendSkills,\n handleListCategories,\n} from './tools.js';\nimport type { SkillEntry } from './tools.js';\nimport { getTrendingResource, getCategoriesResource } from './resources.js';\n\nlet skills: SkillEntry[] = [];\n\nasync function loadSkills(): Promise<SkillEntry[]> {\n const { readFileSync } = await import('node:fs');\n const { join, dirname } = await import('node:path');\n\n const pkgDir = dirname(fileURLToPath(import.meta.url));\n const possiblePaths = [\n join(pkgDir, '..', 'data', 'skills.json'),\n join(pkgDir, '..', '..', '..', 'marketplace', 'skills.json'),\n join(pkgDir, '..', '..', 'marketplace', 'skills.json'),\n join(process.cwd(), 'marketplace', 'skills.json'),\n ];\n\n for (const path of possiblePaths) {\n try {\n const data = JSON.parse(readFileSync(path, 'utf-8'));\n if (data.skills && Array.isArray(data.skills)) {\n return data.skills.map((s: Record<string, unknown>) => ({\n name: s.name as string,\n description: s.description as string | undefined,\n source: (s.source as string) || '',\n repo: s.repo as string | undefined,\n tags: s.tags as string[] | undefined,\n category: s.category as string | undefined,\n }));\n }\n } catch {\n continue;\n }\n }\n\n return [];\n}\n\nconst server = new Server(\n {\n name: 'skillkit-discovery',\n version: '1.17.0',\n },\n {\n capabilities: {\n tools: {},\n resources: {},\n },\n },\n);\n\nserver.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: [\n {\n name: 'search_skills',\n description: 'Search for AI agent skills by keyword, tag, or description. Returns ranked results from the SkillKit marketplace.',\n inputSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Search query' },\n limit: { type: 'number', minimum: 1, maximum: 50, default: 10, description: 'Max results' },\n include_content: { type: 'boolean', default: false, description: 'Include full content' },\n include_references: { type: 'boolean', default: false, description: 'Include references' },\n filters: {\n type: 'object',\n properties: {\n tags: { type: 'array', items: { type: 'string' }, description: 'Filter by tags' },\n category: { type: 'string', description: 'Filter by category' },\n source: { type: 'string', description: 'Filter by source repo' },\n },\n },\n },\n required: ['query'],\n },\n },\n {\n name: 'get_skill',\n description: 'Get details of a specific skill by source and ID.',\n inputSchema: {\n type: 'object',\n properties: {\n source: { type: 'string', description: 'Skill source (e.g. owner/repo)' },\n skill_id: { type: 'string', description: 'Skill name' },\n include_references: { type: 'boolean', default: false, description: 'Include references' },\n },\n required: ['source', 'skill_id'],\n },\n },\n {\n name: 'recommend_skills',\n description: 'Get skill recommendations based on your tech stack and current task.',\n inputSchema: {\n type: 'object',\n properties: {\n languages: { type: 'array', items: { type: 'string' }, description: 'Programming languages' },\n frameworks: { type: 'array', items: { type: 'string' }, description: 'Frameworks' },\n libraries: { type: 'array', items: { type: 'string' }, description: 'Libraries' },\n task: { type: 'string', description: 'Current task description' },\n limit: { type: 'number', minimum: 1, maximum: 20, default: 5, description: 'Max results' },\n },\n },\n },\n {\n name: 'list_categories',\n description: 'List all skill categories with their counts.',\n inputSchema: {\n type: 'object',\n properties: {},\n },\n },\n ],\n };\n});\n\nserver.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n try {\n switch (name) {\n case 'search_skills':\n return handleSearchSkills(skills, args);\n case 'get_skill':\n return handleGetSkill(skills, args);\n case 'recommend_skills':\n return handleRecommendSkills(skills, args);\n case 'list_categories':\n return handleListCategories(skills);\n default:\n return {\n content: [{ type: 'text', text: `Unknown tool: ${name}` }],\n isError: true,\n };\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return {\n content: [{ type: 'text', text: `Error: ${message}` }],\n isError: true,\n };\n }\n});\n\nserver.setRequestHandler(ListResourcesRequestSchema, async () => {\n return {\n resources: [\n {\n uri: 'skills://trending',\n name: 'Trending Skills',\n description: 'Top trending skills by relevance score',\n mimeType: 'application/json',\n },\n {\n uri: 'skills://categories',\n name: 'Skill Categories',\n description: 'All skill categories with counts',\n mimeType: 'application/json',\n },\n ],\n };\n});\n\nserver.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const { uri } = request.params;\n\n if (uri === 'skills://trending') {\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: getTrendingResource(skills),\n },\n ],\n };\n }\n\n if (uri === 'skills://categories') {\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: getCategoriesResource(skills),\n },\n ],\n };\n }\n\n throw new Error(`Unknown resource: ${uri}`);\n});\n\nasync function main() {\n skills = await loadSkills();\n console.error(`SkillKit Discovery MCP Server starting (${skills.length} skills loaded)`);\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error('SkillKit Discovery MCP Server running on stdio');\n}\n\nlet isMain = false;\ntry {\n const resolvedArgv = process.argv[1] ? realpathSync(process.argv[1]) : '';\n const resolvedModule = realpathSync(fileURLToPath(import.meta.url));\n isMain = resolvedArgv === resolvedModule;\n} catch {}\nif (isMain) {\n main().catch((error) => {\n console.error('Fatal error:', error);\n process.exit(1);\n });\n}\n\nexport { server };\n","import { RelevanceRanker } from '@skillkit/core';\nimport {\n SearchSkillsInputSchema,\n GetSkillInputSchema,\n RecommendSkillsInputSchema,\n} from './types.js';\n\nexport interface SkillEntry {\n name: string;\n description?: string;\n source: string;\n repo?: string;\n tags?: string[];\n category?: string;\n content?: string;\n}\n\nconst ranker = new RelevanceRanker();\n\nexport function handleSearchSkills(skills: SkillEntry[], args: unknown) {\n const input = SearchSkillsInputSchema.parse(args);\n let filtered = skills;\n\n if (input.filters) {\n if (input.filters.tags?.length) {\n filtered = filtered.filter((s) =>\n input.filters!.tags!.some((t) => s.tags?.includes(t)),\n );\n }\n if (input.filters.category) {\n filtered = filtered.filter((s) => s.category === input.filters!.category);\n }\n if (input.filters.source) {\n filtered = filtered.filter((s) => s.source.includes(input.filters!.source!));\n }\n }\n\n const skillMap = new Map(filtered.map((s) => [`${s.source}:${s.name}`, s]));\n\n const ranked = ranker.rank(\n filtered.map((s) => ({\n name: s.name,\n description: s.description,\n content: s.content,\n source: s.source,\n })),\n input.query,\n );\n\n const results = ranked.slice(0, input.limit).map((r) => {\n const key = `${(r.skill as Record<string, unknown>).source}:${r.skill.name}`;\n const original = skillMap.get(key) ?? filtered.find((s) => s.name === r.skill.name)!;\n const result: Record<string, unknown> = {\n name: original.name,\n description: original.description,\n source: original.source,\n tags: original.tags,\n score: r.score,\n };\n if (input.include_content) result.content = original.content;\n return result;\n });\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({ skills: results, total: ranked.length, query: input.query }, null, 2),\n },\n ],\n };\n}\n\nexport function handleGetSkill(skills: SkillEntry[], args: unknown) {\n const input = GetSkillInputSchema.parse(args);\n\n const skill = skills.find(\n (s) => s.source === input.source && s.name === input.skill_id,\n );\n\n if (!skill) {\n return {\n content: [{ type: 'text' as const, text: `Skill not found: ${input.source}/${input.skill_id}` }],\n isError: true,\n };\n }\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(skill, null, 2),\n },\n ],\n };\n}\n\nexport function handleRecommendSkills(skills: SkillEntry[], args: unknown) {\n const input = RecommendSkillsInputSchema.parse(args);\n const queryParts: string[] = [];\n\n if (input.languages?.length) queryParts.push(...input.languages);\n if (input.frameworks?.length) queryParts.push(...input.frameworks);\n if (input.libraries?.length) queryParts.push(...input.libraries);\n if (input.task) queryParts.push(input.task);\n\n const query = queryParts.join(' ');\n if (!query) {\n return {\n content: [{ type: 'text' as const, text: 'Provide at least one of: languages, frameworks, libraries, or task' }],\n isError: true,\n };\n }\n\n const ranked = ranker.rank(\n skills.map((s) => ({\n name: s.name,\n description: s.description,\n content: s.content,\n })),\n query,\n );\n\n const recommendMap = new Map(skills.map((s) => [s.name, s]));\n const results = ranked.slice(0, input.limit).map((r) => {\n const original = recommendMap.get(r.skill.name)!;\n return {\n name: original.name,\n description: original.description,\n source: original.source,\n tags: original.tags,\n score: r.score,\n };\n });\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({ recommendations: results, query }, null, 2),\n },\n ],\n };\n}\n\nexport function handleListCategories(skills: SkillEntry[]) {\n const tagCounts = new Map<string, number>();\n\n for (const skill of skills) {\n if (skill.tags) {\n for (const tag of skill.tags) {\n tagCounts.set(tag, (tagCounts.get(tag) || 0) + 1);\n }\n }\n }\n\n const categories = Array.from(tagCounts.entries())\n .map(([name, count]) => ({ name, count }))\n .sort((a, b) => b.count - a.count);\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({ categories, total: categories.length }, null, 2),\n },\n ],\n };\n}\n","import { z } from 'zod';\n\nexport const SearchSkillsInputSchema = z.object({\n query: z.string().describe('Search query for skills'),\n limit: z.number().min(1).max(50).default(10).describe('Maximum results'),\n include_content: z.boolean().default(false).describe('Include full skill content'),\n include_references: z.boolean().default(false).describe('Include reference file paths'),\n filters: z\n .object({\n tags: z.array(z.string()).optional(),\n category: z.string().optional(),\n source: z.string().optional(),\n })\n .optional()\n .describe('Optional filters'),\n});\n\nexport const GetSkillInputSchema = z.object({\n source: z.string().describe('Skill source (e.g. owner/repo)'),\n skill_id: z.string().describe('Skill name/identifier'),\n include_references: z.boolean().default(false).describe('Include reference file paths'),\n});\n\nexport const RecommendSkillsInputSchema = z.object({\n languages: z.array(z.string()).optional().describe('Programming languages'),\n frameworks: z.array(z.string()).optional().describe('Frameworks in use'),\n libraries: z.array(z.string()).optional().describe('Libraries in use'),\n task: z.string().optional().describe('Current task description'),\n limit: z.number().min(1).max(20).default(5).describe('Maximum results'),\n});\n\nexport const ListCategoriesInputSchema = z.object({});\n\nexport type SearchSkillsInput = z.infer<typeof SearchSkillsInputSchema>;\nexport type GetSkillInput = z.infer<typeof GetSkillInputSchema>;\nexport type RecommendSkillsInput = z.infer<typeof RecommendSkillsInputSchema>;\n","import { RelevanceRanker } from '@skillkit/core';\nimport type { SkillEntry } from './tools.js';\n\nconst ranker = new RelevanceRanker();\n\nexport function getTrendingResource(skills: SkillEntry[]) {\n const skillMap = new Map(skills.map((s) => [s.name, s]));\n\n const ranked = ranker.rank(\n skills.map((s) => ({\n name: s.name,\n description: s.description,\n content: s.content,\n })),\n );\n\n const trending = ranked.slice(0, 20).map((r) => {\n const original = skillMap.get(r.skill.name);\n if (!original) return null;\n return {\n name: original.name,\n description: original.description,\n source: original.source,\n tags: original.tags,\n score: r.score,\n };\n }).filter(Boolean);\n\n return JSON.stringify({ trending, count: trending.length }, null, 2);\n}\n\nexport function getCategoriesResource(skills: SkillEntry[]) {\n const tagCounts = new Map<string, number>();\n\n for (const skill of skills) {\n if (skill.tags) {\n for (const tag of skill.tags) {\n tagCounts.set(tag, (tagCounts.get(tag) || 0) + 1);\n }\n }\n }\n\n const categories = Array.from(tagCounts.entries())\n .map(([name, count]) => ({ name, count }))\n .sort((a, b) => b.count - a.count);\n\n return JSON.stringify({ categories, total: categories.length }, null, 2);\n}\n"],"mappings":"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","names":["skills","RelevanceRanker","ranker","skills"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@skillkit/mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.17.0",
|
|
4
4
|
"description": "MCP server for SkillKit skill discovery — agent-native skill search",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -15,12 +15,13 @@
|
|
|
15
15
|
}
|
|
16
16
|
},
|
|
17
17
|
"files": [
|
|
18
|
-
"dist"
|
|
18
|
+
"dist",
|
|
19
|
+
"data"
|
|
19
20
|
],
|
|
20
21
|
"dependencies": {
|
|
21
22
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
22
23
|
"zod": "^3.24.0",
|
|
23
|
-
"@skillkit/core": "1.
|
|
24
|
+
"@skillkit/core": "1.17.0"
|
|
24
25
|
},
|
|
25
26
|
"devDependencies": {
|
|
26
27
|
"@types/node": "^22.10.5",
|
|
@@ -43,6 +44,7 @@
|
|
|
43
44
|
"claude"
|
|
44
45
|
],
|
|
45
46
|
"scripts": {
|
|
47
|
+
"prebuild": "mkdir -p data && cp ../../marketplace/skills.json data/skills.json",
|
|
46
48
|
"build": "tsup",
|
|
47
49
|
"dev": "tsup --watch",
|
|
48
50
|
"typecheck": "tsc --noEmit",
|