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.
authsia mcp start and restart need an unlocked Authsia app. That prompt is not tool-call JIT.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
{
"mcpServers": {
"codegraph": {
"command": "codegraph",
"args": ["serve", "--mcp"]
}
}
}
Client file after Protect
{
"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://.
{
"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
-
Select and discover
Choose the target workspace and discover its servers.
-
Use existing setup
Open the already-wrapped server, pick the source workspace, and review launch plus tool policy.
-
Confirm
Creates an independent declaration. Later edits are not synchronized.
-
Bind secrets and admit
Add required secret bindings, reload the client, then make a permitted call.
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.
/Applications/Authsia.app/Contents/Helpers/authsia.mcp proxy plus AUTHSIA_MCP_UPSTREAM. Keep --upstream and fixed workspace args out of shared launches. Allow mcp serve for Authsia’s own tools.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:
{
"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:
[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:
/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:
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.
{
"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:
- Reload the client and confirm it received the managed policy. Check project entries as well as user-global entries.
- Confirm an approved proxy connection reaches Authsia admission and a permitted tool works after approval.
- Confirm a harmless direct MCP fixture is blocked by the client policy, including under an approved server name. A doctor finding alone is not proof of enforcement.
- Add another wrapped server: Claude, Cursor, and supported VS Code should accept the shared command; Codex needs that server name added to requirements.
- Run
authsia mcp doctorfrom every target workspace, resolve effective direct launches, then confirm revocation stops an admitted STDIO child. Record redacted results only.
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.
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.