CedarCopilot wants to merge 0 commits into staging from feat/mcp-oauth-pylon-mintlify
Live on prod, no production signal yet
OTEL fallback found no prod spans matching buildUserMcpServers since deploy.
OTEL fallback found no prod spans matching buildUserMcpServers; callMcpTool; buildConnectionRulesBlock; loadMcpIntegrations since deploy.
OTEL fallback found no prod spans matching integrations.initiateOAuth (integration=mintlify); GET /oauth/mintlify/callback; Mintlify MCP server since deploy.
OTEL fallback found no prod spans matching Settings Connections MCP tab; onboarding context-source step; playground Integrations MCP tab since deploy.
Since 2026-08-16T00:03:13Z, staging produced 0 OTEL spans matching read-connection-settings/readConnectionSettingsTool and 0 Pylon or Mintlify connection-provider spans. CloudWatch found only one concrete tool-surface log (2026-08-18 17:23:52Z: cedar-configuration skill loaded.
OTEL fallback found no prod spans matching buildUserMcpServers since deploy.
Libra has verdicts on 0 of 5 tracked behaviors on prod; 5 are still being checked. Libra checks hourly for 3 days after each deploy.
Registers two new OAuth-authenticated external MCP servers so Cedar's agent can call their tools:
https://mcp.usepylon.com/https://mcp.mintlify.comBoth authenticate exactly like the existing Notion MCP driver: Dynamic Client Registration (DCR) + PKCE, public client, no pre-registered secret. Verified from each vendor's /.well-known/oauth-authorization-server.
createDcrPkceMcpDriver(config) captures the full DCR → PKCE(S256) → code-exchange → refresh-grant pattern. notion.ts refactors onto it (142→13 lines); pylon.ts / mintlify.ts are ~10-line configs with endpoints + scopes.['mcp','notion'] literal was hardcoded in 6 places that decide which connections the agent can use , a missed site silently makes a connection dead. All now reference MCP_PROVIDER_IDS, so future providers are one line in constants.ts.OAuthMcpIntegrationCard + cluster, rendered in settings / playground / onboarding.PYLON_REDIRECT_URI / MINTLIFY_REDIRECT_URI; proper display names; fixed the hardcoded NOTION_REDIRECT_URI error string.Design doc: docs/design/mcp-oauth-pylon-mintlify.md.
The factory registers grant_types: [authorization_code, refresh_token] for all providers; Notion previously registered only authorization_code. Only new Notion connects re-register. Verified live: a DCR POST to https://mcp.notion.com/register with the new body returns 201 and echoes both grant types. It's also strictly more correct , Notion already uses the refresh grant it didn't previously register for.
vitest oauth-drivers.test.ts , 11/11 (DCR body, S256 authorize URL + scope, code exchange, refresh grant, invalid_grant permanent-vs-transient, registry resolution).201 + client_id with correct scopes. Proves endpoints/body/scopes short of a human clicking "Allow".@zero/server + @zero/mail types clean on touched files; pnpm deps:check clean.Deploy step (required before it works): set on the server env ,
PYLON_REDIRECT_URI=https://<api-host>/oauth/pylon/callback
MINTLIFY_REDIRECT_URI=https://<api-host>/oauth/mintlify/callback
Under DCR the redirect URI is submitted at registration time, so there is no vendor-side app registration. Pylon requires a Member/Admin seat to authorize.
listMcpConnections WHERE providerId IN (...) filter , it adds no new response parsing/serialization. Worth a glance before deploy but not a new parse surface.Mintlify scope is docs:read offline_access (read-only docs). Widen in mintlify.ts if the agent should also deploy/edit docs or read analytics.
🤖 Generated with Claude Code
The PR adds DCR-and-PKCE OAuth support for Pylon and Mintlify, extracts the shared OAuth driver used by Notion, and exposes all three providers throughout connection management and agent MCP loading.
Libra has not measured any production surfaces for this change yet.