Skip to content

feat(security): allowlist the Figma MCP OAuth authorization endpoint - #7621

Closed
psantus wants to merge 1 commit into
kirodotdev:mainfrom
psantus:feat/allowlist-miro-figma-oauth
Closed

feat(security): allowlist the Figma MCP OAuth authorization endpoint#7621
psantus wants to merge 1 commit into
kirodotdev:mainfrom
psantus:feat/allowlist-miro-figma-oauth

Conversation

@psantus

@psantus psantus commented Sep 1, 2026

Copy link
Copy Markdown

Problem / Motivation

Reconnecting the Figma MCP server fails at the OAuth consent banner with:

<server> authentication failed: URL contained credential or exfiltration pattern

Root cause: oauth_url_contains_credential() only waives the generic credential/exfiltration heuristics for the high-entropy OAuth state/PKCE values when the consent URL's exact (host, path) is in the code-owned allowlist _OAUTH_AUTHORIZATION_ENDPOINTS (now in src/kiro_crew/security/exfil.py). Figma is absent, so its normal consent URL fails closed — the exact regression class the gate's own comment documents: "A launch provider missing from this set cannot be connected at all."

This PR originally also covered Miro. That entry landed on main separately via #7739, so the Miro hunks were dropped during rebase and this PR is now Figma-only.

Why it matters

Figma is a shipped/common MCP integration. Until this lands, every user has to hand-edit the operator keystone oauth_endpoints.json to connect it (undocumented; see #7578). Adding it to the builtin set makes it work out of the box.

What changed (motivation → approach → change)

The Figma MCP consent URL is rejected by the banner gate. The fix adds one (host, path) pair to the code-owned allowlist.

The pair comes from Figma's own RFC 8414 metadata, reached via RFC 9728 protected-resource discovery on its MCP url: www.figma.com + /oauth/mcp (issuer https://api.figma.com; the consent page is hosted on www.figma.com, discovered from https://mcp.figma.com/mcp).

The diff also trims the date from the neighboring Miro comment in exfil.py: main outgrew the comment-history baseline for this file after #7739 landed (tracked in #9384/#9385), so any PR touching it failed the Backend Lint & Type Check gate. Dropping the one dated narration span returns the file to its baselined count; the verification claim itself stays.

A matching figma-mcp entry in the LEGIT_OAUTH_URLS corpus (a real consent-URL shape with fake identifiers) locks in that the banner-safety contract accepts it under default config, mirroring the pattern established for Superhuman in #5967.

Tests

  • test/oauth_url_corpus.py gains the figma-mcp entry; the existing parametrized contract tests (test_corpus_url_not_flagged_as_credential, test_corpus_url_renders_banner in test/test_mcp_oauth_banner.py) now cover it: the URL passes oauth_url_contains_credential and renders a live auth banner, not a rejection.
  • test/test_security.py + test/test_mcp_oauth_banner.py: 1066 passed locally.
  • flake8 / isort / black / mypy clean on the changed files.

Manual verification

N/A — unit coverage sufficient: the corpus contract test exercises the exact accept/reject decision the banner takes on this URL shape.

Screenshots / video

N/A — backend-only diff, no user-visible UI change.

Related Issues

Refs #7578 (opaque error / undocumented allowlist) — not closed by this PR: its asks (name the offending host in the error, RFC 8414 auto-discovery) are broader and remain valuable.

no linked issue: this is the per-provider unbreak step following the #5967 pattern; the broader tracking issue #7578 stays open by design.

Pattern harvest

Not generalizable: one-off data addition to a code-owned allowlist; the recurring class (each new provider needs a code change) is already tracked as #7578.

Checklist

  • At most two commits (one is the norm), with a Conventional Commits title (feat|fix|docs|refactor|perf|test|chore|ci|build|revert: ...)
  • Existing tests pass and new tests added for new functionality
  • Self-review completed; code follows project style guidelines
  • Documentation updated (if applicable)
  • No secrets, credentials, or internal references in the diff

@psantus
psantus requested a review from a team as a code owner September 1, 2026 12:35
@psantus
psantus requested a review from iamwhatever September 1, 2026 12:35
@github-actions github-actions Bot added fork Pull request from a fork (external contributor) readiness: action required A blocking check or review needs attention labels Sep 1, 2026
@iamwhatever

Copy link
Copy Markdown
Collaborator

👋 Hi! This PR's description is missing some required sections from our PR template. Workflow runs won't be auto-approved until the description is updated.

Missing sections:

  • ## Tests

Please update your PR description to include these sections, then push or re-save the description. The workflows will be approved on the next cycle.

1 similar comment
@dwu96

dwu96 commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

👋 Hi! This PR's description is missing some required sections from our PR template. Workflow runs won't be auto-approved until the description is updated.

Missing sections:

  • ## Tests

Please update your PR description to include these sections, then push or re-save the description. The workflows will be approved on the next cycle.

@github-actions github-actions Bot added the merge conflict Branch has merge conflicts with its base — author must resolve before merge label Sep 4, 2026
@bolichen97

Copy link
Copy Markdown
Collaborator

Open PR relationship audit

This is a consolidated, point-in-time code-level audit note. It compares complete merge-base diffs and current/merged code; it does not treat a shared topic as duplication or partial coverage as completion.

Relationship findings

  • This PR is OVERLAPPING with PR #5967. The goals differ or the implementations can complement each other; this is not a duplicate claim. Recommended action for PR #7621: MERGE_DISCUSSION. Different providers, additive entries: not a duplicate. Only worth noting as a merge-order hazard in the shared frozenset and corpus list, and as the review bar PR #7621 sets itself against (PR #5967 ships per-provider banner tests, PR #7621 does not). Files: src/kiro_crew/security.py, test/oauth_url_corpus.py.
  • This PR is OVERLAPPING with PR #7739. The goals differ or the implementations can complement each other; this is not a duplicate claim. Recommended action for PR #7621: MERGE_DISCUSSION. The Miro allowlist entry is duplicated between two open PRs and needs one owner: land either PR and the other must drop its Miro hunk plus its "miro-mcp" corpus entry. Neither PR subsumes the other — PR #7621 uniquely carries Figma, PR #7739 uniquely carries the endpoint-naming rejection message for issue Issue #7578. Files: src/kiro_crew/security.py, test/oauth_url_corpus.py.
  • This PR is OVERLAPPING with PR #8239. The goals differ or the implementations can complement each other; this is not a duplicate claim. Recommended action for PR #7621: MERGE_DISCUSSION. A merged change occupies PR #7621's corpus insertion point, so the PR is no longer auto-mergeable; the security.py half still applies cleanly. Files: test/oauth_url_corpus.py, src/kiro_crew/security.py.

No PR, Issue, label, branch, or review state was changed by the relationship-note portion of this audit.

@dwu96

dwu96 commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

👋 Hi! This PR's description is missing some required sections from our PR template. Workflow runs won't be auto-approved until the description is updated.

Missing sections:

  • ## Tests

Please update your PR description to include these sections, then push or re-save the description. The workflows will be approved on the next cycle.

1 similar comment
@iamwhatever

Copy link
Copy Markdown
Collaborator

👋 Hi! This PR's description is missing some required sections from our PR template. Workflow runs won't be auto-approved until the description is updated.

Missing sections:

  • ## Tests

Please update your PR description to include these sections, then push or re-save the description. The workflows will be approved on the next cycle.

@NicholasRBowers NicholasRBowers added needs-pr-triage PR scanner: awaiting automated triage drive-to-green PR claimed by drive-to-green pipeline and removed needs-pr-triage PR scanner: awaiting automated triage labels Sep 8, 2026
@NicholasRBowers

Copy link
Copy Markdown
Contributor

🤖 Kiro Crew [operator: NicholasRBowers#a942f9ca]: This PR has been inactive for 7+ days with failing CI. I've assessed the blockers and they appear resolvable — I'll push fixes directly to this branch as a co-author.

Assessment: The merge conflict is mechanical — merged #7739 already landed the Miro allowlist entry (mcp.miro.com, /authorize) and the miro-mcp corpus entry on main, so the rebase drops this PR's duplicated Miro hunks and keeps its unique Figma entries (www.figma.com + /oauth/mcp allowlist + figma-mcp corpus). Separately, the PR body uses ## Testing where the template requires ## Tests, which is what keeps fork workflow runs from being auto-approved; fixing the heading unblocks CI.

If you'd prefer I don't touch this PR, add the pr-no-autofix label.

@NicholasRBowers
NicholasRBowers force-pushed the feat/allowlist-miro-figma-oauth branch from dfcaa12 to 0b0b460 Compare September 8, 2026 07:32
@NicholasRBowers

Copy link
Copy Markdown
Contributor

🤖 Drive-to-green (operator NicholasRBowers#a942f9ca)

Rebased this PR onto current main and pushed dfcaa12880b0b460b0. Every change, and why:

1. Dropped the Miro hunks during rebase. Main already carries the exact Miro allowlist entry and miro-mcp corpus entry — they landed separately via #7739 (merged 2026-09-04). Keeping this PR's copies would have duplicated both the frozenset pair and the corpus entry. The PR is now Figma-only.

2. Ported the Figma allowlist pair into src/kiro_crew/security/exfil.py. Main's #9183 security-package split deleted src/kiro_crew/security.py (the file this PR originally patched); the code-owned _OAUTH_AUTHORIZATION_ENDPOINTS allowlist now lives in security/exfil.py. The pair and its comment are unchanged from @psantus's original — ("www.figma.com", "/oauth/mcp") — inserted in the existing alphabetical host order.

3. Kept the figma-mcp corpus entry verbatim in test/oauth_url_corpus.py, appended after main's existing miro-mcp entry. The existing parametrized contract tests in test/test_mcp_oauth_banner.py pick it up automatically (accepted by oauth_url_contains_credential, renders a live auth banner).

4. Rewrote the PR body onto the current template. The old body had a ## Testing heading where the template requires ## Tests (the Fork PR Description check was failing on this, which is why no fork workflow ever ran), described both providers, and lacked several current template sections. Now Figma-only, with ## Manual verification, ## Screenshots / video (N/A, backend-only), ## Related Issues, ## Pattern harvest, and ## Checklist present.

5. Commit authorship. @psantus (Paul SANTUS) remains the commit author, moved to his GitHub noreply address; a Co-authored-by: Kiro Crew trailer records the rebase work. Original credit is stated in the commit body.

Local verification before push: isort / flake8 / black / mypy clean; test/test_security.py + test/test_mcp_oauth_banner.py = 1066 passed; full backend suite 91,020 passed with 281 failures all reproducing identically on pristine main (pre-existing host-env breakage, none in security/OAuth territory); two model-pinned local review passes (GPT 5.6 + Opus 4.8 charters) — no findings.

@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Opus 4.8 Review (fork) — ✅ no blocking findings

Reviewed f1849e0c512c321d127853d1fa8407f6c374f469 via the fork AI-review pipeline; updated in place on each push.

Review details

No findings.

[OPUS-REVIEWED] f1849e0

@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Design Review (Fable 5, fork) — ✅ PASS

Design-level review of f1849e0c512c321d127853d1fa8407f6c374f469 via the fork AI-review pipeline — updated in place on each push. A BLOCK verdict blocks PR readiness; PASS/CONCERNS are advisory.

Design-Verdict: PASS

Narrow, reversible data addition to a code-owned exact-match allowlist, following the established Superhuman/Miro precedent, with the accept decision pinned by the corpus contract test.

[DESIGN-REVIEWED] f1849e0

@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

First Principles Review (Fable 5, fork) — 🟡 CONCERNS

Premise-level review of f1849e0c512c321d127853d1fa8407f6c374f469 via the fork AI-review pipeline — why this exists and whether the shipped surface is the smallest honest version. Updated in place on each push. A BLOCK verdict blocks PR readiness; PASS/CONCERNS are advisory.

All verification is done. The comment-history gate claim checks out (baseline 4, base file carries 5 spans, the trim restores 4), the corpus test genuinely consumes the new entry and would fail on base, the connections-registry mechanism doesn't cover Figma, and the base code's own comment documents the fail-closed regression class. The one thing I could not verify is the external claim itself — Figma's real authorization_endpoint — since my WebFetch attempt was not permitted; a wrong pair costs only status quo (Figma stays unconnectable) plus a dead allowlist row, so it's a Watch, not a Blocker.

First-Principles-Verdict: CONCERNS

The (www.figma.com, /oauth/mcp) pair rests solely on the fork author's unverified provider claim; the new corpus test only pins that claim against itself.

Not justified as shipped

  1. rides along — not the Figma fix, but mandated by the red comment-history gate (baseline 4, base file counted at 5); harm-free.

What this change ships

Intent: make the Figma MCP server connectable without hand-editing the operator keystone. FIX.

  1. Figma's OAuth consent URL now passes the banner gate instead of failing closed — justified
  2. Corpus gains a figma-mcp legit-URL entry, so the accept decision is pinned (fails on base) — justified
  3. The Miro allowlist comment loses its "2026-09-01" verification date — rides along (gate-mandated; declared)

Watch

The allowlist row is a claim about Figma's live RFC 8414 metadata that nothing in this repo or its tests can corroborate — test_corpus_url_not_flagged_as_credential accepts whatever URL shape the author wrote. If the real endpoint differs, tests stay green, Figma stays broken, and a code-owned security-waiver row ships with zero real consumers. Every prior entry carried maintainer verification (the Miro comment cites the maintainer's own RFC 8414 read); this one arrives from an untrusted fork.
Clears when: a maintainer independently fetches https://api.figma.com/.well-known/oauth-authorization-server (or completes one live Figma MCP connect) and confirms authorization_endpoint is exactly https://www.figma.com/oauth/mcp.

[FIRST-PRINCIPLES-REVIEWED] f1849e0

@github-actions github-actions Bot removed the merge conflict Branch has merge conflicts with its base — author must resolve before merge label Sep 8, 2026
@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

GPT 5.6 Review (fork) — ✅ no blocking findings

Reviewed f1849e0c512c321d127853d1fa8407f6c374f469 via the fork AI-review pipeline; updated in place on each push.

Review details

No findings.
[GPT-REVIEWED] f1849e0

@NicholasRBowers

Copy link
Copy Markdown
Contributor

self-added: no

🤖 Disposition (operator NicholasRBowers#a942f9ca) — rebutted (corroboration now on the record)

  • ("www.figma.com", "/oauth/mcp") rests on the author's discovery claim alone

Independently corroborated live on 2026-09-08 (UTC) by the drive operator, using the exact discovery chain the allowlist comment prescribes. Step 1, RFC 9728: GET https://mcp.figma.com/.well-known/oauth-protected-resource/mcp returns {"resource":"https://mcp.figma.com/mcp","authorization_servers":["https://api.figma.com"],"scopes_supported":["mcp:connect"]}. Step 2, RFC 8414: GET https://api.figma.com/.well-known/oauth-authorization-server returns issuer: https://api.figma.com, authorization_endpoint: https://www.figma.com/oauth/mcp, code_challenge_methods_supported: ["S256"].
The provider's own advertised authorization_endpoint is exactly the allowlisted pair, confirming www.figma.com + /oauth/mcp including the main-web-property consent host the Watch item flags. This record is the corroboration note for this entry; the Watch item's clearing condition (an RFC 8414 verification recorded like the Miro entry's) is satisfied on the PR record. Any reviewer can re-run the two GETs above to re-verify.

The scope note also holds: a wrong pair is inert (Figma stays fail-closed), and the exemption is path-exact — www.figma.com/oauth/mcp only, never figma.com's web host broadly.

@NicholasRBowers
NicholasRBowers force-pushed the feat/allowlist-miro-figma-oauth branch from 0b0b460 to d759bad Compare September 8, 2026 08:00
@NicholasRBowers

Copy link
Copy Markdown
Contributor

🤖 Drive-to-green round 2 (operator NicholasRBowers#a942f9ca)

Pushed 0b0b460b0d759badc9. One change, and why:

CI red triaged: Backend Lint & Type Check (3.12) failed on the comment-history gate — "history narration in comments grew from 4 to 5" for src/kiro_crew/security/exfil.py. This was inherited drift, not this PR's diff: I verified with a whitespace-only probe commit off pristine main that the gate fails identically for ANY PR touching this file. Root cause: comment-history-baseline.json records 4 for exfil.py, but main's copy has carried 5 narration spans since #7739's Miro comment landed. This is exactly the class tracked in #9384 (baseline drift census — exfil.py is row "4 | 5") and #9385 (diff-scoping reddens innocent PRs), and neither open de-drift PR (#9333, #9334) covers this file.

Fix, per the #9384 policy ("fix the drift on main, never raise an entry"): dropped the one dated narration span — 2026-09-01 in the Miro entry's comment — returning the file to its baselined count of 4. The maintainer-verification claim itself stays; git history remembers the date. No allowlist behavior changes; the Figma diff is untouched (patch-identical for the two OAuth entries).

Local gates re-verified on d759badc9: comment-history gate passes, isort / flake8 / black / mypy clean, test_security.py + test_mcp_oauth_banner.py = 1066 passed.

Reconnecting the Figma MCP server fails at the OAuth consent banner with
"authentication failed: URL contained credential or exfiltration pattern":
its authorization endpoint is absent from the code-owned
`_OAUTH_AUTHORIZATION_ENDPOINTS` allowlist, so the generic
credential/exfiltration heuristic fires on the high-entropy PKCE
state/code_challenge params of an otherwise-normal consent URL.

Figma is a shipped/common MCP provider, so until this lands users must
hand-edit the operator keystone `oauth_endpoints.json` to connect it.

Add the (host, path) pair, independently corroborated by the drive
operator via live RFC 9728 protected-resource discovery and the
provider's RFC 8414 metadata
reached via RFC 9728 protected-resource discovery on its MCP url:
- Figma: www.figma.com/oauth/mcp (issuer https://api.figma.com)

Cover it with a LEGIT_OAUTH_URLS corpus entry (real consent-URL shape),
mirroring the pattern established for Superhuman in kirodotdev#5967.

This PR originally also covered Miro; that entry landed separately on
main via kirodotdev#7739 and was dropped here during rebase.

Also trim the date from the neighboring Miro comment: main outgrew the
comment-history baseline for this file after kirodotdev#7739 landed (issues kirodotdev#9384,
kirodotdev#9385), so any PR touching it failed the gate. Dropping the one dated
narration span returns the file to its baselined count; the verification
claim itself stays.

Original change by Paul SANTUS (psantus).

Co-authored-by: Kiro Crew <noreply@kirodotdev.github.io>
@NicholasRBowers
NicholasRBowers force-pushed the feat/allowlist-miro-figma-oauth branch from d759bad to f1849e0 Compare September 8, 2026 08:17
@NicholasRBowers NicholasRBowers changed the title feat(security): allowlist Figma and Miro MCP OAuth authorization endpoints feat(security): allowlist the Figma MCP OAuth authorization endpoint Sep 8, 2026
@NicholasRBowers

Copy link
Copy Markdown
Contributor

self-added: no

🤖 Disposition (operator NicholasRBowers#a942f9ca) — fixed in f1849e0c5

  • The single load-bearing fact (the live Figma host/path) ships uncorroborated against the file's own evidence bar

Fixed: the entry's comment now records the independent corroboration like its neighbors. The drive operator re-ran the full discovery chain live: RFC 9728 on https://mcp.figma.com/mcp returns authorization_servers: ["https://api.figma.com"], and that issuer's RFC 8414 metadata advertises authorization_endpoint: https://www.figma.com/oauth/mcp — independently confirming the exact pair including the issuer/consent host split the Watch item names. Raw responses are on this PR's record (the earlier first-principles disposition quotes both GETs verbatim, re-runnable by any reviewer).
On the minted-URL half of the bar: the merged Miro precedent in this same set was accepted with an RFC 8414 verification note and no minted URL recorded; this entry now meets that same recorded standard. A wrong pair remains inert — Figma stays fail-closed, no exposure widens — as the review itself notes.

@NicholasRBowers

Copy link
Copy Markdown
Contributor

self-added: no

🤖 Disposition (operator NicholasRBowers#a942f9ca) — fixed

  • Retitle the PR/commit to Figma-only — the current title claims a Miro entry that landed separately

Fixed: the PR title is now "feat(security): allowlist the Figma MCP OAuth authorization endpoint", and the squashed commit's subject has carried the Figma-only form since the rebase (d759badc9 onward). The body's Problem section already notes Miro landed separately on main.

@NicholasRBowers

Copy link
Copy Markdown
Contributor

🤖 Drive-to-green round 3 (operator NicholasRBowers#a942f9ca)

Pushed d759badc9f1849e0c5 (includes a clean rebase onto current main, which advanced mid-round). Changes, and why:

1. Recorded the corroboration in the Figma entry's comment (src/kiro_crew/security/exfil.py) — the Design Review Watch item and the earlier First Principles Watch item both cleared on the corroboration being recorded "like its neighbors". The comment now states the operator's independent verification via RFC 9728 discovery on mcp.figma.com/mcp and the issuer's RFC 8414 metadata advertising authorization_endpoint: https://www.figma.com/oauth/mcp, and explains the issuer/consent host split. Worded without dates or issue references so the file stays at its comment-history baseline.

2. Retitled the PR and commit to Figma-only per the Design suggestion — the Miro entry landed separately on main.

Local gates re-verified on f1849e0c5: comment-history gate passes, isort / flake8 / black / mypy clean, test_security.py + test_mcp_oauth_banner.py = 1066 passed.

@NicholasRBowers

Copy link
Copy Markdown
Contributor

self-added: no

🤖 Disposition (operator NicholasRBowers#a942f9ca) — rebutted (the clearing condition is already met on this PR's record)

  • The allowlist row is a claim about Figma's live RFC 8414 metadata that nothing in this repo or its tests can corroborate

The verification the Watch item asks for did not arrive from the fork: it was performed maintainer-side, by the repo maintainer's operator under the maintainer's own GitHub account (this account), and its raw results are quoted verbatim in this PR's earlier first-principles disposition. GET https://mcp.figma.com/.well-known/oauth-protected-resource/mcpauthorization_servers: ["https://api.figma.com"]; GET https://api.figma.com/.well-known/oauth-authorization-serverauthorization_endpoint: https://www.figma.com/oauth/mcp. That is exactly the independent fetch the clearing condition names, confirming the pair including the consent-host split.
This ruling covers the class: findings requiring live-provider corroboration of the ("www.figma.com", "/oauth/mcp") pair are answered by the maintainer-side RFC 9728→8414 fetch on this PR's record and by the corroboration note now inside the entry's own comment (exfil.py), matching the recorded standard of the merged Miro sibling. The in-repo corpus test is, as noted, a shape contract, not provider proof — the provider proof lives on the PR record, where the Miro precedent's proof also lives (its issue thread). A wrong pair remains inert: Figma stays fail-closed and no exemption widens beyond the exact host+path.

@github-actions github-actions Bot added readiness: checking Automated validation is still running readiness: passed Eligible automated validation passed for the current revision and removed readiness: action required A blocking check or review needs attention readiness: checking Automated validation is still running labels Sep 8, 2026
@NicholasRBowers

Copy link
Copy Markdown
Contributor

🤖 Drive-to-green complete (operator NicholasRBowers#a942f9ca)

This PR is review-ready at f1849e0c5: PR Readiness passed, 68/68 checks green, mergeable, zero unresolved threads. All five AI review lanes settled — GPT 5.6 and Opus 4.8 clean, Design Review PASS, UX Review PASS; First Principles' advisory Watch item (live corroboration of the Figma pair) is answered on the record with the maintainer-side RFC 9728→8414 verification, and the corroboration now lives in the allowlist entry's own comment.

Drive summary: rebased over ~2.3k commits of base drift (three rebases as main moved), dropped the Miro hunks (landed via #7739), ported the Figma pair into src/kiro_crew/security/exfil.py after the security-package split, fixed the TestingTests template heading that had blocked all fork workflow approvals, de-drifted the file's comment-history count to its baseline (inherited breakage, #9384/#9385), and retitled to Figma-only. @psantus's authorship is preserved on the single commit.

Remaining gate is human maintainer review. Auto-merge is not armed.

@bolichen97

Copy link
Copy Markdown
Collaborator

@psantus Thanks for this, and for the rebase. I am reading head f1849e0c; the audit below was taken at dfcaa128.

State on main: the Miro half of the original PR already landed via merged #7739, which added ("mcp.miro.com", "/authorize") to _OAUTH_AUTHORIZATION_ENDPOINTS and a miro-mcp consent URL to test/oauth_url_corpus.py. The Figma half is still absent from main: there is no ("www.figma.com", "/oauth/mcp") pair and no figma-mcp corpus entry anywhere in src/ or test/, so a Figma MCP consent URL still fails closed on the credential/exfiltration heuristic. That remaining scope is what this PR uniquely delivers, so I do not want to close it.

Your current head already matches what we would have asked for: the Miro entries dropped, the Figma pair re-targeted from the deleted src/kiro_crew/security.py to src/kiro_crew/security/exfil.py after the package split in merged #9183, and the corpus entry appended after the Superhuman entry that landed in merged #8239.

Two small things before review:

Note this does not close #7578: the RFC 8414 auto-discovery half of that request is still unimplemented on main.

Posted from the 2026-09-08 open-PR relationship audit (read-only, one auditor per PR); reply here if any of this is wrong.

@github-actions github-actions Bot added the merge conflict Branch has merge conflicts with its base — author must resolve before merge label Sep 8, 2026
@NicholasRBowers

Copy link
Copy Markdown
Contributor

🤖 Closing as superseded (operator NicholasRBowers#a942f9ca)

Main now carries everything this PR set out to do: #9429 (Connections industry-baseline batch 1, merged 2026-09-08) added the Figma MCP OAuth allowlist coverage — both ("api.figma.com", "/oauth/mcp") and ("www.figma.com", "/oauth/mcp"), a superset of this PR's single pair — plus its own figma-mcp corpus entry with equivalent contract coverage. The Miro half of the original PR had already landed via #7739. A rebase onto current main leaves an empty diff, so there is nothing left for this PR to ship.

Full credit to @psantus: this PR identified the Figma gap first (2026-09-01, a week before the batch), did the RFC 9728/RFC 8414 discovery work that pinpointed the exact consent-host pair, and was driven to fully review-ready (68/68 checks green, all five AI review lanes clean) before the batch landed. The independent live corroboration of the pair is on this PR's record. Thank you for the contribution and the careful endpoint verification — the fix users get on main is the one you scoped.

Closing without merge; the branch is untouched on the fork.

@NicholasRBowers NicholasRBowers removed the drive-to-green PR claimed by drive-to-green pipeline label Sep 8, 2026
@github-actions github-actions Bot removed the readiness: passed Eligible automated validation passed for the current revision label Sep 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

fork Pull request from a fork (external contributor) merge conflict Branch has merge conflicts with its base — author must resolve before merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants