@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.
- package/.github/workflows/pypi-publish.yml +104 -0
- package/.github/workflows/tests.yml +6 -0
- package/.release-please-manifest.json +1 -1
- package/AGENTS.md +1 -1
- package/README.md +34 -4
- package/integrations/README.md +25 -9
- package/integrations/catalog/airtable.json +16 -10
- package/integrations/catalog/apify.json +0 -2
- package/integrations/catalog/asana.json +33 -0
- package/integrations/catalog/atlassian.json +5 -8
- package/integrations/catalog/bitbucket.json +34 -0
- package/integrations/catalog/box.json +34 -0
- package/integrations/catalog/brave-search.json +1 -2
- package/integrations/catalog/browser-mcp.json +0 -3
- package/integrations/catalog/canva.json +31 -0
- package/integrations/catalog/clickhouse.json +1 -2
- package/integrations/catalog/cloudflare-bindings.json +5 -8
- package/integrations/catalog/cloudflare-browser-rendering.json +5 -8
- package/integrations/catalog/cloudflare-builds.json +6 -9
- package/integrations/catalog/cloudflare-docs.json +4 -7
- package/integrations/catalog/cloudflare-observability.json +5 -8
- package/integrations/catalog/confluence.json +33 -0
- package/integrations/catalog/datadog.json +34 -0
- package/integrations/catalog/deepwiki.json +3 -7
- package/integrations/catalog/discord.json +34 -0
- package/integrations/catalog/elevenlabs.json +27 -28
- package/integrations/catalog/everything.json +0 -2
- package/integrations/catalog/exa.json +0 -2
- package/integrations/catalog/fetch.json +0 -2
- package/integrations/catalog/figma.json +35 -9
- package/integrations/catalog/filesystem.json +0 -3
- package/integrations/catalog/firecrawl.json +0 -2
- package/integrations/catalog/git.json +0 -3
- package/integrations/catalog/github.json +34 -10
- package/integrations/catalog/gmail.json +33 -0
- package/integrations/catalog/google-calendar.json +33 -0
- package/integrations/catalog/google-docs.json +33 -0
- package/integrations/catalog/google-drive.json +33 -0
- package/integrations/catalog/google-sheets.json +33 -0
- package/integrations/catalog/hubspot.json +34 -0
- package/integrations/catalog/huggingface.json +1 -2
- package/integrations/catalog/intercom.json +34 -0
- package/integrations/catalog/jira.json +33 -0
- package/integrations/catalog/kagi.json +2 -3
- package/integrations/catalog/linear.json +24 -16
- package/integrations/catalog/memory.json +0 -2
- package/integrations/catalog/microsoft-outlook.json +33 -0
- package/integrations/catalog/microsoft-teams.json +33 -0
- package/integrations/catalog/miro.json +42 -0
- package/integrations/catalog/monday.json +42 -0
- package/integrations/catalog/mongodb.json +1 -2
- package/integrations/catalog/neon.json +0 -2
- package/integrations/catalog/netlify.json +33 -0
- package/integrations/catalog/notion.json +30 -10
- package/integrations/catalog/obsidian.json +1 -3
- package/integrations/catalog/okta.json +33 -0
- package/integrations/catalog/onedrive.json +33 -0
- package/integrations/catalog/ordinal.json +33 -0
- package/integrations/catalog/paypal.json +5 -8
- package/integrations/catalog/playwright.json +0 -2
- package/integrations/catalog/posthog.json +38 -0
- package/integrations/catalog/quickbooks.json +86 -0
- package/integrations/catalog/redis.json +1 -3
- package/integrations/catalog/resend.json +1 -2
- package/integrations/catalog/salesforce.json +44 -0
- package/integrations/catalog/sentry.json +47 -14
- package/integrations/catalog/sequential-thinking.json +0 -2
- package/integrations/catalog/sharepoint.json +33 -0
- package/integrations/catalog/slack.json +49 -10
- package/integrations/catalog/stripe.json +39 -14
- package/integrations/catalog/supabase.json +31 -9
- package/integrations/catalog/tavily.json +0 -2
- package/integrations/catalog/time.json +0 -2
- package/integrations/catalog/trello.json +34 -0
- package/integrations/catalog/vercel.json +33 -0
- package/integrations/catalog/webflow.json +34 -0
- package/integrations/catalog/xero.json +33 -0
- package/integrations/catalog/zoom.json +33 -0
- package/integrations/catalog-index.js +151 -0
- package/integrations/catalog.schema.json +255 -0
- package/integrations/index.d.ts +49 -69
- package/integrations/index.js +36 -206
- package/marketplaces/openhands-extensions.json +40 -2
- package/package.json +4 -7
- package/plugins/cobol-modernization/README.md +3 -3
- package/plugins/cobol-modernization/skills/{cobol-modernization-overview → cobol-modernization}/SKILL.md +1 -1
- package/plugins/magic-test/skills/magic-word/SKILL.md +1 -0
- package/plugins/migration-scoring/README.md +1 -1
- package/plugins/pr-review/scripts/prompt.py +1 -1
- package/pyproject.toml +18 -3
- package/python/openhands_extensions/__init__.py +24 -0
- package/python/openhands_extensions/_version.py +25 -0
- package/python/openhands_extensions/integrations.py +92 -0
- package/release-please-config.json +2 -1
- package/scripts/build-integration-catalog.mjs +45 -0
- package/skills/agent-canvas-environment/.plugin/plugin.json +19 -0
- package/skills/agent-canvas-environment/README.md +5 -0
- package/skills/agent-canvas-environment/SKILL.md +202 -0
- package/skills/bitbucket/README.md +23 -40
- package/skills/bitbucket/SKILL.md +43 -31
- package/skills/bitbucket-cloud/.plugin/plugin.json +18 -0
- package/skills/bitbucket-cloud/README.md +15 -0
- package/skills/bitbucket-cloud/SKILL.md +46 -0
- package/skills/bitbucket-data-center/.plugin/plugin.json +19 -0
- package/skills/bitbucket-data-center/README.md +20 -0
- package/skills/bitbucket-data-center/SKILL.md +53 -0
- package/skills/code-review/SKILL.md +1 -1
- package/skills/code-review/references/supply-chain-security.md +2 -2
- package/skills/github-pr-reviewer/references/state-schema.md +18 -4
- package/skills/github-pr-reviewer/scripts/main.py +66 -12
- package/skills/github-repo-monitor/references/state-schema.md +11 -4
- package/skills/github-repo-monitor/scripts/main.py +67 -19
- package/skills/github-repo-monitor/tests/test_main.py +67 -8
- package/skills/index.js +34 -8
- package/skills/openhands-api/README.md +5 -1
- package/skills/openhands-api/SKILL.md +74 -5
- package/skills/openhands-automation/SKILL.md +3 -1
- package/skills/openhands-automation/references/custom-automation.md +166 -0
- package/skills/openhands-sdk/SKILL.md +8 -3
- package/skills/slack-channel-monitor/README.md +3 -3
- package/skills/slack-channel-monitor/SKILL.md +3 -2
- package/skills/slack-channel-monitor/references/state-schema.md +11 -4
- package/skills/slack-channel-monitor/scripts/main.py +111 -41
- package/tests/test_catalog_schema.py +47 -0
- package/tests/test_catalogs.py +47 -3
- package/tests/test_integration_catalog_in_sync.py +252 -0
- package/tests/test_slack_channel_monitor.py +142 -0
- package/tests/test_version_alignment.py +64 -0
- package/integrations/logos.d.ts +0 -5
- package/integrations/logos.js +0 -94
- package/integrations/oauth-provider-catalog.js +0 -553
- package/integrations/oauth-provider-registration-defaults.js +0 -610
- /package/plugins/cobol-modernization/skills/{mainfraime-removal → mainframe-removal}/SKILL.md +0 -0
- /package/plugins/cobol-modernization/skills/{mainfraime-removal → mainframe-removal}/references/cics-transformation-examples.md +0 -0
- /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:
|
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`
|
|
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 **
|
|
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
|
-
**
|
|
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 |
|
|
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
|
|
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... | — |
|
package/integrations/README.md
CHANGED
|
@@ -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
|
|
8
|
-
|
|
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
|
-
|
|
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 {
|
|
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
|
-
-
|
|
26
|
-
instead of
|
|
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
|
-
|
|
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
|
|
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
|
-
"
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
"keywords": [
|
|
9
|
-
"spreadsheet",
|
|
10
|
-
"database",
|
|
11
|
-
"records",
|
|
12
|
-
"bases"
|
|
5
|
+
"categories": [
|
|
6
|
+
"Database",
|
|
7
|
+
"Operations"
|
|
13
8
|
],
|
|
14
|
-
"
|
|
15
|
-
"
|
|
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
|
}
|
|
@@ -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": "
|
|
17
|
+
"id": "oauth",
|
|
19
18
|
"provider": "mcp",
|
|
20
19
|
"transport": {
|
|
21
|
-
"kind": "
|
|
22
|
-
"url": "https://mcp.atlassian.com/v1/
|
|
23
|
-
"apiKeyOptional": true
|
|
20
|
+
"kind": "shttp",
|
|
21
|
+
"url": "https://mcp.atlassian.com/v1/mcp"
|
|
24
22
|
},
|
|
25
23
|
"auth": {
|
|
26
|
-
"strategy": "
|
|
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",
|
|
@@ -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": "
|
|
18
|
+
"id": "oauth",
|
|
20
19
|
"provider": "mcp",
|
|
21
20
|
"transport": {
|
|
22
|
-
"kind": "
|
|
23
|
-
"url": "https://bindings.mcp.cloudflare.com/
|
|
24
|
-
"apiKeyOptional": true
|
|
21
|
+
"kind": "shttp",
|
|
22
|
+
"url": "https://bindings.mcp.cloudflare.com/mcp"
|
|
25
23
|
},
|
|
26
24
|
"auth": {
|
|
27
|
-
"strategy": "
|
|
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": "
|
|
16
|
+
"id": "oauth",
|
|
18
17
|
"provider": "mcp",
|
|
19
18
|
"transport": {
|
|
20
|
-
"kind": "
|
|
21
|
-
"url": "https://browser.mcp.cloudflare.com/
|
|
22
|
-
"apiKeyOptional": true
|
|
19
|
+
"kind": "shttp",
|
|
20
|
+
"url": "https://browser.mcp.cloudflare.com/mcp"
|
|
23
21
|
},
|
|
24
22
|
"auth": {
|
|
25
|
-
"strategy": "
|
|
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
|
|
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": "
|
|
17
|
+
"id": "oauth",
|
|
19
18
|
"provider": "mcp",
|
|
20
19
|
"transport": {
|
|
21
|
-
"kind": "
|
|
22
|
-
"url": "https://builds.mcp.cloudflare.com/
|
|
23
|
-
"apiKeyOptional": true
|
|
20
|
+
"kind": "shttp",
|
|
21
|
+
"url": "https://builds.mcp.cloudflare.com/mcp"
|
|
24
22
|
},
|
|
25
23
|
"auth": {
|
|
26
|
-
"strategy": "
|
|
27
|
-
"apiKeyOptional": true
|
|
24
|
+
"strategy": "oauth2"
|
|
28
25
|
}
|
|
29
26
|
}
|
|
30
27
|
]
|