From c65c078205137ae70fee4710245ed34e7e07d897 Mon Sep 17 00:00:00 2001 From: Dotta Date: Tue, 21 Jul 2026 17:42:19 +0000 Subject: [PATCH] fix(connections): parse template capture corpus --- .../src/app-definitions.ingestion-report.json | 2525 +++++++++++++++++ scripts/ingest-app-definitions.mjs | 46 +- 2 files changed, 2568 insertions(+), 3 deletions(-) create mode 100644 packages/shared/src/app-definitions.ingestion-report.json diff --git a/packages/shared/src/app-definitions.ingestion-report.json b/packages/shared/src/app-definitions.ingestion-report.json new file mode 100644 index 00000000000..4796938b1a7 --- /dev/null +++ b/packages/shared/src/app-definitions.ingestion-report.json @@ -0,0 +1,2525 @@ +{ + "schemaVersion": 1, + "corpusSize": 99, + "providers": [ + { + "slug": "airtable", + "stateCount": 2, + "states": [ + { + "label": "initial (managed setup, Advanced expanded)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 6, + "linkCount": 2 + }, + { + "label": "manual (after \"enter details manually\")", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 8, + "linkCount": 2 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (managed setup, Advanced expanded)" + ] + }, + { + "slug": "anthropic", + "stateCount": 1, + "states": [ + { + "label": "initial (API Key form, only state)", + "transport": "rest_api", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 6, + "linkCount": 0 + } + ], + "ambiguities": [] + }, + { + "slug": "api-key-generic", + "stateCount": 1, + "states": [ + { + "label": "initial — Step 2 Configure (single state)", + "transport": "rest_api", + "auth": "api_key", + "ownershipModes": [], + "fieldCount": 6, + "linkCount": 2 + } + ], + "ambiguities": [] + }, + { + "slug": "asana", + "stateCount": 1, + "states": [ + { + "label": "initial (manual/BYO only — no managed setup offered)", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "platform_shared", + "customer" + ], + "fieldCount": 8, + "linkCount": 5 + } + ], + "ambiguities": [] + }, + { + "slug": "bamboohr", + "stateCount": 2, + "states": [ + { + "label": "initial — Step 2 Configure — Select Connection Type (OAuth 2.0 card open with Company Domain; API Key card collapsed)", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 1, + "linkCount": 0 + }, + { + "label": "Step 2 Configure — after clicking \"API Key\" connection-type card", + "transport": "mcp_remote", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 6, + "linkCount": 3 + } + ], + "ambiguities": [] + }, + { + "slug": "beehiiv", + "stateCount": 5, + "states": [ + { + "label": "initial — Step 2 Details (radio MCP | API, MCP default)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [], + "fieldCount": 3, + "linkCount": 0 + }, + { + "label": "Step 3 Configure — path: MCP — tab: Managed (default)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 7, + "linkCount": 2 + }, + { + "label": "Step 3 Configure — path: MCP — tab: Your own credentials", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 9, + "linkCount": 4 + }, + { + "label": "Step 3 Configure — path: API — auth: OAuth 2.0 (default; captured in a fresh dialog, name orange-chair)", + "transport": "rest_api", + "auth": "oauth", + "ownershipModes": [], + "fieldCount": 7, + "linkCount": 5 + }, + { + "label": "Step 3 Configure — path: API — auth: API Key", + "transport": "rest_api", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 10, + "linkCount": 3 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial — Step 2 Details (radio MCP | API, MCP default)", + "Auth is not explicit in capture state: Step 3 Configure — path: MCP — tab: Managed (default)" + ] + }, + { + "slug": "bitly", + "stateCount": 2, + "states": [ + { + "label": "initial (managed setup)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 6, + "linkCount": 2 + }, + { + "label": "manual (after \"enter details manually\")", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 8, + "linkCount": 2 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (managed setup)" + ] + }, + { + "slug": "box", + "stateCount": 1, + "states": [ + { + "label": "initial (manual/BYO only — no managed setup offered)", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "platform_shared", + "customer" + ], + "fieldCount": 8, + "linkCount": 5 + } + ], + "ambiguities": [] + }, + { + "slug": "brex", + "stateCount": 2, + "states": [ + { + "label": "initial (managed setup)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 6, + "linkCount": 2 + }, + { + "label": "manual (after \"enter details manually\")", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 8, + "linkCount": 2 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (managed setup)" + ] + }, + { + "slug": "calendly", + "stateCount": 3, + "states": [ + { + "label": "initial — Select Connection Type", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [], + "fieldCount": 0, + "linkCount": 0 + }, + { + "label": "OAuth 2.0 selected", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [], + "fieldCount": 6, + "linkCount": 0 + }, + { + "label": "API Key selected", + "transport": "mcp_remote", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 6, + "linkCount": 0 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial — Select Connection Type" + ] + }, + { + "slug": "candid", + "stateCount": 2, + "states": [ + { + "label": "initial (managed setup)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 6, + "linkCount": 2 + }, + { + "label": "manual (after \"enter details manually\")", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 8, + "linkCount": 2 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (managed setup)" + ] + }, + { + "slug": "canva", + "stateCount": 1, + "states": [ + { + "label": "initial (OAuth form, only state)", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [], + "fieldCount": 6, + "linkCount": 0 + } + ], + "ambiguities": [] + }, + { + "slug": "circleci", + "stateCount": 1, + "states": [ + { + "label": "initial (API Key form, only state)", + "transport": "rest_api", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 6, + "linkCount": 0 + } + ], + "ambiguities": [] + }, + { + "slug": "clerk", + "stateCount": 1, + "states": [ + { + "label": "initial (API Key form, only state)", + "transport": "rest_api", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 6, + "linkCount": 0 + } + ], + "ambiguities": [] + }, + { + "slug": "clickhouse", + "stateCount": 2, + "states": [ + { + "label": "initial (managed setup)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 6, + "linkCount": 2 + }, + { + "label": "manual (after \"enter details manually\")", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 8, + "linkCount": 2 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (managed setup)" + ] + }, + { + "slug": "clickup", + "stateCount": 3, + "states": [ + { + "label": "initial — Select Connection Type", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [], + "fieldCount": 0, + "linkCount": 0 + }, + { + "label": "OAuth 2.0 selected", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [], + "fieldCount": 6, + "linkCount": 0 + }, + { + "label": "API Key selected", + "transport": "mcp_remote", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 6, + "linkCount": 0 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial — Select Connection Type" + ] + }, + { + "slug": "cloudflare", + "stateCount": 2, + "states": [ + { + "label": "initial (managed setup)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 6, + "linkCount": 2 + }, + { + "label": "manual (after \"enter details manually\")", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 8, + "linkCount": 2 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (managed setup)" + ] + }, + { + "slug": "cloudinary", + "stateCount": 2, + "states": [ + { + "label": "initial (managed setup)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 6, + "linkCount": 2 + }, + { + "label": "manual (after \"enter details manually\")", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 8, + "linkCount": 2 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (managed setup)" + ] + }, + { + "slug": "coda", + "stateCount": 2, + "states": [ + { + "label": "initial (managed setup)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 6, + "linkCount": 2 + }, + { + "label": "manual (after \"enter details manually\")", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 8, + "linkCount": 2 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (managed setup)" + ] + }, + { + "slug": "cohere", + "stateCount": 1, + "states": [ + { + "label": "initial (API Key form, only state)", + "transport": "rest_api", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 6, + "linkCount": 0 + } + ], + "ambiguities": [] + }, + { + "slug": "contentful", + "stateCount": 1, + "states": [ + { + "label": "initial (API Key form, only state)", + "transport": "rest_api", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 6, + "linkCount": 0 + } + ], + "ambiguities": [] + }, + { + "slug": "convex", + "stateCount": 1, + "states": [ + { + "label": "initial (OAuth form, only state)", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [], + "fieldCount": 6, + "linkCount": 0 + } + ], + "ambiguities": [] + }, + { + "slug": "crowdin", + "stateCount": 3, + "states": [ + { + "label": "initial — Select Connection Type", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [], + "fieldCount": 0, + "linkCount": 0 + }, + { + "label": "OAuth 2.0 selected", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [], + "fieldCount": 6, + "linkCount": 0 + }, + { + "label": "API Key selected", + "transport": "mcp_remote", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 6, + "linkCount": 0 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial — Select Connection Type" + ] + }, + { + "slug": "deepgram", + "stateCount": 1, + "states": [ + { + "label": "initial (API Key form, only state)", + "transport": "rest_api", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 6, + "linkCount": 0 + } + ], + "ambiguities": [] + }, + { + "slug": "deepseek", + "stateCount": 1, + "states": [ + { + "label": "initial (API Key form, only state)", + "transport": "rest_api", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 6, + "linkCount": 0 + } + ], + "ambiguities": [] + }, + { + "slug": "discord", + "stateCount": 1, + "states": [ + { + "label": "initial — Step 2 Configure (single state)", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [], + "fieldCount": 6, + "linkCount": 5 + } + ], + "ambiguities": [] + }, + { + "slug": "dovetail", + "stateCount": 1, + "states": [ + { + "label": "initial — Step 2 Configure (API Key; only state)", + "transport": "mcp_remote", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 6, + "linkCount": 4 + } + ], + "ambiguities": [] + }, + { + "slug": "dropbox", + "stateCount": 1, + "states": [ + { + "label": "initial (OAuth form, only state)", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [], + "fieldCount": 6, + "linkCount": 0 + } + ], + "ambiguities": [] + }, + { + "slug": "egnyte", + "stateCount": 2, + "states": [ + { + "label": "initial (managed setup)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 6, + "linkCount": 2 + }, + { + "label": "manual (after \"enter details manually\")", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 8, + "linkCount": 2 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (managed setup)" + ] + }, + { + "slug": "elevenlabs", + "stateCount": 1, + "states": [ + { + "label": "initial (API Key form, only state)", + "transport": "rest_api", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 6, + "linkCount": 0 + } + ], + "ambiguities": [] + }, + { + "slug": "embat", + "stateCount": 2, + "states": [ + { + "label": "initial (managed setup)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 6, + "linkCount": 2 + }, + { + "label": "manual (after \"enter details manually\")", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 8, + "linkCount": 2 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (managed setup)" + ] + }, + { + "slug": "figma", + "stateCount": 1, + "states": [ + { + "label": "initial — Step 2 Configure (OAuth, customer-owned credentials; only state)", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [], + "fieldCount": 7, + "linkCount": 2 + } + ], + "ambiguities": [] + }, + { + "slug": "firecrawl", + "stateCount": 1, + "states": [ + { + "label": "initial (API Key form, only state)", + "transport": "rest_api", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 6, + "linkCount": 0 + } + ], + "ambiguities": [] + }, + { + "slug": "g2", + "stateCount": 1, + "states": [ + { + "label": "initial (manual/BYO only — no managed setup offered)", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "platform_shared", + "customer" + ], + "fieldCount": 8, + "linkCount": 5 + } + ], + "ambiguities": [] + }, + { + "slug": "github", + "stateCount": 2, + "states": [ + { + "label": "Step 2 Configure — tab: Managed (default)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 3, + "linkCount": 2 + }, + { + "label": "Step 2 Configure — tab: Your own credentials", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 10, + "linkCount": 2 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: Step 2 Configure — tab: Managed (default)" + ] + }, + { + "slug": "gitlab", + "stateCount": 1, + "states": [ + { + "label": "initial (API Key form, only state)", + "transport": "rest_api", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 6, + "linkCount": 0 + } + ], + "ambiguities": [] + }, + { + "slug": "google-gemini", + "stateCount": 1, + "states": [ + { + "label": "initial (API Key form, only state)", + "transport": "rest_api", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 6, + "linkCount": 0 + } + ], + "ambiguities": [] + }, + { + "slug": "google", + "stateCount": 1, + "states": [ + { + "label": "initial (OAuth form, only state)", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [], + "fieldCount": 6, + "linkCount": 0 + } + ], + "ambiguities": [] + }, + { + "slug": "hubspot", + "stateCount": 1, + "states": [ + { + "label": "initial (OAuth form, only state)", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [], + "fieldCount": 6, + "linkCount": 0 + } + ], + "ambiguities": [] + }, + { + "slug": "hugging-face", + "stateCount": 2, + "states": [ + { + "label": "initial (managed setup)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 6, + "linkCount": 2 + }, + { + "label": "manual (after \"enter details manually\")", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 8, + "linkCount": 2 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (managed setup)" + ] + }, + { + "slug": "intercom", + "stateCount": 1, + "states": [ + { + "label": "initial (OAuth form, only state)", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [], + "fieldCount": 6, + "linkCount": 0 + } + ], + "ambiguities": [] + }, + { + "slug": "jira", + "stateCount": 4, + "states": [ + { + "label": "initial — Step 2 Details (radio MCP | API, MCP default)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [], + "fieldCount": 3, + "linkCount": 0 + }, + { + "label": "Step 3 Configure — path: MCP — tab: Managed (default)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 6, + "linkCount": 2 + }, + { + "label": "Step 3 Configure — path: MCP — tab: Your own credentials", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 8, + "linkCount": 2 + }, + { + "label": "Step 3 Configure — path: API — auth: OAuth 2.0 (only auth option)", + "transport": "rest_api", + "auth": "oauth", + "ownershipModes": [], + "fieldCount": 6, + "linkCount": 6 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial — Step 2 Details (radio MCP | API, MCP default)", + "Auth is not explicit in capture state: Step 3 Configure — path: MCP — tab: Managed (default)" + ] + }, + { + "slug": "kernel", + "stateCount": 4, + "states": [ + { + "label": "initial — Step 2 Details (radio MCP | API, MCP default)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [], + "fieldCount": 3, + "linkCount": 0 + }, + { + "label": "Step 3 Configure — path: MCP — tab: Managed (default)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 6, + "linkCount": 2 + }, + { + "label": "Step 3 Configure — path: MCP — tab: Your own credentials", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 8, + "linkCount": 2 + }, + { + "label": "Step 3 Configure — path: API — auth: API Key (only auth option; captured in a fresh dialog, name fuchsia-ribbon)", + "transport": "rest_api", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 9, + "linkCount": 4 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial — Step 2 Details (radio MCP | API, MCP default)", + "Auth is not explicit in capture state: Step 3 Configure — path: MCP — tab: Managed (default)" + ] + }, + { + "slug": "linear", + "stateCount": 2, + "states": [ + { + "label": "Step 2 Configure — tab: Managed (default)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 2, + "linkCount": 2 + }, + { + "label": "Step 2 Configure — tab: Your own credentials", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 7, + "linkCount": 2 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: Step 2 Configure — tab: Managed (default)" + ] + }, + { + "slug": "linkedin", + "stateCount": 1, + "states": [ + { + "label": "initial (OAuth configure — only state; no connection-type chooser)", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [], + "fieldCount": 6, + "linkCount": 5 + } + ], + "ambiguities": [] + }, + { + "slug": "local-falcon", + "stateCount": 2, + "states": [ + { + "label": "initial (managed setup)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 5, + "linkCount": 2 + }, + { + "label": "manual (after \"enter details manually\")", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 7, + "linkCount": 2 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (managed setup)" + ] + }, + { + "slug": "mailgun", + "stateCount": 1, + "states": [ + { + "label": "initial (API Key configure — only state)", + "transport": "mcp_remote", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 6, + "linkCount": 2 + } + ], + "ambiguities": [] + }, + { + "slug": "make", + "stateCount": 2, + "states": [ + { + "label": "initial (managed setup)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 5, + "linkCount": 2 + }, + { + "label": "manual (after \"enter details manually\")", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 7, + "linkCount": 2 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (managed setup)" + ] + }, + { + "slug": "manufact", + "stateCount": 2, + "states": [ + { + "label": "initial (managed setup)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 6, + "linkCount": 2 + }, + { + "label": "manual (after \"enter details manually\")", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 8, + "linkCount": 2 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (managed setup)" + ] + }, + { + "slug": "mem0", + "stateCount": 2, + "states": [ + { + "label": "initial (managed setup)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 6, + "linkCount": 2 + }, + { + "label": "manual (after \"enter details manually\")", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 8, + "linkCount": 2 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (managed setup)" + ] + }, + { + "slug": "miro", + "stateCount": 2, + "states": [ + { + "label": "initial (managed setup)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 5, + "linkCount": 2 + }, + { + "label": "manual (after \"enter details manually\")", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 7, + "linkCount": 2 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (managed setup)" + ] + }, + { + "slug": "mixpanel", + "stateCount": 2, + "states": [ + { + "label": "initial (managed setup, step 2 \"Configure\")", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 5, + "linkCount": 0 + }, + { + "label": "manual (after clicking \"enter details manually\")", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 7, + "linkCount": 0 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (managed setup, step 2 \"Configure\")" + ] + }, + { + "slug": "monday", + "stateCount": 3, + "states": [ + { + "label": "initial (Select Connection Type)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [], + "fieldCount": 0, + "linkCount": 0 + }, + { + "label": "OAuth 2.0 selected", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [], + "fieldCount": 6, + "linkCount": 4 + }, + { + "label": "API Key selected", + "transport": "mcp_remote", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 6, + "linkCount": 4 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (Select Connection Type)" + ] + }, + { + "slug": "neon", + "stateCount": 1, + "states": [ + { + "label": "initial (API Key configure — only state)", + "transport": "mcp_remote", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 6, + "linkCount": 4 + } + ], + "ambiguities": [] + }, + { + "slug": "netlify", + "stateCount": 2, + "states": [ + { + "label": "initial (managed setup, step 2 \"Configure\")", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 6, + "linkCount": 0 + }, + { + "label": "manual (after clicking \"enter details manually\")", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 8, + "linkCount": 0 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (managed setup, step 2 \"Configure\")" + ] + }, + { + "slug": "ngrok", + "stateCount": 1, + "states": [ + { + "label": "initial (API Key configure — only state)", + "transport": "mcp_remote", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 6, + "linkCount": 4 + } + ], + "ambiguities": [] + }, + { + "slug": "notion", + "stateCount": 5, + "states": [ + { + "label": "initial — Step 2 Details (radio MCP | API, MCP default)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [], + "fieldCount": 3, + "linkCount": 0 + }, + { + "label": "Step 3 Configure — path: MCP — tab: Managed (default)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 6, + "linkCount": 2 + }, + { + "label": "Step 3 Configure — path: MCP — tab: Your own credentials", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 8, + "linkCount": 2 + }, + { + "label": "Step 3 Configure — path: API — auth: OAuth 2.0 (default)", + "transport": "rest_api", + "auth": "oauth", + "ownershipModes": [], + "fieldCount": 7, + "linkCount": 5 + }, + { + "label": "Step 3 Configure — path: API — auth: API Key", + "transport": "rest_api", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 10, + "linkCount": 4 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial — Step 2 Details (radio MCP | API, MCP default)", + "Auth is not explicit in capture state: Step 3 Configure — path: MCP — tab: Managed (default)" + ] + }, + { + "slug": "oauth-generic", + "stateCount": 2, + "states": [ + { + "label": "initial — Step 2 Configure (managed/auto-discover view)", + "transport": "rest_api", + "auth": "oauth", + "ownershipModes": [ + "platform_shared", + "dcr" + ], + "fieldCount": 1, + "linkCount": 2 + }, + { + "label": "Step 2 Configure — \"enter details manually\" view, Advanced expanded", + "transport": "rest_api", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 10, + "linkCount": 2 + } + ], + "ambiguities": [] + }, + { + "slug": "okta", + "stateCount": 1, + "states": [ + { + "label": "initial — Step 2 Configure (single state, both connection-type cards inline)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [], + "fieldCount": 3, + "linkCount": 0 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial — Step 2 Configure (single state, both connection-type cards inline)" + ] + }, + { + "slug": "openai", + "stateCount": 1, + "states": [ + { + "label": "initial (API Key configure — only state)", + "transport": "mcp_remote", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 6, + "linkCount": 4 + } + ], + "ambiguities": [] + }, + { + "slug": "openrouter", + "stateCount": 1, + "states": [ + { + "label": "initial (API Key configure — only state)", + "transport": "mcp_remote", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 6, + "linkCount": 4 + } + ], + "ambiguities": [] + }, + { + "slug": "oreilly", + "stateCount": 2, + "states": [ + { + "label": "initial (managed setup, step 2 \"Configure\")", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 6, + "linkCount": 0 + }, + { + "label": "manual (after clicking \"enter details manually\")", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 8, + "linkCount": 0 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (managed setup, step 2 \"Configure\")" + ] + }, + { + "slug": "pagerduty", + "stateCount": 1, + "states": [ + { + "label": "initial (opens directly in manual OAuth-app mode; no managed option)", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "platform_shared", + "customer" + ], + "fieldCount": 8, + "linkCount": 0 + } + ], + "ambiguities": [] + }, + { + "slug": "perplexity", + "stateCount": 1, + "states": [ + { + "label": "initial (API Key configure — only state)", + "transport": "mcp_remote", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 6, + "linkCount": 4 + } + ], + "ambiguities": [] + }, + { + "slug": "pinecone", + "stateCount": 1, + "states": [ + { + "label": "initial (API Key configure — only state)", + "transport": "mcp_remote", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 6, + "linkCount": 4 + } + ], + "ambiguities": [] + }, + { + "slug": "planetscale", + "stateCount": 2, + "states": [ + { + "label": "initial (managed setup, step 2 \"Configure\")", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 5, + "linkCount": 0 + }, + { + "label": "manual (after clicking \"enter details manually\")", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 7, + "linkCount": 0 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (managed setup, step 2 \"Configure\")" + ] + }, + { + "slug": "posthog", + "stateCount": 2, + "states": [ + { + "label": "initial (managed setup, step 2 \"Configure\")", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 6, + "linkCount": 0 + }, + { + "label": "manual (after clicking \"enter details manually\")", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 8, + "linkCount": 0 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (managed setup, step 2 \"Configure\")" + ] + }, + { + "slug": "postman", + "stateCount": 2, + "states": [ + { + "label": "initial (managed setup, step 2 \"Configure\")", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 6, + "linkCount": 0 + }, + { + "label": "manual (after clicking \"enter details manually\")", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 8, + "linkCount": 0 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (managed setup, step 2 \"Configure\")" + ] + }, + { + "slug": "railway", + "stateCount": 1, + "states": [ + { + "label": "initial (API Key configure — only state)", + "transport": "mcp_remote", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 6, + "linkCount": 4 + } + ], + "ambiguities": [] + }, + { + "slug": "razorpay", + "stateCount": 2, + "states": [ + { + "label": "initial (managed setup, step 2 \"Configure\")", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 6, + "linkCount": 0 + }, + { + "label": "manual (after clicking \"enter details manually\")", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 8, + "linkCount": 0 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (managed setup, step 2 \"Configure\")" + ] + }, + { + "slug": "render", + "stateCount": 1, + "states": [ + { + "label": "initial (API Key configure — only state)", + "transport": "mcp_remote", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 6, + "linkCount": 4 + } + ], + "ambiguities": [] + }, + { + "slug": "replicate", + "stateCount": 1, + "states": [ + { + "label": "initial (API Key configure — only state)", + "transport": "mcp_remote", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 6, + "linkCount": 4 + } + ], + "ambiguities": [] + }, + { + "slug": "resend", + "stateCount": 6, + "states": [ + { + "label": "initial — Step 2 Details (radio MCP | API, MCP default)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [], + "fieldCount": 3, + "linkCount": 0 + }, + { + "label": "Step 3 Configure — path: MCP — tab: Managed (default)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 7, + "linkCount": 2 + }, + { + "label": "Step 3 Configure — path: MCP — tab: Your own credentials", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 9, + "linkCount": 4 + }, + { + "label": "Step 3 Configure — path: API — auth: OAuth 2.0 (default, auto-registered client)", + "transport": "rest_api", + "auth": "oauth", + "ownershipModes": [], + "fieldCount": 6, + "linkCount": 2 + }, + { + "label": "Step 3 Configure — path: API — auth: OAuth 2.0 — after \"enter details manually\"", + "transport": "rest_api", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 8, + "linkCount": 4 + }, + { + "label": "Step 3 Configure — path: API — auth: API Key", + "transport": "rest_api", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 10, + "linkCount": 4 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial — Step 2 Details (radio MCP | API, MCP default)", + "Auth is not explicit in capture state: Step 3 Configure — path: MCP — tab: Managed (default)" + ] + }, + { + "slug": "salesforce", + "stateCount": 3, + "states": [ + { + "label": "initial — Step 2 Configure (managed package install view)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 0, + "linkCount": 2 + }, + { + "label": "Step 2 Configure — managed view after clicking \"change\" (domain editor)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 1, + "linkCount": 2 + }, + { + "label": "Step 2 Configure — \"enter details manually\" view", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "customer" + ], + "fieldCount": 1, + "linkCount": 0 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial — Step 2 Configure (managed package install view)", + "Auth is not explicit in capture state: Step 2 Configure — managed view after clicking \"change\" (domain editor)", + "Auth is not explicit in capture state: Step 2 Configure — \"enter details manually\" view" + ] + }, + { + "slug": "sanity", + "stateCount": 5, + "states": [ + { + "label": "initial — Step 2 Details (radio MCP | API, MCP default)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [], + "fieldCount": 3, + "linkCount": 0 + }, + { + "label": "Step 3 Configure — path: MCP — tab: Managed (default)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 6, + "linkCount": 2 + }, + { + "label": "Step 3 Configure — path: MCP — tab: Your own credentials", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 8, + "linkCount": 2 + }, + { + "label": "Step 3 Configure — path: API — auth: OAuth 2.0 (default)", + "transport": "rest_api", + "auth": "oauth", + "ownershipModes": [], + "fieldCount": 7, + "linkCount": 5 + }, + { + "label": "Step 3 Configure — path: API — auth: API Key", + "transport": "rest_api", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 10, + "linkCount": 4 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial — Step 2 Details (radio MCP | API, MCP default)", + "Auth is not explicit in capture state: Step 3 Configure — path: MCP — tab: Managed (default)" + ] + }, + { + "slug": "segment", + "stateCount": 1, + "states": [ + { + "label": "initial (API Key configure — only state)", + "transport": "mcp_remote", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 6, + "linkCount": 4 + } + ], + "ambiguities": [] + }, + { + "slug": "sendgrid", + "stateCount": 1, + "states": [ + { + "label": "initial (API Key configure — only state)", + "transport": "mcp_remote", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 6, + "linkCount": 4 + } + ], + "ambiguities": [] + }, + { + "slug": "sentry", + "stateCount": 2, + "states": [ + { + "label": "initial (managed setup, step 2 \"Configure\")", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 6, + "linkCount": 0 + }, + { + "label": "manual (after clicking \"enter details manually\")", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 8, + "linkCount": 0 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (managed setup, step 2 \"Configure\")" + ] + }, + { + "slug": "shopify", + "stateCount": 1, + "states": [ + { + "label": "initial — Step 2 Configure — Select Connection Type (OAuth 2.0 only; only state)", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [], + "fieldCount": 1, + "linkCount": 0 + } + ], + "ambiguities": [] + }, + { + "slug": "similarweb", + "stateCount": 2, + "states": [ + { + "label": "initial (managed setup, step 2 \"Configure\")", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 6, + "linkCount": 0 + }, + { + "label": "manual (after clicking \"enter details manually\")", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 8, + "linkCount": 0 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (managed setup, step 2 \"Configure\")" + ] + }, + { + "slug": "slack", + "stateCount": 2, + "states": [ + { + "label": "Step 2 Configure — tab: Managed (default)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 2, + "linkCount": 2 + }, + { + "label": "Step 2 Configure — tab: Your own credentials", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 9, + "linkCount": 2 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: Step 2 Configure — tab: Managed (default)" + ] + }, + { + "slug": "snowflake", + "stateCount": 3, + "states": [ + { + "label": "initial — Step 2 Configure — strategy selection", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [], + "fieldCount": 0, + "linkCount": 0 + }, + { + "label": "Step 2 Configure — strategy: OAuth (Using Snowflake Partner Connect)", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [], + "fieldCount": 4, + "linkCount": 2 + }, + { + "label": "Step 2 Configure — strategy: Workload Identity Federation", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [], + "fieldCount": 1, + "linkCount": 2 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial — Step 2 Configure — strategy selection", + "Auth is not explicit in capture state: Step 2 Configure — strategy: Workload Identity Federation" + ] + }, + { + "slug": "spotify", + "stateCount": 1, + "states": [ + { + "label": "initial (OAuth configure — only state)", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [], + "fieldCount": 6, + "linkCount": 5 + } + ], + "ambiguities": [] + }, + { + "slug": "stripe", + "stateCount": 2, + "states": [ + { + "label": "initial (managed setup, step 2 \"Configure\")", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 6, + "linkCount": 0 + }, + { + "label": "manual (after clicking \"enter details manually\")", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 8, + "linkCount": 0 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (managed setup, step 2 \"Configure\")" + ] + }, + { + "slug": "supabase", + "stateCount": 2, + "states": [ + { + "label": "initial (managed setup, step 2 \"Configure\")", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 6, + "linkCount": 0 + }, + { + "label": "manual (after clicking \"enter details manually\")", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 8, + "linkCount": 0 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (managed setup, step 2 \"Configure\")" + ] + }, + { + "slug": "telegram-bot", + "stateCount": 1, + "states": [ + { + "label": "initial (API Key configure — only state)", + "transport": "mcp_remote", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 6, + "linkCount": 4 + } + ], + "ambiguities": [] + }, + { + "slug": "ticket-tailor", + "stateCount": 2, + "states": [ + { + "label": "initial (managed setup, step 2 \"Configure\")", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 6, + "linkCount": 0 + }, + { + "label": "manual (after clicking \"enter details manually\")", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 8, + "linkCount": 0 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (managed setup, step 2 \"Configure\")" + ] + }, + { + "slug": "ticktick", + "stateCount": 2, + "states": [ + { + "label": "initial (managed setup, step 2 \"Configure\")", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 5, + "linkCount": 0 + }, + { + "label": "manual (after clicking \"enter details manually\")", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 7, + "linkCount": 0 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (managed setup, step 2 \"Configure\")" + ] + }, + { + "slug": "todoist", + "stateCount": 2, + "states": [ + { + "label": "initial (managed setup, step 2 \"Configure\")", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 6, + "linkCount": 0 + }, + { + "label": "manual (after clicking \"enter details manually\")", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 8, + "linkCount": 0 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (managed setup, step 2 \"Configure\")" + ] + }, + { + "slug": "typeform", + "stateCount": 3, + "states": [ + { + "label": "initial (Select Connection Type)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [], + "fieldCount": 0, + "linkCount": 0 + }, + { + "label": "OAuth 2.0 selected", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [], + "fieldCount": 6, + "linkCount": 4 + }, + { + "label": "API Key selected", + "transport": "mcp_remote", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 6, + "linkCount": 4 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (Select Connection Type)" + ] + }, + { + "slug": "vercel", + "stateCount": 2, + "states": [ + { + "label": "initial — Step 2 Configure (MCP, auto-discovered details)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [], + "fieldCount": 6, + "linkCount": 2 + }, + { + "label": "Step 2 Configure — after clicking \"enter details manually\"", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 8, + "linkCount": 2 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial — Step 2 Configure (MCP, auto-discovered details)" + ] + }, + { + "slug": "webflow", + "stateCount": 5, + "states": [ + { + "label": "initial — Step 2 Details (radio MCP | API, MCP default)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [], + "fieldCount": 3, + "linkCount": 0 + }, + { + "label": "Step 3 Configure — path: MCP — tab: Managed (default)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 7, + "linkCount": 2 + }, + { + "label": "Step 3 Configure — path: MCP — tab: Your own credentials", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 9, + "linkCount": 4 + }, + { + "label": "Step 3 Configure — path: API — auth: OAuth 2.0 (default; captured in a fresh dialog, name red-anchor)", + "transport": "rest_api", + "auth": "oauth", + "ownershipModes": [], + "fieldCount": 7, + "linkCount": 5 + }, + { + "label": "Step 3 Configure — path: API — auth: API Key", + "transport": "rest_api", + "auth": "api_key", + "ownershipModes": [ + "customer" + ], + "fieldCount": 10, + "linkCount": 3 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial — Step 2 Details (radio MCP | API, MCP default)", + "Auth is not explicit in capture state: Step 3 Configure — path: MCP — tab: Managed (default)" + ] + }, + { + "slug": "wix", + "stateCount": 2, + "states": [ + { + "label": "initial (managed setup, step 2 \"Configure\")", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 6, + "linkCount": 0 + }, + { + "label": "manual (after clicking \"enter details manually\")", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 8, + "linkCount": 0 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (managed setup, step 2 \"Configure\")" + ] + }, + { + "slug": "workos", + "stateCount": 1, + "states": [ + { + "label": "initial — Step 2 Configure (single state)", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [], + "fieldCount": 1, + "linkCount": 0 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial — Step 2 Configure (single state)" + ] + }, + { + "slug": "xero", + "stateCount": 1, + "states": [ + { + "label": "initial (opens directly in manual OAuth-app mode; no managed option)", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "platform_shared", + "customer" + ], + "fieldCount": 8, + "linkCount": 0 + } + ], + "ambiguities": [] + }, + { + "slug": "zapier", + "stateCount": 2, + "states": [ + { + "label": "initial (managed setup, step 2 \"Configure\")", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 6, + "linkCount": 0 + }, + { + "label": "manual (after clicking \"enter details manually\")", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 8, + "linkCount": 0 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (managed setup, step 2 \"Configure\")" + ] + }, + { + "slug": "zeplin", + "stateCount": 1, + "states": [ + { + "label": "initial (OAuth configure — only state)", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [], + "fieldCount": 6, + "linkCount": 5 + } + ], + "ambiguities": [] + }, + { + "slug": "zomato", + "stateCount": 2, + "states": [ + { + "label": "initial (managed setup, step 2 \"Configure\")", + "transport": "mcp_remote", + "auth": null, + "ownershipModes": [ + "platform_shared" + ], + "fieldCount": 6, + "linkCount": 0 + }, + { + "label": "manual (after clicking \"enter details manually\")", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [ + "customer" + ], + "fieldCount": 8, + "linkCount": 0 + } + ], + "ambiguities": [ + "Auth is not explicit in capture state: initial (managed setup, step 2 \"Configure\")" + ] + }, + { + "slug": "zoom", + "stateCount": 1, + "states": [ + { + "label": "initial (OAuth configure — only state)", + "transport": "mcp_remote", + "auth": "oauth", + "ownershipModes": [], + "fieldCount": 6, + "linkCount": 5 + } + ], + "ambiguities": [] + } + ] +} diff --git a/scripts/ingest-app-definitions.mjs b/scripts/ingest-app-definitions.mjs index d99f3caca46..1fbde6dc6c0 100644 --- a/scripts/ingest-app-definitions.mjs +++ b/scripts/ingest-app-definitions.mjs @@ -4,7 +4,7 @@ const out=path.join(root,"packages/shared/src/app-definitions"); const favicon=d const field=(key,label,placeholder)=>({key,label,type:"password",required:true,placeholder,secret:true}); const method=(key,transport,auth,defaults,riskTier,guidanceMd,extra={})=>({key,transport,auth,ownershipModes:auth==="oauth"?["customer","dcr"]:["customer"],whenToUse:transport==="mcp_remote"?"Use the provider-hosted connection for the quickest setup.":"Use credentials from your provider account.",defaults,guidanceMd,riskTier,...extra}); const apps=[ -["zapier","Zapier","Reach thousands of apps through your Zapier account.","productivity","zapier.com",["https://mcp.zapier.com/*"],method("mcp-key","mcp_remote","api_key",{serverUrl:"https://mcp.zapier.com/api/mcp"},"S3","Create a Zapier MCP connection, then paste its token here.",{credentialFields:[field("authorization","Zapier token","Paste your Zapier token")],keyPlacement:{location:"header",name:"Authorization",prefix:"Bearer "}})], +["zapier","Zapier","Reach thousands of apps through your Zapier account.","productivity","zapier.com",["https://mcp.zapier.com/*"],method("mcp-key","mcp_remote","api_key",{serverUrl:"https://mcp.zapier.com/api/mcp"},"S3","Create a Zapier MCP connection, then paste its token here.",{credentialFields:[field("authorization","Zapier MCP token","Paste your Zapier token")],keyPlacement:{location:"header",name:"Authorization",prefix:"Bearer "}})], ["github","GitHub","Read code and pull requests, and coordinate repository work.","developer","github.com",["https://api.githubcopilot.com/mcp/*"],method("mcp-key","mcp_remote","api_key",{serverUrl:"https://api.githubcopilot.com/mcp/"},"S3","Create a fine-grained token limited to the repositories agents should use.",{credentialFields:[field("authorization","GitHub token","github_pat_...")],keyPlacement:{location:"header",name:"Authorization",prefix:"Bearer "},requiredResourceFilters:["organization","repository"]})], ["slack","Slack","Search channels and coordinate team communication.","communication","slack.com",["https://mcp.slack.com/*"],method("mcp-oauth","mcp_remote","oauth",{serverUrl:"https://mcp.slack.com/mcp",authorizationEndpoint:"https://slack.com/oauth/v2/authorize",tokenEndpoint:"https://slack.com/api/oauth.v2.access",scopesHint:["channels:read","chat:write","search:read"]},"S3","Connect a Slack workspace and limit access to the channels agents need.",{requiredResourceFilters:["workspace","channel"]})], ["notion","Notion","Read and update pages in your Notion workspace.","content","notion.so",["https://mcp.notion.com/*"],method("mcp-oauth","mcp_remote","oauth",{serverUrl:"https://mcp.notion.com/mcp",authorizationEndpoint:"https://api.notion.com/v1/oauth/authorize",tokenEndpoint:"https://api.notion.com/v1/oauth/token"},"S3","Connect Notion for workspace content. Share only the pages and databases agents should use.",{requiredResourceFilters:["workspace","page","database"]})], @@ -17,8 +17,48 @@ const apps=[ ["vercel","Vercel","Inspect projects, deployments, and runtime logs.","developer","vercel.com",["https://mcp.vercel.com/*"],method("mcp-oauth","mcp_remote","oauth",{serverUrl:"https://mcp.vercel.com/mcp"},"S3","Connect the Vercel team and projects agents should operate.",{requiredResourceFilters:["team","project","environment"]})], ["anthropic","Anthropic","Use Anthropic APIs with a restricted key.","ai","anthropic.com",["https://api.anthropic.com/*"],method("api-key","rest_api","api_key",{serviceHost:"api.anthropic.com"},"S3","Create a key in the Anthropic Console and rotate it if it has been exposed.",{credentialFields:[field("apiKey","API key","sk-ant-api03-...")],keyPlacement:{location:"header",name:"x-api-key"}})], ].map(([slug,name,description,category,domain,urlPatterns,m])=>({schemaVersion:1,slug,name,description,categories:[category],featured:["zapier","github","slack","notion","linear"].includes(slug),branding:{logoUrl:favicon(domain)},urlPatterns,methods:[m]})); -const captures=fs.readdirSync(corpus).filter(f=>f.endsWith(".md")&&f!=="INDEX.md"); if(captures.length!==99) throw new Error(`Expected 99 captures, found ${captures.length}`); +const parseTableRow=(line)=>line.slice(1,-1).split("|").map((cell)=>cell.trim()); +const parseCapture=(fileName)=>{ + const markdown=fs.readFileSync(path.join(corpus,fileName),"utf8"); + const stateMatches=[...markdown.matchAll(/^## State: (.+)$/gm)]; + if(stateMatches.length===0) throw new Error(`${fileName}: no captured states`); + return stateMatches.map((match,index)=>{ + const body=markdown.slice(match.index+match[0].length,stateMatches[index+1]?.index??markdown.length); + const inputsBlock=body.match(/### Inputs\n([\s\S]*?)(?=\n### |$)/)?.[1]??""; + const inputRows=inputsBlock.split("\n").filter((line)=>line.startsWith("|")).slice(2).map(parseTableRow); + const fields=inputRows.map(([label,tagType,required,placeholder,prefilledValue,checked])=>({label,tagType,required:required.toLowerCase()==="yes",placeholder:placeholder||null,prefilledValue:prefilledValue||null,checked:checked.toLowerCase()==="true"})); + const linksBlock=body.match(/### Links\n([\s\S]*?)(?=\n## |$)/)?.[1]??""; + const links=linksBlock.split("\n").map((line)=>line.match(/^(.+?) → (https?:\/\/\S+)$/)).filter(Boolean).map((link)=>({label:link[1].trim(),href:link[2]})); + return {label:match[1].trim(),fields,links}; + }); +}; +const inferState=(slug,state)=>{ + const label=state.label.toLowerCase(); + const fieldText=state.fields.map((field)=>field.label.toLowerCase()).join(" "); + const transport=slug==="oauth-generic"||slug==="api-key-generic"||label.includes("path: api")||label.includes("api key form")?"rest_api":"mcp_remote"; + const auth=slug==="oauth-generic"||label.includes("oauth")||fieldText.includes("client id")?"oauth":slug==="api-key-generic"||label.includes("api key")||fieldText.includes("api key")?"api_key":null; + const ownershipModes=[]; + if(label.includes("managed")) ownershipModes.push("platform_shared"); + if(label.includes("your own credentials")||label.includes("manual")||label.includes("api key")) ownershipModes.push("customer"); + if(slug==="oauth-generic"&&!label.includes("manually")) ownershipModes.push("dcr"); + return {label:state.label,transport,auth,ownershipModes:[...new Set(ownershipModes)],fieldCount:state.fields.length,linkCount:state.links.length}; +}; +const validateApp=(app)=>{ + if(app.schemaVersion!==1||!app.slug||!app.name||!Array.isArray(app.methods)||app.methods.length===0) throw new Error(`${app.slug||"unknown"}: invalid AppDefinition`); + for(const connectionMethod of app.methods){ + if(connectionMethod.auth==="api_key"&&!connectionMethod.keyPlacement) throw new Error(`${app.slug}/${connectionMethod.key}: api_key requires keyPlacement`); + if(connectionMethod.auth==="oauth"&&connectionMethod.ownershipModes.length===0) throw new Error(`${app.slug}/${connectionMethod.key}: oauth requires ownershipModes`); + for(const connectionField of [...connectionMethod.tenantFields??[],...connectionMethod.extensionFields??[],...connectionMethod.credentialFields??[]]) if(connectionField.required&&connectionField.type!=="checkbox"&&!connectionField.placeholder) throw new Error(`${app.slug}/${connectionMethod.key}/${connectionField.key}: required field needs placeholder`); + } +}; +const captureFiles=fs.readdirSync(corpus).filter((fileName)=>fileName.endsWith(".md")&&fileName!=="INDEX.md").sort(); +if(captureFiles.length!==99) throw new Error(`Expected 99 captures, found ${captureFiles.length}`); +const parsedCaptures=Object.fromEntries(captureFiles.map((fileName)=>[path.basename(fileName,".md"),parseCapture(fileName)])); +const reviewReport={schemaVersion:1,corpusSize:captureFiles.length,providers:captureFiles.map((fileName)=>{const slug=path.basename(fileName,".md");const states=parsedCaptures[slug].map((state)=>inferState(slug,state));return {slug,stateCount:states.length,states,ambiguities:states.filter((state)=>!state.auth).map((state)=>`Auth is not explicit in capture state: ${state.label}`)};})}; +for(const app of apps){validateApp(app);if(parsedCaptures[app.slug]&&parsedCaptures[app.slug].length===0) throw new Error(`${app.slug}: capture has no states`);} fs.mkdirSync(out,{recursive:true}); for(const app of apps) fs.writeFileSync(path.join(out,`${app.slug}.json`),JSON.stringify(app,null,2)+"\n"); +fs.writeFileSync(path.join(root,"packages/shared/src/app-definitions.ingestion-report.json"),JSON.stringify(reviewReport,null,2)+"\n"); const imports=apps.map((a,i)=>`import a${i} from "./app-definitions/${a.slug}.json" with { type: "json" };`).join("\n"); fs.writeFileSync(path.join(root,"packages/shared/src/app-definitions.generated.ts"),`${imports}\nimport type { AppDefinition } from "./types/app-definition.js";\nexport const APP_DEFINITIONS=[${apps.map((_,i)=>`a${i}`).join(",")}] as AppDefinition[];\n`); -console.log(`Parsed ${captures.length} captures; emitted ${apps.length} Wave 1 definitions.`); +const ambiguityCount=reviewReport.providers.reduce((total,provider)=>total+provider.ambiguities.length,0); +console.log(`Parsed ${captureFiles.length} captures and ${reviewReport.providers.reduce((total,provider)=>total+provider.stateCount,0)} states; emitted ${apps.length} Wave 1 definitions and flagged ${ambiguityCount} states for review.`);