MCP Manager

Gate workspace-declared local MCP servers through the STDIO proxy or the app-owned localhost Streamable HTTP manager. Credentials stay behind native admission and Keychain references.

Unlock firstauthsia mcp start and restart need an unlocked Authsia app. That prompt is not tool-call JIT.
Cursor scopeIf a project server is missing, open that folder in Cursor and select its workspace — not User. Do not add a global duplicate.
A wrapped client never launches the upstream itself. Direct launches skip this path and are existence-only findings.

How Authsia rewrites MCP config

Authsia never silent-rewrites a client file. MCP Manager Protect connection / Protect a client and authsia mcp wrap --write show the current entry, the replacement, and a SHA256 checksum. You confirm; --yes or the native sheet applies the write. authsia mcp configure prints a user-global fallback and does not write.

The coding tool’s launch is replaced so it starts Authsia. The real child command is declared in workspace policy. For the recognized npx @modelcontextprotocol/server-filesystem launch, the selected managed workspace replaces all previous directory arguments as the server’s single exposed root. The confirmation names this scope; other packages and ambiguous argument forms keep their original arguments. Protect or re-protect also updates an existing filesystem declaration after native confirmation, preserving tool policy, credential bindings, and the catalog. Removing protection retains that declaration; upgrades do not widen its scope automatically. A Cursor project wrap looks like this (from an Authsia-Demo workspace Protect of codegraph):

Client file before Protect

.cursor/mcp.json · scanned
{
  "mcpServers": {
    "codegraph": {
      "command": "codegraph",
      "args": ["serve", "--mcp"]
    }
  }
}

Client file after Protect

.cursor/mcp.json · wrapped
{
  "mcpServers": {
    "codegraph": {
      "command": "/Applications/Authsia.app/Contents/Helpers/authsia",
      "args": ["mcp", "proxy"],
      "env": {
        "AUTHSIA_MCP_LAUNCH": "[\"codegraph\",\"codegraph\",\"serve\",\"--mcp\"]",
        "AUTHSIA_MCP_UPSTREAM": "codegraph",
        "WORKSPACE_FOLDER_PATHS": "/Users/you/PlayGround/Authsia-Demo"
      }
    }
  }
}
Env What it does
AUTHSIA_MCP_UPSTREAM Names the workspace declaration. Company allowlists match authsia mcp proxy without enumerating every server.
WORKSPACE_FOLDER_PATHS Pins Cursor STDIO to that project’s absolute folder so the proxy does not guess another workspace.
AUTHSIA_MCP_LAUNCH Review-only recovery metadata (name, command, args). The proxy still launches from workspace policy. Never credentials, tool policy, catalogs, or grants.

The child is declared in that workspace’s .authsia/workspace.json. Neighboring servers stay. Wrap does not copy client-side environment values; the preview names how many there were. Secret refs stay in workspace policy as authsia://.

.authsia/workspace.json · mcpUpstreams
{
  "mcpUpstreams": [
    {
      "name": "codegraph",
      "command": "codegraph",
      "args": ["serve", "--mcp"],
      "transport": "stdio"
    }
  ]
}
Client Protect writes
Cursor STDIO Selected project’s .cursor/mcp.json with that folder’s absolute path in WORKSPACE_FOLDER_PATHS.
VS Code STDIO Bound project override in .vscode/mcp.json.
Claude Code Scanned project or user file. Local scope uses projects[root].mcpServers in ~/.claude.json.
Protect a client May insert the proxy launch when a JSON client does not already name the server. Codex STDIO still needs a scanned entry.
HTTP enrollment User-local client config only — never a repository MCP file — to http://127.0.0.1:8788/mcp/{server-id}.

Unwrap restores the launch, not the old env

Remove protection and authsia mcp unwrap --write restore command and argv from that row’s exact workspace declaration after the same diff and checksum. Workspace policy stays. Client environment values from before protection cannot be recovered, and declared authsia:// refs are not copied into the direct launch. A changed client file or restore command is refused.

Global connections, workspace-specific protection

A global client entry makes a server available across projects. Each Authsia workspace still decides how that server runs.

Global client config

Shared launch in Codex, Claude, or another client. Wrapped STDIO starts authsia mcp proxy with AUTHSIA_MCP_UPSTREAM.

Project client config

May override matching global entries. Check the effective, overridden, or conditional label in Manager.

Workspace policy

Real command, args, tool policy, and secret bindings live in that workspace’s .authsia/workspace.json.

Same name, two workspaces

A global Playwright proxy can serve project-a and project-b, but both need their own declaration. If only project-a has one, Manager shows Playwright as unconfigured in project-b.

The Servers table shows each effective client’s protection status next to its name — including mixed protected, bypassing, and unconfigured connections.

Set up another workspace

  1. Select and discover

    Choose the target workspace and discover its servers.

  2. Use existing setup

    Open the already-wrapped server, pick the source workspace, and review launch plus tool policy.

  3. Confirm

    Creates an independent declaration. Later edits are not synchronized.

  4. Bind secrets and admit

    Add required secret bindings, reload the client, then make a permitted call.

Not copiedSecret bindings, runtime grants, and recorded catalogs. Relative launch paths resolve in the target workspace.
FallbackSaved launch from a managed wrap, or the official Context7 preset for older Context7 entries. Recovered launches copy no tool permissions.

Which workspace runs

STDIO order

Explicit --workspace, then a safe WORKSPACE_FOLDER_PATHS or CLAUDE_PROJECT_DIR hint, then the proxy working directory. Conflicting hints stop startup.

Manager filter

Changing the workspace filter does not switch a running client’s workspace.

HTTP

A protected HTTP endpoint belongs to one workspace and server. It does not switch when the client changes directories.

Client After Protect
Cursor Enable the Workspace source (STDIO) or User source (HTTP) under Customize → Manage scope, then Reload. A working global Playwright source does not prove the project filesystem source is enabled. Repair needed: missing or placeholder WORKSPACE_FOLDER_PATHS.
VS Code Open the project folder, restart via MCP: List Servers, then MCP: Reset Cached Tools. Repair creates a project override and clears the old global binding.
Claude Code Reads CLAUDE_PROJECT_DIR at runtime. No fixed project path is added.
Codex Uses Codex MCP config and the session working directory, independent of VS Code’s MCP host. Start a session in the new project when switching.
Devin Unpinned. Uses launch context.

Unresolved or ambiguous proxy workspace hints stop startup rather than selecting another project’s policy.

What it gates

Declare a no-shell stdio command or a validated loopback HTTP URL in the commit-safe workspace file. STDIO clients launch authsia mcp proxy; HTTP clients use the manager’s protected endpoint. Authsia starts or forwards only after approval.

Launchers

Wrap splits npx, npm exec, pnpm dlx, and bunx into an executable and args. No shell. Legacy joined commands split on the next catalog write.

Names

Playwright and playwright share a declaration. Conflicting case variants need explicit reconciliation; permissions are never merged automatically.

Live catalog

Connected stdio proxies recheck the visible catalog once per second and send notifications/tools/list_changed. An older Authsia binary needs one client restart.

Credentialed

Uses secret JIT.

Empty catalog

Credential-less empty policy needs local admission before a short discovery probe. Automatic discovery runs only with an entirely empty declared environment.

Admission TTL

Defaults to 30 minutes, company-capped, expires absolutely. Renews only through a fresh client-originated approval.

Pinned catalog

Lists from policy without launching the child.

Out of scope

Remote HTTP/HTTPS/SSE stay on the company gateway. Direct launches that skip Authsia are existence-only findings.

MCP Integrations is off by default

Enable it in Settings → Developer Access. Client config cannot turn it on. While off, configure, wrap, unwrap, declare, catalog, serve, proxy, start, and restart fail. Help, status, doctor, activity export, stop, and portal revocation still work.

Allowlist Authsia in managed agent settings

Deploy two things: an administrator-enforced launch policy, and client configuration that connects through Authsia. Copying a user config file is not enforcement.

BinarySigned app at a company-controlled path. Examples use /Applications/Authsia.app/Contents/Helpers/authsia.
Launchmcp proxy plus AUTHSIA_MCP_UPSTREAM. Keep --upstream and fixed workspace args out of shared launches. Allow mcp serve for Authsia’s own tools.
Not admissionThese policies do not approve an upstream or replace native JIT.

Five clients from authsia mcp configure on macOS. Vendor docs checked 8 Sep 2026 — validate the deployed client version.

Claude Code

Deploy this JSON through managed settings, for example MDM installing /Library/Application Support/ClaudeCode/managed-settings.json:

managed-settings.json
{
  "allowManagedMcpServersOnly": true,
  "allowedMcpServers": [
    { "serverCommand": ["/Applications/Authsia.app/Contents/Helpers/authsia", "mcp", "serve"] },
    { "serverCommand": ["/Applications/Authsia.app/Contents/Helpers/authsia", "mcp", "proxy"] }
  ]
}
Claude Code matching rules

Exact command matching lets users add new proxy server names without changing this allowlist. The managed-only flag prevents user allowlists from broadening it. Avoid name-only rules; deny rules still win. Deploy an exclusive managed-mcp.json only if IT owns a fixed server catalog. See managed MCP controls and file locations.

Codex

Deploy requirements through /etc/codex/requirements.toml, cloud-managed requirements, or the macOS MDM preference com.openai.codex:requirements_toml_base64. Use a client supporting structured command matchers. This example approves the configured names authsia and jira:

requirements.toml
[mcp_servers.authsia.identity]
command = { executable = "/Applications/Authsia.app/Contents/Helpers/authsia", args = [
  { match = "exact", value = "mcp" },
  { match = "exact", value = "serve" },
] }

[mcp_servers.jira.identity]
command = { executable = "/Applications/Authsia.app/Contents/Helpers/authsia", args = [
  { match = "exact", value = "mcp" },
  { match = "exact", value = "proxy" },
] }
Codex matching and plugins

Both the configured server name and identity must match. Repeat the proxy block for each extra name. Structured matchers check executable, argument count, and order — not environment or working directory. Put generated launches in ~/.codex/config.toml. For a rollout using only direct configuration, features.plugins = false disables plugin-bundled MCP. See the config reference and managed configuration.

Cursor Enterprise

In the team dashboard's MCP Configuration, add these two command entries:

Cursor enterprise MCP commands
/Applications/Authsia.app/Contents/Helpers/authsia mcp serve
/Applications/Authsia.app/Contents/Helpers/authsia mcp proxy
Cursor matching and permissions

Matches the full command plus arguments — use the exact deployed path. The allowlist does not install servers; distribute generated entries to ~/.cursor/mcp.json or the project file. permissions.json / mcpAllowlist is tool auto-run, not launch policy. See enterprise MCP and permissions.

VS Code with GitHub Copilot

VS Code 1.132+: deploy the Claude-shaped JSON through Copilot managed settings, or policies ChatAllowedMcpServers and ChatAllowManagedMcpServersOnly. Do not paste those names into ordinary workspace settings.

VS Code versions and ChatMCP

Allow/deny policies need 1.130; managed-only needs 1.132. Leave ChatMCP at all for this pattern. Distribute into the user-profile mcp.json or project .vscode/mcp.json. Verify with Developer: Policy Diagnostics. See enterprise AI settings.

Devin Desktop

Distribution, not proven prevention

Authsia prints ~/.config/devin/mcp_config.json via authsia mcp configure --client devin. No verified administrator command allowlist. Cloud Devin MCP settings do not enforce local Desktop.

Distribute connections and verify the rollout

From each declared workspace, print the matching client configuration:

print only · no write
authsia mcp configure --client claude
authsia mcp configure --client codex
authsia mcp configure --client cursor
authsia mcp configure --client vscode
authsia mcp configure --client devin

Print only — merge, do not replace unrelated settings. The fallback names the upstream only. A Cursor project Protect write also sets WORKSPACE_FOLDER_PATHS and AUTHSIA_MCP_LAUNCH; see How Authsia rewrites MCP config.

printed user-global fallback
{
  "mcpServers": {
    "codegraph": {
      "command": "/Applications/Authsia.app/Contents/Helpers/authsia",
      "args": ["mcp", "proxy"],
      "env": { "AUTHSIA_MCP_UPSTREAM": "codegraph" }
    }
  }
}

Before broad deployment, verify on a pilot Mac:

STDIO allowlists do not cover HTTP

Approve the exact enrolled http://127.0.0.1:8788/mcp/{server-id} URL. Do not allow the original upstream URL or every loopback endpoint. Remote MCP stays a company-gateway decision.

Print proxy entries

From a managed workspace, authsia mcp configure prints declared upstreams as separate proxy entries. A wrapped entry is declared and routed through Authsia, not pre-approved.

Declare an upstream

If a STDIO proxy launch has no workspace policy yet, declare the child command first. For a validated loopback HTTP endpoint, use --url under MCP Manager.

Wrap and unwrap

See How Authsia rewrites MCP config for the file-level before and after. Previews keep child env keys and replace every value.

If the scanned entry already set child environment, name tools under mcpUpstreams.tools.allow instead of automatic catalog recording.

Unwrap previews both entries plus checksum, then restores command and argv from that row’s workspace declaration. Old client env cannot be recovered. Reopen the client after restoring.

Catalog capture and policy review

Allow tools reuse admitted server access. Approve tools require native approval on every STDIO or HTTP invocation, even when the server is already running. A cold STDIO call may also ask for server admission or credential access. After upgrading Authsia, restart client MCP connections so the proxy and app both support per-call approval.

Deny tools are hidden from clients. Only calls received by Authsia appear as denied attempts; a chat request for an unavailable tool creates no MCP call record. Activity records policy changes separately. Open a configuration-change row to see the reviewed changes, such as edit_file: Allow → Deny, the recorded actor class (native, not caller identity), and time. Reviewed summaries preserve line breaks up to 4,000 characters. Approval and admission refusals are denied / approvalDenied; disabled CLI access is denied / cliAccessDisabled. A lost session is upstreamUnavailable, not a workspace-policy denial. Tool names in those summaries are searchable and included in the Activity metadata export.

Capture starts the child once behind admission and records metadata.

Empty policyRecorded tools default to allow. Empty-policy calls do not discover or start servers.
Existing policyChoices are preserved. New tools need classification in Edit policy.
ActivityAt most 30 days, 2,000 events, 1 MiB. Rows are not HMAC verification. Manager writes need a Bridge audit intent.

mcp doctor prints scanned launches plus a verdict. Exit 2 means an effective or conditional bypass. Unreadable client files are skipped.

mcp activity export copies redacted proxy command-history rows. Filters: --since, --upstream, --workspace, --unowned.

MCP Manager and localhost HTTP

Portal

127.0.0.1:8787 from the signed app with MCP Integrations on.

Protected HTTP

127.0.0.1:8788/mcp/{server-id}. Stop ends forwarding and portal sessions; STDIO proxies keep running.

Discover

Scans client configs without starting servers. Protect and HTTP enrollment write only after native confirmation.

HTTP GET

Startup GET is local 405 — no JIT, no credentials, no upstream. The first permitted tool call requests admission.

Loopback only

http plus localhost, 127.0.0.1, or ::1, with an explicit port. First HTTP declaration advances the workspace to schema v3.

Optional upstream headers stay Keychain references and resolve after admission. Activity records server, tool, attribution, and coarse outcome — not payloads or credentials.

Visibility boundary

Wrapped calls record the MCP tool name only — not arguments or results. A direct or unadmitted config entry is existence-only: Authsia cannot audit its calls, stop it on revoke, or prevent its launch. This local stdio and localhost HTTP layer complements a company MCP gateway’s SSO and remote policy; it does not replace the gateway.

Access Center

Revoke

Ends the process group.

Grants

Access Center lists runtime admission and proxy grants. Open MCP Manager from the Local MCP strip.

Coverage

Manager Servers for wrap status. Activity for observed calls with Grants: None recorded.