Skip to content

🐛 fix: Restore MCP App Rendering and Actions - #16382

Merged
dustinhealy merged 12 commits into
devfrom
fix/mcp-apps-canary-rebase-regressions
Oct 16, 2026
Merged

dustinhealy merged 12 commits into
devfrom
fix/mcp-apps-canary-rebase-regressions

Conversation

@dustinhealy

@dustinhealy dustinhealy commented Sep 25, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Fix MCP App startup, placement, approvals, and sizing.

  • Restore sandbox startup and server binding validation.
  • Place each App immediately after the tool that produced it, before the rest of the assistant response.
  • Keep App frames attached to their resources through streaming, content compaction, and activity layout changes.
  • Preserve handoff authors across App boundaries and show Sources once for messages containing parallel content.
  • Queue concurrent requests for individual approval. The Debug App logs an action before making the action request; both requests now get their own approval.
  • Honor App width requests within the available space and report container bounds.
  • Resolve the requested server directly for follow-up tool and resource calls.

How it works

App frames belong to the message and sit between content sections. Expanding or collapsing tool, phase, and parallel disclosures keeps each iframe in place. Each section retains its content indices and agent/step ownership. Resume authors are collected across the complete message. The message also owns the Sources panel and its search context.

message
  content through producing tool
  App view
  remaining content / assistant response

Each App has a FIFO approval queue bounded by mcpAppSandbox.operationLimits.maxActive. Every request requires a host click. Cancellation, aborts, and teardown settle pending requests. Cancelling a queued request preserves the approval currently displayed. The host controls permissions and argument previews.

The sandbox uses an opaque srcdoc View with source and origin checks at the outer transport. Every inner document load requires a fresh bootstrap challenge before relaying messages. Host context reports the actual width and a flexible height bound to prevent a resize feedback loop.

Server validation and follow-up calls use role-aware authorization. Direct server lookup preserves configuration precedence and recovery.

Type of change

  • Bug fix
  • Performance improvement
  • Tests / tooling / CI

Testing

Tested environments/configuration:

  • Real local LibreChat, Chrome, disposable MongoDB, and deterministic model tool execution.
  • Five reference Apps: integration Testbed, official Debug, Basic React, Budget Allocator, and a strict-CSP Three.js fixture.
  • Repeated tool/resource interactions, sizing, and historical reopening across all five reference Apps on be94aabea6.
  • On b5fd896124, reproduced handoff and mixed sequential/parallel layouts with saved fixture transcripts and the real Basic App in Chrome. Verified resumed author attribution and a single Sources panel alongside the App and both parallel answers.
  • Debug: all six content types, refresh, multiple blocks, structured content, metadata, 750ms delay, deliberate server errors, and 200x100/400x300/800x600 sizing.
  • Basic React: time refresh, logging, and an approved chat message while the App remains live. Budget: 250k/Growth and all five sliders. Three.js: visible animated cube. Testbed: tool/resource calls, model-only denial, ping/logging, and grow/shrink.

Automated tests:

  • 317 focused client content, layout, and App ownership tests; 44 sandbox lifecycle tests; 138 focused API tests; controller wiring and real-SDK fixture server tests.
  • Client and packages/api typechecks; affected static checks, import sorting, and diff whitespace checks.
  • Production MCP Apps browser matrix: 5 tests across enabled, disabled, omitted-policy, and quota phases. Covers concurrent tools requiring separate consent, activity layouts, failed-load retry, reload, public-share restrictions, legacy HTML, quotas, and resource requests from a replacement document. Delivered pagehide teardown and navigation with deliberately dropped detach delivery are checked separately.
  • npm run lighthouse with 250ms simulated latency per database query: median LCP 3604ms, CLS 0.018, TBT 90ms.
  • Clean Codex review on a74d2d1da9. CI: 46 passing checks and 3 skipped jobs. Static checks fail on the upstream import order introduced by 🔀 refactor: Move Resumable Frame Dispatch and Attach Into the Chat Core #17129; the fix is in draft 🎨 style: Restore Resumable SSE Import Order #17191.

Screenshots / recordings

Recorded in local LibreChat with reference MCP servers and deterministic model tool execution. Fixed-build recordings use be94aabea6. Both Debug builds use the same disposable backend and reference server. Captions appear below the application viewport; Testbed includes labeled closeups of its Events panel.

1. Debug: before and after independent approvals

Same Debug App action: text content with structured output enabled.

Before (f71abd2d00 client and sandbox): logging receives approval, but the concurrent action returns empty content with isError: true.

review-debug-before.mp4

After (be94aabea6 client and sandbox): logging and the debug-tool request each receive approval, then the App displays Debug text content.

review-debug-after.mp4

2. Placement and state across tool disclosure

The Basic App appears after its producing get-time tool and before the remaining assistant response. The typed App state: KEEP-16382 value remains while opening and closing that tool disclosure.

Basic App between its producing get-time tool and the remaining assistant response

review-placement.mp4

3. Historical App reopening after browser reload

After a browser reload, the saved Basic App shows an Open app button. Clicking it reopens the App with the same saved tool timestamp.

review-reopen.mp4

4. App-requested sizing

The Debug App requests 400×300 and then 800×600. The frame changes size; Host Info reports width 800 after the second request.

review-sizing.mp4

5. Budget controls

Choose $250,000 and Growth, change Marketing from 25% to 30% and Engineering from 35% to 30%, then show the fully allocated 30/30/15/15/10 budget.

review-budget.mp4

6. Three.js animation

The Three.js reference App uses strict CSP and renders a rotating cube inside its producing tool response.

review-threejs.mp4

7. Testbed tool, resource, and ping

The Testbed requests echo, reads its note resource, and pings the server. Each result is shown in a labeled Events-panel closeup, with the surrounding App visible between actions.

review-testbed.mp4

Risk / compatibility

Apps split messages into activity sections, so a message containing an App can have activity groups on either side of it. Opening and closing Apps remains explicit. Closing or reloading recreates the App from its saved tool output and resets unsaved state.

Apps control their request deadlines. A request can expire while waiting for approval. Server binding, tenant, role, tool visibility, CSP, and read-only restrictions remain enforced.

Checklist

  • I reviewed my own changes
  • Relevant tests have been added or updated
  • Existing relevant tests pass locally
  • Affected checks pass
  • User-facing or complex behavior is documented where necessary
  • Required dependency changes have been merged/published: N/A
  • Required documentation PR: N/A

@lia-by-librechat

Copy link
Copy Markdown
Contributor

CI repair at head 8a3abaf86a0860615a47411deeced9e3c5d16711: sort the MCP App bridge imports in client/src/hooks/MCP/useAppBridge.ts. The previous Static checks job reported this file as the sole import-order offender; no runtime behavior changed. Focused client tests, client typecheck, and local static checks are running for this exact head.

@github-actions

Copy link
Copy Markdown
Contributor

Lighthouse CI failed. The last 80 log lines contain the measured budgets and assertion failures.

│ 21      │ 'http://localhost:3080/api/convos?pinned=true&limit=100'                                                        │ 2655.5589999999793 │ 3419.11500000002   │ 200    │
│ 22      │ 'http://localhost:3080/api/mcp/servers'                                                                         │ 2993.7639999999956 │ 4261.140999999974  │ 200    │
│ 23      │ 'http://localhost:3080/api/permissions/mcpServer/effective/all'                                                 │ 2994.9499999999825 │ 3754.066999999981  │ 200    │
│ 24      │ 'http://localhost:3080/api/prompts/groups?limit=10'                                                             │ 2995.9679999999935 │ 4260.889999999985  │ 200    │
│ 25      │ 'http://localhost:3080/api/keys?name=openAI'                                                                    │ 3254.9709999999905 │ 3919.9860000000044 │ 200    │
│ 26      │ 'http://localhost:3080/api/presets'                                                                             │ 3256.2539999999863 │ 3924.8550000000105 │ 200    │
│ 27      │ 'http://localhost:3080/api/tags'                                                                                │ 3256.9139999999898 │ 3925.081999999995  │ 200    │
│ 28      │ 'http://localhost:3080/api/share/link/16390000-0000-4000-8000-000000000001'                                     │ 3257.0999999999767 │ 4261.358999999997  │ 200    │
│ 29      │ 'http://localhost:3080/api/messages/16390000-0000-4000-8000-000000000001'                                       │ 3257.9139999999898 │ 4428.491000000009  │ 200    │
│ 30      │ 'http://localhost:3080/api/files/config'                                                                        │ 3258.109999999986  │ 4180.119999999995  │ 200    │
│ 31      │ 'http://localhost:3080/api/agents/tools/web_search/auth'                                                        │ 3258.3070000000007 │ 6947.713999999978  │ 200    │
│ 32      │ 'http://localhost:3080/api/endpoints/token-config'                                                              │ 3259.222999999998  │ 4435.342000000004  │ 200    │
│ 33      │ 'http://localhost:3080/api/agents/tools/calls?conversationId=16390000-0000-4000-8000-000000000001'              │ 3259.7889999999898 │ 4767.920000000013  │ 200    │
│ 34      │ 'http://localhost:3080/api/agents/chat/status/16390000-0000-4000-8000-000000000001?generationProtocolVersion=2' │ 4529.719000000012  │ 4785.445999999996  │ 200    │
└─────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴────────────────────┴────────────────────┴────────┘

Inspect .lighthouse HTML/JSON and e2e/lighthouse/README.md. Reuse loaded user/config data; overlap independent reads without bypassing authorization.

┌─────────┬────────────────────────────┬─────────────────────┬───────┐
│ (index) │ audit                      │ median              │ limit │
├─────────┼────────────────────────────┼─────────────────────┼───────┤
│ 0       │ 'largest-contentful-paint' │ 4542.919            │ 4500  │
│ 1       │ 'cumulative-layout-shift'  │ 0.01845043957767854 │ 0.1   │
│ 2       │ 'total-blocking-time'      │ 268.26699999999937  │ 500   │
└─────────┴────────────────────────────┴─────────────────────┴───────┘

  1) [chrome] › e2e/lighthouse/load.spec.ts:10:5 › serial database latency stays within web-vitals budgets 

    Error: Median largest-contentful-paint must stay within 4500

    expect(received).toBeLessThanOrEqual(expected)

    Expected: <= 4500
    Received:    4542.919

       at audit.ts:159

      157 |   console.table(measured);
      158 |   for (const { audit, median, limit } of measured) {
    > 159 |     expect(median, `Median ${audit} must stay within ${limit}`).toBeLessThanOrEqual(limit);
          |                                                                 ^
      160 |   }
      161 |   return results;
      162 | }
        at auditPage (/home/runner/work/LibreChat/LibreChat/e2e/lighthouse/audit.ts:159:65)
        at /home/runner/work/LibreChat/LibreChat/e2e/lighthouse/load.spec.ts:33:19

    attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
    e2e/lighthouse/.test-results/load-serial-database-latency-stays-within-web-vitals-budgets-chrome/test-failed-1.png
    ────────────────────────────────────────────────────────────────────────────────────────────────

    Error Context: e2e/lighthouse/.test-results/load-serial-database-latency-stays-within-web-vitals-budgets-chrome/error-context.md

    attachment #3: trace (application/zip) ─────────────────────────────────────────────────────────
    e2e/lighthouse/.test-results/load-serial-database-latency-stays-within-web-vitals-budgets-chrome/trace.zip
    Usage:

        npx playwright show-trace e2e/lighthouse/.test-results/load-serial-database-latency-stays-within-web-vitals-budgets-chrome/trace.zip

    ────────────────────────────────────────────────────────────────────────────────────────────────


🤖: global teardown has been started
2026-09-27 01:06:33 �[32minfo�[39m: �[32mMongo Connection options�[39m
2026-09-27 01:06:33 �[32minfo�[39m: �[32m{�[39m
�[32m  "bufferCommands": false�[39m
�[32m}�[39m
🤖:  ✅  Connected to Database
🤖:  ✅  Found user in Database
🤖:  ✅  Deleted 1 convos & 2 messages
🤖:  ✅  Deleted user from Database
🤖: global teardown has been started
2026-09-27 01:06:33 �[32minfo�[39m: �[32mMongo Connection options�[39m
2026-09-27 01:06:33 �[32minfo�[39m: �[32m{�[39m
�[32m  "bufferCommands": false�[39m
�[32m}�[39m
🤖:  ✅  Connected to Database
🤖:  ⚠️  User not found in Database
  1 failed
    [chrome] › e2e/lighthouse/load.spec.ts:10:5 › serial database latency stays within web-vitals budgets 

Open the full run

@lia-by-librechat

Copy link
Copy Markdown
Contributor

Lighthouse retry at exact head acceab54c12e21d68c852a9e6aa9a4fb3a84568a (tree unchanged from 8a3abaf86). The prior head's three LCP samples were 4,349/4,422/4,579 ms (median 4,422 ms, passed); the failed head's were 4,305/4,543/4,553 ms (median 4,543 ms, 43 ms over the 4,500 ms budget). The only intervening code change reordered two imports in the MCP App bridge. Both audits measured the same transcript and similar API timing, so there is no demonstrated application regression or reason to change the budget. This empty commit triggers a new CI attempt because the GitHub integration cannot rerun the earlier job. I will inspect the result before making any application change.

@lia-by-librechat

Copy link
Copy Markdown
Contributor

Lighthouse CI passed at exact head acceab54c12e21d68c852a9e6aa9a4fb3a84568a: median LCP 4,286 ms (budget 4,500 ms), CLS 0.0184 (budget 0.1), TBT 238 ms (budget 500 ms). The app tree and thresholds are unchanged from the previous failed head. This confirms that the 43 ms overage was run-to-run variation, not a reproducible MCP App regression. Other CI lanes are still completing.

@danny-avila
danny-avila marked this pull request as ready for review September 27, 2026 11:55
@danny-avila

Copy link
Copy Markdown
Collaborator

@codex review

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 27, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-16T19:28:38.884375Z a74d2d1 Manual request
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: acceab54c1

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread packages/api/src/mcp/registry/MCPServersRegistry.ts Outdated
Comment thread client/src/components/Chat/Messages/Content/ContentParts.tsx Outdated
@danny-avila

Copy link
Copy Markdown
Collaborator

@dustinhealy see codex findings

@lia-by-librechat

Copy link
Copy Markdown
Contributor

Review handoff for exact head 4f33e694d848d38e37dc0888b9e8f481c16312bf: MCP App validation now partitions the per-server lookup by the request's current role, applies that role to direct and agent-derived ACL checks, and covers role transitions and pre-existing roleless cache entries. Focused registry/controller tests: 114 passed; real-MongoDB server ACL tests: 111 passed; API TypeScript typecheck and production package build passed. Please review this head.

@github-actions

Copy link
Copy Markdown
Contributor

Lighthouse CI failed. The last 80 log lines contain the measured budgets and assertion failures.

│ 21      │ 'http://localhost:3080/api/convos?pinned=true&limit=100'                                                        │ 2664.9490000000806 │ 3433.530000000028  │ 200    │
│ 22      │ 'http://localhost:3080/api/mcp/servers'                                                                         │ 3013.2480000000796 │ 4284.701000000059  │ 200    │
│ 23      │ 'http://localhost:3080/api/permissions/mcpServer/effective/all'                                                 │ 3013.7720000000554 │ 3776.8850000000093 │ 200    │
│ 24      │ 'http://localhost:3080/api/prompts/groups?limit=10'                                                             │ 3016.2660000000615 │ 4284.435000000056  │ 200    │
│ 25      │ 'http://localhost:3080/api/keys?name=openAI'                                                                    │ 3269.6080000000075 │ 3918.7880000000005 │ 200    │
│ 26      │ 'http://localhost:3080/api/presets'                                                                             │ 3269.8880000000354 │ 3938.774000000034  │ 200    │
│ 27      │ 'http://localhost:3080/api/tags'                                                                                │ 3271.5370000000694 │ 3942.2000000000116 │ 200    │
│ 28      │ 'http://localhost:3080/api/share/link/16390000-0000-4000-8000-000000000001'                                     │ 3271.7330000000657 │ 4284.972000000067  │ 200    │
│ 29      │ 'http://localhost:3080/api/messages/16390000-0000-4000-8000-000000000001'                                       │ 3273.8030000000726 │ 4424.536000000022  │ 200    │
│ 30      │ 'http://localhost:3080/api/files/config'                                                                        │ 3274.0090000000782 │ 4194.289000000048  │ 200    │
│ 31      │ 'http://localhost:3080/api/agents/tools/web_search/auth'                                                        │ 3275.161000000022  │ 6966.54800000001   │ 200    │
│ 32      │ 'http://localhost:3080/api/endpoints/token-config'                                                              │ 3275.3600000000442 │ 4451.869000000064  │ 200    │
│ 33      │ 'http://localhost:3080/api/agents/tools/calls?conversationId=16390000-0000-4000-8000-000000000001'              │ 3275.5950000000303 │ 4796.1870000000345 │ 200    │
│ 34      │ 'http://localhost:3080/api/agents/chat/status/16390000-0000-4000-8000-000000000001?generationProtocolVersion=2' │ 4534.017000000051  │ 4788.838000000047  │ 200    │
└─────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴────────────────────┴────────────────────┴────────┘

Inspect .lighthouse HTML/JSON and e2e/lighthouse/README.md. Reuse loaded user/config data; overlap independent reads without bypassing authorization.

┌─────────┬────────────────────────────┬─────────────────────┬───────┐
│ (index) │ audit                      │ median              │ limit │
├─────────┼────────────────────────────┼─────────────────────┼───────┤
│ 0       │ 'largest-contentful-paint' │ 4562.265            │ 4500  │
│ 1       │ 'cumulative-layout-shift'  │ 0.01845044229562502 │ 0.1   │
│ 2       │ 'total-blocking-time'      │ 268.2050000000004   │ 500   │
└─────────┴────────────────────────────┴─────────────────────┴───────┘

  1) [chrome] › e2e/lighthouse/load.spec.ts:10:5 › serial database latency stays within web-vitals budgets 

    Error: Median largest-contentful-paint must stay within 4500

    expect(received).toBeLessThanOrEqual(expected)

    Expected: <= 4500
    Received:    4562.265

       at audit.ts:159

      157 |   console.table(measured);
      158 |   for (const { audit, median, limit } of measured) {
    > 159 |     expect(median, `Median ${audit} must stay within ${limit}`).toBeLessThanOrEqual(limit);
          |                                                                 ^
      160 |   }
      161 |   return results;
      162 | }
        at auditPage (/home/runner/work/LibreChat/LibreChat/e2e/lighthouse/audit.ts:159:65)
        at /home/runner/work/LibreChat/LibreChat/e2e/lighthouse/load.spec.ts:33:19

    attachment #1: screenshot (image/png) ──────────────────────────────────────────────────────────
    e2e/lighthouse/.test-results/load-serial-database-latency-stays-within-web-vitals-budgets-chrome/test-failed-1.png
    ────────────────────────────────────────────────────────────────────────────────────────────────

    Error Context: e2e/lighthouse/.test-results/load-serial-database-latency-stays-within-web-vitals-budgets-chrome/error-context.md

    attachment #3: trace (application/zip) ─────────────────────────────────────────────────────────
    e2e/lighthouse/.test-results/load-serial-database-latency-stays-within-web-vitals-budgets-chrome/trace.zip
    Usage:

        npx playwright show-trace e2e/lighthouse/.test-results/load-serial-database-latency-stays-within-web-vitals-budgets-chrome/trace.zip

    ────────────────────────────────────────────────────────────────────────────────────────────────


🤖: global teardown has been started
2026-09-27 16:29:29 �[32minfo�[39m: �[32mMongo Connection options�[39m
2026-09-27 16:29:29 �[32minfo�[39m: �[32m{�[39m
�[32m  "bufferCommands": false�[39m
�[32m}�[39m
🤖:  ✅  Connected to Database
🤖:  ✅  Found user in Database
🤖:  ✅  Deleted 1 convos & 2 messages
🤖:  ✅  Deleted user from Database
🤖: global teardown has been started
2026-09-27 16:29:30 �[32minfo�[39m: �[32mMongo Connection options�[39m
2026-09-27 16:29:30 �[32minfo�[39m: �[32m{�[39m
�[32m  "bufferCommands": false�[39m
�[32m}�[39m
🤖:  ✅  Connected to Database
🤖:  ⚠️  User not found in Database
  1 failed
    [chrome] › e2e/lighthouse/load.spec.ts:10:5 › serial database latency stays within web-vitals budgets 

Open the full run

zhixuan312 pushed a commit to zhixuan312/librechat-mcp-apps-build that referenced this pull request Oct 1, 2026
canary as merged (a98d40f) renders Apps detached from their tool call, fails the bridge
first initialization and is blocked by an inherited X-Frame-Options header; the fix is
LibreChat-AI/LibreChat#16382 on fix/mcp-apps-canary-rebase-regressions. A ref with a slash
is not a valid docker tag, so the ref tag is sanitised.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@codegraph-librechat codegraph-librechat Bot added the 🗺️ Chat Frontend codegraph: the taxonomy area this belongs to (classifier, confidence ≥ 0.9) label Oct 4, 2026
@dustinhealy
dustinhealy force-pushed the fix/mcp-apps-canary-rebase-regressions branch from 4f33e69 to 54152c2 Compare October 13, 2026 19:25
@dustinhealy
dustinhealy changed the base branch from canary to dev October 13, 2026 19:26
@dustinhealy

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 54152c2ec5

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread client/src/components/MCPUIResource/MCPAppViews.tsx Outdated
Comment thread client/src/components/Chat/Messages/Content/ContentParts.tsx Outdated
Comment thread packages/api/src/mcp/registry/MCPServersRegistry.ts
Copilot AI balanced review requested due to automatic review settings October 13, 2026 19:49
@dustinhealy dustinhealy changed the title 🐛 fix: Restore MCP App Rendering and Startup 🐛 fix: Restore MCP App Startup and Validation Oct 13, 2026
@dustinhealy

Copy link
Copy Markdown
Collaborator Author

@codex review

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔵 Needs a closer look

The security-sensitive iframe transport and sandbox changes still require current-head browser-suite verification.

0 open findings

What changed in this PR

Stabilizes MCP App startup, sandbox loading, and persisted-server validation across the client and API.

Changes:

  • Adds Strict Mode-safe, source/origin-validated iframe transport.
  • Moves inner App documents to srcdoc and corrects frame headers.
  • Uses role-scoped, single-server validation with concurrent ACL checks and expanded tests.
File Description
packages/​api/​src/​mcp/​registry/​MCPServersRegistry.ts Adds role-scoped single-server resolution.
packages/​api/​src/​mcp/​registry/​db/​ServerConfigsDB.ts Reuses principals across concurrent ACL checks.
packages/​api/​src/​mcp/​registry/​__tests__/​ServerConfigsDB.test.ts Tests role-aware database access.
packages/​api/​src/​mcp/​registry/​__tests__/​MCPServersRegistry.test.ts Tests role-scoped caching and lookup.
packages/​api/​src/​mcp/​apps/​controller.ts Removes conflicting inherited frame headers.
packages/​api/​src/​mcp/​apps/​controller.spec.ts Covers sandbox header behavior.
client/​src/​utils/​__tests__/​mcpSandbox.spec.ts Updates sandbox lifecycle tests for srcdoc.
client/​src/​hooks/​MCP/​useAppBridge.ts Adds live iframe transport and replay-safe initialization.
client/​src/​hooks/​MCP/​__tests__/​useAppBridge.spec.tsx Covers Strict Mode and message-source validation.
client/​public/​mcp-sandbox.html Loads opaque App documents using srcdoc.

🧠 Review effort: Balanced


💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@codegraph-librechat codegraph-librechat Bot added the 🗺️ MCP OAuth codegraph: the taxonomy area this belongs to (classifier, confidence ≥ 0.9) label Oct 13, 2026
@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Can't wait for the next one!

Reviewed commit: f71abd2d00

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@dustinhealy dustinhealy changed the title 🐛 fix: Restore MCP App Startup and Validation 🐛 fix: Restore MCP App Rendering and Actions Oct 13, 2026
@dustinhealy

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 61b4f2ae62

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread client/src/components/Chat/Messages/Content/ContentParts.tsx Outdated
@dustinhealy

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. 🎉

Reviewed commit: be94aabea6

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@codegraph-librechat codegraph-librechat Bot added the 🗺️ MCP & OAuth codegraph: the taxonomy area this belongs to (classifier, confidence ≥ 0.9) label Oct 15, 2026
@dustinhealy
dustinhealy requested a balanced review from Copilot October 16, 2026 18:37

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 Changes recommended

App-boundary slicing introduces unresolved attribution and source-panel regressions.

2 open findings

🧠 Review effort: Balanced

Comment thread client/src/components/Chat/Messages/Content/ContentParts.tsx
Comment thread client/src/components/Chat/Messages/Content/ContentParts.tsx
@dustinhealy

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Keep them coming!

Reviewed commit: b5fd896124

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔵 Needs a closer look

Sandbox isolation and authorization changes require human security review, and the navigation regression test has an unresolved teardown race.

1 open finding
2 resolved since last review

🧠 Review effort: Balanced

Comment thread e2e/specs/mock/mcp-apps.spec.ts
@dustinhealy

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. 🎉

Reviewed commit: a74d2d1da9

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@dustinhealy
dustinhealy merged commit f757a67 into dev Oct 16, 2026
50 checks passed
@dustinhealy
dustinhealy deleted the fix/mcp-apps-canary-rebase-regressions branch October 16, 2026 20:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🗺️ Chat Frontend codegraph: the taxonomy area this belongs to (classifier, confidence ≥ 0.9) 🗺️ MCP OAuth codegraph: the taxonomy area this belongs to (classifier, confidence ≥ 0.9) 🗺️ MCP & OAuth codegraph: the taxonomy area this belongs to (classifier, confidence ≥ 0.9) 🛡️ security review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants