Conversation
…ything but icons and fully accurate MCP list
|
Claude finished @DIodide's task in 1m 45s —— View job Code Review
Overall this is a solid, well-structured PR. The refactoring decisions (shared Bug: User-visible debug text in Slack description
description: "(wait until deployed)Send messages, read channel history, and search conversations.",This note is rendered directly in the preset grid that end users see. Strip the Bug: Inconsistent
|
| Severity | Issue | File |
|---|---|---|
| 🔴 Security | Missing event.origin check in OAuth message handler |
mcp-oauth-connect-row.tsx |
| 🟠 Bug | isSelected uses name-only check, filter uses name+URL |
$harnessId.tsx |
| 🟠 Bug | Slack description has (wait until deployed) prefix |
mcp.ts |
| 🟡 Type | HarnessCard.authType missing "oauth" |
index.tsx |
| 🟡 UX | Duplicate action gives no user feedback | index.tsx |
| ℹ️ Note | In-memory OAuth state won't survive multi-instance | mcp_oauth.py |
|
@cole-ramer fix type inconsistency (one line add) and Bug: Inconsistent isSelected check in togglePresetMcp, also add a toast for harness duplication |
|
@claude review the last commit |
|
Claude finished @DIodide's task in 1m 12s —— View job Review of Last Commit (
|
| Severity | Issue | File |
|---|---|---|
| 🔴 Security | Missing event.origin check in OAuth message handler |
mcp-oauth-connect-row.tsx:52 |
| 🟠 Bug | Slack description still has (wait until deployed) prefix |
mcp.ts:68 |
The security issue is the most important remaining one — any page in any tab can spoof a successful OAuth connection by posting { type: "mcp-oauth-callback", success: true }. Fix:
const handler = (event: MessageEvent) => {
+ if (event.origin !== window.location.origin) return;
if (event.data?.type === "mcp-oauth-callback") {
Selectable MCPs, Preset Grid, OAuth Refactor & Harness Duplication
Overview
This set of changes introduces a curated preset MCP server catalog, refactors OAuth connection management into a shared component, adds the ability to duplicate harnesses, and includes a comprehensive architecture document. The onboarding and harness-edit pages have been restructured to present MCPs through a selectable grid rather than requiring users to manually enter server URLs.
Changes by Area
1. Preset MCP Server Catalog (
apps/web/src/lib/mcp.ts— new file)A new shared data layer defines the types and registry for MCP servers:
McpServerEntryinterface — the canonical shape for an MCP server (name, url, authType, optional authToken). Previously this interface was duplicated inline in bothonboarding.tsxand$harnessId.tsx; it now lives in one place.PresetMcpDefinitioninterface — extends a server entry with anid, human-readabledescription,iconName(either a Simple Icons slug or a full favicon URL), andcategory.PRESET_MCPS— a static array of 9 pre-configured MCP servers users can select from:junctionenginegithubnotionlinearslackjiraawsknowledgeexacontext7presetIdsToServerEntries(ids)— utility that maps an array of selected preset IDs back to theirMcpServerEntryobjects, used when building the final MCP server list for harness creation.2. Preset MCP Grid Component (
apps/web/src/components/preset-mcp-grid.tsx— new file)A reusable UI component that renders the preset catalog as a responsive checkbox grid (1–3 columns depending on screen width). Each card shows:
cdn.simpleicons.org(with dark mode inversion) or a favicon URL, with a fallback to the first letter of the name if the image fails to load.Used on both the onboarding page and the harness edit page.
3. Shared OAuth Connect Row (
apps/web/src/components/mcp-oauth-connect-row.tsx— new file)The OAuth connection UI for individual servers was previously duplicated between
onboarding.tsx(97 lines) and$harnessId.tsx(80+ lines). This extracts it into a single shared component:GET /api/mcp/oauth/start, opens the authorization URL in a popup, and listens for thepostMessagecallback.4. Onboarding Page Refactor (
apps/web/src/routes/onboarding.tsx)The onboarding wizard's MCP step has been restructured:
oauthConnectedmap) and wouldn't survive a page refresh.customMcpServers(manually added) andselectedPresetMcps(preset IDs), merged at submission time viapresetIdsToServerEntries.api.mcpOAuthTokens.listStatuses) instead of local state, so connection status persists across sessions and is consistent with the rest of the app.OAuthConnectRowcomponent (97 lines) has been removed in favor of the shared component.McpServerEntryinterface is now imported fromlib/mcp.tsinstead of being defined locally.max-w-2xltomax-w-3xlto accommodate the grid.5. Harness Edit Page Refactor (
apps/web/src/routes/harnesses/$harnessId.tsx)The harness editor has been updated to match the new MCP selection pattern:
selectedPresetMcpsandcustomMcpServersare computed viauseMemofrom the current server list, avoiding duplicate state.togglePresetMcphandler adds/removes preset servers from the list.OAuthConnectRowand reads connection status from Convex viaapi.mcpOAuthTokens.listStatuses.OAuthStatusBadge: The old 80-line inline component that checked status via a REST call to/api/mcp/oauth/statushas been replaced. OAuth servers now just show a static "OAuth" badge in the server row, with the actual connect/status UI in the dedicated section.max-w-2xltomax-w-3xl.6. Harness Duplication (
packages/convex-backend/convex/harnesses.ts+apps/web/src/routes/harnesses/index.tsx)Backend: A new
duplicatemutation on the harnesses table:"Copy of <name>", preserving the model, status, MCP servers, and skills.lastUsedAttimestamp.Frontend: The harness list page now supports duplication:
onDuplicatecallback is threaded throughHarnessGroup→HarnessCardcomponents.7. Slack OAuth Support (
packages/fastapi/app/config.py+packages/fastapi/app/services/mcp_oauth.py)SLACK_OAUTH_CLIENT_IDandSLACK_OAUTH_CLIENT_SECRET._get_preregistered_clientfunction now checks for Slack alongside GitHub. If the OAuth issuer URL containsslack.comand credentials are configured, it returns a pre-registered client — skipping Dynamic Client Registration (which Slack doesn't support from non-HTTPS origins).8. Architecture Document (
ARCHITECTURE.md— new file)A 450-line architecture guide covering:
Files Changed
ARCHITECTURE.mdapps/web/src/components/mcp-oauth-connect-row.tsxapps/web/src/components/preset-mcp-grid.tsxapps/web/src/lib/mcp.tsapps/web/src/routes/harnesses/$harnessId.tsxapps/web/src/routes/harnesses/index.tsxapps/web/src/routes/onboarding.tsxpackages/convex-backend/convex/harnesses.tspackages/fastapi/app/config.pypackages/fastapi/app/services/mcp_oauth.pySelectable MCPs, Preset Grid, OAuth Refactor & Harness Duplication
Overview
This set of changes introduces a curated preset MCP server catalog, refactors OAuth connection management into a shared component, adds the ability to duplicate harnesses, and includes a comprehensive architecture document. The onboarding and harness-edit pages have been restructured to present MCPs through a selectable grid rather than requiring users to manually enter server URLs.
Changes by Area
1. Preset MCP Server Catalog (
apps/web/src/lib/mcp.ts— new file)A new shared data layer defines the types and registry for MCP servers:
McpServerEntryinterface — the canonical shape for an MCP server (name, url, authType, optional authToken). Previously this interface was duplicated inline in bothonboarding.tsxand$harnessId.tsx; it now lives in one place.PresetMcpDefinitioninterface — extends a server entry with anid, human-readabledescription,iconName(either a Simple Icons slug or a full favicon URL), andcategory.PRESET_MCPS— a static array of 9 pre-configured MCP servers users can select from:junctionenginegithubnotionlinearslackjiraawsknowledgeexacontext7presetIdsToServerEntries(ids)— utility that maps an array of selected preset IDs back to theirMcpServerEntryobjects, used when building the final MCP server list for harness creation.2. Preset MCP Grid Component (
apps/web/src/components/preset-mcp-grid.tsx— new file)A reusable UI component that renders the preset catalog as a responsive checkbox grid (1–3 columns depending on screen width). Each card shows:
cdn.simpleicons.org(with dark mode inversion) or a favicon URL, with a fallback to the first letter of the name if the image fails to load.Used on both the onboarding page and the harness edit page.
3. Shared OAuth Connect Row (
apps/web/src/components/mcp-oauth-connect-row.tsx— new file)The OAuth connection UI for individual servers was previously duplicated between
onboarding.tsx(97 lines) and$harnessId.tsx(80+ lines). This extracts it into a single shared component:GET /api/mcp/oauth/start, opens the authorization URL in a popup, and listens for thepostMessagecallback.4. Onboarding Page Refactor (
apps/web/src/routes/onboarding.tsx)The onboarding wizard's MCP step has been restructured:
oauthConnectedmap) and wouldn't survive a page refresh.customMcpServers(manually added) andselectedPresetMcps(preset IDs), merged at submission time viapresetIdsToServerEntries.api.mcpOAuthTokens.listStatuses) instead of local state, so connection status persists across sessions and is consistent with the rest of the app.OAuthConnectRowcomponent (97 lines) has been removed in favor of the shared component.McpServerEntryinterface is now imported fromlib/mcp.tsinstead of being defined locally.max-w-2xltomax-w-3xlto accommodate the grid.5. Harness Edit Page Refactor (
apps/web/src/routes/harnesses/$harnessId.tsx)The harness editor has been updated to match the new MCP selection pattern:
selectedPresetMcpsandcustomMcpServersare computed viauseMemofrom the current server list, avoiding duplicate state.togglePresetMcphandler adds/removes preset servers from the list.OAuthConnectRowand reads connection status from Convex viaapi.mcpOAuthTokens.listStatuses.OAuthStatusBadge: The old 80-line inline component that checked status via a REST call to/api/mcp/oauth/statushas been replaced. OAuth servers now just show a static "OAuth" badge in the server row, with the actual connect/status UI in the dedicated section.max-w-2xltomax-w-3xl.6. Harness Duplication (
packages/convex-backend/convex/harnesses.ts+apps/web/src/routes/harnesses/index.tsx)Backend: A new
duplicatemutation on the harnesses table:"Copy of <name>", preserving the model, status, MCP servers, and skills.lastUsedAttimestamp.Frontend: The harness list page now supports duplication:
onDuplicatecallback is threaded throughHarnessGroup→HarnessCardcomponents.7. Slack OAuth Support (
packages/fastapi/app/config.py+packages/fastapi/app/services/mcp_oauth.py)SLACK_OAUTH_CLIENT_IDandSLACK_OAUTH_CLIENT_SECRET._get_preregistered_clientfunction now checks for Slack alongside GitHub. If the OAuth issuer URL containsslack.comand credentials are configured, it returns a pre-registered client — skipping Dynamic Client Registration (which Slack doesn't support from non-HTTPS origins).8. Architecture Document (
ARCHITECTURE.md— new file)A 450-line architecture guide covering:
Files Changed
ARCHITECTURE.mdapps/web/src/components/mcp-oauth-connect-row.tsxapps/web/src/components/preset-mcp-grid.tsxapps/web/src/lib/mcp.tsapps/web/src/routes/harnesses/$harnessId.tsxapps/web/src/routes/harnesses/index.tsxapps/web/src/routes/onboarding.tsxpackages/convex-backend/convex/harnesses.tspackages/fastapi/app/config.pypackages/fastapi/app/services/mcp_oauth.py