@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
JavaScript
/**
* 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