From dc50bf7719039ff2b8e22ec563e7c47b24691ebb Mon Sep 17 00:00:00 2001 From: jpelletier1 Date: Wed, 19 Aug 2026 11:06:06 +0000 Subject: [PATCH] Add GitLab MCP server integration to catalog Adds integrations/catalog/gitlab.json for GitLab's official MCP server (https://docs.gitlab.com/user/model_context_protocol/mcp_server/): - OAuth 2.0 with dynamic client registration (registrationUrl verified against gitlab.com's .well-known/oauth-authorization-server), mcp scope, PKCE, public client - shttp transport at https://gitlab.com/api/v4/mcp with urlEditable for GitLab Self-Managed instances - notes/installHint document the beta prerequisites (MCP access must be allowed for the group/instance) Regenerates integrations/catalog-index.js via npm run build:integrations. Co-authored-by: openhands --- integrations/catalog-index.js | 142 ++++++++++++++++--------------- integrations/catalog/gitlab.json | 49 +++++++++++ 2 files changed, 121 insertions(+), 70 deletions(-) create mode 100644 integrations/catalog/gitlab.json diff --git a/integrations/catalog-index.js b/integrations/catalog-index.js index 09416cfb..e6546e36 100644 --- a/integrations/catalog-index.js +++ b/integrations/catalog-index.js @@ -8,76 +8,77 @@ import entry2 from "./catalog/tavily.json" with { type: "json" }; import entry3 from "./catalog/atlassian.json" with { type: "json" }; import entry4 from "./catalog/linear.json" with { type: "json" }; import entry5 from "./catalog/notion.json" with { type: "json" }; -import entry6 from "./catalog/vanta.json" with { type: "json" }; -import entry7 from "./catalog/ordinal.json" with { type: "json" }; -import entry8 from "./catalog/elevenlabs.json" with { type: "json" }; -import entry9 from "./catalog/bitbucket.json" with { type: "json" }; -import entry10 from "./catalog/xero.json" with { type: "json" }; -import entry11 from "./catalog/quickbooks.json" with { type: "json" }; -import entry12 from "./catalog/sonarqube.json" with { type: "json" }; -import entry13 from "./catalog/okta.json" with { type: "json" }; -import entry14 from "./catalog/netlify.json" with { type: "json" }; -import entry15 from "./catalog/vercel.json" with { type: "json" }; -import entry16 from "./catalog/supabase.json" with { type: "json" }; -import entry17 from "./catalog/posthog.json" with { type: "json" }; -import entry18 from "./catalog/sentry.json" with { type: "json" }; -import entry19 from "./catalog/datadog.json" with { type: "json" }; -import entry20 from "./catalog/canva.json" with { type: "json" }; -import entry21 from "./catalog/miro.json" with { type: "json" }; -import entry22 from "./catalog/webflow.json" with { type: "json" }; -import entry23 from "./catalog/zoom.json" with { type: "json" }; -import entry24 from "./catalog/discord.json" with { type: "json" }; -import entry25 from "./catalog/stripe.json" with { type: "json" }; -import entry26 from "./catalog/intercom.json" with { type: "json" }; -import entry27 from "./catalog/hubspot.json" with { type: "json" }; -import entry28 from "./catalog/salesforce.json" with { type: "json" }; -import entry29 from "./catalog/sharepoint.json" with { type: "json" }; -import entry30 from "./catalog/onedrive.json" with { type: "json" }; -import entry31 from "./catalog/microsoft-teams.json" with { type: "json" }; -import entry32 from "./catalog/microsoft-outlook.json" with { type: "json" }; -import entry33 from "./catalog/box.json" with { type: "json" }; -import entry34 from "./catalog/airtable.json" with { type: "json" }; -import entry35 from "./catalog/monday.json" with { type: "json" }; -import entry36 from "./catalog/trello.json" with { type: "json" }; -import entry37 from "./catalog/asana.json" with { type: "json" }; -import entry38 from "./catalog/confluence.json" with { type: "json" }; -import entry39 from "./catalog/jira.json" with { type: "json" }; -import entry40 from "./catalog/google-calendar.json" with { type: "json" }; -import entry41 from "./catalog/gmail.json" with { type: "json" }; -import entry42 from "./catalog/google-sheets.json" with { type: "json" }; -import entry43 from "./catalog/google-drive.json" with { type: "json" }; -import entry44 from "./catalog/figma.json" with { type: "json" }; -import entry45 from "./catalog/google-docs.json" with { type: "json" }; -import entry46 from "./catalog/apify.json" with { type: "json" }; -import entry47 from "./catalog/atlassian-rovo.json" with { type: "json" }; -import entry48 from "./catalog/brave-search.json" with { type: "json" }; -import entry49 from "./catalog/browser-mcp.json" with { type: "json" }; -import entry50 from "./catalog/clickhouse.json" with { type: "json" }; -import entry51 from "./catalog/cloudflare-bindings.json" with { type: "json" }; -import entry52 from "./catalog/cloudflare-browser-rendering.json" with { type: "json" }; -import entry53 from "./catalog/cloudflare-builds.json" with { type: "json" }; -import entry54 from "./catalog/cloudflare-docs.json" with { type: "json" }; -import entry55 from "./catalog/cloudflare-observability.json" with { type: "json" }; -import entry56 from "./catalog/deepwiki.json" with { type: "json" }; -import entry57 from "./catalog/everything.json" with { type: "json" }; -import entry58 from "./catalog/exa.json" with { type: "json" }; -import entry59 from "./catalog/fetch.json" with { type: "json" }; -import entry60 from "./catalog/filesystem.json" with { type: "json" }; -import entry61 from "./catalog/firecrawl.json" with { type: "json" }; -import entry62 from "./catalog/git.json" with { type: "json" }; -import entry63 from "./catalog/huggingface.json" with { type: "json" }; -import entry64 from "./catalog/kagi.json" with { type: "json" }; -import entry65 from "./catalog/memory.json" with { type: "json" }; -import entry66 from "./catalog/mongodb.json" with { type: "json" }; -import entry67 from "./catalog/neon.json" with { type: "json" }; -import entry68 from "./catalog/obsidian.json" with { type: "json" }; -import entry69 from "./catalog/paypal.json" with { type: "json" }; -import entry70 from "./catalog/playwright.json" with { type: "json" }; -import entry71 from "./catalog/redis.json" with { type: "json" }; -import entry72 from "./catalog/resend.json" with { type: "json" }; -import entry73 from "./catalog/sequential-thinking.json" with { type: "json" }; -import entry74 from "./catalog/superhuman-mail.json" with { type: "json" }; -import entry75 from "./catalog/time.json" with { type: "json" }; +import entry6 from "./catalog/gitlab.json" with { type: "json" }; +import entry7 from "./catalog/vanta.json" with { type: "json" }; +import entry8 from "./catalog/ordinal.json" with { type: "json" }; +import entry9 from "./catalog/elevenlabs.json" with { type: "json" }; +import entry10 from "./catalog/bitbucket.json" with { type: "json" }; +import entry11 from "./catalog/xero.json" with { type: "json" }; +import entry12 from "./catalog/quickbooks.json" with { type: "json" }; +import entry13 from "./catalog/sonarqube.json" with { type: "json" }; +import entry14 from "./catalog/okta.json" with { type: "json" }; +import entry15 from "./catalog/netlify.json" with { type: "json" }; +import entry16 from "./catalog/vercel.json" with { type: "json" }; +import entry17 from "./catalog/supabase.json" with { type: "json" }; +import entry18 from "./catalog/posthog.json" with { type: "json" }; +import entry19 from "./catalog/sentry.json" with { type: "json" }; +import entry20 from "./catalog/datadog.json" with { type: "json" }; +import entry21 from "./catalog/canva.json" with { type: "json" }; +import entry22 from "./catalog/miro.json" with { type: "json" }; +import entry23 from "./catalog/webflow.json" with { type: "json" }; +import entry24 from "./catalog/zoom.json" with { type: "json" }; +import entry25 from "./catalog/discord.json" with { type: "json" }; +import entry26 from "./catalog/stripe.json" with { type: "json" }; +import entry27 from "./catalog/intercom.json" with { type: "json" }; +import entry28 from "./catalog/hubspot.json" with { type: "json" }; +import entry29 from "./catalog/salesforce.json" with { type: "json" }; +import entry30 from "./catalog/sharepoint.json" with { type: "json" }; +import entry31 from "./catalog/onedrive.json" with { type: "json" }; +import entry32 from "./catalog/microsoft-teams.json" with { type: "json" }; +import entry33 from "./catalog/microsoft-outlook.json" with { type: "json" }; +import entry34 from "./catalog/box.json" with { type: "json" }; +import entry35 from "./catalog/airtable.json" with { type: "json" }; +import entry36 from "./catalog/monday.json" with { type: "json" }; +import entry37 from "./catalog/trello.json" with { type: "json" }; +import entry38 from "./catalog/asana.json" with { type: "json" }; +import entry39 from "./catalog/confluence.json" with { type: "json" }; +import entry40 from "./catalog/jira.json" with { type: "json" }; +import entry41 from "./catalog/google-calendar.json" with { type: "json" }; +import entry42 from "./catalog/gmail.json" with { type: "json" }; +import entry43 from "./catalog/google-sheets.json" with { type: "json" }; +import entry44 from "./catalog/google-drive.json" with { type: "json" }; +import entry45 from "./catalog/figma.json" with { type: "json" }; +import entry46 from "./catalog/google-docs.json" with { type: "json" }; +import entry47 from "./catalog/apify.json" with { type: "json" }; +import entry48 from "./catalog/atlassian-rovo.json" with { type: "json" }; +import entry49 from "./catalog/brave-search.json" with { type: "json" }; +import entry50 from "./catalog/browser-mcp.json" with { type: "json" }; +import entry51 from "./catalog/clickhouse.json" with { type: "json" }; +import entry52 from "./catalog/cloudflare-bindings.json" with { type: "json" }; +import entry53 from "./catalog/cloudflare-browser-rendering.json" with { type: "json" }; +import entry54 from "./catalog/cloudflare-builds.json" with { type: "json" }; +import entry55 from "./catalog/cloudflare-docs.json" with { type: "json" }; +import entry56 from "./catalog/cloudflare-observability.json" with { type: "json" }; +import entry57 from "./catalog/deepwiki.json" with { type: "json" }; +import entry58 from "./catalog/everything.json" with { type: "json" }; +import entry59 from "./catalog/exa.json" with { type: "json" }; +import entry60 from "./catalog/fetch.json" with { type: "json" }; +import entry61 from "./catalog/filesystem.json" with { type: "json" }; +import entry62 from "./catalog/firecrawl.json" with { type: "json" }; +import entry63 from "./catalog/git.json" with { type: "json" }; +import entry64 from "./catalog/huggingface.json" with { type: "json" }; +import entry65 from "./catalog/kagi.json" with { type: "json" }; +import entry66 from "./catalog/memory.json" with { type: "json" }; +import entry67 from "./catalog/mongodb.json" with { type: "json" }; +import entry68 from "./catalog/neon.json" with { type: "json" }; +import entry69 from "./catalog/obsidian.json" with { type: "json" }; +import entry70 from "./catalog/paypal.json" with { type: "json" }; +import entry71 from "./catalog/playwright.json" with { type: "json" }; +import entry72 from "./catalog/redis.json" with { type: "json" }; +import entry73 from "./catalog/resend.json" with { type: "json" }; +import entry74 from "./catalog/sequential-thinking.json" with { type: "json" }; +import entry75 from "./catalog/superhuman-mail.json" with { type: "json" }; +import entry76 from "./catalog/time.json" with { type: "json" }; export const INTEGRATION_CATALOG_ENTRIES = [ entry0, @@ -156,4 +157,5 @@ export const INTEGRATION_CATALOG_ENTRIES = [ entry73, entry74, entry75, + entry76, ]; diff --git a/integrations/catalog/gitlab.json b/integrations/catalog/gitlab.json new file mode 100644 index 00000000..656a9d7c --- /dev/null +++ b/integrations/catalog/gitlab.json @@ -0,0 +1,49 @@ +{ + "id": "gitlab", + "name": "GitLab", + "description": "Access projects, issues, and merge requests via GitLab's official MCP server.", + "categories": [ + "Engineering", + "Source control" + ], + "appUrl": "https://gitlab.com", + "docsUrl": "https://docs.gitlab.com/user/model_context_protocol/mcp_server/", + "notes": "Uses GitLab's official MCP server (beta). Access to the MCP server must be allowed for the top-level group on GitLab.com, or for the instance on GitLab Self-Managed. OAuth uses dynamic client registration with the mcp scope. On GitLab Self-Managed the MCP endpoint and OAuth URLs are host-specific: edit the URL to https:///api/v4/mcp.", + "popularityRank": 80, + "connectionOptions": [ + { + "id": "oauth", + "provider": "mcp", + "auth": { + "strategy": "oauth2", + "oauth": { + "authorizationUrl": "https://gitlab.com/oauth/authorize", + "tokenUrl": "https://gitlab.com/oauth/token", + "registrationUrl": "https://gitlab.com/oauth/register", + "scopes": [ + "mcp" + ], + "pkce": true, + "clientAuthentication": "none" + } + }, + "transport": { + "kind": "shttp", + "url": "https://gitlab.com/api/v4/mcp", + "urlEditable": true + } + } + ], + "iconBg": "#FC6D26", + "logoUrl": "https://cdn.simpleicons.org/gitlab/FFFFFF", + "keywords": [ + "git", + "repo", + "merge request", + "mr", + "issues", + "code", + "devops" + ], + "installHint": "Prefer the OAuth MCP connection. The GitLab MCP server supports OAuth 2.0 with dynamic client registration using the mcp scope. For GitLab Self-Managed, edit the URL to https:///api/v4/mcp and make sure MCP server access is enabled for the instance." +}