Skip to content

docs(adr): ADR-070 MCP gateway, ADR-071 bring your own MCP server - #738

Open
seanspeaks wants to merge 6 commits into
nextfrom
claude/wonderful-shannon-n6rek0
Open

seanspeaks wants to merge 6 commits into
nextfrom
claude/wonderful-shannon-n6rek0

Conversation

@seanspeaks

@seanspeaks seanspeaks commented Nov 13, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Two proposed ADRs. Docs only, no code.

ADR-070: MCP Gateway

One MCP endpoint on a Frigg app that an adopter's in-product agent talks to.

  • Merges two tool sources behind one surface: native tools (generated from ADR-063 capability manifests where a module has one, declared with the mcp-tool surface from ADR-020) and tools passed through from remote MCP servers.
  • Declares a remote MCP server as an API module, with a new McpRemoteRequester for the client side of MCP authorization (discovery, client registration, PKCE, resource parameter). OAuth2Requester has none of these today.
  • Treats an MCP token and an API token for the same provider as two separate grants (two entities), grouped by a provider key.
  • Resolves credentials for the acting user, then the organization, from the existing x-frigg-appuserid / x-frigg-apporgid headers.
  • Gives the adopter a tool policy: allowlist, read/write class, and a pinned hash per remote tool.
  • Compares the design with existing products (cloud agent gateways, agent tool platforms, embedded integration platforms, MCP infrastructure gateways).
  • States non-goals: no agent loop and no approval logic in Frigg.

ADR-071: Bring Your Own MCP Server

Builds on ADR-070. Lets an adopter's customers add MCP servers the adopter never reviewed.

  • Stored connectors: records in the database, scoped to an organization or to one user.
  • Organization connectors first (an admin reviews the tool list), personal connectors second (no review, every tool classed write).
  • Off by default; the adopter enables each level per app.
  • Rules for every stored connector: guarded outbound requests, changed tools withheld, results marked curated: false, no name collisions.
  • Relation to ADR-063: a stored connector is a data-defined module, which ADR-063 does not cover, so it does not share that table. It follows the same patterns (immutable versions, the DRAFT to RETIRED lifecycle, no secrets in the record, ADR-056 ownership). A data-defined integration cannot call a stored connector's tools.

Also adds both register rows and points the extension-mcp-server entry in ADR-017 at ADR-070.

Why now

A Frigg adopter is adding agent connectors (a Slack action and two per-seat data providers with remote MCP servers). Without ADR-070, the adopter builds a second token store and connect flow in its own backend. ADR-071 is the follow-on its customers will ask for.

For review

Each ADR ends with open questions, each with a lean. The ones I would most like a second opinion on:

  • ADR-070 Q1: does each adopter app serve its own client ID metadata document?
  • ADR-070 Q3: organization fallback for seat-licensed providers.
  • ADR-071 Q1: is organization-level enough to start, or is personal needed from day one?
  • ADR-071 Q6 and Q7: whether a reviewed organization connector may ever be used inside a data-defined integration, and whether to reuse ADR-063's versioning use cases directly.

Numbers 070 and 071 were chosen because 064, 066, 067 and 069 are claimed by open PRs (#711, #729, #736). ADR-053, ADR-056 and ADR-063 are referenced by number only, since they are not on next yet. ADR-063 was read from the open stack; ADR-053 and ADR-056 were not read, only cited as ADR-063 cites them.

Test plan

  • Links between ADRs resolve (relative paths checked by hand)
  • Reviewer confirms the claims in "What exists" (ADR-070) against core

🤖 Generated with Claude Code

https://claude.ai/code/session_01StH4nGULZCjQWwhDgbG6ns

One MCP endpoint on a Frigg app that merges native tools (API module
capabilities) with tools from remote MCP servers, resolves the acting
user's credentials, and applies an adopter-set tool policy.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01StH4nGULZCjQWwhDgbG6ns
@seanspeaks
seanspeaks requested a review from d-klotz November 13, 2026 18:27

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Code review skipped — your organization has no extra usage available to pay for this review.

If your organization's extra usage balance is empty, an organization admin can add extra usage credits at claude.ai/admin-settings/usage. If its monthly spend limit was reached, an admin can raise it on the same page. If neither applies, contact Anthropic support.

Once extra usage is available, someone with write access to this repository can comment @claude review on this pull request to trigger a review.

@seanspeaks seanspeaks added release Create a release when this pr is merged prerelease This change is available in a prerelease. labels Nov 13, 2026 — with Claude
@netlify

netlify Bot commented Nov 13, 2026 •

Copy link
Copy Markdown

✅ Deploy Preview for friggframework-org canceled.

Name Link
🔨 Latest commit 620d42f
🔍 Latest deploy log https://app.netlify.com/projects/friggframework-org/deploys/6af75f824e670b49a2fd4bf0

Adds a Comparable tools section (cloud agent gateways, agent tool
platforms, embedded integration platforms, MCP infrastructure gateways),
what the design takes from them, what differs, and a buy-instead
alternative.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01StH4nGULZCjQWwhDgbG6ns
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01StH4nGULZCjQWwhDgbG6ns
Version 1 stays curated. Adds section 9 on admin-added and user-added
stored connectors, the rules that change for them, and an open question.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01StH4nGULZCjQWwhDgbG6ns
Moves customer-added servers out of ADR-070 into their own ADR: stored
connectors scoped to an organization or a user, the review and pinning
rules for each, the outbound request guard, and the link to ADR-063.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01StH4nGULZCjQWwhDgbG6ns
@seanspeaks seanspeaks changed the title docs(adr): ADR-070 MCP gateway docs(adr): ADR-070 MCP gateway, ADR-071 bring your own MCP server Nov 13, 2026
@cursor

cursor Bot commented Nov 13, 2026

Copy link
Copy Markdown

Bugbot is paused — on-demand spend limit reached

Bugbot uses usage-based billing for this team and has hit its on-demand spend limit.

A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue.

A stored connector is a data-defined module, which ADR-063 does not
cover, so it follows that ADR's patterns (immutable versions, lifecycle,
no secrets in the record, ADR-056 ownership) without sharing its table.
Native tools are generated from ADR-063 capability manifests. New routes
move under /api/v2.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01StH4nGULZCjQWwhDgbG6ns
@sonarqubecloud

Copy link
Copy Markdown

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

prerelease This change is available in a prerelease. release Create a release when this pr is merged

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants