generated: '2026-09-19' method: searched source: https://marginalia.polycode.co.uk/.well-known/agent-card.json docs: https://gitlab.com/polycode-projects/marginalia/-/blob/main/README.md note: >- The OpenAPI declares no securitySchemes (derive-authentication.py found none), so this profile is assembled from the agent card's securitySchemes block, the operation summaries in the spec, the README ("Talk to it — the A2A API", "Repository supervision"), the account page code, and live anonymous responses on 2026-09-19. summary: types: [none, apiKey, openIdConnect, hmac] api_key_in: [header] oauth2_flows: [] default: public — no credential for reads, chat, the A2A endpoint or the mechanical completions shim schemes: - name: public type: none applies_to: 26 GET operations, postChat, postMechanicalCompletion, postFlag, postVisitorLabel, postSessionIntroduction, the A2A JSON-RPC endpoint evidence: 'info.description: "No auth today; the API is public."; agent card security: []; live GET /api/status, /api/graphs, /api/budget, /api/projects -> 200 anonymously.' - name: apiKey type: apiKey in: header parameter: X-API-Key key_prefix: mga_ applies_to: [whoamiKey, postHooksPush, getRepoSummary, postMechanicalCompletion (graph selection), postChat / A2A (routes to the key's private graph)] evidence: >- Agent card securitySchemes.apiKey (X-API-Key, "Optional today. Will gate a free monthly token allowance per key, with pay-as-you-go beyond it."); live GET /api/keys/whoami -> 401 {"error":"send the key as X-API-Key"}; account.mjs masks keys as "mga_…"; README: "A private graph ... is reached by adding an x-api-key: header". issuance: Minted on the logged-in Account page ("generate a key" creates a private graph + key, shown once) or by the operator CLI (issue-key). Keys are 1:1 with a private graph; getKeys lists hash, issued_at and last-4 suffix, never plaintext. - name: cognitoLogin type: openIdConnect provider: Amazon Cognito (identity_provider=Google) authorization_endpoint: https://eu-west-24yw02qhzm.auth.eu-west-2.amazoncognito.com/oauth2/authorize scopes_requested: [openid, email, profile] entry: https://marginalia.polycode.co.uk/auth/login applies_to: 'Tier-1 operations: getKeys, postKeys, createPrivateGraph, setMyDefaultGraph, clearUserDefault, setUserDefault, deletePrivateGraph, renamePrivateGraph, setRepo, getPromptNote, setPromptNote, postProjectOp (admin/owner), plus web search, projects and the fuller model in the chat UI' evidence: 'GET /auth/login -> 302 to the Cognito authorize URL (response_type=code, redirect_uri /auth/callback); live GET /api/keys -> 401 {"error":"login required"}; app.mjs: "Log in with Google for web search, projects, and the fuller model".' note: A browser session, not an API authorization flow — no bearer tokens are documented for API callers. The Cognito discovery URL was not probed. - name: webhookSecrets type: hmac applies_to: [postGithubHook, postGitlabHook] evidence: 'Spec summaries: X-Hub-Signature-256 "constant-time-verified against the org webhook secret"; X-Gitlab-Token "constant-time-validated against the binding"; 401 on bad signature or an unbound graph.' note: Inbound connector authentication for bound repositories, issued by the operator CLI (bind-connector); not a caller credential. tiers: - {tier: 0, name: visitor / anonymous, access: public reads, chat on the shared graph, A2A} - {tier: 1, name: logged in (Google via Cognito), access: private graphs, API keys, per-user default graph, web search and the fuller model in chat} - {tier: admin, name: operator, access: admin operations (postWorkItem, postAdminTurn, postDelivery, refreshInsights on the shared graph)}