{"$schema":"https://wellknown.network/schemas/agent-record-v1.json","schemaVersion":"1","id":"ag_duvwgq8jttpb","handle":"doorman-mcp","url":"https://wellknown.network/agents/doorman-mcp","links":{"self":"https://wellknown.network/agents/doorman-mcp/record.json","html":"https://wellknown.network/agents/doorman-mcp","markdown":"https://wellknown.network/agents/doorman-mcp/record.md","api":"https://wellknown.network/api/v1/agents/doorman-mcp","status":"https://wellknown.network/api/v1/agents/doorman-mcp/status","claim":"https://wellknown.network/agents/doorman-mcp/claim","claimApi":"https://wellknown.network/api/v1/claims","claimDescriptor":"https://wellknown.network/agents/doorman-mcp/claim.json","badge":"https://wellknown.network/agents/doorman-mcp/badge.svg","openapi":"https://wellknown.network/openapi.json"},"ard":{"identifier":"urn:air::server:doorman-mcp","type":"application/mcp-server-card+json"},"kind":"mcp_server","declared":{"name":"doorman-mcp","summary":"One-line OAuth for self-hosted MCP servers. Fail-closed by default.","description":"# doorman\n\n**One-line OAuth for self-hosted MCP servers.**\n\n53% of self-hosted API services ship with static API keys. Only 8.5% implement proper OAuth. For MCP servers exposed to AI agents and human clients alike, that gap is not a configuration choice: it is a vulnerability. Doorman closes it in one line.\n\n---\n\n## Before / After\n\n### Before: 28 lines of boilerplate every time\n\n```python\nimport os\nfrom fastmcp import FastMCP\nfrom fastmcp.server.auth.providers.github import GitHubProvider\n\nmcp = FastMCP(\"My Server\")\n\n# Manually validate every required credential\nclient_id = os.environ.get(\"GITHUB_CLIENT_ID\")\nif not client_id:\n    raise ValueError(\"GITHUB_CLIENT_ID is required\")\n\nclient_secret = os.environ.get(\"GITHUB_CLIENT_SECRET\")\nif not client_secret:\n    raise ValueError(\"GITHUB_CLIENT_SECRET is required\")\n\njwt_secret = os.environ.get(\"DOORMAN_JWT_SECRET\")\nif not jwt_secret:\n    raise ValueError(\"DOORMAN_JWT_SECRET is required\")\n\nmcp.auth = GitHubProvider(\n    client_id=client_id,\n    client_secret=client_secret,\n    base_url=os.environ.get(\"DOORMAN_BASE_URL\", \"http://127.0.0.1:8000\"),\n    required_scopes=[\"read:user\", \"user:email\"],\n    allowed_client_redirect_uris=[\"http://localhost:*\", \"http://127.0.0.1:*\"],\n    jwt_signing_key=jwt_secret,\n    require_authorization_consent=False,\n)\n```\n\n### After: one line\n\n```python\nimport doorman\ndoorman.protect(mcp, github=True)\n```\n\n---\n\n## Quickstart\n\n### 1. Install\n\n```bash\npip install doorman-mcp\n```\n\n### 2. Set environment variables\n\nGenerate a strong JWT secret:\n\n```bash\npython -c \"import secrets; print(secrets.token_urlsafe(48))\"\n```\n\nThen export all required variables for your shell:\n\n**macOS / Linux (bash/zsh):**\n\n```bash\nexport GITHUB_CLIENT_ID=your_client_id\nexport GITHUB_CLIENT_SECRET=your_client_secret\nexport DOORMAN_JWT_SECRET=paste_the_generated_secret_here\nexport DOORMAN_BASE_URL=http://127.0.0.1:8000\n```\n\n**Windows (PowerShell):**\n\n```powershell\n$env:GITHUB_CLIENT_ID = \"your_client_id\"\n$env:GITHUB_CLIENT_…","publisher":null,"homepage":"https://github.com/manshahH/doorman-mcp","repository":"https://github.com/manshahH/doorman-mcp/issues","version":"0.1.1","license":null,"protocols":["mcp"],"tags":["authentication","fastmcp","mcp","model-context-protocol","oauth"],"pricing":null,"endpoints":[{"url":"pypi:doorman-mcp","type":"package_pypi","auth":null,"probeable":false}],"skills":null,"tools":null,"extra":null,"attribution":{"kind":"pypi","name":"pypi","repoUrl":"pypi","summary":"pypi","version":"pypi","description":"pypi","homepageUrl":"pypi"}},"derived":{"capabilities":[{"slug":"security.identity","name":"Identity & Access","confidence":1,"provenance":"declared"},{"slug":"dev.terminal","name":"Terminal & Shell","confidence":0.745,"provenance":"derived"}],"categories":["dev","security"],"language":"en"},"observed":{"status":"unknown","statusReason":"Distributed as a package to run locally; no network endpoint to check.","lastOkAt":null,"lastProbedAt":null,"statusComputedAt":null,"reliability30d":null,"latestObservations":[],"tools":null,"package":{"name":"doorman-mcp","registry":"pypi","observedAt":"2026-09-09T14:33:31.460Z","publishedAt":"2026-06-30T23:32:55.938334Z","latestVersion":"0.1.1"}},"verification":{"claimed":false,"claimedAt":null,"proofs":[]},"provenance":{"sources":[{"source":"pypi","key":"doorman-mcp","url":"https://pypi.org/project/doorman-mcp/","firstSeenAt":"2026-09-09T14:32:11.105Z","fetchedAt":"2026-09-09T14:32:11.105Z","normalizedAt":"2026-09-09T14:32:11.105Z"}]},"firstSeenAt":"2026-09-09T14:32:11.105Z","updatedAt":"2026-09-09T14:33:31.460Z"}