LabscoMCP early access ↗
webrix-aiMCP SERVER

MCP-S Gateway

Put SSO in front of the MCP servers you already run — one gateway, your identity provider, no changes to the servers.

by webrix-ai ↗Agent Guardrails, Content Safety & AuditCommunity

LABSCO SUMMARY

One login in front of every MCP server, and the API keys stay behind it.

The move that matters is where the secrets live: the Supabase token, the Notion header, the Linear key all sit in the gateway's config, and the person connecting authenticates as themselves — so access is granted and revoked in your identity provider rather than in everyone's editor settings.

What it is

A self-hosted gateway that sits between your AI clients and your MCP servers. You list the servers in an mcp.json, the gateway launches them and holds their credentials, and clients authenticate to the gateway through your OAuth provider instead of holding those secrets themselves.

What you get

  • OAuth sign-in through any provider supported by Auth.js, so the same login your organisation already uses covers MCP access
  • Both connection types on the far side: stdio servers launched by the gateway, and Streamable HTTP at /mcp
  • Server selection with a ?server_name= query parameter, so a client can attach to one entry from your mcp.json rather than all of them
  • Upstream API tokens kept in the gateway's own config and never exposed to the people using it
  • Deployment inside your own infrastructure, with sessions persisted to SQLite

Requirements

Node.js version 22 or higher — below that it fails with No such built-in module: node:sqlite. Run it with npx @mcp-s/secure-mcp-gateway, which reads ./mcp.json and ./.env by default, or point at other paths with --mcp-config and --envfile. AUTH_SECRET is required and generated with openssl rand -base64 33; AUTH_PROVIDER names the provider, defaulting to google, with AUTH_[Provider]_ID and AUTH_[Provider]_SECRET alongside it, plus whatever else that provider needs — the Okta walkthrough in the docs shows the issuer and redirect URI it wants. PORT defaults to 3000, BASE_URL to http://localhost:3000, TOKEN_EXPIRATION_TIME to 86400000 milliseconds, and DB_PATH to ./mcp.sqlite. On the client side, connect through @mcp-s/mcp over stdio or point straight at the HTTP endpoint.

Setup effort

One command plus credentials — npx @mcp-s/secure-mcp-gateway, then supply credentials