UNPKG

@dollhousemcp/mcp-server

Version:

DollhouseMCP - A Model Context Protocol (MCP) server that enables dynamic AI persona management from markdown files, allowing Claude and other compatible AI assistants to activate and switch between different behavioral personas.

99 lines 14.2 kB
/** * SchemaMapper - Bidirectional schema conversion between Anthropic Skills and DollhouseMCP Skills * * Based on the 1:1 mapping specification documented in: * business/documents/legal/evidence/anthropic-dollhouse-skills-mapping.md */ export class SchemaMapper { /** * Convert Anthropic frontmatter to DollhouseMCP metadata * Maps minimal Anthropic schema to rich DollhouseMCP schema */ anthropicToDollhouse(anthropicMeta, options) { const now = new Date().toISOString(); return { // Direct mappings (100% preserved) name: anthropicMeta.name, description: anthropicMeta.description, license: anthropicMeta.license, // DollhouseMCP-specific fields (added during conversion) type: options?.inferredType || 'skill', version: '1.0.0', // Default version for converted skills author: 'Anthropic', // Mark provenance created: now, modified: now, category: options?.inferredCategory, tags: options?.inferredTags || [], complexity: 'beginner', // Default complexity // Optional rich fields (empty by default) domains: [], dependencies: [], prerequisites: [], parameters: [], examples: [], languages: [], proficiency_level: 0, // Preserve any additional metadata custom: { source: 'anthropic-skills', converted: now } }; } /** * Convert DollhouseMCP metadata to Anthropic frontmatter * Strips DollhouseMCP-specific fields to create minimal Anthropic schema */ dollhouseToAnthropic(dollhouseMeta) { return { // Core required fields (100% preserved) name: dollhouseMeta.name, description: dollhouseMeta.description, // Optional field if present ...(dollhouseMeta.license && { license: dollhouseMeta.license }) }; } /** * Auto-generate tags from skill name and description */ inferTags(name, description) { const tags = []; const text = `${name} ${description}`.toLowerCase(); // Common tag patterns const tagPatterns = { communication: ['communication', 'comms', 'message', 'email'], documentation: ['document', 'docs', 'documentation'], code: ['code', 'programming', 'typescript', 'javascript', 'python'], automation: ['automat', 'script', 'batch'], modernization: ['modern', 'upgrade', 'migrate'], templates: ['template', 'example', 'format'], testing: ['test', 'validation', 'verify'] }; for (const [tag, patterns] of Object.entries(tagPatterns)) { if (patterns.some(pattern => text.includes(pattern))) { tags.push(tag); } } return tags; } /** * Infer category from skill name and description */ inferCategory(name, description) { const text = `${name} ${description}`.toLowerCase(); const categoryPatterns = { communication: ['communication', 'email', 'message', 'newsletter'], development: ['code', 'develop', 'programming', 'software'], documentation: ['document', 'docs', 'writing'], automation: ['automat', 'script', 'batch', 'workflow'], business: ['business', 'corporate', 'enterprise'] }; for (const [category, patterns] of Object.entries(categoryPatterns)) { if (patterns.some(pattern => text.includes(pattern))) { return category; } } return undefined; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NoZW1hTWFwcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnZlcnRlcnMvU2NoZW1hTWFwcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBOEJILE1BQU0sT0FBTyxZQUFZO0lBQ3JCOzs7T0FHRztJQUNILG9CQUFvQixDQUNoQixhQUFxQyxFQUNyQyxPQUlDO1FBRUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVyQyxPQUFPO1lBQ0gsbUNBQW1DO1lBQ25DLElBQUksRUFBRSxhQUFhLENBQUMsSUFBSTtZQUN4QixXQUFXLEVBQUUsYUFBYSxDQUFDLFdBQVc7WUFDdEMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxPQUFPO1lBRTlCLHlEQUF5RDtZQUN6RCxJQUFJLEVBQUUsT0FBTyxFQUFFLFlBQVksSUFBSSxPQUFPO1lBQ3RDLE9BQU8sRUFBRSxPQUFPLEVBQUUsdUNBQXVDO1lBQ3pELE1BQU0sRUFBRSxXQUFXLEVBQUUsa0JBQWtCO1lBQ3ZDLE9BQU8sRUFBRSxHQUFHO1lBQ1osUUFBUSxFQUFFLEdBQUc7WUFDYixRQUFRLEVBQUUsT0FBTyxFQUFFLGdCQUFnQjtZQUNuQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFlBQVksSUFBSSxFQUFFO1lBQ2pDLFVBQVUsRUFBRSxVQUFVLEVBQUUscUJBQXFCO1lBRTdDLDBDQUEwQztZQUMxQyxPQUFPLEVBQUUsRUFBRTtZQUNYLFlBQVksRUFBRSxFQUFFO1lBQ2hCLGFBQWEsRUFBRSxFQUFFO1lBQ2pCLFVBQVUsRUFBRSxFQUFFO1lBQ2QsUUFBUSxFQUFFLEVBQUU7WUFDWixTQUFTLEVBQUUsRUFBRTtZQUNiLGlCQUFpQixFQUFFLENBQUM7WUFFcEIsbUNBQW1DO1lBQ25DLE1BQU0sRUFBRTtnQkFDSixNQUFNLEVBQUUsa0JBQWtCO2dCQUMxQixTQUFTLEVBQUUsR0FBRzthQUNqQjtTQUNKLENBQUM7SUFD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ICogU2NoZW1hTWFwcGVyIC0gQmlkaXJlY3Rpb25hbCBzY2hlbWEgY29udmVyc2lvbiBiZXR3ZWVuIEFudGhyb3BpYyBTa2lsbHMgYW5kIERvbGxob3VzZU1DUCBTa2lsbHNcbiAqXG4gKiBCYXNlZCBvbiB0aGUgMToxIG1hcHBpbmcgc3BlY2lmaWNhdGlvbiBkb2N1bWVudGVkIGluOlxuICogYnVzaW5lc3MvZG9jdW1lbnRzL2xlZ2FsL2V2aWRlbmNlL2FudGhyb3BpYy1kb2xsaG91c2Utc2tpbGxzLW1hcHBpbmcubWRcbiAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIEFudGhyb3BpY1NraWxsTWV0YWRhdGEge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIGxpY2Vuc2U/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRG9sbGhvdXNlTUNQU2tpbGxNZXRhZGF0YSB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgdHlwZT86IHN0cmluZztcbiAgICB2ZXJzaW9uPzogc3RyaW5nO1xuICAgIGF1dGhvcj86IHN0cmluZztcbiAgICBjcmVhdGVkPzogc3RyaW5nO1xuICAgIG1vZGlmaWVkPzogc3RyaW5nO1xuICAgIGNhdGVnb3J5Pzogc3RyaW5nO1xuICAgIHRhZ3M/OiBzdHJpbmdbXTtcbiAgICBjb21wbGV4aXR5Pzogc3RyaW5nO1xuICAgIGRvbWFpbnM/OiBzdHJpbmdbXTtcbiAgICBkZXBlbmRlbmNpZXM/OiBzdHJpbmdbXTtcbiAgICBwcmVyZXF1aXNpdGVzPzogc3RyaW5nW107XG4gICAgcGFyYW1ldGVycz86IFJlY29yZDxzdHJpbmcsIGFueT5bXTtcbiAgICBleGFtcGxlcz86IFJlY29yZDxzdHJpbmcsIGFueT5bXTtcbiAgICBsYW5ndWFnZXM/OiBzdHJpbmdbXTtcbiAgICBwcm9maWNpZW5jeV9sZXZlbD86IG51bWJlcjtcbiAgICBsaWNlbnNlPzogc3RyaW5nO1xuICAgIGN1c3RvbT86IFJlY29yZDxzdHJpbmcsIGFueT47XG59XG5cbmV4cG9ydCBjbGFzcyBTY2hlbWFNYXBwZXIge1xuICAgIC8qKlxuICAgICAqIENvbnZlcnQgQW50aHJvcGljIGZyb250bWF0dGVyIHRvIERvbGxob3VzZU1DUCBtZXRhZGF0YVxuICAgICAqIE1hcHMgbWluaW1hbCBBbnRocm9waWMgc2NoZW1hIHRvIHJpY2ggRG9sbGhvdXNlTUNQIHNjaGVtYVxuICAgICAqL1xuICAgIGFudGhyb3BpY1RvRG9sbGhvdXNlKFxuICAgICAgICBhbnRocm9waWNNZXRhOiBBbnRocm9waWNTa2lsbE1ldGFkYXRhLFxuICAgICAgICBvcHRpb25zPzoge1xuICAgICAgICAgICAgaW5mZXJyZWRUeXBlPzogc3RyaW5nO1xuICAgICAgICAgICAgaW5mZXJyZWRUYWdzPzogc3RyaW5nW107XG4gICAgICAgICAgICBpbmZlcnJlZENhdGVnb3J5Pzogc3RyaW5nO1xuICAgICAgICB9XG4gICAgKTogRG9sbGhvdXNlTUNQU2tpbGxNZXRhZGF0YSB7XG4gICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLy8gRGlyZWN0IG1hcHBpbmdzICgxMDAlIHByZXNlcnZlZClcbiAgICAgICAgICAgIG5hbWU6IGFudGhyb3BpY01ldGEubmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBhbnRocm9waWNNZXRhLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgbGljZW5zZTogYW50aHJvcGljTWV0YS5saWNlbnNlLFxuXG4gICAgICAgICAgICAvLyBEb2xsaG91c2VNQ1Atc3BlY2lmaWMgZmllbGRzIChhZGRlZCBkdXJpbmcgY29udmVyc2lvbilcbiAgICAgICAgICAgIHR5cGU6IG9wdGlvbnM/LmluZmVycmVkVHlwZSB8fCAnc2tpbGwnLFxuICAgICAgICAgICAgdmVyc2lvbjogJzEuMC4wJywgLy8gRGVmYXVsdCB2ZXJzaW9uIGZvciBjb252ZXJ0ZWQgc2tpbGxzXG4gICAgICAgICAgICBhdXRob3I6ICdBbnRocm9waWMnLCAvLyBNYXJrIHByb3ZlbmFuY2VcbiAgICAgICAgICAgIGNyZWF0ZWQ6IG5vdyxcbiAgICAgICAgICAgIG1vZGlmaWVkOiBub3csXG4gICAgICAgICAgICBjYXRlZ29yeTogb3B0aW9ucz8uaW5mZXJyZWRDYXRlZ29yeSxcbiAgICAgICAgICAgIHRhZ3M6IG9wdGlvbnM/LmluZmVycmVkVGFncyB8fCBbXSxcbiAgICAgICAgICAgIGNvbXBsZXhpdHk6ICdiZWdpbm5lcicsIC8vIERlZmF1bHQgY29tcGxleGl0eVxuXG4gICAgICAgICAgICAvLyBPcHRpb25hbCByaWNoIGZpZWxkcyAoZW1wdHkgYnkgZGVmYXVsdClcbiAgICAgICAgICAgIGRvbWFpbnM6IFtdLFxuICAgICAgICAgICAgZGVwZW5kZW5jaWVzOiBbXSxcbiAgICAgICAgICAgIHByZXJlcXVpc2l0ZXM6IFtdLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogW10sXG4gICAgICAgICAgICBleGFtcGxlczogW10sXG4gICAgICAgICAgICBsYW5ndWFnZXM6IFtdLFxuICAgICAgICAgICAgcHJvZmljaWVuY3lfbGV2ZWw6IDAsXG5cbiAgICAgICAgICAgIC8vIFByZXNlcnZlIGFueSBhZGRpdGlvbmFsIG1ldGFkYXRhXG4gICAgICAgICAgICBjdXN0b206IHtcbiAgICAgICAgICAgICAgICBzb3VyY2U6ICdhbnRocm9waWMtc2tpbGxzJyxcbiAgICAgICAgICAgICAgICBjb252ZXJ0ZWQ6IG5vd1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgRG9sbGhvdXNlTUNQIG1ldGFkYXRhIHRvIEFudGhyb3BpYyBmcm9udG1hdHRlclxuICAgICAqIFN0cmlwcyBEb2xsaG91c2VNQ1Atc3BlY2lmaWMgZmllbGRzIHRvIGNyZWF0ZSBtaW5pbWFsIEFudGhyb3BpYyBzY2hlbWFcbiAgICAgKi9cbiAgICBkb2xsaG91c2VUb0FudGhyb3BpYyhcbiAgICAgICAgZG9sbGhvdXNlTWV0YTogRG9sbGhvdXNlTUNQU2tpbGxNZXRhZGF0YVxuICAgICk6IEFudGhyb3BpY1NraWxsTWV0YWRhdGEge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLy8gQ29yZSByZXF1aXJlZCBmaWVsZHMgKDEwMCUgcHJlc2VydmVkKVxuICAgICAgICAgICAgbmFtZTogZG9sbGhvdXNlTWV0YS5uYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGRvbGxob3VzZU1ldGEuZGVzY3JpcHRpb24sXG5cbiAgICAgICAgICAgIC8vIE9wdGlvbmFsIGZpZWxkIGlmIHByZXNlbnRcbiAgICAgICAgICAgIC4uLihkb2xsaG91c2VNZXRhLmxpY2Vuc2UgJiYgeyBsaWNlbnNlOiBkb2xsaG91c2VNZXRhLmxpY2Vuc2UgfSlcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdXRvLWdlbmVyYXRlIHRhZ3MgZnJvbSBza2lsbCBuYW1lIGFuZCBkZXNjcmlwdGlvblxuICAgICAqL1xuICAgIGluZmVyVGFncyhuYW1lOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IHRhZ3M6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGNvbnN0IHRleHQgPSBgJHtuYW1lfSAke2Rlc2NyaXB0aW9ufWAudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAvLyBDb21tb24gdGFnIHBhdHRlcm5zXG4gICAgICAgIGNvbnN0IHRhZ1BhdHRlcm5zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7XG4gICAgICAgICAgICBjb21tdW5pY2F0aW9uOiBbJ2NvbW11bmljYXRpb24nLCAnY29tbXMnLCAnbWVzc2FnZScsICdlbWFpbCddLFxuICAgICAgICAgICAgZG9jdW1lbnRhdGlvbjogWydkb2N1bWVudCcsICdkb2NzJywgJ2RvY3VtZW50YXRpb24nXSxcbiAgICAgICAgICAgIGNvZGU6IFsnY29kZScsICdwcm9ncmFtbWluZycsICd0eXBlc2NyaXB0JywgJ2phdmFzY3JpcHQnLCAncHl0aG9uJ10sXG4gICAgICAgICAgICBhdXRvbWF0aW9uOiBbJ2F1dG9tYXQnLCAnc2NyaXB0JywgJ2JhdGNoJ10sXG4gICAgICAgICAgICBtb2Rlcm5pemF0aW9uOiBbJ21vZGVybicsICd1cGdyYWRlJywgJ21pZ3JhdGUnXSxcbiAgICAgICAgICAgIHRlbXBsYXRlczogWyd0ZW1wbGF0ZScsICdleGFtcGxlJywgJ2Zvcm1hdCddLFxuICAgICAgICAgICAgdGVzdGluZzogWyd0ZXN0JywgJ3ZhbGlkYXRpb24nLCAndmVyaWZ5J11cbiAgICAgICAgfTtcblxuICAgICAgICBmb3IgKGNvbnN0IFt0YWcsIHBhdHRlcm5zXSBvZiBPYmplY3QuZW50cmllcyh0YWdQYXR0ZXJucykpIHtcbiAgICAgICAgICAgIGlmIChwYXR0ZXJucy5zb21lKHBhdHRlcm4gPT4gdGV4dC5pbmNsdWRlcyhwYXR0ZXJuKSkpIHtcbiAgICAgICAgICAgICAgICB0YWdzLnB1c2godGFnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0YWdzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluZmVyIGNhdGVnb3J5IGZyb20gc2tpbGwgbmFtZSBhbmQgZGVzY3JpcHRpb25cbiAgICAgKi9cbiAgICBpbmZlckNhdGVnb3J5KG5hbWU6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGNvbnN0IHRleHQgPSBgJHtuYW1lfSAke2Rlc2NyaXB0aW9ufWAudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBjb25zdCBjYXRlZ29yeVBhdHRlcm5zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7XG4gICAgICAgICAgICBjb21tdW5pY2F0aW9uOiBbJ2NvbW11bmljYXRpb24nLCAnZW1haWwnLCAnbWVzc2FnZScsICduZXdzbGV0dGVyJ10sXG4gICAgICAgICAgICBkZXZlbG9wbWVudDogWydjb2RlJywgJ2RldmVsb3AnLCAncHJvZ3JhbW1pbmcnLCAnc29mdHdhcmUnXSxcbiAgICAgICAgICAgIGRvY3VtZW50YXRpb246IFsnZG9jdW1lbnQnLCAnZG9jcycsICd3cml0aW5nJ10sXG4gICAgICAgICAgICBhdXRvbWF0aW9uOiBbJ2F1dG9tYXQnLCAnc2NyaXB0JywgJ2JhdGNoJywgJ3dvcmtmbG93J10sXG4gICAgICAgICAgICBidXNpbmVzczogWydidXNpbmVzcycsICdjb3Jwb3JhdGUnLCAnZW50ZXJwcmlzZSddXG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yIChjb25zdCBbY2F0ZWdvcnksIHBhdHRlcm5zXSBvZiBPYmplY3QuZW50cmllcyhjYXRlZ29yeVBhdHRlcm5zKSkge1xuICAgICAgICAgICAgaWYgKHBhdHRlcm5zLnNvbWUocGF0dGVybiA9PiB0ZXh0LmluY2x1ZGVzKHBhdHRlcm4pKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYXRlZ29yeTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuIl19