skillmesh-mcp 1.0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/agent-paths.ts","../src/tools/detect-agents.ts","../src/lib/config.ts","../src/tools/create-folder.ts","../src/lib/tavily.ts","../src/lib/github.ts","../src/tools/search-skills.ts","../src/lib/skill-parser.ts","../src/tools/fetch-skill.ts","../src/lib/skill-sanitizer.ts","../src/lib/llm.ts","../src/tools/generate-skill.ts","../src/tools/install-skill.ts","../src/tools/list-skills.ts","../src/tools/delete-skill.ts","../src/prompts/system-prompt.ts","../src/index.ts"],"names":["basePath","os","existsSync","fs","path2","path3","skill","ensureDirSync","z","os3","path4","owner","repo","path5","os4","path6","os5","path7"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Agent skill directory paths\n * Maps agent names to their project and global skill directory paths\n */\n\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport fs from 'fs-extra';\nconst { existsSync } = fs;\n\nexport interface AgentPathConfig {\n projectPath: string;\n globalPath: string;\n}\n\n/**\n * Complete agent paths mapping based on BLUEPRINT.md Agent Skill Directory Paths table.\n * Maps agent identifiers to their project-scope and global-scope skill directory paths.\n */\nexport const AGENT_PATHS: Record<string, AgentPathConfig> = {\n 'claude-code': {\n projectPath: '.claude/skills',\n globalPath: '~/.claude/skills',\n },\n 'antigravity': {\n projectPath: '.agent/skills',\n globalPath: '~/.gemini/antigravity/global_skills',\n },\n 'cursor': {\n projectPath: '.cursor/skills',\n globalPath: '~/.cursor/skills',\n },\n 'windsurf': {\n projectPath: '.windsurf/skills',\n globalPath: '~/.codeium/windsurf/skills',\n },\n 'gemini-cli': {\n projectPath: '.gemini/skills',\n globalPath: '~/.gemini/skills',\n },\n 'codex-cli': {\n projectPath: '.codex/skills',\n globalPath: '~/.codex/skills',\n },\n 'kilocode': {\n projectPath: '.kilocode/skills',\n globalPath: '~/.kilocode/skills',\n },\n 'trae': {\n projectPath: '.trae/skills',\n globalPath: '~/.trae/skills',\n },\n 'void': {\n projectPath: '.void/skills',\n globalPath: '~/.void/skills',\n },\n 'continue': {\n projectPath: '.continue/skills',\n globalPath: '~/.continue/skills',\n },\n 'cline': {\n projectPath: '.cline/skills',\n globalPath: '~/.cline/skills',\n },\n};\n\n/**\n * Resolves the full path to a skill's SKILL.md file for a given agent.\n * Handles both project-scope and global-scope paths, with tilde expansion for home directory.\n *\n * @param agentId - The agent identifier (e.g., \"claude-code\", \"cursor\")\n * @param projectPath - The absolute path to the project root\n * @param skillName - The sanitized skill name (e.g., \"nextjs-patterns\")\n * @param global - If true, use global path; if false (default), use project path\n * @returns Absolute path to the skill's SKILL.md file\n * @throws Never throws - returns path even if agent is unknown (uses agentId as fallback)\n *\n * @example\n * getSkillPath(\"claude-code\", \"/Users/dev/myproject\", \"nextjs-patterns\", false)\n * // Returns: \"/Users/dev/myproject/.claude/skills/nextjs-patterns/SKILL.md\"\n *\n * getSkillPath(\"cursor\", \"/Users/dev/myproject\", \"react-hooks\", true)\n * // Returns: \"/Users/dev/.cursor/skills/react-hooks/SKILL.md\"\n */\nexport function getSkillPath(\n agentId: string,\n projectPath: string,\n skillName: string,\n global: boolean = false\n): string {\n const agentConfig = AGENT_PATHS[agentId];\n\n if (!agentConfig) {\n // Fallback for unknown agents: use `.{agentId}/skills` pattern\n const fallbackPath = global\n ? `~/.${agentId}/skills`\n : `.${agentId}/skills`;\n\n const basePath = global\n ? expandTilde(fallbackPath)\n : path.join(projectPath, fallbackPath);\n\n return path.join(basePath, skillName, 'SKILL.md');\n }\n\n const basePath = global\n ? expandTilde(agentConfig.globalPath)\n : path.join(projectPath, agentConfig.projectPath);\n\n return path.join(basePath, skillName, 'SKILL.md');\n}\n\n/**\n * Detects which agents are installed in the project by checking for their config directories.\n * Scans the project root for agent-specific directories (.claude, .cursor, etc.).\n *\n * @param projectPath - The absolute path to the project root\n * @returns Array of detected agent identifiers (e.g., [\"claude-code\", \"cursor\"])\n *\n * @example\n * await detectInstalledAgents(\"/Users/dev/myproject\")\n * // Returns: [\"claude-code\", \"cursor\"] if those directories exist\n */\nexport async function detectInstalledAgents(projectPath: string): Promise<string[]> {\n const detected: string[] = [];\n\n for (const [agentId, config] of Object.entries(AGENT_PATHS)) {\n // Check for the agent's config directory (e.g., .claude, .cursor)\n // Extract base dir from projectPath (e.g., \".claude/skills\" -> \".claude\")\n const baseDir = config.projectPath.split('/')[0];\n const agentDirPath = path.join(projectPath, baseDir);\n\n if (existsSync(agentDirPath)) {\n detected.push(agentId);\n }\n }\n\n return detected;\n}\n\n/**\n * Expands tilde (~) in paths to the user's home directory.\n * Handles paths starting with ~ or ~/ and replaces with the actual home directory path.\n *\n * @param filepath - Path that may contain a tilde\n * @returns Path with tilde expanded to home directory\n *\n * @example\n * expandTilde(\"~/.claude/skills\") // \"/Users/username/.claude/skills\"\n * expandTilde(\"/absolute/path\") // \"/absolute/path\" (unchanged)\n */\nfunction expandTilde(filepath: string): string {\n if (filepath.startsWith('~/') || filepath === '~') {\n return path.join(os.homedir(), filepath.slice(1));\n }\n return filepath;\n}\n","/**\n * Tool 1: detect_installed_agents\n * Scans project root and home directory for installed AI coding agents\n */\n\nimport { z } from 'zod';\nimport { detectInstalledAgents, AGENT_PATHS } from '../lib/agent-paths.js';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport fs from 'fs-extra';\nconst { existsSync } = fs;\n\nexport const DetectAgentsInputSchema = z.object({\n projectPath: z.string().describe('Absolute path to project root directory'),\n includeGlobal: z.boolean().optional().default(false).describe('Also scan home directory for globally installed agents'),\n});\n\nexport type DetectAgentsInput = z.infer<typeof DetectAgentsInputSchema>;\n\nexport interface DetectedAgent {\n id: string;\n name: string;\n projectSkillPath: string;\n globalSkillPath: string;\n foundInProject: boolean;\n foundGlobally: boolean;\n}\n\nexport interface DetectAgentsResult {\n success: boolean;\n agents: DetectedAgent[];\n projectRoot: string;\n error?: string;\n}\n\n/**\n * Detects installed AI coding agents by scanning for their config directories\n * Scans filesystem for .claude/, .cursor/, .agent/, etc. directories\n * Returns list of detected agents with their skill directory paths\n */\nexport async function detectAgents(input: DetectAgentsInput): Promise<DetectAgentsResult> {\n try {\n const { projectPath, includeGlobal } = input;\n\n // Detect agents in project\n const projectAgents = await detectInstalledAgents(projectPath);\n\n // Build agent info\n const agentMap = new Map<string, DetectedAgent>();\n\n // Add detected project agents\n for (const agentId of projectAgents) {\n const config = AGENT_PATHS[agentId];\n if (!config) continue;\n\n const projectSkillPath = path.join(projectPath, config.projectPath);\n const globalSkillPath = config.globalPath.replace(/^~/, os.homedir());\n\n agentMap.set(agentId, {\n id: agentId,\n name: agentId,\n projectSkillPath,\n globalSkillPath,\n foundInProject: true,\n foundGlobally: false,\n });\n }\n\n // Check global installations if requested\n if (includeGlobal) {\n const homeDir = os.homedir();\n\n for (const [agentId, config] of Object.entries(AGENT_PATHS)) {\n const globalSkillPath = config.globalPath.replace(/^~/, homeDir);\n const globalConfigDir = path.dirname(globalSkillPath);\n\n const foundGlobally = existsSync(globalConfigDir);\n\n if (agentMap.has(agentId)) {\n // Update existing entry\n agentMap.get(agentId)!.foundGlobally = foundGlobally;\n } else if (foundGlobally) {\n // Add new entry for globally installed agent not in project\n const projectSkillPath = path.join(projectPath, config.projectPath);\n\n agentMap.set(agentId, {\n id: agentId,\n name: agentId,\n projectSkillPath,\n globalSkillPath,\n foundInProject: false,\n foundGlobally: true,\n });\n }\n }\n }\n\n const agents = Array.from(agentMap.values());\n\n return {\n success: true,\n agents,\n projectRoot: projectPath,\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n success: false,\n agents: [],\n projectRoot: input.projectPath,\n error: message,\n };\n }\n}\n","/**\n * SkillMesh configuration management\n * Reads/writes .skillmesh/skillmesh.config.json\n */\n\nimport * as path from 'node:path';\nimport fs from 'fs-extra';\nconst { ensureDirSync, readJsonSync, writeJsonSync, existsSync } = fs;\n\nexport interface InstalledSkill {\n name: string;\n source: string;\n installedAt: string;\n agents: string[];\n}\n\nexport interface SkillMeshConfig {\n version: string;\n installedSkills: InstalledSkill[];\n}\n\n/**\n * Default configuration structure for new projects.\n */\nconst DEFAULT_CONFIG: SkillMeshConfig = {\n version: '1.0.0',\n installedSkills: [],\n};\n\n/**\n * Gets the absolute path to the config file.\n *\n * @param projectRoot - Absolute path to project root\n * @returns Absolute path to skillmesh.config.json\n */\nfunction getConfigPath(projectRoot: string): string {\n return path.join(projectRoot, '.skillmesh', 'skillmesh.config.json');\n}\n\n/**\n * Reads SkillMesh configuration from .skillmesh/skillmesh.config.json.\n * Creates default config if file doesn't exist.\n *\n * @param projectRoot - Absolute path to the project root\n * @returns SkillMesh configuration object\n *\n * @example\n * const config = await readConfig(\"/Users/dev/myproject\");\n * console.log(config.installedSkills);\n */\nexport async function readConfig(projectRoot: string): Promise<SkillMeshConfig> {\n const configPath = getConfigPath(projectRoot);\n\n try {\n if (!existsSync(configPath)) {\n // Return default config if file doesn't exist yet\n return { ...DEFAULT_CONFIG };\n }\n\n const config = readJsonSync(configPath) as SkillMeshConfig;\n\n // Ensure config has all required fields\n return {\n version: config.version || DEFAULT_CONFIG.version,\n installedSkills: config.installedSkills || [],\n };\n } catch (error) {\n console.error('Failed to read config, returning default:', error);\n return { ...DEFAULT_CONFIG };\n }\n}\n\n/**\n * Writes SkillMesh configuration to .skillmesh/skillmesh.config.json.\n * Creates the .skillmesh directory if it doesn't exist.\n *\n * @param projectRoot - Absolute path to the project root\n * @param config - Configuration object to write\n *\n * @example\n * await writeConfig(\"/Users/dev/myproject\", {\n * version: \"1.0.0\",\n * installedSkills: [...]\n * });\n */\nexport async function writeConfig(\n projectRoot: string,\n config: SkillMeshConfig\n): Promise<void> {\n const configPath = getConfigPath(projectRoot);\n\n try {\n // Ensure .skillmesh directory exists\n ensureDirSync(path.dirname(configPath));\n\n // Write config with pretty formatting\n writeJsonSync(configPath, config, { spaces: 2 });\n } catch (error) {\n console.error('Failed to write config:', error);\n throw error;\n }\n}\n\n/**\n * Tracks a newly installed skill in the config.\n * Updates existing skill if already tracked (adds agents, updates timestamp).\n *\n * @param projectRoot - Absolute path to the project root\n * @param skillName - Name of the installed skill\n * @param agents - Array of agent IDs where skill was installed\n * @param source - Source URL or identifier (e.g., \"owner/repo\", \"generated\")\n *\n * @example\n * await trackInstalledSkill(\n * \"/Users/dev/myproject\",\n * \"nextjs-patterns\",\n * [\"claude-code\", \"cursor\"],\n * \"vercel-labs/next-skills\"\n * );\n */\nexport async function trackInstalledSkill(\n projectRoot: string,\n skillName: string,\n agents: string[],\n source: string\n): Promise<void> {\n try {\n const config = await readConfig(projectRoot);\n\n // Check if skill already exists\n const existingIndex = config.installedSkills.findIndex(\n (skill) => skill.name === skillName\n );\n\n if (existingIndex !== -1) {\n // Update existing skill: merge agents and update timestamp\n const existing = config.installedSkills[existingIndex];\n const mergedAgents = Array.from(new Set([...existing.agents, ...agents]));\n\n config.installedSkills[existingIndex] = {\n name: skillName,\n source: source || existing.source,\n installedAt: new Date().toISOString(),\n agents: mergedAgents,\n };\n } else {\n // Add new skill\n config.installedSkills.push({\n name: skillName,\n source,\n installedAt: new Date().toISOString(),\n agents,\n });\n }\n\n await writeConfig(projectRoot, config);\n } catch (error) {\n console.error('Failed to track installed skill:', error);\n // Don't throw - tracking is non-critical\n }\n}\n\n/**\n * Removes a skill from tracking when deleted.\n * If the skill is installed for multiple agents, only removes the specified agent.\n * If it's the last agent, removes the skill entirely.\n *\n * @param projectRoot - Absolute path to the project root\n * @param skillName - Name of the skill to untrack\n * @param agentName - Agent ID to remove from the skill's agent list\n *\n * @example\n * await untrackSkill(\"/Users/dev/myproject\", \"nextjs-patterns\", \"cursor\");\n */\nexport async function untrackSkill(\n projectRoot: string,\n skillName: string,\n agentName: string\n): Promise<void> {\n try {\n const config = await readConfig(projectRoot);\n\n const skillIndex = config.installedSkills.findIndex(\n (skill) => skill.name === skillName\n );\n\n if (skillIndex === -1) {\n // Skill not tracked, nothing to do\n return;\n }\n\n const skill = config.installedSkills[skillIndex];\n\n // Remove agent from the list\n skill.agents = skill.agents.filter((agent) => agent !== agentName);\n\n if (skill.agents.length === 0) {\n // No agents left, remove the skill entirely\n config.installedSkills.splice(skillIndex, 1);\n } else {\n // Update with remaining agents\n config.installedSkills[skillIndex] = skill;\n }\n\n await writeConfig(projectRoot, config);\n } catch (error) {\n console.error('Failed to untrack skill:', error);\n // Don't throw - tracking is non-critical\n }\n}\n\n/**\n * Gets list of all installed skills from config.\n *\n * @param projectRoot - Absolute path to the project root\n * @returns Array of installed skills\n *\n * @example\n * const skills = await getInstalledSkills(\"/Users/dev/myproject\");\n * skills.forEach(skill => console.log(skill.name, skill.agents));\n */\nexport async function getInstalledSkills(projectRoot: string): Promise<InstalledSkill[]> {\n const config = await readConfig(projectRoot);\n return config.installedSkills;\n}\n","/**\n * Tool 8: create_skills_folder\n * Initializes skill directory structure for selected agents\n */\n\nimport { z } from 'zod';\nimport { AGENT_PATHS } from '../lib/agent-paths.js';\nimport { writeConfig } from '../lib/config.js';\nimport fs from 'fs-extra';\nconst { ensureDirSync, existsSync } = fs;\nimport * as path from 'node:path';\nimport * as os from 'node:os';\n\nexport const CreateFolderInputSchema = z.object({\n projectPath: z.string().describe('Absolute path to project root directory'),\n agents: z.array(z.string()).describe('List of agent names to create folders for'),\n global: z.boolean().optional().default(false).describe('Create in global scope instead of project scope'),\n});\n\nexport type CreateFolderInput = z.infer<typeof CreateFolderInputSchema>;\n\nexport interface FolderCreationResult {\n agent: string;\n path: string;\n created: boolean;\n alreadyExists: boolean;\n}\n\nexport interface CreateFolderResult {\n success: boolean;\n results: FolderCreationResult[];\n configCreated: boolean;\n configPath?: string;\n error?: string;\n}\n\n/**\n * Creates skill directories for specified agents\n * Also creates .skillmesh/skillmesh.config.json for tracking\n */\nexport async function createFolder(input: CreateFolderInput): Promise<CreateFolderResult> {\n try {\n const { projectPath, agents, global } = input;\n\n const results: FolderCreationResult[] = [];\n\n // Create skill directories for each agent\n for (const agentId of agents) {\n const config = AGENT_PATHS[agentId];\n\n if (!config) {\n results.push({\n agent: agentId,\n path: '',\n created: false,\n alreadyExists: false,\n });\n continue;\n }\n\n let skillDirPath: string;\n\n if (global) {\n // Create in global scope (home directory)\n skillDirPath = config.globalPath.replace(/^~/, os.homedir());\n } else {\n // Create in project scope\n skillDirPath = path.join(projectPath, config.projectPath);\n }\n\n const alreadyExists = existsSync(skillDirPath);\n\n try {\n ensureDirSync(skillDirPath);\n results.push({\n agent: agentId,\n path: skillDirPath,\n created: !alreadyExists,\n alreadyExists,\n });\n } catch (err) {\n results.push({\n agent: agentId,\n path: skillDirPath,\n created: false,\n alreadyExists: false,\n });\n }\n }\n\n // Create .skillmesh directory and config file (project scope only)\n let configCreated = false;\n let configPath: string | undefined;\n\n if (!global) {\n try {\n const skillmeshDir = path.join(projectPath, '.skillmesh');\n const configFilePath = path.join(skillmeshDir, 'skillmesh.config.json');\n\n const configExists = existsSync(configFilePath);\n\n ensureDirSync(skillmeshDir);\n\n // Initialize config if it doesn't exist\n if (!configExists) {\n await writeConfig(projectPath, {\n version: '1.0.0',\n installedSkills: [],\n });\n configCreated = true;\n }\n\n configPath = configFilePath;\n } catch (err) {\n // Non-fatal error, continue\n configCreated = false;\n }\n }\n\n return {\n success: true,\n results,\n configCreated,\n configPath,\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n success: false,\n results: [],\n configCreated: false,\n error: message,\n };\n }\n}\n","/**\n * Web search utilities\n * Tavily primary, Firecrawl fallback\n */\n\nexport interface SearchResult {\n title: string;\n url: string;\n snippet: string;\n score?: number;\n}\n\n/**\n * Searches the web using Tavily API.\n * Falls back to Firecrawl if TAVILY_API_KEY is not available.\n *\n * @param query - Search query string\n * @param maxResults - Maximum number of results to return (default: 10)\n * @returns Array of search results, empty array on error\n *\n * @example\n * const results = await searchTavily(\"nextjs app router best practices\");\n * results.forEach(r => console.log(r.title, r.url));\n */\nexport async function searchTavily(\n query: string,\n maxResults: number = 10\n): Promise<SearchResult[]> {\n const tavilyKey = process.env.TAVILY_API_KEY;\n\n if (!tavilyKey) {\n console.error('TAVILY_API_KEY not found in environment, trying Firecrawl fallback');\n return searchFirecrawl(query, maxResults);\n }\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 15000);\n\n const response = await fetch('https://api.tavily.com/search', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n api_key: tavilyKey,\n query,\n max_results: maxResults,\n search_depth: 'basic',\n include_answer: false,\n include_images: false,\n }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n console.error('Tavily API error:', response.status, response.statusText);\n return [];\n }\n\n const data = await response.json();\n\n if (!data.results || !Array.isArray(data.results)) {\n return [];\n }\n\n return data.results.map((result: any) => ({\n title: result.title || '',\n url: result.url || '',\n snippet: result.content || '',\n score: result.score,\n }));\n } catch (error) {\n console.error('Tavily search failed:', error);\n return [];\n }\n}\n\n/**\n * Searches the web using Firecrawl API as a fallback.\n * Only used when TAVILY_API_KEY is not available.\n *\n * @param query - Search query string\n * @param maxResults - Maximum number of results to return (default: 10)\n * @returns Array of search results, empty array on error\n *\n * @example\n * const results = await searchFirecrawl(\"react hooks patterns\");\n * results.forEach(r => console.log(r.title, r.url));\n */\nexport async function searchFirecrawl(\n query: string,\n maxResults: number = 10\n): Promise<SearchResult[]> {\n const firecrawlKey = process.env.FIRECRAWL_API_KEY;\n\n if (!firecrawlKey) {\n console.error('Neither TAVILY_API_KEY nor FIRECRAWL_API_KEY found in environment');\n return [];\n }\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 15000);\n\n const response = await fetch('https://api.firecrawl.dev/v1/search', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${firecrawlKey}`,\n },\n body: JSON.stringify({\n query,\n limit: maxResults,\n }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n console.error('Firecrawl API error:', response.status, response.statusText);\n return [];\n }\n\n const data = await response.json();\n\n if (!data.data || !Array.isArray(data.data)) {\n return [];\n }\n\n return data.data.map((result: any) => ({\n title: result.title || '',\n url: result.url || '',\n snippet: result.description || result.content || '',\n score: result.score,\n }));\n } catch (error) {\n console.error('Firecrawl search failed:', error);\n return [];\n }\n}\n\n/**\n * Searches skills.sh specifically for agent skills.\n * Uses Tavily with site: operator to restrict results to skills.sh domain.\n * Filters results by quality criteria (GitHub stars and recency).\n *\n * @param keyword - Skill keyword or topic to search for\n * @param minStars - Minimum GitHub stars required (default: 50)\n * @param maxAgeMonths - Maximum age in months (default: 12)\n * @returns Array of filtered search results from skills.sh\n *\n * @example\n * const skills = await searchSkillsSh(\"nextjs\", 50, 12);\n * skills.forEach(s => console.log(s.title, s.url));\n */\nexport async function searchSkillsSh(\n keyword: string,\n minStars: number = 50,\n maxAgeMonths: number = 12\n): Promise<SearchResult[]> {\n // Search skills.sh specifically\n const query = `site:skills.sh ${keyword} skill`;\n\n const results = await searchTavily(query, 20);\n\n // Filter results by skills.sh domain\n const skillsShResults = results.filter((result) =>\n result.url.includes('skills.sh')\n );\n\n // Note: Actual filtering by stars and recency requires fetching GitHub metadata\n // This should be done in the tool layer, not here\n // We return all skills.sh results and let the caller apply quality filters\n\n return skillsShResults;\n}\n","/**\n * GitHub API utilities\n * Fetches SKILL.md files from GitHub repositories with fallback strategies\n */\n\nexport interface GitHubFetchResult {\n content: string;\n url: string;\n found: boolean;\n}\n\nexport interface GitHubRepoInfo {\n stars: number;\n lastUpdated: Date | null;\n}\n\n/**\n * Fetches a SKILL.md file from GitHub using a 3-path fallback strategy.\n * Tries multiple common locations for skill files in order.\n *\n * Fallback order:\n * 1. .claude/skills/<skill-name>/SKILL.md\n * 2. SKILL.md (root)\n * 3. skills/<skill-name>/SKILL.md\n * 4. GitHub Search API (if all direct paths fail)\n *\n * @param owner - GitHub repository owner\n * @param repo - GitHub repository name\n * @param skillName - Sanitized skill name to look for\n * @param githubToken - Optional GitHub token for authentication (increases rate limits)\n * @returns Fetch result with content, URL, and found status\n *\n * @example\n * const result = await fetchSkillFromGitHub(\"vercel-labs\", \"next-skills\", \"nextjs-patterns\");\n * if (result.found) {\n * console.log(result.content);\n * }\n */\nexport async function fetchSkillFromGitHub(\n owner: string,\n repo: string,\n skillName: string,\n githubToken?: string\n): Promise<GitHubFetchResult> {\n const baseUrl = `https://raw.githubusercontent.com/${owner}/${repo}/main`;\n\n // Define fallback paths in order of priority\n const paths = [\n `${baseUrl}/.claude/skills/${skillName}/SKILL.md`,\n `${baseUrl}/SKILL.md`,\n `${baseUrl}/skills/${skillName}/SKILL.md`,\n ];\n\n // Try each path in order\n for (const url of paths) {\n const result = await fetchWithTimeout(url, githubToken);\n if (result.found) {\n return result;\n }\n }\n\n // If all direct paths fail, try GitHub Search API as last resort\n const searchResult = await searchGitHubForSkill(owner, repo, skillName, githubToken);\n if (searchResult.found) {\n return searchResult;\n }\n\n // All methods failed\n return {\n content: '',\n url: '',\n found: false,\n };\n}\n\n/**\n * Fetches GitHub repository star count.\n *\n * @param owner - GitHub repository owner\n * @param repo - GitHub repository name\n * @param githubToken - Optional GitHub token for authentication\n * @returns Star count, or 0 if fetch fails\n *\n * @example\n * const stars = await getGitHubStars(\"vercel-labs\", \"next-skills\");\n * console.log(`Stars: ${stars}`);\n */\nexport async function getGitHubStars(\n owner: string,\n repo: string,\n githubToken?: string\n): Promise<number> {\n const url = `https://api.github.com/repos/${owner}/${repo}`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 15000);\n\n const headers: HeadersInit = {\n 'Accept': 'application/vnd.github.v3+json',\n 'User-Agent': 'skillmesh-mcp',\n };\n\n if (githubToken) {\n headers['Authorization'] = `Bearer ${githubToken}`;\n }\n\n const response = await fetch(url, {\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n return 0;\n }\n\n const data = await response.json();\n return data.stargazers_count || 0;\n } catch (error) {\n console.error(`Failed to fetch star count for ${owner}/${repo}:`, error);\n return 0;\n }\n}\n\n/**\n * Fetches GitHub repository last updated timestamp.\n *\n * @param owner - GitHub repository owner\n * @param repo - GitHub repository name\n * @param githubToken - Optional GitHub token for authentication\n * @returns Last updated date, or null if fetch fails\n *\n * @example\n * const lastUpdated = await getLastUpdated(\"vercel-labs\", \"next-skills\");\n * if (lastUpdated) {\n * console.log(`Last updated: ${lastUpdated.toISOString()}`);\n * }\n */\nexport async function getLastUpdated(\n owner: string,\n repo: string,\n githubToken?: string\n): Promise<Date | null> {\n const url = `https://api.github.com/repos/${owner}/${repo}`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 15000);\n\n const headers: HeadersInit = {\n 'Accept': 'application/vnd.github.v3+json',\n 'User-Agent': 'skillmesh-mcp',\n };\n\n if (githubToken) {\n headers['Authorization'] = `Bearer ${githubToken}`;\n }\n\n const response = await fetch(url, {\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n return null;\n }\n\n const data = await response.json();\n const updatedAt = data.updated_at || data.pushed_at;\n\n return updatedAt ? new Date(updatedAt) : null;\n } catch (error) {\n console.error(`Failed to fetch last updated for ${owner}/${repo}:`, error);\n return null;\n }\n}\n\n/**\n * Fetches content from a URL with timeout handling.\n *\n * @param url - URL to fetch\n * @param githubToken - Optional GitHub token\n * @returns Fetch result with content and found status\n */\nasync function fetchWithTimeout(\n url: string,\n githubToken?: string\n): Promise<GitHubFetchResult> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 15000);\n\n const headers: HeadersInit = {\n 'User-Agent': 'skillmesh-mcp',\n };\n\n // Only add auth header for GitHub API calls, not raw.githubusercontent.com\n if (githubToken && url.includes('api.github.com')) {\n headers['Authorization'] = `Bearer ${githubToken}`;\n }\n\n const response = await fetch(url, {\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n return {\n content: '',\n url: '',\n found: false,\n };\n }\n\n const content = await response.text();\n\n return {\n content,\n url,\n found: true,\n };\n } catch (error) {\n // Timeout or network error - not found\n return {\n content: '',\n url: '',\n found: false,\n };\n }\n}\n\n/**\n * Searches GitHub for a SKILL.md file using the Code Search API.\n * This is a last-resort fallback when direct path fetches fail.\n *\n * @param owner - GitHub repository owner\n * @param repo - GitHub repository name\n * @param skillName - Skill name to search for\n * @param githubToken - Optional GitHub token (required for search API)\n * @returns Fetch result with content if found\n */\nasync function searchGitHubForSkill(\n owner: string,\n repo: string,\n skillName: string,\n githubToken?: string\n): Promise<GitHubFetchResult> {\n if (!githubToken) {\n // GitHub Search API requires authentication\n return {\n content: '',\n url: '',\n found: false,\n };\n }\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 15000);\n\n // Search for SKILL.md files in the repository\n const query = encodeURIComponent(\n `filename:SKILL.md repo:${owner}/${repo}`\n );\n const searchUrl = `https://api.github.com/search/code?q=${query}`;\n\n const response = await fetch(searchUrl, {\n headers: {\n 'Accept': 'application/vnd.github.v3+json',\n 'Authorization': `Bearer ${githubToken}`,\n 'User-Agent': 'skillmesh-mcp',\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n return {\n content: '',\n url: '',\n found: false,\n };\n }\n\n const data = await response.json();\n\n if (!data.items || data.items.length === 0) {\n return {\n content: '',\n url: '',\n found: false,\n };\n }\n\n // Find best match based on skill name in path\n let bestMatch = data.items[0];\n\n for (const item of data.items) {\n if (item.path.includes(skillName)) {\n bestMatch = item;\n break;\n }\n }\n\n // Fetch the actual content using the download_url or construct raw URL\n const rawUrl = `https://raw.githubusercontent.com/${owner}/${repo}/main/${bestMatch.path}`;\n return await fetchWithTimeout(rawUrl, githubToken);\n } catch (error) {\n console.error('GitHub search failed:', error);\n return {\n content: '',\n url: '',\n found: false,\n };\n }\n}\n","/**\n * Tool 2: search_skills\n * Searches skills.sh for skills matching a keyword\n */\n\nimport { z } from 'zod';\nimport { searchTavily } from '../lib/tavily.js';\nimport { getGitHubStars, getLastUpdated } from '../lib/github.js';\n\nexport const SearchSkillsInputSchema = z.object({\n keyword: z.string().describe('Search keyword or skill domain (e.g., \"nextjs-app-router\", \"prisma\")'),\n minStars: z.number().optional().default(50).describe('Minimum GitHub stars filter'),\n maxAgeMonths: z.number().optional().default(12).describe('Maximum age in months (updated within)'),\n limit: z.number().optional().default(10).describe('Maximum number of results'),\n});\n\nexport type SearchSkillsInput = z.infer<typeof SearchSkillsInputSchema>;\n\nexport interface SkillSearchResult {\n name: string;\n repo: string;\n owner: string;\n description: string;\n stars: number;\n lastUpdated: string;\n url: string;\n score: number;\n}\n\nexport interface SearchSkillsResult {\n success: boolean;\n results: SkillSearchResult[];\n query: string;\n totalFound: number;\n error?: string;\n}\n\n/**\n * Searches skills.sh via Tavily for matching skills\n * Fetches GitHub star count and recency for each result\n * Filters by quality (stars >= minStars, updated within maxAgeMonths)\n * Returns ranked list sorted by score\n */\nexport async function searchSkills(input: SearchSkillsInput): Promise<SearchSkillsResult> {\n try {\n const { keyword, minStars, maxAgeMonths, limit } = input;\n\n // Search skills.sh via Tavily with site operator\n const searchQuery = `site:skills.sh ${keyword}`;\n const searchResults = await searchTavily(searchQuery, limit * 3); // Get more results to filter\n\n const qualityResults: SkillSearchResult[] = [];\n const githubToken = process.env.GITHUB_TOKEN;\n\n // Extract GitHub repo info and fetch metadata\n for (const result of searchResults) {\n // Extract owner/repo from skills.sh URL pattern\n // skills.sh URLs typically contain GitHub repo references\n const githubMatch = result.url.match(/github\\.com\\/([^\\/]+)\\/([^\\/\\?#]+)/);\n\n if (!githubMatch) {\n // Try extracting from the URL path or title\n const pathMatch = result.url.match(/skills\\.sh\\/([^\\/]+)\\/([^\\/\\?#]+)/);\n if (pathMatch) {\n const [, owner, repo] = pathMatch;\n\n try {\n const stars = await getGitHubStars(owner, repo, githubToken);\n const lastUpdated = await getLastUpdated(owner, repo, githubToken);\n\n // Filter by quality criteria\n if (stars < minStars) continue;\n\n if (lastUpdated) {\n const ageMonths = (Date.now() - lastUpdated.getTime()) / (1000 * 60 * 60 * 24 * 30);\n if (ageMonths > maxAgeMonths) continue;\n }\n\n // Calculate score (stars + recency bonus)\n const recencyBonus = lastUpdated\n ? Math.max(0, 100 - (Date.now() - lastUpdated.getTime()) / (1000 * 60 * 60 * 24 * 30))\n : 0;\n const score = stars + recencyBonus + (result.score || 0) * 10;\n\n qualityResults.push({\n name: repo,\n repo,\n owner,\n description: result.snippet,\n stars,\n lastUpdated: lastUpdated ? lastUpdated.toISOString() : 'unknown',\n url: result.url,\n score,\n });\n } catch (err) {\n // Skip repos that fail to fetch metadata\n continue;\n }\n }\n continue;\n }\n\n const [, owner, repo] = githubMatch;\n\n try {\n const stars = await getGitHubStars(owner, repo, githubToken);\n const lastUpdated = await getLastUpdated(owner, repo, githubToken);\n\n // Filter by quality criteria\n if (stars < minStars) continue;\n\n if (lastUpdated) {\n const ageMonths = (Date.now() - lastUpdated.getTime()) / (1000 * 60 * 60 * 24 * 30);\n if (ageMonths > maxAgeMonths) continue;\n }\n\n // Calculate score (stars + recency bonus + search relevance)\n const recencyBonus = lastUpdated\n ? Math.max(0, 100 - (Date.now() - lastUpdated.getTime()) / (1000 * 60 * 60 * 24 * 30))\n : 0;\n const score = stars + recencyBonus + (result.score || 0) * 10;\n\n qualityResults.push({\n name: repo,\n repo,\n owner,\n description: result.snippet,\n stars,\n lastUpdated: lastUpdated ? lastUpdated.toISOString() : 'unknown',\n url: result.url,\n score,\n });\n } catch (err) {\n // Skip repos that fail to fetch metadata\n continue;\n }\n }\n\n // Sort by score and limit results\n qualityResults.sort((a, b) => b.score - a.score);\n const limitedResults = qualityResults.slice(0, limit);\n\n return {\n success: true,\n results: limitedResults,\n query: keyword,\n totalFound: qualityResults.length,\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n success: false,\n results: [],\n query: input.keyword,\n totalFound: 0,\n error: message,\n };\n }\n}\n","/**\n * SKILL.md YAML frontmatter parser and validator\n */\n\nimport { z } from 'zod';\nimport * as yaml from 'js-yaml';\n\n/**\n * Zod schema for SKILL.md frontmatter validation.\n * Validates required fields (name, description) and optional metadata.\n */\nexport const SkillMetadataSchema = z.object({\n name: z.string().min(1, 'Skill name is required'),\n description: z.string().min(1, 'Description is required'),\n tags: z.array(z.string()).optional().default([]),\n sources: z.array(z.string().url()).optional().default([]),\n created_by: z.string().optional(),\n created_at: z.string().optional(),\n});\n\nexport type SkillMetadata = z.infer<typeof SkillMetadataSchema>;\n\nexport interface ParsedSkill {\n metadata: SkillMetadata;\n content: string;\n raw: string;\n}\n\n/**\n * Parses SKILL.md content, extracting and validating YAML frontmatter.\n * Expects frontmatter between --- markers at the start of the file.\n *\n * @param content - Raw SKILL.md file content\n * @returns Parsed skill object with validated metadata and body content, or null if parsing fails\n *\n * @example\n * const parsed = parseSkillMd(skillContent);\n * if (parsed) {\n * console.log(parsed.metadata.name);\n * console.log(parsed.content); // Body without frontmatter\n * }\n */\nexport function parseSkillMd(content: string): ParsedSkill | null {\n try {\n // Check for YAML frontmatter markers\n const frontmatterRegex = /^---\\s*\\n([\\s\\S]*?)\\n---\\s*\\n([\\s\\S]*)$/;\n const match = content.match(frontmatterRegex);\n\n if (!match) {\n // No frontmatter found\n return null;\n }\n\n const [, frontmatterStr, bodyContent] = match;\n\n // Parse YAML frontmatter\n const parsedYaml = yaml.load(frontmatterStr);\n\n if (!parsedYaml || typeof parsedYaml !== 'object') {\n return null;\n }\n\n // Validate with Zod schema\n const validationResult = SkillMetadataSchema.safeParse(parsedYaml);\n\n if (!validationResult.success) {\n console.error('Skill metadata validation failed:', validationResult.error.flatten());\n return null;\n }\n\n return {\n metadata: validationResult.data,\n content: bodyContent.trim(),\n raw: content,\n };\n } catch (error) {\n console.error('Failed to parse SKILL.md:', error);\n return null;\n }\n}\n\n/**\n * Validates complete SKILL.md structure including required sections.\n * Checks for presence of key sections like Overview, Core Rules, Patterns, etc.\n *\n * @param content - Raw SKILL.md file content\n * @returns Validation result with boolean status and error messages\n *\n * @example\n * const validation = validateSkillMd(skillContent);\n * if (!validation.valid) {\n * console.error(validation.errors);\n * }\n */\nexport function validateSkillMd(content: string): {\n valid: boolean;\n errors: string[];\n} {\n const errors: string[] = [];\n\n // First, check if frontmatter is valid\n const parsed = parseSkillMd(content);\n if (!parsed) {\n errors.push('Invalid or missing YAML frontmatter');\n return { valid: false, errors };\n }\n\n // Check for required sections (case-insensitive)\n const requiredSections = [\n { name: 'Overview', pattern: /##\\s+Overview/i },\n { name: 'Core Rules', pattern: /##\\s+Core\\s+Rules/i },\n { name: 'Patterns', pattern: /##\\s+Patterns/i },\n { name: 'Anti-Patterns', pattern: /##\\s+Anti-?Patterns/i },\n ];\n\n for (const section of requiredSections) {\n if (!section.pattern.test(parsed.content)) {\n errors.push(`Missing required section: ${section.name}`);\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n/**\n * Checks SKILL.md quality against gold-standard compliance criteria.\n * Evaluates minimum requirements for rules, patterns, anti-patterns, and code examples.\n *\n * @param parsed - Parsed skill object\n * @returns Quality score (0-100) and feedback messages\n *\n * @example\n * const parsed = parseSkillMd(content);\n * if (parsed) {\n * const quality = checkSkillQuality(parsed);\n * console.log(`Score: ${quality.score}/100`);\n * quality.feedback.forEach(msg => console.log(msg));\n * }\n */\nexport function checkSkillQuality(parsed: ParsedSkill): {\n score: number;\n feedback: string[];\n} {\n const feedback: string[] = [];\n let score = 100;\n\n // Check Core Rules count (minimum 6-10 expected)\n const rulesMatch = parsed.content.match(/##\\s+Core\\s+Rules([\\s\\S]*?)(?=##|$)/i);\n if (rulesMatch) {\n const rulesSection = rulesMatch[1];\n const ruleCount = (rulesSection.match(/^\\d+\\./gm) || []).length;\n\n if (ruleCount < 6) {\n feedback.push(`Core Rules should have 6-10 rules (found ${ruleCount})`);\n score -= 15;\n }\n } else {\n feedback.push('Core Rules section is missing or improperly formatted');\n score -= 20;\n }\n\n // Check Patterns count (minimum 3-5 expected)\n const patternsMatch = parsed.content.match(/##\\s+Patterns(?:\\s+and\\s+Examples)?([\\s\\S]*?)(?=##|$)/i);\n if (patternsMatch) {\n const patternsSection = patternsMatch[1];\n const patternCount = (patternsSection.match(/###\\s+Pattern\\s+\\d+/gi) || []).length;\n\n if (patternCount < 3) {\n feedback.push(`Patterns section should have 3-5 patterns (found ${patternCount})`);\n score -= 15;\n }\n\n // Check for code blocks in patterns\n const codeBlockCount = (patternsSection.match(/```/g) || []).length / 2;\n if (codeBlockCount < patternCount) {\n feedback.push('Each pattern should include a complete runnable code example');\n score -= 10;\n }\n } else {\n feedback.push('Patterns section is missing or improperly formatted');\n score -= 20;\n }\n\n // Check Anti-Patterns count (minimum 4-6 expected)\n const antiPatternsMatch = parsed.content.match(/##\\s+Anti-?Patterns([\\s\\S]*?)(?=##|$)/i);\n if (antiPatternsMatch) {\n const antiPatternsSection = antiPatternsMatch[1];\n const antiPatternCount = (antiPatternsSection.match(/^-\\s+/gm) || []).length;\n\n if (antiPatternCount < 4) {\n feedback.push(`Anti-Patterns section should have 4-6 items (found ${antiPatternCount})`);\n score -= 10;\n }\n } else {\n feedback.push('Anti-Patterns section is missing');\n score -= 15;\n }\n\n // Check for File and Folder Conventions section\n if (!/##\\s+File\\s+and\\s+Folder\\s+Conventions/i.test(parsed.content)) {\n feedback.push('Consider adding File and Folder Conventions section');\n score -= 5;\n }\n\n // Check for Useful References section\n if (!/##\\s+Useful\\s+References/i.test(parsed.content)) {\n feedback.push('Consider adding Useful References section');\n score -= 5;\n }\n\n // Ensure score doesn't go below 0\n score = Math.max(0, score);\n\n if (score === 100) {\n feedback.push('Excellent! This skill meets gold-standard quality criteria.');\n } else if (score >= 80) {\n feedback.push('Good quality skill with minor improvements suggested.');\n } else if (score >= 60) {\n feedback.push('Acceptable skill but significant improvements recommended.');\n } else {\n feedback.push('This skill needs substantial improvements to meet quality standards.');\n }\n\n return { score, feedback };\n}\n","/**\n * Tool 3: fetch_skill_content\n * Fetches full SKILL.md content from a GitHub repository\n */\n\nimport { z } from 'zod';\nimport { fetchSkillFromGitHub } from '../lib/github.js';\nimport { parseSkillMd, validateSkillMd } from '../lib/skill-parser.js';\n\nexport const FetchSkillInputSchema = z.object({\n owner: z.string().describe('GitHub repository owner'),\n repo: z.string().describe('GitHub repository name'),\n skillName: z.string().describe('Skill name to fetch'),\n githubToken: z.string().optional().describe('Optional GitHub token for higher rate limits'),\n});\n\nexport type FetchSkillInput = z.infer<typeof FetchSkillInputSchema>;\n\nexport interface FetchSkillResult {\n success: boolean;\n content: string;\n sourceUrl: string;\n found: boolean;\n metadata?: {\n name: string;\n description: string;\n tags: string[];\n sources?: string[];\n };\n quality?: {\n valid: boolean;\n issues: string[];\n };\n error?: string;\n}\n\n/**\n * Fetches SKILL.md content from GitHub using raw URL fallback strategy\n * Validates YAML frontmatter and returns complete content with metadata\n */\nexport async function fetchSkillContent(input: FetchSkillInput): Promise<FetchSkillResult> {\n try {\n const { owner, repo, skillName, githubToken } = input;\n\n // Use GitHub token from env if not provided\n const token = githubToken || process.env.GITHUB_TOKEN;\n\n // Fetch using 3-path fallback strategy\n const fetchResult = await fetchSkillFromGitHub(owner, repo, skillName, token);\n\n if (!fetchResult.found || !fetchResult.content) {\n return {\n success: false,\n content: '',\n sourceUrl: fetchResult.url,\n found: false,\n error: 'SKILL.md not found in repository',\n };\n }\n\n // Parse and validate SKILL.md\n try {\n const parsed = parseSkillMd(fetchResult.content);\n const validation = validateSkillMd(fetchResult.content);\n\n if (!parsed) {\n return {\n success: true,\n content: fetchResult.content,\n sourceUrl: fetchResult.url,\n found: true,\n quality: {\n valid: false,\n issues: ['Failed to parse SKILL.md frontmatter'],\n },\n };\n }\n\n return {\n success: true,\n content: fetchResult.content,\n sourceUrl: fetchResult.url,\n found: true,\n metadata: {\n name: parsed.metadata.name,\n description: parsed.metadata.description,\n tags: parsed.metadata.tags,\n sources: parsed.metadata.sources,\n },\n quality: {\n valid: validation.valid,\n issues: validation.errors,\n },\n };\n } catch (parseErr) {\n // Return content even if parsing fails\n const parseMessage = parseErr instanceof Error ? parseErr.message : String(parseErr);\n\n return {\n success: true,\n content: fetchResult.content,\n sourceUrl: fetchResult.url,\n found: true,\n quality: {\n valid: false,\n issues: [`Failed to parse SKILL.md: ${parseMessage}`],\n },\n };\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n success: false,\n content: '',\n sourceUrl: '',\n found: false,\n error: message,\n };\n }\n}\n","/**\n * Skill name sanitization utilities\n * Ensures skill names are valid for filesystem use\n */\n\n/**\n * Sanitizes a skill name for safe filesystem use.\n * Converts to lowercase, replaces non-alphanumeric characters with hyphens,\n * removes multiple consecutive hyphens, and trims leading/trailing hyphens.\n *\n * @param name - The skill name to sanitize\n * @returns Sanitized skill name safe for use as a directory name\n *\n * @example\n * sanitizeSkillName(\"Next.js App Router\") // \"nextjs-app-router\"\n * sanitizeSkillName(\"React/TypeScript\") // \"react-typescript\"\n * sanitizeSkillName(\"--test--\") // \"test\"\n */\nexport function sanitizeSkillName(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n}\n\n/**\n * Generates a URL-safe slug from a title.\n * Converts natural language title to kebab-case slug.\n *\n * @param title - The title to convert to a slug\n * @returns URL-safe kebab-case slug\n *\n * @example\n * generateSlug(\"Building Modern Web Apps\") // \"building-modern-web-apps\"\n * generateSlug(\"TypeScript & React Guide!!!\") // \"typescript-react-guide\"\n */\nexport function generateSlug(title: string): string {\n return sanitizeSkillName(title);\n}\n\n/**\n * Checks if a skill name is already sanitized and valid.\n * A valid skill name contains only lowercase letters, numbers, and hyphens,\n * with no leading/trailing hyphens or consecutive hyphens.\n *\n * @param name - The skill name to validate\n * @returns True if the name is valid, false otherwise\n *\n * @example\n * isValidSkillName(\"nextjs-patterns\") // true\n * isValidSkillName(\"Next.js Patterns\") // false\n * isValidSkillName(\"react--hooks\") // false\n * isValidSkillName(\"-invalid-\") // false\n */\nexport function isValidSkillName(name: string): boolean {\n // Must not be empty\n if (!name || name.length === 0) {\n return false;\n }\n\n // Must match pattern: lowercase alphanumeric with single hyphens only\n const validPattern = /^[a-z0-9]+(-[a-z0-9]+)*$/;\n return validPattern.test(name);\n}\n","/**\n * Multi-provider LLM utilities\n * Supports Anthropic, Google, OpenAI with automatic provider detection\n */\n\nexport type LLMProvider = 'anthropic' | 'google' | 'openai';\n\nexport interface LLMConfig {\n provider: LLMProvider;\n model: string;\n apiKey: string;\n}\n\n/**\n * Model mapping for each provider based on BLUEPRINT.md.\n */\nconst PROVIDER_MODELS: Record<LLMProvider, string> = {\n anthropic: 'claude-sonnet-4-5-20250929',\n google: 'gemini-3.0-pro',\n openai: 'gpt-4o',\n};\n\n/**\n * Detects which LLM provider is available based on environment variables.\n * Checks in priority order: ANTHROPIC_API_KEY > GOOGLE_API_KEY > OPENAI_API_KEY.\n *\n * @returns LLM configuration object, or null if no API key is found\n *\n * @example\n * const config = detectLLMProvider();\n * if (config) {\n * console.log(`Using ${config.provider} with model ${config.model}`);\n * } else {\n * console.error(\"No LLM API key found\");\n * }\n */\nexport function detectLLMProvider(): LLMConfig | null {\n // Check in priority order\n if (process.env.ANTHROPIC_API_KEY) {\n return {\n provider: 'anthropic',\n model: PROVIDER_MODELS.anthropic,\n apiKey: process.env.ANTHROPIC_API_KEY,\n };\n }\n\n if (process.env.GOOGLE_API_KEY) {\n return {\n provider: 'google',\n model: PROVIDER_MODELS.google,\n apiKey: process.env.GOOGLE_API_KEY,\n };\n }\n\n if (process.env.OPENAI_API_KEY) {\n return {\n provider: 'openai',\n model: PROVIDER_MODELS.openai,\n apiKey: process.env.OPENAI_API_KEY,\n };\n }\n\n return null;\n}\n\n/**\n * Generates text using an LLM with the detected or specified provider.\n * Handles provider-specific API calls and error handling.\n *\n * @param systemPrompt - System prompt to guide the LLM's behavior\n * @param userPrompt - User prompt with the actual generation request\n * @param config - Optional LLM config; if not provided, will auto-detect\n * @returns Generated text, or error message string if generation fails\n *\n * @example\n * const result = await generateWithLLM(\n * \"You are a technical documentation writer.\",\n * \"Generate a SKILL.md for Next.js App Router patterns.\"\n * );\n * console.log(result);\n */\nexport async function generateWithLLM(\n systemPrompt: string,\n userPrompt: string,\n config?: LLMConfig\n): Promise<string> {\n const llmConfig = config || detectLLMProvider();\n\n if (!llmConfig) {\n return (\n 'ERROR: No LLM API key found. Please add one of the following environment variables to your MCP config:\\n' +\n ' - ANTHROPIC_API_KEY (recommended)\\n' +\n ' - GOOGLE_API_KEY\\n' +\n ' - OPENAI_API_KEY\\n\\n' +\n 'Add the key to your MCP server configuration under the \"env\" section.'\n );\n }\n\n try {\n switch (llmConfig.provider) {\n case 'anthropic':\n return await callAnthropic(systemPrompt, userPrompt, llmConfig.apiKey);\n case 'google':\n return await callGoogle(systemPrompt, userPrompt, llmConfig.apiKey);\n case 'openai':\n return await callOpenAI(systemPrompt, userPrompt, llmConfig.apiKey);\n default:\n return `ERROR: Unknown LLM provider: ${llmConfig.provider}`;\n }\n } catch (error) {\n console.error('LLM generation failed:', error);\n return `ERROR: LLM generation failed: ${error instanceof Error ? error.message : String(error)}`;\n }\n}\n\n/**\n * Calls Anthropic's Claude API using the Messages API.\n *\n * @param systemPrompt - System prompt\n * @param userPrompt - User prompt\n * @param apiKey - Anthropic API key\n * @returns Generated text content\n */\nasync function callAnthropic(\n systemPrompt: string,\n userPrompt: string,\n apiKey: string\n): Promise<string> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 60000); // 60s for LLM calls\n\n try {\n const response = await fetch('https://api.anthropic.com/v1/messages', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model: PROVIDER_MODELS.anthropic,\n max_tokens: 4096,\n system: systemPrompt,\n messages: [\n {\n role: 'user',\n content: userPrompt,\n },\n ],\n }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Anthropic API error ${response.status}: ${errorText}`);\n }\n\n const data = await response.json();\n\n if (!data.content || !data.content[0] || !data.content[0].text) {\n throw new Error('Invalid response format from Anthropic API');\n }\n\n return data.content[0].text;\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n}\n\n/**\n * Calls Google's Gemini API.\n *\n * @param systemPrompt - System prompt\n * @param userPrompt - User prompt\n * @param apiKey - Google API key\n * @returns Generated text content\n */\nasync function callGoogle(\n systemPrompt: string,\n userPrompt: string,\n apiKey: string\n): Promise<string> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 60000);\n\n try {\n // Combine system and user prompts for Gemini\n const combinedPrompt = `${systemPrompt}\\n\\n${userPrompt}`;\n\n const response = await fetch(\n `https://generativelanguage.googleapis.com/v1beta/models/${PROVIDER_MODELS.google}:generateContent?key=${apiKey}`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n contents: [\n {\n parts: [\n {\n text: combinedPrompt,\n },\n ],\n },\n ],\n generationConfig: {\n maxOutputTokens: 4096,\n temperature: 0.7,\n },\n }),\n signal: controller.signal,\n }\n );\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Google API error ${response.status}: ${errorText}`);\n }\n\n const data = await response.json();\n\n if (\n !data.candidates ||\n !data.candidates[0] ||\n !data.candidates[0].content ||\n !data.candidates[0].content.parts ||\n !data.candidates[0].content.parts[0]\n ) {\n throw new Error('Invalid response format from Google API');\n }\n\n return data.candidates[0].content.parts[0].text;\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n}\n\n/**\n * Calls OpenAI's Chat Completions API.\n *\n * @param systemPrompt - System prompt\n * @param userPrompt - User prompt\n * @param apiKey - OpenAI API key\n * @returns Generated text content\n */\nasync function callOpenAI(\n systemPrompt: string,\n userPrompt: string,\n apiKey: string\n): Promise<string> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 60000);\n\n try {\n const response = await fetch('https://api.openai.com/v1/chat/completions', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n model: PROVIDER_MODELS.openai,\n max_tokens: 4096,\n messages: [\n {\n role: 'system',\n content: systemPrompt,\n },\n {\n role: 'user',\n content: userPrompt,\n },\n ],\n }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`OpenAI API error ${response.status}: ${errorText}`);\n }\n\n const data = await response.json();\n\n if (\n !data.choices ||\n !data.choices[0] ||\n !data.choices[0].message ||\n !data.choices[0].message.content\n ) {\n throw new Error('Invalid response format from OpenAI API');\n }\n\n return data.choices[0].message.content;\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n}\n","/**\n * Tool 5: generate_skill\n * LLM-powered skill generation from web research\n */\n\nimport { z } from 'zod';\nimport { searchTavily, type SearchResult } from '../lib/tavily.js';\nimport { detectLLMProvider, generateWithLLM } from '../lib/llm.js';\nimport { sanitizeSkillName } from '../lib/skill-sanitizer.js';\nimport { parseSkillMd, checkSkillQuality } from '../lib/skill-parser.js';\n\nexport const GenerateSkillInputSchema = z.object({\n skillName: z.string().describe('Skill name/domain to generate'),\n projectContext: z.string().describe('Rich project context: frameworks, versions, patterns, structure'),\n researchQuery: z.string().optional().describe('Optional custom web research query'),\n maxResearchResults: z.number().optional().default(10).describe('Maximum web research results'),\n});\n\nexport type GenerateSkillInput = z.infer<typeof GenerateSkillInputSchema>;\n\nexport interface GenerateSkillResult {\n success: boolean;\n content: string;\n skillName: string;\n researchSources: string[];\n provider?: string;\n model?: string;\n quality?: {\n score: number;\n feedback: string[];\n };\n error?: string;\n}\n\n/**\n * LLM-powered skill generation with web research\n *\n * Process:\n * 1. Search web via Tavily for best practices, official docs, patterns\n * 2. Compile research + projectContext into rich prompt\n * 3. Call LLM (Anthropic > Google > OpenAI) with skill generation system prompt\n * 4. Validate generated SKILL.md against gold-standard format\n * 5. Return generated content with quality score\n *\n * Requires: TAVILY_API_KEY + (ANTHROPIC_API_KEY | GOOGLE_API_KEY | OPENAI_API_KEY)\n * If no LLM key found: return friendly error with exact env var names to add\n */\nexport async function generateSkill(input: GenerateSkillInput): Promise<GenerateSkillResult> {\n try {\n const { skillName, projectContext, researchQuery, maxResearchResults } = input;\n\n // Sanitize skill name\n const sanitizedName = sanitizeSkillName(skillName);\n\n // Check for LLM provider\n const llmConfig = detectLLMProvider();\n\n if (!llmConfig) {\n return {\n success: false,\n content: '',\n skillName: sanitizedName,\n researchSources: [],\n error: 'No LLM API key found. Please add one of the following to your MCP server config:\\n' +\n ' - ANTHROPIC_API_KEY (for Claude Sonnet 4.5)\\n' +\n ' - GOOGLE_API_KEY (for Gemini 3.0 Pro)\\n' +\n ' - OPENAI_API_KEY (for GPT-4o)\\n\\n' +\n 'Add the key to the \"env\" section of your MCP config file.',\n };\n }\n\n // Step 1: Web research via Tavily\n const query = researchQuery || `${skillName} best practices patterns conventions documentation`;\n let researchResults: SearchResult[] = [];\n let researchSources: string[] = [];\n\n try {\n researchResults = await searchTavily(query, maxResearchResults || 10);\n researchSources = researchResults.map(r => r.url);\n } catch (searchErr) {\n // Continue without research if Tavily fails\n researchResults = [];\n }\n\n // Step 2: Build research context\n const researchContext = researchResults.map((result, idx) => {\n return `[${idx + 1}] ${result.title}\\n${result.snippet}\\nSource: ${result.url}`;\n }).join('\\n\\n');\n\n // Step 3: Build generation prompt\n const systemPrompt = `You are an expert technical writer creating Agent Skills (SKILL.md files) that teach AI coding agents about specific technologies, frameworks, and best practices.\n\nCRITICAL REQUIREMENTS:\n1. Follow the EXACT structure from the gold-standard example below\n2. Include 6-10 Core Rules (numbered list, specific and actionable)\n3. Include 3-5 Patterns with complete runnable code examples\n4. Include 4-6 Anti-Patterns (bulleted list with explanations)\n5. Include File and Folder Conventions section\n6. Include Useful References section\n7. Use proper YAML frontmatter with name, description, tags, sources\n8. All code examples must be complete and runnable\n\nGOLD-STANDARD EXAMPLE STRUCTURE:\n---\nname: ${sanitizedName}\ndescription: One-line description of what this skill covers\ntags: [tag1, tag2, tag3]\nsources: [https://example.com/docs]\ncreated_by: skillmesh\ncreated_at: ${new Date().toISOString()}\n---\n\n## Overview\n2-3 sentence explanation of what this skill covers and why it matters.\n\n## Core Rules\n1. Rule one — specific and actionable with rationale\n2. Rule two — specific and actionable with rationale\n... (6-10 total)\n\n## Patterns and Examples\n\n### Pattern 1 — Descriptive Name\nExplain what this pattern does and when to use it.\n\\`\\`\\`language\n// Complete runnable code example\n\\`\\`\\`\n\n### Pattern 2 — Descriptive Name\n... (3-5 total patterns)\n\n## Anti-Patterns (What NOT To Do)\n- NEVER do X because Y (specific reason)\n- NEVER do A because B (specific reason)\n... (4-6 total)\n\n## File and Folder Conventions\nProject-specific folder structure and naming rules.\n\n## Useful References\n- https://official-docs-link\n- https://github.com/source-repo`;\n\n const userPrompt = `Generate a gold-standard SKILL.md for: ${skillName}\n\nPROJECT CONTEXT:\n${projectContext}\n\nWEB RESEARCH RESULTS:\n${researchContext || 'No research results available. Use your knowledge of best practices.'}\n\nINSTRUCTIONS:\n1. Create a comprehensive skill that follows the exact structure shown in the system prompt\n2. Use the project context to make rules and patterns specific to this project\n3. Reference the research sources in the \"sources\" frontmatter field\n4. Ensure all code examples are complete, runnable, and production-ready\n5. Make the skill immediately actionable for an AI agent working in this codebase\n\nGenerate the complete SKILL.md now:`;\n\n // Step 4: Generate with LLM\n const generatedContent = await generateWithLLM(systemPrompt, userPrompt, llmConfig);\n\n // Step 5: Validate quality\n const parsed = parseSkillMd(generatedContent);\n let quality;\n\n if (parsed) {\n quality = checkSkillQuality(parsed);\n } else {\n quality = {\n score: 0,\n feedback: ['Generated content does not have valid YAML frontmatter'],\n };\n }\n\n return {\n success: true,\n content: generatedContent,\n skillName: sanitizedName,\n researchSources,\n provider: llmConfig.provider,\n model: llmConfig.model,\n quality,\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n success: false,\n content: '',\n skillName: sanitizeSkillName(input.skillName),\n researchSources: [],\n error: message,\n };\n }\n}\n","/**\n * Tool 4: install_skill\n * Core installation tool with three-path strategy\n *\n * PATH A (primary): Return npx command string for agent to execute\n * PATH B (fallback): Direct GitHub fetch + disk write\n * PATH C (last resort): Call generate_skill when both fail\n */\n\nimport { z } from 'zod';\nimport * as path from 'node:path';\nimport fs from 'fs-extra';\nconst { ensureDirSync, writeFileSync, existsSync } = fs;\nimport { getSkillPath } from '../lib/agent-paths.js';\nimport { fetchSkillFromGitHub } from '../lib/github.js';\nimport { sanitizeSkillName } from '../lib/skill-sanitizer.js';\nimport { trackInstalledSkill } from '../lib/config.js';\nimport { parseSkillMd } from '../lib/skill-parser.js';\nimport { generateSkill } from './generate-skill.js';\n\nexport const InstallSkillInputSchema = z.object({\n projectPath: z.string().describe('Absolute path to project root directory'),\n skillName: z.string().describe('Skill name to install'),\n agents: z.array(z.string()).describe('List of target agent names'),\n source: z.object({\n type: z.enum(['github', 'content']).describe('Source type'),\n owner: z.string().optional().describe('GitHub owner (for type: github)'),\n repo: z.string().optional().describe('GitHub repo (for type: github)'),\n content: z.string().optional().describe('Direct SKILL.md content (for type: content)'),\n stars: z.number().optional().describe('GitHub star count (for quality check)'),\n }).describe('Skill source'),\n overwrite: z.boolean().optional().default(false).describe('Overwrite existing skill if present'),\n global: z.boolean().optional().default(false).describe('Install to global scope'),\n});\n\nexport type InstallSkillInput = z.infer<typeof InstallSkillInputSchema>;\n\nexport type InstallMethod = 'npx_command' | 'direct_write' | 'generated' | 'skipped';\n\nexport interface AgentInstallResult {\n agent: string;\n path: string;\n method: InstallMethod;\n success: boolean;\n error?: string;\n}\n\nexport interface InstallSkillResult {\n method: InstallMethod;\n command?: string;\n instruction?: string;\n results: AgentInstallResult[];\n skillName: string;\n error?: string;\n}\n\n/**\n * Main install_skill handler with three-path installation strategy.\n *\n * PATH A (npx_command): Primary, preferred method\n * - Used when source.type === 'github' and stars >= 50\n * - Returns npx command string for agent to execute\n * - Command format: npx skills add <owner/repo> --skill <name> --agent <agent1> --agent <agent2> -y\n * - Never executes the command - agent does that\n *\n * PATH B (direct_write): Fallback method\n * - Used when PATH A not applicable or source.type === 'content'\n * - Fetches SKILL.md from GitHub raw URLs or uses provided content\n * - Writes directly to disk using fs-extra\n *\n * PATH C (generated): Last resort\n * - Used when PATH A and B both fail\n * - Calls generate_skill to create new skill via LLM\n *\n * @param input - Installation input with project path, skill name, agents, source\n * @returns Installation result with method, command (if PATH A), and per-agent results\n */\nexport async function installSkill(input: InstallSkillInput): Promise<InstallSkillResult> {\n try {\n const { projectPath, skillName, agents, source, overwrite, global } = input;\n\n // Sanitize skill name for filesystem safety\n const sanitizedSkillName = sanitizeSkillName(skillName);\n\n // Validate sanitized name\n if (!sanitizedSkillName || sanitizedSkillName.length === 0) {\n return {\n method: 'skipped',\n results: [],\n skillName: skillName,\n error: `Invalid skill name: \"${skillName}\". Skill names must contain alphanumeric characters.`,\n };\n }\n\n // Check for overwrite requirements - scan all agents first\n if (!overwrite) {\n const existingPaths: string[] = [];\n for (const agent of agents) {\n const skillPath = getSkillPath(agent, projectPath, sanitizedSkillName, global);\n if (existsSync(skillPath)) {\n existingPaths.push(skillPath);\n }\n }\n\n if (existingPaths.length > 0) {\n // Skill exists, return skipped\n return {\n method: 'skipped',\n results: agents.map(agent => ({\n agent,\n path: getSkillPath(agent, projectPath, sanitizedSkillName, global),\n method: 'skipped',\n success: true,\n error: 'Skill already exists. Use overwrite flag to replace.',\n })),\n skillName: sanitizedSkillName,\n };\n }\n }\n\n // PATH A: Return npx command string (primary method)\n if (source.type === 'github' && source.owner && source.repo) {\n const stars = source.stars ?? 0;\n\n // Use PATH A if quality is high (stars >= 50)\n if (stars >= 50) {\n return executePathA(source.owner, source.repo, sanitizedSkillName, agents, projectPath, global);\n }\n }\n\n // PATH B: Direct write (fallback method)\n let skillContent: string | null = null;\n\n if (source.type === 'content' && source.content) {\n // Content provided directly\n skillContent = source.content;\n } else if (source.type === 'github' && source.owner && source.repo) {\n // Fetch from GitHub\n const githubToken = process.env.GITHUB_TOKEN;\n const fetchResult = await fetchSkillFromGitHub(\n source.owner,\n source.repo,\n sanitizedSkillName,\n githubToken\n );\n\n if (fetchResult.found) {\n skillContent = fetchResult.content;\n }\n }\n\n // If PATH B succeeded, write to disk\n if (skillContent) {\n return await executePathB(\n skillContent,\n sanitizedSkillName,\n agents,\n projectPath,\n global,\n overwrite,\n source.type === 'github' ? `${source.owner}/${source.repo}` : 'direct-content'\n );\n }\n\n // PATH C: Generate skill as last resort\n return await executePathC(skillName, sanitizedSkillName, agents, projectPath, global, overwrite);\n\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n method: 'skipped',\n results: [],\n skillName: input.skillName,\n error: `Installation failed: ${message}`,\n };\n }\n}\n\n/**\n * PATH A: Returns npx command string for agent to execute.\n * This is the preferred method for high-quality GitHub repos (stars >= 50).\n *\n * CRITICAL: This function NEVER executes the command - it returns it as a string.\n * The AI agent receiving this result will execute it via its bash tool.\n */\nfunction executePathA(\n owner: string,\n repo: string,\n skillName: string,\n agents: string[],\n projectPath: string,\n global: boolean\n): InstallSkillResult {\n // Build npx command with all required flags\n const agentFlags = agents.map(agent => `--agent ${agent}`).join(' ');\n const globalFlag = global ? '-g' : '';\n const repoPath = `${owner}/${repo}`;\n\n // Always include -y flag for non-interactive execution\n const command = `npx skills add ${repoPath} --skill ${skillName} ${agentFlags} ${globalFlag} -y`.trim().replace(/\\s+/g, ' ');\n\n // Include GITHUB_TOKEN in environment if available\n const envNote = process.env.GITHUB_TOKEN\n ? 'GITHUB_TOKEN is available in environment (higher rate limits).'\n : 'Note: Set GITHUB_TOKEN environment variable for higher GitHub API rate limits.';\n\n const instruction = `Execute this command in your terminal now. The command will install the skill to all specified agents without any interactive prompts.\\n\\n${envNote}`;\n\n // Create result entries for each agent\n const results: AgentInstallResult[] = agents.map(agent => ({\n agent,\n path: getSkillPath(agent, projectPath, skillName, global),\n method: 'npx_command' as InstallMethod,\n success: true, // Command generation succeeded; actual execution is agent's responsibility\n }));\n\n return {\n method: 'npx_command',\n command,\n instruction,\n results,\n skillName,\n };\n}\n\n/**\n * PATH B: Direct GitHub fetch + disk write.\n * Writes SKILL.md content directly to all agent skill directories.\n */\nasync function executePathB(\n content: string,\n skillName: string,\n agents: string[],\n projectPath: string,\n global: boolean,\n overwrite: boolean,\n source: string\n): Promise<InstallSkillResult> {\n const results: AgentInstallResult[] = [];\n\n // Validate content has proper SKILL.md structure\n const parsed = parseSkillMd(content);\n if (!parsed) {\n return {\n method: 'direct_write',\n results: [],\n skillName,\n error: 'Invalid SKILL.md content: missing or invalid YAML frontmatter',\n };\n }\n\n // Write to each agent's skill directory\n for (const agent of agents) {\n try {\n const skillPath = getSkillPath(agent, projectPath, skillName, global);\n const skillDir = path.dirname(skillPath);\n\n // Check if exists and overwrite is false\n if (existsSync(skillPath) && !overwrite) {\n results.push({\n agent,\n path: skillPath,\n method: 'skipped',\n success: true,\n error: 'Skill already exists. Use overwrite flag to replace.',\n });\n continue;\n }\n\n // Create directory structure\n ensureDirSync(skillDir);\n\n // Write SKILL.md file with 15s timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 15000);\n\n try {\n writeFileSync(skillPath, content, 'utf-8');\n clearTimeout(timeoutId);\n\n results.push({\n agent,\n path: skillPath,\n method: 'direct_write',\n success: true,\n });\n } catch (writeErr) {\n clearTimeout(timeoutId);\n throw writeErr;\n }\n } catch (agentErr) {\n const message = agentErr instanceof Error ? agentErr.message : String(agentErr);\n results.push({\n agent,\n path: getSkillPath(agent, projectPath, skillName, global),\n method: 'direct_write',\n success: false,\n error: `Write failed: ${message}`,\n });\n }\n }\n\n // Track installation in config\n const successfulAgents = results.filter(r => r.success).map(r => r.agent);\n if (successfulAgents.length > 0) {\n await trackInstalledSkill(projectPath, skillName, successfulAgents, source);\n }\n\n const allSucceeded = results.every(r => r.success);\n\n return {\n method: 'direct_write',\n results,\n skillName,\n error: allSucceeded ? undefined : 'Some installations failed. Check individual agent results.',\n };\n}\n\n/**\n * PATH C: Generate skill via LLM when no existing skill is found.\n * This is the last resort fallback when both PATH A and B fail.\n */\nasync function executePathC(\n originalSkillName: string,\n sanitizedSkillName: string,\n agents: string[],\n projectPath: string,\n global: boolean,\n overwrite: boolean\n): Promise<InstallSkillResult> {\n try {\n // Build project context - use minimal context for now\n // In practice, the agent calling this tool should provide rich context\n const projectContext = `Generating skill for: ${originalSkillName}\nProject path: ${projectPath}\nTarget agents: ${agents.join(', ')}`;\n\n // Call generate_skill\n const generateResult = await generateSkill({\n skillName: originalSkillName,\n projectContext,\n maxResearchResults: 10,\n });\n\n if (!generateResult.success || !generateResult.content) {\n return {\n method: 'generated',\n results: [],\n skillName: sanitizedSkillName,\n error: generateResult.error || 'Skill generation failed',\n };\n }\n\n // Use PATH B to write the generated content\n const pathBResult = await executePathB(\n generateResult.content,\n sanitizedSkillName,\n agents,\n projectPath,\n global,\n overwrite,\n 'generated'\n );\n\n // Override method to indicate this was generated\n return {\n ...pathBResult,\n method: 'generated',\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n method: 'generated',\n results: [],\n skillName: sanitizedSkillName,\n error: `Generation failed: ${message}`,\n };\n }\n}\n","/**\n * Tool 6: list_installed_skills\n * Lists all installed skills across all agents\n */\n\nimport { z } from 'zod';\nimport { AGENT_PATHS, detectInstalledAgents } from '../lib/agent-paths.js';\nimport { parseSkillMd } from '../lib/skill-parser.js';\nimport fs from 'fs-extra';\nconst { readdirSync, statSync, readFileSync, existsSync } = fs;\nimport * as path from 'node:path';\nimport * as os from 'node:os';\n\nexport const ListSkillsInputSchema = z.object({\n projectPath: z.string().describe('Absolute path to project root directory'),\n agent: z.string().optional().describe('Filter by specific agent name'),\n global: z.boolean().optional().default(false).describe('List global skills instead of project skills'),\n});\n\nexport type ListSkillsInput = z.infer<typeof ListSkillsInputSchema>;\n\nexport interface InstalledSkillInfo {\n name: string;\n agent: string;\n path: string;\n description: string;\n tags: string[];\n source?: string;\n lastModified: string;\n}\n\nexport interface ListSkillsResult {\n success: boolean;\n skills: InstalledSkillInfo[];\n totalCount: number;\n byAgent: Record<string, number>;\n error?: string;\n}\n\n/**\n * Lists all installed skills across agent directories\n * Reads all agent skill directories in project (or global)\n * Parses each SKILL.md file to extract metadata\n * Returns grouped list with descriptions and sources\n */\nexport async function listSkills(input: ListSkillsInput): Promise<ListSkillsResult> {\n try {\n const { projectPath, agent, global } = input;\n\n const skills: InstalledSkillInfo[] = [];\n const byAgent: Record<string, number> = {};\n\n // Determine which agents to scan\n let agentsToScan: string[];\n\n if (agent) {\n // Single agent filter\n agentsToScan = [agent];\n } else {\n // All detected agents\n if (global) {\n // For global, scan all known agents\n agentsToScan = Object.keys(AGENT_PATHS);\n } else {\n // For project, only scan detected agents\n agentsToScan = await detectInstalledAgents(projectPath);\n }\n }\n\n // Scan each agent's skill directory\n for (const agentId of agentsToScan) {\n const agentConfig = AGENT_PATHS[agentId];\n if (!agentConfig) continue;\n\n let skillsDir: string;\n\n if (global) {\n skillsDir = agentConfig.globalPath.replace(/^~/, os.homedir());\n } else {\n skillsDir = path.join(projectPath, agentConfig.projectPath);\n }\n\n // Check if directory exists\n if (!existsSync(skillsDir)) {\n continue;\n }\n\n try {\n // Read all skill folders\n const entries = readdirSync(skillsDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n const skillName = entry.name;\n const skillPath = path.join(skillsDir, skillName, 'SKILL.md');\n\n // Check if SKILL.md exists\n if (!existsSync(skillPath)) {\n continue;\n }\n\n try {\n const content = readFileSync(skillPath, 'utf-8');\n const stats = statSync(skillPath);\n const parsed = parseSkillMd(content);\n\n const skillInfo: InstalledSkillInfo = {\n name: skillName,\n agent: agentId,\n path: skillPath,\n description: parsed?.metadata.description || 'No description',\n tags: parsed?.metadata.tags || [],\n source: parsed?.metadata.sources?.[0],\n lastModified: stats.mtime.toISOString(),\n };\n\n skills.push(skillInfo);\n byAgent[agentId] = (byAgent[agentId] || 0) + 1;\n } catch (readErr) {\n // Skip skills that can't be read or parsed\n continue;\n }\n }\n } catch (dirErr) {\n // Skip agents whose directories can't be read\n continue;\n }\n }\n\n // Sort by agent, then by name\n skills.sort((a, b) => {\n if (a.agent !== b.agent) {\n return a.agent.localeCompare(b.agent);\n }\n return a.name.localeCompare(b.name);\n });\n\n return {\n success: true,\n skills,\n totalCount: skills.length,\n byAgent,\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n success: false,\n skills: [],\n totalCount: 0,\n byAgent: {},\n error: message,\n };\n }\n}\n","/**\n * Tool 7: delete_skill\n * Removes a skill from agent directories\n */\n\nimport { z } from 'zod';\nimport { AGENT_PATHS, detectInstalledAgents } from '../lib/agent-paths.js';\nimport { sanitizeSkillName } from '../lib/skill-sanitizer.js';\nimport { untrackSkill } from '../lib/config.js';\nimport fs from 'fs-extra';\nconst { removeSync, existsSync } = fs;\nimport * as path from 'node:path';\nimport * as os from 'node:os';\n\nexport const DeleteSkillInputSchema = z.object({\n projectPath: z.string().describe('Absolute path to project root directory'),\n skillName: z.string().describe('Skill name to delete'),\n agents: z.array(z.string()).optional().describe('Target agents (if omitted, deletes from all agents)'),\n global: z.boolean().optional().default(false).describe('Delete from global scope'),\n});\n\nexport type DeleteSkillInput = z.infer<typeof DeleteSkillInputSchema>;\n\nexport interface AgentDeleteResult {\n agent: string;\n path: string;\n deleted: boolean;\n notFound: boolean;\n error?: string;\n}\n\nexport interface DeleteSkillResult {\n success: boolean;\n results: AgentDeleteResult[];\n skillName: string;\n totalDeleted: number;\n error?: string;\n}\n\n/**\n * Removes SKILL.md from specified agent directories\n * Updates .skillmesh/skillmesh.config.json to remove tracking\n * Returns success/failure per agent\n */\nexport async function deleteSkill(input: DeleteSkillInput): Promise<DeleteSkillResult> {\n try {\n const { projectPath, skillName, agents, global } = input;\n\n // Sanitize skill name\n const sanitizedName = sanitizeSkillName(skillName);\n\n // Determine which agents to delete from\n let targetAgents: string[];\n\n if (agents && agents.length > 0) {\n targetAgents = agents;\n } else {\n // Delete from all detected agents\n if (global) {\n targetAgents = Object.keys(AGENT_PATHS);\n } else {\n targetAgents = await detectInstalledAgents(projectPath);\n }\n }\n\n const results: AgentDeleteResult[] = [];\n let totalDeleted = 0;\n\n // Delete from each agent\n for (const agentId of targetAgents) {\n const agentConfig = AGENT_PATHS[agentId];\n\n if (!agentConfig) {\n results.push({\n agent: agentId,\n path: '',\n deleted: false,\n notFound: true,\n error: 'Unknown agent',\n });\n continue;\n }\n\n let skillDir: string;\n\n if (global) {\n const skillsDir = agentConfig.globalPath.replace(/^~/, os.homedir());\n skillDir = path.join(skillsDir, sanitizedName);\n } else {\n const skillsDir = path.join(projectPath, agentConfig.projectPath);\n skillDir = path.join(skillsDir, sanitizedName);\n }\n\n // Check if skill exists\n if (!existsSync(skillDir)) {\n results.push({\n agent: agentId,\n path: skillDir,\n deleted: false,\n notFound: true,\n });\n continue;\n }\n\n // Delete the skill directory\n try {\n removeSync(skillDir);\n\n // Update config to remove tracking (project scope only)\n if (!global) {\n try {\n await untrackSkill(projectPath, sanitizedName, agentId);\n } catch (configErr) {\n // Non-fatal: skill is deleted even if config update fails\n }\n }\n\n results.push({\n agent: agentId,\n path: skillDir,\n deleted: true,\n notFound: false,\n });\n\n totalDeleted++;\n } catch (deleteErr) {\n const message = deleteErr instanceof Error ? deleteErr.message : String(deleteErr);\n results.push({\n agent: agentId,\n path: skillDir,\n deleted: false,\n notFound: false,\n error: message,\n });\n }\n }\n\n return {\n success: true,\n results,\n skillName: sanitizedName,\n totalDeleted,\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n success: false,\n results: [],\n skillName: input.skillName,\n totalDeleted: 0,\n error: message,\n };\n }\n}\n","/**\n * MCP system prompt resource\n * Injected to AI agent on MCP server connection\n */\n\n/**\n * Main system prompt for AI agents connected to SkillMesh MCP server.\n * Defines when and how to use the 8 SkillMesh tools to set up and manage Agent Skills.\n */\nexport const SYSTEM_PROMPT = `You are connected to SkillMesh, an intelligent Agent Skills manager.\nYou have 8 tools to discover, fetch, generate, and install SKILL.md files that permanently teach you and other agents about this project.\n\n## WHAT IS AN AGENT SKILL\n\nA SKILL.md file that lives in your agent's skill directory. You read all SKILL.md files at the start of every session — skills are always present when the user prompts. Installing a skill permanently teaches you project-specific rules, patterns, conventions, and best practices.\n\n## THE 8 SKILLMESH TOOLS\n\n1. detect_installed_agents — Scans project root and home directory for installed AI coding agents. Returns list with their skill directory paths.\n\n2. create_skills_folder — Initializes skill directory structure for selected agents. Creates .claude/skills/, .cursor/skills/, etc. Also creates .skillmesh/skillmesh.config.json for tracking.\n\n3. search_skills — Searches skills.sh via Tavily for skills matching a keyword. Fetches GitHub star count and recency. Returns ranked list filtered by quality (stars >= 50, updated within 12 months).\n\n4. fetch_skill_content — Fetches full SKILL.md content from a GitHub repository using raw URL fallbacks. Validates YAML frontmatter. Returns content, source URL, and parsed metadata.\n\n5. install_skill — Core installation tool. PATH A: returns npx skills add command string for you to execute via your bash tool. PATH B: writes SKILL.md directly to disk if npx fails. PATH C: calls generate_skill if both fail. Handles all selected agents simultaneously.\n\n6. generate_skill — LLM-powered skill generation. Searches web via Tavily for best practices, sends research + project context to LLM, generates a gold-standard SKILL.md. Only called when PATH A and B fail.\n\n7. list_installed_skills — Reads all agent skill directories in the project. Returns table of installed skills grouped by agent with name, description, source, and last modified date.\n\n8. delete_skill — Removes a specific SKILL.md from one or all agent directories. Returns success/failure per agent.\n\n## WHEN TO RUN THE FULL SKILL SETUP WORKFLOW\n\nAutomatically trigger when the user says anything resembling:\n- 'set up skills'\n- 'add skills'\n- 'install skills'\n- 'analyze my project and add skills'\n- 'make my agent smarter'\n- 'skillmesh'\n- 'initialize skills'\n\nRun immediately without asking for confirmation.\n\n## FULL SKILL SETUP WORKFLOW (execute in this exact order)\n\nSTEP 1: Detect agents\n- Call detect_installed_agents with current project path\n- If no agents detected, inform user and stop\n\nSTEP 2: Initialize directories\n- Call create_skills_folder for all detected agents\n- This ensures skill directories exist before installation\n\nSTEP 3: Analyze codebase thoroughly\nScan the project and identify:\n- Primary language and framework (e.g., TypeScript, React, Next.js)\n- Key dependencies and their versions (read package.json, requirements.txt, etc.)\n- Architectural patterns (e.g., App Router, REST API, GraphQL)\n- Folder structure and conventions (e.g., /src, /app, /components)\n- Test setup (Jest, Vitest, Playwright, etc.)\n- Database and ORM (Prisma, Drizzle, MongoDB, etc.)\n- Auth system (NextAuth, Clerk, Auth0, etc.)\n- API patterns (REST, tRPC, GraphQL)\n- Deployment config (Vercel, Docker, AWS, etc.)\n\nSTEP 4: Derive skill domains\nFrom your analysis, identify 4-8 specific skill domains using kebab-case names.\n\nGOOD examples:\n- nextjs-app-router-patterns\n- prisma-multi-tenant-schema\n- react-hook-form-validation\n- tailwind-component-architecture\n- playwright-e2e-testing\n- trpc-api-patterns\n\nBAD examples (too generic):\n- javascript\n- frontend\n- react\n- coding\n- testing\n\nSTEP 5: Install skills for each domain\nFor each domain you identified:\n\na. Call search_skills(domain)\n - This searches skills.sh via Tavily\n - Returns quality-filtered results (stars >= 50, updated within 12 months)\n\nb. If quality results found (stars >= 50):\n - Call fetch_skill_content for the top result\n - Review the content to ensure it matches your needs\n - Call install_skill with source type 'github' and the owner/repo/stars data\n - install_skill returns a PATH A response: an npx command string\n - YOU MUST EXECUTE THIS COMMAND using your bash tool immediately\n - Example command: npx skills add vercel-labs/next-skills --skill nextjs-patterns --agent claude-code --agent cursor -y\n - The command is fully non-interactive (no prompts) thanks to --agent flags and -y flag\n\nc. If no quality results OR PATH A fails:\n - Call install_skill with source type 'github' (if you have owner/repo) or 'content' (if you have raw content)\n - This triggers PATH B: direct write to disk\n - If PATH B also fails OR no GitHub source exists:\n - Call generate_skill with rich projectContext\n - Then call install_skill with source type 'content' using the generated content\n\nSTEP 6: Report results\n- Call list_installed_skills to see all installed skills\n- Present a summary table to the user grouped by agent\n- Highlight which skills were installed (PATH A, PATH B, or generated)\n\n## CRITICAL REQUIREMENTS\n\nPROJECTCONTEXT QUALITY:\nWhen calling generate_skill, always provide detailed projectContext. Include:\n- Exact framework versions from package.json/requirements.txt\n- Key architectural patterns observed in the code\n- Specific folder structure and file naming conventions\n- Main dependencies and how they interact\n- Any coding conventions found in existing files\nThe richer the context, the more useful the generated skill.\n\nEXECUTION RULES:\n- NEVER ask the user to confirm before running the workflow\n- NEVER install the same skill twice — call list_installed_skills first and check for duplicates\n- ALWAYS install to all detected agents simultaneously\n- ALWAYS execute npx commands returned by install_skill (PATH A) using your bash tool\n- NEVER manually write SKILL.md files — always use install_skill tool\n\nERROR HANDLING:\n- If search_skills returns no results, immediately fall back to generate_skill\n- If install_skill PATH A fails (npx error), the tool automatically falls back to PATH B\n- If PATH B fails (fetch error), the tool automatically falls back to PATH C (generate)\n- Always report errors clearly to the user and show which skills succeeded vs failed\n\n## SKILL INSTALLATION PATHS EXPLAINED\n\nPATH A (npx command — preferred):\n- Used for high-quality GitHub repos (stars >= 50)\n- install_skill returns an npx command string\n- YOU execute it using your bash tool\n- Command format: npx skills add <owner/repo> --skill <name> --agent <agent1> --agent <agent2> -y\n- The npx CLI handles cloning, writing, and directory creation\n- Fully automated with zero interactive prompts\n\nPATH B (direct write — fallback):\n- Used when PATH A not applicable or GitHub fetch available but stars < 50\n- install_skill fetches raw SKILL.md from GitHub\n- Writes directly to all agent directories using fs-extra\n- Updates .skillmesh/skillmesh.config.json for tracking\n\nPATH C (LLM generation — last resort):\n- Used when no existing skill found on GitHub\n- Requires ANTHROPIC_API_KEY, GOOGLE_API_KEY, or OPENAI_API_KEY in env\n- Searches web via Tavily for best practices\n- Generates gold-standard SKILL.md from research + project context\n- Writes to all agent directories\n\n## TYPICAL USER INTERACTION EXAMPLE\n\nUser: \"Set up skills for my Next.js project\"\n\nYou:\n1. [Call detect_installed_agents] → Found: claude-code, cursor\n2. [Call create_skills_folder] → Created .claude/skills/ and .cursor/skills/\n3. [Analyze project] → Next.js 15, App Router, TypeScript, Prisma, TailwindCSS\n4. [Derive domains] → nextjs-app-router-patterns, prisma-schema-design, tailwindcss-components\n5. For nextjs-app-router-patterns:\n - [Call search_skills] → Found vercel-labs/next-skills (2,341 stars)\n - [Call fetch_skill_content] → Retrieved SKILL.md\n - [Call install_skill] → Returns npx command\n - [Execute via bash] → npx skills add vercel-labs/next-skills --skill nextjs-app-router-patterns --agent claude-code --agent cursor -y\n6. [Repeat for other domains]\n7. [Call list_installed_skills] → Report summary table\n\nUser sees: \"Installed 3 skills across 2 agents (claude-code, cursor). You now have permanent knowledge of Next.js App Router patterns, Prisma schema design, and TailwindCSS component architecture.\"\n\n## NOTES\n\n- Skill names on disk are sanitized to kebab-case: toLowerCase().replace(/[^a-z0-9-]/g, '-')\n- GITHUB_TOKEN is optional but recommended for higher API rate limits (5000/hr vs 60/hr)\n- LLM API keys are only needed for generate_skill (PATH C)\n- Always use absolute paths, never relative paths\n- Target directories: .claude/skills/, .cursor/skills/, .agent/skills/, .windsurf/skills/, etc.\n`;\n\n/**\n * Skill generation system prompt (used internally by generate_skill tool)\n * Not exposed to AI agents - only used by the tool implementation\n */\nexport const SKILL_GENERATION_PROMPT = `You are an expert at creating high-quality Agent Skills (SKILL.md files).\n\nCreate skills that follow this exact gold-standard structure with all required sections.`;\n","#!/usr/bin/env node\n\n/**\n * SkillMesh MCP Server\n * Main entry point - registers all tools and starts StdioServerTransport\n */\n\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\n\n// Import tool schemas and handlers\nimport { DetectAgentsInputSchema, detectAgents } from './tools/detect-agents.js';\nimport { CreateFolderInputSchema, createFolder } from './tools/create-folder.js';\nimport { SearchSkillsInputSchema, searchSkills } from './tools/search-skills.js';\nimport { FetchSkillInputSchema, fetchSkillContent } from './tools/fetch-skill.js';\nimport { InstallSkillInputSchema, installSkill } from './tools/install-skill.js';\nimport { GenerateSkillInputSchema, generateSkill } from './tools/generate-skill.js';\nimport { ListSkillsInputSchema, listSkills } from './tools/list-skills.js';\nimport { DeleteSkillInputSchema, deleteSkill } from './tools/delete-skill.js';\nimport { SYSTEM_PROMPT } from './prompts/system-prompt.js';\n\nconst server = new Server(\n {\n name: 'skillmesh-mcp',\n version: '1.0.0',\n },\n {\n capabilities: {\n tools: {},\n },\n }\n);\n\n/**\n * Tool registration\n * Lists all 8 MCP tools with their schemas\n */\nserver.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: [\n {\n name: 'detect_installed_agents',\n description: 'Scans project root and home directory for installed AI coding agents. Returns list of detected agents with their skill directory paths.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: {\n type: 'string',\n description: 'Absolute path to project root directory',\n },\n includeGlobal: {\n type: 'boolean',\n description: 'Also scan home directory for globally installed agents',\n default: false,\n },\n },\n required: ['projectPath'],\n },\n },\n {\n name: 'create_skills_folder',\n description: 'Initializes skill directory structure for selected agents. Creates .claude/skills/, .cursor/skills/, etc. Also creates .skillmesh/skillmesh.config.json for tracking.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: {\n type: 'string',\n description: 'Absolute path to project root directory',\n },\n agents: {\n type: 'array',\n items: { type: 'string' },\n description: 'List of agent names to create folders for',\n },\n global: {\n type: 'boolean',\n description: 'Create in global scope instead of project scope',\n default: false,\n },\n },\n required: ['projectPath', 'agents'],\n },\n },\n {\n name: 'search_skills',\n description: 'Searches skills.sh via Tavily for skills matching a keyword. Fetches GitHub star count and recency. Returns ranked list filtered by quality (stars >= 50, updated within 12 months).',\n inputSchema: {\n type: 'object',\n properties: {\n keyword: {\n type: 'string',\n description: 'Search keyword or skill domain (e.g., \"nextjs-app-router\", \"prisma\")',\n },\n minStars: {\n type: 'number',\n description: 'Minimum GitHub stars filter',\n default: 50,\n },\n maxAgeMonths: {\n type: 'number',\n description: 'Maximum age in months (updated within)',\n default: 12,\n },\n limit: {\n type: 'number',\n description: 'Maximum number of results',\n default: 10,\n },\n },\n required: ['keyword'],\n },\n },\n {\n name: 'fetch_skill_content',\n description: 'Fetches full SKILL.md content from a GitHub repository using raw URL fallbacks. Validates YAML frontmatter. Returns content, source URL, and parsed metadata.',\n inputSchema: {\n type: 'object',\n properties: {\n owner: {\n type: 'string',\n description: 'GitHub repository owner',\n },\n repo: {\n type: 'string',\n description: 'GitHub repository name',\n },\n skillName: {\n type: 'string',\n description: 'Skill name to fetch',\n },\n githubToken: {\n type: 'string',\n description: 'Optional GitHub token for higher rate limits',\n },\n },\n required: ['owner', 'repo', 'skillName'],\n },\n },\n {\n name: 'install_skill',\n description: 'Core installation tool. PATH A: returns npx skills add command string for agent to execute. PATH B: writes SKILL.md directly to disk if npx fails. Handles all selected agents simultaneously.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: {\n type: 'string',\n description: 'Absolute path to project root directory',\n },\n skillName: {\n type: 'string',\n description: 'Skill name to install',\n },\n agents: {\n type: 'array',\n items: { type: 'string' },\n description: 'List of target agent names',\n },\n source: {\n type: 'object',\n properties: {\n type: {\n type: 'string',\n enum: ['github', 'content'],\n description: 'Source type',\n },\n owner: {\n type: 'string',\n description: 'GitHub owner (for type: github)',\n },\n repo: {\n type: 'string',\n description: 'GitHub repo (for type: github)',\n },\n content: {\n type: 'string',\n description: 'Direct SKILL.md content (for type: content)',\n },\n },\n required: ['type'],\n description: 'Skill source',\n },\n overwrite: {\n type: 'boolean',\n description: 'Overwrite existing skill if present',\n default: false,\n },\n global: {\n type: 'boolean',\n description: 'Install to global scope',\n default: false,\n },\n },\n required: ['projectPath', 'skillName', 'agents', 'source'],\n },\n },\n {\n name: 'generate_skill',\n description: 'LLM-powered skill generation. Searches web via Tavily for best practices, sends research + project context to LLM, generates a gold-standard SKILL.md. Only called when search and fetch fail.',\n inputSchema: {\n type: 'object',\n properties: {\n skillName: {\n type: 'string',\n description: 'Skill name/domain to generate',\n },\n projectContext: {\n type: 'string',\n description: 'Rich project context: frameworks, versions, patterns, structure',\n },\n researchQuery: {\n type: 'string',\n description: 'Optional custom web research query',\n },\n maxResearchResults: {\n type: 'number',\n description: 'Maximum web research results',\n default: 10,\n },\n },\n required: ['skillName', 'projectContext'],\n },\n },\n {\n name: 'list_installed_skills',\n description: 'Reads all agent skill directories in the project. Returns table of installed skills grouped by agent with name, description, source, and last modified date.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: {\n type: 'string',\n description: 'Absolute path to project root directory',\n },\n agent: {\n type: 'string',\n description: 'Filter by specific agent name',\n },\n global: {\n type: 'boolean',\n description: 'List global skills instead of project skills',\n default: false,\n },\n },\n required: ['projectPath'],\n },\n },\n {\n name: 'delete_skill',\n description: 'Removes a specific SKILL.md from one or all agent directories. Returns success/failure per agent.',\n inputSchema: {\n type: 'object',\n properties: {\n projectPath: {\n type: 'string',\n description: 'Absolute path to project root directory',\n },\n skillName: {\n type: 'string',\n description: 'Skill name to delete',\n },\n agents: {\n type: 'array',\n items: { type: 'string' },\n description: 'Target agents (if omitted, deletes from all agents)',\n },\n global: {\n type: 'boolean',\n description: 'Delete from global scope',\n default: false,\n },\n },\n required: ['projectPath', 'skillName'],\n },\n },\n ],\n };\n});\n\n/**\n * Tool execution handler\n * Routes tool calls to appropriate implementation functions with Zod validation\n */\nserver.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n try {\n switch (name) {\n case 'detect_installed_agents': {\n const validated = DetectAgentsInputSchema.parse(args);\n const result = await detectAgents(validated);\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };\n }\n\n case 'create_skills_folder': {\n const validated = CreateFolderInputSchema.parse(args);\n const result = await createFolder(validated);\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };\n }\n\n case 'search_skills': {\n const validated = SearchSkillsInputSchema.parse(args);\n const result = await searchSkills(validated);\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };\n }\n\n case 'fetch_skill_content': {\n const validated = FetchSkillInputSchema.parse(args);\n const result = await fetchSkillContent(validated);\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };\n }\n\n case 'install_skill': {\n const validated = InstallSkillInputSchema.parse(args);\n const result = await installSkill(validated);\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };\n }\n\n case 'generate_skill': {\n const validated = GenerateSkillInputSchema.parse(args);\n const result = await generateSkill(validated);\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };\n }\n\n case 'list_installed_skills': {\n const validated = ListSkillsInputSchema.parse(args);\n const result = await listSkills(validated);\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };\n }\n\n case 'delete_skill': {\n const validated = DeleteSkillInputSchema.parse(args);\n const result = await deleteSkill(validated);\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };\n }\n\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({ error: errorMessage }, null, 2),\n },\n ],\n isError: true,\n };\n }\n});\n\n/**\n * Server startup\n * Connects via StdioServerTransport (local only, no HTTP)\n */\nasync function main() {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n // Log system prompt to stderr for debugging (not sent to MCP client)\n console.error('SkillMesh MCP Server running on stdio');\n console.error('System prompt loaded:', SYSTEM_PROMPT.substring(0, 100) + '...');\n}\n\nmain().catch((error) => {\n console.error('Fatal error in main():', error);\n process.exit(1);\n});\n"]}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "skillmesh-mcp",
3
+ "version": "1.0.0",
4
+ "description": "MCP server for discovering, fetching, and installing Agent Skills (SKILL.md files) from skills.sh",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "skillmesh-mcp": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "README.md"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsup",
16
+ "start": "node dist/index.js",
17
+ "dev": "tsx watch src/index.ts",
18
+ "test": "vitest",
19
+ "clean": "rm -rf dist",
20
+ "prepublishOnly": "npm run build"
21
+ },
22
+ "keywords": [
23
+ "mcp",
24
+ "model-context-protocol",
25
+ "agent-skills",
26
+ "claude",
27
+ "cursor",
28
+ "antigravity",
29
+ "windsurf",
30
+ "ai-agents",
31
+ "skill-mesh",
32
+ "skillmesh"
33
+ ],
34
+ "author": "",
35
+ "license": "MIT",
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "https://github.com/anthropics/skillmesh-mcp"
39
+ },
40
+ "homepage": "https://skills.sh",
41
+ "engines": {
42
+ "node": ">=18.0.0"
43
+ },
44
+ "dependencies": {
45
+ "@modelcontextprotocol/sdk": "^1.0.4",
46
+ "zod": "^3.24.1",
47
+ "fs-extra": "^11.2.0",
48
+ "js-yaml": "^4.1.0"
49
+ },
50
+ "devDependencies": {
51
+ "@types/fs-extra": "^11.0.4",
52
+ "@types/js-yaml": "^4.0.9",
53
+ "@types/node": "^22.10.5",
54
+ "tsup": "^8.3.5",
55
+ "tsx": "^4.19.2",
56
+ "typescript": "^5.7.2",
57
+ "vitest": "^2.1.8"
58
+ }
59
+ }