@openhands/extensions 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/.github/workflows/pypi-publish.yml +104 -0
  2. package/.github/workflows/tests.yml +6 -0
  3. package/.release-please-manifest.json +1 -1
  4. package/AGENTS.md +1 -1
  5. package/README.md +34 -4
  6. package/integrations/README.md +25 -9
  7. package/integrations/catalog/airtable.json +16 -10
  8. package/integrations/catalog/apify.json +0 -2
  9. package/integrations/catalog/asana.json +33 -0
  10. package/integrations/catalog/atlassian.json +5 -8
  11. package/integrations/catalog/bitbucket.json +34 -0
  12. package/integrations/catalog/box.json +34 -0
  13. package/integrations/catalog/brave-search.json +1 -2
  14. package/integrations/catalog/browser-mcp.json +0 -3
  15. package/integrations/catalog/canva.json +31 -0
  16. package/integrations/catalog/clickhouse.json +1 -2
  17. package/integrations/catalog/cloudflare-bindings.json +5 -8
  18. package/integrations/catalog/cloudflare-browser-rendering.json +5 -8
  19. package/integrations/catalog/cloudflare-builds.json +6 -9
  20. package/integrations/catalog/cloudflare-docs.json +4 -7
  21. package/integrations/catalog/cloudflare-observability.json +5 -8
  22. package/integrations/catalog/confluence.json +33 -0
  23. package/integrations/catalog/datadog.json +34 -0
  24. package/integrations/catalog/deepwiki.json +3 -7
  25. package/integrations/catalog/discord.json +34 -0
  26. package/integrations/catalog/elevenlabs.json +27 -28
  27. package/integrations/catalog/everything.json +0 -2
  28. package/integrations/catalog/exa.json +0 -2
  29. package/integrations/catalog/fetch.json +0 -2
  30. package/integrations/catalog/figma.json +35 -9
  31. package/integrations/catalog/filesystem.json +0 -3
  32. package/integrations/catalog/firecrawl.json +0 -2
  33. package/integrations/catalog/git.json +0 -3
  34. package/integrations/catalog/github.json +34 -10
  35. package/integrations/catalog/gmail.json +33 -0
  36. package/integrations/catalog/google-calendar.json +33 -0
  37. package/integrations/catalog/google-docs.json +33 -0
  38. package/integrations/catalog/google-drive.json +33 -0
  39. package/integrations/catalog/google-sheets.json +33 -0
  40. package/integrations/catalog/hubspot.json +34 -0
  41. package/integrations/catalog/huggingface.json +1 -2
  42. package/integrations/catalog/intercom.json +34 -0
  43. package/integrations/catalog/jira.json +33 -0
  44. package/integrations/catalog/kagi.json +2 -3
  45. package/integrations/catalog/linear.json +24 -16
  46. package/integrations/catalog/memory.json +0 -2
  47. package/integrations/catalog/microsoft-outlook.json +33 -0
  48. package/integrations/catalog/microsoft-teams.json +33 -0
  49. package/integrations/catalog/miro.json +42 -0
  50. package/integrations/catalog/monday.json +42 -0
  51. package/integrations/catalog/mongodb.json +1 -2
  52. package/integrations/catalog/neon.json +0 -2
  53. package/integrations/catalog/netlify.json +33 -0
  54. package/integrations/catalog/notion.json +30 -10
  55. package/integrations/catalog/obsidian.json +1 -3
  56. package/integrations/catalog/okta.json +33 -0
  57. package/integrations/catalog/onedrive.json +33 -0
  58. package/integrations/catalog/ordinal.json +33 -0
  59. package/integrations/catalog/paypal.json +5 -8
  60. package/integrations/catalog/playwright.json +0 -2
  61. package/integrations/catalog/posthog.json +38 -0
  62. package/integrations/catalog/quickbooks.json +86 -0
  63. package/integrations/catalog/redis.json +1 -3
  64. package/integrations/catalog/resend.json +1 -2
  65. package/integrations/catalog/salesforce.json +44 -0
  66. package/integrations/catalog/sentry.json +47 -14
  67. package/integrations/catalog/sequential-thinking.json +0 -2
  68. package/integrations/catalog/sharepoint.json +33 -0
  69. package/integrations/catalog/slack.json +49 -10
  70. package/integrations/catalog/stripe.json +39 -14
  71. package/integrations/catalog/supabase.json +31 -9
  72. package/integrations/catalog/tavily.json +0 -2
  73. package/integrations/catalog/time.json +0 -2
  74. package/integrations/catalog/trello.json +34 -0
  75. package/integrations/catalog/vercel.json +33 -0
  76. package/integrations/catalog/webflow.json +34 -0
  77. package/integrations/catalog/xero.json +33 -0
  78. package/integrations/catalog/zoom.json +33 -0
  79. package/integrations/catalog-index.js +151 -0
  80. package/integrations/catalog.schema.json +255 -0
  81. package/integrations/index.d.ts +49 -69
  82. package/integrations/index.js +36 -206
  83. package/marketplaces/openhands-extensions.json +40 -2
  84. package/package.json +4 -7
  85. package/plugins/cobol-modernization/README.md +3 -3
  86. package/plugins/cobol-modernization/skills/{cobol-modernization-overview → cobol-modernization}/SKILL.md +1 -1
  87. package/plugins/magic-test/skills/magic-word/SKILL.md +1 -0
  88. package/plugins/migration-scoring/README.md +1 -1
  89. package/plugins/pr-review/scripts/prompt.py +1 -1
  90. package/pyproject.toml +18 -3
  91. package/python/openhands_extensions/__init__.py +24 -0
  92. package/python/openhands_extensions/_version.py +25 -0
  93. package/python/openhands_extensions/integrations.py +92 -0
  94. package/release-please-config.json +2 -1
  95. package/scripts/build-integration-catalog.mjs +45 -0
  96. package/skills/agent-canvas-environment/.plugin/plugin.json +19 -0
  97. package/skills/agent-canvas-environment/README.md +5 -0
  98. package/skills/agent-canvas-environment/SKILL.md +202 -0
  99. package/skills/bitbucket/README.md +23 -40
  100. package/skills/bitbucket/SKILL.md +43 -31
  101. package/skills/bitbucket-cloud/.plugin/plugin.json +18 -0
  102. package/skills/bitbucket-cloud/README.md +15 -0
  103. package/skills/bitbucket-cloud/SKILL.md +46 -0
  104. package/skills/bitbucket-data-center/.plugin/plugin.json +19 -0
  105. package/skills/bitbucket-data-center/README.md +20 -0
  106. package/skills/bitbucket-data-center/SKILL.md +53 -0
  107. package/skills/code-review/SKILL.md +1 -1
  108. package/skills/code-review/references/supply-chain-security.md +2 -2
  109. package/skills/github-pr-reviewer/references/state-schema.md +18 -4
  110. package/skills/github-pr-reviewer/scripts/main.py +66 -12
  111. package/skills/github-repo-monitor/references/state-schema.md +11 -4
  112. package/skills/github-repo-monitor/scripts/main.py +67 -19
  113. package/skills/github-repo-monitor/tests/test_main.py +67 -8
  114. package/skills/index.js +34 -8
  115. package/skills/openhands-api/README.md +5 -1
  116. package/skills/openhands-api/SKILL.md +74 -5
  117. package/skills/openhands-automation/SKILL.md +3 -1
  118. package/skills/openhands-automation/references/custom-automation.md +166 -0
  119. package/skills/openhands-sdk/SKILL.md +8 -3
  120. package/skills/slack-channel-monitor/README.md +3 -3
  121. package/skills/slack-channel-monitor/SKILL.md +3 -2
  122. package/skills/slack-channel-monitor/references/state-schema.md +11 -4
  123. package/skills/slack-channel-monitor/scripts/main.py +111 -41
  124. package/tests/test_catalog_schema.py +47 -0
  125. package/tests/test_catalogs.py +47 -3
  126. package/tests/test_integration_catalog_in_sync.py +252 -0
  127. package/tests/test_slack_channel_monitor.py +142 -0
  128. package/tests/test_version_alignment.py +64 -0
  129. package/integrations/logos.d.ts +0 -5
  130. package/integrations/logos.js +0 -94
  131. package/integrations/oauth-provider-catalog.js +0 -553
  132. package/integrations/oauth-provider-registration-defaults.js +0 -610
  133. /package/plugins/cobol-modernization/skills/{mainfraime-removal → mainframe-removal}/SKILL.md +0 -0
  134. /package/plugins/cobol-modernization/skills/{mainfraime-removal → mainframe-removal}/references/cics-transformation-examples.md +0 -0
  135. /package/plugins/migration-scoring/skills/{migration-scoring-overview → migration-scoring}/SKILL.md +0 -0
@@ -0,0 +1,104 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ release:
6
+ types: [published]
7
+
8
+ concurrency:
9
+ group: pypi-publish-${{ github.event.release.tag_name || github.ref }}
10
+ cancel-in-progress: false
11
+
12
+ permissions:
13
+ contents: read
14
+
15
+ jobs:
16
+ build:
17
+ name: Build Python distributions
18
+ runs-on: ubuntu-24.04
19
+ timeout-minutes: 15
20
+
21
+ steps:
22
+ - name: Check out repository
23
+ uses: actions/checkout@v6
24
+
25
+ - name: Extract version
26
+ id: extract_version
27
+ env:
28
+ RELEASE_TAG: ${{ github.event.release.tag_name }}
29
+ run: |
30
+ if [ "${{ github.event_name }}" = "release" ]; then
31
+ VERSION="${RELEASE_TAG#v}"
32
+ else
33
+ VERSION=$(python - <<'PY'
34
+ import tomllib
35
+ from pathlib import Path
36
+
37
+ print(tomllib.loads(Path("pyproject.toml").read_text())["project"]["version"])
38
+ PY
39
+ )
40
+ fi
41
+
42
+ echo "version=$VERSION" >> "$GITHUB_OUTPUT"
43
+ echo "📦 Version: $VERSION"
44
+
45
+ - name: Install uv
46
+ uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
47
+ with:
48
+ version: latest
49
+ python-version: '3.12'
50
+
51
+ - name: Validate package version matches release tag
52
+ if: github.event_name == 'release'
53
+ env:
54
+ VERSION: ${{ steps.extract_version.outputs.version }}
55
+ run: |
56
+ PACKAGE_VERSION=$(python - <<'PY'
57
+ import tomllib
58
+ from pathlib import Path
59
+
60
+ print(tomllib.loads(Path("pyproject.toml").read_text())["project"]["version"])
61
+ PY
62
+ )
63
+
64
+ echo "Package version: $PACKAGE_VERSION"
65
+ echo "Release tag version: $VERSION"
66
+ if [ "$PACKAGE_VERSION" != "$VERSION" ]; then
67
+ echo "Error: pyproject.toml version ($PACKAGE_VERSION) doesn't match release tag ($VERSION)"
68
+ exit 1
69
+ fi
70
+
71
+ - name: Build package
72
+ run: uv build
73
+
74
+ - name: Upload distributions
75
+ uses: actions/upload-artifact@v6
76
+ with:
77
+ name: python-package-distributions
78
+ path: dist/
79
+ if-no-files-found: error
80
+
81
+ publish:
82
+ name: Publish openhands-extensions to PyPI
83
+ if: >
84
+ github.event_name == 'workflow_dispatch' ||
85
+ !github.event.release.prerelease
86
+ needs: build
87
+ runs-on: ubuntu-24.04
88
+ timeout-minutes: 15
89
+ environment:
90
+ name: pypi
91
+ url: https://pypi.org/p/openhands-extensions
92
+ permissions:
93
+ contents: read
94
+ id-token: write
95
+
96
+ steps:
97
+ - name: Download distributions
98
+ uses: actions/download-artifact@v6
99
+ with:
100
+ name: python-package-distributions
101
+ path: dist/
102
+
103
+ - name: Publish to PyPI
104
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -1,5 +1,6 @@
1
1
  name: Tests
2
2
 
3
+ # NOTE: pull_request (not pull_request_target) so checks run against the PR head.
3
4
  on:
4
5
  pull_request:
5
6
  branches: ["*"]
@@ -19,6 +20,11 @@ jobs:
19
20
  enable-cache: true
20
21
  python-version: "3.12"
21
22
 
23
+ - name: Setup Node.js
24
+ uses: actions/setup-node@v4
25
+ with:
26
+ node-version: "20"
27
+
22
28
  - name: Run tests
23
29
  run: uv run --group test pytest tests/
24
30
  env:
@@ -1,3 +1,3 @@
1
1
  {
2
- ".": "0.5.0"
2
+ ".": "0.7.0"
3
3
  }
package/AGENTS.md CHANGED
@@ -90,7 +90,7 @@ When editing or adding skills in this repo, follow these rules (and add new skil
90
90
  - Keep formatting consistent across skills.
91
91
  - If you change a skill’s behavior or scope, update its `README.md` (if present) accordingly.
92
92
  - If you change top-level documentation, ensure links still resolve.
93
- - `integrations/catalog/*.json` and `integrations/index.js` are the source of truth consumed by `@openhands/extensions`; agent-canvas and integrations-hub import this package directly, so integration marketplace fixes belong here rather than in app-local constants. When upstream MCP projects move repos, verify both `docsUrl` and the connection option (`transport`, `command`/`args`, or URL), not just links.
93
+ - `integrations/catalog/*.json` is the single hand-authored source of truth consumed by `@openhands/extensions`; adding or editing an integration should require changing exactly one JSON file in that directory. Do not reintroduce `integrations/integration-catalog.json`, separate provider files, per-language catalog duplicates, or provider-specific runtime code. Run `npm run build:integrations` after catalog edits to regenerate `integrations/catalog-index.js`, which statically imports each individual JSON file for the JS package. The Python package includes the same individual JSON files via wheel data and reads them directly. Agent-canvas and integrations-hub import this package directly, so integration marketplace fixes belong here rather than in app-local constants. When upstream MCP projects move repos, verify both `docsUrl` and the connection option (`transport`, `command`/`args`, or URL), not just links. JS exposes `listIntegrationCatalog({ mcp, oauth })` / `getIntegrationCatalogEntry`; Python mirrors with `list_integration_catalog(mcp=, oauth=)` / `get_integration_catalog_entry`. The legacy provider-catalog compatibility layer and `managedConnectorMigration` / `legacyScopeBundles` / `canonicalServerUrl` / `errorHints` mechanisms were removed intentionally; providers declare only standard OAuth config as integration data.
94
94
  - For Python test runs, prefer `uv sync --group test` followed by `uv run pytest -q`; the full suite depends on `openhands-sdk`, which is not available in the base environment.
95
95
  - Agent-driven plugins (for example `plugins/pr-review` and `plugins/release-notes`) use `uv run --with openhands-sdk --with openhands-tools ...` and require an `LLM_API_KEY` in addition to `GITHUB_TOKEN`.
96
96
  - For OpenHands Cloud API guidance, automations, and CLI integration, use `plugins/openhands`. It is the canonical unified OpenHands plugin covering the V1 Cloud API, Automations API, and CLI. The individual skills (`skills/openhands-api`, `skills/openhands-automation`) are also available standalone.
package/README.md CHANGED
@@ -57,10 +57,37 @@ import marketplace from "@openhands/extensions/marketplaces/openhands-extensions
57
57
 
58
58
  See [`integrations/README.md`](integrations/README.md), [`automations/README.md`](automations/README.md), and [`MIGRATION.md`](MIGRATION.md) for catalog-specific details.
59
59
 
60
+ ### Python Package
61
+
62
+ The integration catalog is also published as a Python package (`openhands-extensions`) so Python services read the same catalog data as JS consumers. The single source of truth is the hand-authored JSON directory `integrations/catalog/<id>.json`; there is no separate provider file and no aggregate catalog JSON to maintain. Both the JS package (`@openhands/extensions/integrations`) and the Python package read those same per-integration JSON files and expose parallel read functions.
63
+
64
+ Each catalog entry can carry oauth and/or mcp/http `connectionOptions`. `supportsOauth` / `supportsMcp` flags are derived at runtime. Use `listIntegrationCatalog({ mcp, oauth })` (JS) or `list_integration_catalog(mcp=, oauth=)` (Python) to filter by connector type - for example only integrations that support an oauth connector.
65
+
66
+ ```python
67
+ from openhands_extensions import (
68
+ list_integration_catalog, # listIntegrationCatalog({ mcp, oauth })
69
+ get_integration_catalog_entry, # getIntegrationCatalogEntry(id)
70
+ INTEGRATION_CATALOG_SNAPSHOT, # { integrations }
71
+ )
72
+
73
+ all_integrations = list_integration_catalog()
74
+ oauth_integrations = list_integration_catalog(oauth=True) # only entries with an oauth connector
75
+ mcp_integrations = list_integration_catalog(mcp=True) # only entries with an mcp connector
76
+ sample = get_integration_catalog_entry(all_integrations[0]["id"])
77
+ ```
78
+
79
+ Install from git (the hub backend consumes it this way):
80
+
81
+ ```bash
82
+ pip install git+https://github.com/OpenHands/extensions.git
83
+ ```
84
+
85
+ The JS and Python versions are kept in lock-step by `release-please` and guarded by `tests/test_version_alignment.py`.
86
+
60
87
  ## Extensions Catalog
61
88
 
62
89
  <!-- BEGIN AUTO-GENERATED CATALOG -->
63
- This repository contains **2 marketplace(s)** with **57 extensions** (47 skills, 10 plugins).
90
+ This repository contains **2 marketplace(s)** with **60 extensions** (50 skills, 10 plugins).
64
91
 
65
92
  ### large-codebase
66
93
 
@@ -79,16 +106,19 @@ OpenHands skills for interacting, improving, and refactoring large codebases
79
106
 
80
107
  Official skills and plugins for OpenHands — the open-source AI software engineer.
81
108
 
82
- **53 extensions** (45 skills, 8 plugins)
109
+ **56 extensions** (48 skills, 8 plugins)
83
110
 
84
111
  | Name | Type | Description | Commands |
85
112
  |------|------|-------------|----------|
86
113
  | add-skill | skill | Add (import) an OpenHands skill from a GitHub repository into the current workspace. | — |
114
+ | agent-canvas-environment | skill | Work effectively inside a local Agent Canvas environment, including local agent-server auth, safe workspace hygiene, ... | — |
87
115
  | agent-creator | skill | Create file-based sub-agents as Markdown files — no Python code required. Guides the user through a structured interv... | `/agent-creator` |
88
116
  | agent-memory | skill | Persist and retrieve repository-specific knowledge using AGENTS.md files. Use when you want to save important informa... | `/remember` |
89
117
  | agent-sdk-builder | skill | Guided workflow for building custom AI agents using the OpenHands Software Agent SDK. Use when you want to create a n... | `/agent-builder` |
90
118
  | azure-devops | skill | Interact with Azure DevOps repositories, pull requests, and APIs using the AZURE_DEVOPS_TOKEN environment variable. U... | — |
91
- | bitbucket | skill | Interact with Bitbucket repositories and pull requests using the BITBUCKET_TOKEN environment variable. Use when worki... | — |
119
+ | bitbucket | skill | Bitbucket integration hub. Detects whether the repository is on Bitbucket Cloud or Bitbucket Data Center and directs ... | — |
120
+ | bitbucket-cloud | skill | Bitbucket Cloud (bitbucket.org) specifics — authenticate with BITBUCKET_TOKEN, use the REST API v2, workspace/repo_sl... | — |
121
+ | bitbucket-data-center | skill | Bitbucket Data Center (self-hosted Bitbucket Server) specifics — authenticate with BITBUCKET_DATA_CENTER_TOKEN, use t... | — |
92
122
  | city-weather | plugin | Get current weather, time, and precipitation forecast for any city using the free Open-Meteo API. Provides slash comm... | — |
93
123
  | code-review | skill | Rigorous code review focusing on data structures, simplicity, security, pragmatism, and risk/safety evaluation. Provi... | `/codereview`, `/codereview-roasted` |
94
124
  | code-simplifier | skill | Simplifies and refines code across three dimensions - code reuse, code quality, and efficiency - while preserving all... | `/simplify` |
@@ -117,7 +147,7 @@ Official skills and plugins for OpenHands — the open-source AI software engine
117
147
  | npm | skill | Handle npm package installation in non-interactive environments by piping confirmations. Use when installing Node.js ... | — |
118
148
  | onboarding | plugin | Assess repository agent-readiness across five pillars, propose high-impact fixes, and generate repo-specific AGENTS.m... | — |
119
149
  | openhands | plugin | Unified OpenHands plugin — bundles Cloud CLI, REST API (openhands-api), and Automations (openhands-automation) into a... | `/openhands-cloud` |
120
- | openhands-api | skill | Use the OpenHands Cloud REST API (V1) to create and manage app conversations, including multi-conversation delegation... | — |
150
+ | openhands-api | skill | Use the OpenHands Cloud REST API (V1) and agent-server APIs to create and manage Cloud or local backend conversations... | — |
121
151
  | openhands-automation | skill | Create and manage OpenHands automations - scheduled tasks that run in sandboxes. Use the prompt preset to create auto... | `/automation:create` |
122
152
  | openhands-sdk | skill | Reference skill for the OpenHands Software Agent SDK - build AI agents with custom tools, LLM configuration, conversa... | `/sdk` |
123
153
  | pdflatex | skill | Install and use pdflatex to compile LaTeX documents into PDFs on Linux. Use when generating academic papers, research... | — |
@@ -4,14 +4,30 @@ This directory contains curated integration metadata for OpenHands clients.
4
4
  Most current entries are MCP-backed, but the schema also supports HTTP/OpenAPI
5
5
  integrations so clients can consume one source of truth.
6
6
 
7
- - `catalog/*.json` contains one source file per direct integration entry.
8
- - `index.js` assembles and exports the catalog for Node.js and bundlers.
7
+ - `catalog/<id>.json` is the hand-authored source of truth. Add or edit an
8
+ integration by changing exactly one file in that directory.
9
+ - `catalog-index.js` is generated from `catalog/*.json` so the JavaScript
10
+ package can statically import every individual JSON file without an aggregate
11
+ catalog JSON asset.
12
+ - The Python package includes the same individual `catalog/*.json` files and
13
+ reads them directly.
14
+ - `index.js` derives the `supportsMcp`/`supportsOauth` filters from the
15
+ canonical connection options at read time.
9
16
  - `index.d.ts` contains the public TypeScript shape.
10
17
 
11
- Consumers can import the package export:
18
+ Each integration carries its OAuth/MCP connection data directly. Do not add a
19
+ separate provider catalog or per-language provider data.
20
+
21
+ Consumers should use the read functions exported by the package:
12
22
 
13
23
  ```js
14
- import { INTEGRATION_CATALOG } from "@openhands/extensions/integrations";
24
+ import {
25
+ getIntegrationCatalogEntry,
26
+ listIntegrationCatalog,
27
+ } from "@openhands/extensions/integrations";
28
+
29
+ const catalog = listIntegrationCatalog();
30
+ const entry = getIntegrationCatalogEntry(catalog[0].id);
15
31
  ```
16
32
 
17
33
  ## Migration from the MCP catalog
@@ -22,18 +38,18 @@ old package exports were removed rather than kept as aliases.
22
38
 
23
39
  - Import `INTEGRATION_CATALOG` from `@openhands/extensions/integrations`
24
40
  instead of `MCP_CATALOG` from `@openhands/extensions/mcps`.
25
- - Import logo mappings from `@openhands/extensions/integrations/logos`
26
- instead of `@openhands/extensions/mcps/logos`.
41
+ - Read serializable logo metadata from each `IntegrationCatalogEntry` (`logoUrl`,
42
+ `iconBg`, and `iconColor`) instead of importing React-specific logo maps.
27
43
  - Use `IntegrationCatalogEntry` instead of `McpCatalogEntry`.
28
44
  - Read MCP configuration from `entry.connectionOptions[]`. Direct MCP entries
29
45
  have `provider: "mcp"` and a `transport`; entries may expose multiple
30
46
  options such as `id: "oauth"` for a hosted OAuth MCP endpoint and `id:
31
- "api"` for an API-key or stdio fallback.
32
- - Use `entry.defaultConnectionOptionId` to choose the preferred option.
47
+ "api"` for an API-key or stdio fallback. The first option is the preferred
48
+ default.
33
49
  - Automation catalog entries now use `requiredIntegrationIds` instead of
34
50
  `requiredMcpIds`.
35
51
 
36
52
  The `mcps` API was intentionally broken because it was pre-release and had not
37
53
  been adopted as a stable public surface.
38
54
 
39
- The catalog intentionally stores only serializable data. Client applications are responsible for mapping entries to UI-specific icons or styling.
55
+ The catalog intentionally stores only serializable data, including language-agnostic logo URLs and optional presentation colors. Client applications can render those fields directly while keeping any purely UI-specific styling local.
@@ -2,17 +2,14 @@
2
2
  "id": "airtable",
3
3
  "name": "Airtable",
4
4
  "description": "List bases, query records, and update fields across your Airtable workspace.",
5
- "docsUrl": "https://github.com/domdomegg/airtable-mcp-server",
6
- "iconBg": "#FCB400",
7
- "iconColor": "var(--oh-surface-deep)",
8
- "keywords": [
9
- "spreadsheet",
10
- "database",
11
- "records",
12
- "bases"
5
+ "categories": [
6
+ "Database",
7
+ "Operations"
13
8
  ],
14
- "kind": "mcp",
15
- "defaultConnectionOptionId": "api",
9
+ "appUrl": "https://airtable.com",
10
+ "docsUrl": "https://github.com/domdomegg/airtable-mcp-server",
11
+ "notes": "Very common internal-tools and operations automation surface.",
12
+ "popularityRank": 17,
16
13
  "connectionOptions": [
17
14
  {
18
15
  "id": "api",
@@ -40,5 +37,14 @@
40
37
  "strategy": "api_key"
41
38
  }
42
39
  }
40
+ ],
41
+ "iconBg": "#FCB400",
42
+ "logoUrl": "https://cdn.simpleicons.org/airtable/000000",
43
+ "iconColor": "var(--oh-surface-deep)",
44
+ "keywords": [
45
+ "spreadsheet",
46
+ "database",
47
+ "records",
48
+ "bases"
43
49
  ]
44
50
  }
@@ -10,8 +10,6 @@
10
10
  "crawl",
11
11
  "actors"
12
12
  ],
13
- "kind": "mcp",
14
- "defaultConnectionOptionId": "api",
15
13
  "connectionOptions": [
16
14
  {
17
15
  "id": "api",
@@ -0,0 +1,33 @@
1
+ {
2
+ "id": "asana",
3
+ "name": "Asana",
4
+ "description": "Task management, projects, and work tracking.",
5
+ "categories": [
6
+ "Project management",
7
+ "Operations"
8
+ ],
9
+ "appUrl": "https://asana.com",
10
+ "docsUrl": "https://developers.asana.com/docs/oauth",
11
+ "notes": "Broad business adoption and straightforward OAuth app model.",
12
+ "popularityRank": 13,
13
+ "connectionOptions": [
14
+ {
15
+ "id": "oauth",
16
+ "provider": "http",
17
+ "auth": {
18
+ "strategy": "oauth2",
19
+ "oauth": {
20
+ "authorizationUrl": "https://app.asana.com/-/oauth_authorize",
21
+ "tokenUrl": "https://app.asana.com/-/oauth_token",
22
+ "scopes": [
23
+ "tasks:read"
24
+ ]
25
+ }
26
+ },
27
+ "http": {
28
+ "apiBaseUrl": "https://app.asana.com/api/1.0",
29
+ "openApiUrl": "https://api.apis.guru/v2/specs/asana.com/1.0/openapi.json"
30
+ }
31
+ }
32
+ ]
33
+ }
@@ -4,6 +4,7 @@
4
4
  "description": "Search Jira issues and Confluence pages via Atlassian's hosted MCP server.",
5
5
  "docsUrl": "https://www.atlassian.com/platform/remote-mcp-server",
6
6
  "iconBg": "#0052CC",
7
+ "logoUrl": "https://cdn.simpleicons.org/atlassian/FFFFFF",
7
8
  "keywords": [
8
9
  "jira",
9
10
  "confluence",
@@ -11,20 +12,16 @@
11
12
  "wiki",
12
13
  "issues"
13
14
  ],
14
- "kind": "mcp",
15
- "defaultConnectionOptionId": "none",
16
15
  "connectionOptions": [
17
16
  {
18
- "id": "none",
17
+ "id": "oauth",
19
18
  "provider": "mcp",
20
19
  "transport": {
21
- "kind": "sse",
22
- "url": "https://mcp.atlassian.com/v1/sse",
23
- "apiKeyOptional": true
20
+ "kind": "shttp",
21
+ "url": "https://mcp.atlassian.com/v1/mcp"
24
22
  },
25
23
  "auth": {
26
- "strategy": "none",
27
- "apiKeyOptional": true
24
+ "strategy": "oauth2"
28
25
  }
29
26
  }
30
27
  ]
@@ -0,0 +1,34 @@
1
+ {
2
+ "id": "bitbucket",
3
+ "name": "Bitbucket",
4
+ "description": "Repositories, pull requests, and Atlassian engineering workflows.",
5
+ "categories": [
6
+ "Engineering",
7
+ "Source control"
8
+ ],
9
+ "appUrl": "https://bitbucket.org",
10
+ "docsUrl": "https://developer.atlassian.com/cloud/bitbucket/oauth-2/",
11
+ "notes": "Popular in Atlassian-centric teams and complements Jira/Confluence.",
12
+ "popularityRank": 50,
13
+ "connectionOptions": [
14
+ {
15
+ "id": "oauth",
16
+ "provider": "http",
17
+ "auth": {
18
+ "strategy": "oauth2",
19
+ "oauth": {
20
+ "authorizationUrl": "https://bitbucket.org/site/oauth2/authorize",
21
+ "tokenUrl": "https://bitbucket.org/site/oauth2/access_token",
22
+ "scopes": [
23
+ "account",
24
+ "repository"
25
+ ]
26
+ }
27
+ },
28
+ "http": {
29
+ "apiBaseUrl": "https://api.bitbucket.org/2.0",
30
+ "openApiUrl": "https://developer.atlassian.com/cloud/bitbucket/swagger.v3.json"
31
+ }
32
+ }
33
+ ]
34
+ }
@@ -0,0 +1,34 @@
1
+ {
2
+ "id": "box",
3
+ "name": "Box",
4
+ "description": "Enterprise file storage, metadata, and collaboration.",
5
+ "categories": [
6
+ "Storage",
7
+ "Enterprise"
8
+ ],
9
+ "appUrl": "https://www.box.com",
10
+ "docsUrl": "https://developer.box.com/guides/authentication/oauth2/",
11
+ "notes": "Strong enterprise document-management footprint.",
12
+ "popularityRank": 19,
13
+ "connectionOptions": [
14
+ {
15
+ "id": "oauth",
16
+ "provider": "http",
17
+ "auth": {
18
+ "strategy": "oauth2",
19
+ "oauth": {
20
+ "authorizationUrl": "https://account.box.com/api/oauth2/authorize",
21
+ "tokenUrl": "https://api.box.com/oauth2/token",
22
+ "scopes": [
23
+ "root_readonly",
24
+ "item_read"
25
+ ]
26
+ }
27
+ },
28
+ "http": {
29
+ "apiBaseUrl": "https://api.box.com/2.0",
30
+ "openApiUrl": "https://raw.githubusercontent.com/box/box-openapi/main/openapi.json"
31
+ }
32
+ }
33
+ ]
34
+ }
@@ -4,12 +4,11 @@
4
4
  "description": "Privacy-first web and local search using the Brave Search API.",
5
5
  "docsUrl": "https://github.com/brave/brave-search-mcp-server",
6
6
  "iconBg": "#FB542B",
7
+ "logoUrl": "https://cdn.simpleicons.org/brave/FFFFFF",
7
8
  "keywords": [
8
9
  "search",
9
10
  "web"
10
11
  ],
11
- "kind": "mcp",
12
- "defaultConnectionOptionId": "api",
13
12
  "connectionOptions": [
14
13
  {
15
14
  "id": "api",
@@ -10,9 +10,6 @@
10
10
  "chrome",
11
11
  "playwright"
12
12
  ],
13
- "kind": "mcp",
14
- "runtimeAvailability": "local",
15
- "defaultConnectionOptionId": "none",
16
13
  "connectionOptions": [
17
14
  {
18
15
  "id": "none",
@@ -0,0 +1,31 @@
1
+ {
2
+ "id": "canva",
3
+ "name": "Canva",
4
+ "description": "Design content, brand assets, and marketing collateral workflows.",
5
+ "categories": [
6
+ "Design",
7
+ "Marketing"
8
+ ],
9
+ "appUrl": "https://www.canva.com",
10
+ "docsUrl": "https://www.canva.dev/docs/connect/oauth/",
11
+ "notes": "Broad creator and marketing adoption with OAuth-based apps.",
12
+ "popularityRank": 34,
13
+ "connectionOptions": [
14
+ {
15
+ "id": "oauth",
16
+ "provider": "http",
17
+ "auth": {
18
+ "strategy": "oauth2",
19
+ "oauth": {
20
+ "tokenUrl": "https://api.canva.com/rest/v1/oauth/token",
21
+ "scopes": [],
22
+ "authorizationUrl": "https://www.canva.com/api/oauth/authorize"
23
+ }
24
+ },
25
+ "http": {
26
+ "apiBaseUrl": "https://api.canva.com/rest/v1",
27
+ "openApiUrl": "https://raw.githubusercontent.com/canva-sdks/canva-connect-api-starter-kit/main/openapi/spec.yml"
28
+ }
29
+ }
30
+ ]
31
+ }
@@ -4,6 +4,7 @@
4
4
  "description": "Run analytical SQL queries against a ClickHouse cluster.",
5
5
  "docsUrl": "https://github.com/ClickHouse/mcp-clickhouse",
6
6
  "iconBg": "#FFFF00",
7
+ "logoUrl": "https://cdn.simpleicons.org/clickhouse/000000",
7
8
  "iconColor": "var(--oh-surface-deep)",
8
9
  "keywords": [
9
10
  "analytics",
@@ -11,8 +12,6 @@
11
12
  "database",
12
13
  "sql"
13
14
  ],
14
- "kind": "mcp",
15
- "defaultConnectionOptionId": "api",
16
15
  "connectionOptions": [
17
16
  {
18
17
  "id": "api",
@@ -4,6 +4,7 @@
4
4
  "description": "Inspect and manage KV, D1, R2, and Durable Object bindings on your Cloudflare account.",
5
5
  "docsUrl": "https://developers.cloudflare.com/agents/model-context-protocol/",
6
6
  "iconBg": "#F38020",
7
+ "logoUrl": "https://cdn.simpleicons.org/cloudflare/FFFFFF",
7
8
  "keywords": [
8
9
  "cloudflare",
9
10
  "workers",
@@ -12,20 +13,16 @@
12
13
  "r2",
13
14
  "durable objects"
14
15
  ],
15
- "kind": "mcp",
16
- "defaultConnectionOptionId": "none",
17
16
  "connectionOptions": [
18
17
  {
19
- "id": "none",
18
+ "id": "oauth",
20
19
  "provider": "mcp",
21
20
  "transport": {
22
- "kind": "sse",
23
- "url": "https://bindings.mcp.cloudflare.com/sse",
24
- "apiKeyOptional": true
21
+ "kind": "shttp",
22
+ "url": "https://bindings.mcp.cloudflare.com/mcp"
25
23
  },
26
24
  "auth": {
27
- "strategy": "none",
28
- "apiKeyOptional": true
25
+ "strategy": "oauth2"
29
26
  }
30
27
  }
31
28
  ]
@@ -4,26 +4,23 @@
4
4
  "description": "Fetch and screenshot pages using Cloudflare's hosted browser rendering.",
5
5
  "docsUrl": "https://developers.cloudflare.com/agents/model-context-protocol/",
6
6
  "iconBg": "#F38020",
7
+ "logoUrl": "https://cdn.simpleicons.org/cloudflare/FFFFFF",
7
8
  "keywords": [
8
9
  "cloudflare",
9
10
  "browser",
10
11
  "rendering",
11
12
  "screenshots"
12
13
  ],
13
- "kind": "mcp",
14
- "defaultConnectionOptionId": "none",
15
14
  "connectionOptions": [
16
15
  {
17
- "id": "none",
16
+ "id": "oauth",
18
17
  "provider": "mcp",
19
18
  "transport": {
20
- "kind": "sse",
21
- "url": "https://browser.mcp.cloudflare.com/sse",
22
- "apiKeyOptional": true
19
+ "kind": "shttp",
20
+ "url": "https://browser.mcp.cloudflare.com/mcp"
23
21
  },
24
22
  "auth": {
25
- "strategy": "none",
26
- "apiKeyOptional": true
23
+ "strategy": "oauth2"
27
24
  }
28
25
  }
29
26
  ]
@@ -1,9 +1,10 @@
1
1
  {
2
2
  "id": "cloudflare-builds",
3
3
  "name": "Cloudflare Builds",
4
- "description": "Inspect Workers Builds — logs, statuses, and rerun failed deploys.",
4
+ "description": "Inspect Workers Builds \u2014 logs, statuses, and rerun failed deploys.",
5
5
  "docsUrl": "https://developers.cloudflare.com/agents/model-context-protocol/",
6
6
  "iconBg": "#F38020",
7
+ "logoUrl": "https://cdn.simpleicons.org/cloudflare/FFFFFF",
7
8
  "keywords": [
8
9
  "cloudflare",
9
10
  "workers",
@@ -11,20 +12,16 @@
11
12
  "builds",
12
13
  "deploys"
13
14
  ],
14
- "kind": "mcp",
15
- "defaultConnectionOptionId": "none",
16
15
  "connectionOptions": [
17
16
  {
18
- "id": "none",
17
+ "id": "oauth",
19
18
  "provider": "mcp",
20
19
  "transport": {
21
- "kind": "sse",
22
- "url": "https://builds.mcp.cloudflare.com/sse",
23
- "apiKeyOptional": true
20
+ "kind": "shttp",
21
+ "url": "https://builds.mcp.cloudflare.com/mcp"
24
22
  },
25
23
  "auth": {
26
- "strategy": "none",
27
- "apiKeyOptional": true
24
+ "strategy": "oauth2"
28
25
  }
29
26
  }
30
27
  ]