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.

627 lines (583 loc) 36.6 kB
<!DOCTYPE html> <html lang="en" data-theme="light"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>DollhouseMCP Console</title> <meta name="description" content="DollhouseMCP management console — portfolio, logs, metrics"> <meta http-equiv="X-Content-Type-Options" content="nosniff"> <meta http-equiv="X-Frame-Options" content="DENY"> <!-- Console session token (#1780) — injected by server at request time. When auth is enabled, browser JS reads this tag and attaches the value as an Authorization: Bearer header on fetch calls, or as a ?token= query param on EventSource connections. An empty value means auth is off. --> <meta name="dollhouse-console-token" content="{{CONSOLE_TOKEN}}"> <!-- Server version — injected at request time for version-aware UI behaviour (e.g. setup-seen per version). --> <meta name="dollhouse-server-version" content="{{DOLLHOUSE_VERSION}}"> <meta name="dollhouse-session-id" content="{{DOLLHOUSE_SESSION_ID}}"> <meta name="dollhouse-runtime-session-id" content="{{DOLLHOUSE_RUNTIME_SESSION_ID}}"> <!-- Asset version — injected at request time for cache-busting local CSS/JS/img files. --> <meta name="dollhouse-console-asset-version" content="{{DOLLHOUSE_ASSET_VERSION}}"> <link rel="icon" type="image/png" href="dollhouse-logo.png?v={{DOLLHOUSE_ASSET_VERSION}}"> <link rel="apple-touch-icon" href="dollhouse-logo.png?v={{DOLLHOUSE_ASSET_VERSION}}"> <link rel="stylesheet" href="fonts.css?v={{DOLLHOUSE_ASSET_VERSION}}"> <link rel="stylesheet" href="styles.css?v={{DOLLHOUSE_ASSET_VERSION}}"> <link rel="stylesheet" href="logs.css?v={{DOLLHOUSE_ASSET_VERSION}}"> <link rel="stylesheet" href="metrics.css?v={{DOLLHOUSE_ASSET_VERSION}}"> <link rel="stylesheet" href="permissions.css?v={{DOLLHOUSE_ASSET_VERSION}}"> <link rel="stylesheet" href="sessions.css?v={{DOLLHOUSE_ASSET_VERSION}}"> <link rel="stylesheet" href="setup.css?v={{DOLLHOUSE_ASSET_VERSION}}"> <link rel="stylesheet" href="security.css?v={{DOLLHOUSE_ASSET_VERSION}}"> <!-- uPlot for metrics time-series charts --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/uplot@1.6.30/dist/uPlot.min.css" integrity="sha384-IfV0B7MIOYuO95kO9G5ySKPz/85zqFNOAs8iy4tkK5zd9izhJAB8b7lHrwYqqmYE" crossorigin="anonymous"> </head> <body> <div class="page-noise" aria-hidden="true"></div> <header class="site-header"> <div class="header-brand"> <img src="dollhouse-logo.png?v={{DOLLHOUSE_ASSET_VERSION}}" alt="DollhouseMCP" class="header-logo" width="32" height="32"> <div class="header-brand-text"> <h1 class="site-title">DollhouseMCP</h1> <p class="site-tagline">Management Console</p> </div> </div> <div class="header-controls"> <div class="site-stats" id="stats" aria-live="polite"></div> <button class="theme-toggle" id="theme-toggle" type="button" aria-label="Switch to dark mode" title="Switch to dark mode"> <span class="theme-toggle-icon" id="theme-toggle-icon" aria-hidden="true">&#9790;</span> <span class="sr-only" id="theme-toggle-label">Switch to dark mode</span> </button> </div> <div class="header-nav-row"> <nav class="console-tabs" id="console-tabs" aria-label="Console tabs"> <button class="console-tab" data-tab="setup">Setup</button> <button class="console-tab" data-tab="security">Auth</button> <button class="console-tab" data-tab="logs">Logs</button> <button class="console-tab" data-tab="metrics">Metrics</button> <button class="console-tab" data-tab="permissions">Permissions</button> <button class="console-tab active" data-tab="portfolio">Portfolio</button> </nav> <div class="console-tab-menu-shell" id="console-tab-menu-shell"> <button class="console-tab-menu-toggle" id="console-tab-menu-toggle" type="button" hidden aria-haspopup="menu" aria-expanded="false" aria-controls="console-tab-menu"> <span class="console-tab-menu-icon" aria-hidden="true">&#9776;</span> <span class="console-tab-menu-label">Menu</span> </button> <div class="console-tab-menu" id="console-tab-menu" role="menu" aria-orientation="vertical" hidden></div> </div> <div class="session-indicator" id="session-indicator" title="Active sessions"></div> </div> </header> <!-- Tab: Setup --> <div id="tab-setup" class="tab-panel" hidden> <div class="setup-page"> <div class="setup-hero"> <div class="setup-hero-status"> <span class="setup-status-dot"></span> <span>DollhouseMCP is running on your machine</span> </div> <h2 class="setup-hero-title">Connect DollhouseMCP to your AI client</h2> <p class="setup-hero-sub">Pick your platform below. Click <strong>Configure Now</strong> to connect, or copy the config manually.</p> </div> <fieldset class="setup-method-toggle" id="setup-method-toggle"> <legend class="sr-only">Installation method</legend> <button class="setup-method-btn is-active" data-method="npx" aria-pressed="true"> <strong>Auto-updating</strong> <span>Always pulls the latest version on startup</span> </button> <button class="setup-method-btn" data-method="global" aria-pressed="false"> <strong>Pinned version</strong> <span>Lock to a specific version, update when you choose</span> </button> <button class="setup-method-btn" data-method="permissions" aria-pressed="false"> <strong>Permissions &amp; Security</strong> <span>Manual hook assets and enforcement guidance</span> </button> </fieldset> <fieldset class="setup-channel-toggle" id="setup-channel-toggle"> <legend class="setup-channel-legend">Release channel</legend> <select id="setup-channel-select" class="setup-channel-select" aria-label="Release channel" aria-describedby="setup-channel-hint"> <option value="latest" selected>Stable</option> <option value="rc">Release Candidate</option> <option value="beta">Beta</option> </select> <span class="setup-channel-hint" id="setup-channel-hint">Recommended for most users.</span> </fieldset> <!-- Pinned install prereq (hidden by default, shown when pinned selected) --> <div class="setup-pinned-prereq" id="setup-pinned-prereq" hidden> <div class="setup-method"> <h3>Pinned version: <code id="pinned-version-label">loading...</code></h3> <p>The platform configs below will use this exact version. Choose how you want it installed:</p> <h4>npx with pinned version <span class="setup-badge">no install needed</span></h4> <p>Same as auto-updating but locked to a specific version. No extra install step.</p> <p class="setup-hint">The platform configs below already use the pinned version &mdash; just copy and go.</p> <h4>Global install</h4> <p>Puts the <code>dollhousemcp</code> command on your PATH. Faster startup.</p> <div class="setup-code-block"> <button class="setup-copy-btn" type="button" id="pinned-global-copy" data-copy-text="npm install -g @dollhousemcp/mcp-server" aria-label="Copy global install command">Copy</button> <pre><code id="pinned-global-cmd">npm install -g @dollhousemcp/mcp-server</code></pre> </div> <p class="setup-hint">Update later by re-running with the new version number.</p> <h4>Project-local install</h4> <p>Installs into a directory you choose. Good for running multiple versions side by side.</p> <div class="setup-code-block"> <button class="setup-copy-btn" type="button" id="pinned-local-copy" data-copy-text="mkdir -p ~/mcp-servers && cd ~/mcp-servers && npm install @dollhousemcp/mcp-server" aria-label="Copy local install command">Copy</button> <pre><code id="pinned-local-cmd">mkdir -p ~/mcp-servers && cd ~/mcp-servers npm install @dollhousemcp/mcp-server</code></pre> </div> <p class="setup-hint">Then point your client config at: <code>node ~/mcp-servers/node_modules/@dollhousemcp/mcp-server/dist/index.js</code></p> </div> </div> <div class="setup-permissions-intro" id="setup-permissions-intro" hidden></div> <div class="setup-platforms" id="setup-platforms" role="tablist" aria-label="Platform install instructions"> <button class="setup-platform-tab is-active" role="tab" aria-selected="true" aria-controls="setup-panel-claude-desktop" id="setup-tab-claude-desktop">Claude Desktop</button> <button class="setup-platform-tab" role="tab" aria-selected="false" aria-controls="setup-panel-claude-code" id="setup-tab-claude-code">Claude Code</button> <button class="setup-platform-tab" role="tab" aria-selected="false" aria-controls="setup-panel-cursor" id="setup-tab-cursor">Cursor</button> <button class="setup-platform-tab" role="tab" aria-selected="false" aria-controls="setup-panel-vscode" id="setup-tab-vscode">VS Code</button> <button class="setup-platform-tab" role="tab" aria-selected="false" aria-controls="setup-panel-codex" id="setup-tab-codex">Codex</button> <button class="setup-platform-tab" role="tab" aria-selected="false" aria-controls="setup-panel-gemini" id="setup-tab-gemini">Gemini CLI</button> <button class="setup-platform-tab" role="tab" aria-selected="false" aria-controls="setup-panel-windsurf" id="setup-tab-windsurf">Windsurf</button> <button class="setup-platform-tab" role="tab" aria-selected="false" aria-controls="setup-panel-cline" id="setup-tab-cline">Cline</button> <button class="setup-platform-tab" role="tab" aria-selected="false" aria-controls="setup-panel-lmstudio" id="setup-tab-lmstudio">LM Studio</button> </div> <!-- Claude Desktop --> <section class="setup-panel is-active" role="tabpanel" id="setup-panel-claude-desktop" aria-labelledby="setup-tab-claude-desktop"> <div class="setup-method setup-method-primary" data-setup-modes="npx global"> <h3>Auto-configure <span class="setup-method-badge setup-badge">auto-updating</span></h3> <p class="setup-method-desc">Pulls the latest version of DollhouseMCP on every startup. Uses <code>npx @latest</code> under the hood. Restart Claude Desktop after.</p> <div class="setup-install-row"> <button class="setup-btn setup-btn-primary setup-install-btn" type="button" data-install-client="claude">Configure Now</button> <span class="setup-install-status" data-install-status="claude"></span> </div> </div> <div class="setup-method setup-mcpb-option" id="setup-mcpb-section" data-setup-modes="global" hidden> <h3>Or install via Desktop Extension <span class="setup-badge">pinned version</span></h3> <p>Download the <code>.mcpb</code> bundle and double-click it to install. Claude Desktop handles everything automatically &mdash; no terminal, no config editing. This installs a pinned copy that won't auto-update.</p> <a class="setup-btn setup-btn-secondary" href="/api/setup/mcpb" id="pinned-mcpb-btn">Download .mcpb <span id="pinned-mcpb-version"></span></a> </div> <div class="setup-method" data-setup-modes="npx global"> <h3>Or add manually <button class="setup-open-btn" type="button" data-open-client="claude">Open config file</button> </h3> <p>Add to your config file:</p> <ul class="setup-paths" id="claude-desktop-paths"> <li><strong>macOS:</strong> <code>~/Library/Application Support/Claude/claude_desktop_config.json</code></li> <li><strong>Windows:</strong> <code>%APPDATA%\Claude\claude_desktop_config.json</code></li> <li><strong>Linux:</strong> <code>~/.config/Claude/claude_desktop_config.json</code></li> </ul> <div class="setup-code-block"> <button class="setup-copy-btn" type="button" data-copy-text='{"mcpServers":{"dollhousemcp":{"command":"npx","args":["-y","@dollhousemcp/mcp-server@latest"]}}}' aria-label="Copy config">Copy</button> <pre><code>{ "mcpServers": { "dollhousemcp": { "command": "npx", "args": ["-y", "@dollhousemcp/mcp-server@latest"] } } }</code></pre> </div> <p class="setup-hint">Restart Claude Desktop after saving.</p> </div> </section> <!-- Claude Code --> <section class="setup-panel" role="tabpanel" id="setup-panel-claude-code" aria-labelledby="setup-tab-claude-code" hidden> <div class="setup-method setup-method-primary" data-setup-modes="npx global"> <h3>Auto-configure <span class="setup-method-badge setup-badge">auto-updating</span></h3> <p class="setup-method-desc">Adds DollhouseMCP to Claude Code, pulling the latest version on every startup.</p> <div class="setup-install-row"> <button class="setup-btn setup-btn-primary setup-install-btn" type="button" data-install-client="claude-code">Configure Now</button> <span class="setup-install-status" data-install-status="claude-code"></span> </div> </div> <div class="setup-method" data-setup-modes="npx global"> <h3>Or run in your terminal</h3> <p>Start a new conversation and you're ready.</p> <div class="setup-code-block"> <button class="setup-copy-btn" type="button" data-copy-text="claude mcp add dollhousemcp -- npx -y @dollhousemcp/mcp-server@latest" aria-label="Copy command">Copy</button> <pre><code>claude mcp add dollhousemcp -- npx -y @dollhousemcp/mcp-server@latest</code></pre> </div> </div> <div class="setup-method" data-setup-modes="npx global"> <h3>Or add manually <button class="setup-open-btn" type="button" data-open-client="claude-code">Open config file</button> </h3> <p>Add to <code>~/.claude.json</code>:</p> <div class="setup-code-block"> <button class="setup-copy-btn" type="button" data-copy-text='{"mcpServers":{"dollhousemcp":{"command":"npx","args":["-y","@dollhousemcp/mcp-server@latest"]}}}' aria-label="Copy config">Copy</button> <pre><code>{ "mcpServers": { "dollhousemcp": { "command": "npx", "args": ["-y", "@dollhousemcp/mcp-server@latest"] } } }</code></pre> </div> </div> </section> <!-- Panels for Cursor, VS Code, Codex, Gemini CLI, Windsurf, Cline, LM Studio --> <!-- Generated by setup.js from PLATFORMS registry to eliminate HTML duplication --> <div id="setup-generated-panels"></div> <!-- Verify section --> <div class="setup-verify"> <h3>Verify it's working</h3> <p>After connecting, start a conversation and ask:</p> <div class="setup-code-block setup-code-block-sm"> <button class="setup-copy-btn" type="button" data-copy-text="What DollhouseMCP tools do you have available?" aria-label="Copy prompt">Copy</button> <pre><code>What DollhouseMCP tools do you have available?</code></pre> </div> <p>You should see MCP-AQL endpoints. Then try:</p> <div class="setup-try-prompts"> <code>List all available Dollhouse personas</code> <code>Activate the debug detective persona</code> <code>Open the portfolio browser</code> </div> </div> <!-- License selector (#1746 Step 3) --> <div class="license-section" id="license-section"> <h3 class="license-heading">Choose your license</h3> <p class="license-sub">DollhouseMCP is free and open source. Commercial use has simple, fair terms.</p> <div class="license-tiers" id="license-tiers"> <!-- AGPL --> <button class="license-tier is-selected" data-tier="agpl" type="button"> <span class="license-tier-price-label license-tier-price-label--free">Free</span> <div class="license-tier-header"> <span class="license-tier-radio"></span> <div> <strong class="license-tier-name">AGPL-3.0</strong> <span class="license-tier-badge license-tier-badge--default">default</span> </div> </div> <p class="license-tier-desc">Open source. Share-alike license. No sign-up, no telemetry required.</p> </button> <!-- Free Commercial --> <button class="license-tier" data-tier="free-commercial" type="button"> <span class="license-tier-price-label license-tier-price-label--free">Free</span> <div class="license-tier-header"> <span class="license-tier-radio"></span> <div> <strong class="license-tier-name">Commercial</strong> </div> </div> <p class="license-tier-desc">For companies earning under $1 million annual revenue. Attribution required.</p> </button> <!-- Paid Commercial / Enterprise --> <button class="license-tier" data-tier="paid-commercial" type="button"> <span class="license-tier-price-label license-tier-price-label--paid">Paid</span> <div class="license-tier-header"> <span class="license-tier-radio"></span> <div> <strong class="license-tier-name">Enterprise</strong> </div> </div> <p class="license-tier-desc">For companies over $1M annual revenue, or white label. Priority support and SLA options available.</p> </button> </div> <!-- AGPL detail (shown by default) --> <div class="license-detail" id="license-detail-agpl"> <div class="license-detail-content"> <p>You're using DollhouseMCP under the <a href="https://www.gnu.org/licenses/agpl-3.0.en.html" target="_blank" rel="noopener">GNU Affero General Public License v3</a>. No action needed &mdash; this is the default.</p> <ul class="license-detail-list"> <li>Use, modify, and distribute freely</li> <li>Derivative works must also be AGPL-licensed</li> <li>Source code must be made available to users who interact with the software over a network</li> <li>Original copyright and license notices must be preserved</li> <li>No telemetry collection</li> <li>Community support via GitHub</li> </ul> </div> </div> <!-- Free Commercial detail (hidden) --> <div class="license-detail" id="license-detail-free-commercial" hidden> <form class="license-form" id="license-form-free-commercial" autocomplete="off"> <label class="license-form-label"> Email address <input class="license-form-input" type="email" name="email" required maxlength="254" placeholder="you@company.com" /> <span class="license-form-hint">Your license confirmation will be sent to this address. A valid email is required to receive your license.</span> </label> <label class="license-form-check"> <input type="checkbox" name="telemetry" required /> <span>I acknowledge that anonymous usage telemetry will be collected as a condition of this license</span> </label> <label class="license-form-check"> <input type="checkbox" name="attribution" required /> <span>I acknowledge I will provide attribution when DollhouseMCP is used in any commercial product</span> </label> <label class="license-form-check"> <input type="checkbox" name="attestation" required /> <span>I attest that my organization's annual revenue is under $1,000,000 USD</span> </label> <button class="setup-btn setup-btn-primary license-submit-btn" type="submit">Activate Commercial License</button> <p class="license-form-status" id="license-status-free-commercial"></p> </form> </div> <!-- Paid Commercial detail (hidden) --> <div class="license-detail" id="license-detail-paid-commercial" hidden> <form class="license-form" id="license-form-paid-commercial" autocomplete="off"> <label class="license-form-label"> Email address <input class="license-form-input" type="email" name="email" required maxlength="254" placeholder="you@company.com" /> <span class="license-form-hint">Your license confirmation will be sent to this address. A valid email is required to receive your license.</span> </label> <label class="license-form-label"> Revenue scale <select class="license-form-select" name="revenueScale" required> <option value="" disabled selected>Select range</option> <option value="$1M–$5M">$1M – $5M</option> <option value="$5M–$25M">$5M – $25M</option> <option value="$25M–$100M">$25M – $100M</option> <option value="$100M+">$100M+</option> </select> </label> <label class="license-form-label"> Company name <input class="license-form-input" type="text" name="companyName" required maxlength="200" placeholder="Acme Corp" /> </label> <label class="license-form-label"> Use case <textarea class="license-form-textarea" name="useCase" rows="2" required maxlength="500" placeholder="Brief description of how you're using DollhouseMCP"></textarea> </label> <label class="license-form-check"> <input type="checkbox" name="telemetry" required /> <span>I acknowledge that anonymous usage telemetry will be collected as a condition of this license</span> </label> <button class="setup-btn setup-btn-primary license-submit-btn" type="submit">Send Inquiry</button> <p class="license-form-status" id="license-status-paid-commercial"></p> </form> </div> <!-- Verification code input (shown after commercial form submit) --> <div class="license-detail license-verification" id="license-verification" hidden> <form class="license-form" id="license-verify-form" autocomplete="off"> <p class="license-verify-intro">We sent a 6-digit verification code to <strong id="license-verify-email"></strong>.</p> <label class="license-form-label"> Verification code <input class="license-form-input license-code-input" type="text" name="code" required maxlength="6" pattern="\d{6}" placeholder="000000" inputmode="numeric" autocomplete="one-time-code" /> </label> <div class="license-verify-actions"> <button class="setup-btn setup-btn-primary license-submit-btn" type="submit">Verify</button> <button class="setup-btn setup-btn-secondary" type="button" id="license-resend-btn">Resend code</button> </div> <p class="license-form-status" id="license-verify-status"></p> <p class="license-verify-timer" id="license-verify-timer"></p> </form> </div> <!-- Saved confirmation (shown after successful save) --> <div class="license-saved" id="license-saved" hidden> <span class="license-saved-icon">&#10003;</span> <span class="license-saved-text" id="license-saved-text">License saved</span> </div> <!-- License details (shown when a commercial license is active) --> <div class="license-detail license-active-details" id="license-active-details" hidden> <div class="license-detail-content"> <h4 style="margin: 0 0 12px;">Your license</h4> <table class="license-info-table" id="license-info-table"><thead><tr><th>Field</th><th>Value</th></tr></thead><tbody id="license-info-tbody"></tbody></table> <p class="license-file-path">License file: <code>~/.dollhouse/license.json</code></p> </div> </div> </div> <div class="setup-footer"> <p>Full documentation for all platforms (Continue, Docker, local LLMs) in the <a href="https://github.com/DollhouseMCP/mcp-server/blob/main/docs/guides/quick-start.md" target="_blank" rel="noopener">quick start guide</a>. </p> <p>Auto-configure powered by <a href="https://github.com/supermemoryai/install-mcp" target="_blank" rel="noopener">install-mcp</a> by <a href="https://github.com/dhravyashah" target="_blank" rel="noopener">Dhravya Shah</a>.</p> </div> </div> </div> <!-- Tab: Portfolio --> <div id="tab-portfolio" class="tab-panel active"> <main class="site-main"> <div class="browse-controls"> <div class="search-wrapper"> <label for="search-input" class="sr-only">Search elements</label> <input type="search" id="search-input" class="search-input" placeholder="Search by name, description, author, or tag... (press / to focus)" autocomplete="off" spellcheck="false" > </div> <div class="type-filter-row"> <fieldset class="type-filters" id="type-filters"><legend class="sr-only">Filter by element type</legend></fieldset> <!-- Portfolio is the default view — no collection toggle needed --> </div> <fieldset class="topic-filters" id="topic-filters" hidden><legend class="sr-only">Filter by topic</legend></fieldset> </div> <div class="results-bar"> <span class="results-count" id="results-count" aria-live="polite"></span> <output class="sr-only" id="results-announcer" aria-live="polite" aria-atomic="true"></output> <fieldset class="source-toggle" id="source-toggle"> <legend class="sr-only">Filter by source</legend> <button class="source-btn active" data-source="all" aria-pressed="true">All</button> <button class="source-btn" data-source="collection" aria-pressed="false">Collection</button> <button class="source-btn" data-source="portfolio" aria-pressed="false">Portfolio</button> </fieldset> <label for="sort-select" class="sr-only">Sort by</label> <select id="sort-select" class="sort-select" aria-label="Sort elements"> <option value="name-asc">Name A-Z</option> <option value="name-desc">Name Z-A</option> <option value="date-desc" selected>Newest first</option> <option value="date-asc">Oldest first</option> <option value="type-asc">By type</option> </select> <fieldset class="view-toggle" id="view-toggle"> <legend class="sr-only">View mode</legend> <button class="view-btn active" data-view="grid" aria-pressed="true">Cards</button> <button class="view-btn" data-view="list" aria-pressed="false">List</button> <button class="view-btn" data-view="detail" aria-pressed="false">Detail</button> </fieldset> </div> <ul class="elements-grid" id="elements-grid"></ul> <nav class="pagination" id="pagination" hidden aria-label="Page navigation"> <button class="pagination-btn" id="btn-prev-page">&#8249; Prev</button> <span class="pagination-info" id="page-info"></span> <button class="pagination-btn" id="btn-next-page">Next &#8250;</button> </nav> </main> </div> <!-- Tab: Logs --> <div id="tab-logs" class="tab-panel" hidden> <div id="log-viewer-root"></div> </div> <!-- Tab: Metrics --> <div id="tab-metrics" class="tab-panel" hidden> <div id="metrics-dashboard-root"></div> </div> <!-- Tab: Permissions --> <div id="tab-permissions" class="tab-panel" hidden> <div id="permissions-dashboard-root"></div> </div> <!-- Tab: Security (#1791) --> <div id="tab-security" class="tab-panel" hidden> <div id="security-dashboard-root"></div> </div> <!-- Auth tab intro content (#1816) — edit here, not in security.js --> <template id="sec-intro-template"> <section class="sec-card sec-card--intro" data-collapsed="true" aria-labelledby="sec-intro-title"> <button class="sec-card-header" type="button" aria-expanded="false"> <h3 class="sec-card-title" id="sec-intro-title">Console Authentication <span class="sec-intro-summary">&mdash; how it can protect your sessions, permissions, and configurations</span> </h3> <span class="sec-card-toggle" aria-hidden="true">&#9662;</span> </button> <div class="sec-card-body"> <h4 class="sec-intro-subtitle">Why this matters</h4> <ul class="sec-intro-list"> <li><strong>Prompt injection defense</strong> &mdash; Your LLM processes content from the outside world: web searches, emails, documents, links. Any of these can carry hidden instructions targeting DollhouseMCP &mdash; attempting to create malicious elements, alter permissions, or change your configuration. Authentication ensures those attempts fail. The attacker doesn&rsquo;t have your token, and TOTP means sensitive operations require a code from your phone that no injection can reach.</li> <li><strong>Defense in depth</strong> &mdash; DollhouseMCP validates and sanitizes inputs at the server level, but no single layer is foolproof. Authentication adds an independent barrier: even if an attack gets past input validation, it still can&rsquo;t perform privileged operations without your credentials.</li> <li><strong>Shared environments</strong> &mdash; On shared workstations, multi-user servers, or containers with mapped ports, authentication prevents other users or network-adjacent processes from accessing this console or any of its capabilities.</li> </ul> <h4 class="sec-intro-subtitle">How it works</h4> <ul class="sec-intro-list"> <li><strong>Console Token</strong> &mdash; A secret key generated on first run. Every API request must carry it. Without the token, other processes on your machine can&rsquo;t touch the console. Use the <strong>Copy</strong> button below to share the token with external services, scripts, or tools that need to access the DollhouseMCP API on your behalf.</li> <li><strong>Authenticator (TOTP)</strong> &mdash; An optional second factor from your phone. Even if the token leaks, sensitive actions like rotation still need a 6-digit code from your authenticator app that changes every 30 seconds.</li> </ul> <a class="sec-intro-link" href="https://github.com/DollhouseMCP/mcp-server/blob/main/docs/guides/console-auth.md" target="_blank" rel="noopener">Full documentation &rarr;</a> </div> </section> </template> <dialog id="element-modal" class="modal" aria-labelledby="modal-title"> <div class="modal-overlay" id="modal-overlay"></div> <div class="modal-dialog"> <header class="modal-header"> <div class="modal-heading"> <h2 class="modal-title" id="modal-title">Loading...</h2> <span class="modal-type"></span> </div> <div class="modal-meta"> <span class="modal-author"></span> <span class="modal-version"></span> <span class="modal-date"></span> <span class="modal-source source-badge"></span> </div> <button class="modal-close" id="modal-close" aria-label="Close element detail">&#x2715;</button> </header> <div class="modal-toolbar" id="modal-toolbar"> <button class="modal-action-btn" id="btn-render">&#8644; Raw</button> <button class="modal-action-btn" id="btn-copy">&#9112; Copy</button> <button class="modal-action-btn" id="btn-download">&#10515; Download</button> <a class="modal-action-btn" id="btn-github" target="_blank" rel="noopener noreferrer">&#8599; GitHub</a> <a class="modal-action-btn modal-action-btn--submit" id="btn-submit" target="_blank" rel="noopener noreferrer" style="display:none">&#8593; Submit</a> <div class="modal-nav" id="modal-nav"> <button class="modal-nav-btn" id="btn-prev-element">&#8249;<span class="sr-only"> Previous element</span></button> <span class="modal-nav-count" id="modal-nav-count"></span> <button class="modal-nav-btn" id="btn-next-element">&#8250;<span class="sr-only"> Next element</span></button> </div> </div> <div class="modal-body" id="modal-body"></div> </div> </dialog> <footer class="site-footer"> <div class="footer-inner"> <a href="https://github.com/DollhouseMCP/mcp-server" class="footer-link">GitHub Repository</a> <a href="./collection-index.json" class="footer-link">JSON API</a> <a href="https://dollhousemcp.com" class="footer-link">DollhouseMCP</a> <span class="footer-version" id="footer-version" aria-live="polite" aria-atomic="true"></span> <span class="footer-updated" id="footer-updated"></span> <span class="footer-copyright">&copy; 2026 DollhouseMCP</span> </div> </footer> <!-- Markdown rendering (same libs as Merview) --> <script src="https://cdn.jsdelivr.net/npm/marked@11.1.1/marked.min.js" integrity="sha384-zbcZAIxlvJtNE3Dp5nxLXdXtXyxwOdnILY1TDPVmKFhl4r4nSUG1r8bcFXGVa4Te" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js" integrity="sha384-F/bZzf7p3Joyp5psL90p/p89AZJsndkSoGwRpXcZhleCWhd8SnRuoYo4d0yirjJp" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/js-yaml@4.1.0/dist/js-yaml.min.js" integrity="sha384-+pxiN6T7yvpryuJmE1gM9PX7yQit15auDb+ZwwvJOd/4be2Cie5/IuVXgQb/S9du" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/dompurify@3.2.4/dist/purify.min.js" integrity="sha384-eEu5CTj3qGvu9PdJuS+YlkNi7d2XxQROAFYOr59zgObtlcux1ae1Il3u7jvdCSWu" crossorigin="anonymous"></script> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github.min.css" integrity="sha512-0aPQyyeZrWj9sCA46UlmWgKOP0mUipLQ6OZXu8l4IcAmD2u31EPEy9VcIMvl7SoAaKe8bLXZhYoMaE/in+gcgA==" crossorigin="anonymous" id="hljs-theme-light"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github-dark.min.css" integrity="sha512-rO+olRTkcf304DQBxSWxln8JXCzTHlKnIdnMUwYvQa9/Jd4cQaNkItIUj6Z4nvW1dqK0SKXLbn9h4KwZTNtAyw==" crossorigin="anonymous" id="hljs-theme-dark" disabled> <!-- uPlot for metrics charts --> <script src="https://cdn.jsdelivr.net/npm/uplot@1.6.30/dist/uPlot.iife.min.js" integrity="sha384-1NEYi76CBpge3gahk4+X4M4JzdOV3WYq84RnByqYdAd5SdvJBTNCPFh/nsoHfN6i" crossorigin="anonymous"></script> <!-- Console auth helper must load first — it reads the token meta tag and exposes window.DollhouseAuth for all subsequent scripts (#1780). --> <script src="consoleAuth.js?v={{DOLLHOUSE_ASSET_VERSION}}"></script> <script src="setup.js?v={{DOLLHOUSE_ASSET_VERSION}}"></script> <script src="app.js?v={{DOLLHOUSE_ASSET_VERSION}}"></script> <script src="logs.js?v={{DOLLHOUSE_ASSET_VERSION}}"></script> <script src="metrics.js?v={{DOLLHOUSE_ASSET_VERSION}}"></script> <script src="permissions.js?v={{DOLLHOUSE_ASSET_VERSION}}"></script> <script src="sessions.js?v={{DOLLHOUSE_ASSET_VERSION}}"></script> <script src="security.js?v={{DOLLHOUSE_ASSET_VERSION}}"></script> </body> </html>