@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.
71 lines • 10.8 kB
JavaScript
/**
* Get content details from collection
*/
import { ContentValidator } from '../security/contentValidator.js';
import { SecureYamlParser } from '../security/secureYamlParser.js';
import { SecurityError } from '../errors/SecurityError.js';
export class PersonaDetails {
githubClient;
baseUrl = 'https://api.github.com/repos/DollhouseMCP/collection/contents';
constructor(githubClient) {
this.githubClient = githubClient;
}
/**
* Get detailed information about collection content
*/
async getCollectionContent(path) {
const url = `${this.baseUrl}/${path}`;
const data = await this.githubClient.fetchFromGitHub(url);
if (data.type !== 'file') {
throw new Error('Path does not point to a file');
}
// Decode Base64 content
const content = Buffer.from(data.content, 'base64').toString('utf-8');
// Sanitize content for display (this is view-only, not installation)
const sanitizedContent = ContentValidator.sanitizePersonaContent(content);
// Use secure YAML parser
let parsed;
try {
parsed = SecureYamlParser.safeMatter(sanitizedContent);
}
catch (error) {
if (error instanceof SecurityError) {
throw new Error(`Security warning: This content contains potentially malicious content - ${error.message}`);
}
throw error;
}
const metadata = parsed.data;
// Additional validation for display
const metadataValidation = ContentValidator.validateMetadata(metadata);
if (!metadataValidation.isValid && metadataValidation.severity === 'critical') {
throw new Error(`Security warning: This content contains potentially malicious content`);
}
return {
metadata,
content: parsed.content
};
}
/**
* Format persona details for display
*/
formatPersonaDetails(metadata, content, path, personaIndicator = '') {
const textParts = [
`${personaIndicator}🎭 **Collection Content: ${metadata.name}**\n\n`,
`**📋 Details:**\n`,
` 🆔 ID: ${metadata.unique_id || 'Not specified'}\n`,
` 👤 Author: ${metadata.author || 'Unknown'}\n`,
` 📁 Category: ${metadata.category || 'General'}\n`,
` 🔖 Price: ${metadata.price || 'Free'}\n`,
` 📊 Version: ${metadata.version || '1.0'}\n`,
` 🔞 Age Rating: ${metadata.age_rating || 'All'}\n`,
` ${metadata.ai_generated ? '🤖 AI Generated' : '👤 Human Created'}\n\n`,
`**📝 Description:**\n${metadata.description}\n\n`
];
if (metadata.triggers && metadata.triggers.length > 0) {
textParts.push(`**🔗 Triggers:** ${metadata.triggers.join(', ')}\n\n`);
}
textParts.push(`**📥 Installation:**\n`, `Use: \`install_content "${path}"\`\n\n`, `**📄 Full Content:**\n\`\`\`\n${content}\n\`\`\``);
return textParts.join('');
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGVyc29uYURldGFpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29sbGVjdGlvbi9QZXJzb25hRGV0YWlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUtILE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUUzRCxNQUFNLE9BQU8sY0FBYztJQUNqQixZQUFZLENBQWU7SUFDM0IsT0FBTyxHQUFHLCtEQUErRCxDQUFDO0lBRWxGLFlBQVksWUFBMEI7UUFDcEMsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7SUFDbkMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLG9CQUFvQixDQUFDLElBQVk7UUFDckMsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDO1FBRXRDLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFMUQsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBRUQsd0JBQXdCO1FBQ3hCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFdEUscUVBQXFFO1FBQ3JFLE1BQU0sZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFMUUseUJBQXlCO1FBQ3pCLElBQUksTUFBTSxDQUFDO1FBQ1gsSUFBSSxDQUFDO1lBQ0gsTUFBTSxHQUFHLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3pELENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxLQUFLLFlBQVksYUFBYSxFQUFFLENBQUM7Z0JBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsMkVBQTJFLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQzlHLENBQUM7WUFDRCxNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBdUIsQ0FBQztRQUVoRCxvQ0FBb0M7UUFDcEMsTUFBTSxrQkFBa0IsR0FBRyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxJQUFJLGtCQUFrQixDQUFDLFFBQVEsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUM5RSxNQUFNLElBQUksS0FBSyxDQUFDLHVFQUF1RSxDQUFDLENBQUM7UUFDM0YsQ0FBQztRQUVELE9BQU87WUFDTCxRQUFRO1lBQ1IsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1NBQ3hCLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxvQkFBb0IsQ0FBQyxRQUF5QixFQUFFLE9BQWUsRUFBRSxJQUFZLEVBQUUsbUJBQTJCLEVBQUU7UUFDMUcsTUFBTSxTQUFTLEdBQUc7WUFDaEIsR0FBRyxnQkFBZ0IsNEJBQTRCLFFBQVEsQ0FBQyxJQUFJLFFBQVE7WUFDcEUsbUJBQW1CO1lBQ25CLGFBQWEsUUFBUSxDQUFDLFNBQVMsSUFBSSxlQUFlLElBQUk7WUFDdEQsaUJBQWlCLFFBQVEsQ0FBQyxNQUFNLElBQUksU0FBUyxJQUFJO1lBQ2pELG1CQUFtQixRQUFRLENBQUMsUUFBUSxJQUFJLFNBQVMsSUFBSTtZQUNyRCxnQkFBZ0IsUUFBUSxDQUFDLEtBQUssSUFBSSxNQUFNLElBQUk7WUFDNUMsa0JBQWtCLFFBQVEsQ0FBQyxPQUFPLElBQUksS0FBSyxJQUFJO1lBQy9DLHFCQUFxQixRQUFRLENBQUMsVUFBVSxJQUFJLEtBQUssSUFBSTtZQUNyRCxNQUFNLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxrQkFBa0IsTUFBTTtZQUMxRSx3QkFBd0IsUUFBUSxDQUFDLFdBQVcsTUFBTTtTQUNuRCxDQUFDO1FBRUYsSUFBSSxRQUFRLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RELFNBQVMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBRUQsU0FBUyxDQUFDLElBQUksQ0FDWix3QkFBd0IsRUFDeEIsMkJBQTJCLElBQUksU0FBUyxFQUN4QyxpQ0FBaUMsT0FBTyxVQUFVLENBQ25ELENBQUM7UUFFRixPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDNUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZXQgY29udGVudCBkZXRhaWxzIGZyb20gY29sbGVjdGlvblxuICovXG5cbmltcG9ydCBtYXR0ZXIgZnJvbSAnZ3JheS1tYXR0ZXInO1xuaW1wb3J0IHsgR2l0SHViQ2xpZW50IH0gZnJvbSAnLi9HaXRIdWJDbGllbnQuanMnO1xuaW1wb3J0IHsgUGVyc29uYU1ldGFkYXRhIH0gZnJvbSAnLi4vdHlwZXMvcGVyc29uYS5qcyc7XG5pbXBvcnQgeyBDb250ZW50VmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvY29udGVudFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cmVZYW1sUGFyc2VyIH0gZnJvbSAnLi4vc2VjdXJpdHkvc2VjdXJlWWFtbFBhcnNlci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL1NlY3VyaXR5RXJyb3IuanMnO1xuXG5leHBvcnQgY2xhc3MgUGVyc29uYURldGFpbHMge1xuICBwcml2YXRlIGdpdGh1YkNsaWVudDogR2l0SHViQ2xpZW50O1xuICBwcml2YXRlIGJhc2VVcmwgPSAnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9Eb2xsaG91c2VNQ1AvY29sbGVjdGlvbi9jb250ZW50cyc7XG4gIFxuICBjb25zdHJ1Y3RvcihnaXRodWJDbGllbnQ6IEdpdEh1YkNsaWVudCkge1xuICAgIHRoaXMuZ2l0aHViQ2xpZW50ID0gZ2l0aHViQ2xpZW50O1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IGNvbGxlY3Rpb24gY29udGVudFxuICAgKi9cbiAgYXN5bmMgZ2V0Q29sbGVjdGlvbkNvbnRlbnQocGF0aDogc3RyaW5nKTogUHJvbWlzZTx7IG1ldGFkYXRhOiBQZXJzb25hTWV0YWRhdGE7IGNvbnRlbnQ6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5iYXNlVXJsfS8ke3BhdGh9YDtcbiAgICBcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5naXRodWJDbGllbnQuZmV0Y2hGcm9tR2l0SHViKHVybCk7XG4gICAgXG4gICAgaWYgKGRhdGEudHlwZSAhPT0gJ2ZpbGUnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhdGggZG9lcyBub3QgcG9pbnQgdG8gYSBmaWxlJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIERlY29kZSBCYXNlNjQgY29udGVudFxuICAgIGNvbnN0IGNvbnRlbnQgPSBCdWZmZXIuZnJvbShkYXRhLmNvbnRlbnQsICdiYXNlNjQnKS50b1N0cmluZygndXRmLTgnKTtcbiAgICBcbiAgICAvLyBTYW5pdGl6ZSBjb250ZW50IGZvciBkaXNwbGF5ICh0aGlzIGlzIHZpZXctb25seSwgbm90IGluc3RhbGxhdGlvbilcbiAgICBjb25zdCBzYW5pdGl6ZWRDb250ZW50ID0gQ29udGVudFZhbGlkYXRvci5zYW5pdGl6ZVBlcnNvbmFDb250ZW50KGNvbnRlbnQpO1xuICAgIFxuICAgIC8vIFVzZSBzZWN1cmUgWUFNTCBwYXJzZXJcbiAgICBsZXQgcGFyc2VkO1xuICAgIHRyeSB7XG4gICAgICBwYXJzZWQgPSBTZWN1cmVZYW1sUGFyc2VyLnNhZmVNYXR0ZXIoc2FuaXRpemVkQ29udGVudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFNlY3VyaXR5RXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZWN1cml0eSB3YXJuaW5nOiBUaGlzIGNvbnRlbnQgY29udGFpbnMgcG90ZW50aWFsbHkgbWFsaWNpb3VzIGNvbnRlbnQgLSAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgbWV0YWRhdGEgPSBwYXJzZWQuZGF0YSBhcyBQZXJzb25hTWV0YWRhdGE7XG4gICAgXG4gICAgLy8gQWRkaXRpb25hbCB2YWxpZGF0aW9uIGZvciBkaXNwbGF5XG4gICAgY29uc3QgbWV0YWRhdGFWYWxpZGF0aW9uID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZU1ldGFkYXRhKG1ldGFkYXRhKTtcbiAgICBpZiAoIW1ldGFkYXRhVmFsaWRhdGlvbi5pc1ZhbGlkICYmIG1ldGFkYXRhVmFsaWRhdGlvbi5zZXZlcml0eSA9PT0gJ2NyaXRpY2FsJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZWN1cml0eSB3YXJuaW5nOiBUaGlzIGNvbnRlbnQgY29udGFpbnMgcG90ZW50aWFsbHkgbWFsaWNpb3VzIGNvbnRlbnRgKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldGFkYXRhLFxuICAgICAgY29udGVudDogcGFyc2VkLmNvbnRlbnRcbiAgICB9O1xuICB9XG4gIFxuICAvKipcbiAgICogRm9ybWF0IHBlcnNvbmEgZGV0YWlscyBmb3IgZGlzcGxheVxuICAgKi9cbiAgZm9ybWF0UGVyc29uYURldGFpbHMobWV0YWRhdGE6IFBlcnNvbmFNZXRhZGF0YSwgY29udGVudDogc3RyaW5nLCBwYXRoOiBzdHJpbmcsIHBlcnNvbmFJbmRpY2F0b3I6IHN0cmluZyA9ICcnKTogc3RyaW5nIHtcbiAgICBjb25zdCB0ZXh0UGFydHMgPSBbXG4gICAgICBgJHtwZXJzb25hSW5kaWNhdG9yffCfjq0gKipDb2xsZWN0aW9uIENvbnRlbnQ6ICR7bWV0YWRhdGEubmFtZX0qKlxcblxcbmAsXG4gICAgICBgKirwn5OLIERldGFpbHM6KipcXG5gLFxuICAgICAgYCAgIPCfhpQgSUQ6ICR7bWV0YWRhdGEudW5pcXVlX2lkIHx8ICdOb3Qgc3BlY2lmaWVkJ31cXG5gLFxuICAgICAgYCAgIPCfkaQgQXV0aG9yOiAke21ldGFkYXRhLmF1dGhvciB8fCAnVW5rbm93bid9XFxuYCxcbiAgICAgIGAgICDwn5OBIENhdGVnb3J5OiAke21ldGFkYXRhLmNhdGVnb3J5IHx8ICdHZW5lcmFsJ31cXG5gLFxuICAgICAgYCAgIPCflJYgUHJpY2U6ICR7bWV0YWRhdGEucHJpY2UgfHwgJ0ZyZWUnfVxcbmAsXG4gICAgICBgICAg8J+TiiBWZXJzaW9uOiAke21ldGFkYXRhLnZlcnNpb24gfHwgJzEuMCd9XFxuYCxcbiAgICAgIGAgICDwn5SeIEFnZSBSYXRpbmc6ICR7bWV0YWRhdGEuYWdlX3JhdGluZyB8fCAnQWxsJ31cXG5gLFxuICAgICAgYCAgICR7bWV0YWRhdGEuYWlfZ2VuZXJhdGVkID8gJ/CfpJYgQUkgR2VuZXJhdGVkJyA6ICfwn5GkIEh1bWFuIENyZWF0ZWQnfVxcblxcbmAsXG4gICAgICBgKirwn5OdIERlc2NyaXB0aW9uOioqXFxuJHttZXRhZGF0YS5kZXNjcmlwdGlvbn1cXG5cXG5gXG4gICAgXTtcbiAgICBcbiAgICBpZiAobWV0YWRhdGEudHJpZ2dlcnMgJiYgbWV0YWRhdGEudHJpZ2dlcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGV4dFBhcnRzLnB1c2goYCoq8J+UlyBUcmlnZ2VyczoqKiAke21ldGFkYXRhLnRyaWdnZXJzLmpvaW4oJywgJyl9XFxuXFxuYCk7XG4gICAgfVxuICAgIFxuICAgIHRleHRQYXJ0cy5wdXNoKFxuICAgICAgYCoq8J+TpSBJbnN0YWxsYXRpb246KipcXG5gLFxuICAgICAgYFVzZTogXFxgaW5zdGFsbF9jb250ZW50IFwiJHtwYXRofVwiXFxgXFxuXFxuYCxcbiAgICAgIGAqKvCfk4QgRnVsbCBDb250ZW50OioqXFxuXFxgXFxgXFxgXFxuJHtjb250ZW50fVxcblxcYFxcYFxcYGBcbiAgICApO1xuICAgIFxuICAgIHJldHVybiB0ZXh0UGFydHMuam9pbignJyk7XG4gIH1cbn0iXX0=