> ## Documentation Index
> Fetch the complete documentation index at: https://learn.actionist.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# MCP servers

> Install, configure, and manage Model Context Protocol servers — the open standard that gives every agent access to real external tools.

<div className="mxp-hero xc-border">
  <div className="exp-eyebrow mxp-rise">OPEN STANDARD</div>

  <h2 className="mxp-hero-title mxp-rise" style={{animationDelay:'0.06s'}}>
    One install. <span style={{background:'linear-gradient(90deg,#24A4FF,#9000FF,#E3008E)',WebkitBackgroundClip:'text',backgroundClip:'text',color:'transparent'}}>Every agent gets the tool.</span>
  </h2>

  <p className="mxp-hero-dek mxp-rise" style={{animationDelay:'0.13s'}}>
    MCP — the Model Context Protocol — is the open standard that lets agents call external apps and services as if they were built-in tools. Connect a server once and every agent in your workspace can use it. No per-agent wiring, no API wrapper code, no secrets sitting on disk unprotected.
  </p>
</div>

<div className="w-full py-10">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">How it works at runtime</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">Watch an agent discover and call a tool.</h2>

    <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
      Agents never hardcode tool names. They search the live catalog, read the description, and call the right tool — lazy discovery means you can add a new MCP server and agents find its tools automatically, no prompt-editing required.
    </p>
  </div>

  <div className="mxp-window">
    <div className="mxp-window-bar">
      <span className="mxp-window-dot" />

      <span className="mxp-window-dot" />

      <span className="mxp-window-dot" />

      <span className="mxp-window-title">chat · maya — "post a Slack update about the deploy"</span>
    </div>

    <div className="mxp-window-body">
      <div className="mxp-s1"><span className="mxp-stream-event">tool · search\_mcp\_tools · "send slack message"</span></div>
      <div className="mxp-stream-line mxp-s2"><span className="mxp-stream-time">result</span><span className="mxp-stream-text">3 tools matched in the connected MCP catalog:</span></div>

      <div className="mxp-s3">
        <div className="xmc-tool-result"><span className="xmc-tool-name">slack\_post\_message</span><span className="xmc-tool-desc">Post a message to a Slack channel or DM</span></div>
        <div className="xmc-tool-result"><span className="xmc-tool-name">slack\_post\_thread\_reply</span><span className="xmc-tool-desc">Reply inside an existing Slack thread</span></div>
        <div className="xmc-tool-result"><span className="xmc-tool-name">slack\_update\_message</span><span className="xmc-tool-desc">Edit a message you previously posted</span></div>
      </div>

      <div className="mxp-s4"><span className="mxp-stream-event">tool · describe\_mcp\_tool · "slack\_post\_message"</span></div>
      <div className="mxp-stream-line mxp-s5"><span className="mxp-stream-time">result</span><span className="mxp-stream-text">Required: <em>channel</em> (string), <em>text</em> (string). Optional: <em>blocks</em> (array). OAuth scope: <em>chat:write</em>.</span></div>
      <div className="mxp-s6"><span className="mxp-stream-event">tool · slack\_post\_message · #deploys</span></div>
      <div className="mxp-stream-line mxp-s7"><span className="mxp-stream-time">maya</span><span className="mxp-stream-text">Posted to <em>#deploys</em>: "v2.4.1 is live — rollout complete, no errors in the first 5 min window."<span className="mxp-caret" /></span></div>
    </div>
  </div>

  <div className="exp-surface-grid" style={{marginTop:'22px'}}>
    <div className="exp-surface-tile">
      <strong>Lazy discovery.</strong> Agents call <code>search\_mcp\_tools</code> at runtime — they never need a hardcoded list of tool names. Add a server and it is automatically findable.
    </div>

    <div className="exp-surface-tile">
      <strong>Describe before calling.</strong> <code>describe\_mcp\_tool</code> fetches the full schema for a specific tool — required parameters, types, and OAuth scopes — so the agent calls it correctly the first time.
    </div>

    <div className="exp-surface-tile">
      <strong>One server, every agent.</strong> The Slack server was installed once at the workspace level. Maya found and called it without any per-agent setup.
    </div>
  </div>
</div>

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Real unlocks</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">What one server connection unlocks.</h2>

    <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
      Install a server, authorize once, and your agents can act on live data the same hour — no integration code, no export pipeline.
    </p>
  </div>

  <div className="xc-recipes">
    <div className="xc-recipe">
      <div className="xc-recipe-who">
        <i style={{background:'linear-gradient(135deg,#24A4FF,#6C37FF)'}} />

        Dario · Sales
      </div>

      <div className="xc-recipe-flow">
        Connects the <em>Linear MCP server</em>. His standup agent queries open issues, pulls cycle progress, and posts a <em>10-line digest</em> to Slack before the 09:00 call — without Dario touching the board.
      </div>

      <span className="xc-recipe-save">saves \~25 min/day</span>
    </div>

    <div className="xc-recipe">
      <div className="xc-recipe-who">
        <i style={{background:'linear-gradient(135deg,#E3008E,#FD840C)'}} />

        June · E-commerce
      </div>

      <div className="xc-recipe-flow">
        Connects the <em>Stripe MCP server</em>. Her support agent looks up <em>payment intent status</em> and charge history mid-chat, so refund decisions happen in the same conversation — no dashboard tab-switching.
      </div>

      <span className="xc-recipe-save">live in 10 min</span>
    </div>

    <div className="xc-recipe">
      <div className="xc-recipe-who">
        <i style={{background:'linear-gradient(135deg,#486EFF,#9000FF)'}} />

        Sam · Solo founder
      </div>

      <div className="xc-recipe-flow">
        Connects the <em>Notion MCP server</em>. After each call, his meeting agent writes a <em>structured note</em> — attendees, decisions, next actions — directly into the right Notion database page, filed and linked before Sam closes the window.
      </div>

      <span className="xc-recipe-save">saves \~3 hrs/wk</span>
    </div>
  </div>

  <div className="xc-quote" style={{marginTop:'32px'}}>
    <p>Your agents act on your live tools — not on a stale copy of your data exported last Tuesday.</p>
    <span>MCP design principle · every tool call reaches the real system</span>
  </div>
</div>

<hr className="xc-divider" />

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Live health</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">Reading the status dots.</h2>

    <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
      Every server in the installed strip shows a live dot. Actionist polls connection state every 2 seconds after any change, for up to 5 minutes, so the dot reflects real runtime state — not a stale cache. The pulse behavior itself signals urgency.
    </p>
  </div>

  <div className="xmc-dots-grid">
    <div className="xmc-dot-card">
      <div className="xmc-dot-row">
        <span className="xmc-dot is-connected" />

        <span className="xmc-dot-label">Connected</span>
      </div>

      <p className="xmc-dot-desc">The server is running and its tools are available to agents. Steady — no pulse needed.</p>
      <span className="xmc-dot-action">no action required</span>
    </div>

    <div className="xmc-dot-card">
      <div className="xmc-dot-row">
        <span className="xmc-dot is-connecting" />

        <span className="xmc-dot-label">Connecting...</span>
      </div>

      <p className="xmc-dot-desc">Actionist is spinning up or negotiating the connection. Wait — it will resolve to Connected or Error.</p>
      <span className="xmc-dot-action">wait a moment</span>
    </div>

    <div className="xmc-dot-card">
      <div className="xmc-dot-row">
        <span className="xmc-dot is-needs-auth" />

        <span className="xmc-dot-label">Needs auth</span>
      </div>

      <p className="xmc-dot-desc">The OAuth token is missing or expired. Open the drawer and click <strong>Connect</strong> to start a fresh PKCE flow — no reinstall.</p>
      <span className="xmc-dot-action">click Connect in drawer</span>
    </div>

    <div className="xmc-dot-card">
      <div className="xmc-dot-row">
        <span className="xmc-dot is-disabled" />

        <span className="xmc-dot-label">Disabled</span>
      </div>

      <p className="xmc-dot-desc">You or a policy turned the server off. Its tools are hidden from agents. Toggle it back on to reconnect without re-entering credentials.</p>
      <span className="xmc-dot-action">toggle on in drawer</span>
    </div>

    <div className="xmc-dot-card">
      <div className="xmc-dot-row">
        <span className="xmc-dot is-error" />

        <span className="xmc-dot-label">Error</span>
      </div>

      <p className="xmc-dot-desc">The server process exited or returned an error. Open the drawer to read the error message, then reconnect or edit the config.</p>
      <span className="xmc-dot-action">read error in drawer</span>
    </div>
  </div>

  {/* TODO(image): mcp-needs-auth — IMAGE SPEC: Server drawer for an OAuth server (e.g., Slack or Linear) in 'Needs auth' state: orange status dot with label 'Needs auth', a prominent Connect button, and the server name and description at the top of the drawer panel. — replace this CSS mock with the real screenshot */}

  <div className="mxp-window" style={{margin:'24px 0'}}>
    <div className="mxp-window-bar">
      <span className="mxp-window-dot" />

      <span className="mxp-window-dot" />

      <span className="mxp-window-dot" />

      <span className="mxp-window-title">Actionist · MCP drawer · Needs auth</span>
    </div>

    <div className="xmc-mock-body">
      <div className="xmc-mock-drawer">
        <div className="xmc-mock-drawer-header">
          <span className="xmc-mdot o" />

          <span className="xmc-mock-drawer-title">Slack</span>
          <span className="xmc-mock-badge orange">Needs auth</span>
        </div>

        <div className="xmc-mock-drawer-body">
          <p style={{fontSize:'12px',opacity:0.6,margin:'0 0 12px'}}>Post messages, manage channels, and read workspace data. Requires OAuth — sign in to authorise Actionist.</p>
          <div className="xmc-mock-section-label">Status</div>

          <div style={{display:'flex',alignItems:'center',gap:'8px',marginBottom:'12px'}}>
            <span className="xmc-mdot o" />

            <span style={{fontSize:'12.5px',fontWeight:600,color:'#b85c00'}}>Needs auth — OAuth token missing or expired</span>
          </div>
        </div>

        <div className="xmc-mock-drawer-footer">
          <span className="xmc-mock-btn secondary">Edit config</span>
          <span className="xmc-mock-btn primary">Connect</span>
        </div>
      </div>
    </div>
  </div>

  <p className="xmc-mock-caption">Mock illustration — replace with the real screenshot when available.</p>
</div>

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Transports</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">Three ways a server connects.</h2>

    <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
      Every MCP server communicates over one of three transports. Actionist handles all three — the transport determines where the server runs and how Actionist reaches it.
    </p>
  </div>

  <div className="xmc-trip exp-tool-shell xc-try">
    <div className="mxp-srch-chips">
      <label htmlFor="xmc-tr-a"><input className="mxp-r" type="radio" name="xmc-tr" id="xmc-tr-a" defaultChecked />STDIO — local subprocess</label>
      <label htmlFor="xmc-tr-b"><input className="mxp-r" type="radio" name="xmc-tr" id="xmc-tr-b" />HTTP — remote endpoint</label>
      <label htmlFor="xmc-tr-c"><input className="mxp-r" type="radio" name="xmc-tr" id="xmc-tr-c" />SSE — event stream</label>
    </div>

    <div className="xmc-tp xmc-tp-a">
      <span className="xmc-transport-badge xmc-stdio">STDIO</span>
      <div className="xmc-form-row"><strong>Transport</strong> STDIO — Actionist spawns the server as a child process on your machine</div>
      <div className="xmc-form-row"><strong>Command</strong> <code>uvx</code></div>
      <div className="xmc-form-row"><strong>Arguments</strong> <code>mcp-server-filesystem /Users/me/data</code></div>
      <div className="xmc-form-row"><strong>Env vars</strong> <code>WORKSPACE\_ROOT=/Users/me/data</code></div>

      <p className="xmc-transport-note">
        <strong>When to use:</strong> Any server packaged as a CLI binary — Python-based servers via <code>uvx</code>, Node-based via <code>npx</code>, Go binaries, and custom scripts. The server process lives on your machine; Actionist communicates over its stdin/stdout. Needs a runtime dependency (<code>uv</code>, <code>node</code>, etc.) — see <a href="#dependency-management-for-local-servers">Dependency management</a> below.
      </p>
    </div>

    <div className="xmc-tp xmc-tp-b">
      <span className="xmc-transport-badge xmc-http">HTTP</span>
      <div className="xmc-form-row"><strong>Transport</strong> HTTP — Actionist sends JSON-RPC requests to a remote URL</div>
      <div className="xmc-form-row"><strong>URL</strong> <code>[https://mcp.example.com/v1](https://mcp.example.com/v1)</code></div>
      <div className="xmc-form-row"><strong>Auth header</strong> <code>Authorization: Bearer \{token}</code></div>
      <div className="xmc-form-row"><strong>Timeout</strong> <code>30 s (default)</code></div>

      <p className="xmc-transport-note">
        <strong>When to use:</strong> Hosted MCP servers — your own backend, a team-shared service, or any third-party endpoint that speaks the MCP HTTP transport. No local runtime needed. Credentials go through the vault — check the <strong>Secret</strong> checkbox for the token and select <strong>Authorization Bearer</strong> as the Project-as transform.
      </p>
    </div>

    <div className="xmc-tp xmc-tp-c">
      <span className="xmc-transport-badge xmc-sse">SSE</span>
      <div className="xmc-form-row"><strong>Transport</strong> SSE — Actionist keeps a persistent event-stream connection open</div>
      <div className="xmc-form-row"><strong>URL</strong> <code>[https://mcp.example.com/events](https://mcp.example.com/events)</code></div>
      <div className="xmc-form-row"><strong>Reconnect</strong> <code>automatic — 5 s back-off</code></div>
      <div className="xmc-form-row"><strong>Auth</strong> <code>header or query param</code></div>

      <p className="xmc-transport-note">
        <strong>When to use:</strong> Servers that push state changes to the agent — live data feeds, notification bridges, streaming workflows. The connection stays open; Actionist auto-reconnects with exponential back-off if the stream drops. Credentials are vaulted identically to HTTP.
      </p>
    </div>
  </div>
</div>

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Navigation</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">Where to find it.</h2>

    <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
      MCP management lives inside the Apps section — follow the path below to get there.
    </p>
  </div>

  {/* Branded flow diagram — replaces mermaid block
        Original nodes: Sidebar → Apps tab → MCPs page
          → Installed strip / Bundled tab / Custom tab
          → Catalog / Add custom MCP server */}

  <div className="xmc-nav-flow">
    <div className="xmc-flow-row">
      <span className="xmc-flow-node">Left sidebar</span>
      <span className="xmc-flow-arrow" /><span className="xmc-flow-label">click</span>
      <span className="xmc-flow-node">Apps tab</span>
      <span className="xmc-flow-arrow" /><span className="xmc-flow-label">click MCPs sub-tab</span>
      <span className="xmc-flow-node">MCPs page · /apps/mcps</span>
    </div>

    <div className="xmc-flow-branch">
      <div className="xmc-flow-row">
        <span className="xmc-flow-node is-leaf">Installed strip</span>

        <span className="xmc-flow-arrow" />

        <span className="xmc-flow-node is-leaf">Status dots per server</span>
      </div>

      <div className="xmc-flow-row">
        <span className="xmc-flow-node is-leaf">Bundled tab (default)</span>

        <span className="xmc-flow-arrow" />

        <span className="xmc-flow-node is-leaf">Live catalog — search, sort, install</span>
      </div>

      <div className="xmc-flow-row">
        <span className="xmc-flow-node is-leaf">Custom tab</span>

        <span className="xmc-flow-arrow" />

        <span className="xmc-flow-node is-leaf">Add custom MCP server</span>
      </div>
    </div>
  </div>

  <p className="text-base text-gray-600 dark:text-gray-400 mt-6">
    At the top of the page, the installed strip shows every server you have added with a colored status dot. Below it, the <strong>Bundled</strong> tab is active by default — this is the live catalog managed by Actionist. The <strong>Custom</strong> tab shows servers you have added yourself.
  </p>

  <p className="text-base text-gray-600 dark:text-gray-400 mt-4">
    Search the catalog using the bar labeled <em>"Search MCPs by name, description, tags"</em>. Sort results by <strong>Relevance</strong>, <strong>Most installed</strong>, <strong>Highest rated</strong>, or <strong>Newest</strong>. To browse the full community collection, click <strong>Explore Marketplace</strong>.
  </p>
</div>

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Install flow</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">Install from the catalog.</h2>

    <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
      The steps below follow a Slack installation — an OAuth server — as the example. Servers that do not require OAuth skip steps 5–6.
    </p>
  </div>

  {/* animated install lifecycle */}

  <div className="exp-tool-shell" style={{padding:'20px 24px', marginBottom:'28px'}}>
    <div className="mxp-mock-row" style={{marginBottom:0}}>
      <span style={{fontFamily:'"JetBrains Mono", monospace', fontSize:13, flex:'none'}}>Slack MCP <span style={{opacity:0.5,fontSize:11}}>· OAuth · catalog</span></span>

      <span className="mxp-life">
        <span className="lf1"><i style={{background:'#6C37FF'}} />Installing...</span>
        <span className="lf2"><i style={{background:'#FD840C'}} />Needs auth — click Connect</span>
        <span className="lf3"><i style={{background:'#AF35FF'}} />Connecting...</span>
        <span className="lf4"><i style={{background:'#0CBD7B'}} /><span className="mxp-badge-x" style={{borderColor:'rgba(12,189,123,0.5)',color:'#0CBD7B',background:'rgba(12,189,123,0.08)'}}>connected</span> 14 tools available</span>
      </span>
    </div>
  </div>

  <Steps>
    <Step title="Open Apps, then MCPs" icon="layout-list">
      Click <strong>Apps</strong> in the left sidebar, then click the <strong>MCPs</strong> sub-tab at the top of the panel.
    </Step>

    <Step title="Find the server" icon="search">
      In the <strong>Bundled</strong> catalog, type in the search bar or browse by category. Click a server card to open its drawer.
    </Step>

    <Step title="Click Install" icon="download">
      Click <strong>Install</strong> in the drawer. If the server needs a local runtime (e.g., `uv` for a Python-based server), Actionist checks for it — see [Dependency management](#dependency-management-for-local-servers) below.
    </Step>

    <Step title="Fill in required config" icon="settings">
      If the server has required fields (environment variables, API base URLs), the <strong>Configure</strong> modal appears automatically. Fill in the fields and click <strong>Save</strong>.
    </Step>

    <Step title="Authorize via OAuth if required" icon="key">
      OAuth-protected servers show an orange <strong>Needs auth</strong> dot after install. Click <strong>Connect</strong> in the drawer. Actionist opens your default browser for the OAuth PKCE flow. Authorize the app and return — the token saves automatically.
    </Step>

    <Step title="Confirm the green dot" icon="circle-check">
      Once authorized, the status dot turns green and shows <strong>Connected</strong>. The server's tools are now available to every agent in your workspace.
    </Step>
  </Steps>

  {/* TODO(image): mcp-overview — IMAGE SPEC: Full screenshot of /apps/mcps: installed strip at top with 3–4 servers (one green Connected, one orange Needs auth, one grey Disconnected), the Bundled/Custom tab bar with Bundled active, the search bar with placeholder text visible, and a grid of catalog cards. Show the 'Explore Marketplace' button top-right. — replace this CSS mock with the real screenshot */}

  <div className="mxp-window" style={{margin:'24px 0'}}>
    <div className="mxp-window-bar">
      <span className="mxp-window-dot" />

      <span className="mxp-window-dot" />

      <span className="mxp-window-dot" />

      <span className="mxp-window-title">Actionist · Apps · MCPs · /apps/mcps</span>
    </div>

    <div className="xmc-mock-body">
      <div className="xmc-mock-section-label">Installed</div>

      <div className="xmc-mock-server-row">
        <span className="xmc-mdot g" />

        <span className="xmc-mock-server-name">Slack</span>
        <span className="xmc-mock-badge green">Connected · 14 tools</span>
      </div>

      <div className="xmc-mock-server-row">
        <span className="xmc-mdot o" />

        <span className="xmc-mock-server-name">Linear</span>
        <span className="xmc-mock-badge orange">Needs auth</span>
      </div>

      <div className="xmc-mock-server-row">
        <span className="xmc-mdot gy" />

        <span className="xmc-mock-server-name">Filesystem</span>
        <span className="xmc-mock-badge grey">Disabled</span>
      </div>

      <div style={{display:'flex',alignItems:'center',justifyContent:'space-between',margin:'14px 0 8px'}}>
        <div style={{display:'flex',gap:'8px'}}>
          <span className="xmc-mock-btn primary" style={{fontSize:'11px',padding:'4px 12px'}}>Bundled</span>
          <span className="xmc-mock-btn secondary" style={{fontSize:'11px',padding:'4px 12px'}}>Custom</span>
        </div>

        <span className="xmc-mock-btn secondary" style={{fontSize:'11px',padding:'4px 12px'}}>Explore Marketplace</span>
      </div>

      <div className="xmc-mock-field">
        <div className="xmc-mock-field-input" style={{color:'inherit',opacity:0.45}}>Search MCPs by name, description, tags</div>
      </div>

      <div className="xmc-mock-card-grid">
        <div className="xmc-mock-card"><span className="xmc-mock-card-name">GitHub</span><span className="xmc-mock-card-cat">Version control</span></div>
        <div className="xmc-mock-card"><span className="xmc-mock-card-name">Notion</span><span className="xmc-mock-card-cat">Knowledge</span></div>
        <div className="xmc-mock-card"><span className="xmc-mock-card-name">Jira</span><span className="xmc-mock-card-cat">Project mgmt</span></div>
        <div className="xmc-mock-card"><span className="xmc-mock-card-name">Stripe</span><span className="xmc-mock-card-cat">Payments</span></div>
        <div className="xmc-mock-card"><span className="xmc-mock-card-name">Postgres</span><span className="xmc-mock-card-cat">Database</span></div>
        <div className="xmc-mock-card"><span className="xmc-mock-card-name">Figma</span><span className="xmc-mock-card-cat">Design</span></div>
      </div>
    </div>
  </div>

  <p className="xmc-mock-caption">Mock illustration — replace with the real screenshot when available.</p>
</div>

<hr className="xc-divider" />

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Custom servers</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">Add your own server.</h2>

    <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
      Click <strong>Add custom MCP</strong> on the MCPs page. The modal opens with two input modes — pick the one that fits your situation.
    </p>
  </div>

  <Tabs>
    <Tab title="Form view">
      Use the Form view when you are configuring a server from scratch. Every field has its own labeled input.

      <Steps>
        <Step title="Open the modal" icon="circle-plus">
          Click <strong>Add custom MCP</strong> on the MCPs page. The <strong>Add custom MCP server</strong> modal opens showing the <strong>Form</strong> view by default.
        </Step>

        <Step title="Name and describe the server" icon="pencil">
          Enter a <strong>Name</strong> (e.g., "Internal KB") and a short <strong>Description</strong> so you know what this server exposes later.
        </Step>

        <Step title="Choose the transport" icon="network">
          Select <strong>STDIO</strong>, <strong>HTTP</strong>, or <strong>SSE</strong>. For a local subprocess, choose STDIO and fill in the <strong>Command</strong> (e.g., `uvx`) and <strong>Arguments</strong> (e.g., `mcp-server-filesystem /data`).
        </Step>

        <Step title="Add credentials" icon="lock">
          In the <strong>Credentials</strong> section, add any environment variables the server needs. For API keys and tokens, check the <strong>Secret</strong> checkbox next to each sensitive value — see [Secret credentials and the vault](#secret-credentials-and-the-vault) below.
        </Step>

        <Step title="Test the connection" icon="flask-conical">
          Click <strong>Test</strong>. Actionist spins up a temporary connection and shows <strong>"Connected · N tools"</strong> on success, or an error banner if something is wrong. Nothing is saved until you confirm.
        </Step>

        <Step title="Save the server" icon="check">
          Click <strong>Add server</strong>. The server appears in the installed strip and its tools are immediately available to agents.
        </Step>
      </Steps>
    </Tab>

    <Tab title="JSON import">
      Use the JSON view when you have an existing MCP server config — for example, one already set up in another MCP client.

      <Steps>
        <Step title="Switch to JSON view" icon="code">
          Click <strong>JSON</strong> in the modal header. The input area changes to a code editor.
        </Step>

        <Step title="Paste your config" icon="clipboard">
          Paste a standard mcp-server format JSON object. The modal auto-detects the format and shows a green <strong>"Detected config"</strong> banner when it recognizes a valid shape.
        </Step>

        <Step title="Test and save" icon="check">
          Click <strong>Test</strong> to verify the connection, then click <strong>Add server</strong> to commit.
        </Step>
      </Steps>

      <Tip>This is the fastest way to bring over servers you already have running elsewhere — paste once and you're done.</Tip>
    </Tab>
  </Tabs>

  {/* TODO(image): mcp-add-custom-form — IMAGE SPEC: 'Add custom MCP server' modal with the Form tab active. Show: Name field filled with 'Internal KB', Transport set to STDIO, Command field with value 'uvx', Args field with 'mcp-server-filesystem /data', and a Credentials section with one env var row where the Secret checkbox is checked and visually highlighted. — replace this CSS mock with the real screenshot */}

  <div className="mxp-window" style={{margin:'24px 0'}}>
    <div className="mxp-window-bar">
      <span className="mxp-window-dot" />

      <span className="mxp-window-dot" />

      <span className="mxp-window-dot" />

      <span className="mxp-window-title">Actionist · Add custom MCP server · Form view</span>
    </div>

    <div className="xmc-mock-body">
      <div style={{display:'flex',gap:'8px',marginBottom:'14px'}}>
        <span className="xmc-mock-btn primary" style={{fontSize:'11px',padding:'4px 12px'}}>Form</span>
        <span className="xmc-mock-btn secondary" style={{fontSize:'11px',padding:'4px 12px'}}>JSON</span>
      </div>

      <div className="xmc-mock-field">
        <span className="xmc-mock-field-label">Name</span>
        <div className="xmc-mock-field-input">Internal KB</div>
      </div>

      <div className="xmc-mock-field">
        <span className="xmc-mock-field-label">Transport</span>

        <div className="xmc-mock-field-input">
          <span className="xmc-transport-badge xmc-stdio" style={{marginBottom:0}}>STDIO</span>
        </div>
      </div>

      <div className="xmc-mock-field">
        <span className="xmc-mock-field-label">Command</span>
        <div className="xmc-mock-field-input">uvx</div>
      </div>

      <div className="xmc-mock-field">
        <span className="xmc-mock-field-label">Arguments</span>
        <div className="xmc-mock-field-input">mcp-server-filesystem /data</div>
      </div>

      <div className="xmc-mock-section-label">Credentials</div>

      <div className="xmc-mock-server-row" style={{border:'1px solid rgb(144 0 255 / 0.3)',background:'rgb(144 0 255 / 0.04)'}}>
        <span style={{fontFamily:'"JetBrains Mono",monospace',fontSize:'12px',flex:1}}>API\_KEY</span>
        <span style={{fontFamily:'"JetBrains Mono",monospace',fontSize:'12px',opacity:0.5,flex:2}}>sk-••••••••</span>

        <div className="xmc-mock-check-row" style={{padding:0}}>
          <span className="xmc-mock-checkbox checked" />

          <span style={{fontSize:'11px',fontWeight:600,color:'rgb(var(--actionist-purple))'}}>Secret</span>
        </div>
      </div>

      <div style={{display:'flex',justifyContent:'flex-end',gap:'8px',marginTop:'14px'}}>
        <span className="xmc-mock-btn secondary">Test</span>
        <span className="xmc-mock-btn primary">Add server</span>
      </div>
    </div>
  </div>

  <p className="xmc-mock-caption">Mock illustration — replace with the real screenshot when available.</p>
</div>

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Security</span>
    <h2 id="secret-credentials-and-the-vault" className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">Secret credentials and the vault.</h2>

    <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
      Every credential field in the Add Custom modal has a <strong>Secret</strong> checkbox. When you check it, Actionist routes the value through the credentials vault — it never lands in <code>mcp-servers.json</code> as plaintext. Unchecked values are stored verbatim on disk.
    </p>
  </div>

  <Warning>
    Always mark API keys, tokens, and passwords as Secret before saving. Unchecked values are written to `mcp-servers.json` in plain text. If you saved a key without checking Secret, rotate it and re-save with Secret checked.
  </Warning>

  <p className="text-base text-gray-600 dark:text-gray-400 mt-6 mb-6">
    Once a value is vaulted, you can rotate it from <strong>Settings → Credentials Vault</strong> and every MCP server bound to that credential picks up the new value automatically — no per-server edit required.
  </p>

  {/* vault pipeline */}

  <div style={{margin:'28px 0 12px'}}>
    <div className="mxp-pipe">
      <div className="mxp-pipe-node"><strong>Secret checkbox</strong><span>You mark a credential field as Secret in the Add Custom modal.</span></div>

      <div className="mxp-pipe-link" />

      <div className="mxp-pipe-node"><strong>Vault entry</strong><span>The value is stored encrypted in Settings → Credentials Vault — never in mcp-servers.json.</span></div>

      <div className="mxp-pipe-link d2" />

      <div className="mxp-pipe-node"><strong>Project-as</strong><span>You choose how the vault injects the secret: env var, Bearer header, custom header, or JSON wrapper.</span></div>

      <div className="mxp-pipe-link d3" />

      <div className="mxp-pipe-node"><strong>Runtime inject</strong><span>At spawn time the real value is injected silently. Rotate in the vault once; every bound server updates.</span></div>
    </div>
  </div>

  <h3 className="text-xl font-semibold tracking-tight text-gray-900 dark:text-gray-50 mb-4 mt-8">Project-as transforms</h3>

  <p className="text-base text-gray-600 dark:text-gray-400 mb-6">
    After marking a credential as Secret, choose how Actionist injects it into the server process using the <strong>Project as</strong> dropdown:
  </p>

  <div className="xmc-project-grid">
    <div className="xmc-project-tile">
      <span className="xmc-mono-tag">Direct</span>
      <strong>Direct (default)</strong>
      <p>The raw credential value is passed as-is — as an environment variable or inline in the command. Use this for servers that accept the token directly.</p>
    </div>

    <div className="xmc-project-tile">
      <span className="xmc-mono-tag">Bearer</span>
      <strong>Authorization Bearer</strong>
      <p>Wraps the value in an <code>Authorization: Bearer \<token></code> header at spawn time. Use for HTTP/SSE servers expecting a standard Bearer auth header.</p>
    </div>

    <div className="xmc-project-tile">
      <span className="xmc-mono-tag">Custom</span>
      <strong>Header custom</strong>
      <p>Define a custom header name and value template. Use when the downstream server expects a non-standard auth header (e.g., <code>X-Api-Key: \<token></code>).</p>
    </div>

    <div className="xmc-project-tile">
      <span className="xmc-mono-tag">JSON</span>
      <strong>Env JSON wrapper</strong>
      <p>Wraps the credential in a JSON object and injects it as a single environment variable. Useful for servers that accept a structured JSON blob as their auth config.</p>
    </div>
  </div>
</div>

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Manage</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">Managing installed servers.</h2>

    <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
      Click any server in the installed strip to open its drawer. From there you can inspect it, adjust it, or remove it.
    </p>
  </div>

  {/* TODO(image): mcp-drawer-connected — IMAGE SPEC: Server drawer for a connected server (e.g., GitHub): green 'Connected' status dot at the top, tool count badge, 'Discovered tools' section listing 4–5 tool names, with Disconnect and Edit config buttons visible in the drawer footer. — replace this CSS mock with the real screenshot */}

  <div className="mxp-window" style={{margin:'24px 0'}}>
    <div className="mxp-window-bar">
      <span className="mxp-window-dot" />

      <span className="mxp-window-dot" />

      <span className="mxp-window-dot" />

      <span className="mxp-window-title">Actionist · MCP drawer · Connected</span>
    </div>

    <div className="xmc-mock-body">
      <div className="xmc-mock-drawer">
        <div className="xmc-mock-drawer-header">
          <span className="xmc-mdot g" />

          <span className="xmc-mock-drawer-title">GitHub</span>
          <span className="xmc-mock-badge green">Connected · 8 tools</span>
        </div>

        <div className="xmc-mock-drawer-body">
          <p style={{fontSize:'12px',opacity:0.6,margin:'0 0 12px'}}>Interact with GitHub repos, issues, pull requests, and actions from any agent.</p>
          <div className="xmc-mock-section-label">Discovered tools</div>
          <div className="xmc-mock-tool-item"><span className="xmc-mock-tool-dot" />github\_create\_issue</div>
          <div className="xmc-mock-tool-item"><span className="xmc-mock-tool-dot" />github\_list\_pull\_requests</div>
          <div className="xmc-mock-tool-item"><span className="xmc-mock-tool-dot" />github\_merge\_pull\_request</div>
          <div className="xmc-mock-tool-item"><span className="xmc-mock-tool-dot" />github\_get\_file\_contents</div>
          <div className="xmc-mock-tool-item"><span className="xmc-mock-tool-dot" />github\_search\_code</div>
        </div>

        <div className="xmc-mock-drawer-footer">
          <span className="xmc-mock-btn danger">Disconnect</span>
          <span className="xmc-mock-btn secondary">Edit config</span>
        </div>
      </div>
    </div>
  </div>

  <p className="xmc-mock-caption">Mock illustration — replace with the real screenshot when available.</p>

  <AccordionGroup>
    <Accordion title="Re-authenticate an OAuth server" icon="rotate-ccw" defaultOpen={true}>
      If a server shows <strong>Needs auth</strong> (orange) or <strong>Error</strong> with an authentication cause, you do not need to uninstall and reinstall. Open the drawer and click <strong>Connect</strong> (or <strong>Reconnect</strong> if shown). Actionist restarts the PKCE OAuth flow in your browser and overwrites the stale token. The status dot returns to green once you authorize.
    </Accordion>

    <Accordion title="Disable vs. uninstall" icon="toggle-left">
      <strong>Disable</strong> (toggle in the drawer) stops the server process and hides all its tools from agents — without deleting any config or credentials. Toggle it back on to reconnect instantly. Use this when you want to temporarily pause an integration.

      <strong>Uninstall</strong> removes the server. The behavior differs by server type — see the table below.
    </Accordion>

    <Accordion title="Uninstall behavior by server type" icon="trash-2">
      The uninstall action means something different depending on where the server came from:

      | Server type     | What happens on uninstall                                                                                       |
      | --------------- | --------------------------------------------------------------------------------------------------------------- |
      | **Bundled**     | Cannot be removed. Disabling is the only option — it stops the connection and hides its tools until re-enabled. |
      | **Custom**      | The server's entry in `mcp-servers.json` is deleted. This is not reversible from the dialog.                    |
      | **Marketplace** | Ends the marketplace subscription and removes the local config. You can reinstall any time from the catalog.    |
    </Accordion>

    <Accordion title="Edit config and view discovered tools" icon="settings">
      Click <strong>Edit config</strong> in the drawer to update a custom server's command, URL, environment variables, or credentials without removing it. After reconnecting, the <strong>Discovered tools</strong> section lists every tool the server exposed, so you can verify the connection picked up what you expected.
    </Accordion>

    <Accordion title="Publish to the marketplace" icon="share-2">
      From any custom server's drawer, click <strong>Publish</strong> to submit it to the community marketplace. This makes it available for other Actionist users to install from the catalog.
    </Accordion>
  </AccordionGroup>
</div>

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Runtimes</span>
    <h2 id="dependency-management-for-local-servers" className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">Dependency management for local servers.</h2>

    <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
      STDIO servers run as local subprocesses and need a runtime on your machine. Actionist checks for the required runtime before connecting — and for some runtimes, it can install them for you.
    </p>
  </div>

  <Tabs>
    <Tab title="Auto-install (uv, uvx, deno, bun, bunx)">
      If a server needs `uv`, `uvx`, `deno`, `bun`, or `bunx` and those are not present, Actionist shows the <strong>DependencyInstallModal</strong> with an install button and a live log tail inside the app.

      <Steps>
        <Step title="See the install prompt" icon="triangle-alert">
          Click <strong>Install</strong> on a catalog server. If the required runtime is missing, the DependencyInstallModal opens showing the runtime name and an <strong>Install</strong> button.
        </Step>

        <Step title="Install in-app" icon="download">
          Click <strong>Install</strong>. The modal tails the install logs live — you can watch the runtime download and configure without leaving the app.
        </Step>

        <Step title="Connect automatically" icon="plug">
          Once the install completes, Actionist proceeds to connect the server. No terminal required.
        </Step>
      </Steps>

      {/* TODO(image): mcp-dependency-modal — IMAGE SPEC: DependencyInstallModal showing a runtime name (e.g., 'uv'), the Install button, and a log-tail area with visible install output lines (e.g., 'Downloading uv 0.x.x...', 'Successfully installed uv'). — replace this CSS mock with the real screenshot */}

      <div className="mxp-window" style={{margin:'24px 0'}}>
        <div className="mxp-window-bar">
          <span className="mxp-window-dot" />

          <span className="mxp-window-dot" />

          <span className="mxp-window-dot" />

          <span className="mxp-window-title">Actionist · DependencyInstallModal · uv</span>
        </div>

        <div className="xmc-mock-body">
          <p style={{fontSize:'13px',fontWeight:600,marginBottom:'4px'}}>Runtime required: <code>uv</code></p>
          <p style={{fontSize:'12px',opacity:0.6,margin:'0 0 12px'}}>This server requires the <strong>uv</strong> Python package manager. Actionist can install it for you — no terminal needed.</p>

          <div className="xmc-mock-log">
            <span className="xmc-mock-log-line dim">Checking for uv on PATH...</span>
            <span className="xmc-mock-log-line dim">Not found. Starting install...</span>
            <span className="xmc-mock-log-line">Downloading uv 0.4.18 for darwin-arm64...</span>
            <span className="xmc-mock-log-line">Extracting archive...</span>
            <span className="xmc-mock-log-line ok">Successfully installed uv 0.4.18</span>
          </div>

          <div style={{display:'flex',justifyContent:'flex-end',marginTop:'12px'}}>
            <span className="xmc-mock-btn primary">Install</span>
          </div>
        </div>
      </div>

      <p className="xmc-mock-caption">Mock illustration — replace with the real screenshot when available.</p>
    </Tab>

    <Tab title="Manual install (npx, node)">
      If a server needs `npx` or `node`, Actionist cannot auto-install them. The <strong>DependencyGuidanceModal</strong> opens with platform-specific instructions for installing Node.js manually.

      <Steps>
        <Step title="Follow the guidance" icon="book-open">
          The modal shows the steps for your platform (macOS, Windows, or Linux). Install Node.js from the official site or via a version manager.
        </Step>

        <Step title="Click Recheck" icon="refresh-cw">
          Once Node.js is installed, return to the modal and click <strong>Recheck</strong>. Actionist re-runs the dependency check and proceeds if the runtime is found.
        </Step>
      </Steps>

      <Note>
        This applies to `npx` and `node` only. For `uv`, `uvx`, `deno`, `bun`, and `bunx`, Actionist handles the install in-app — no manual steps needed.
      </Note>
    </Tab>
  </Tabs>
</div>

<hr className="xc-divider" />

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">The idea</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">A single plug for the whole internet.</h2>

    <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
      Instead of writing hard-coded integrations, Actionist connects to MCP servers. The growing catalog means new integrations arrive without waiting for an app update. Agents make no distinction between a native Actionist action and an MCP tool at runtime.
    </p>
  </div>

  <div className="exp-surface-grid">
    <div className="exp-surface-tile">
      <strong style={{display:'block',fontSize:'14px',marginBottom:'6px'}}>One install, whole workspace</strong>
      <p style={{margin:0,fontSize:'13px',lineHeight:1.55,opacity:0.70}}>Connect a server once and every agent you have can call its tools. No per-agent configuration, no duplicated credentials.</p>
    </div>

    <div className="exp-surface-tile">
      <strong style={{display:'block',fontSize:'14px',marginBottom:'6px'}}>No API wrapper code</strong>
      <p style={{margin:0,fontSize:'13px',lineHeight:1.55,opacity:0.70}}>Instead of writing HTTP client code for each service, Actionist connects to MCP servers and agents call their tools through the standard protocol.</p>
    </div>

    <div className="exp-surface-tile">
      <strong style={{display:'block',fontSize:'14px',marginBottom:'6px'}}>Vault-backed credentials</strong>
      <p style={{margin:0,fontSize:'13px',lineHeight:1.55,opacity:0.70}}>API keys and OAuth tokens are encrypted at rest in the vault. Rotate once in Settings; every bound server picks up the new value silently.</p>
    </div>

    <div className="exp-surface-tile">
      <strong style={{display:'block',fontSize:'14px',marginBottom:'6px'}}>Lazy discovery</strong>
      <p style={{margin:0,fontSize:'13px',lineHeight:1.55,opacity:0.70}}>Agents search the tool catalog at runtime — add a new server and its tools are findable without rewriting a single agent instruction.</p>
    </div>

    <div className="exp-surface-tile">
      <strong style={{display:'block',fontSize:'14px',marginBottom:'6px'}}>Scoped per agent</strong>
      <p style={{margin:0,fontSize:'13px',lineHeight:1.55,opacity:0.70}}>Tools from all connected servers are available by default, but the Agent Studio Tools tab lets you restrict which servers each agent is allowed to use.</p>
    </div>

    <div className="exp-surface-tile">
      <strong style={{display:'block',fontSize:'14px',marginBottom:'6px'}}>Open standard</strong>
      <p style={{margin:0,fontSize:'13px',lineHeight:1.55,opacity:0.70}}>MCP is an open protocol. Any conformant server works with Actionist — community, enterprise, or your own.</p>
    </div>
  </div>

  <Info>
    MCP management — adding custom servers, viewing the Custom tab, and editing configs — requires the Actionist desktop app. The web app can browse the catalog but cannot add or manage custom servers.
  </Info>
</div>

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Best practices</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">Tips that save time.</h2>
  </div>

  <AccordionGroup>
    <Accordion title="Mark all API keys as Secret before saving" icon="lock" defaultOpen={true}>
      In the Credentials section, check the <strong>Secret</strong> checkbox next to every API key, token, or password. Checked values go to the vault; unchecked values land on disk as plaintext in <code>mcp-servers.json</code>. If you saved a key without checking Secret, rotate the credential and re-save with the checkbox checked.
    </Accordion>

    <Accordion title="Test before saving" icon="flask-conical">
      The <strong>Test</strong> button spins up a temporary connection and lists the discovered tools without writing anything to <code>mcp-servers.json</code>. Use it to catch bad URLs, wrong command flags, or missing required env vars before committing. If you see "Connected · N tools," you know the server is wired correctly.
    </Accordion>

    <Accordion title="Re-auth without uninstalling" icon="refresh-cw">
      If an OAuth server shows <strong>Needs auth</strong> or <strong>Error</strong>, open the drawer and click <strong>Connect</strong> or <strong>Reconnect</strong>. Actionist restarts the OAuth flow and overwrites the stale token — no uninstall/reinstall cycle required.
    </Accordion>

    <Accordion title="Disable instead of uninstalling when testing" icon="toggle-left">
      The toggle in the drawer pauses a server without deleting its config or credentials. If you are testing a different server that does the same job, disable the original rather than uninstalling it — you can switch back instantly.
    </Accordion>

    <Accordion title="Scope MCP server access per agent" icon="users">
      By default, tools from all connected MCP servers are available to every agent. In the Agent Studio → <strong>Tools</strong> tab, you can remove specific MCP servers from an agent's allowed list. Fewer servers mean a cleaner context window and faster, more accurate tool selection for that agent.
    </Accordion>

    <Accordion title="Import an existing config" icon="clipboard-paste">
      If you already have MCP server configs in standard format, switch to the <strong>JSON</strong> view in the Add Custom modal and paste the JSON. The normalizer detects the format automatically and fills in all fields — no manual re-entry.
    </Accordion>
  </AccordionGroup>
</div>

<div className="w-full py-10 xc-rise">
  <div className="actionist-cta-panel xc-border">
    <div className="relative z-10 flex flex-col items-center gap-5 max-w-2xl mx-auto">
      <span className="actionist-eyebrow">Instant access</span>

      <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-white leading-tight">
        Start connecting your world.
      </h2>

      <p className="text-base md:text-lg text-white/85">
        Install a server from the catalog, mark your credentials as Secret, and every agent you have gains the tools to do real work — without touching a line of integration code.
      </p>

      <div className="flex flex-wrap items-center justify-center gap-3 pt-2">
        <a className="actionist-cta-btn-primary" href="https://app.actionist.ai" target="_blank" rel="noreferrer">
          Open the Dashboard

          <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.2" strokeLinecap="round" strokeLinejoin="round">
            <path d="M5 12h14" />

            <path d="m12 5 7 7-7 7" />
          </svg>
        </a>

        <a className="actionist-cta-btn-secondary" href="/Folders/marketplace">
          Explore Marketplace
        </a>
      </div>
    </div>
  </div>
</div>

<div className="w-full pt-2 pb-6">
  <p className="actionist-trust-line">
    Credentials routed to the vault never touch disk as plaintext.<br />
    Vaulted secrets · OAuth with PKCE · Scoped per agent.
  </p>
</div>

<div className="w-full pb-16">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Keep going</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">Next steps.</h2>
  </div>

  <Columns cols={4}>
    <Card title="Credentials vault" icon="shield" href="/Folders/credentials">
      Manage vaulted secrets, rotate API keys once, and see every server they are bound to.
    </Card>

    <Card title="Agents — tools tab" icon="users" href="/Folders/agents">
      Scope which MCP servers each agent is allowed to use from the Agent Studio Tools tab.
    </Card>

    <Card title="Marketplace" icon="store" href="/Folders/marketplace">
      Browse, install, and publish MCP servers to the community catalog.
    </Card>

    <Card title="Skills" icon="puzzle" href="/Folders/skills">
      Combine MCP tools with instructions into reusable, shareable behavior packs.
    </Card>
  </Columns>
</div>
