@openhands/extensions 0.5.0 → 0.6.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 (132) 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 +31 -3
  6. package/integrations/README.md +17 -7
  7. package/integrations/catalog/airtable.json +40 -10
  8. package/integrations/catalog/apify.json +0 -2
  9. package/integrations/catalog/asana.json +38 -0
  10. package/integrations/catalog/atlassian.json +5 -8
  11. package/integrations/catalog/bitbucket.json +39 -0
  12. package/integrations/catalog/box.json +39 -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 +35 -0
  16. package/integrations/catalog/clickhouse.json +1 -2
  17. package/integrations/catalog/clickup.json +36 -0
  18. package/integrations/catalog/cloudflare-bindings.json +5 -8
  19. package/integrations/catalog/cloudflare-browser-rendering.json +5 -8
  20. package/integrations/catalog/cloudflare-builds.json +6 -9
  21. package/integrations/catalog/cloudflare-docs.json +4 -7
  22. package/integrations/catalog/cloudflare-observability.json +5 -8
  23. package/integrations/catalog/confluence.json +38 -0
  24. package/integrations/catalog/datadog.json +34 -0
  25. package/integrations/catalog/deepwiki.json +3 -7
  26. package/integrations/catalog/discord.json +39 -0
  27. package/integrations/catalog/dropbox.json +38 -0
  28. package/integrations/catalog/elevenlabs.json +27 -28
  29. package/integrations/catalog/everything.json +0 -2
  30. package/integrations/catalog/exa.json +0 -2
  31. package/integrations/catalog/fetch.json +0 -2
  32. package/integrations/catalog/figma.json +41 -9
  33. package/integrations/catalog/filesystem.json +0 -3
  34. package/integrations/catalog/firecrawl.json +0 -2
  35. package/integrations/catalog/freshdesk.json +38 -0
  36. package/integrations/catalog/git.json +0 -3
  37. package/integrations/catalog/github.json +43 -10
  38. package/integrations/catalog/gitlab.json +38 -0
  39. package/integrations/catalog/gmail.json +38 -0
  40. package/integrations/catalog/google-calendar.json +38 -0
  41. package/integrations/catalog/google-docs.json +38 -0
  42. package/integrations/catalog/google-drive.json +38 -0
  43. package/integrations/catalog/google-sheets.json +38 -0
  44. package/integrations/catalog/hubspot.json +34 -0
  45. package/integrations/catalog/huggingface.json +1 -2
  46. package/integrations/catalog/intercom.json +39 -0
  47. package/integrations/catalog/jira.json +38 -0
  48. package/integrations/catalog/kagi.json +2 -3
  49. package/integrations/catalog/linear.json +47 -16
  50. package/integrations/catalog/mailchimp.json +38 -0
  51. package/integrations/catalog/memory.json +0 -2
  52. package/integrations/catalog/microsoft-outlook.json +38 -0
  53. package/integrations/catalog/microsoft-teams.json +38 -0
  54. package/integrations/catalog/miro.json +38 -0
  55. package/integrations/catalog/monday.json +38 -0
  56. package/integrations/catalog/mongodb.json +1 -2
  57. package/integrations/catalog/neon.json +0 -2
  58. package/integrations/catalog/netlify.json +38 -0
  59. package/integrations/catalog/notion.json +37 -10
  60. package/integrations/catalog/obsidian.json +1 -3
  61. package/integrations/catalog/okta.json +38 -0
  62. package/integrations/catalog/onedrive.json +38 -0
  63. package/integrations/catalog/ordinal.json +33 -0
  64. package/integrations/catalog/paypal.json +5 -8
  65. package/integrations/catalog/pipedrive.json +39 -0
  66. package/integrations/catalog/plaid.json +31 -0
  67. package/integrations/catalog/playwright.json +0 -2
  68. package/integrations/catalog/posthog.json +38 -0
  69. package/integrations/catalog/quickbooks.json +38 -0
  70. package/integrations/catalog/redis.json +1 -3
  71. package/integrations/catalog/resend.json +1 -2
  72. package/integrations/catalog/salesforce.json +38 -0
  73. package/integrations/catalog/sentry.json +52 -14
  74. package/integrations/catalog/sequential-thinking.json +0 -2
  75. package/integrations/catalog/servicenow.json +39 -0
  76. package/integrations/catalog/sharepoint.json +38 -0
  77. package/integrations/catalog/shopify.json +38 -0
  78. package/integrations/catalog/slack.json +49 -10
  79. package/integrations/catalog/stripe.json +44 -14
  80. package/integrations/catalog/supabase.json +36 -9
  81. package/integrations/catalog/tavily.json +0 -2
  82. package/integrations/catalog/time.json +0 -2
  83. package/integrations/catalog/trello.json +31 -0
  84. package/integrations/catalog/vercel.json +38 -0
  85. package/integrations/catalog/webflow.json +34 -0
  86. package/integrations/catalog/xero.json +38 -0
  87. package/integrations/catalog/zendesk.json +38 -0
  88. package/integrations/catalog/zoom.json +38 -0
  89. package/integrations/catalog-index.js +171 -0
  90. package/integrations/index.d.ts +24 -60
  91. package/integrations/index.js +29 -207
  92. package/marketplaces/openhands-extensions.json +14 -1
  93. package/package.json +4 -7
  94. package/plugins/cobol-modernization/README.md +3 -3
  95. package/plugins/cobol-modernization/skills/{cobol-modernization-overview → cobol-modernization}/SKILL.md +1 -1
  96. package/plugins/magic-test/skills/magic-word/SKILL.md +1 -0
  97. package/plugins/migration-scoring/README.md +1 -1
  98. package/pyproject.toml +17 -3
  99. package/python/openhands_extensions/__init__.py +24 -0
  100. package/python/openhands_extensions/_version.py +24 -0
  101. package/python/openhands_extensions/integrations.py +92 -0
  102. package/release-please-config.json +2 -1
  103. package/scripts/build-integration-catalog.mjs +45 -0
  104. package/skills/agent-canvas-environment/.plugin/plugin.json +19 -0
  105. package/skills/agent-canvas-environment/README.md +5 -0
  106. package/skills/agent-canvas-environment/SKILL.md +141 -0
  107. package/skills/github-pr-reviewer/references/state-schema.md +18 -4
  108. package/skills/github-pr-reviewer/scripts/main.py +66 -12
  109. package/skills/github-repo-monitor/references/state-schema.md +11 -4
  110. package/skills/github-repo-monitor/scripts/main.py +67 -19
  111. package/skills/github-repo-monitor/tests/test_main.py +67 -8
  112. package/skills/index.js +19 -5
  113. package/skills/openhands-api/README.md +5 -1
  114. package/skills/openhands-api/SKILL.md +74 -5
  115. package/skills/openhands-automation/SKILL.md +3 -1
  116. package/skills/openhands-automation/references/custom-automation.md +166 -0
  117. package/skills/openhands-sdk/SKILL.md +8 -2
  118. package/skills/slack-channel-monitor/README.md +3 -3
  119. package/skills/slack-channel-monitor/SKILL.md +3 -2
  120. package/skills/slack-channel-monitor/references/state-schema.md +11 -4
  121. package/skills/slack-channel-monitor/scripts/main.py +111 -41
  122. package/tests/test_catalogs.py +21 -3
  123. package/tests/test_integration_catalog_in_sync.py +204 -0
  124. package/tests/test_slack_channel_monitor.py +142 -0
  125. package/tests/test_version_alignment.py +64 -0
  126. package/integrations/logos.d.ts +0 -5
  127. package/integrations/logos.js +0 -94
  128. package/integrations/oauth-provider-catalog.js +0 -553
  129. package/integrations/oauth-provider-registration-defaults.js +0 -610
  130. /package/plugins/cobol-modernization/skills/{mainfraime-removal → mainframe-removal}/SKILL.md +0 -0
  131. /package/plugins/cobol-modernization/skills/{mainfraime-removal → mainframe-removal}/references/cics-transformation-examples.md +0 -0
  132. /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.6.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 asset `integrations/integration-catalog.json` (NOT generated from any `.mjs`/`.js` source). Each per-integration entry also exists as `integrations/catalog/<id>.json`; a CI parity test asserts the two never drift. Both the JS package (`@openhands/extensions/integrations`) and the Python package read that same JSON asset at runtime, so the two language bindings can never drift.
63
+
64
+ The catalog is one array where each 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
+ hubspot = get_integration_catalog_entry("hubspot")
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 **58 extensions** (48 skills, 10 plugins).
64
91
 
65
92
  ### large-codebase
66
93
 
@@ -79,11 +106,12 @@ 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
+ **54 extensions** (46 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` |
@@ -117,7 +145,7 @@ Official skills and plugins for OpenHands — the open-source AI software engine
117
145
  | npm | skill | Handle npm package installation in non-interactive environments by piping confirmations. Use when installing Node.js ... | — |
118
146
  | onboarding | plugin | Assess repository agent-readiness across five pillars, propose high-impact fixes, and generate repo-specific AGENTS.m... | — |
119
147
  | 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... | — |
148
+ | openhands-api | skill | Use the OpenHands Cloud REST API (V1) and agent-server APIs to create and manage Cloud or local backend conversations... | — |
121
149
  | openhands-automation | skill | Create and manage OpenHands automations - scheduled tasks that run in sandboxes. Use the prompt preset to create auto... | `/automation:create` |
122
150
  | openhands-sdk | skill | Reference skill for the OpenHands Software Agent SDK - build AI agents with custom tools, LLM configuration, conversa... | `/sdk` |
123
151
  | pdflatex | skill | Install and use pdflatex to compile LaTeX documents into PDFs on Linux. Use when generating academic papers, research... | — |
@@ -4,10 +4,20 @@ 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
 
18
+ Each integration carries its OAuth/MCP connection data directly. Do not add a
19
+ separate provider catalog or per-language provider data.
20
+
11
21
  Consumers can import the package export:
12
22
 
13
23
  ```js
@@ -22,18 +32,18 @@ old package exports were removed rather than kept as aliases.
22
32
 
23
33
  - Import `INTEGRATION_CATALOG` from `@openhands/extensions/integrations`
24
34
  instead of `MCP_CATALOG` from `@openhands/extensions/mcps`.
25
- - Import logo mappings from `@openhands/extensions/integrations/logos`
26
- instead of `@openhands/extensions/mcps/logos`.
35
+ - Read serializable logo metadata from each `IntegrationCatalogEntry` (`logoUrl`,
36
+ `iconBg`, and `iconColor`) instead of importing React-specific logo maps.
27
37
  - Use `IntegrationCatalogEntry` instead of `McpCatalogEntry`.
28
38
  - Read MCP configuration from `entry.connectionOptions[]`. Direct MCP entries
29
39
  have `provider: "mcp"` and a `transport`; entries may expose multiple
30
40
  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.
41
+ "api"` for an API-key or stdio fallback. The first option is the preferred
42
+ default.
33
43
  - Automation catalog entries now use `requiredIntegrationIds` instead of
34
44
  `requiredMcpIds`.
35
45
 
36
46
  The `mcps` API was intentionally broken because it was pre-release and had not
37
47
  been adopted as a stable public surface.
38
48
 
39
- The catalog intentionally stores only serializable data. Client applications are responsible for mapping entries to UI-specific icons or styling.
49
+ 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,18 +2,39 @@
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": [
14
+ {
15
+ "id": "oauth",
16
+ "provider": "http",
17
+ "auth": {
18
+ "strategy": "oauth2",
19
+ "oauth": {
20
+ "authorizationUrl": "https://airtable.com/oauth2/v1/authorize",
21
+ "tokenUrl": "https://airtable.com/oauth2/v1/token",
22
+ "scopes": [
23
+ "schema.bases:read",
24
+ "data.records:read"
25
+ ]
26
+ }
27
+ },
28
+ "http": {
29
+ "apiBaseUrl": "https://api.airtable.com/v0",
30
+ "defaultTool": {
31
+ "name": "list_bases",
32
+ "description": "List Airtable bases the connected user granted access to.",
33
+ "method": "GET",
34
+ "path": "/meta/bases"
35
+ }
36
+ }
37
+ },
17
38
  {
18
39
  "id": "api",
19
40
  "provider": "mcp",
@@ -40,5 +61,14 @@
40
61
  "strategy": "api_key"
41
62
  }
42
63
  }
64
+ ],
65
+ "iconBg": "#FCB400",
66
+ "logoUrl": "https://cdn.simpleicons.org/airtable/000000",
67
+ "iconColor": "var(--oh-surface-deep)",
68
+ "keywords": [
69
+ "spreadsheet",
70
+ "database",
71
+ "records",
72
+ "bases"
43
73
  ]
44
74
  }
@@ -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,38 @@
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
+ "defaultTool": {
30
+ "name": "list_tasks",
31
+ "description": "List tasks visible to the connected Asana user.",
32
+ "method": "GET",
33
+ "path": "/tasks"
34
+ }
35
+ }
36
+ }
37
+ ]
38
+ }
@@ -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,39 @@
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
+ "defaultTool": {
31
+ "name": "get_current_user",
32
+ "description": "Fetch the authenticated Bitbucket user profile.",
33
+ "method": "GET",
34
+ "path": "/user"
35
+ }
36
+ }
37
+ }
38
+ ]
39
+ }
@@ -0,0 +1,39 @@
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
+ "defaultTool": {
31
+ "name": "list_root_items",
32
+ "description": "List files and folders in the Box root folder.",
33
+ "method": "GET",
34
+ "path": "/folders/0/items"
35
+ }
36
+ }
37
+ }
38
+ ]
39
+ }
@@ -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,35 @@
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
+ }
23
+ },
24
+ "http": {
25
+ "apiBaseUrl": "https://api.canva.com/rest/v1",
26
+ "defaultTool": {
27
+ "name": "list_designs",
28
+ "description": "List Canva designs available to the connected user.",
29
+ "method": "GET",
30
+ "path": "/designs"
31
+ }
32
+ }
33
+ }
34
+ ]
35
+ }
@@ -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",
@@ -0,0 +1,36 @@
1
+ {
2
+ "id": "clickup",
3
+ "name": "ClickUp",
4
+ "description": "Tasks, docs, goals, and workflow automation.",
5
+ "categories": [
6
+ "Project management",
7
+ "Operations"
8
+ ],
9
+ "appUrl": "https://clickup.com",
10
+ "docsUrl": "https://clickup.com/api/developer-portal/authentication",
11
+ "notes": "Large install base and broad operations coverage.",
12
+ "popularityRank": 15,
13
+ "connectionOptions": [
14
+ {
15
+ "id": "oauth",
16
+ "provider": "http",
17
+ "auth": {
18
+ "strategy": "oauth2",
19
+ "oauth": {
20
+ "authorizationUrl": "https://app.clickup.com/api",
21
+ "tokenUrl": "https://api.clickup.com/api/v2/oauth/token",
22
+ "scopes": []
23
+ }
24
+ },
25
+ "http": {
26
+ "apiBaseUrl": "https://api.clickup.com/api/v2",
27
+ "defaultTool": {
28
+ "name": "list_workspaces",
29
+ "description": "List ClickUp workspaces available to the connected user.",
30
+ "method": "GET",
31
+ "path": "/team"
32
+ }
33
+ }
34
+ }
35
+ ]
36
+ }
@@ -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
  ]