From e4fb007d1cd5af6c59e62d53c66a899843686090 Mon Sep 17 00:00:00 2001 From: "staging-tembo[bot]" <217798655+staging-tembo[bot]@users.noreply.github.com> Date: Sat, 18 Jul 2026 20:27:49 +0000 Subject: [PATCH 1/3] feat(connections): add 136 native MCP providers (catalog batch 3) --- CHANGELOG.md | 40 + api/src/native_oauth.rs | 154 ++++ docs/src/content/docs/connections.md | 6 +- web/src/lib/connection-categories.ts | 40 +- web/src/lib/docs-content.ts | 2 +- web/src/lib/mcp-providers.ts | 1158 ++++++++++++++++++++++++++ 6 files changed, 1376 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aeeb187..a0f272c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,46 @@ they are no longer release versions. Phase scope now lives in ## [Unreleased] +### Added +- **Native MCP catalog batch 3: 136 more providers.** Harvested from the + official MCP registry (54k entries swept), the claude.com/connectors + directory, and community remote-MCP lists; every endpoint live-probed + (MCP `initialize` → `/.well-known/oauth-protected-resource` → + auth-server metadata → `registration_endpoint`) on 2026-07-18: + - **TAS-managed DCR (123):** sales/GTM (Outreach, Salesloft, ZoomInfo, + Lusha, Hunter, Instantly, Crossbeam, Harmonic, Chili Piper, Day AI, + Clarify, Staircase AI), support/CX (Zendesk, Help Scout, Gorgias, Plain, + Lorikeet, Unthread, Enterpret, Dovetail, Missive), meetings (Otter.ai, + Grain, Krisp, Circleback, tl;dv), finance (Ramp, Brex, Mercury, + Expensify, Navan, Carta, Digits, GoCardless, Mercado Pago), market + intelligence (PitchBook, Morningstar, CB Insights, Quartr, Daloopa, + Consensus), HR/recruiting (Gusto, Deel, Ashby, Workable, Metaview, + Indeed, Udemy Business), compliance/e-sign (Vanta, Drata, SignNow), + productivity/design (Figma, Miro, Lucid, Productboard, Aha!, Shortcut, + Todoist, Teamwork, Calendly, Superhuman Mail, Craft, Mem, Gamma, Pitch, + Eraser, Jotform, Typeform, SurveyMonkey, Egnyte), marketing/content + (Mailchimp, Customer.io, Ahrefs, Semrush, Cloudinary, Contentful, + Sanity, Wix, WordPress.com, GitBook, Mintlify, DeepL), dev/infra + (GitLab, Supabase, Netlify, Heroku, Buildkite, Grafana, New Relic, + Honeycomb, incident.io, Rootly, BugSnag, LaunchDarkly, PlanetScale, + Prisma Postgres, InstantDB, Algolia, Statsig, Postman, Semgrep, WorkOS, + Stytch, Mux, Knock, Lovable, Retool, Telnyx, Jam, Globalping), data/AI + (Airbyte, MotherDuck, Monte Carlo, Atlan, Hugging Face), and + automation/web (Zapier, Make, IFTTT, Exa, Tavily, Firecrawl, Apify, + Bright Data). + - **Bring-your-own OAuth app (12):** DocuSign, Xero, Front, Smartsheet, + MongoDB Atlas, CircleCI, Chargebee, BigQuery (Google manual client, + like Gmail), Ironclad, Harvey, Tableau, Shopify. + - **API token (1):** Render (API key as Bearer, like GitHub). + - Agent Library categories now recognize the new providers, and the + long-tail **ATS / recruiting**, **HRIS**, **E-signature**, and + **Survey** categories flip to connectable. + - Not added (with reasons): per-tenant instance-scoped servers + (Salesforce, Snowflake, Databricks, ServiceNow, NetSuite, Glean, dbt, + Elastic…), OAuth `client_credentials`-only (Plaid), unauthenticated / + docs-only servers, and vendors with no hosted server (Workday, + Rippling, Okta, Snyk, Perplexity, Loom, Fivetran). + ## [v2026.7.2] — Native MCP catalog expansion, connection search, Zoom, inbox delete — shipped 2026-07-15 ### Added diff --git a/api/src/native_oauth.rs b/api/src/native_oauth.rs index e642677..4c18d4f 100644 --- a/api/src/native_oauth.rs +++ b/api/src/native_oauth.rs @@ -246,6 +246,160 @@ const NATIVE_MCP_OAUTH_ALLOWLIST: &[(&str, &[&str])] = &[ (PAGERDUTY_MCP_ORIGIN, PAGERDUTY_OAUTH_ORIGINS), (SLACK_MCP_ORIGIN, SLACK_OAUTH_ORIGINS), (ZOOM_MCP_ORIGIN, ZOOM_OAUTH_ORIGINS), + // ── Batch 2026-07 (#3): registry + connectors-directory sweep. Inline + // tuples (mcp origin → allowed OAuth origins) rather than named consts; + // kept in the same order as web/src/lib/mcp-providers.ts, which the + // allowlist-sync vitest guards against drift. Origins are the union of + // the advertised authorization server + authorize/token/registration + // endpoint origins from the 2026-07-18 probe. + // ── Sales / GTM ── + ("https://api.outreach.io", &["https://api.outreach.io"]), + ("https://mcp.salesloft.com", &["https://accounts.salesloft.com", "https://mcp.salesloft.com"]), + ("https://mcp.zoominfo.com", &["https://mcp.zoominfo.com", "https://okta-login.zoominfo.com"]), + ("https://mcp.lusha.com", &["https://auth.lusha.com"]), + ("https://mcp.hunter.io", &["https://hunter.io"]), + ("https://mcp.instantly.ai", &["https://api.instantly.ai"]), + ("https://mcp.crossbeam.com", &["https://mcp.crossbeam.com"]), + ("https://mcp.api.harmonic.ai", &["https://mcp.api.harmonic.ai"]), + ("https://fire.chilipiper.com", &["https://fire.chilipiper.com"]), + ("https://day.ai", &["https://day.ai"]), + ("https://api.clarify.ai", &["https://auth1.clarify.ai"]), + ("https://mcp.staircase.ai", &["https://mcp.staircase.ai"]), + // ── Support / CX ── + ("https://mcp.zendesk.com", &["https://mcp.zendesk.com"]), + ("https://mcp.helpscout.net", &["https://mcp.helpscout.net"]), + ("https://mcp.gorgias.com", &["https://mcp.gorgias.com"]), + ("https://mcp.plain.com", &["https://signin.auth.plain.com"]), + ("https://api.lorikeetcx.ai", &["https://api.lorikeetcx.ai", "https://app.lorikeetcx.ai"]), + ("https://app.unthread.io", &["https://app.unthread.io"]), + ("https://wisdom-api.enterpret.com", &["https://oauth.enterpret.com"]), + ("https://dovetail.com", &["https://auth.dovetail.com"]), + ("https://mcp.missiveapp.com", &["https://auth.missiveapp.com"]), + // ── Meeting intelligence ── + ("https://mcp.otter.ai", &["https://otter.ai"]), + ("https://api.grain.com", &["https://api.grain.com", "https://grain.com"]), + ("https://mcp.krisp.ai", &["https://api.krisp.ai", "https://mcp.krisp.ai"]), + ("https://app.circleback.ai", &["https://app.circleback.ai"]), + ("https://mcp.tldv.io", &["https://keycloak.tldv.io"]), + // ── Finance / spend / payments ── + ("https://mcp.ramp.com", &["https://api.ramp.com", "https://mcp.ramp.com"]), + ("https://api.brex.com", &["https://accounts-api.brex.com", "https://api.brex.com"]), + ("https://mcp.mercury.com", &["https://mcp.mercury.com"]), + ("https://mcp.expensify.com", &["https://www.expensify.com"]), + ("https://mcp.navan.com", &["https://login.navan.com"]), + ("https://mcp.app.carta.com", &["https://mcp.app.carta.com"]), + ("https://api.digits.com", &["https://api.digits.com"]), + ("https://mcp.gocardless.com", &["https://mcp.gocardless.com"]), + ("https://mcp.mercadopago.com", &["https://auth.mercadopago.com", "https://mcp.mercadopago.com"]), + // ── Financial & market intelligence ── + ("https://premium.mcp.pitchbook.com", &["https://premium.mcp.pitchbook.com"]), + ("https://mcp.morningstar.com", &["https://mcp.morningstar.com"]), + ("https://mcp.cbinsights.com", &["https://mcp.cbinsights.com"]), + ("https://mcp.quartr.com", &["https://mcp.quartr.com"]), + ("https://mcp.daloopa.com", &["https://mcp.daloopa.com"]), + ("https://mcp.consensus.app", &["https://consensus.app"]), + // ── HR / recruiting / learning ── + ("https://mcp.api.gusto.com", &["https://mcp.api.gusto.com"]), + ("https://api.letsdeel.com", &["https://api.letsdeel.com"]), + ("https://mcp.ashbyhq.com", &["https://mcp-auth.ashbyhq.com"]), + ("https://mcp.workable.com", &["https://mcp.workable.com", "https://workable.com"]), + ("https://mcp.metaview.ai", &["https://auth.metaview.ai"]), + ("https://mcp.indeed.com", &["https://apis.indeed.com", "https://secure.indeed.com"]), + ("https://api.udemy.com", &["https://api.udemy.com"]), + // ── Legal / compliance ── + ("https://mcp-server.signnow.com", &["https://mcp-server.signnow.com"]), + ("https://mcp.vanta.com", &["https://api.vanta.com", "https://app.vanta.com", "https://mcp.vanta.com"]), + ("https://mcp.drata.com", &["https://drata-prod.us.auth0.com", "https://mcp.drata.com"]), + // ── Productivity / PM / design ── + ("https://mcp.figma.com", &["https://api.figma.com", "https://www.figma.com"]), + ("https://mcp.miro.com", &["https://mcp.miro.com"]), + ("https://mcp.lucid.app", &["https://mcp.lucid.app"]), + ("https://mcp.productboard.com", &["https://mcp.productboard.com"]), + ("https://mcp.aha.io", &["https://mcp.aha.io"]), + ("https://mcp.shortcut.com", &["https://api.app.shortcut.com"]), + ("https://ai.todoist.net", &["https://todoist.com"]), + ("https://mcp.ai.teamwork.com", &["https://teamwork.com", "https://www.teamwork.com"]), + ("https://mcp.calendly.com", &["https://calendly.com"]), + ("https://mcp.mail.superhuman.com", &["https://mcp.auth.mail.superhuman.com"]), + ("https://mcp.craft.do", &["https://mcp.craft.do"]), + ("https://mcp.mem.ai", &["https://api.mem.ai", "https://mem.ai"]), + ("https://mcp.gamma.app", &["https://auth.gamma.app"]), + ("https://mcp.pitch.com", &["https://auth.pitch.com"]), + ("https://app.eraser.io", &["https://app.eraser.io"]), + ("https://mcp.jotform.com", &["https://oauth2.jotform.com"]), + ("https://api.typeform.com", &["https://admin.typeform.com", "https://api.typeform.com"]), + ("https://mcp.surveymonkey.com", &["https://mcp.surveymonkey.com"]), + ("https://mcp-server.egnyte.com", &["https://mcp-oauth.egnyte.com"]), + // ── Marketing / content / CMS ── + ("https://ai-inc.mailchimp.com", &["https://ai-inc.mailchimp.com"]), + ("https://mcp.customer.io", &["https://mcp.customer.io"]), + ("https://api.ahrefs.com", &["https://ahrefs.com", "https://api.ahrefs.com", "https://app.ahrefs.com"]), + ("https://mcp.semrush.com", &["https://api.semrush.com", "https://oauth.semrush.com"]), + ("https://asset-management.mcp.cloudinary.com", &["https://asset-management.mcp.cloudinary.com"]), + ("https://mcp.contentful.com", &["https://mcp.contentful.com"]), + ("https://mcp.sanity.io", &["https://mcp.sanity.io"]), + ("https://mcp.wix.com", &["https://mcp.wix.com"]), + ("https://public-api.wordpress.com", &["https://public-api.wordpress.com"]), + ("https://mcp.gitbook.com", &["https://oauth.gitbook.com"]), + ("https://mcp.mintlify.com", &["https://mcp.mintlify.com"]), + ("https://mcp.deepl.com", &["https://mcp.deepl.com"]), + // ── Dev / infra / observability ── + ("https://gitlab.com", &["https://gitlab.com"]), + ("https://mcp.supabase.com", &["https://api.supabase.com"]), + ("https://netlify-mcp.netlify.app", &["https://netlify-mcp.netlify.app"]), + ("https://mcp.heroku.com", &["https://mcp.heroku.com"]), + ("https://mcp.buildkite.com", &["https://mcp.buildkite.com"]), + ("https://mcp.grafana.com", &["https://mcp.grafana.com"]), + ("https://mcp.newrelic.com", &["https://login.newrelic.com", "https://mcp.newrelic.com"]), + ("https://mcp.honeycomb.io", &["https://ui.honeycomb.io"]), + ("https://mcp.incident.io", &["https://app.incident.io", "https://mcp.incident.io"]), + ("https://mcp.rootly.com", &["https://rootly.com"]), + ("https://bugsnag.mcp.smartbear.com", &["https://oauth.bugsnag.com"]), + ("https://mcp.launchdarkly.com", &["https://app.launchdarkly.com", "https://mcp.launchdarkly.com"]), + ("https://mcp.pscale.dev", &["https://app.planetscale.com", "https://auth.planetscale.com", "https://mcp.pscale.dev"]), + ("https://mcp.prisma.io", &["https://auth.prisma.io", "https://mcp.prisma.io"]), + ("https://mcp.instantdb.com", &["https://mcp.instantdb.com"]), + ("https://mcp.algolia.com", &["https://dashboard.algolia.com"]), + ("https://api.statsig.com", &["https://api.statsig.com"]), + ("https://mcp.postman.com", &["https://mcp.postman.com"]), + ("https://mcp.semgrep.ai", &["https://login.semgrep.dev"]), + ("https://mcp.workos.com", &["https://signin.workos.com"]), + ("https://mcp.stytch.dev", &["https://rustic-kilogram-6347.customers.stytch.com", "https://stytch.com"]), + ("https://mcp.mux.com", &["https://auth.mux.com"]), + ("https://mcp.knock.app", &["https://mcp.knock.app"]), + ("https://mcp.lovable.dev", &["https://lovable.dev"]), + ("https://mcp.retool.com", &["https://mcp.retool.com"]), + ("https://api.telnyx.com", &["https://api.telnyx.com"]), + ("https://mcp.jam.dev", &["https://api.jam.dev"]), + ("https://mcp.globalping.dev", &["https://mcp.globalping.dev"]), + // ── Data / AI ── + ("https://mcp.airbyte.ai", &["https://mcp.airbyte.ai"]), + ("https://api.motherduck.com", &["https://mcp-auth.motherduck.com"]), + ("https://integrations.getmontecarlo.com", &["https://auth.getmontecarlo.com"]), + ("https://mcp.atlan.com", &["https://mcp.atlan.com"]), + ("https://huggingface.co", &["https://huggingface.co"]), + // ── Automation / web data / search ── + ("https://mcp.zapier.com", &["https://mcp.zapier.com"]), + ("https://mcp.make.com", &["https://www.make.com"]), + ("https://ifttt.com", &["https://ifttt.com"]), + ("https://mcp.exa.ai", &["https://auth.exa.ai"]), + ("https://mcp.tavily.com", &["https://mcp.tavily.com"]), + ("https://mcp.firecrawl.dev", &["https://www.firecrawl.dev"]), + ("https://mcp.apify.com", &["https://console-backend.apify.com", "https://console.apify.com"]), + ("https://mcp.brightdata.com", &["https://brightdata.com"]), + // ── Bring-your-own OAuth app (no DCR) ── + ("https://mcp.docusign.com", &["https://account.docusign.com", "https://mcp.docusign.com"]), + ("https://mcp.xero.com", &["https://identity.xero.com", "https://login.xero.com"]), + ("https://mcp.frontapp.com", &["https://app.frontapp.com"]), + ("https://mcp.smartsheet.com", &["https://api.smartsheet.com", "https://app.smartsheet.com", "https://mcp.smartsheet.com"]), + ("https://mcp.mongodb.com", &["https://authorize.mongodb.com", "https://cloud.mongodb.com"]), + ("https://mcp.circleci.com", &["https://app.circleci.com", "https://circleci.com", "https://mcp.circleci.com"]), + ("https://mcp.chargebee.com", &["https://app.chargebee.com"]), + ("https://bigquery.googleapis.com", &["https://accounts.google.com", "https://oauth2.googleapis.com"]), + ("https://mcp.na1.ironcladapp.com", &["https://ironcladapp.com"]), + ("https://api.harvey.ai", &["https://api.harvey.ai", "https://harvey-ai.us.auth0.com"]), + ("https://mcp.tableau.com", &["https://sso.online.tableau.com"]), + ("https://setup.shopify.com", &["https://setup.shopify.com"]), ]; #[derive(Deserialize)] diff --git a/docs/src/content/docs/connections.md b/docs/src/content/docs/connections.md index 4f796f8..19b64fd 100644 --- a/docs/src/content/docs/connections.md +++ b/docs/src/content/docs/connections.md @@ -42,9 +42,9 @@ TAS ships native MCP support for these providers: | Provider | Auth | | --- | --- | -| Attio, Pylon, Fathom, Dialed, Linear, Amplemarket, Clay, Avoma, Metabase, Notion, Intercom, Atlassian (Jira), Asana, monday.com, Guru, Fireflies, Amplitude, Apollo, PostHog, Stripe, Vercel, Canva, ClickUp, Close, Sentry, Mixpanel, Granola, Dropbox, Webflow, Cloudflare, Neon, Cal.com, Klaviyo, PayPal, Square, Airtable, Railway, Resend, Hex, Pendo, Similarweb, Datadog, Common Room | **TAS-managed OAuth** — click **Connect**, authorize, done | -| GitHub, X | **API token** — paste a PAT (GitHub) or App-only Bearer (X) | -| HubSpot, Gmail, Slack, Gong, Box, PagerDuty, Zoom | **Bring-your-own OAuth app** — admin sets up once (below) | +| Attio, Pylon, Fathom, Dialed, Linear, Amplemarket, Clay, Avoma, Metabase, Notion, Intercom, Atlassian (Jira), Asana, monday.com, Guru, Fireflies, Amplitude, Apollo, PostHog, Stripe, Vercel, Canva, ClickUp, Close, Sentry, Mixpanel, Granola, Dropbox, Webflow, Cloudflare, Neon, Cal.com, Klaviyo, PayPal, Square, Airtable, Railway, Resend, Hex, Pendo, Similarweb, Datadog, Common Room, Outreach, Salesloft, ZoomInfo, Lusha, Hunter, Instantly, Crossbeam, Harmonic, Chili Piper, Day AI, Clarify, Staircase AI, Zendesk, Help Scout, Gorgias, Plain, Lorikeet, Unthread, Enterpret, Dovetail, Missive, Otter.ai, Grain, Krisp, Circleback, tl;dv, Ramp, Brex, Mercury, Expensify, Navan, Carta, Digits, GoCardless, Mercado Pago, PitchBook, Morningstar, CB Insights, Quartr, Daloopa, Consensus, Gusto, Deel, Ashby, Workable, Metaview, Indeed, Udemy Business, SignNow, Vanta, Drata, Figma, Miro, Lucid, Productboard, Aha!, Shortcut, Todoist, Teamwork, Calendly, Superhuman Mail, Craft, Mem, Gamma, Pitch, Eraser, Jotform, Typeform, SurveyMonkey, Egnyte, Mailchimp, Customer.io, Ahrefs, Semrush, Cloudinary, Contentful, Sanity, Wix, WordPress.com, GitBook, Mintlify, DeepL, GitLab, Supabase, Netlify, Heroku, Buildkite, Grafana, New Relic, Honeycomb, incident.io, Rootly, BugSnag, LaunchDarkly, PlanetScale, Prisma Postgres, InstantDB, Algolia, Statsig, Postman, Semgrep, WorkOS, Stytch, Mux, Knock, Lovable, Retool, Telnyx, Jam, Globalping, Airbyte, MotherDuck, Monte Carlo, Atlan, Hugging Face, Zapier, Make, IFTTT, Exa, Tavily, Firecrawl, Apify, Bright Data | **TAS-managed OAuth** — click **Connect**, authorize, done | +| GitHub, X, Render | **API token** — paste a PAT (GitHub), App-only Bearer (X), or API key (Render) | +| HubSpot, Gmail, Slack, Gong, Box, PagerDuty, Zoom, DocuSign, Xero, Front, Smartsheet, MongoDB Atlas, CircleCI, Chargebee, BigQuery, Ironclad, Harvey, Tableau, Shopify | **Bring-your-own OAuth app** — admin sets up once (below) | There's also a built-in **Tembo Agent Studio** native connection (TAS's own MCP server) that agents use to read/produce [Tasks Inbox](/agent-studio/tasks-inbox/) diff --git a/web/src/lib/connection-categories.ts b/web/src/lib/connection-categories.ts index d6478d8..74430e5 100644 --- a/web/src/lib/connection-categories.ts +++ b/web/src/lib/connection-categories.ts @@ -55,33 +55,33 @@ export type CategoryMeta = { // category with no realistic TAS connector is marked supported:false rather // than pretending it's available. export const CATEGORY_META: Record = { - crm: { label: "CRM", supported: true, slugs: ["attio", "hubspot", "salesforce", "pipedrive", "close", "copper"] }, - email: { label: "Email", supported: true, slugs: ["gmail", "outlook", "microsoftoutlook", "resend", "klaviyo"] }, - calendar: { label: "Calendar", supported: true, slugs: ["googlecalendar", "outlookcalendar", "cal"] }, + crm: { label: "CRM", supported: true, slugs: ["attio", "hubspot", "salesforce", "pipedrive", "close", "copper", "dayai", "clarify"] }, + email: { label: "Email", supported: true, slugs: ["gmail", "outlook", "microsoftoutlook", "resend", "klaviyo", "superhuman"] }, + calendar: { label: "Calendar", supported: true, slugs: ["googlecalendar", "outlookcalendar", "cal", "calendly"] }, notify: { label: "Slack", supported: true, slugs: ["slack", "microsoftteams", "pagerduty"] }, - helpdesk: { label: "Helpdesk", supported: true, slugs: ["pylon", "zendesk", "intercom", "freshdesk", "front", "helpscout"] }, - recorder: { label: "Call recorder", supported: true, slugs: ["avoma", "fathom", "gong", "fireflies", "granola", "zoom"] }, - accounting: { label: "Accounting", supported: true, slugs: ["quickbooks", "xero", "netsuite"] }, - payments: { label: "Payments", supported: true, slugs: ["stripe", "paypal", "square"] }, - analytics: { label: "Product analytics", supported: true, slugs: ["metabase", "amplitude", "mixpanel", "posthog", "googleanalytics", "pendo", "hex"] }, - warehouse: { label: "Data warehouse", supported: true, slugs: ["metabase", "snowflake", "bigquery"] }, - docs: { label: "Docs / knowledge", supported: true, slugs: ["notion", "guru", "googledocs", "googledrive", "confluence", "coda", "airtable", "canva"] }, - issues: { label: "Issue tracker", supported: true, slugs: ["linear", "jira", "atlassian", "github", "asana", "monday", "clickup"] }, - forms: { label: "Forms", supported: true, slugs: ["typeform", "googleforms", "jotform"] }, - enrichment: { label: "Enrichment", supported: true, slugs: ["clay", "amplemarket", "apollo"] }, - storage: { label: "File storage", supported: true, slugs: ["googledrive", "dropbox", "box"] }, + helpdesk: { label: "Helpdesk", supported: true, slugs: ["pylon", "zendesk", "intercom", "freshdesk", "front", "helpscout", "gorgias", "plain", "lorikeet", "unthread", "missive"] }, + recorder: { label: "Call recorder", supported: true, slugs: ["avoma", "fathom", "gong", "fireflies", "granola", "zoom", "otter", "grain", "krisp", "circleback", "tldv"] }, + accounting: { label: "Accounting", supported: true, slugs: ["quickbooks", "xero", "netsuite", "digits"] }, + payments: { label: "Payments", supported: true, slugs: ["stripe", "paypal", "square", "gocardless", "mercadopago", "chargebee"] }, + analytics: { label: "Product analytics", supported: true, slugs: ["metabase", "amplitude", "mixpanel", "posthog", "googleanalytics", "pendo", "hex", "statsig"] }, + warehouse: { label: "Data warehouse", supported: true, slugs: ["metabase", "snowflake", "bigquery", "motherduck"] }, + docs: { label: "Docs / knowledge", supported: true, slugs: ["notion", "guru", "googledocs", "googledrive", "confluence", "coda", "airtable", "canva", "gitbook", "craft", "mem", "sanity"] }, + issues: { label: "Issue tracker", supported: true, slugs: ["linear", "jira", "atlassian", "github", "asana", "monday", "clickup", "gitlab", "shortcut", "aha", "productboard", "teamwork", "todoist"] }, + forms: { label: "Forms", supported: true, slugs: ["typeform", "googleforms", "jotform", "surveymonkey"] }, + enrichment: { label: "Enrichment", supported: true, slugs: ["clay", "amplemarket", "apollo", "zoominfo", "lusha", "hunter", "harmonic"] }, + storage: { label: "File storage", supported: true, slugs: ["googledrive", "dropbox", "box", "egnyte"] }, + ats: { label: "ATS / recruiting", supported: true, slugs: ["ashby", "workable", "greenhouse", "lever", "metaview", "indeed"] }, + hris: { label: "HRIS", supported: true, slugs: ["gusto", "deel", "bamboohr", "rippling"] }, // Long-tail categories TAS doesn't have a first-class connector for yet. - ats: { label: "ATS / recruiting", supported: false, slugs: [] }, - hris: { label: "HRIS", supported: false, slugs: [] }, ims: { label: "Inventory", supported: false, slugs: [] }, // Platform / infra MCPs (Vercel, Railway, Cloudflare, Neon, Datadog, Sentry). - monitoring: { label: "Monitoring", supported: true, slugs: ["datadog", "sentry", "pagerduty"] }, + monitoring: { label: "Monitoring", supported: true, slugs: ["datadog", "sentry", "pagerduty", "grafana", "newrelic", "honeycomb", "incidentio", "rootly", "bugsnag"] }, itsm: { label: "ITSM", supported: false, slugs: [] }, identity: { label: "Identity / SSO", supported: false, slugs: [] }, ads: { label: "Ads", supported: true, slugs: ["klaviyo"] }, - seo: { label: "SEO / search", supported: true, slugs: ["similarweb", "ahrefs"] }, - esign: { label: "E-signature", supported: false, slugs: [] }, - survey: { label: "Survey", supported: false, slugs: [] }, + seo: { label: "SEO / search", supported: true, slugs: ["similarweb", "ahrefs", "semrush"] }, + esign: { label: "E-signature", supported: true, slugs: ["docusign", "signnow", "dropboxsign", "pandadoc"] }, + survey: { label: "Survey", supported: true, slugs: ["surveymonkey", "typeform", "jotform"] }, psa: { label: "PSA / time tracking", supported: false, slugs: [] }, // Built-ins: no user connection required. "tasks-inbox": { label: "Tasks Inbox", supported: true, builtin: true, slugs: ["tembo-agent-studio"] }, diff --git a/web/src/lib/docs-content.ts b/web/src/lib/docs-content.ts index 58aa741..0f2503a 100644 --- a/web/src/lib/docs-content.ts +++ b/web/src/lib/docs-content.ts @@ -47,7 +47,7 @@ export const DOCS: Record = { "connections": { "title": "Connections", "description": "Authorize external services so agents can act on them — Composio and Native MCP, authorized per user.", - "body": "**Connections** are how agents reach outside services — Slack, Gmail, Google\nSheets, Notion, Attio, GitHub, and ~1,000 more. An agent declares what it needs\nin its `connections:` field; each operator authorizes the accounts their runs\nact as.\n\n## Per-user authorization\n\nConnections are authorized **per user, per workspace**. Because a run executes as\na specific [acting user](/agent-studio/core-concepts/), it uses that user's\nauthorized accounts. A manual run uses yours; a scheduled run uses the\nautomation owner's; an event run uses the trigger owner's. If an agent needs a\nservice nobody has connected, the sidebar surfaces an **\"Action needed\"** prompt\nwith a **Connect** button.\n\n## Three substrates\n\n| Substrate | When to pick it |\n| -------------- | -------------------------------------------------------------------------------------------------------------- |\n| **Composio** | The default. ~1,000 services wrapped as REST tools. Lowercase slugs (`slack`, `googlesheets`). |\n| **Native MCP** | The provider has an official MCP server — richer, schema-aware tools, fewer round trips, and TAS-managed OAuth. |\n| **Secrets** | A plain **API key** for a service with no OAuth (e.g. Clay), read by [sidecar Python tools](/agent-studio/sidecar-python-tools/). |\n\nPrefer **Native MCP** when the provider is in TAS's native catalog (below): it\nuses the provider's official server with richer, schema-aware tools. Most native\nproviders use **TAS-managed OAuth** (just click **Connect**); a couple are\n**bring-your-own OAuth app**. Use **Composio** for anything not in the native\ncatalog.\n\n:::caution[Slugs differ between substrates]\nThe tool slugs for the same provider differ between Composio and Native MCP. If\nyou switch a connection's `source:`, update the agent's `tools:` list to match.\n:::\n\n### Native MCP catalog\n\nTAS ships native MCP support for these providers:\n\n| Provider | Auth |\n| --- | --- |\n| Attio, Pylon, Fathom, Dialed, Linear, Amplemarket, Clay, Avoma, Metabase, Notion, Intercom, Atlassian (Jira), Asana, monday.com, Guru, Fireflies, Amplitude, Apollo, PostHog, Stripe, Vercel, Canva, ClickUp, Close, Sentry, Mixpanel, Granola, Dropbox, Webflow, Cloudflare, Neon, Cal.com, Klaviyo, PayPal, Square, Airtable, Railway, Resend, Hex, Pendo, Similarweb, Datadog, Common Room | **TAS-managed OAuth** — click **Connect**, authorize, done |\n| GitHub, X | **API token** — paste a PAT (GitHub) or App-only Bearer (X) |\n| HubSpot, Gmail, Slack, Gong, Box, PagerDuty, Zoom | **Bring-your-own OAuth app** — admin sets up once (below) |\n\nThere's also a built-in **Tembo Agent Studio** native connection (TAS's own MCP\nserver) that agents use to read/produce [Tasks Inbox](/agent-studio/tasks-inbox/)\nitems and trigger other runs.\n\n:::note[Gmail is in Google's Developer Preview]\nThe Gmail MCP server (`gmailmcp.googleapis.com`) is gated behind the Google\nWorkspace Developer Preview Program — even with the OAuth app + scopes set up,\ntool calls are denied until your Workspace org is enrolled. Until then, connect\nGmail through **Composio** instead.\n:::\n\n### Bring-your-own OAuth app (Manage providers)\n\nA few native providers (HubSpot, Gmail) need a confidential OAuth app you create\nin *their* console — TAS can't self-register one. A **workspace admin** sets this\nup once, then everyone connects normally:\n\n1. **Connections → Manage providers** → find the provider's card.\n2. Create an OAuth app in the provider's console (the card links to its guide).\n Register the **redirect URI shown on the card** and grant the scopes it lists\n (e.g. Gmail needs the Gmail API + Gmail MCP API enabled and the\n `https://mail.google.com/` scope).\n3. Paste the app's **client ID + secret** into the card, then **enable** the\n provider with its toggle.\n4. Members can now **Connect** it from the normal connect flow.\n\nUntil an admin does this, a bring-your-own provider doesn't appear in the connect\nlist — it shows *\"needs an OAuth app first.\"*\n\n## Declaring connections on an agent\n\n```yaml\nconnections:\n - { type: slack, tools: [SLACK_SEND_MESSAGE] }\n - { type: attio, source: native-mcp, name: default, tools: [run-basic-report] }\n```\n\n- `type:` is the provider slug.\n- `source:` defaults to `composio`; set `native-mcp` for native providers.\n- `name:` is the connection slot (\"default\" unless you keep multiple accounts of\n the same provider, e.g. `work` vs `personal`).\n- `tools:` narrows what the agent can call (works on both substrates).\n\n## Authorizing and reconnecting\n\nAuthorize and manage connections under **Connections**. If a credential expires\nor is revoked, the connection is marked stale and runs that need it fail with a\nclear message — reconnect from the same page. See\n[Troubleshooting](/agent-studio/troubleshooting/).\n\n### Viewing another member's connections (admins)\n\nWorkspace admins see a **Viewing** dropdown at the top of the Connections page.\nSwitch it to inspect another member's authorized accounts. When viewing someone\nelse you can **Rename** and **Refresh** their connections; **Connect**,\n**Reconnect**, and **Disconnect** are hidden because OAuth must be performed by\nthat member themselves.\n\nUse this together with the [member detail view](/agent-studio/dashboard-and-runs/#member-detail-admins)\nwhen troubleshooting \"no active connection\" failures for automations or triggers\nthat run as a specific owner.\n\nFor doing deterministic I/O over a connection from Python, see\n[Sidecar Python tools](/agent-studio/sidecar-python-tools/).\n\n## Secrets (API keys)\n\nSome services — like Clay — authenticate with a plain **API key**, not OAuth.\nFor these, use a **Secret**: a free-form, **workspace-level** key an admin sets\nonce under **Connections → Secrets** and the whole workspace shares (unlike the\nper-user OAuth connections above). Secrets are read by an agent's\n[sidecar Python tools](/agent-studio/sidecar-python-tools/) via\n`tas_tools.secret(\"name\")` — they attach no tools and are invisible to the\nmodel.\n\n- **Add one** (admin): Connections → Secrets → name (e.g. `clay`) + value. It's\n encrypted at rest and shown masked.\n- **Use it** in a tool: `tas_tools.secret(\"clay\")` returns the value.\n- **Optionally declare it** on the agent so the studio prompts an admin to set a\n missing one:\n\n ```yaml\n connections:\n - { type: clay, source: secret }\n ```" + "body": "**Connections** are how agents reach outside services — Slack, Gmail, Google\nSheets, Notion, Attio, GitHub, and ~1,000 more. An agent declares what it needs\nin its `connections:` field; each operator authorizes the accounts their runs\nact as.\n\n## Per-user authorization\n\nConnections are authorized **per user, per workspace**. Because a run executes as\na specific [acting user](/agent-studio/core-concepts/), it uses that user's\nauthorized accounts. A manual run uses yours; a scheduled run uses the\nautomation owner's; an event run uses the trigger owner's. If an agent needs a\nservice nobody has connected, the sidebar surfaces an **\"Action needed\"** prompt\nwith a **Connect** button.\n\n## Three substrates\n\n| Substrate | When to pick it |\n| -------------- | -------------------------------------------------------------------------------------------------------------- |\n| **Composio** | The default. ~1,000 services wrapped as REST tools. Lowercase slugs (`slack`, `googlesheets`). |\n| **Native MCP** | The provider has an official MCP server — richer, schema-aware tools, fewer round trips, and TAS-managed OAuth. |\n| **Secrets** | A plain **API key** for a service with no OAuth (e.g. Clay), read by [sidecar Python tools](/agent-studio/sidecar-python-tools/). |\n\nPrefer **Native MCP** when the provider is in TAS's native catalog (below): it\nuses the provider's official server with richer, schema-aware tools. Most native\nproviders use **TAS-managed OAuth** (just click **Connect**); a couple are\n**bring-your-own OAuth app**. Use **Composio** for anything not in the native\ncatalog.\n\n:::caution[Slugs differ between substrates]\nThe tool slugs for the same provider differ between Composio and Native MCP. If\nyou switch a connection's `source:`, update the agent's `tools:` list to match.\n:::\n\n### Native MCP catalog\n\nTAS ships native MCP support for these providers:\n\n| Provider | Auth |\n| --- | --- |\n| Attio, Pylon, Fathom, Dialed, Linear, Amplemarket, Clay, Avoma, Metabase, Notion, Intercom, Atlassian (Jira), Asana, monday.com, Guru, Fireflies, Amplitude, Apollo, PostHog, Stripe, Vercel, Canva, ClickUp, Close, Sentry, Mixpanel, Granola, Dropbox, Webflow, Cloudflare, Neon, Cal.com, Klaviyo, PayPal, Square, Airtable, Railway, Resend, Hex, Pendo, Similarweb, Datadog, Common Room, Outreach, Salesloft, ZoomInfo, Lusha, Hunter, Instantly, Crossbeam, Harmonic, Chili Piper, Day AI, Clarify, Staircase AI, Zendesk, Help Scout, Gorgias, Plain, Lorikeet, Unthread, Enterpret, Dovetail, Missive, Otter.ai, Grain, Krisp, Circleback, tl;dv, Ramp, Brex, Mercury, Expensify, Navan, Carta, Digits, GoCardless, Mercado Pago, PitchBook, Morningstar, CB Insights, Quartr, Daloopa, Consensus, Gusto, Deel, Ashby, Workable, Metaview, Indeed, Udemy Business, SignNow, Vanta, Drata, Figma, Miro, Lucid, Productboard, Aha!, Shortcut, Todoist, Teamwork, Calendly, Superhuman Mail, Craft, Mem, Gamma, Pitch, Eraser, Jotform, Typeform, SurveyMonkey, Egnyte, Mailchimp, Customer.io, Ahrefs, Semrush, Cloudinary, Contentful, Sanity, Wix, WordPress.com, GitBook, Mintlify, DeepL, GitLab, Supabase, Netlify, Heroku, Buildkite, Grafana, New Relic, Honeycomb, incident.io, Rootly, BugSnag, LaunchDarkly, PlanetScale, Prisma Postgres, InstantDB, Algolia, Statsig, Postman, Semgrep, WorkOS, Stytch, Mux, Knock, Lovable, Retool, Telnyx, Jam, Globalping, Airbyte, MotherDuck, Monte Carlo, Atlan, Hugging Face, Zapier, Make, IFTTT, Exa, Tavily, Firecrawl, Apify, Bright Data | **TAS-managed OAuth** — click **Connect**, authorize, done |\n| GitHub, X, Render | **API token** — paste a PAT (GitHub), App-only Bearer (X), or API key (Render) |\n| HubSpot, Gmail, Slack, Gong, Box, PagerDuty, Zoom, DocuSign, Xero, Front, Smartsheet, MongoDB Atlas, CircleCI, Chargebee, BigQuery, Ironclad, Harvey, Tableau, Shopify | **Bring-your-own OAuth app** — admin sets up once (below) |\n\nThere's also a built-in **Tembo Agent Studio** native connection (TAS's own MCP\nserver) that agents use to read/produce [Tasks Inbox](/agent-studio/tasks-inbox/)\nitems and trigger other runs.\n\n:::note[Gmail is in Google's Developer Preview]\nThe Gmail MCP server (`gmailmcp.googleapis.com`) is gated behind the Google\nWorkspace Developer Preview Program — even with the OAuth app + scopes set up,\ntool calls are denied until your Workspace org is enrolled. Until then, connect\nGmail through **Composio** instead.\n:::\n\n### Bring-your-own OAuth app (Manage providers)\n\nA few native providers (HubSpot, Gmail) need a confidential OAuth app you create\nin *their* console — TAS can't self-register one. A **workspace admin** sets this\nup once, then everyone connects normally:\n\n1. **Connections → Manage providers** → find the provider's card.\n2. Create an OAuth app in the provider's console (the card links to its guide).\n Register the **redirect URI shown on the card** and grant the scopes it lists\n (e.g. Gmail needs the Gmail API + Gmail MCP API enabled and the\n `https://mail.google.com/` scope).\n3. Paste the app's **client ID + secret** into the card, then **enable** the\n provider with its toggle.\n4. Members can now **Connect** it from the normal connect flow.\n\nUntil an admin does this, a bring-your-own provider doesn't appear in the connect\nlist — it shows *\"needs an OAuth app first.\"*\n\n## Declaring connections on an agent\n\n```yaml\nconnections:\n - { type: slack, tools: [SLACK_SEND_MESSAGE] }\n - { type: attio, source: native-mcp, name: default, tools: [run-basic-report] }\n```\n\n- `type:` is the provider slug.\n- `source:` defaults to `composio`; set `native-mcp` for native providers.\n- `name:` is the connection slot (\"default\" unless you keep multiple accounts of\n the same provider, e.g. `work` vs `personal`).\n- `tools:` narrows what the agent can call (works on both substrates).\n\n## Authorizing and reconnecting\n\nAuthorize and manage connections under **Connections**. If a credential expires\nor is revoked, the connection is marked stale and runs that need it fail with a\nclear message — reconnect from the same page. See\n[Troubleshooting](/agent-studio/troubleshooting/).\n\n### Viewing another member's connections (admins)\n\nWorkspace admins see a **Viewing** dropdown at the top of the Connections page.\nSwitch it to inspect another member's authorized accounts. When viewing someone\nelse you can **Rename** and **Refresh** their connections; **Connect**,\n**Reconnect**, and **Disconnect** are hidden because OAuth must be performed by\nthat member themselves.\n\nUse this together with the [member detail view](/agent-studio/dashboard-and-runs/#member-detail-admins)\nwhen troubleshooting \"no active connection\" failures for automations or triggers\nthat run as a specific owner.\n\nFor doing deterministic I/O over a connection from Python, see\n[Sidecar Python tools](/agent-studio/sidecar-python-tools/).\n\n## Secrets (API keys)\n\nSome services — like Clay — authenticate with a plain **API key**, not OAuth.\nFor these, use a **Secret**: a free-form, **workspace-level** key an admin sets\nonce under **Connections → Secrets** and the whole workspace shares (unlike the\nper-user OAuth connections above). Secrets are read by an agent's\n[sidecar Python tools](/agent-studio/sidecar-python-tools/) via\n`tas_tools.secret(\"name\")` — they attach no tools and are invisible to the\nmodel.\n\n- **Add one** (admin): Connections → Secrets → name (e.g. `clay`) + value. It's\n encrypted at rest and shown masked.\n- **Use it** in a tool: `tas_tools.secret(\"clay\")` returns the value.\n- **Optionally declare it** on the agent so the studio prompts an admin to set a\n missing one:\n\n ```yaml\n connections:\n - { type: clay, source: secret }\n ```" }, "core-concepts": { "title": "Core concepts", diff --git a/web/src/lib/mcp-providers.ts b/web/src/lib/mcp-providers.ts index 2d5a3cf..5511ae7 100644 --- a/web/src/lib/mcp-providers.ts +++ b/web/src/lib/mcp-providers.ts @@ -71,6 +71,146 @@ export type McpProviderSlug = | "pagerduty" | "slack" | "zoom" + // Batch 2026-07 (#3): hosted MCP servers harvested from the official MCP + // registry (54k entries swept), the claude.com/connectors directory, and + // community remote-MCP lists — every endpoint live-probed (initialize + + // /.well-known discovery + registration_endpoint) on 2026-07-18. + | "outreach" + | "salesloft" + | "zoominfo" + | "lusha" + | "hunter" + | "instantly" + | "crossbeam" + | "harmonic" + | "chilipiper" + | "dayai" + | "clarify" + | "staircase" + | "zendesk" + | "helpscout" + | "gorgias" + | "plain" + | "lorikeet" + | "unthread" + | "enterpret" + | "dovetail" + | "missive" + | "otter" + | "grain" + | "krisp" + | "circleback" + | "tldv" + | "ramp" + | "brex" + | "mercury" + | "expensify" + | "navan" + | "carta" + | "digits" + | "gocardless" + | "mercadopago" + | "pitchbook" + | "morningstar" + | "cbinsights" + | "quartr" + | "daloopa" + | "consensus" + | "gusto" + | "deel" + | "ashby" + | "workable" + | "metaview" + | "indeed" + | "udemy" + | "signnow" + | "vanta" + | "drata" + | "figma" + | "miro" + | "lucid" + | "productboard" + | "aha" + | "shortcut" + | "todoist" + | "teamwork" + | "calendly" + | "superhuman" + | "craft" + | "mem" + | "gamma" + | "pitch" + | "eraser" + | "jotform" + | "typeform" + | "surveymonkey" + | "egnyte" + | "mailchimp" + | "customerio" + | "ahrefs" + | "semrush" + | "cloudinary" + | "contentful" + | "sanity" + | "wix" + | "wordpress" + | "gitbook" + | "mintlify" + | "deepl" + | "gitlab" + | "supabase" + | "netlify" + | "heroku" + | "buildkite" + | "grafana" + | "newrelic" + | "honeycomb" + | "incidentio" + | "rootly" + | "bugsnag" + | "launchdarkly" + | "planetscale" + | "prisma" + | "instantdb" + | "algolia" + | "statsig" + | "postman" + | "semgrep" + | "workos" + | "stytch" + | "mux" + | "knock" + | "lovable" + | "retool" + | "telnyx" + | "jam" + | "globalping" + | "airbyte" + | "motherduck" + | "montecarlo" + | "atlan" + | "huggingface" + | "zapier" + | "make" + | "ifttt" + | "exa" + | "tavily" + | "firecrawl" + | "apify" + | "brightdata" + | "docusign" + | "xero" + | "front" + | "smartsheet" + | "mongodb" + | "circleci" + | "chargebee" + | "bigquery" + | "ironclad" + | "harvey" + | "tableau" + | "shopify" + | "render" | "tembo-agent-studio"; export type McpProvider = { @@ -718,6 +858,1024 @@ export const MCP_PROVIDERS: Record = { ], authMode: "manual", }, + // ── Batch 2026-07 (#3): registry + connectors-directory sweep ── + // Endpoints + auth verified by live probe on 2026-07-18: POST initialize → + // 401 challenge → protected-resource metadata → auth-server metadata with a + // registration_endpoint (DCR) unless marked authMode manual/pat. Origin + // lists are the union of the advertised authorization server plus the + // authorize/token/registration endpoint origins (some differ, like Fathom). + // Several DCR servers advertise only confidential token auth + // (client_secret_post/basic) — the dcr_confidential path handles those, as + // with Avoma. offline_access is left at the default; add omitOfflineAccess + // reactively if a server strictly rejects it at Connect (the Amplemarket + // failure mode). Connect-verify each on the dogfood instance before + // relying on it. + // ── Sales / GTM ── + outreach: { + slug: "outreach", + displayName: "Outreach", + // Requires a licensed seat with the Amplify add-on; connects fine, tools + // 403 without it. + mcpServerUrl: "https://api.outreach.io/mcp/", + oauthAuthorizationServerOrigins: ["https://api.outreach.io"], + }, + salesloft: { + slug: "salesloft", + displayName: "Salesloft", + // Requires the Salesloft Agentic add-on (admin-enabled). + mcpServerUrl: "https://mcp.salesloft.com/mcp", + oauthAuthorizationServerOrigins: [ + "https://accounts.salesloft.com", + "https://mcp.salesloft.com", + ], + }, + zoominfo: { + slug: "zoominfo", + displayName: "ZoomInfo", + mcpServerUrl: "https://mcp.zoominfo.com/mcp", + oauthAuthorizationServerOrigins: [ + "https://mcp.zoominfo.com", + "https://okta-login.zoominfo.com", + ], + }, + lusha: { + slug: "lusha", + displayName: "Lusha", + mcpServerUrl: "https://mcp.lusha.com/mcp/claude", + oauthAuthorizationServerOrigins: ["https://auth.lusha.com"], + }, + hunter: { + slug: "hunter", + displayName: "Hunter", + mcpServerUrl: "https://mcp.hunter.io/mcp", + oauthAuthorizationServerOrigins: ["https://hunter.io"], + }, + instantly: { + slug: "instantly", + displayName: "Instantly", + mcpServerUrl: "https://mcp.instantly.ai/mcp", + oauthAuthorizationServerOrigins: ["https://api.instantly.ai"], + }, + crossbeam: { + slug: "crossbeam", + displayName: "Crossbeam", + // MCP endpoint is the origin root (like Pylon). + mcpServerUrl: "https://mcp.crossbeam.com/", + oauthAuthorizationServerOrigins: ["https://mcp.crossbeam.com"], + }, + harmonic: { + slug: "harmonic", + displayName: "Harmonic", + // MCP endpoint is the origin root (like Pylon). + mcpServerUrl: "https://mcp.api.harmonic.ai/", + oauthAuthorizationServerOrigins: ["https://mcp.api.harmonic.ai"], + }, + chilipiper: { + slug: "chilipiper", + displayName: "Chili Piper", + mcpServerUrl: "https://fire.chilipiper.com/api/fire-edge/v1/org/mcp", + oauthAuthorizationServerOrigins: ["https://fire.chilipiper.com"], + }, + dayai: { + slug: "dayai", + displayName: "Day AI", + mcpServerUrl: "https://day.ai/api/mcp", + oauthAuthorizationServerOrigins: ["https://day.ai"], + }, + clarify: { + slug: "clarify", + displayName: "Clarify", + mcpServerUrl: "https://api.clarify.ai/mcp", + oauthAuthorizationServerOrigins: ["https://auth1.clarify.ai"], + }, + staircase: { + slug: "staircase", + displayName: "Staircase AI", + // Gainsight's customer-intelligence product. + mcpServerUrl: "https://mcp.staircase.ai/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.staircase.ai"], + }, + // ── Support / CX ── + zendesk: { + slug: "zendesk", + displayName: "Zendesk", + // Live with DCR but Zendesk's own comms describe MCP as early-access — + // expect account gating. + mcpServerUrl: "https://mcp.zendesk.com/api/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.zendesk.com"], + }, + helpscout: { + slug: "helpscout", + displayName: "Help Scout", + // Beta endpoint (mcp.helpscout.net). + mcpServerUrl: "https://mcp.helpscout.net/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.helpscout.net"], + }, + gorgias: { + slug: "gorgias", + displayName: "Gorgias", + mcpServerUrl: "https://mcp.gorgias.com/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.gorgias.com"], + }, + plain: { + slug: "plain", + displayName: "Plain", + mcpServerUrl: "https://mcp.plain.com/mcp", + oauthAuthorizationServerOrigins: ["https://signin.auth.plain.com"], + }, + lorikeet: { + slug: "lorikeet", + displayName: "Lorikeet", + mcpServerUrl: "https://api.lorikeetcx.ai/v1/mcp", + oauthAuthorizationServerOrigins: [ + "https://api.lorikeetcx.ai", + "https://app.lorikeetcx.ai", + ], + }, + unthread: { + slug: "unthread", + displayName: "Unthread", + mcpServerUrl: "https://app.unthread.io/api/mcp", + oauthAuthorizationServerOrigins: ["https://app.unthread.io"], + }, + enterpret: { + slug: "enterpret", + displayName: "Enterpret", + mcpServerUrl: "https://wisdom-api.enterpret.com/server/mcp", + oauthAuthorizationServerOrigins: ["https://oauth.enterpret.com"], + }, + dovetail: { + slug: "dovetail", + displayName: "Dovetail", + mcpServerUrl: "https://dovetail.com/api/mcp", + oauthAuthorizationServerOrigins: ["https://auth.dovetail.com"], + }, + missive: { + slug: "missive", + displayName: "Missive", + mcpServerUrl: "https://mcp.missiveapp.com/mcp", + oauthAuthorizationServerOrigins: ["https://auth.missiveapp.com"], + }, + // ── Meeting intelligence ── + otter: { + slug: "otter", + displayName: "Otter.ai", + mcpServerUrl: "https://mcp.otter.ai/mcp", + oauthAuthorizationServerOrigins: ["https://otter.ai"], + }, + grain: { + slug: "grain", + displayName: "Grain", + mcpServerUrl: "https://api.grain.com/_/mcp", + oauthAuthorizationServerOrigins: [ + "https://api.grain.com", + "https://grain.com", + ], + }, + krisp: { + slug: "krisp", + displayName: "Krisp", + mcpServerUrl: "https://mcp.krisp.ai/mcp", + oauthAuthorizationServerOrigins: [ + "https://api.krisp.ai", + "https://mcp.krisp.ai", + ], + }, + circleback: { + slug: "circleback", + displayName: "Circleback", + mcpServerUrl: "https://app.circleback.ai/api/mcp", + oauthAuthorizationServerOrigins: ["https://app.circleback.ai"], + }, + tldv: { + slug: "tldv", + displayName: "tl;dv", + mcpServerUrl: "https://mcp.tldv.io/mcp", + oauthAuthorizationServerOrigins: ["https://keycloak.tldv.io"], + }, + // ── Finance / spend / payments ── + ramp: { + slug: "ramp", + displayName: "Ramp", + // Write actions (approve reimbursements, edit txns) honor Ramp's admin + // access controls. + mcpServerUrl: "https://mcp.ramp.com/mcp", + oauthAuthorizationServerOrigins: [ + "https://api.ramp.com", + "https://mcp.ramp.com", + ], + }, + brex: { + slug: "brex", + displayName: "Brex", + mcpServerUrl: "https://api.brex.com/mcp", + oauthAuthorizationServerOrigins: [ + "https://accounts-api.brex.com", + "https://api.brex.com", + ], + }, + mercury: { + slug: "mercury", + displayName: "Mercury", + mcpServerUrl: "https://mcp.mercury.com/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.mercury.com"], + }, + expensify: { + slug: "expensify", + displayName: "Expensify", + mcpServerUrl: "https://mcp.expensify.com/mcp", + oauthAuthorizationServerOrigins: ["https://www.expensify.com"], + }, + navan: { + slug: "navan", + displayName: "Navan", + mcpServerUrl: "https://mcp.navan.com/mcp", + oauthAuthorizationServerOrigins: ["https://login.navan.com"], + }, + carta: { + slug: "carta", + displayName: "Carta", + mcpServerUrl: "https://mcp.app.carta.com/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.app.carta.com"], + }, + digits: { + slug: "digits", + displayName: "Digits", + mcpServerUrl: "https://api.digits.com/mcp", + oauthAuthorizationServerOrigins: ["https://api.digits.com"], + }, + gocardless: { + slug: "gocardless", + displayName: "GoCardless", + mcpServerUrl: "https://mcp.gocardless.com/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.gocardless.com"], + }, + mercadopago: { + slug: "mercadopago", + displayName: "Mercado Pago", + mcpServerUrl: "https://mcp.mercadopago.com/mcp", + oauthAuthorizationServerOrigins: [ + "https://auth.mercadopago.com", + "https://mcp.mercadopago.com", + ], + }, + // ── Financial & market intelligence ── + pitchbook: { + slug: "pitchbook", + displayName: "PitchBook", + // Requires a PitchBook Premium seat. + mcpServerUrl: "https://premium.mcp.pitchbook.com/mcp", + oauthAuthorizationServerOrigins: ["https://premium.mcp.pitchbook.com"], + }, + morningstar: { + slug: "morningstar", + displayName: "Morningstar", + mcpServerUrl: "https://mcp.morningstar.com/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.morningstar.com"], + }, + cbinsights: { + slug: "cbinsights", + displayName: "CB Insights", + mcpServerUrl: "https://mcp.cbinsights.com/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.cbinsights.com"], + }, + quartr: { + slug: "quartr", + displayName: "Quartr", + mcpServerUrl: "https://mcp.quartr.com/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.quartr.com"], + }, + daloopa: { + slug: "daloopa", + displayName: "Daloopa", + mcpServerUrl: "https://mcp.daloopa.com/server/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.daloopa.com"], + }, + consensus: { + slug: "consensus", + displayName: "Consensus", + // Scientific-paper search/synthesis. + mcpServerUrl: "https://mcp.consensus.app/mcp", + oauthAuthorizationServerOrigins: ["https://consensus.app"], + }, + // ── HR / recruiting / learning ── + gusto: { + slug: "gusto", + displayName: "Gusto", + // Read-only tools; OAuth scoped by data category. + mcpServerUrl: "https://mcp.api.gusto.com/anthropic", + oauthAuthorizationServerOrigins: ["https://mcp.api.gusto.com"], + }, + deel: { + slug: "deel", + displayName: "Deel", + mcpServerUrl: "https://api.letsdeel.com/mcp", + oauthAuthorizationServerOrigins: ["https://api.letsdeel.com"], + }, + ashby: { + slug: "ashby", + displayName: "Ashby", + mcpServerUrl: "https://mcp.ashbyhq.com/mcp/v1", + oauthAuthorizationServerOrigins: ["https://mcp-auth.ashbyhq.com"], + }, + workable: { + slug: "workable", + displayName: "Workable", + mcpServerUrl: "https://mcp.workable.com/mcp", + oauthAuthorizationServerOrigins: [ + "https://mcp.workable.com", + "https://workable.com", + ], + }, + metaview: { + slug: "metaview", + displayName: "Metaview", + mcpServerUrl: "https://mcp.metaview.ai/mcp", + oauthAuthorizationServerOrigins: ["https://auth.metaview.ai"], + }, + indeed: { + slug: "indeed", + displayName: "Indeed", + mcpServerUrl: "https://mcp.indeed.com/claude/mcp", + oauthAuthorizationServerOrigins: [ + "https://apis.indeed.com", + "https://secure.indeed.com", + ], + }, + udemy: { + slug: "udemy", + displayName: "Udemy Business", + mcpServerUrl: "https://api.udemy.com/mcp", + oauthAuthorizationServerOrigins: ["https://api.udemy.com"], + }, + // ── Legal / compliance ── + signnow: { + slug: "signnow", + displayName: "SignNow", + mcpServerUrl: "https://mcp-server.signnow.com/mcp", + oauthAuthorizationServerOrigins: ["https://mcp-server.signnow.com"], + }, + vanta: { + slug: "vanta", + displayName: "Vanta", + mcpServerUrl: "https://mcp.vanta.com/mcp", + oauthAuthorizationServerOrigins: [ + "https://api.vanta.com", + "https://app.vanta.com", + "https://mcp.vanta.com", + ], + }, + drata: { + slug: "drata", + displayName: "Drata", + mcpServerUrl: "https://mcp.drata.com/mcp/", + oauthAuthorizationServerOrigins: [ + "https://drata-prod.us.auth0.com", + "https://mcp.drata.com", + ], + }, + // ── Productivity / PM / design ── + figma: { + slug: "figma", + displayName: "Figma", + // All plans; Starter/view-only seats are capped at ~6 tool calls/month. + mcpServerUrl: "https://mcp.figma.com/mcp", + oauthAuthorizationServerOrigins: [ + "https://api.figma.com", + "https://www.figma.com", + ], + }, + miro: { + slug: "miro", + displayName: "Miro", + // Beta; Enterprise teams need admin enablement. MCP endpoint is the origin + // root. + mcpServerUrl: "https://mcp.miro.com/", + oauthAuthorizationServerOrigins: ["https://mcp.miro.com"], + }, + lucid: { + slug: "lucid", + displayName: "Lucid", + mcpServerUrl: "https://mcp.lucid.app/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.lucid.app"], + }, + productboard: { + slug: "productboard", + displayName: "Productboard", + mcpServerUrl: "https://mcp.productboard.com/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.productboard.com"], + }, + aha: { + slug: "aha", + displayName: "Aha!", + mcpServerUrl: "https://mcp.aha.io/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.aha.io"], + }, + shortcut: { + slug: "shortcut", + displayName: "Shortcut", + mcpServerUrl: "https://mcp.shortcut.com/mcp", + oauthAuthorizationServerOrigins: ["https://api.app.shortcut.com"], + }, + todoist: { + slug: "todoist", + displayName: "Todoist", + mcpServerUrl: "https://ai.todoist.net/mcp", + oauthAuthorizationServerOrigins: ["https://todoist.com"], + }, + teamwork: { + slug: "teamwork", + displayName: "Teamwork", + // MCP endpoint is the origin root. + mcpServerUrl: "https://mcp.ai.teamwork.com/", + oauthAuthorizationServerOrigins: [ + "https://teamwork.com", + "https://www.teamwork.com", + ], + }, + calendly: { + slug: "calendly", + displayName: "Calendly", + // MCP endpoint is the origin root; works on free plans. + mcpServerUrl: "https://mcp.calendly.com/", + oauthAuthorizationServerOrigins: ["https://calendly.com"], + }, + superhuman: { + slug: "superhuman", + displayName: "Superhuman Mail", + mcpServerUrl: "https://mcp.mail.superhuman.com/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.auth.mail.superhuman.com"], + }, + craft: { + slug: "craft", + displayName: "Craft", + mcpServerUrl: "https://mcp.craft.do/my/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.craft.do"], + }, + mem: { + slug: "mem", + displayName: "Mem", + mcpServerUrl: "https://mcp.mem.ai/mcp", + oauthAuthorizationServerOrigins: [ + "https://api.mem.ai", + "https://mem.ai", + ], + }, + gamma: { + slug: "gamma", + displayName: "Gamma", + mcpServerUrl: "https://mcp.gamma.app/mcp", + oauthAuthorizationServerOrigins: ["https://auth.gamma.app"], + }, + pitch: { + slug: "pitch", + displayName: "Pitch", + mcpServerUrl: "https://mcp.pitch.com/mcp", + oauthAuthorizationServerOrigins: ["https://auth.pitch.com"], + }, + eraser: { + slug: "eraser", + displayName: "Eraser", + mcpServerUrl: "https://app.eraser.io/api/mcp", + oauthAuthorizationServerOrigins: ["https://app.eraser.io"], + }, + jotform: { + slug: "jotform", + displayName: "Jotform", + mcpServerUrl: "https://mcp.jotform.com/mcp-app", + oauthAuthorizationServerOrigins: ["https://oauth2.jotform.com"], + }, + typeform: { + slug: "typeform", + displayName: "Typeform", + // US endpoint; EU accounts use api.eu.typeform.com (not cataloged yet). + mcpServerUrl: "https://api.typeform.com/mcp", + oauthAuthorizationServerOrigins: [ + "https://admin.typeform.com", + "https://api.typeform.com", + ], + }, + surveymonkey: { + slug: "surveymonkey", + displayName: "SurveyMonkey", + mcpServerUrl: "https://mcp.surveymonkey.com/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.surveymonkey.com"], + }, + egnyte: { + slug: "egnyte", + displayName: "Egnyte", + mcpServerUrl: "https://mcp-server.egnyte.com/mcp", + oauthAuthorizationServerOrigins: ["https://mcp-oauth.egnyte.com"], + }, + // ── Marketing / content / CMS ── + mailchimp: { + slug: "mailchimp", + displayName: "Mailchimp", + mcpServerUrl: "https://ai-inc.mailchimp.com/claude/mcp/v2", + oauthAuthorizationServerOrigins: ["https://ai-inc.mailchimp.com"], + }, + customerio: { + slug: "customerio", + displayName: "Customer.io", + mcpServerUrl: "https://mcp.customer.io/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.customer.io"], + }, + ahrefs: { + slug: "ahrefs", + displayName: "Ahrefs", + mcpServerUrl: "https://api.ahrefs.com/mcp/mcp", + oauthAuthorizationServerOrigins: [ + "https://ahrefs.com", + "https://api.ahrefs.com", + "https://app.ahrefs.com", + ], + }, + semrush: { + slug: "semrush", + displayName: "Semrush", + mcpServerUrl: "https://mcp.semrush.com/claude/v1/mcp", + oauthAuthorizationServerOrigins: [ + "https://api.semrush.com", + "https://oauth.semrush.com", + ], + }, + cloudinary: { + slug: "cloudinary", + displayName: "Cloudinary", + // Asset-management server (their MCP suite has several; this is the + // primary). + mcpServerUrl: "https://asset-management.mcp.cloudinary.com/mcp", + oauthAuthorizationServerOrigins: ["https://asset-management.mcp.cloudinary.com"], + }, + contentful: { + slug: "contentful", + displayName: "Contentful", + mcpServerUrl: "https://mcp.contentful.com/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.contentful.com"], + }, + sanity: { + slug: "sanity", + displayName: "Sanity", + mcpServerUrl: "https://mcp.sanity.io/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.sanity.io"], + }, + wix: { + slug: "wix", + displayName: "Wix", + mcpServerUrl: "https://mcp.wix.com/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.wix.com"], + }, + wordpress: { + slug: "wordpress", + displayName: "WordPress.com", + // WordPress.com-hosted sites only (public-api.wordpress.com), not + // self-hosted WP. + mcpServerUrl: "https://public-api.wordpress.com/wpcom/v2/mcp/v1", + oauthAuthorizationServerOrigins: ["https://public-api.wordpress.com"], + }, + gitbook: { + slug: "gitbook", + displayName: "GitBook", + mcpServerUrl: "https://mcp.gitbook.com/mcp", + oauthAuthorizationServerOrigins: ["https://oauth.gitbook.com"], + }, + mintlify: { + slug: "mintlify", + displayName: "Mintlify", + mcpServerUrl: "https://mcp.mintlify.com/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.mintlify.com"], + }, + deepl: { + slug: "deepl", + displayName: "DeepL", + // Seat-based plans; fair-usage limits. + mcpServerUrl: "https://mcp.deepl.com/v1/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.deepl.com"], + }, + // ── Dev / infra / observability ── + gitlab: { + slug: "gitlab", + displayName: "GitLab", + // gitlab.com only; self-managed instances would need an instance-based + // entry. + mcpServerUrl: "https://gitlab.com/api/v4/mcp", + oauthAuthorizationServerOrigins: ["https://gitlab.com"], + }, + supabase: { + slug: "supabase", + displayName: "Supabase", + // Supports ?read_only=true and ?project_ref= query params on the MCP URL. + mcpServerUrl: "https://mcp.supabase.com/mcp", + oauthAuthorizationServerOrigins: ["https://api.supabase.com"], + }, + netlify: { + slug: "netlify", + displayName: "Netlify", + mcpServerUrl: "https://netlify-mcp.netlify.app/mcp", + oauthAuthorizationServerOrigins: ["https://netlify-mcp.netlify.app"], + }, + heroku: { + slug: "heroku", + displayName: "Heroku", + mcpServerUrl: "https://mcp.heroku.com/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.heroku.com"], + }, + buildkite: { + slug: "buildkite", + displayName: "Buildkite", + // A read-only variant exists at /mcp/readonly. + mcpServerUrl: "https://mcp.buildkite.com/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.buildkite.com"], + }, + grafana: { + slug: "grafana", + displayName: "Grafana", + // Grafana Cloud only (self-hosted OSS uses a local server). + mcpServerUrl: "https://mcp.grafana.com/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.grafana.com"], + }, + newrelic: { + slug: "newrelic", + displayName: "New Relic", + // US endpoint; EU is mcp.eu.newrelic.com. Not permitted for FedRAMP/HIPAA + // accounts. + mcpServerUrl: "https://mcp.newrelic.com/mcp", + oauthAuthorizationServerOrigins: [ + "https://login.newrelic.com", + "https://mcp.newrelic.com", + ], + }, + honeycomb: { + slug: "honeycomb", + displayName: "Honeycomb", + // Requires Honeycomb Intelligence enabled; EU is mcp.eu1.honeycomb.io. + mcpServerUrl: "https://mcp.honeycomb.io/mcp", + oauthAuthorizationServerOrigins: ["https://ui.honeycomb.io"], + }, + incidentio: { + slug: "incidentio", + displayName: "incident.io", + mcpServerUrl: "https://mcp.incident.io/mcp", + oauthAuthorizationServerOrigins: [ + "https://app.incident.io", + "https://mcp.incident.io", + ], + }, + rootly: { + slug: "rootly", + displayName: "Rootly", + // SSE endpoint (/sse) — no streamable-http path advertised. + mcpServerUrl: "https://mcp.rootly.com/sse", + oauthAuthorizationServerOrigins: ["https://rootly.com"], + }, + bugsnag: { + slug: "bugsnag", + displayName: "BugSnag", + mcpServerUrl: "https://bugsnag.mcp.smartbear.com/mcp", + oauthAuthorizationServerOrigins: ["https://oauth.bugsnag.com"], + }, + launchdarkly: { + slug: "launchdarkly", + displayName: "LaunchDarkly", + // Product-area servers under /mcp/{area}; this is the core flags server. + // EU/federal instances unsupported. + mcpServerUrl: "https://mcp.launchdarkly.com/mcp/launchdarkly", + oauthAuthorizationServerOrigins: [ + "https://app.launchdarkly.com", + "https://mcp.launchdarkly.com", + ], + }, + planetscale: { + slug: "planetscale", + displayName: "PlanetScale", + mcpServerUrl: "https://mcp.pscale.dev/mcp/planetscale", + oauthAuthorizationServerOrigins: [ + "https://app.planetscale.com", + "https://auth.planetscale.com", + "https://mcp.pscale.dev", + ], + }, + prisma: { + slug: "prisma", + displayName: "Prisma Postgres", + mcpServerUrl: "https://mcp.prisma.io/mcp", + oauthAuthorizationServerOrigins: [ + "https://auth.prisma.io", + "https://mcp.prisma.io", + ], + }, + instantdb: { + slug: "instantdb", + displayName: "InstantDB", + mcpServerUrl: "https://mcp.instantdb.com/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.instantdb.com"], + }, + algolia: { + slug: "algolia", + displayName: "Algolia", + mcpServerUrl: "https://mcp.algolia.com/mcp", + oauthAuthorizationServerOrigins: ["https://dashboard.algolia.com"], + }, + statsig: { + slug: "statsig", + displayName: "Statsig", + mcpServerUrl: "https://api.statsig.com/v1/mcp", + oauthAuthorizationServerOrigins: ["https://api.statsig.com"], + }, + postman: { + slug: "postman", + displayName: "Postman", + // A trimmed tool surface exists at /minimal. + mcpServerUrl: "https://mcp.postman.com/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.postman.com"], + }, + semgrep: { + slug: "semgrep", + displayName: "Semgrep", + mcpServerUrl: "https://mcp.semgrep.ai/mcp", + oauthAuthorizationServerOrigins: ["https://login.semgrep.dev"], + }, + workos: { + slug: "workos", + displayName: "WorkOS", + mcpServerUrl: "https://mcp.workos.com/mcp", + oauthAuthorizationServerOrigins: ["https://signin.workos.com"], + }, + stytch: { + slug: "stytch", + displayName: "Stytch", + // Auth server is a per-tenant customers.stytch.com origin (their own DCR + // tenant). + mcpServerUrl: "https://mcp.stytch.dev/mcp", + oauthAuthorizationServerOrigins: [ + "https://rustic-kilogram-6347.customers.stytch.com", + "https://stytch.com", + ], + }, + mux: { + slug: "mux", + displayName: "Mux", + // MCP endpoint is the origin root. + mcpServerUrl: "https://mcp.mux.com/", + oauthAuthorizationServerOrigins: ["https://auth.mux.com"], + }, + knock: { + slug: "knock", + displayName: "Knock", + mcpServerUrl: "https://mcp.knock.app/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.knock.app"], + }, + lovable: { + slug: "lovable", + displayName: "Lovable", + // MCP endpoint is the origin root. + mcpServerUrl: "https://mcp.lovable.dev/", + oauthAuthorizationServerOrigins: ["https://lovable.dev"], + }, + retool: { + slug: "retool", + displayName: "Retool", + mcpServerUrl: "https://mcp.retool.com/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.retool.com"], + }, + telnyx: { + slug: "telnyx", + displayName: "Telnyx", + mcpServerUrl: "https://api.telnyx.com/v2/mcp", + oauthAuthorizationServerOrigins: ["https://api.telnyx.com"], + }, + jam: { + slug: "jam", + displayName: "Jam", + mcpServerUrl: "https://mcp.jam.dev/mcp", + oauthAuthorizationServerOrigins: ["https://api.jam.dev"], + }, + globalping: { + slug: "globalping", + displayName: "Globalping", + mcpServerUrl: "https://mcp.globalping.dev/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.globalping.dev"], + }, + // ── Data / AI ── + airbyte: { + slug: "airbyte", + displayName: "Airbyte", + // Airbyte Agents account (app.airbyte.ai). + mcpServerUrl: "https://mcp.airbyte.ai/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.airbyte.ai"], + }, + motherduck: { + slug: "motherduck", + displayName: "MotherDuck", + mcpServerUrl: "https://api.motherduck.com/mcp", + oauthAuthorizationServerOrigins: ["https://mcp-auth.motherduck.com"], + }, + montecarlo: { + slug: "montecarlo", + displayName: "Monte Carlo", + mcpServerUrl: "https://integrations.getmontecarlo.com/mcp", + oauthAuthorizationServerOrigins: ["https://auth.getmontecarlo.com"], + }, + atlan: { + slug: "atlan", + displayName: "Atlan", + mcpServerUrl: "https://mcp.atlan.com/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.atlan.com"], + }, + huggingface: { + slug: "huggingface", + displayName: "Hugging Face", + mcpServerUrl: "https://huggingface.co/mcp", + oauthAuthorizationServerOrigins: ["https://huggingface.co"], + }, + // ── Automation / web data / search ── + zapier: { + slug: "zapier", + displayName: "Zapier", + // Proxies 9k+ app actions; users curate the tool list at mcp.zapier.com. + mcpServerUrl: "https://mcp.zapier.com/api/mcp/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.zapier.com"], + }, + make: { + slug: "make", + displayName: "Make", + // MCP endpoint is the origin root. + mcpServerUrl: "https://mcp.make.com/", + oauthAuthorizationServerOrigins: ["https://www.make.com"], + }, + ifttt: { + slug: "ifttt", + displayName: "IFTTT", + mcpServerUrl: "https://ifttt.com/mcp", + oauthAuthorizationServerOrigins: ["https://ifttt.com"], + }, + exa: { + slug: "exa", + displayName: "Exa", + mcpServerUrl: "https://mcp.exa.ai/mcp", + oauthAuthorizationServerOrigins: ["https://auth.exa.ai"], + }, + tavily: { + slug: "tavily", + displayName: "Tavily", + mcpServerUrl: "https://mcp.tavily.com/mcp", + oauthAuthorizationServerOrigins: ["https://mcp.tavily.com"], + }, + firecrawl: { + slug: "firecrawl", + displayName: "Firecrawl", + mcpServerUrl: "https://mcp.firecrawl.dev/mcp", + oauthAuthorizationServerOrigins: ["https://www.firecrawl.dev"], + }, + apify: { + slug: "apify", + displayName: "Apify", + // MCP endpoint is the origin root. + mcpServerUrl: "https://mcp.apify.com/", + oauthAuthorizationServerOrigins: [ + "https://console-backend.apify.com", + "https://console.apify.com", + ], + }, + brightdata: { + slug: "brightdata", + displayName: "Bright Data", + mcpServerUrl: "https://mcp.brightdata.com/mcp", + oauthAuthorizationServerOrigins: ["https://brightdata.com"], + }, + // ── Bring-your-own OAuth app (no DCR) ── + docusign: { + slug: "docusign", + displayName: "DocuSign", + // Open beta; confidential authorization-code clients only (no DCR). + mcpServerUrl: "https://mcp.docusign.com/mcp", + oauthAuthorizationServerOrigins: [ + "https://account.docusign.com", + "https://mcp.docusign.com", + ], + authMode: "manual", + }, + xero: { + slug: "xero", + displayName: "Xero", + // Standard Xero OAuth app (no DCR). + mcpServerUrl: "https://mcp.xero.com/mcp", + oauthAuthorizationServerOrigins: [ + "https://identity.xero.com", + "https://login.xero.com", + ], + authMode: "manual", + }, + front: { + slug: "front", + displayName: "Front", + // Open beta; create a Front developer OAuth app (confidential). + mcpServerUrl: "https://mcp.frontapp.com/mcp", + oauthAuthorizationServerOrigins: ["https://app.frontapp.com"], + authMode: "manual", + }, + smartsheet: { + slug: "smartsheet", + displayName: "Smartsheet", + mcpServerUrl: "https://mcp.smartsheet.com/mcp", + oauthAuthorizationServerOrigins: [ + "https://api.smartsheet.com", + "https://app.smartsheet.com", + "https://mcp.smartsheet.com", + ], + authMode: "manual", + }, + mongodb: { + slug: "mongodb", + displayName: "MongoDB Atlas", + mcpServerUrl: "https://mcp.mongodb.com/mcp", + oauthAuthorizationServerOrigins: [ + "https://authorize.mongodb.com", + "https://cloud.mongodb.com", + ], + authMode: "manual", + }, + circleci: { + slug: "circleci", + displayName: "CircleCI", + mcpServerUrl: "https://mcp.circleci.com/v1/mcp", + oauthAuthorizationServerOrigins: [ + "https://app.circleci.com", + "https://circleci.com", + "https://mcp.circleci.com", + ], + authMode: "manual", + }, + chargebee: { + slug: "chargebee", + displayName: "Chargebee", + // Central endpoint; Chargebee also hosts per-site custom servers (not + // cataloged). + mcpServerUrl: "https://mcp.chargebee.com/mcp", + oauthAuthorizationServerOrigins: ["https://app.chargebee.com"], + authMode: "manual", + }, + bigquery: { + slug: "bigquery", + displayName: "BigQuery", + // Google OAuth like Gmail: manual confidential client + offline access + // params. + mcpServerUrl: "https://bigquery.googleapis.com/mcp", + oauthAuthorizationServerOrigins: [ + "https://accounts.google.com", + "https://oauth2.googleapis.com", + ], + authMode: "manual", + authorizeParams: { access_type: "offline", prompt: "consent" }, + }, + ironclad: { + slug: "ironclad", + displayName: "Ironclad", + // NA1 region endpoint. + mcpServerUrl: "https://mcp.na1.ironcladapp.com/mcp", + oauthAuthorizationServerOrigins: ["https://ironcladapp.com"], + authMode: "manual", + }, + harvey: { + slug: "harvey", + displayName: "Harvey", + mcpServerUrl: "https://api.harvey.ai/hosted_mcp/mcp", + oauthAuthorizationServerOrigins: [ + "https://api.harvey.ai", + "https://harvey-ai.us.auth0.com", + ], + authMode: "manual", + }, + tableau: { + slug: "tableau", + displayName: "Tableau", + // Tableau Cloud only; rolling out through 2026.2. + mcpServerUrl: "https://mcp.tableau.com/mcp", + oauthAuthorizationServerOrigins: ["https://sso.online.tableau.com"], + authMode: "manual", + }, + shopify: { + slug: "shopify", + displayName: "Shopify", + // Admin setup server; per-store storefront MCP is separate and + // unauthenticated. + mcpServerUrl: "https://setup.shopify.com/mcp", + oauthAuthorizationServerOrigins: ["https://setup.shopify.com"], + authMode: "manual", + }, + // ── API token ── + render: { + slug: "render", + displayName: "Render", + // Hosted MCP authenticates with a Render API key as the Bearer (no DCR, + // no OAuth-app product) — PAT mode like GitHub. Docs: + // https://render.com/docs/mcp-server + mcpServerUrl: "https://mcp.render.com/mcp", + oauthAuthorizationServerOrigins: [], + authMode: "pat", + patHint: + "Paste a Render API key (Dashboard → Account Settings → API Keys). It is broadly scoped to your workspaces, so prefer a dedicated account/key for agents.", + }, "tembo-agent-studio": { slug: "tembo-agent-studio", displayName: "Tembo Agent Studio", From e0efde372e5152d07f7836858a78831e40b7575d Mon Sep 17 00:00:00 2001 From: "staging-tembo[bot]" <217798655+staging-tembo[bot]@users.noreply.github.com> Date: Sat, 18 Jul 2026 20:38:41 +0000 Subject: [PATCH 2/3] fix(connections): ship local logo art for 61 providers missing from Composio CDN --- web/public/mcp-logos/aha.png | Bin 0 -> 511 bytes web/public/mcp-logos/atlan.png | Bin 0 -> 3367 bytes web/public/mcp-logos/bigquery.png | Bin 0 -> 975 bytes web/public/mcp-logos/carta.png | Bin 0 -> 2643 bytes web/public/mcp-logos/cbinsights.png | Bin 0 -> 533 bytes web/public/mcp-logos/chargebee.png | Bin 0 -> 1214 bytes web/public/mcp-logos/chilipiper.png | Bin 0 -> 1355 bytes web/public/mcp-logos/circleback.png | Bin 0 -> 96479 bytes web/public/mcp-logos/clarify.png | Bin 0 -> 2876 bytes web/public/mcp-logos/commonroom.png | Bin 0 -> 1078 bytes web/public/mcp-logos/consensus.png | Bin 0 -> 1089 bytes web/public/mcp-logos/craft.png | Bin 0 -> 8227 bytes web/public/mcp-logos/crossbeam.png | Bin 0 -> 475 bytes web/public/mcp-logos/daloopa.png | Bin 0 -> 1389 bytes web/public/mcp-logos/dayai.png | Bin 0 -> 1230 bytes web/public/mcp-logos/deepl.png | Bin 0 -> 4788 bytes web/public/mcp-logos/digits.png | Bin 0 -> 6702 bytes web/public/mcp-logos/drata.png | Bin 0 -> 1500 bytes web/public/mcp-logos/enterpret.png | Bin 0 -> 1099 bytes web/public/mcp-logos/eraser.ico | Bin 0 -> 15086 bytes web/public/mcp-logos/gocardless.png | Bin 0 -> 1900 bytes web/public/mcp-logos/granola.png | Bin 0 -> 2286 bytes web/public/mcp-logos/harmonic.png | Bin 0 -> 775 bytes web/public/mcp-logos/harvey.png | Bin 0 -> 8458 bytes web/public/mcp-logos/honeycomb.png | Bin 0 -> 1827 bytes web/public/mcp-logos/ifttt.png | Bin 0 -> 551 bytes web/public/mcp-logos/indeed.png | Bin 0 -> 774 bytes web/public/mcp-logos/instantdb.png | Bin 0 -> 568 bytes web/public/mcp-logos/ironclad.png | Bin 0 -> 386 bytes web/public/mcp-logos/knock.png | Bin 0 -> 1059 bytes web/public/mcp-logos/krisp.png | Bin 0 -> 1227 bytes web/public/mcp-logos/lorikeet.png | Bin 0 -> 1069 bytes web/public/mcp-logos/lovable.png | Bin 0 -> 16832 bytes web/public/mcp-logos/lucid.png | Bin 0 -> 559 bytes web/public/mcp-logos/mercadopago.png | Bin 0 -> 1296 bytes web/public/mcp-logos/mercury.png | Bin 0 -> 5075 bytes web/public/mcp-logos/metaview.png | Bin 0 -> 4386 bytes web/public/mcp-logos/montecarlo.png | Bin 0 -> 1051 bytes web/public/mcp-logos/morningstar.png | Bin 0 -> 7336 bytes web/public/mcp-logos/motherduck.png | Bin 0 -> 1061 bytes web/public/mcp-logos/navan.png | Bin 0 -> 1497 bytes web/public/mcp-logos/otter.png | Bin 0 -> 655 bytes web/public/mcp-logos/pitch.jpg | Bin 0 -> 1937 bytes web/public/mcp-logos/pitchbook.png | Bin 0 -> 734 bytes web/public/mcp-logos/planetscale.ico | Bin 0 -> 1150 bytes web/public/mcp-logos/quartr.png | Bin 0 -> 1778 bytes web/public/mcp-logos/retool.png | Bin 0 -> 1307 bytes web/public/mcp-logos/salesloft.jpg | Bin 0 -> 688 bytes web/public/mcp-logos/semgrep.png | Bin 0 -> 1010 bytes web/public/mcp-logos/signnow.png | Bin 0 -> 1393 bytes web/public/mcp-logos/similarweb.png | Bin 0 -> 1698 bytes web/public/mcp-logos/smartsheet.png | Bin 0 -> 2473 bytes web/public/mcp-logos/staircase.png | Bin 0 -> 1065 bytes web/public/mcp-logos/statsig.png | Bin 0 -> 2419 bytes web/public/mcp-logos/stytch.png | Bin 0 -> 501 bytes web/public/mcp-logos/superhuman.png | Bin 0 -> 1092 bytes web/public/mcp-logos/teamwork.png | Bin 0 -> 3174 bytes web/public/mcp-logos/udemy.png | Bin 0 -> 818 bytes web/public/mcp-logos/unthread.png | Bin 0 -> 1723 bytes web/public/mcp-logos/workos.png | Bin 0 -> 6343 bytes web/public/mcp-logos/zapier.png | Bin 0 -> 1799 bytes web/src/lib/mcp-logo.ts | 87 +++++++++++++++++++++++++-- 62 files changed, 83 insertions(+), 4 deletions(-) create mode 100644 web/public/mcp-logos/aha.png create mode 100644 web/public/mcp-logos/atlan.png create mode 100644 web/public/mcp-logos/bigquery.png create mode 100644 web/public/mcp-logos/carta.png create mode 100644 web/public/mcp-logos/cbinsights.png create mode 100644 web/public/mcp-logos/chargebee.png create mode 100644 web/public/mcp-logos/chilipiper.png create mode 100644 web/public/mcp-logos/circleback.png create mode 100644 web/public/mcp-logos/clarify.png create mode 100644 web/public/mcp-logos/commonroom.png create mode 100644 web/public/mcp-logos/consensus.png create mode 100644 web/public/mcp-logos/craft.png create mode 100644 web/public/mcp-logos/crossbeam.png create mode 100644 web/public/mcp-logos/daloopa.png create mode 100644 web/public/mcp-logos/dayai.png create mode 100644 web/public/mcp-logos/deepl.png create mode 100644 web/public/mcp-logos/digits.png create mode 100644 web/public/mcp-logos/drata.png create mode 100644 web/public/mcp-logos/enterpret.png create mode 100644 web/public/mcp-logos/eraser.ico create mode 100644 web/public/mcp-logos/gocardless.png create mode 100644 web/public/mcp-logos/granola.png create mode 100644 web/public/mcp-logos/harmonic.png create mode 100644 web/public/mcp-logos/harvey.png create mode 100644 web/public/mcp-logos/honeycomb.png create mode 100644 web/public/mcp-logos/ifttt.png create mode 100644 web/public/mcp-logos/indeed.png create mode 100644 web/public/mcp-logos/instantdb.png create mode 100644 web/public/mcp-logos/ironclad.png create mode 100644 web/public/mcp-logos/knock.png create mode 100644 web/public/mcp-logos/krisp.png create mode 100644 web/public/mcp-logos/lorikeet.png create mode 100644 web/public/mcp-logos/lovable.png create mode 100644 web/public/mcp-logos/lucid.png create mode 100644 web/public/mcp-logos/mercadopago.png create mode 100644 web/public/mcp-logos/mercury.png create mode 100644 web/public/mcp-logos/metaview.png create mode 100644 web/public/mcp-logos/montecarlo.png create mode 100644 web/public/mcp-logos/morningstar.png create mode 100644 web/public/mcp-logos/motherduck.png create mode 100644 web/public/mcp-logos/navan.png create mode 100644 web/public/mcp-logos/otter.png create mode 100644 web/public/mcp-logos/pitch.jpg create mode 100644 web/public/mcp-logos/pitchbook.png create mode 100644 web/public/mcp-logos/planetscale.ico create mode 100644 web/public/mcp-logos/quartr.png create mode 100644 web/public/mcp-logos/retool.png create mode 100644 web/public/mcp-logos/salesloft.jpg create mode 100644 web/public/mcp-logos/semgrep.png create mode 100644 web/public/mcp-logos/signnow.png create mode 100644 web/public/mcp-logos/similarweb.png create mode 100644 web/public/mcp-logos/smartsheet.png create mode 100644 web/public/mcp-logos/staircase.png create mode 100644 web/public/mcp-logos/statsig.png create mode 100644 web/public/mcp-logos/stytch.png create mode 100644 web/public/mcp-logos/superhuman.png create mode 100644 web/public/mcp-logos/teamwork.png create mode 100644 web/public/mcp-logos/udemy.png create mode 100644 web/public/mcp-logos/unthread.png create mode 100644 web/public/mcp-logos/workos.png create mode 100644 web/public/mcp-logos/zapier.png diff --git a/web/public/mcp-logos/aha.png b/web/public/mcp-logos/aha.png new file mode 100644 index 0000000000000000000000000000000000000000..8d0e0c0fd4aeb42365dee3b86777e2e0d7969558 GIT binary patch literal 511 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 literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/bigquery.png b/web/public/mcp-logos/bigquery.png new file mode 100644 index 0000000000000000000000000000000000000000..3ae05e336ff820503f1ac8e74163ac94689f60a6 GIT binary patch literal 975 zcmV;=12FuFP))D{PcK=s*~KY1xC=2Oos6 zr=ep^1ns0)kRcRqgB4dM*+bF#hdB|32#YqQ$Xx$Y=61&hvWeIWz&YR;a9~%r6>J0F0PpoLWxm~$fovig1Q`eBfP-xc*RW-T zSbluWxpes5B+A$6nQ+nTp3%aa1)SfDI6!(}oGXV;n!tGk%U8wg(EZPE0DV4j1>h!V z&P~$`3IH}ynQ1+s})K;cXa@nv9ARg(&&F@)C|=s_xzw8KEH2a0weD2S!o@|hga9*@fGfT}Kv$dqY0KQwaj z+58ajGmTZK^uh#+U7dr#kzVkUB1TMQ(!f0I z0Zypu_f>I4UokCbwS~w$aMaCF@ZgVw4vS-(y#j(vKaK$6`sA)MX?TGAZVm5ySxaL8$3>H2ubWM;|AW=`3 zmC+wdy(`hV=jZSnsd6yb{l~|id)^i422KHwG;^|wvK9zhrL1F{R~rrdQi||l{@E_z zq;Gzsg?2@x6?rv16V4g{rsbqmbrGPf@RJka?A=j*+ivTrycaB{r^6|z-vuI5K<3v{ zgb(u1v7vi<5o!k+V5<71X29KQV>6r4&u?z`cr|5*&~@NbU@Scyu5HjAV`f^;#$V-! xPXpD5)17@#zT@Ufg1()e4sYy3&IkA(;XnJxH;L4OAi4km002ovPDHLkV1giP!Ce3V literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/carta.png b/web/public/mcp-logos/carta.png new file mode 100644 index 0000000000000000000000000000000000000000..29d5e51a7e3b8f77257f077070e867e2b4358915 GIT binary patch literal 2643 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 literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/cbinsights.png b/web/public/mcp-logos/cbinsights.png new file mode 100644 index 0000000000000000000000000000000000000000..ba6c221b770d3d6436f17348e9e145b9780540f5 GIT binary patch literal 533 zcmV+w0_y#VP)4lZsk4kCge2#P4J zf}IqHj&5Bl1*z2Dd5Oa%Ubvb|&WoJG{gwxkC(rwRpXbdlB#7hKBo$6{^(nyr01zBL zeF=8sGR|V}Ul)tI*W1n3>$M}tW`ihth?#+uE|&2CD^O2v9LGh>|KXugv_FXroXDwl z0IOMmc|0}7&NKR%#0Z@nfH~Yj6L;&lR?*_nPGUC$lcxoI3H91vmC}($B>yXwU`zx58!^yfUNAmC$HU_)br z=mz%bk7ZjvK8*tK3b%(PwACDpH(ZV1Zg%7NUYVk!035{``D3fKg-f%(uP<1s5zHC> zh6Pv~1>geCClBUTJlPd2b~IXBg2y;iQ1j6!0ER6-aKDb0VvlK5{T5^oTp1&Z{-qBT zbql=%RVuNh(hb%0Jz;2msQ(44LRpU}v$3xsK2!*h?Lg51U&ZqfxA3hZfV2al;t|}$ z%MkBz4sWnECO|C{^8h~M3htwmwrLqpu!%im0IVnR2NrGjfe1@@kzNR Xrt4!Eb`|Zo00000NkvXXu0mjfSXJ%+ literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/chargebee.png b/web/public/mcp-logos/chargebee.png new file mode 100644 index 0000000000000000000000000000000000000000..361d4040fb1306efdcda012e884f6b9da5725204 GIT binary patch literal 1214 zcmV;v1VQ_WP)C0000RP)t-sM{rF4 zG64TF0RJ)o|1$vpG64TG0RJ-p|1$s+Kz>93000PdQchCEsCCV^9q&jWBC>V|4iNdOOEj$k)TgCN=t01h(<(V&_D1^{CI+7Jn7703V} z{HgBH0)Ws{gnOuBFb4p4{}0n(0|7XInY0GfAl*d?fMyepgOtm(02nnTXcDw25Cg!G z3B|!S0$>2FEszG)F&GEH`x4M#BLNTqK|=AAfNN7A1VHktaRfl`;+>gVye0?0Tl3JM zE)Qk_uoLQ`!KN6D17Jz0<6s8?NFbth_=tn;3d8`=B-C-RhX8CXAm3R5Xh_3&03->O z2D=DA0Z_UsHP{@3X#f-nBMBfIKrjD5d?7Cb0Eyl)Strv05jo~ zzz_mh0MAj5f7oHn8}sHEoE9&%{A>jY`vGMW0W0N*J0p+Kn1NQ7?v8y~nG`ZMs21YnCTv0FolEh$@*nQO%z;Iy98srEN z#kZo>l7i&0KeGUj7fl@BC;;1wD*AR3W}E8 zT;t%wT`^+uP28w;<&s05tf5ZBa(wF?eM0m9bCCIr|I5u=da<_xIH?G~`A}dN<$3@+ z2A6#55qlSa>~p__A(S@*Sk}g@YcB%GwkMxwya5I4%95XpKmU#hnf&swc$ER;7vPC?<6GU z3fG;ICG{$G+h`9>7~~VLOCbDzV`c%!Sv$uZl2`ow< ca@_U*KerAksJ$I@&Hw-a07*qoM6N<$f^>5t_W%F@ literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/chilipiper.png b/web/public/mcp-logos/chilipiper.png new file mode 100644 index 0000000000000000000000000000000000000000..395b1a335714a8d1508bff8aad122b9efc1c2036 GIT binary patch literal 1355 zcmV-R1+@B!P)C0001TP)t-s|NsC0 zS0VpK0RL4T|4IP=LjeC!68};c|4s}4O$GmpYybQB|Kr*JP5}Qu0RPXy|H!)k>*W8w zuK(7`|A%G&d{zJ4(f^Zn|FNI{nSlSIjQ?>&|EZM!uA2W`B>%&-|MKnsx2gYSG5>2l z|A1Zpc29EVbFu&c1e8fcK~#90?ONHgsyYxgGqZ{^h#Cg<|9|lUnkW*yRp*>eURZCk zce$25cfw|~V#SITD^@_GiQMw1Npf<@A7O+NmjVKg5O(Q=Odv$J4h3`sp*VFYAVvsz zS9km&>jiL!X^_)FK;ce6JqQqiI{|@kYym;s#=uYqon}Gl4FY_3bwCatKy>Gd|LFmT zz2L-00n8PD_%r~Kt^{1i5OkP@Y~;5dgH7AEX}yi|hjX<;J7nqQudkG>G|Pcu*s zEg{z-@S6S(Crl<1BBr*^I z#Iv<5uSJ$g6&S&7UKz#??c6cyEqC zgyD9hu;{lytU~-gYlDyx@Iq5bRfKkC0|2Ff0kJUxp=!V!+XVwyJ0)onV+b&y?Vvu+ zESo%MD}7-}|CRU{Y{A2qpMtGH+C$GS2#yJ@#n=bzc!YXF-zW zOaHMy?9z6+sQ*JmOj#Is_g{jZI`A_L8q55pZiC~f8Op?~7JUJLP&wdr6f8wwZgG6t z**cHQRKdaHwvoL8l2g`II}7KMwJN#%K771?%mBRzOwXru8vz=lVVZ4VIr_8W&tr-c zxE8E4V5|Xwc?g7?!Zwv+q}308#2-NXx!S$Q09fQF2q*|bHFS{S$l*TozvA~A82-&o zWgv}y@nfiD3{=XAViR_JfgdrbgWCE%ba|~bkH7;zSXur&eVUCv+Wv6-o6ExDG4(&> zLHUU-+FkL-u+3l}m`7g)ff`W$r-a4mN8Z^+N8UfLq70ySIM!zJsqL^K3lg{iF~{sS z4X)@yzBGsg?t)~?NT1%{Cw)!s; zv@=<`$w4QuF#G8Fy`gQtA-R{+tS6MWHu-Bd%QoWU!peo$DiWMtXtXN?c{{d#0G}F&)@lXH& N002ovPDHLkV1nIKooWC8 literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/circleback.png b/web/public/mcp-logos/circleback.png new file mode 100644 index 0000000000000000000000000000000000000000..1411eabb27b0b28000652b965fb3ef334cc15194 GIT binary patch literal 96479 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 literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/consensus.png b/web/public/mcp-logos/consensus.png new file mode 100644 index 0000000000000000000000000000000000000000..948a85742ea3eec83165f7642ff12ced7d91441b GIT binary patch literal 1089 zcmV-H1it%;P)C0001cP)t-s|Ns9x z&8h~D@c@kR0Eh4Zitzx1@Bo7FG0UeV%A}Ft%Nfa{g}(Rf_Wrr+-PZH#YuCKY@aMAD z`pe||*6RGG(D~i({dBVR=lJyY{rs8Y&veZ$z zZngC=n(|_<^@H8UUe&kJZo7p500V(ZL_t(|ob8zHlCm%ig+)qf`4GfUKu}zDz5gqG z3%agKim<75=AAyj9H(#&X_^E^BZI+UFc=I5gTY|ednhsq1c;j{X} z!RfR5${fu8s;_7lmc!Ej5xT$|7!S_>hZvyszxq_)4g=T_Btz;SfW1N*z$8Fppu*{& zx;DTTV^9qt@>NI!bNL3?#91xob<0VY+h8wi)J}jhP{~e!7&{)D%`$+)KvC1l%x!{9 zTAheg^Y-e1w(Z(SjQ;2pY?omg&K9Q!4>n1_Y+CmvlD=NH2v(~gQ6V3BCHJj-a=SIf z9jk$)F=v*5aqg`ze4?Bj3RM?E0rh1Ld#2fPZV0ZkTZE0bXb}aJHV{I>RsE z&jwhgRe#emU|CuXtlI|oTBm^sFfe(2nL4Iz1A3DHGT?pMfYw?B68)Zw#faQ1YZTS>7lml=NI%AMN>k9`j zBG!oy8nAp>L5x7h2m??pYM$!6ftGuqVNCG?OF<3uz1B;@gu!+h;v~T5;Bs4@-*0Z@ zF{xQZ2a{ysj|G1Aipg|RWHIORm6!;`T?U$)i+abIB=%P@$3VUV17LsGhsMIeVBTgr zQ=liP1`f8vp&;~CqyXxD78;2L(%raTAuGfK^f8S{K?)%CQ%NuE4R(Y^rU0|RjyV7i zl>$6R%F70_o{#V2zvf_4fXCSIk7SLYyYXG+OI-F}X%8c!^OjlecUus1iK=gDE%kg- z2X^gsOdrgTl{|gJ)V~uy-@oZi^Lh$tKf8Y}6zu&kMICK1@>t%qHGxK1ENpRhLHyz+ zunJ3*i*{Z}``IQE<6!1_Suu&Ue#A8x3D@F|p|-jH00000NkvXX Hu0mjfj9DRn literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/craft.png b/web/public/mcp-logos/craft.png new file mode 100644 index 0000000000000000000000000000000000000000..d0c261e9a8e4c02811a32136765768d674243fee GIT binary patch literal 8227 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 literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/crossbeam.png b/web/public/mcp-logos/crossbeam.png new file mode 100644 index 0000000000000000000000000000000000000000..b7bf154533a0091fd21fba86cfcb7dc9abe43f0c GIT binary patch literal 475 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&sR#IkxVjhkRNQ=AdHc~fxJjfPI%2FBf)sTmf_5we_S?R2ew+z;mn%!>}?a5 zNt8B&XoiVZi)e<8^%2nw0dA95q6?m1mpvpNFjwgdi~c+9hItQ;z7;vBUh%Q6MYOg_ z{a+P}Q{yowoeL3_tWxtL7Hkx(W3l^igsHbRVu7R12iF@XnRc?g`V--mcFzB4yNAe) zdRDJRXZhFvY`van#u(N9anAWy22;)FxZn8Cq9NOMyXF+vr`U!IiGODJzt|A6AY353 zv1#snxz7h>-}y7X&@>Zkh;_{4WU#Ig<9N5hSpM7fC7}wN4yQGKmR)Axwfn$l!M6R^ ic)41!hXqiyF~5BG1Ma1ZIQ9aAp25@A&t;ucLK6T03Bu$6 literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/daloopa.png b/web/public/mcp-logos/daloopa.png new file mode 100644 index 0000000000000000000000000000000000000000..1e57b365bddcb5f1beed2c7eab3427eaeae4593c GIT binary patch literal 1389 zcmV-z1(N!SP)C0001HP)t-sQzI<> z{rylLC{G(D`}+D#7b4Wk%U&=!lDwq*Ae!7yUXzGw(-9RyJB&#&KBzyltEQT4WZ0=S&*_wg#<0Owhum;j1c z0GJv1X$HlwKrMkdV-9HJO)E*{t0aIt7HGwLr{00*Q*{JjV96HZ-Dj%)smi_qA&WqF zm%zADD6?w$1I`mP7%Q*$6d zWiJ?*t?q(=*YZG+8hV!jr7L~JZiwDxNV?@Jj9ZiDiU8?aq_I-HfiRu`SHev2(i;e$ zQ}7aFKI&tD60a>DYX;d`u}}u^${*&x0-@5v0FjhV0T8TsSUNUn$fwsgX%oFx`A9qE z4B*{PZ{J54680B^t-4K0SOu`$FOdr6;mQY|%7TF6Nuw!xGTA}6UKVDmFcJ~;-^*W! zT>x>H418rB0y3KE{fC7{h`U8mGD~IR0kdDPmKpL;EX+UtFA2#oWqtX>$14VEghJv@ z_SJbSuhHEEa_AXZ{MvXjzEuJh0dvTj`5{YgX#^#2KiBY%FBE zfUDHmt~7!h;mndrPK5b5;_TNs6bn^3h@`FoyqSBCGHfx3|{F0CC={n|>VE1HX2>W(% zwrTxeh^Q7=^@!cm_WjjA5`T z&0{voQKS(;&lv>nPiY>zQ?)WfHM%{D1qMYKE$4+`3<0yR>Us%^1sTYsb&fH7U+V@8 zRah|p=gRI@AhOUzgRJhnJkO&l?c4e6SZ^p;@<5iOA}64hWl_7BJ>z!@t$zS{W3Mmq zip!#Yh>EbczEaNI;rF?gK{g_v3%n~1j-9>ojXS1_DBvW1*I{dYZuV2^x8ygBo3@AEs>#de)OiL2i~Keu!L zxpy~?964g2zT)F?$yGBLQhgeX)Ep#*7xZuj9AnW)W}0HicnXK`pHfK!OUp=`<;#}U z*_^JZuGXG6fByV;fB){SSmqV{*_M_bnXFh-4TwPI7 zps%lgvP1InF5!DOZx(+3{P}*PcXP|{-__;C#lapIonjag zwzlrJv+v}(FeAr3v9R#s-Me=~^{U-nLm0H@-BI{6Bfn`y!;~;P--HJ_`T4sgI=CcC zgO{HC^{Z-%<(Yd8Y#SyUdW$a=JYK!*)IAB&MPm#;Jl;3Xz;y9xrSg zfhx=r|DGu0%kbvps`XG;Y6!eM&Ag$yWkLr>#_1RAdDoqin4})8H+5E0Qh1iRNX2lS zo~zzdXMIP>&X`#SQv3Jq^U}XDv$*2(pQm*kJC<M_C7`7Lt>QgjlD&@ zR;NNU*8G0-B79QMzU$YoN6r7b_}8~@+bY`f&5!SU09OiHr^Hb*P%YS{G4+n#UnpI^VMer(DU=*UxQc#wRhuK$Mg1Lt&;%(A71 zndXXR-CiY({r&xURaI6q!w#q|pUETkFG(ntLD^pQMac^0#dZ1l=Z~hX@!l_fr0v7Y zmzfWqbJS;MdM>eE7kr<8#pRn0D`R3~MYDb1^fc^}-Utls2hVLoOBS&NR=p^YE>YRI zabsYKr}w2_<_#Y*+x-n|GPW|v*ImujF|AKcbycl7@yI&qaDaM^T9jJM$yxtrhjFct z-ghNvbJw-03g`Z_x1O)OaOhA|)sG8Wj5@~bt@RZZ5m)|%^tnX^H}UcD-MMuu>i&P@ zTju8Gq5B0R-M%qNysi1TepUM9&nwohU8~}CE`O8QfrC;Hzehg~PSdblzI?e}=q3?| z2VY)=Pn|Qxy;lDw=YlH+uYUV(vF!O3w@L883iThWKG*2^TO9WP%WhS5(utvbhm7j? z)nDJFaN2DZ^^=_>=CJdl{i{H?yr;{0R9JatrEty@6K*=c^3IfrQy7|--w~*Z+?g5t zVO|PL$km@_Z0`fb5B%gkI9*r!w#*)PUx(|>-#fThaLv1`JvYNrPrcpM#o_9cQyl5c zOaI=^jdBqU5Vcu6w>qLJzk23Mr7i|DKbHT$Z#2kiH!;wYw0E_pJDbw%i$4dO=)N0reoaK7H(XZ5fdB@+XT}0<|(0Dfs{Z literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/deepl.png b/web/public/mcp-logos/deepl.png new file mode 100644 index 0000000000000000000000000000000000000000..219cde72b3670b838a095276aa2abadb0d11938a GIT binary patch literal 4788 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 TA9sSyFae%w=&RR&9Af?l={XKX literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/digits.png b/web/public/mcp-logos/digits.png new file mode 100644 index 0000000000000000000000000000000000000000..72e16cca5b2d57b7eacce3c239809796c9b7fb86 GIT binary patch literal 6702 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 Ri^~82002ovPDHLkV1gda_TK;i literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/eraser.ico b/web/public/mcp-logos/eraser.ico new file mode 100644 index 0000000000000000000000000000000000000000..98a193ee055116ebb4ea967e1261bd2d44f4f466 GIT binary patch literal 15086 zcmeI3O=uKn9LE2fXksmr2vS-sW-WeeA)z!z3K~<>o)kn74@!$5c=Ob=Yr(ek(1S>i zg(3yD75pmgp)Jva7X@z>1vU7A_?5)?6{}|bJ;}adcbM7f?9Ogi`VRc^W@hJ|=lMS~ znU8lTW*KX?&Q7Dv+QEfp-DZ}}7UtW{uCT0~R-f;jX7&{;EMXnG*yo_-6Vrmp#{cvQ z_yl|cJ^`PAPrxVO6YvTAR|)j4xYq%jVQY$PV_WNb7Cmi#c+#3~9hmkKMb&`LBamL&{8i-tcRa{TB|N3yrZWD| z)WEy4NXx%!J`OX(YCuQF{o@+ckf#4p{P#!rpN)6@4K(WUb>))v!0rzn0;B z_iNz)5;eRRRs-Ibz+g%>)Z+M2{^E-W{~5f0_Zs*=PYv%x)bIiRZ>La0E%SeY{~Zzj zr{VpF2KTRH=oHL}sG%4CBURQ=%lzg432cw>KLhVa8r;8XI2Yz$%kaJds=2SLb^h}I ztc?Fz_&-|M2T7l8bPZ4A`6cdo=X8|+!anH0#}-KXY?;>cW4Y(e&E!A7oPYnBPrxVO z6YvT61bhNM0iS?RAngS56O&oJTi!~_*=|)+)UGkhY2LLRW&@gcE#G1cYTmW2W+R#p zw#{Z^TJGA6*$d6P7S(ah7q#`S-|6W+tt|Ay)O%XI%jGAZfKR|D&?pHohO!jaL4QK} zx)=P@K61?381GmM{W0|LIcN0J3C)WzRslokuR{MrwtFAOVi@A{jiu@n<9RpGuH?I^ z$LN2A{z|s{2sG{%#|hRc`MwzKFG24aB=t~<{zLRXDb4`hg>a!x`pV}gXbE`OQ%C)K z=&uUsFGK%YLJyVX?~ae}@zCTvpsVkP_SI4U2Kw(ieYI$J!<_^ks;OT&><#EoNBhS* z>R-ge;(&*b(SPtSJycu&OZ2}E=)Zxs8=H?iA5^QaeQ>K-U%#Wj9_~ZjIXUV1H|+d; zIYhq&?UfLBJxY503A;Wm59<4QpMX!mCs3~hCdUine=@Am0c|3e$+e1sOs-iBW^x%Z z!qA5pgZM2@uAy-X4NGKUYMg@qHS<$x0$h)DkJuSP*XrfN@7_9WbGe>&L1zK|KJ_jQ z{jS0=3 literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/gocardless.png b/web/public/mcp-logos/gocardless.png new file mode 100644 index 0000000000000000000000000000000000000000..5a5caed16cbca338bd50550620dfb649286de750 GIT binary patch literal 1900 zcmV-y2b1`TP)C0001oP)t-s@$ym} z8yN2IQ6C-|{QXq`02B1}Q&LeT_xMyA85jTn5f&8}6A~8r`cx4R761Sh3kem*$42Mp zPt?^)&dx}gnL37sHF$V1aBwb*i#3##H{#+>+}up1r9GXUIx#RDLqj3EyF*`JDY3CZ zSXU?`BN;qAA7^JP000RoC>u339ZO3iett0pF?DVL00y8*L_t(|ob6g?o3c6(g|rO` zB@~q+3f9;1|9{^NwzY&Hg8ShK*TlrYbLr~kQ&|83D%XF>X#AKOe=H`9-RCYw56v`+&+ z_Asxpeqz9m=zHc3e_~>*-g*VT3%?`*K+|+DN3S(6A&y@m01Q;FY`e*NCBY_g`u9U= zKiP>l%uBdQ{}KSli5aha3|f|Lb5rAnrd{+effF29Ws(aU?)LlnnhRlDwO)|Yo}&>B zS6JG&?0uX^(;&#gGL4I!>#8}php^v(Os8914Ijonk-=UzBxBr*wHqsu!!a0Ngl-Bs(s%Da_DB%I%pEo&nuASjIGdJx;JlNXR2-&Qql7uci- z%atq4Wj8n6-e#aV5Ir+6P&O*qw$nn$=I)JvDB8XWP!f${2MK^vdcVoVwpx!x)+?Y) zKkr%ql(M@Fi|eu>K|0(%ZNDA>THK}hy7VgRrOoQ69@o!`W9zK~Aipk9d10YefH?bq z0yjahxuTxagJi$CRf2m!8P;UUbij=pR>;k^J_JyN@3$S0)x<*Jga@zI@)edBwe$jj z%7;P|vbe?z0gVpL+g4n*%uE2y*n_fsp4E+k`b86iS^+f#(nkW&txpG}+&6R%ARDzN zFn%Opx(lP$k7y2S_sSOn%{5&U0duaIMl^c<_A`NTcLHpp+4iI4d2`g6K>AF8Z+y*C zLKCdE{qYpMiYmtSl{PR)tYPqp6E0r}*c-pT$O9zMFlfI|k%8#-b>304*#P9+NKvD8 zAd;IBk3YYKLtmFuF0CXLxYxREM1r;b(tGh%+F>|RO-O{F6f{mDUWe0A9iwus42iO& zYhMqb_*GBH@l?k^dJcS(#w4&CCTuGvwwtf5^*4QC>W_sjqvKe10r)f~uxxSeYC zBw+l++!Ey{8x%4xbt=SS*Jqgx0=Xmv5~e7D2w{d?@vGP6VT;aUFty#Ck+hz-L;8s!Ti%! z4b2uc^|sU?33OWx8I;!-25yI55z5zU0+q0FsEY@{S;BKVU3X{|5o4=Ji5F$vRq1HU zgPij!5iUBkOr9}#Vq%}*x{x<30G3|^}9JJ@0sqWVh{j?7DtO**zK(MH1n zVm2|5T46#GWvx_m-fd@o7#Pwrp$5pJGAXc3WR^&JIXaT*Rm%XH zT!`IIJWgk`S(;211;lREv-ghuoZgXO(%68ocy*=5wq3za=h~IydU3a2@jU}Yg{**e z!j%*5*sHz+ASBlB{}r0B1?cY@0U&b!uUU<+u-Or{ZVhUI^1Zr5R6@*0nh^OBWLnt5 zH$`x*h2Q^eBH#qGLcHD0^9B(TRZo0000C0001QP)t-svcgCn z9v-#DNgNy=7#AHH866iD9jduTw#P{o6CJL;N1?Anr?y3onmvGvIVmb3nWsT6Fd}(_ zHzg(@l%YRXTrE&mDj^{sJU=E74IGD)J3c}tZ+J9GPAM`pBVlPUHaR3)VlHWMG6et| zL`W#;utp&O00=rsL_t(|ob6j_bE`TG1sj9SzK1m|;s5`}XVNA}EUA;UcjnDRUv7H= z>sZ!uEW4Wak&k@jBOm$5NB-AB2q&6t&0^cO{Du5G)m)0@#bY;Q`7BvBbWNPv{2!o@ z8r;+$+dyZAX&QHtKeJOm#HpqIB?hj!)mWSi!Kl6!DlzF(6WaW5v=d_cS)mKIqZ@z_ zQSRG+uoT1&n^S2#)c%dZD5KciJ_|mMBNCv-6f8kg(mGJ{6}rZ$dJsUM$@9yD0#Mpw&A7 zNLrYChL;ZR9OW89+_X6h^9#4xzheRJM;r6YaF}G4d6?;Bxv26;76(K0Z~1_K*_fZ{ zc|{a54ChYM%4Krjm_Lb6YyGUOD@$=mX$Hr7t0Xj=`Ln|RcdUc>>-n>?doQG(67DA} z|1*03PpJkL;^-^=BL9ce*NEHV;zLDu?9cZs^os}vf%WV0f%!SNU73Z$G@Vnj`#3)+ z3rR0nzuD}*CaG~X4sCIc0x3~HwO!-Q)c9=x4Ke^d#XIj1%WI~93iDct>9r~w!qlU- zN#BcqIrxA)pxn-%XklE4U2ZH{sX6)1I}t;|GaT6L?DY%W>CTVnDKq-fd3hy>(?bIo z`Nsd9@$wTtWuk0erNs+{kq8ji5-MwE+$R(P8~wvRVF_87Dz- zGUr6F!C@rTlQtk8T;UQKfIDZr{BrM6_D$t^Y3hxEUf0QGy?bQAvo`2}jm;5Zb80ky zD$aTAYN!;sa{r8XF-9Lgg#g9?U7;V4|Cz}cZm6;R-Dx89p3$nZxa$Dn1$_!1`6V6}obijNUNPr=7r16hnCGwjWd&FV?8f7}bBaN6 zGSF*vPZ7Yf(lklI3fM~$5~`DNmsQivTn)80E&w7JJ8pX$%*e3*YnPg6JKF-pZA-OC z1QTUFOae<5Vz}jDd(AjZSvLCNrYUEE)LHsUk!WZ4G{6c7;9jJ$3le8yLKw_2g(z!p z6`gz;O*aRng#&D41t7WsIK$%R=fKKLZ*hL&z@?3L&8>d{fV2zdN8*ekl!QwpQnhv& zT!J1Abzg#L0l=FzKVt<_1LA-NN`Yv1APRuZL^KovL|Z1M>iY zyv#+6xBs?Rd)Vt&CsaX4P(T``{0T}9gFAx7IjH`vf`s+X2Em9?317lMDA5v>iVNWH zWV{>m@|_4UL%HjLJepU_19MOb15%xqPgntp(VZ-t9k~J6vw#UL4Tm!_B>?wun*qRb zOzvTD{_Z}a%6S(Got=09K(53ITwqq=Lu=l-8Z9&HYkE5dpb4BOvVa-@NXalK^*~x3 z`D%KL)p{6g#0T_7X$cVbXA_F)B}Y+qZ5dka)&wg6V5hI*R_qaTwM$(`49UnwY8tt@2tW*wB4Hq54X2Go?-95a;1Y9O? zz%YF^02<&?^n}PPNzXs^Mpl^^xG7CkS)mUq9KE2gh_`=$wTOXi#z84ys%JOQ*Cdfj zkx$9Ee%PN96JjJhfmuy03Q-N8BOdPoNjmMdXl_ahq#tdk%}&t;VA+{%TCAEx&cKeA zVcm+baxhY<>VuNbBmXwDRh!PPdUF?o5v2G{R4YpLjvZfhiv1O%Cw4rYHl0$+ChRY= ztblQhOjZ55O(lokY{iJ{jmBl}lh2Lv`7VjLB9WBcy!DI^BVb;2}tZF_rAvZ70hh2ZwFi@6pJ4tqRDCq=}D z!7LNxb4_F1E|vy7J$VF9+!l@SMIfFKyTga}(gx3rAoZiq+4;F%}ov9UQVo@f3*gcy;J6@+ZLG0W_tK5$KspB$4^X&AMIv%9$&1@^!uyk@xex zASY%k^GhP|(oGuTW-A*=N5~%@g%Peb_2%fJY+hJ^>u@-fuahyw;2j)F63z8GT5hj= z3@_g#+THmWN!vJcUkYp+XR*C;N_NijM5f**-iSS}7h#@}VMNmqSB`6ai5q(Hn4eF( z$EYHE=B!{V?JfbM%oIYfpfBp;oXkHTU36o^d-`Q4Y!`LGL9gZb@VTV4-Fy14N##c- zekd$aZ_+=IFuOc|lkciuuU?ElEJUkX{e{bftavT|>_YITLneHn-iY41L$!h6R>d!Ev<-jpKI=`m>tz@7M=LP1465I>J`kd%L&P3kosfmF&-`~| z{~?6XA0xK2F_Jk+7<%7TZ(UwdfxtDV%6efg_u9>QgQB0?(NA6N57vH*fpEL&y6>C) z+0czm6>9T^|9^Pb>}u!lKW)(d#UB-XC0000OP)t-sM{rF4 zT}A#~ME+ex|6N4>T}A(0MgCny&4t_z00007bW%=J0FxW#WxhYUJ3j0H00NguL_t(| zob8+0lEfegMLUU!|NqC6WhQB(C?H_f6!*R3spg{K^7*)2E|lhVokxy8#a+{|;Y0jY z7&82}#9NDf9OgA9T8+n_VkS!~gnalzo6+#|QXb#R3M(|cO&oxK|B-G=Zs5OfVug3= zLDHI?3#kW5!wSvdrxLdUCisaKVF2p*F*<+)IDi8j2104V7RR_Fq#l=SG7>;R}YR9GwU0h$dJ zE)HA(R6~VHNge>In?BUG0tW!wO&@B`&I|xTH+`sK1>)EC?@@oyTEHp)=lPFH0}vb) z&lO)D0KG{OxUNA65!pX8=>SxADK9QU{=2oZnVZ z0YLQzlNtc}=rE`N;QNwmb`}Ppb!JCO3IotTM?C9oZBx(zh#hrnqlN=Oh+BL2m<51! zE@uCn34qF7)V47jplJoF&Z3V_XBO!ouc4pnQk^afR{1WXH1fUUsd?y&PnYXo>jx$D%W#=Y8MYd7mfy)~z*-&7PV~2pPL-<OVv$r_DE-8AhUJmmJ3FE|L% ztxo+&-e27M7i>x#>rKl^dk^)mRQ$GOYnBn>ZBh)EXAqLlu6laeZ=90b|6JWO?aL{} z{iBx6oc6~R#j)y(xBnJ8+ZKu%a>f+S=j#lIK2Chvdw1pgQ|CY;OAu49&a?Zz=4dIe z;?=~zmhyfv;Cy|*=zc0Z%W&r}$XU!Vg|%81^j z&ig9vypGG|z{iwF08@Z)6G(I^W3e>F?oH-ZUu`z_JEer`Rw{1Uebc+> zz`}&4Z3S_u^tN)E>2-w7hgs2mH;dROm~`D;$=?IwZYOJhLPFNwY;1U_w{m61@+G{g zM??G}%3Cm=yJbmexu`k^(Z=_hYt7v`;I#A zySQ`vDb{WTh>Dci7|YrBVlCqnnm&XKBcx58*B*BcICxe2He>l%Dbe|r3Xj8gXQCkY z;Pi14lGoqZ5I0y~+b6o?5wqnjLKLW5FXbskDti-}lOS_ZZ|hfa+A|&O5W=29_47?S zz4fCeQ6|W>IQekOLkE1qVptbvIMhl_rgyt1F$r)&@*vgdjY%v}=BDztT0OjqzoV=2i(9G*(U4&FK zmaX47D`xS{N5balC<(C#3o|&ax|8kp)6yAo;-5iz_jf0+Tux}zr&xbnMxt{WOYu!- z#b~}+88Js!OUcjz>;UC4zWD%9W@9JUq*L2{g=!&$qlPF6aUN8+&NEm+U__fVf40kV6Q$ zsO(ZBBx0UkZmc&U=At`|Efe{Tot z-ykDpD#l{{#@T=tvD%FFbC9jAl(*<&G8=7Fbdi>BR1w!2gY98kEElczuuYWl`Gg#G z1n<qrW3b&34 zf2gv_i>_&*^rgciY3k6Eo@_+?Lw^@Y0QQ=L$S^;_%%J{a&#R zh&^|1W0WVBV_4D?W?F8fx*$Da{_iHt-LFbqi-v#rQOqE&*B*>YrC%ybtywv#HGgSp zbrDJGk^Vy}3+a^njAn>_q9A?!FBwO6OL~&Gg!_}o*%o6ui|LP4`epKed%s2}rj&8P znL6POd$wSJo@pDHF*5w4Fj7j!{kz|}bGZBat49~q`9|)4cRfS@hFH1>bJ|Qyel@=K zi%JFOWh=d`e+nkQ0;cyVgRQ)dcdWtW_bw*CK=R}HCS8J~+pp4669((+2J0h~w_~vo zDKpmp2@`QU<(UHk#)wq_QDO#N!1O+5(m`m=kC@9|#tf?9Dvv^LZ8Kg=XgZ+A!fnu5 z5PFM*P$sVmLp4=hNnVL#XR#29BPJ6u`(rI9pqzH{%_lHdR{}=PY3D*+-A!ob;-ps4 zEoVyFp};&5b34ZK4?t!G<>?D36>QkN13Pnm8rVI37nF+s4(#?xoVLjxgw}e^Ey|`t zJS=edIx|eVXZU7FuBcT??2v04Yl7=-#t8JqcL*s#NTx}b!8b2P$OeSua@yLOU}vEa zI)=eo0pZdDfd!p)K)jg+@z6?$4+81{R%AnMLD1EUvLzEpeoyksbC763x=XoQq| zhOsbZMqJuGT|#C;rFAR2kPz)D_KTUA`(iCpldiUdoftNMn?uT~nUZHAu|hObdwdyj zH5jb3k;DvP6#(u*89&ZxD;Nv3)@Go&$u zYy)&kC1XMP`zv9LzJ&mo zG3wKBJa)l$0GWMyYk4gbhDyB#kQo5!cQ%N6TQ79Ikyj1QBz_s?=`flS?#GUZ&L5t0lx-jOBKwP%gOAxBiIw7 z0}o-gpf=}mG{uBJ3d64v-A}@7$>Fs7Ipv~EK)?e*bw-0swZX=LOexG3kRg<(V2LSl z7!V+%hYfWkmOI$rI1OZ80}{w+YJ7p+ly`Fn?gQIKMWVBqlEa78JRk-ujQyoj(&kTQ z-*p6!!SNV|4F$(zkHK0#jR|jtBLXrG*iiYL_9UmQ9V5tZd2uZX83#GM(_p(_VJzRo ztC&ZLUxLhl%o5ZUWUAq+fy_e6d##iG0@a-?B?;VmF%#a7Uh=XXsL?KfJYh;~hJ_I^ zhauM&*?m$b3}x=812hm&)d!cAwU40Tw;0Q3z~2MJ?vS!}8g`I89x;uvTqmREVI?{l z(Y+l_DB-k2Q%#9~z>t`VQYuMw8B-E{kqMuJvGHL-Qw66jQ*W)`Xt0f>yoHF_*_Zwb zDm4VAzhg^f;TP?syHX6(g-U<(hb~C_GC#wY@sCK>jsKqYzMc8gKdpLZ?bGec%l_~m DuB}zp literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/honeycomb.png b/web/public/mcp-logos/honeycomb.png new file mode 100644 index 0000000000000000000000000000000000000000..ac803e66c617f3a3ecba000a5315eada99a33a26 GIT binary patch literal 1827 zcmV+;2i*9HP)#=Rb4KnRDl^5|O_EdjSV`ADWbigaPM5YmzFIh{!@Kkq#DY<@xaL1{ey(Cpzy0EP<1aK|UR_Pzn^Y6a^o2ggJdP6nDOPCvc%V!XKN1Kvcompn#wy zoVXUCZPdiH&ntoP2pqc>pnKe)lhOV*l!7b$5l-C*#h&O3`mJeg^G2XAApGWPfYGodWjZsV6ts?5ocJU__)C^FZv@_G4syOLGUwI*0_yh9 z>6;-w=nPNR&l`d62_bCKJMPa0 zIhw<3Jvg-@6%Gc-&CvXCorfIvlpUs>N>~!6dFVW2;Q`bP_Y{OI*HV1B+i)lsPp-<~ z?UoQ9c82HV3v&DCn-y+$uAH7yq)niC=sYK{?q@XAkD8&Ch_KkboWtwhpgQkC3NjT( zYCK%(i!c#MJ{pNYakl2Udp%^#u$i<>C}@pxw(Zvp1-da3!7|}##Ylv~Ko@7*>Ihn6 z06bde=Bp*HqWP4tNrhArS}W~Sx%^}$;6wf ziA@Y*Ap$i^og7+|5qHN@Cg2Zs@_t(#L2DwRDJUQqnc!^uF@{530BkRG@_3aS447Gp zQ!Adm$3w;9_^PJt1N9xR(=vQ9shmbDXz_ncedq6ar0gd+6&$JY5D^$p;0s2eC`
5+Nl5Rk;ta-uvjBPE`?D@BJE8xm!~aX^Xf%AZ?eC&PJw%7ZKEw0@Uh< zaOq5TmDJKS@IL-v*Q~1~K%S?N-6gfSbmnCJt+vnU9~flg`kI(CBy|GA-B@ouk7>Dx z(o-8GBB;e)oCjY+Rc@ssXER$1pW<(~UQSBT*1`jn=WLo*ckcYh)c^AmbuYbu%avL@ zi7_E_@lQzWzd?bBnJgfPzYFW!NeEA%(CjEaOi|X_gz?+}McMbTqxc!r3~|O7EX#^N zFeL)rpJLU&hL{L(-AQTWlXsEE_W;Px^zl&1vpAF!OQK=#%f%9KC?`9Me}Ff$Dy{-b zDJ;ukczA^Vfg$<_hVT!M5Q!v5Y--=c!useG($fse#m|&; z-uz-}`w?0rH|sGCe@1URNVdz%6RYbmHio3pXcgbSwbnG<_zbt(#epZj#fpM_0J?j6 zIrWD(Ir`!&9DDf%^1aJvCxD57NzxugATo7Nqm=`l!sWJzP>{czqd)sG_tmVO)>ctg zLhVm~!Np5g*!#$C+c_o)sPawd4d1}}@VAMj8iT6bjNZ5}`WzmF=9gf+E!OnJz@jqn zJrAzjI8zxa%1T+~tB7gyRhCm+R7hXnU_y1Kc0fDP+Ye!y{(+>6jVo`J>D z?WW^2eD*6a;W+&P?S`x>C_NOn+2PRWII@&hI2;aSmV{&4NL6$%jxFE4t$dt;#-P^h zMAz(zK2Nkk%ZaG+c6opa!Oi2*zIOmI)b*Ap(JR+Q{XxuBF%~L&8IA|P4;k6f&TX%P zzaeqLq5%KpXx}@4*zk~7jAP#~(Vzb(CY2z!5LNX+^x1zITIZlt>+fL2W012UO_ir3 zZhTX|Z7AP1`%xwYEyrQJJ-HiNh&p-8aaex>R5ZUABUqOGIc^z?*|PoA5|F` zxF_LoL&XvB6sIiC4(Z*E7JVDMyAtn$0N&kDv@b1Dc1VwaGY2Yv1nxZhJ{ft@KF*x9 zMA;$zFZCt}J?}!Om)P|%;PyiP!=N+L5@UzE{;vi$S=-$M4P0MnCDOp?{{U^@s(rkx R$*}+c002ovPDHLkV1n$Fi7NmA literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/ifttt.png b/web/public/mcp-logos/ifttt.png new file mode 100644 index 0000000000000000000000000000000000000000..be5378d753753e5a8d71da41b27d1651d8fb6894 GIT binary patch literal 551 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&B?tI~xGE_r{r~@8U0wazvuAR0 za{T=K92^`#$+KtA{{H=2S6BDcsZ*0DPZkjo`TF(i<;$1t?d=~tc(7r^hUn;MA0MAN zbLJEl7QT7&rlO+4+}wP}jvejo?Y+IdnVFd(At7#VZcCRgZC&xRi-Cc$-qXb~q+-t7 z>o1F%3`AHTD3~jDBo;RB3c3GZvs-aGr;tqU@}n>3yyq|C_}IbhrU-Nd96Xq-b0Z=B z;qk^V(Uk!~N5g6b4#~X!5m!5Dk<`-Mx@q$l?%8qTa>X=@YbQe*Ph3=aq9t`(b0XWL zjP+&mac^iTz|Y8CEqo9ZGM#Dk{18<`oaxAkLBdXePG!s zTdI+InfHZu>CUR94!1f~v*i=Zyls->Zq+{gUguF zY_*AejL^>i`RO~EdL?;X8vjQtRBdC>_qep1 z=_5aP$^Jhx_id{`EA{rt3@$A$ zy3m%y$v5<|^exubwga#nhgWLr`_tEI=r^8o-u=FN&$;)VqX-ER(Sal|4a5Nh(3|cm zU;zan3+ySSs$tjeMr?>kT0|<+8{UYB@h`->h@^TX^+KxOT^IiY`8kT>a~jHnJPy3a z$+0i8d7ItO7RPpjYU2z&GDLDJ#+|7cdgQX#Cl+v5DOK^Aj?<3GqTk$-<&8tB)J{BOGP#l% zbK8>1m4ectdkF|ExTW+LiO=syu~Z8RYa##rN02-9H@OiMy|QsA@%bIsu8XBw&`!I- zXcw^Q7ge-tV$5xKkXPy_l6dq%m|Pbo*TuNEEk!%r$+RI2pv1{X#jof_@4qGUY8E3p z+_EjcJYZ|z?1)QDM9I9K^;^aZRbW)Zd0st{&D$*88t)(nI5K~F#`XvuNNPaBFXA9) zvv_;VWsgN8E}JppwuQj723+^^RvM?S-2*H=xaP7wedxA@KwODPg+G6_77AvWYU7N= zMAY+3%dV4t_l;lmGZtpYedD^IszgM*JO#5%eC%pJi}nP~&(STX1+z@SEVH?9GV}Oj zKSc<@C7kQvN`XG?`9o>p+1l3*(&fJBscJYsh(W>9fTIBlC}=o6+@O%vfL)wA7zFmT zX7{=^0P;0Hm!+Q{7 zNI=u-gG!UQ>#kj+Sd$KW_W%F@07*qoM6N<$ Eg3l>-2mk;8 literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/instantdb.png b/web/public/mcp-logos/instantdb.png new file mode 100644 index 0000000000000000000000000000000000000000..e96dc9fadbdb8df5d60232c93d3916f151e9d923 GIT binary patch literal 568 zcmeAS@N?(olHy`uVBq!ia0vp^GeDSw4M<8HQcwg^oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eBxwD=wjv*C{Z?7`uHZzF0Uc8^mq{Y~6ahP#h z!G*P(9rTo6TAnN}nEZXl%Z%mC$yZ?RX?$X%w+uI(_In7*M z?Os-X{&}&*dDlro5}J(@M+&j>`1?3ea6Eh0_xOkO^FQ7RHGJZpUI|NB+{h$ev8M?M V?6)Y9jsiwBgQu&X%Q~loCIBDksFnZ# literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/ironclad.png b/web/public/mcp-logos/ironclad.png new file mode 100644 index 0000000000000000000000000000000000000000..829c703472a15bd5da3162dc81dec52f7ae65a00 GIT binary patch literal 386 zcmeAS@N?(olHy`uVBq!ia0vp^ia@Nu!3HGf><~N!q&N#aB8wRqxP?KOkzv*x37{Zj zage(c!@6@aFM%AEbVpxD28NCO+iaBROOr+fbcL5m3; z-g_DQAGyiw;4trhBzVR1P^kYvzlNYX>~J4OO)al~mkXTrQ_=oqNq;VcO9}tj`-)eww3tD&BST zD*rnvf*Lk#GkW74?}$3>>UtmZs^jX!W$QLGw@>*YyeVO$hpA=f?|tvve2e!^&ZxR= e)-T`8c84+Uxxd76(>0(VWAJqKb6Mw<&;$SxDwgU1 literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/knock.png b/web/public/mcp-logos/knock.png new file mode 100644 index 0000000000000000000000000000000000000000..2c904a23d7e004764209ac4e89eb69693cee5f95 GIT binary patch literal 1059 zcmV+;1l;?HP)C0001xP)t-sCMG8C z=Gy63L=O=Y^XlHMsGkcB5Wl&wBqSx_+0GvyAk@vmsH2m z%TGU?LN`}1EU890IVve~H!!kDI+H*)Ra8)AV_%Afe?UJz5jK0D0009{Nkl@SAM^)lbB$VJx@nPvD-goDH6c*c|+Zf=v?+Pa^u*& z{1&q`fC8|Z!~ogUt*rl1JeuGL^Z>Hym-%-BoENkJ(x;mJir`1qDu7co0NnTml?*xn z>8xqrbzx4>0vHkdZhQd6p$@>I5CHrH`9K3;@=QJ8#(Pj0-VK1tgGT^x4%EII&p>JL z5Lu8;|8X6tDk1p*tyV%oFF3Z`3({ZpZn$$`{rIkV;OOAyGEIPwiRj&WT+FieC!)(t z__W_uGvRUOpl3oofXh@o&MrSl^EUyQ(PIFFRIR3AGLMMXEdqqgUgHeoY#z1-5G3oS zea06#$i4=E*QfTk9?HHNAYW1YKF+=pAbD+?XMByz0VO~cfW&^ZL>?YP9ZMG?T~4mhCGdDr}U&c5w{!-x>TE3#lFT>W*lU_*shWYJju^}ij8 zhrFbe0DLPqfkXVm!4+9?Pne&m6R;Iobye%pdjf1lR^AoA(W^RWMONOHdvsHbk~ZHB z!?W4j%KIKHfE8Ke$;P2^2wYS&9<4-gCb){M^K3UDErBuEm5tuJA^ilfMMdl7G^Z_- zFF+Mp@9Fkjl44MTDstX0dv%H0U4Ckw>XlnqQwnMlp9uq^CD^`m6~GBJ&skYnSy@?G dSy}yG`VFlAIbd0sSEm2~002ovPDHLkV1lUT&GG;M literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/krisp.png b/web/public/mcp-logos/krisp.png new file mode 100644 index 0000000000000000000000000000000000000000..5a576c2ffae61259f789a4ac8c39e3086e678685 GIT binary patch literal 1227 zcmV;+1T_1JP)C0000gP)t-s|Ns9J z5HeI!YQMk84hksH~fLJcbMzGGxe*A^)ow@2!?szib8>fCZuVqUC&OTWk7ZGsFPc2Y*(r=C?T^`Tn%cm+d!L7Vs^# zlq?0b-;^vlVc-II3Ru^zDPhNEk12pIs*VV-v>Y%&G!H%^KnfGc1Ovwfd?DCMvu%S? zX_ifpRDj@Gz!w55V{lt>s#AeH?}}5%1Ra=$6(M9je9CjVzsbx1Di2C7fNKFi2)uoF zDEvW_00TH#02^J)U%oHkgaSwaKqk!g!JPd);DlLO08@N&!W4ky13O$0CbW$t4Z=ANSN`Uj6VBwjLixGt?^;sGS6}qI1OU}= z(Nj|e=gp5uHI-ZHnZRa(=O7R*8sX+fBwU@4JZFYQLt+-8nG?z|VA5(3_M(ty)9%)YthyUs{d< zxUn$7n$^gVqSF#E0J%7&0CX0oV7orCfNs!q6({Jt0BKOTo(2Va1KAr9`>&HSwmX6+ zCdjNvyU3;iKC)>~7&iogtppqZG%wVF%R?LhW{Qp*lo(SpuvyJi0%vRogymmYgCc<76_5r|N)Iqc4J^+|03IPPA zJ^)yT3_Wb-z9oAJXo_@Dl0h`ysFxlzZUAIlUmLU~WvCPY8$;jo{KUiNFVW}y)W0dz ppO^b<|G{C%kRd~c3>org@((-FKQ25uGlu{G002ovPDHLkV1k0y7aafq literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/lorikeet.png b/web/public/mcp-logos/lorikeet.png new file mode 100644 index 0000000000000000000000000000000000000000..9289e9037dec908a28fd6ae9c7fc306b385b4bfc GIT binary patch literal 1069 zcmV+|1k(G7P)C0002AP)t-s|Ns9( zNZjg4A^OV_|0(4?Lfif6v;T{KrGs+IfHJMeyG@}ivm?ZokteEZi= z?rBQ>?5zCUZ~N3)`On4n&(QLnkN@EN|96)DDiW!%$0009tNkltTS(fnDkqcf*)z{4EO_3hlgui3KgkhLZ=?J_8vVc4b>ic}k!8<__xISEt3t(Uk z6agzKxHG3QbH}K_O?>r=Cjxb|0=LmcpB@;Q6<9s*{q7`UB&*F@LuM~ja1LtQ2mU6y<6G5g8m3&HfFsVn)s0iCZ3^vRQ20REEwj}@H2!go?TAUg+F>!u4PP$KhG0p_V+yJg$9AD{%r zsTLFh>WhKWe)=cEfj;{rTi+6sCHK_c**yyWiycWtN8nx6=a{bl<8_XSv$ z)A5?eKq7FXo`b~whf~-sH#7N7kWrkTL7dJU;xVo-Y`=uC__{zR)tyEG;{9|Ru&&m8^3zpd9c>+OAgF#@fn5aJ8bHGP{GI}172V}e*nNoc z_EkDW^(Eda)zc1)RXcAG#aE~Wp#xKD5&d1Q1fVxB;nhAry4`LyMttmi!rywv!rRp% ncE+<21VIo4K@bE%kpGE4%>_WX?I}e~00000NkvXXu0mjfKH?dq literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/lovable.png b/web/public/mcp-logos/lovable.png new file mode 100644 index 0000000000000000000000000000000000000000..09b6a1fa797af7f8bb13c1b3af31becfb23cc647 GIT binary patch literal 16832 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 CN|8$d literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/lucid.png b/web/public/mcp-logos/lucid.png new file mode 100644 index 0000000000000000000000000000000000000000..6ae93bf1e3e6b0a88dd557cd481e1d63dceb89e9 GIT binary patch literal 559 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&B?S0{xN7Ja|NsA=fkEio_wNi0 z+ydf?+qUnJQ`T11G%zx=Wnd7gs;R&K;Gvn79Q7kcv5PZ{00w zG7xA>4C9dI5vmKh(zW;h?lqUAx?6mX^WDu&-}l{w{WnjALz$0Ii+~e{V#@{l^IGS> z>#t&pdw+iIy^7Q8R8CzvHrv;A3Hygq=Oye9u9Yrf->~Ox=M{!)1@k7!HFUQf<7Bod zwtdOC#!?0(D(-AGSD)j-S-ly092?#)ojqHh^~3sur^Q)kJd~NK&k}L;SU2OLczdA3 zQ9!-?h8IFVD;rF|PHI}txbNI$)$2F>nJV_`YsO|W+HHH0)o@;Sm)L`SuGblRw!M&Q zXxH6kld#EEoZV;pi$e_s-FjRb(xml*o-%xnF0ph->DFVjh&}a_Ss5$V!%bFTJVZ(#J2mlsR8~%jWZAVf^{{^nWo2Z>C#Y*5AH)dfCcP9*5_AU%t`% s(DHiWBT+^FLKpm9ZVCxa0jK@fr9TLZa(GR*{sHo@r>mdKI;Vst02P1mfdBvi literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/mercadopago.png b/web/public/mcp-logos/mercadopago.png new file mode 100644 index 0000000000000000000000000000000000000000..6ceff2f705a01bf96d7174b9077305692894a40b GIT binary patch literal 1296 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 literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/metaview.png b/web/public/mcp-logos/metaview.png new file mode 100644 index 0000000000000000000000000000000000000000..cd542ccab119845a1586e49760718d5a4743a88b GIT binary patch literal 4386 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 literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/montecarlo.png b/web/public/mcp-logos/montecarlo.png new file mode 100644 index 0000000000000000000000000000000000000000..31f84ee430e2e4f2b450e5bcac399fdb05930001 GIT binary patch literal 1051 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 literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/otter.png b/web/public/mcp-logos/otter.png new file mode 100644 index 0000000000000000000000000000000000000000..a90f31dcb1edc0f1ddfdb039a026458930f303f9 GIT binary patch literal 655 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&X$AO%xVjhky#D$h4KP&wXUO}{ zQ1-uf&wt|y|BKfA-+uM~I>|fTKwWGlL4Lsu-vZ~XS)P*RH<5vXiOeVlDm-^cMYc4}-=Zxbk4TNu={cp+W(l(Q&K<;C;KTZ0>y#BcA<8!0j}zV+&Y5{N1wTRcXV=2A%r7-DepUVnx?8JMBufPLPnaW7xCR zL6lLEm8;>_g8vc%Z3@wjF^M(r*+nK@xT3CDKdq%uD({@bs=FpVFZaD<3f?L3@i}+k zpDZndIsfjJPk&Tuob))osq5qH9JiBYK5o{_eILKAC{}p*GNbORgV5)Pu?`(1RRdgP{p9IL_CQ^#1ja*2A0OUWHWsNfnrZF zqgvBwG##V8&UwP%F#@+Qtih}x(69Rx08c((#+o%Oco8Yf?kTl8 zqhc`(**!t1gq(^|IOhlbWb zrpkgBG;7n%aL%SjGb{ z%Lo6emgfy;vR5RXcmz!y>Ag@~sOzlmQD2qT{_@*SqlgITtd z*qHmSe;TE%#QWP>^A&!SR_AS|6mh3Htz}j95mr+XmYf))&riCvoC&+rLhszRsFY9w zQ1chkFh%1wVUe|c34~lEU;K%t>3Qz3VcXQ>`j-(p*AI*}1BJcz(3NZ1#8)l`%q&~y zVS{GFQN41HxZL2J6m86?b_JK+uX^MN(wfyHmRR| zm83vl$;G88Z4;W5VlvU$rtR2t0Jd)=fzb1jCRj)gs=C{BhAdMbEorW z`bX01pZA1J?_sIi;}K2iGC2f{PzZo&=8U9dxa5qn1!g49!uM zq&&Bw;wV1^v*VjzVt}t!UB{MZt&K@laW@V)zp^sedx)ubRpUqo=Dku3| zP~eBCc^IMEXO9%HxKv?stOS=L$#06fnH(LvZNxd5aA454J~x_>-#9LdC9coQZyx%D z9ZNHeGHLZ)Q1@4QpZQ%j=G#<%?!ssuwU$0V1j43)hZ`!YgA)ubToO>t|XGfoI zEZ4_rl!>{bg%kf^KamHQ3$&om_$d+F41L;SwvF&AAD#C4J%(oF24W$6|p%JoJ) z7&?58x9h#;U>BQ3)gTd6Jv&%X=xQLWq*6`m)Y?nQo^D5pXe9+!*3i-Qt6`1h&Zuv8 wxq2TiE*fXK@LXDcFAhz@Z}qxs){bb_ZSaDJ6Tba-@I#2T6xizW@LL literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/pitchbook.png b/web/public/mcp-logos/pitchbook.png new file mode 100644 index 0000000000000000000000000000000000000000..b11fb49bcffbccc9c9e2850bb8a41e2f9fa38156 GIT binary patch literal 734 zcmV<40wMj0P)oS@{}ee659~6lg~V-Gl|5_Gi6Oiwd+Burv|$r^upSF?wuAUK zBA^T77=2X%3$YVlHj%{6MOJ{n%S#|1%?R$9>Ex@cE;eJXOF+Y%8%( z3HwXf+amHQAxLMSO29BSR`_hkQyjBpK~}Jn;<4& z4?e3PhrX;mQR4Ge*#t!bR^W#O@>@c{^Acujh{jS8PziN_Z0liqB zDBzTk^Y2CMXH|TCk$~?L$sb}8TT6V7r%aR=unvn81>DQp!rT_}{!(25eTn3R;3Hfz zMYxTB>k5c{O%WOe#{7tVBz2;OfMw#TRD_PKZI9URr%u#3iaQhiZwWWu(X2m)c?Euz z(cdhfqr~TikR3z0u`c0+n;Us&ysm(vOX)hk#&21_51$J+Ur{lVM_XM1&2`&1I3NVs zX>3WIFhgu*W}p#-&vIj*WaRtt_!Y=`S&~y^t*^KkT1yfc572%1Hp3g<@{xSi7 zV+VfD`V$H7Uc(jK#9u<{O{Nkz3wV${4a5$TDdC^aF^twFD-+O+G5m^^xv?|Yt;Qjf zg0hlqF!%dMAud`dR3DJVG6)0N)!twi{!soT{AJE--oj0_S QOaK4?07*qoM6N<$f)0FGiU0rr literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/planetscale.ico b/web/public/mcp-logos/planetscale.ico new file mode 100644 index 0000000000000000000000000000000000000000..5f5958bb3d2abd80596c1d11f7677bf25b07a9c0 GIT binary patch literal 1150 zcmbW0!3~2j3`LF9TQ5PCdgj<0lQ01cP{9P;dSn~A0S6{w0@xt+H@HfH03|4~;`seI zBqj>@GlqDK=y@T!6VZb^yVx`O*%0yC?K*auPlGWg3d6AGZV&XHV;V5PCl%JOQRarFHtz5xsoKFL}`81HH zHte;gffye@41?lgeHuRg2cAvb|Ka1^{AajK_cU$9jF%_DTvNkIEN(bV0fGSd;2T#ph{F+kFfvD`=7CFe>5|}I~7whfn0IA{Xy_Y!(p`a%S zfz(k|)`ND+e08Gpc_KFI7h-%+ObEm!JTx-seqA9R0#S@~a{|whgFo*3tAo^FS{o5S@on2#$9FfGP__aK3B?qCqs-J~SoWC?-6 zxW!Q$VabK220Ctd>1kz`j)bDbUjz$AzJ^-24ACWeyc4nWoosC$ZolD-zWndIe|+>m zqxF(;6L!2IxGoIV>Te#p5EE*~@dlXPiJ>BL$F$j;nFzF+yQW3C{vG5G3Fe@Ay(P>H z;VwrqEv7f30gZ+4U+w(zJQ6MC3``ECooa+X&&o4a`sR3;8m-FTERG6RhM#y>wFwv6 zOv^Yoo!cKupv|s~VFubv>&f|bwma?FS;jEjelpdri0x}G0auqvNiPh9nnYDQ<=X06 zK72CAi?k#b*qL2+wXm@+Y@n@c7b5RvB~yS&megH~@fjbARR-8z%|@gfG)qaP`uh z!=vy;^)L5O0HUSTNJ2^R+#03Dyt#s+*trCek;)Od6|AH%yiX?}&)Y|#nSYpNL9ymL#_o@}NMkF8J5yK9qKtw~f- zDVuPQJGRM^O46G&iF@0{$n?kiCq4;Y)n>f&R7gsvCc2?`A*T0o0$7E!Gu)@a@7Hz% z!UV+dN2O&Culr5ZrP|Bbp1H5O&EC@D$RQv3clWd2eh$Y`aD5g!VuXVYsVBPVE_&Af zKB}?$>!sumU497U)LEO@Uu|un-S*ZWl5-kFWiXn?fyL`H1jIR58%Nn)!J^{ z9v{_%ifAVvc8Z3Y9~aAmek4_m4-*XmY<`70LY2>5+fFqvlkUs$-@#*vdAgSFRt^GP z>4OauuxB`@xR_m--`lHE?N`2~ejE-EX*-nGqq@d^*2JsZ?$KRr2_094tFe!*+F`b4Pq2eGeFF z2}b=1wJp8l$oKRhrtBgZOz6 z@uE}>msSlI72B(hYn`Smfj0fTB%S3KMh2qyR)YFP%Rq&R=_0}W!n~EAd1?tD+qCX#I){Icjj4=<+_}2F?!i;i)`@`4 z!GtOtdv+6u9Jqwk4upj(^={VD1;8}3vIr> z2vuzv8|@*t^Aeu#UPY{9#;XlV_GE4v%E-KmUzT+HZ@_kJQ@(t|V?jwGu)IKrf$_$+ zPg?CR@P-!n7=WTa4QB#Fi#H0ag6S%!rVykaJpT2oKUQ?}61QB+Khg{O4s(ljcT+xS zrd-WzUw>o5O|3b1^kvW*_HxUF{HK*ZJ}7a$YJyatpU@;atdGVWx$W;?P3m{k6CyqC zI65kW|BlRA_j3D|F%7btyuHp#K?0b9QC!g|_h7%_{N1^1QK^^fFz`Lx`pVMV%;(cu z)y$?!w1Sg2U6@8R-Hs~+mqD-AMB#dY+`&6BC%;wwzl-;68H@{W${h+Tlf5K}o3ocw IjYA;iAH6XWZ~y=R literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/retool.png b/web/public/mcp-logos/retool.png new file mode 100644 index 0000000000000000000000000000000000000000..18ecc700bf54b59b8fb135946732818fd4633e0e GIT binary patch literal 1307 zcmV+$1?2jPP)8ya+VGW@loZpO_>hBt%6*d3toItD`_cKC7*yVq{-1F)yvJr=6ac zgN1&AgMF8oktir9tgfb7TUQqs7B4R@mza?!CnsfQVI3VEH8wPBY-fdre~F5Oo1BzF zLqLv?h(AC+u(GK&H8iTLqpq;0Ha0YIb8RatDw~{@fPs6mw5zeRt2j6|NJ&SLl8dsm ztc8YvZf|NlJUW(`kW^Jtc6V_nCnk-Lh?SO)Qc_P*QcrAcXriQ?nwyj@E-a&@ojW@@ zARr%`ot0r?Ua6|0U0qpcXk$l5MTd!ku(7E&H#H?DB#MiLR##Johk;X6P^PD!Z*Xg| zv#NP|b*8AGij0MPeRp|#bvHORrKg`SFfMg=aZ^)Ja&vAZB_o%al2%qzfr5OWpqY`A zj6+00ARr(gA08M(HE{p{0>DW`K~#7F?b_ph9eWhU@fDl1lCw4OsT-R$V$`;6+jhgc zsdb0V6@>HOndj5zcLm?K3-T|;7-Nhv#zI2F!ksN5G*XNf6&({B7w>EdiAl*RVy?(k zOHE{@iLuiE^QfV`VPYtsF|+yuwiqcRQ_Yo?Ek?@8RdZQ+Vx<4oWK+aQQ`KbCh$fn7 zqKPJ&XrhTGnrNblHqmrM^bADw%vpeFot+PeE-19|&{|ZSjfYk(DJ?6n7^%uC18Bo} zs%vT^(9lEG)i>awRqI0m(K^QlL}z9IqUX*7L|gM^bS>}$q8Anbq8BX&MB7UM(IQJN zKy*W6E*@I!rsfs|wE0@w+B@LTB2}GTcxaKFYCv@UGCv+#mahOrhpYrd%PK^48qrQi zG|@y8P4sF&w7mupy>=ZQ+Fozrp~Dgs4ZUIGCPhPU-V(2qgtoVC+rDGxIND{YP8NFi z9uM5IX74^#H1z%h8q5wJa=@H_*rUNL{)hwUhNBwPj-@z&4n3~H?8HfNpv@Z0_MH+m zblvIbd^e%bWbGWOv**rN*y0+r=fcGbF_1~L=h9_c(9l;RMBvb!f``5;faqpK^fg5E zG@^+nnrNb(j_B)%=o^UWoB4ofon`}~Zyf!#cJcxb(|{q8*^^yu^7f6!#3p@(|- zC@E zqKPJ&XrhTGnrNbley3w;;Jvt^^*WY5d=xhnF`#4UN~pM^L643)&nIz5c^7oF`9DXA zOZxKFucPXCe~7rIrf=Ub{D>c+xSxZ+Lc~o){f-D9p|C#=ka1#+F~%5Ue*t{}HoVvs RK_vhH002ovPDHLkV1f_$I9&h$ literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/salesloft.jpg b/web/public/mcp-logos/salesloft.jpg new file mode 100644 index 0000000000000000000000000000000000000000..890b197e8b6b20b568cf35271e5c9a588dc83d4b GIT binary patch literal 688 zcmex==2{JMZGX6ipAj!bM41`F4m5rT&kp(EFCIF;CkQwL)Fkob2W?>a%U{f><6cTYv zEL?bz9jH!%k%1ZHS0up1!psVkQ36`T#Kg$VijZPt5@c2sVlfO9R&p#{`2Q9I572a= zm>`2agTqyJhJ@B_7qn+?+BK)^MgAm-Q`~)4?5P^^%qNw-tC!@;L@T)w+9Dj#~uJbKF|m6UA4m^#;)zxK_q?O7>`I}2{| zE>&OPz_8Gv^aP9iyUp9h-n{gdI@@cpcTsWT`y}E2K!Ka-%JXKe zB03t$3Qa~v78jV;-2Ke=&f51~l-g3O6NlvbK4v<9srdEUW6|}rP`!ozk;?TACwDKt zb|k~}LsVzP;e+>cM8aYNY}dL^s`%Kr^kn}WnY`Jdbu5+DDqHs1{B2(URyfz@q)W*L kTSmJHMSjL7Eo45gsnVPI<;Grf?YrI6)mLh-vj2Y*0L|OmKL7v# literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/semgrep.png b/web/public/mcp-logos/semgrep.png new file mode 100644 index 0000000000000000000000000000000000000000..0c6e2f5930461b1febf3f85da89ad97d6bf854d6 GIT binary patch literal 1010 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 literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/smartsheet.png b/web/public/mcp-logos/smartsheet.png new file mode 100644 index 0000000000000000000000000000000000000000..855dee4142ce27173c65e0b2d1b50214fc7a0f9a GIT binary patch literal 2473 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 literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/statsig.png b/web/public/mcp-logos/statsig.png new file mode 100644 index 0000000000000000000000000000000000000000..e63730a63701ce4d3c7c29bcb3a65260d46ac048 GIT binary patch literal 2419 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 KMNUMnLSTYo7YP>t literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/teamwork.png b/web/public/mcp-logos/teamwork.png new file mode 100644 index 0000000000000000000000000000000000000000..256e6a063e04b8b738554efd8733fc3d8b1d22af GIT binary patch literal 3174 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 M07*qoM6N<$g7JwTY5)KL literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/udemy.png b/web/public/mcp-logos/udemy.png new file mode 100644 index 0000000000000000000000000000000000000000..0000f4612b1df0c1088f2b1446aac78d8826508a GIT binary patch literal 818 zcmV-21I_%2P)C0001)P)t-s|Ns90 z005*l@YB=NoSdAIk&z1v3qe6aeSLkSGVtx&{MfGeszLFiF7Tl$@cH@qxMuTTUtiX# z_}sSn{rdm;@&4z{`<@{0;lTR!>HT(gb{QENA|fK=S@OJb^V6gFI5;?{sHjg*Pc{tyn*aa; zR7pfZRCt{2nCo()KoCZ`s5r_Ds30IBgDWH|Uhw@NZb{h4a8XmWX{bu|`AJjt9eSo2 zRFV(`K@bE%5Cr)@wsWt~c>9m;>=ssE@s_(|M4`lt`^k?@hbkXXCz*5~Zzp;Y{{c(q z9mjhYns>j1Fx~BPE4Xi!_)i7rec4s~WKXElgeplVBe^{g))HT=!_)@PU+fy)7Zvuf z>tHQ)=W%>7l6%0BoE#gAPa6GT`T=SkT)mz~=;@F)F0#`WMqpasd@Rj3op(@b*NG0a z3e#%;DLWQV8t)z2y#OWWGR8H z?;QawK-np7KlrRgF{hvcguN{u-(g*J1}Z=pJv=}0;-f?11ekJuec&!l3MDW%-S6CH zElxlJ_ID2%ueT3%1VIpB`1p$zZz&J%<#7NbFp%#ITgun6to9(?}(8Te!@zhuM#^QDddQUGiQ3xe=Pe%nj> zM^WobUL}Iu00qJANj`A@3yi^|_#5vcKSzz);zt>L`|kw9S#=(+5!eCn07K=&NDF;` weVwf`4)g`^(xRZBa0EdR1VIo4L4FH=0TrbvqnKwaS^xk507*qoM6N<$g74>oRsaA1 literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/unthread.png b/web/public/mcp-logos/unthread.png new file mode 100644 index 0000000000000000000000000000000000000000..8ca92046e28b17b1b69824513970b116855f3b13 GIT binary patch literal 1723 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 JPDHLkV1jIqBVYgk literal 0 HcmV?d00001 diff --git a/web/public/mcp-logos/zapier.png b/web/public/mcp-logos/zapier.png new file mode 100644 index 0000000000000000000000000000000000000000..fb47b19346fc9348eda4a75cb05241aac2b794fe GIT binary patch literal 1799 zcmaLYi9gi&0|xN#jB!MSP&vo7jvQN(+~dCQGm|KWA6g8#*7coQQ7Cd{T$#+e#u3Xz zLOI4dhggYd+}XsM*_HFNe*eHeuh;Xu|AgnEqrC+$w}H{B*%w93j$6ez*!KOLIA4*wl;tz1m=gq!45Ehz{WfvJ_NE5 zD2WAM7$D9J1e<~&TQE-tLApRk82G9K2m-X1z?>I!kpOEG6oiA6Fi@BXCTL)?2T+M1 z4F|$aL4X3d7XY&3fuk~bfCbm}L5vefz=GHiP@V=lC}5x)`1yc>Kv0(k$T7g%3Rp^m z781Z;12s8-QVi&?fZbJqg}{9~fX4!I>9{UG9)j5au`)GsjV<1M#^bT5!%xfk^~rDL z)s7W#COf<7oOgkD)QWWNpS!?btHGeENv(b@;+y`3QGuc_a^O&>uma-ZJJ9a9fP4T; z`*NNC4-Ut;x{u-y>3bMyMmP%1;)>qgWU;MnF=`#k3^W?g-9J-o*zF@)F5FT@^`J`a z9-exbg_~I?N~A#tgEXqj6&j}u{UYjX4tu=fr;MT`lD&Gc-_t#}c23JV?- zRZnd6JfKH%5HcxY_5v=Cs#taL@tF|oCQ))a(!2l0w3{`WZji)i7kXV9jN1%b;H>BL zl{9(faBb+k{BUi?jj6?bb=%;m!sN)fc-_69*`9qJoiZ307}@;vq+!>z3UTb#K;6c1 zU<4u$mcG%J`^m;qEdLAzz3v!>4N{yzt#E2~Wtku0dYV#jMQuG(OXaM#ta|4!T%+RU zzOsJpztH%@>ij7EY{`oJQZ{REhUz7+I;9Kw6*$aj3ozLFx zOWd*2jnz2EAu}$%Bi7O9e=%UiXimWXPvYMi$NFmS)_EA_Tx;vdDsmf5x%wh|36D7J zdVZvBZpOU8Kz`4RjvdwulpqD$8tctvOYn)veluE251G3gaEjT+Q1Ijsar(0q7S?%Q6V3#D##9-AN*;HTK_3HnP zg|uVCOvGDbt+#TF6Thbb{f<^eJ8MR+g(^PQyew|!(|AX^qhr!NPzl36zS0V(-@!s! zxjbq3qYl?1!_wN%11?O?`gfh@5c24cO*ODLs`tBU%O5#@ZybL&9r-y@S!HIBz~Qz_ z?~mro!X#LD|CHD@2A L#{+@v^7(cfJ;xD>3t@sP{-Zq=;5y+*Xi}ZrC7ZOW6%C+>+wIxFw=I*Im>_^vpRVX|zsj+jvI zlFj}Pi2A4(tA@nZNbIdVWT24WDs6+YioASxzO#L!vV4$85>(SE6e8~Hx4wER#_`C0 zUaor@TU8n(vYanpDws#Ed#gB*KV<<=z+LpXE{R-#4Zy zfzM1TV{>w(`g3n*g#`|blG0OB&t^;AC-IM8S1Gf*>XViv_D<~K3gIKng8Q&uT~)qXd_Ih^I`u7;-B%91~!la89k&ngX8Z zItjRg>SE5D&HK8%RA!4X9wzwDUK06p1!yj%lKW#S{Y)uRY+`gYl z`|gNBm%rOy7y~6;S-D~DsnU%aFMuXeDp=|gk4ZQGkEqj#|9}9l5R#$ywQ$~6vTDW2 Pvq4s7_NMj5zW4qGm6&oq literal 0 HcmV?d00001 diff --git a/web/src/lib/mcp-logo.ts b/web/src/lib/mcp-logo.ts index 91d804a..0562d20 100644 --- a/web/src/lib/mcp-logo.ts +++ b/web/src/lib/mcp-logo.ts @@ -2,25 +2,104 @@ // // Most provider logos come from Composio's public logo CDN (every Composio // toolkit slug — slack, linear, attio, hubspot, … — resolves there, and our -// native-MCP slugs mostly reuse those same slugs). A few of our native-only -// MCPs aren't in Composio's catalog (Pylon, Dialed) or are our own service -// (Tembo Agent Studio), so the CDN 404s for them — we ship local art instead. +// native-MCP slugs mostly reuse those same slugs). Two escape hatches: +// +// - CDN_SLUG_ALIASES: our slug differs from Composio's (they use underscores +// for some multi-word brands — new_relic, help_scout, …). +// - LOCAL_LOGOS: the provider isn't in Composio's catalog at all. The CDN +// doesn't 404 for unknown slugs — it serves a generic fallback glyph — so +// "missing" was detected by hashing responses against that fallback +// (2026-07-18 sweep), and we ship local art (official favicons / +// apple-touch-icons) instead. // // Pure data + string building (no server-only deps) so both server components // and the client logo widgets can call it. Callers keep their own onError // fallback to a generic glyph, so a missing/blocked URL still degrades cleanly. +// Composio catalogs these brands under different slugs than ours. +const CDN_SLUG_ALIASES: Record = { + newrelic: "new_relic", + launchdarkly: "launch_darkly", + huggingface: "hugging_face", + helpscout: "help_scout", + surveymonkey: "survey_monkey", +}; + const LOCAL_LOGOS: Record = { "tembo-agent-studio": "/favicons/default-tembo.svg", pylon: "/mcp-logos/pylon.svg", dialed: "/mcp-logos/dialed.svg", amplemarket: "/mcp-logos/amplemarket.svg", avoma: "/mcp-logos/avoma.png", + // 2026-07 batch-3 sweep: not in Composio's catalog (CDN serves its generic + // fallback for these) — official favicons/apple-touch-icons shipped locally. + aha: "/mcp-logos/aha.png", + atlan: "/mcp-logos/atlan.png", + bigquery: "/mcp-logos/bigquery.png", + carta: "/mcp-logos/carta.png", + cbinsights: "/mcp-logos/cbinsights.png", + chargebee: "/mcp-logos/chargebee.png", + chilipiper: "/mcp-logos/chilipiper.png", + circleback: "/mcp-logos/circleback.png", + clarify: "/mcp-logos/clarify.png", + commonroom: "/mcp-logos/commonroom.png", + consensus: "/mcp-logos/consensus.png", + craft: "/mcp-logos/craft.png", + crossbeam: "/mcp-logos/crossbeam.png", + daloopa: "/mcp-logos/daloopa.png", + dayai: "/mcp-logos/dayai.png", + deepl: "/mcp-logos/deepl.png", + digits: "/mcp-logos/digits.png", + drata: "/mcp-logos/drata.png", + enterpret: "/mcp-logos/enterpret.png", + eraser: "/mcp-logos/eraser.ico", + gocardless: "/mcp-logos/gocardless.png", + granola: "/mcp-logos/granola.png", + harmonic: "/mcp-logos/harmonic.png", + harvey: "/mcp-logos/harvey.png", + honeycomb: "/mcp-logos/honeycomb.png", + ifttt: "/mcp-logos/ifttt.png", + indeed: "/mcp-logos/indeed.png", + instantdb: "/mcp-logos/instantdb.png", + ironclad: "/mcp-logos/ironclad.png", + knock: "/mcp-logos/knock.png", + krisp: "/mcp-logos/krisp.png", + lorikeet: "/mcp-logos/lorikeet.png", + lovable: "/mcp-logos/lovable.png", + lucid: "/mcp-logos/lucid.png", + mercadopago: "/mcp-logos/mercadopago.png", + mercury: "/mcp-logos/mercury.png", + metaview: "/mcp-logos/metaview.png", + montecarlo: "/mcp-logos/montecarlo.png", + morningstar: "/mcp-logos/morningstar.png", + motherduck: "/mcp-logos/motherduck.png", + navan: "/mcp-logos/navan.png", + otter: "/mcp-logos/otter.png", + pitch: "/mcp-logos/pitch.jpg", + pitchbook: "/mcp-logos/pitchbook.png", + planetscale: "/mcp-logos/planetscale.ico", + quartr: "/mcp-logos/quartr.png", + retool: "/mcp-logos/retool.png", + salesloft: "/mcp-logos/salesloft.jpg", + semgrep: "/mcp-logos/semgrep.png", + signnow: "/mcp-logos/signnow.png", + similarweb: "/mcp-logos/similarweb.png", + smartsheet: "/mcp-logos/smartsheet.png", + staircase: "/mcp-logos/staircase.png", + statsig: "/mcp-logos/statsig.png", + stytch: "/mcp-logos/stytch.png", + superhuman: "/mcp-logos/superhuman.png", + teamwork: "/mcp-logos/teamwork.png", + udemy: "/mcp-logos/udemy.png", + unthread: "/mcp-logos/unthread.png", + workos: "/mcp-logos/workos.png", + zapier: "/mcp-logos/zapier.png", }; export function mcpLogoUrl(slug: string): string { const s = slug.trim().toLowerCase(); + const cdnSlug = CDN_SLUG_ALIASES[s] ?? s; return ( - LOCAL_LOGOS[s] ?? `https://logos.composio.dev/api/${encodeURIComponent(s)}` + LOCAL_LOGOS[s] ?? `https://logos.composio.dev/api/${encodeURIComponent(cdnSlug)}` ); } From 2ad61dd92c9954281803ccd784a3d8776cf98589 Mon Sep 17 00:00:00 2001 From: "staging-tembo[bot]" <217798655+staging-tembo[bot]@users.noreply.github.com> Date: Sat, 18 Jul 2026 21:08:28 +0000 Subject: [PATCH 3/3] refactor(api): generate native OAuth allowlist from web catalog --- CHANGELOG.md | 11 + api/src/main.rs | 1 + api/src/native_oauth.rs | 382 +----------------- api/src/native_oauth_allowlist.rs | 203 ++++++++++ web/package.json | 1 + web/scripts/gen-native-oauth-allowlist.ts | 124 ++++++ .../lib/mcp-providers.allowlist-sync.test.ts | 59 +-- web/src/lib/mcp-providers.ts | 8 +- 8 files changed, 383 insertions(+), 406 deletions(-) create mode 100644 api/src/native_oauth_allowlist.rs create mode 100644 web/scripts/gen-native-oauth-allowlist.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index a0f272c..bc05d4c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,6 +54,17 @@ they are no longer release versions. Phase scope now lives in docs-only servers, and vendors with no hosted server (Workday, Rippling, Okta, Snyk, Perplexity, Loom, Fivetran). +### Changed +- **Rust OAuth-origin allowlist is now generated from the web catalog.** + `api/src/native_oauth_allowlist.rs` is produced from `MCP_PROVIDERS` + (`web/src/lib/mcp-providers.ts`) by `npm run gen:allowlist`, replacing the + hand-maintained duplicate (~360 lines of consts + tuples) in + `native_oauth.rs`. The allowlist-sync vitest is now a staleness check on the + generated file instead of a per-provider drift detector — the failure mode + where a catalog entry lands without its Rust twin (the Dialed regression) + is eliminated rather than just alarmed on. No behavior change: the generated + table is semantically identical to the old hand list (184 origins). + ## [v2026.7.2] — Native MCP catalog expansion, connection search, Zoom, inbox delete — shipped 2026-07-15 ### Added diff --git a/api/src/main.rs b/api/src/main.rs index 888007a..aaf01eb 100644 --- a/api/src/main.rs +++ b/api/src/main.rs @@ -14,6 +14,7 @@ use tracing_subscriber::EnvFilter; mod auth; mod crypto; mod native_oauth; +mod native_oauth_allowlist; mod pricing; mod routes; mod runs; diff --git a/api/src/native_oauth.rs b/api/src/native_oauth.rs index 4c18d4f..85a3939 100644 --- a/api/src/native_oauth.rs +++ b/api/src/native_oauth.rs @@ -36,371 +36,11 @@ use crate::crypto::MasterKey; /// first tool call. const REFRESH_SKEW_SECS: i64 = 120; -// Native-MCP providers TAS can refresh tokens for, as -// (mcp_server_url origin → allowed OAuth authorization-server origins). -// MUST mirror the web catalog in web/src/lib/mcp-providers.ts -// (mcpServerUrl + oauthAuthorizationServerOrigins) — keep both in sync -// when adding a provider, or refreshes for the new provider abort and its -// short-lived tokens 401 mid-run. -const ATTIO_MCP_ORIGIN: &str = "https://mcp.attio.com"; -const ATTIO_OAUTH_ORIGINS: &[&str] = &["https://app.attio.com"]; -const PYLON_MCP_ORIGIN: &str = "https://mcp.usepylon.com"; -const PYLON_OAUTH_ORIGINS: &[&str] = &["https://o.auth.usepylon.com"]; -// HubSpot advertises its auth server as the MCP origin itself and uses a -// CONFIDENTIAL client (no DCR) — the refresh below presents client_id + -// client_secret from workspace_native_oauth_client when the connection's -// metadata says auth_mode=manual. -const HUBSPOT_MCP_ORIGIN: &str = "https://mcp.hubspot.com"; -const HUBSPOT_OAUTH_ORIGINS: &[&str] = &["https://mcp.hubspot.com"]; -// Fathom's auth server is api.fathom.ai but its authorize endpoint lives on -// fathom.video — both origins are allowed (matches the web catalog). -const FATHOM_MCP_ORIGIN: &str = "https://api.fathom.ai"; -const FATHOM_OAUTH_ORIGINS: &[&str] = &["https://api.fathom.ai", "https://fathom.video"]; -// Dialed advertises its auth server as the apex (also the MCP origin). -const DIALED_MCP_ORIGIN: &str = "https://dialed.day"; -const DIALED_OAUTH_ORIGINS: &[&str] = &["https://dialed.day"]; -// Linear advertises its auth server as the MCP origin itself (DCR, public -// client, read+write scopes). Docs: https://linear.app/docs/mcp -const LINEAR_MCP_ORIGIN: &str = "https://mcp.linear.app"; -const LINEAR_OAUTH_ORIGINS: &[&str] = &["https://mcp.linear.app"]; -// Amplemarket advertises its auth server as https://app.amplemarket.com (DCR, -// public client, PKCE S256, scopes mcp:read/mcp:write) — TAS-managed, like Attio. -const AMPLEMARKET_MCP_ORIGIN: &str = "https://mcp.amplemarket.com"; -const AMPLEMARKET_OAUTH_ORIGINS: &[&str] = &["https://app.amplemarket.com"]; -// Clay advertises api.clay.com as its auth server (DCR, public client, PKCE S256, -// scope "mcp"), but its authorize endpoint lives on app.clay.com while -// token/registration sit on api.clay.com — both origins allowed (like Fathom). -const CLAY_MCP_ORIGIN: &str = "https://api.clay.com"; -const CLAY_OAUTH_ORIGINS: &[&str] = &["https://api.clay.com", "https://app.clay.com"]; -// Avoma advertises its auth server as https://prod-api.avoma.com (DCR, PKCE S256, -// refresh_token grant; external_api:* scopes via the catalog scopeOverride). -const AVOMA_MCP_ORIGIN: &str = "https://mcp.avoma.com"; -const AVOMA_OAUTH_ORIGINS: &[&str] = &["https://prod-api.avoma.com"]; -// Gmail (Google Workspace MCP) is a confidential/manual client on standard -// Google OAuth: the auth server is accounts.google.com but its TOKEN endpoint -// lives on a separate origin (oauth2.googleapis.com) — both must be trusted so -// the refresh-before-use sweep can renew the access token. -const GMAIL_MCP_ORIGIN: &str = "https://gmailmcp.googleapis.com"; -const GMAIL_OAUTH_ORIGINS: &[&str] = &[ - "https://accounts.google.com", - "https://oauth2.googleapis.com", -]; -// Batch sourced from anthropics/knowledge-work-plugins .mcp.json; each confirmed -// DCR (registration_endpoint at the MCP origin's auth-server metadata). Must -// stay in lockstep with the web catalog (mcp-providers.ts). -const NOTION_MCP_ORIGIN: &str = "https://mcp.notion.com"; -const NOTION_OAUTH_ORIGINS: &[&str] = &["https://mcp.notion.com"]; -const INTERCOM_MCP_ORIGIN: &str = "https://mcp.intercom.com"; -const INTERCOM_OAUTH_ORIGINS: &[&str] = &["https://mcp.intercom.com"]; -const ATLASSIAN_MCP_ORIGIN: &str = "https://mcp.atlassian.com"; -const ATLASSIAN_OAUTH_ORIGINS: &[&str] = - &["https://mcp.atlassian.com", "https://cf.mcp.atlassian.com"]; -const ASANA_MCP_ORIGIN: &str = "https://mcp.asana.com"; -const ASANA_OAUTH_ORIGINS: &[&str] = &["https://mcp.asana.com"]; -const MONDAY_MCP_ORIGIN: &str = "https://mcp.monday.com"; -const MONDAY_OAUTH_ORIGINS: &[&str] = &["https://mcp.monday.com"]; -const GURU_MCP_ORIGIN: &str = "https://mcp.api.getguru.com"; -const GURU_OAUTH_ORIGINS: &[&str] = &["https://mcp.api.getguru.com"]; -const FIREFLIES_MCP_ORIGIN: &str = "https://api.fireflies.ai"; -const FIREFLIES_OAUTH_ORIGINS: &[&str] = &["https://api.fireflies.ai"]; -const AMPLITUDE_MCP_ORIGIN: &str = "https://mcp.amplitude.com"; -const AMPLITUDE_OAUTH_ORIGINS: &[&str] = &["https://mcp.amplitude.com"]; -const APOLLO_MCP_ORIGIN: &str = "https://mcp.apollo.io"; -const APOLLO_OAUTH_ORIGINS: &[&str] = &["https://mcp.apollo.io"]; -// PostHog hosted MCP: auth server is oauth.posthog.com (region-routes US/EU). -// Docs: https://posthog.com/docs/model-context-protocol -const POSTHOG_MCP_ORIGIN: &str = "https://mcp.posthog.com"; -const POSTHOG_OAUTH_ORIGINS: &[&str] = &["https://oauth.posthog.com"]; -// Stripe hosted MCP: issuer is access.stripe.com/mcp; metadata also on mcp.stripe.com. -// Docs: https://docs.stripe.com/mcp -const STRIPE_MCP_ORIGIN: &str = "https://mcp.stripe.com"; -const STRIPE_OAUTH_ORIGINS: &[&str] = &["https://access.stripe.com", "https://mcp.stripe.com"]; -// ── Hosted OAuth MCP batch (must match web/src/lib/mcp-providers.ts) ── -const VERCEL_MCP_ORIGIN: &str = "https://mcp.vercel.com"; -const VERCEL_OAUTH_ORIGINS: &[&str] = &["https://mcp.vercel.com", "https://vercel.com"]; -const CANVA_MCP_ORIGIN: &str = "https://mcp.canva.com"; -const CANVA_OAUTH_ORIGINS: &[&str] = &["https://mcp.canva.com"]; -const CLICKUP_MCP_ORIGIN: &str = "https://mcp.clickup.com"; -const CLICKUP_OAUTH_ORIGINS: &[&str] = &["https://mcp.clickup.com"]; -const CLOSE_MCP_ORIGIN: &str = "https://mcp.close.com"; -const CLOSE_OAUTH_ORIGINS: &[&str] = &[ - "https://mcp.close.com", - "https://api.close.com", - "https://app.close.com", -]; -const SENTRY_MCP_ORIGIN: &str = "https://mcp.sentry.dev"; -const SENTRY_OAUTH_ORIGINS: &[&str] = &["https://mcp.sentry.dev"]; -const MIXPANEL_MCP_ORIGIN: &str = "https://mcp.mixpanel.com"; -const MIXPANEL_OAUTH_ORIGINS: &[&str] = &["https://mcp.mixpanel.com", "https://mixpanel.com"]; -const GRANOLA_MCP_ORIGIN: &str = "https://mcp.granola.ai"; -const GRANOLA_OAUTH_ORIGINS: &[&str] = &["https://mcp.granola.ai", "https://mcp-auth.granola.ai"]; -const DROPBOX_MCP_ORIGIN: &str = "https://mcp.dropbox.com"; -const DROPBOX_OAUTH_ORIGINS: &[&str] = &[ - "https://mcp.dropbox.com", - "https://www.dropbox.com", - "https://api.dropboxapi.com", -]; -const WEBFLOW_MCP_ORIGIN: &str = "https://mcp.webflow.com"; -const WEBFLOW_OAUTH_ORIGINS: &[&str] = &["https://mcp.webflow.com"]; -const CLOUDFLARE_MCP_ORIGIN: &str = "https://mcp.cloudflare.com"; -const CLOUDFLARE_OAUTH_ORIGINS: &[&str] = &["https://mcp.cloudflare.com"]; -const NEON_MCP_ORIGIN: &str = "https://mcp.neon.tech"; -const NEON_OAUTH_ORIGINS: &[&str] = &["https://mcp.neon.tech"]; -const CAL_MCP_ORIGIN: &str = "https://mcp.cal.com"; -const CAL_OAUTH_ORIGINS: &[&str] = &["https://mcp.cal.com"]; -const KLAVIYO_MCP_ORIGIN: &str = "https://mcp.klaviyo.com"; -const KLAVIYO_OAUTH_ORIGINS: &[&str] = &["https://mcp.klaviyo.com"]; -const PAYPAL_MCP_ORIGIN: &str = "https://mcp.paypal.com"; -const PAYPAL_OAUTH_ORIGINS: &[&str] = &["https://mcp.paypal.com"]; -const SQUARE_MCP_ORIGIN: &str = "https://mcp.squareup.com"; -const SQUARE_OAUTH_ORIGINS: &[&str] = &["https://mcp.squareup.com"]; -const AIRTABLE_MCP_ORIGIN: &str = "https://mcp.airtable.com"; -const AIRTABLE_OAUTH_ORIGINS: &[&str] = &["https://mcp.airtable.com", "https://airtable.com"]; -const RAILWAY_MCP_ORIGIN: &str = "https://mcp.railway.app"; -const RAILWAY_OAUTH_ORIGINS: &[&str] = - &["https://mcp.railway.app", "https://backboard.railway.com"]; -const RESEND_MCP_ORIGIN: &str = "https://mcp.resend.com"; -const RESEND_OAUTH_ORIGINS: &[&str] = &["https://mcp.resend.com", "https://api.resend.com"]; -const HEX_MCP_ORIGIN: &str = "https://app.hex.tech"; -const HEX_OAUTH_ORIGINS: &[&str] = &["https://app.hex.tech", "https://auth.app.hex.tech"]; -const PENDO_MCP_ORIGIN: &str = "https://app.pendo.io"; -const PENDO_OAUTH_ORIGINS: &[&str] = &["https://app.pendo.io"]; -const SIMILARWEB_MCP_ORIGIN: &str = "https://mcp.similarweb.com"; -const SIMILARWEB_OAUTH_ORIGINS: &[&str] = &[ - "https://mcp.similarweb.com", - "https://mcp-auth.similarweb.com", -]; -const DATADOG_MCP_ORIGIN: &str = "https://mcp.datadoghq.com"; -const DATADOG_OAUTH_ORIGINS: &[&str] = &["https://mcp.datadoghq.com", "https://app.datadoghq.com"]; -const COMMONROOM_MCP_ORIGIN: &str = "https://mcp.commonroom.io"; -const COMMONROOM_OAUTH_ORIGINS: &[&str] = - &["https://mcp.commonroom.io", "https://login.commonroom.io"]; -const GONG_MCP_ORIGIN: &str = "https://mcp.gong.io"; -const GONG_OAUTH_ORIGINS: &[&str] = &["https://mcp.gong.io", "https://app.gong.io"]; -const BOX_MCP_ORIGIN: &str = "https://mcp.box.com"; -const BOX_OAUTH_ORIGINS: &[&str] = &[ - "https://mcp.box.com", - "https://api.box.com", - "https://account.box.com", -]; -const PAGERDUTY_MCP_ORIGIN: &str = "https://mcp.pagerduty.com"; -const PAGERDUTY_OAUTH_ORIGINS: &[&str] = - &["https://mcp.pagerduty.com", "https://app.pagerduty.com"]; -const SLACK_MCP_ORIGIN: &str = "https://mcp.slack.com"; -const SLACK_OAUTH_ORIGINS: &[&str] = &["https://mcp.slack.com", "https://slack.com"]; -// Zoom meetings MCP (streamable); AS is zoom.us (client_secret_basic only). -const ZOOM_MCP_ORIGIN: &str = "https://mcp.zoom.us"; -const ZOOM_OAUTH_ORIGINS: &[&str] = &[ - "https://zoom.us", - "https://mcp.zoom.us", - "https://mcp-us.zoom.us", -]; - -const NATIVE_MCP_OAUTH_ALLOWLIST: &[(&str, &[&str])] = &[ - (ATTIO_MCP_ORIGIN, ATTIO_OAUTH_ORIGINS), - (PYLON_MCP_ORIGIN, PYLON_OAUTH_ORIGINS), - (HUBSPOT_MCP_ORIGIN, HUBSPOT_OAUTH_ORIGINS), - (FATHOM_MCP_ORIGIN, FATHOM_OAUTH_ORIGINS), - (DIALED_MCP_ORIGIN, DIALED_OAUTH_ORIGINS), - (LINEAR_MCP_ORIGIN, LINEAR_OAUTH_ORIGINS), - (AMPLEMARKET_MCP_ORIGIN, AMPLEMARKET_OAUTH_ORIGINS), - (CLAY_MCP_ORIGIN, CLAY_OAUTH_ORIGINS), - (AVOMA_MCP_ORIGIN, AVOMA_OAUTH_ORIGINS), - (GMAIL_MCP_ORIGIN, GMAIL_OAUTH_ORIGINS), - (NOTION_MCP_ORIGIN, NOTION_OAUTH_ORIGINS), - (INTERCOM_MCP_ORIGIN, INTERCOM_OAUTH_ORIGINS), - (ATLASSIAN_MCP_ORIGIN, ATLASSIAN_OAUTH_ORIGINS), - (ASANA_MCP_ORIGIN, ASANA_OAUTH_ORIGINS), - (MONDAY_MCP_ORIGIN, MONDAY_OAUTH_ORIGINS), - (GURU_MCP_ORIGIN, GURU_OAUTH_ORIGINS), - (FIREFLIES_MCP_ORIGIN, FIREFLIES_OAUTH_ORIGINS), - (AMPLITUDE_MCP_ORIGIN, AMPLITUDE_OAUTH_ORIGINS), - (APOLLO_MCP_ORIGIN, APOLLO_OAUTH_ORIGINS), - (POSTHOG_MCP_ORIGIN, POSTHOG_OAUTH_ORIGINS), - (STRIPE_MCP_ORIGIN, STRIPE_OAUTH_ORIGINS), - (VERCEL_MCP_ORIGIN, VERCEL_OAUTH_ORIGINS), - (CANVA_MCP_ORIGIN, CANVA_OAUTH_ORIGINS), - (CLICKUP_MCP_ORIGIN, CLICKUP_OAUTH_ORIGINS), - (CLOSE_MCP_ORIGIN, CLOSE_OAUTH_ORIGINS), - (SENTRY_MCP_ORIGIN, SENTRY_OAUTH_ORIGINS), - (MIXPANEL_MCP_ORIGIN, MIXPANEL_OAUTH_ORIGINS), - (GRANOLA_MCP_ORIGIN, GRANOLA_OAUTH_ORIGINS), - (DROPBOX_MCP_ORIGIN, DROPBOX_OAUTH_ORIGINS), - (WEBFLOW_MCP_ORIGIN, WEBFLOW_OAUTH_ORIGINS), - (CLOUDFLARE_MCP_ORIGIN, CLOUDFLARE_OAUTH_ORIGINS), - (NEON_MCP_ORIGIN, NEON_OAUTH_ORIGINS), - (CAL_MCP_ORIGIN, CAL_OAUTH_ORIGINS), - (KLAVIYO_MCP_ORIGIN, KLAVIYO_OAUTH_ORIGINS), - (PAYPAL_MCP_ORIGIN, PAYPAL_OAUTH_ORIGINS), - (SQUARE_MCP_ORIGIN, SQUARE_OAUTH_ORIGINS), - (AIRTABLE_MCP_ORIGIN, AIRTABLE_OAUTH_ORIGINS), - (RAILWAY_MCP_ORIGIN, RAILWAY_OAUTH_ORIGINS), - (RESEND_MCP_ORIGIN, RESEND_OAUTH_ORIGINS), - (HEX_MCP_ORIGIN, HEX_OAUTH_ORIGINS), - (PENDO_MCP_ORIGIN, PENDO_OAUTH_ORIGINS), - (SIMILARWEB_MCP_ORIGIN, SIMILARWEB_OAUTH_ORIGINS), - (DATADOG_MCP_ORIGIN, DATADOG_OAUTH_ORIGINS), - (COMMONROOM_MCP_ORIGIN, COMMONROOM_OAUTH_ORIGINS), - (GONG_MCP_ORIGIN, GONG_OAUTH_ORIGINS), - (BOX_MCP_ORIGIN, BOX_OAUTH_ORIGINS), - (PAGERDUTY_MCP_ORIGIN, PAGERDUTY_OAUTH_ORIGINS), - (SLACK_MCP_ORIGIN, SLACK_OAUTH_ORIGINS), - (ZOOM_MCP_ORIGIN, ZOOM_OAUTH_ORIGINS), - // ── Batch 2026-07 (#3): registry + connectors-directory sweep. Inline - // tuples (mcp origin → allowed OAuth origins) rather than named consts; - // kept in the same order as web/src/lib/mcp-providers.ts, which the - // allowlist-sync vitest guards against drift. Origins are the union of - // the advertised authorization server + authorize/token/registration - // endpoint origins from the 2026-07-18 probe. - // ── Sales / GTM ── - ("https://api.outreach.io", &["https://api.outreach.io"]), - ("https://mcp.salesloft.com", &["https://accounts.salesloft.com", "https://mcp.salesloft.com"]), - ("https://mcp.zoominfo.com", &["https://mcp.zoominfo.com", "https://okta-login.zoominfo.com"]), - ("https://mcp.lusha.com", &["https://auth.lusha.com"]), - ("https://mcp.hunter.io", &["https://hunter.io"]), - ("https://mcp.instantly.ai", &["https://api.instantly.ai"]), - ("https://mcp.crossbeam.com", &["https://mcp.crossbeam.com"]), - ("https://mcp.api.harmonic.ai", &["https://mcp.api.harmonic.ai"]), - ("https://fire.chilipiper.com", &["https://fire.chilipiper.com"]), - ("https://day.ai", &["https://day.ai"]), - ("https://api.clarify.ai", &["https://auth1.clarify.ai"]), - ("https://mcp.staircase.ai", &["https://mcp.staircase.ai"]), - // ── Support / CX ── - ("https://mcp.zendesk.com", &["https://mcp.zendesk.com"]), - ("https://mcp.helpscout.net", &["https://mcp.helpscout.net"]), - ("https://mcp.gorgias.com", &["https://mcp.gorgias.com"]), - ("https://mcp.plain.com", &["https://signin.auth.plain.com"]), - ("https://api.lorikeetcx.ai", &["https://api.lorikeetcx.ai", "https://app.lorikeetcx.ai"]), - ("https://app.unthread.io", &["https://app.unthread.io"]), - ("https://wisdom-api.enterpret.com", &["https://oauth.enterpret.com"]), - ("https://dovetail.com", &["https://auth.dovetail.com"]), - ("https://mcp.missiveapp.com", &["https://auth.missiveapp.com"]), - // ── Meeting intelligence ── - ("https://mcp.otter.ai", &["https://otter.ai"]), - ("https://api.grain.com", &["https://api.grain.com", "https://grain.com"]), - ("https://mcp.krisp.ai", &["https://api.krisp.ai", "https://mcp.krisp.ai"]), - ("https://app.circleback.ai", &["https://app.circleback.ai"]), - ("https://mcp.tldv.io", &["https://keycloak.tldv.io"]), - // ── Finance / spend / payments ── - ("https://mcp.ramp.com", &["https://api.ramp.com", "https://mcp.ramp.com"]), - ("https://api.brex.com", &["https://accounts-api.brex.com", "https://api.brex.com"]), - ("https://mcp.mercury.com", &["https://mcp.mercury.com"]), - ("https://mcp.expensify.com", &["https://www.expensify.com"]), - ("https://mcp.navan.com", &["https://login.navan.com"]), - ("https://mcp.app.carta.com", &["https://mcp.app.carta.com"]), - ("https://api.digits.com", &["https://api.digits.com"]), - ("https://mcp.gocardless.com", &["https://mcp.gocardless.com"]), - ("https://mcp.mercadopago.com", &["https://auth.mercadopago.com", "https://mcp.mercadopago.com"]), - // ── Financial & market intelligence ── - ("https://premium.mcp.pitchbook.com", &["https://premium.mcp.pitchbook.com"]), - ("https://mcp.morningstar.com", &["https://mcp.morningstar.com"]), - ("https://mcp.cbinsights.com", &["https://mcp.cbinsights.com"]), - ("https://mcp.quartr.com", &["https://mcp.quartr.com"]), - ("https://mcp.daloopa.com", &["https://mcp.daloopa.com"]), - ("https://mcp.consensus.app", &["https://consensus.app"]), - // ── HR / recruiting / learning ── - ("https://mcp.api.gusto.com", &["https://mcp.api.gusto.com"]), - ("https://api.letsdeel.com", &["https://api.letsdeel.com"]), - ("https://mcp.ashbyhq.com", &["https://mcp-auth.ashbyhq.com"]), - ("https://mcp.workable.com", &["https://mcp.workable.com", "https://workable.com"]), - ("https://mcp.metaview.ai", &["https://auth.metaview.ai"]), - ("https://mcp.indeed.com", &["https://apis.indeed.com", "https://secure.indeed.com"]), - ("https://api.udemy.com", &["https://api.udemy.com"]), - // ── Legal / compliance ── - ("https://mcp-server.signnow.com", &["https://mcp-server.signnow.com"]), - ("https://mcp.vanta.com", &["https://api.vanta.com", "https://app.vanta.com", "https://mcp.vanta.com"]), - ("https://mcp.drata.com", &["https://drata-prod.us.auth0.com", "https://mcp.drata.com"]), - // ── Productivity / PM / design ── - ("https://mcp.figma.com", &["https://api.figma.com", "https://www.figma.com"]), - ("https://mcp.miro.com", &["https://mcp.miro.com"]), - ("https://mcp.lucid.app", &["https://mcp.lucid.app"]), - ("https://mcp.productboard.com", &["https://mcp.productboard.com"]), - ("https://mcp.aha.io", &["https://mcp.aha.io"]), - ("https://mcp.shortcut.com", &["https://api.app.shortcut.com"]), - ("https://ai.todoist.net", &["https://todoist.com"]), - ("https://mcp.ai.teamwork.com", &["https://teamwork.com", "https://www.teamwork.com"]), - ("https://mcp.calendly.com", &["https://calendly.com"]), - ("https://mcp.mail.superhuman.com", &["https://mcp.auth.mail.superhuman.com"]), - ("https://mcp.craft.do", &["https://mcp.craft.do"]), - ("https://mcp.mem.ai", &["https://api.mem.ai", "https://mem.ai"]), - ("https://mcp.gamma.app", &["https://auth.gamma.app"]), - ("https://mcp.pitch.com", &["https://auth.pitch.com"]), - ("https://app.eraser.io", &["https://app.eraser.io"]), - ("https://mcp.jotform.com", &["https://oauth2.jotform.com"]), - ("https://api.typeform.com", &["https://admin.typeform.com", "https://api.typeform.com"]), - ("https://mcp.surveymonkey.com", &["https://mcp.surveymonkey.com"]), - ("https://mcp-server.egnyte.com", &["https://mcp-oauth.egnyte.com"]), - // ── Marketing / content / CMS ── - ("https://ai-inc.mailchimp.com", &["https://ai-inc.mailchimp.com"]), - ("https://mcp.customer.io", &["https://mcp.customer.io"]), - ("https://api.ahrefs.com", &["https://ahrefs.com", "https://api.ahrefs.com", "https://app.ahrefs.com"]), - ("https://mcp.semrush.com", &["https://api.semrush.com", "https://oauth.semrush.com"]), - ("https://asset-management.mcp.cloudinary.com", &["https://asset-management.mcp.cloudinary.com"]), - ("https://mcp.contentful.com", &["https://mcp.contentful.com"]), - ("https://mcp.sanity.io", &["https://mcp.sanity.io"]), - ("https://mcp.wix.com", &["https://mcp.wix.com"]), - ("https://public-api.wordpress.com", &["https://public-api.wordpress.com"]), - ("https://mcp.gitbook.com", &["https://oauth.gitbook.com"]), - ("https://mcp.mintlify.com", &["https://mcp.mintlify.com"]), - ("https://mcp.deepl.com", &["https://mcp.deepl.com"]), - // ── Dev / infra / observability ── - ("https://gitlab.com", &["https://gitlab.com"]), - ("https://mcp.supabase.com", &["https://api.supabase.com"]), - ("https://netlify-mcp.netlify.app", &["https://netlify-mcp.netlify.app"]), - ("https://mcp.heroku.com", &["https://mcp.heroku.com"]), - ("https://mcp.buildkite.com", &["https://mcp.buildkite.com"]), - ("https://mcp.grafana.com", &["https://mcp.grafana.com"]), - ("https://mcp.newrelic.com", &["https://login.newrelic.com", "https://mcp.newrelic.com"]), - ("https://mcp.honeycomb.io", &["https://ui.honeycomb.io"]), - ("https://mcp.incident.io", &["https://app.incident.io", "https://mcp.incident.io"]), - ("https://mcp.rootly.com", &["https://rootly.com"]), - ("https://bugsnag.mcp.smartbear.com", &["https://oauth.bugsnag.com"]), - ("https://mcp.launchdarkly.com", &["https://app.launchdarkly.com", "https://mcp.launchdarkly.com"]), - ("https://mcp.pscale.dev", &["https://app.planetscale.com", "https://auth.planetscale.com", "https://mcp.pscale.dev"]), - ("https://mcp.prisma.io", &["https://auth.prisma.io", "https://mcp.prisma.io"]), - ("https://mcp.instantdb.com", &["https://mcp.instantdb.com"]), - ("https://mcp.algolia.com", &["https://dashboard.algolia.com"]), - ("https://api.statsig.com", &["https://api.statsig.com"]), - ("https://mcp.postman.com", &["https://mcp.postman.com"]), - ("https://mcp.semgrep.ai", &["https://login.semgrep.dev"]), - ("https://mcp.workos.com", &["https://signin.workos.com"]), - ("https://mcp.stytch.dev", &["https://rustic-kilogram-6347.customers.stytch.com", "https://stytch.com"]), - ("https://mcp.mux.com", &["https://auth.mux.com"]), - ("https://mcp.knock.app", &["https://mcp.knock.app"]), - ("https://mcp.lovable.dev", &["https://lovable.dev"]), - ("https://mcp.retool.com", &["https://mcp.retool.com"]), - ("https://api.telnyx.com", &["https://api.telnyx.com"]), - ("https://mcp.jam.dev", &["https://api.jam.dev"]), - ("https://mcp.globalping.dev", &["https://mcp.globalping.dev"]), - // ── Data / AI ── - ("https://mcp.airbyte.ai", &["https://mcp.airbyte.ai"]), - ("https://api.motherduck.com", &["https://mcp-auth.motherduck.com"]), - ("https://integrations.getmontecarlo.com", &["https://auth.getmontecarlo.com"]), - ("https://mcp.atlan.com", &["https://mcp.atlan.com"]), - ("https://huggingface.co", &["https://huggingface.co"]), - // ── Automation / web data / search ── - ("https://mcp.zapier.com", &["https://mcp.zapier.com"]), - ("https://mcp.make.com", &["https://www.make.com"]), - ("https://ifttt.com", &["https://ifttt.com"]), - ("https://mcp.exa.ai", &["https://auth.exa.ai"]), - ("https://mcp.tavily.com", &["https://mcp.tavily.com"]), - ("https://mcp.firecrawl.dev", &["https://www.firecrawl.dev"]), - ("https://mcp.apify.com", &["https://console-backend.apify.com", "https://console.apify.com"]), - ("https://mcp.brightdata.com", &["https://brightdata.com"]), - // ── Bring-your-own OAuth app (no DCR) ── - ("https://mcp.docusign.com", &["https://account.docusign.com", "https://mcp.docusign.com"]), - ("https://mcp.xero.com", &["https://identity.xero.com", "https://login.xero.com"]), - ("https://mcp.frontapp.com", &["https://app.frontapp.com"]), - ("https://mcp.smartsheet.com", &["https://api.smartsheet.com", "https://app.smartsheet.com", "https://mcp.smartsheet.com"]), - ("https://mcp.mongodb.com", &["https://authorize.mongodb.com", "https://cloud.mongodb.com"]), - ("https://mcp.circleci.com", &["https://app.circleci.com", "https://circleci.com", "https://mcp.circleci.com"]), - ("https://mcp.chargebee.com", &["https://app.chargebee.com"]), - ("https://bigquery.googleapis.com", &["https://accounts.google.com", "https://oauth2.googleapis.com"]), - ("https://mcp.na1.ironcladapp.com", &["https://ironcladapp.com"]), - ("https://api.harvey.ai", &["https://api.harvey.ai", "https://harvey-ai.us.auth0.com"]), - ("https://mcp.tableau.com", &["https://sso.online.tableau.com"]), - ("https://setup.shopify.com", &["https://setup.shopify.com"]), -]; +// The (mcp_server_url origin → allowed OAuth authorization-server origins) +// allowlist lives in native_oauth_allowlist.rs, GENERATED from the web catalog +// (web/src/lib/mcp-providers.ts) by web/scripts/gen-native-oauth-allowlist.ts. +// Never edit it by hand — regenerate with `npm run gen:allowlist` in web/. +use crate::native_oauth_allowlist::NATIVE_MCP_OAUTH_ALLOWLIST; #[derive(Deserialize)] struct ProtectedResourceMeta { @@ -955,21 +595,27 @@ mod tests { #[test] fn enforces_https_and_allowed_oauth_origin() { + // Resolve Attio's allowed origins through the generated allowlist, so + // this also exercises the table lookup against real generated data. + let attio_oauth_origins = allowed_oauth_origins_for_mcp_origin("https://mcp.attio.com") + .expect("attio is in the generated allowlist"); + assert_eq!(attio_oauth_origins, ["https://app.attio.com"]); + assert!(parse_trusted_oauth_url( "https://app.attio.com/oidc/token", - ATTIO_OAUTH_ORIGINS, + attio_oauth_origins, "token endpoint" ) .is_ok()); assert!(parse_trusted_oauth_url( "http://app.attio.com/oidc/token", - ATTIO_OAUTH_ORIGINS, + attio_oauth_origins, "token endpoint" ) .is_err()); assert!(parse_trusted_oauth_url( "https://evil.example/oidc/token", - ATTIO_OAUTH_ORIGINS, + attio_oauth_origins, "token endpoint" ) .is_err()); diff --git a/api/src/native_oauth_allowlist.rs b/api/src/native_oauth_allowlist.rs new file mode 100644 index 0000000..d1b0063 --- /dev/null +++ b/api/src/native_oauth_allowlist.rs @@ -0,0 +1,203 @@ +// @generated by web/scripts/gen-native-oauth-allowlist.ts — DO NOT EDIT BY HAND. +// +// Source of truth: web/src/lib/mcp-providers.ts (MCP_PROVIDERS). Each tuple is +// (MCP-server origin, exact OAuth authorization-server origins that provider +// may advertise through /.well-known/oauth-protected-resource). The refresh +// path in native_oauth.rs aborts when a discovered endpoint's origin is not in +// this list — see the Dialed regression for why. +// +// Regenerate after ANY catalog change that touches mcpServerUrl or +// oauthAuthorizationServerOrigins: +// +// cd web && npm run gen:allowlist +// +// CI enforcement: web/src/lib/mcp-providers.allowlist-sync.test.ts fails when +// this file is stale. + +#[rustfmt::skip] +pub(crate) const NATIVE_MCP_OAUTH_ALLOWLIST: &[(&str, &[&str])] = &[ + ("https://mcp.attio.com", &["https://app.attio.com"]), // attio + ("https://mcp.usepylon.com", &["https://o.auth.usepylon.com"]), // pylon + ("https://mcp.hubspot.com", &["https://mcp.hubspot.com"]), // hubspot + ("https://api.fathom.ai", &["https://api.fathom.ai", "https://fathom.video"]), // fathom + ("https://dialed.day", &["https://dialed.day"]), // dialed + ("https://mcp.linear.app", &["https://mcp.linear.app"]), // linear + ("https://mcp.amplemarket.com", &["https://app.amplemarket.com"]), // amplemarket + ("https://api.clay.com", &["https://api.clay.com", "https://app.clay.com"]), // clay + ("https://mcp.avoma.com", &["https://prod-api.avoma.com"]), // avoma + ("https://gmailmcp.googleapis.com", &["https://accounts.google.com", "https://oauth2.googleapis.com"]), // gmail + ("https://mcp.notion.com", &["https://mcp.notion.com"]), // notion + ("https://mcp.intercom.com", &["https://mcp.intercom.com"]), // intercom + ("https://mcp.atlassian.com", &["https://mcp.atlassian.com", "https://cf.mcp.atlassian.com"]), // atlassian + ("https://mcp.asana.com", &["https://mcp.asana.com"]), // asana + ("https://mcp.monday.com", &["https://mcp.monday.com"]), // monday + ("https://mcp.api.getguru.com", &["https://mcp.api.getguru.com"]), // guru + ("https://api.fireflies.ai", &["https://api.fireflies.ai"]), // fireflies + ("https://mcp.amplitude.com", &["https://mcp.amplitude.com"]), // amplitude + ("https://mcp.apollo.io", &["https://mcp.apollo.io"]), // apollo + ("https://mcp.posthog.com", &["https://oauth.posthog.com"]), // posthog + ("https://mcp.stripe.com", &["https://access.stripe.com", "https://mcp.stripe.com"]), // stripe + ("https://mcp.vercel.com", &["https://mcp.vercel.com", "https://vercel.com"]), // vercel + ("https://mcp.canva.com", &["https://mcp.canva.com"]), // canva + ("https://mcp.clickup.com", &["https://mcp.clickup.com"]), // clickup + ("https://mcp.close.com", &["https://mcp.close.com", "https://api.close.com", "https://app.close.com"]), // close + ("https://mcp.sentry.dev", &["https://mcp.sentry.dev"]), // sentry + ("https://mcp.mixpanel.com", &["https://mcp.mixpanel.com", "https://mixpanel.com"]), // mixpanel + ("https://mcp.granola.ai", &["https://mcp.granola.ai", "https://mcp-auth.granola.ai"]), // granola + ("https://mcp.dropbox.com", &["https://mcp.dropbox.com", "https://www.dropbox.com", "https://api.dropboxapi.com"]), // dropbox + ("https://mcp.webflow.com", &["https://mcp.webflow.com"]), // webflow + ("https://mcp.cloudflare.com", &["https://mcp.cloudflare.com"]), // cloudflare + ("https://mcp.neon.tech", &["https://mcp.neon.tech"]), // neon + ("https://mcp.cal.com", &["https://mcp.cal.com"]), // cal + ("https://mcp.klaviyo.com", &["https://mcp.klaviyo.com"]), // klaviyo + ("https://mcp.paypal.com", &["https://mcp.paypal.com"]), // paypal + ("https://mcp.squareup.com", &["https://mcp.squareup.com"]), // square + ("https://mcp.airtable.com", &["https://mcp.airtable.com", "https://airtable.com"]), // airtable + ("https://mcp.railway.app", &["https://mcp.railway.app", "https://backboard.railway.com"]), // railway + ("https://mcp.resend.com", &["https://mcp.resend.com", "https://api.resend.com"]), // resend + ("https://app.hex.tech", &["https://app.hex.tech", "https://auth.app.hex.tech"]), // hex + ("https://app.pendo.io", &["https://app.pendo.io"]), // pendo + ("https://mcp.similarweb.com", &["https://mcp.similarweb.com", "https://mcp-auth.similarweb.com"]), // similarweb + ("https://mcp.datadoghq.com", &["https://mcp.datadoghq.com", "https://app.datadoghq.com"]), // datadog + ("https://mcp.commonroom.io", &["https://mcp.commonroom.io", "https://login.commonroom.io"]), // commonroom + ("https://mcp.gong.io", &["https://mcp.gong.io", "https://app.gong.io"]), // gong + ("https://mcp.box.com", &["https://mcp.box.com", "https://api.box.com", "https://account.box.com"]), // box + ("https://mcp.pagerduty.com", &["https://mcp.pagerduty.com", "https://app.pagerduty.com"]), // pagerduty + ("https://mcp.slack.com", &["https://mcp.slack.com", "https://slack.com"]), // slack + ("https://mcp.zoom.us", &["https://zoom.us", "https://mcp.zoom.us", "https://mcp-us.zoom.us"]), // zoom + ("https://api.outreach.io", &["https://api.outreach.io"]), // outreach + ("https://mcp.salesloft.com", &["https://accounts.salesloft.com", "https://mcp.salesloft.com"]), // salesloft + ("https://mcp.zoominfo.com", &["https://mcp.zoominfo.com", "https://okta-login.zoominfo.com"]), // zoominfo + ("https://mcp.lusha.com", &["https://auth.lusha.com"]), // lusha + ("https://mcp.hunter.io", &["https://hunter.io"]), // hunter + ("https://mcp.instantly.ai", &["https://api.instantly.ai"]), // instantly + ("https://mcp.crossbeam.com", &["https://mcp.crossbeam.com"]), // crossbeam + ("https://mcp.api.harmonic.ai", &["https://mcp.api.harmonic.ai"]), // harmonic + ("https://fire.chilipiper.com", &["https://fire.chilipiper.com"]), // chilipiper + ("https://day.ai", &["https://day.ai"]), // dayai + ("https://api.clarify.ai", &["https://auth1.clarify.ai"]), // clarify + ("https://mcp.staircase.ai", &["https://mcp.staircase.ai"]), // staircase + ("https://mcp.zendesk.com", &["https://mcp.zendesk.com"]), // zendesk + ("https://mcp.helpscout.net", &["https://mcp.helpscout.net"]), // helpscout + ("https://mcp.gorgias.com", &["https://mcp.gorgias.com"]), // gorgias + ("https://mcp.plain.com", &["https://signin.auth.plain.com"]), // plain + ("https://api.lorikeetcx.ai", &["https://api.lorikeetcx.ai", "https://app.lorikeetcx.ai"]), // lorikeet + ("https://app.unthread.io", &["https://app.unthread.io"]), // unthread + ("https://wisdom-api.enterpret.com", &["https://oauth.enterpret.com"]), // enterpret + ("https://dovetail.com", &["https://auth.dovetail.com"]), // dovetail + ("https://mcp.missiveapp.com", &["https://auth.missiveapp.com"]), // missive + ("https://mcp.otter.ai", &["https://otter.ai"]), // otter + ("https://api.grain.com", &["https://api.grain.com", "https://grain.com"]), // grain + ("https://mcp.krisp.ai", &["https://api.krisp.ai", "https://mcp.krisp.ai"]), // krisp + ("https://app.circleback.ai", &["https://app.circleback.ai"]), // circleback + ("https://mcp.tldv.io", &["https://keycloak.tldv.io"]), // tldv + ("https://mcp.ramp.com", &["https://api.ramp.com", "https://mcp.ramp.com"]), // ramp + ("https://api.brex.com", &["https://accounts-api.brex.com", "https://api.brex.com"]), // brex + ("https://mcp.mercury.com", &["https://mcp.mercury.com"]), // mercury + ("https://mcp.expensify.com", &["https://www.expensify.com"]), // expensify + ("https://mcp.navan.com", &["https://login.navan.com"]), // navan + ("https://mcp.app.carta.com", &["https://mcp.app.carta.com"]), // carta + ("https://api.digits.com", &["https://api.digits.com"]), // digits + ("https://mcp.gocardless.com", &["https://mcp.gocardless.com"]), // gocardless + ("https://mcp.mercadopago.com", &["https://auth.mercadopago.com", "https://mcp.mercadopago.com"]), // mercadopago + ("https://premium.mcp.pitchbook.com", &["https://premium.mcp.pitchbook.com"]), // pitchbook + ("https://mcp.morningstar.com", &["https://mcp.morningstar.com"]), // morningstar + ("https://mcp.cbinsights.com", &["https://mcp.cbinsights.com"]), // cbinsights + ("https://mcp.quartr.com", &["https://mcp.quartr.com"]), // quartr + ("https://mcp.daloopa.com", &["https://mcp.daloopa.com"]), // daloopa + ("https://mcp.consensus.app", &["https://consensus.app"]), // consensus + ("https://mcp.api.gusto.com", &["https://mcp.api.gusto.com"]), // gusto + ("https://api.letsdeel.com", &["https://api.letsdeel.com"]), // deel + ("https://mcp.ashbyhq.com", &["https://mcp-auth.ashbyhq.com"]), // ashby + ("https://mcp.workable.com", &["https://mcp.workable.com", "https://workable.com"]), // workable + ("https://mcp.metaview.ai", &["https://auth.metaview.ai"]), // metaview + ("https://mcp.indeed.com", &["https://apis.indeed.com", "https://secure.indeed.com"]), // indeed + ("https://api.udemy.com", &["https://api.udemy.com"]), // udemy + ("https://mcp-server.signnow.com", &["https://mcp-server.signnow.com"]), // signnow + ("https://mcp.vanta.com", &["https://api.vanta.com", "https://app.vanta.com", "https://mcp.vanta.com"]), // vanta + ("https://mcp.drata.com", &["https://drata-prod.us.auth0.com", "https://mcp.drata.com"]), // drata + ("https://mcp.figma.com", &["https://api.figma.com", "https://www.figma.com"]), // figma + ("https://mcp.miro.com", &["https://mcp.miro.com"]), // miro + ("https://mcp.lucid.app", &["https://mcp.lucid.app"]), // lucid + ("https://mcp.productboard.com", &["https://mcp.productboard.com"]), // productboard + ("https://mcp.aha.io", &["https://mcp.aha.io"]), // aha + ("https://mcp.shortcut.com", &["https://api.app.shortcut.com"]), // shortcut + ("https://ai.todoist.net", &["https://todoist.com"]), // todoist + ("https://mcp.ai.teamwork.com", &["https://teamwork.com", "https://www.teamwork.com"]), // teamwork + ("https://mcp.calendly.com", &["https://calendly.com"]), // calendly + ("https://mcp.mail.superhuman.com", &["https://mcp.auth.mail.superhuman.com"]), // superhuman + ("https://mcp.craft.do", &["https://mcp.craft.do"]), // craft + ("https://mcp.mem.ai", &["https://api.mem.ai", "https://mem.ai"]), // mem + ("https://mcp.gamma.app", &["https://auth.gamma.app"]), // gamma + ("https://mcp.pitch.com", &["https://auth.pitch.com"]), // pitch + ("https://app.eraser.io", &["https://app.eraser.io"]), // eraser + ("https://mcp.jotform.com", &["https://oauth2.jotform.com"]), // jotform + ("https://api.typeform.com", &["https://admin.typeform.com", "https://api.typeform.com"]), // typeform + ("https://mcp.surveymonkey.com", &["https://mcp.surveymonkey.com"]), // surveymonkey + ("https://mcp-server.egnyte.com", &["https://mcp-oauth.egnyte.com"]), // egnyte + ("https://ai-inc.mailchimp.com", &["https://ai-inc.mailchimp.com"]), // mailchimp + ("https://mcp.customer.io", &["https://mcp.customer.io"]), // customerio + ("https://api.ahrefs.com", &["https://ahrefs.com", "https://api.ahrefs.com", "https://app.ahrefs.com"]), // ahrefs + ("https://mcp.semrush.com", &["https://api.semrush.com", "https://oauth.semrush.com"]), // semrush + ("https://asset-management.mcp.cloudinary.com", &["https://asset-management.mcp.cloudinary.com"]), // cloudinary + ("https://mcp.contentful.com", &["https://mcp.contentful.com"]), // contentful + ("https://mcp.sanity.io", &["https://mcp.sanity.io"]), // sanity + ("https://mcp.wix.com", &["https://mcp.wix.com"]), // wix + ("https://public-api.wordpress.com", &["https://public-api.wordpress.com"]), // wordpress + ("https://mcp.gitbook.com", &["https://oauth.gitbook.com"]), // gitbook + ("https://mcp.mintlify.com", &["https://mcp.mintlify.com"]), // mintlify + ("https://mcp.deepl.com", &["https://mcp.deepl.com"]), // deepl + ("https://gitlab.com", &["https://gitlab.com"]), // gitlab + ("https://mcp.supabase.com", &["https://api.supabase.com"]), // supabase + ("https://netlify-mcp.netlify.app", &["https://netlify-mcp.netlify.app"]), // netlify + ("https://mcp.heroku.com", &["https://mcp.heroku.com"]), // heroku + ("https://mcp.buildkite.com", &["https://mcp.buildkite.com"]), // buildkite + ("https://mcp.grafana.com", &["https://mcp.grafana.com"]), // grafana + ("https://mcp.newrelic.com", &["https://login.newrelic.com", "https://mcp.newrelic.com"]), // newrelic + ("https://mcp.honeycomb.io", &["https://ui.honeycomb.io"]), // honeycomb + ("https://mcp.incident.io", &["https://app.incident.io", "https://mcp.incident.io"]), // incidentio + ("https://mcp.rootly.com", &["https://rootly.com"]), // rootly + ("https://bugsnag.mcp.smartbear.com", &["https://oauth.bugsnag.com"]), // bugsnag + ("https://mcp.launchdarkly.com", &["https://app.launchdarkly.com", "https://mcp.launchdarkly.com"]), // launchdarkly + ("https://mcp.pscale.dev", &["https://app.planetscale.com", "https://auth.planetscale.com", "https://mcp.pscale.dev"]), // planetscale + ("https://mcp.prisma.io", &["https://auth.prisma.io", "https://mcp.prisma.io"]), // prisma + ("https://mcp.instantdb.com", &["https://mcp.instantdb.com"]), // instantdb + ("https://mcp.algolia.com", &["https://dashboard.algolia.com"]), // algolia + ("https://api.statsig.com", &["https://api.statsig.com"]), // statsig + ("https://mcp.postman.com", &["https://mcp.postman.com"]), // postman + ("https://mcp.semgrep.ai", &["https://login.semgrep.dev"]), // semgrep + ("https://mcp.workos.com", &["https://signin.workos.com"]), // workos + ("https://mcp.stytch.dev", &["https://rustic-kilogram-6347.customers.stytch.com", "https://stytch.com"]), // stytch + ("https://mcp.mux.com", &["https://auth.mux.com"]), // mux + ("https://mcp.knock.app", &["https://mcp.knock.app"]), // knock + ("https://mcp.lovable.dev", &["https://lovable.dev"]), // lovable + ("https://mcp.retool.com", &["https://mcp.retool.com"]), // retool + ("https://api.telnyx.com", &["https://api.telnyx.com"]), // telnyx + ("https://mcp.jam.dev", &["https://api.jam.dev"]), // jam + ("https://mcp.globalping.dev", &["https://mcp.globalping.dev"]), // globalping + ("https://mcp.airbyte.ai", &["https://mcp.airbyte.ai"]), // airbyte + ("https://api.motherduck.com", &["https://mcp-auth.motherduck.com"]), // motherduck + ("https://integrations.getmontecarlo.com", &["https://auth.getmontecarlo.com"]), // montecarlo + ("https://mcp.atlan.com", &["https://mcp.atlan.com"]), // atlan + ("https://huggingface.co", &["https://huggingface.co"]), // huggingface + ("https://mcp.zapier.com", &["https://mcp.zapier.com"]), // zapier + ("https://mcp.make.com", &["https://www.make.com"]), // make + ("https://ifttt.com", &["https://ifttt.com"]), // ifttt + ("https://mcp.exa.ai", &["https://auth.exa.ai"]), // exa + ("https://mcp.tavily.com", &["https://mcp.tavily.com"]), // tavily + ("https://mcp.firecrawl.dev", &["https://www.firecrawl.dev"]), // firecrawl + ("https://mcp.apify.com", &["https://console-backend.apify.com", "https://console.apify.com"]), // apify + ("https://mcp.brightdata.com", &["https://brightdata.com"]), // brightdata + ("https://mcp.docusign.com", &["https://account.docusign.com", "https://mcp.docusign.com"]), // docusign + ("https://mcp.xero.com", &["https://identity.xero.com", "https://login.xero.com"]), // xero + ("https://mcp.frontapp.com", &["https://app.frontapp.com"]), // front + ("https://mcp.smartsheet.com", &["https://api.smartsheet.com", "https://app.smartsheet.com", "https://mcp.smartsheet.com"]), // smartsheet + ("https://mcp.mongodb.com", &["https://authorize.mongodb.com", "https://cloud.mongodb.com"]), // mongodb + ("https://mcp.circleci.com", &["https://app.circleci.com", "https://circleci.com", "https://mcp.circleci.com"]), // circleci + ("https://mcp.chargebee.com", &["https://app.chargebee.com"]), // chargebee + ("https://bigquery.googleapis.com", &["https://accounts.google.com", "https://oauth2.googleapis.com"]), // bigquery + ("https://mcp.na1.ironcladapp.com", &["https://ironcladapp.com"]), // ironclad + ("https://api.harvey.ai", &["https://api.harvey.ai", "https://harvey-ai.us.auth0.com"]), // harvey + ("https://mcp.tableau.com", &["https://sso.online.tableau.com"]), // tableau + ("https://setup.shopify.com", &["https://setup.shopify.com"]), // shopify +]; diff --git a/web/package.json b/web/package.json index 272510c..bf8881d 100644 --- a/web/package.json +++ b/web/package.json @@ -8,6 +8,7 @@ "build": "next build", "start": "next start", "gen:docs": "node scripts/gen-docs.mjs", + "gen:allowlist": "tsx scripts/gen-native-oauth-allowlist.ts", "lint": "eslint", "test": "vitest run", "test:watch": "vitest", diff --git a/web/scripts/gen-native-oauth-allowlist.ts b/web/scripts/gen-native-oauth-allowlist.ts new file mode 100644 index 0000000..e5e1808 --- /dev/null +++ b/web/scripts/gen-native-oauth-allowlist.ts @@ -0,0 +1,124 @@ +// Generates api/src/native_oauth_allowlist.rs from the MCP provider catalog. +// +// The Rust token-refresh path (api/src/native_oauth.rs) needs an origin +// allowlist — for each provider's MCP-server origin, the exact set of OAuth +// authorization-server origins it may advertise through protected-resource +// discovery. That data already lives in web/src/lib/mcp-providers.ts +// (mcpServerUrl + oauthAuthorizationServerOrigins), but the api crate can't +// import the TS catalog, so the Rust side used to keep a SECOND hand-written +// copy, guarded only by a drift-detecting vitest. This script eliminates that +// failure class: the Rust allowlist is now GENERATED from the catalog, and the +// vitest (mcp-providers.allowlist-sync.test.ts) fails only when the generated +// file is stale — the fix is always "regenerate", never "hand-sync two lists". +// +// Run from web/: npm run gen:allowlist (or: npx tsx scripts/gen-native-oauth-allowlist.ts) +// +// Deliberately NOT wired into the Next build: the output is committed source +// for a different crate, and regeneration should be an explicit, reviewable +// step (same convention as gen:docs). + +import { writeFileSync } from "node:fs"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; + +import { MCP_PROVIDERS } from "../src/lib/mcp-providers"; + +export const GENERATED_FILE_REPO_PATH = "api/src/native_oauth_allowlist.rs"; + +/** + * Pure projection of the catalog into the generated Rust source. Exported so + * the allowlist-sync vitest can compare this exact string against the file on + * disk (staleness check) without touching the filesystem for the "expected" + * side. + */ +export function renderNativeOauthAllowlistRs(): string { + // (mcp-server origin → allowed OAuth origins), in catalog order. Skips + // providers with no fixed MCP URL (self-key / instance-based) and providers + // with no OAuth origins (pat) — they never hit the OAuth refresh path. + const entries: { slug: string; mcpOrigin: string; oauthOrigins: string[] }[] = []; + const byOrigin = new Map(); + + for (const provider of Object.values(MCP_PROVIDERS)) { + if (!provider.mcpServerUrl) continue; + if (provider.oauthAuthorizationServerOrigins.length === 0) continue; + + const mcpOrigin = new URL(provider.mcpServerUrl).origin; + const oauthOrigins = [...new Set(provider.oauthAuthorizationServerOrigins)]; + + for (const origin of [mcpOrigin, ...oauthOrigins]) { + if (!origin.startsWith("https://")) { + throw new Error( + `${provider.slug}: non-https origin ${JSON.stringify(origin)} — ` + + `the Rust refresher only trusts https origins.`, + ); + } + if (new URL(origin).origin !== origin) { + throw new Error( + `${provider.slug}: ${JSON.stringify(origin)} is not a bare origin ` + + `(has a path, trailing slash, or default port).`, + ); + } + } + + const dup = byOrigin.get(mcpOrigin); + if (dup) { + // Two providers sharing an MCP origin must agree on the allowed OAuth + // origins, otherwise the (origin-keyed) Rust lookup is ambiguous. + const same = + JSON.stringify([...dup.oauthOrigins].sort()) === + JSON.stringify([...oauthOrigins].sort()); + if (!same) { + throw new Error( + `MCP origin ${mcpOrigin} is claimed by both "${dup.slug}" and ` + + `"${provider.slug}" with different OAuth origins — the allowlist ` + + `is keyed by origin, so these must match.`, + ); + } + continue; // identical duplicate: first entry already covers it + } + + byOrigin.set(mcpOrigin, { slug: provider.slug, oauthOrigins }); + entries.push({ slug: provider.slug, mcpOrigin, oauthOrigins }); + } + + const tuples = entries + .map( + (e) => + ` ("${e.mcpOrigin}", &[${e.oauthOrigins + .map((o) => `"${o}"`) + .join(", ")}]), // ${e.slug}\n`, + ) + .join(""); + + return `\ +// @generated by web/scripts/gen-native-oauth-allowlist.ts — DO NOT EDIT BY HAND. +// +// Source of truth: web/src/lib/mcp-providers.ts (MCP_PROVIDERS). Each tuple is +// (MCP-server origin, exact OAuth authorization-server origins that provider +// may advertise through /.well-known/oauth-protected-resource). The refresh +// path in native_oauth.rs aborts when a discovered endpoint's origin is not in +// this list — see the Dialed regression for why. +// +// Regenerate after ANY catalog change that touches mcpServerUrl or +// oauthAuthorizationServerOrigins: +// +// cd web && npm run gen:allowlist +// +// CI enforcement: web/src/lib/mcp-providers.allowlist-sync.test.ts fails when +// this file is stale. + +#[rustfmt::skip] +pub(crate) const NATIVE_MCP_OAUTH_ALLOWLIST: &[(&str, &[&str])] = &[ +${tuples}]; +`; +} + +// Write the file when executed directly (not when imported by the vitest). +const isMain = + process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1]; +if (isMain) { + const here = dirname(fileURLToPath(import.meta.url)); + const outPath = join(here, "..", "..", GENERATED_FILE_REPO_PATH); + writeFileSync(outPath, renderNativeOauthAllowlistRs()); + console.log(`wrote ${outPath}`); +} diff --git a/web/src/lib/mcp-providers.allowlist-sync.test.ts b/web/src/lib/mcp-providers.allowlist-sync.test.ts index b8c3715..2827402 100644 --- a/web/src/lib/mcp-providers.allowlist-sync.test.ts +++ b/web/src/lib/mcp-providers.allowlist-sync.test.ts @@ -3,43 +3,28 @@ import { join } from "node:path"; import { describe, expect, it } from "vitest"; -import { MCP_PROVIDERS } from "./mcp-providers"; +import { + GENERATED_FILE_REPO_PATH, + renderNativeOauthAllowlistRs, +} from "../../scripts/gen-native-oauth-allowlist"; -// Drift guard. The Rust token-refresh path keeps its OWN origin allowlist -// (api/src/native_oauth.rs, NATIVE_MCP_OAUTH_ALLOWLIST) because the api crate -// can't import this TS catalog. If a new native-MCP provider is added here but -// not there, refreshes for it abort with "origin is not in the allowlist" and -// its short-lived tokens 401 mid-run — exactly the Dialed regression. This test -// fails CI when the two drift, so the Rust side can't be forgotten. +// Staleness guard. The Rust token-refresh path's origin allowlist +// (api/src/native_oauth_allowlist.rs) is GENERATED from the MCP_PROVIDERS +// catalog by web/scripts/gen-native-oauth-allowlist.ts, because the api crate +// can't import this TS catalog. If the catalog changes but the generated file +// isn't regenerated, refreshes for the new/changed provider abort with +// "origin is not in the allowlist" and its short-lived tokens 401 mid-run — +// exactly the Dialed regression. // -// CI checks out the whole repo, so api/ is reachable from the web package. -describe("native-MCP OAuth origin allowlist stays in sync with the Rust refresher", () => { - const rs = readFileSync( - join(process.cwd(), "..", "api", "src", "native_oauth.rs"), - "utf8", - ); - - for (const provider of Object.values(MCP_PROVIDERS)) { - // Only OAuth providers are refreshed (self-key / PAT providers like - // tembo-agent-studio have no auth-server origins and aren't in the sweep). - if (provider.oauthAuthorizationServerOrigins.length === 0) continue; - - it(`${provider.slug}'s MCP origin is in native_oauth.rs`, () => { - const mcpOrigin = new URL(provider.mcpServerUrl).origin; - expect( - rs.includes(`"${mcpOrigin}"`), - `${provider.slug} (${mcpOrigin}) is in the web catalog but missing from ` + - `NATIVE_MCP_OAUTH_ALLOWLIST in api/src/native_oauth.rs — add it there or ` + - `token refresh for ${provider.slug} will abort and its tokens will 401 mid-run.`, - ).toBe(true); - - // And each advertised OAuth authorization-server origin must be allowed too. - for (const oauthOrigin of provider.oauthAuthorizationServerOrigins) { - expect( - rs.includes(`"${oauthOrigin}"`), - `${provider.slug}'s OAuth origin ${oauthOrigin} is missing from native_oauth.rs.`, - ).toBe(true); - } - }); - } +// Unlike the old hand-synced drift test, the fix here is never "go edit the +// Rust file": it's always one command. CI checks out the whole repo, so api/ +// is reachable from the web package. +describe("generated native-MCP OAuth allowlist (api/src/native_oauth_allowlist.rs)", () => { + it("is up to date with the MCP_PROVIDERS catalog — if this fails, run `npm run gen:allowlist` in web/ and commit the result", () => { + const onDisk = readFileSync( + join(process.cwd(), "..", GENERATED_FILE_REPO_PATH), + "utf8", + ); + expect(onDisk).toBe(renderNativeOauthAllowlistRs()); + }); }); diff --git a/web/src/lib/mcp-providers.ts b/web/src/lib/mcp-providers.ts index 5511ae7..8174d39 100644 --- a/web/src/lib/mcp-providers.ts +++ b/web/src/lib/mcp-providers.ts @@ -223,7 +223,13 @@ export type McpProvider = { * since the origin is env-derived rather than a constant. */ mcpServerUrl: string; /** Exact OAuth authorization-server origins this provider is allowed - * to advertise through protected-resource discovery. */ + * to advertise through protected-resource discovery. + * + * Also the source of truth for the Rust token-refresher's origin + * allowlist: api/src/native_oauth_allowlist.rs is GENERATED from this + * field (plus mcpServerUrl's origin). After changing either, run + * `npm run gen:allowlist` and commit the regenerated file — the + * allowlist-sync vitest fails CI while it's stale. */ oauthAuthorizationServerOrigins: string[]; /** * How TAS obtains an OAuth client for this provider: