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.

83 lines 11.5 kB
/** * Best-effort MCP client platform detection for session metadata. * * This is intentionally conservative: when we cannot identify the host * confidently, we return null rather than guessing from a session ID. */ const CLIENT_PLATFORM_LABELS = { 'claude-code': 'Claude Code', 'claude-desktop': 'Claude Desktop', codex: 'Codex', cursor: 'Cursor', vscode: 'VS Code', windsurf: 'Windsurf', 'gemini-cli': 'Gemini CLI', cline: 'Cline', lmstudio: 'LM Studio', 'web-console': 'Web Console', }; function normalizeText(value) { return typeof value === 'string' ? value.trim().toLowerCase() : ''; } function includesAny(value, needles) { return needles.some((needle) => value.includes(needle)); } function matchesAnySource(values, needles) { return values.some((value) => includesAny(value, needles)); } const TEXT_PLATFORM_MATCHERS = [ { platform: 'cursor', needles: ['cursor'] }, { platform: 'windsurf', needles: ['windsurf'] }, { platform: 'gemini-cli', needles: ['gemini'] }, { platform: 'cline', needles: ['cline'] }, { platform: 'lmstudio', needles: ['lmstudio', 'lm studio'] }, { platform: 'claude-desktop', needles: ['claude desktop'] }, { platform: 'claude-code', needles: ['claude code'] }, { platform: 'codex', needles: ['codex'] }, ]; export function normalizeSessionClientPlatformId(value) { const normalized = normalizeText(value ?? undefined); if (!normalized) { return null; } if (normalized === 'gemini') { return 'gemini-cli'; } if (normalized in CLIENT_PLATFORM_LABELS) { return normalized; } return null; } export function getSessionClientPlatformLabel(platform) { return platform ? CLIENT_PLATFORM_LABELS[platform] ?? '' : ''; } export function detectSessionClientPlatformId(env = process.env, argv = process.argv, execPath = process.execPath, title = process.title) { const termProgram = normalizeText(env.TERM_PROGRAM); const argvText = normalizeText(argv.join(' ')); const execPathText = normalizeText(execPath); const titleText = normalizeText(title); const textSources = [argvText, execPathText, titleText]; if (env.CLAUDE_DESKTOP === 'true' || env.CLAUDE_DESKTOP_VERSION) { return 'claude-desktop'; } if (env.CLAUDE_CODE === 'true' || termProgram === 'claude-code') { return 'claude-code'; } if (env.VSCODE_CWD || env.VSCODE_PID || env.VSCODE_IPC_HOOK || env.VSCODE_NLS_CONFIG || termProgram === 'vscode') { return 'vscode'; } if (env.CODEX_HOME || termProgram === 'codex') { return 'codex'; } for (const matcher of TEXT_PLATFORM_MATCHERS) { if (matchesAnySource(textSources, matcher.needles)) { return matcher.platform; } } return null; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbkNsaWVudFBsYXRmb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3dlYi9jb25zb2xlL3Nlc3Npb25DbGllbnRQbGF0Zm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQWNILE1BQU0sc0JBQXNCLEdBQTRDO0lBQ3RFLGFBQWEsRUFBRSxhQUFhO0lBQzVCLGdCQUFnQixFQUFFLGdCQUFnQjtJQUNsQyxLQUFLLEVBQUUsT0FBTztJQUNkLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLE1BQU0sRUFBRSxTQUFTO0lBQ2pCLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLFlBQVksRUFBRSxZQUFZO0lBQzFCLEtBQUssRUFBRSxPQUFPO0lBQ2QsUUFBUSxFQUFFLFdBQVc7SUFDckIsYUFBYSxFQUFFLGFBQWE7Q0FDN0IsQ0FBQztBQUVGLFNBQVMsYUFBYSxDQUFDLEtBQXlCO0lBQzlDLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNyRSxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsS0FBYSxFQUFFLE9BQTBCO0lBQzVELE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLE1BQXlCLEVBQUUsT0FBMEI7SUFDN0UsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDN0QsQ0FBQztBQUVELE1BQU0sc0JBQXNCLEdBR3ZCO0lBQ0gsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE9BQU8s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LHNCQUFzQixFQUFFLENBQUM7UUFDN0MsSUFBSSxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDbkQsT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQzFCLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCZXN0LWVmZm9ydCBNQ1AgY2xpZW50IHBsYXRmb3JtIGRldGVjdGlvbiBmb3Igc2Vzc2lvbiBtZXRhZGF0YS5cbiAqXG4gKiBUaGlzIGlzIGludGVudGlvbmFsbHkgY29uc2VydmF0aXZlOiB3aGVuIHdlIGNhbm5vdCBpZGVudGlmeSB0aGUgaG9zdFxuICogY29uZmlkZW50bHksIHdlIHJldHVybiBudWxsIHJhdGhlciB0aGFuIGd1ZXNzaW5nIGZyb20gYSBzZXNzaW9uIElELlxuICovXG5cbmV4cG9ydCB0eXBlIFNlc3Npb25DbGllbnRQbGF0Zm9ybUlkID1cbiAgfCAnY2xhdWRlLWNvZGUnXG4gIHwgJ2NsYXVkZS1kZXNrdG9wJ1xuICB8ICdjb2RleCdcbiAgfCAnY3Vyc29yJ1xuICB8ICd2c2NvZGUnXG4gIHwgJ3dpbmRzdXJmJ1xuICB8ICdnZW1pbmktY2xpJ1xuICB8ICdjbGluZSdcbiAgfCAnbG1zdHVkaW8nXG4gIHwgJ3dlYi1jb25zb2xlJztcblxuY29uc3QgQ0xJRU5UX1BMQVRGT1JNX0xBQkVMUzogUmVjb3JkPFNlc3Npb25DbGllbnRQbGF0Zm9ybUlkLCBzdHJpbmc+ID0ge1xuICAnY2xhdWRlLWNvZGUnOiAnQ2xhdWRlIENvZGUnLFxuICAnY2xhdWRlLWRlc2t0b3AnOiAnQ2xhdWRlIERlc2t0b3AnLFxuICBjb2RleDogJ0NvZGV4JyxcbiAgY3Vyc29yOiAnQ3Vyc29yJyxcbiAgdnNjb2RlOiAnVlMgQ29kZScsXG4gIHdpbmRzdXJmOiAnV2luZHN1cmYnLFxuICAnZ2VtaW5pLWNsaSc6ICdHZW1pbmkgQ0xJJyxcbiAgY2xpbmU6ICdDbGluZScsXG4gIGxtc3R1ZGlvOiAnTE0gU3R1ZGlvJyxcbiAgJ3dlYi1jb25zb2xlJzogJ1dlYiBDb25zb2xlJyxcbn07XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVRleHQodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCkgOiAnJztcbn1cblxuZnVuY3Rpb24gaW5jbHVkZXNBbnkodmFsdWU6IHN0cmluZywgbmVlZGxlczogcmVhZG9ubHkgc3RyaW5nW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIG5lZWRsZXMuc29tZSgobmVlZGxlKSA9PiB2YWx1ZS5pbmNsdWRlcyhuZWVkbGUpKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlc0FueVNvdXJjZSh2YWx1ZXM6IHJlYWRvbmx5IHN0cmluZ1tdLCBuZWVkbGVzOiByZWFkb25seSBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdmFsdWVzLnNvbWUoKHZhbHVlKSA9PiBpbmNsdWRlc0FueSh2YWx1ZSwgbmVlZGxlcykpO1xufVxuXG5jb25zdCBURVhUX1BMQVRGT1JNX01BVENIRVJTOiBSZWFkb25seUFycmF5PHtcbiAgcGxhdGZvcm06IFNlc3Npb25DbGllbnRQbGF0Zm9ybUlkO1xuICBuZWVkbGVzOiByZWFkb25seSBzdHJpbmdbXTtcbn0+ID0gW1xuICB7IHBsYXRmb3JtOiAnY3Vyc29yJywgbmVlZGxlczogWydjdXJzb3InXSB9LFxuICB7IHBsYXRmb3JtOiAnd2luZHN1cmYnLCBuZWVkbGVzOiBbJ3dpbmRzdXJmJ10gfSxcbiAgeyBwbGF0Zm9ybTogJ2dlbWluaS1jbGknLCBuZWVkbGVzOiBbJ2dlbWluaSddIH0sXG4gIHsgcGxhdGZvcm06ICdjbGluZScsIG5lZWRsZXM6IFsnY2xpbmUnXSB9LFxuICB7IHBsYXRmb3JtOiAnbG1zdHVkaW8nLCBuZWVkbGVzOiBbJ2xtc3R1ZGlvJywgJ2xtIHN0dWRpbyddIH0sXG4gIHsgcGxhdGZvcm06ICdjbGF1ZGUtZGVza3RvcCcsIG5lZWRsZXM6IFsnY2xhdWRlIGRlc2t0b3AnXSB9LFxuICB7IHBsYXRmb3JtOiAnY2xhdWRlLWNvZGUnLCBuZWVkbGVzOiBbJ2NsYXVkZSBjb2RlJ10gfSxcbiAgeyBwbGF0Zm9ybTogJ2NvZGV4JywgbmVlZGxlczogWydjb2RleCddIH0sXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU2Vzc2lvbkNsaWVudFBsYXRmb3JtSWQoXG4gIHZhbHVlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxuKTogU2Vzc2lvbkNsaWVudFBsYXRmb3JtSWQgfCBudWxsIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVRleHQodmFsdWUgPz8gdW5kZWZpbmVkKTtcbiAgaWYgKCFub3JtYWxpemVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAobm9ybWFsaXplZCA9PT0gJ2dlbWluaScpIHtcbiAgICByZXR1cm4gJ2dlbWluaS1jbGknO1xuICB9XG5cbiAgaWYgKG5vcm1hbGl6ZWQgaW4gQ0xJRU5UX1BMQVRGT1JNX0xBQkVMUykge1xuICAgIHJldHVybiBub3JtYWxpemVkIGFzIFNlc3Npb25DbGllbnRQbGF0Zm9ybUlkO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZXNzaW9uQ2xpZW50UGxhdGZvcm1MYWJlbChcbiAgcGxhdGZvcm06IFNlc3Npb25DbGllbnRQbGF0Zm9ybUlkIHwgbnVsbCB8IHVuZGVmaW5lZCxcbik6IHN0cmluZyB7XG4gIHJldHVybiBwbGF0Zm9ybSA/IENMSUVOVF9QTEFURk9STV9MQUJFTFNbcGxhdGZvcm1dID8/ICcnIDogJyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RTZXNzaW9uQ2xpZW50UGxhdGZvcm1JZChcbiAgZW52OiBOb2RlSlMuUHJvY2Vzc0VudiA9IHByb2Nlc3MuZW52LFxuICBhcmd2OiByZWFkb25seSBzdHJpbmdbXSA9IHByb2Nlc3MuYXJndixcbiAgZXhlY1BhdGg6IHN0cmluZyA9IHByb2Nlc3MuZXhlY1BhdGgsXG4gIHRpdGxlOiBzdHJpbmcgPSBwcm9jZXNzLnRpdGxlLFxuKTogU2Vzc2lvbkNsaWVudFBsYXRmb3JtSWQgfCBudWxsIHtcbiAgY29uc3QgdGVybVByb2dyYW0gPSBub3JtYWxpemVUZXh0KGVudi5URVJNX1BST0dSQU0pO1xuICBjb25zdCBhcmd2VGV4dCA9IG5vcm1hbGl6ZVRleHQoYXJndi5qb2luKCcgJykpO1xuICBjb25zdCBleGVjUGF0aFRleHQgPSBub3JtYWxpemVUZXh0KGV4ZWNQYXRoKTtcbiAgY29uc3QgdGl0bGVUZXh0ID0gbm9ybWFsaXplVGV4dCh0aXRsZSk7XG4gIGNvbnN0IHRleHRTb3VyY2VzID0gW2FyZ3ZUZXh0LCBleGVjUGF0aFRleHQsIHRpdGxlVGV4dF07XG5cbiAgaWYgKGVudi5DTEFVREVfREVTS1RPUCA9PT0gJ3RydWUnIHx8IGVudi5DTEFVREVfREVTS1RPUF9WRVJTSU9OKSB7XG4gICAgcmV0dXJuICdjbGF1ZGUtZGVza3RvcCc7XG4gIH1cblxuICBpZiAoZW52LkNMQVVERV9DT0RFID09PSAndHJ1ZScgfHwgdGVybVByb2dyYW0gPT09ICdjbGF1ZGUtY29kZScpIHtcbiAgICByZXR1cm4gJ2NsYXVkZS1jb2RlJztcbiAgfVxuXG4gIGlmIChcbiAgICBlbnYuVlNDT0RFX0NXRCB8fFxuICAgIGVudi5WU0NPREVfUElEIHx8XG4gICAgZW52LlZTQ09ERV9JUENfSE9PSyB8fFxuICAgIGVudi5WU0NPREVfTkxTX0NPTkZJRyB8fFxuICAgIHRlcm1Qcm9ncmFtID09PSAndnNjb2RlJ1xuICApIHtcbiAgICByZXR1cm4gJ3ZzY29kZSc7XG4gIH1cblxuICBpZiAoZW52LkNPREVYX0hPTUUgfHwgdGVybVByb2dyYW0gPT09ICdjb2RleCcpIHtcbiAgICByZXR1cm4gJ2NvZGV4JztcbiAgfVxuXG4gIGZvciAoY29uc3QgbWF0Y2hlciBvZiBURVhUX1BMQVRGT1JNX01BVENIRVJTKSB7XG4gICAgaWYgKG1hdGNoZXNBbnlTb3VyY2UodGV4dFNvdXJjZXMsIG1hdGNoZXIubmVlZGxlcykpIHtcbiAgICAgIHJldHVybiBtYXRjaGVyLnBsYXRmb3JtO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIl19