@skillkit/mcp 1.15.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/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(process.cwd(), "marketplace", "skills.json"),
221
- join(dirname(fileURLToPath(import.meta.url)), "..", "..", "..", "marketplace", "skills.json"),
222
- join(dirname(fileURLToPath(import.meta.url)), "..", "..", "marketplace", "skills.json")
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.12.0"
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 = process.argv[1] === fileURLToPath(import.meta.url);
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.15.0",
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.15.0"
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",