supermemory/apps/web/lib
Dhravya 3487666481
feat(web): add MCP connector directory (#1461)
<!-- VORFLUX_AGENT_PR_BODY_BEGIN -->
Adds the full 654-entry MCP directory without bundling records into client JavaScript, with explicit capability status and connector branding that degrades safely when no authoritative logo is available.

## Changes

- Lazy-load and validate the searchable, filterable, progressively rendered MCP catalog.
- Render same-origin proxied provider icons for 543 entries, with a reviewed domain allowlist and deterministic fallback marks for 111 unresolved or unbranded entries.
- Record OAuth discovery capability separately from end-to-end support; all directory setup actions remain suppressed until their authentication flow is verified.
- Add a reproducible OAuth metadata probe with HTTPS/private-network protections, stable URL keys, authorization-server scanning, and catalog fingerprint validation.
- Add Google Drive branding for the curated built-in connector.

## Testing

- **Passed:** Deterministic generation and catalog assertions.
  ```bash
  PATH="$HOME/.bun/bin:$PATH" python3 apps/web/scripts/generate-mcp-directory.py --output
  cmp apps/web/public/mcp-directory.json
  ```
  Verified 654 entries, 254 DCR discoveries, 27 preregistered OAuth discoveries, 373 unclassified entries, and zero directory setup actions.
- **Passed:** Stale OAuth metadata fingerprint is rejected by the generator.
- **Passed:** Touched-file Biome checks and `git diff --check`.
- **Passed:** Icon proxy returned 200 for an allowlisted domain and 400 for an unknown valid-looking domain.
- **Passed:** Authenticated desktop/mobile browser inspection and conservative capability labels.
- **Passed:** Public preview returned HTTP 200 and rendered the real app. Authentication cookies do not transfer to the public hostname, so the public screenshot shows login.
- **Partial:** Repository-wide TypeScript checks remain blocked by unrelated existing errors outside the touched MCP files.
- **Partial:** 111 entries intentionally retain deterministic fallback marks; endpoint-derived domains may not always be the canonical brand logo.
- **Blocked:** Google rejected the local HTTP OAuth callback, so live Google Drive consent, callback, persistence, tool discovery, disconnect, and reconnect were not completed.

Public preview: https://ar8ruchhbi65.preview.us1.vorflux.com/configure/tools

---
**Attached Images**

*[288.csv]*

*[mcp-directory-final.json]*

![mcp-directory-branding-desktop.png](https://api.us1.vorflux.com/assets/artifacts/c3VwZXJtZW1vcnk6Zjo4MDA0.3_UzR_OP9Jk228FYbrAPTXyqybRBlqwn5Uv4tksf_Y0.png)

![mcp-directory-branding-mobile.png](https://api.us1.vorflux.com/assets/artifacts/c3VwZXJtZW1vcnk6Zjo4MDA1.b5G6nsOBVm2s6DlEFWFiMFCcULAkV0MCCGZ8XVsA5js.png)

![mcp-directory-public-preview.png](https://api.us1.vorflux.com/assets/artifacts/c3VwZXJtZW1vcnk6Zjo4MDA2.ZrBAeBi62JX1xavAtaDLQ0fuixgBjN7x1NrqIxtdmKw.png)
<!-- VORFLUX_AGENT_PR_BODY_END -->

---
**Session Details**
- Session: [View Session](https://supermemory.us1.vorflux.com/agent-sessions/1cd0aab9-2a45-4818-aa13-f9bfe032ddba)
- Requested by: Dhravya Shah (dhravya@supermemory.com)
- Address comments on this PR. Add `(aside)` to your comment to have me ignore it.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Changes how users pick MCP URLs and auth (OAuth vs API key) before hitting existing connect endpoints; no new backend auth logic in this diff, but misconfiguration or trusting bad URLs remains a user-risk surface.
>
> **Overview**
> Adds a **browseable MCP directory** on the Company Brain connectors page: the catalog is **not bundled in JS**—it loads from static **`/mcp-directory.json`** only after the user opens the directory (with validation, caching, and abort handling).
>
> The new **`McpDirectoryBrowser`** supports search, category/availability filters, and progressive “show more” rendering. Supported remote entries route into the existing custom MCP flow via **Set up**, which pre-fills name/URL and opens the connector dialog with context-specific copy.
>
> The custom connector dialog now uses an explicit **OAuth vs API key** toggle; API key fields only appear for API-key mode, and directory-backed connections get **stable slugs** (`-dir-` suffix) so names display cleanly on connected cards. **Middleware** excludes `mcp-directory.json` from the auth matcher so the asset can be fetched publicly.
>
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 8b59bae84a. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
2026-08-20 22:58:39 +00:00
..
agent-space.test.ts feat(web): add Cursor to Agents (#1361) 2026-07-25 22:09:28 +00:00
agent-space.ts feat(web): add Cursor to Agents (#1361) 2026-07-25 22:09:28 +00:00
analytics.ts feat(web): take a card before the Company Brain trial starts (#1459) 2026-08-13 06:58:47 +00:00
billing-utils.ts refactor(brain): one isCompanyBrainOrg helper in the web app (#1535) 2026-08-18 23:13:12 +00:00
chat-auto-space.ts Update chat empty state and Auto space mode (#954) 2026-05-16 23:55:34 -07:00
chat-highlight-documents.ts Draft: Add chat source annotations (#1165) 2026-06-26 20:51:40 -07:00
chat-memory-tools.test.ts Draft: Add chat source annotations (#1165) 2026-06-26 20:51:40 -07:00
chat-memory-tools.ts Draft: Add chat source annotations (#1165) 2026-06-26 20:51:40 -07:00
chat-search-memory-results.ts feat: web search and improve chat with tools (#810) 2026-03-27 01:57:13 +00:00
chat-space-label.ts fix: space selector dropdown (#898) 2026-05-04 17:15:10 +00:00
chat-stream-error.ts Upgrade Nova model picker to current runtime models (#1404) 2026-08-13 17:08:50 +05:30
chat-web-search-tools.ts feat: web search and improve chat with tools (#810) 2026-03-27 01:57:13 +00:00
company-brain-entry.ts refactor(brain): one isCompanyBrainOrg helper in the web app (#1535) 2026-08-18 23:13:12 +00:00
configure-routes.ts feat(web): add Company Brain skills settings (#1322) 2026-08-02 05:36:32 +00:00
constants.ts fix: redirect new users to onboarding from plugin connect page (#908) 2026-05-11 10:57:43 -07:00
extract-urls.test.ts fix(web): stop extractUrls treating email addresses as URLs (#1187) 2026-07-10 19:14:57 -07:00
file-cache.ts implement Nova chat attachments on the web side (#1004) 2026-06-08 06:18:28 +00:00
fonts.ts feat: deep-research on user profile and tiptap integration (#672) 2026-01-15 21:53:53 +00:00
ingest-auto-space.ts Brand own space as Nova chats (#957) 2026-05-17 00:25:22 -07:00
integration-routes.ts feat(web): make /integrations a real route with connect deeplinks (#1155) 2026-06-23 20:42:29 +00:00
mcp-client-setup.ts docs: restructure documentation site and update integration UI (#1331) 2026-07-21 20:19:30 -07:00
mcp-directory.ts feat(web): add MCP connector directory (#1461) 2026-08-20 22:58:39 +00:00
mcp-icon-domains.json feat(web): add MCP connector directory (#1461) 2026-08-20 22:58:39 +00:00
mcp-manual-instructions.ts MCP Revamp (#1120) (#1380) 2026-07-30 17:08:51 -07:00
models.tsx Upgrade Nova model picker to current runtime models (#1404) 2026-08-13 17:08:50 +05:30
oauth-plugins.ts feat(web): MCP OAuth consent page (#1118) 2026-06-16 17:33:09 +00:00
plugin-catalog.ts docs: restructure documentation site and update integration UI (#1331) 2026-07-21 20:19:30 -07:00
plugin-document.test.ts feat(web): add Cursor to Agents (#1361) 2026-07-25 22:09:28 +00:00
plugin-document.ts feat(web): add Cursor to Agents (#1361) 2026-07-25 22:09:28 +00:00
plugin-space.ts feat(web): add Cursor to Agents (#1361) 2026-07-25 22:09:28 +00:00
reviewer-password-login.ts validate MCP OAuth login flow (#1395) 2026-08-01 05:15:22 +00:00
search-params.ts feat(web): add Cursor to Agents (#1361) 2026-07-25 22:09:28 +00:00
source-annotations.test.ts Draft: Add chat source annotations (#1165) 2026-06-26 20:51:40 -07:00
source-annotations.ts Draft: Add chat source annotations (#1165) 2026-06-26 20:51:40 -07:00
theme-provider.tsx feat: layout design with theme improvements (#443) 2025-10-01 21:59:54 +00:00
url-helpers.test.ts fix(web): match YouTube URLs by hostname instead of substring (#1182) 2026-07-10 16:20:18 -07:00
url-helpers.ts fix(web): use backend URL fallback for direct fetches (#1212) 2026-07-10 20:02:24 -07:00
variants.ts chore: delete document, document ui (#673) 2026-01-16 21:44:26 +00:00
view-mode-context.tsx feat(web): give Configure sections real routes under /configure (#1378) 2026-07-30 19:27:36 +00:00