Skip to content

feat(integrations): add mcp-atlassian self-hosted stdio connection to Atlassian entry#383

Merged
enyst merged 3 commits into
mainfrom
add-mcp-atlassian-stdio
Jul 2, 2026
Merged

feat(integrations): add mcp-atlassian self-hosted stdio connection to Atlassian entry#383
enyst merged 3 commits into
mainfrom
add-mcp-atlassian-stdio

Conversation

@jpelletier1

Copy link
Copy Markdown
Contributor

Summary

The existing atlassian catalog entry only exposed the Atlassian-hosted OAuth MCP server (mcp.atlassian.com). That option uses oauth2 auth, which getInstallableMcpConnectionOption in agent-canvas filters out as non-locally-installable — so the Atlassian tile never appeared in the MCP marketplace for self-hosted / API-token users.

This PR adds a second api connection option that runs the mcp-atlassian community MCP server via uvx, allowing users to connect their own Atlassian workspace (Jira and/or Confluence) with API tokens — no OAuth flow required.

Changes

integrations/catalog/atlassian.json

  • Adds an "api" connection option:
    • stdio transport: uvx mcp-atlassian
    • Six envFields: JIRA_URL, JIRA_USERNAME, JIRA_API_TOKEN, CONFLUENCE_URL, CONFLUENCE_USERNAME, CONFLUENCE_API_TOKEN (all optional at the schema level so users can configure Jira-only, Confluence-only, or both)
    • auth.strategy: "api_key"
  • Enriches the entry with categories, popularityRank: 88, additional keywords, and installHint
  • Updates docsUrl to point at the mcp-atlassian installation docs

Verification

The new entry passes the existing catalog schema validator (catalog.schema.json):

  • password-type envFields include helperText
  • helperLink values are https:// URLs ✓
  • stdio transport includes required kind, serverName, command, args

Impact

With this change, agent-canvas getMcpMarketplaceCatalog will include the Atlassian entry (since it now has a non-oauth2 MCP connection option), and users will see an "Atlassian (Jira & Confluence)" tile in the MCP marketplace with an API token install flow.


This PR was created by an AI agent (OpenHands) on behalf of the user.

@jpelletier1 can click here to continue refining the PR

…tion

The existing atlassian entry only exposed the Atlassian-hosted OAuth MCP
server (mcp.atlassian.com), which is filtered out as non-installable by
getInstallableMcpConnectionOption. This adds a second `api` connection
option using `uvx mcp-atlassian` (https://github.com/sooperset/mcp-atlassian)
that runs the self-hosted MCP server with Jira/Confluence API tokens.

Users can now install Atlassian support from the Agent Canvas MCP
marketplace without OAuth by providing their workspace URL and API token.

Also enriches the entry with categories, popularityRank, keywords, and
an installHint.
@jpelletier1

Copy link
Copy Markdown
Contributor Author

@OpenHands can you fix the failing test

@openhands-ai

openhands-ai Bot commented Jul 1, 2026

Copy link
Copy Markdown

I'm on it! jpelletier1 can track my progress at all-hands.dev

…rityRank sort

The atlassian entry was added with popularityRank 88 but catalog-index.js
was not regenerated, so the JS package kept atlassian at its old import
position (44) instead of its popularity-sorted position (3). This made
test_js_reads_the_same_catalog_as_python fail because the Python bindings
sort by popularityRank descending while the JS index preserved stale import
order.

Regenerate via npm run build:integrations so the JS catalog order matches
the Python catalog order.

Co-authored-by: openhands <openhands@all-hands.dev>

Copy link
Copy Markdown
Contributor Author

Fixed in 20935b9.

The failing test was test_js_reads_the_same_catalog_as_python. Root cause: this PR added the atlassian entry with popularityRank: 88, but integrations/catalog-index.js (the auto-generated JS static-import index) was not regenerated. The Python bindings sort entries by popularityRank descending, so atlassian landed at position 3; the JS index still had it at its stale import position (44), so the two catalogs no longer matched.

Fix: ran npm run build:integrations to regenerate catalog-index.js from the catalog directory. The build script sorts by popularityRank descending (then id), so the JS order now matches the Python order. All 440 tests pass locally, and python scripts/sync_extensions.py --check is clean.

This comment was created by an AI agent (OpenHands) on behalf of the user.

@openhands-ai

openhands-ai Bot commented Jul 1, 2026

Copy link
Copy Markdown

Fixed the failing test on PR #383.

Failing test: test_js_reads_the_same_catalog_as_python in tests/test_integration_catalog_in_sync.py.

Root cause: The PR added the atlassian entry with popularityRank: 88 but never regenerated integrations/catalog-index.js (the auto-generated JS static-import index). The Python bindings sort entries at runtime by popularityRank descending (so atlassian moved to position 3), while the JS package uses the raw import order from catalog-index.js (where atlassian was still at its stale appended position 44). The two catalogs disagreed at index 3, failing the equality assertion.

Fix: Ran npm run build:integrations to regenerate catalog-index.js. The build script sorts imports by popularityRank descending (then id), matching the Python order. Committed as 20935b9 and pushed to the add-mcp-atlassian-stdio branch.

Verification: All 440 tests pass locally; scripts/sync_extensions.py --check is clean. CI is re-running on the PR, and I posted a reply comment explaining the root cause and fix.

Comment on lines 15 to 17
"confluence",
"tickets",
"wiki",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"confluence",
"tickets",
"wiki",
"confluence",

My feeling is that it probably triggers too much on unrelated things if we use too wide, undiscriminated terms

@enyst

enyst commented Jul 2, 2026

Copy link
Copy Markdown
Member

@OpenHands Do a /codereview on this PR. You are free to investigate official docs or whatnot. Post your review with gh api, and event, can be any of the possible options.

@openhands-ai

openhands-ai Bot commented Jul 2, 2026

Copy link
Copy Markdown

I'm on it! enyst can track my progress at all-hands.dev

@enyst enyst left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This review was generated by an AI agent (OpenHands) on behalf of @enyst.

🟡 Taste Rating: Acceptable - This is a small catalog-only change that follows the existing stdio integration pattern and keeps the generated JS index in sync. The upstream mcp-atlassian docs confirm the uvx command and the Jira/Confluence env var names used here.

[CRITICAL ISSUES]

  • None.

[IMPROVEMENT OPPORTUNITIES]

  • [integrations/catalog/atlassian.json, Line 22] Repository Convention: installHint uses an em dash (). AGENTS.md explicitly asks marketplace JSON entries to use plain hyphens instead of em dashes. Replace with - to keep catalog copy consistent. This is non-blocking, but it is cheap to fix.

[TESTING GAPS]

  • None blocking. CI reports the repository test job and extension sync checks as passing. Locally, pytest is not installed in the base environment, but I ran the integration catalog build/smoke path: regenerating integrations/catalog-index.js left the workspace clean, and the JS catalog returns atlassian at index 3 with both oauth and api connection options.

[RISK ASSESSMENT]

  • [Overall PR] ⚠️ Risk Assessment: 🟡 MEDIUM
    This is metadata-only in this repository, but it causes clients to offer a local stdio integration that executes the community mcp-atlassian PyPI package via uvx and passes Jira/Confluence credentials into that process. That is consistent with the existing catalog pattern for stdio MCP servers, the current PyPI release is not newly published, and the command/env fields match upstream documentation, so the risk is acceptable with normal maintainer scrutiny.

VERDICT:
Worth merging: Core catalog structure is sound, generated artifacts are in sync, and the only issue I found is a minor repository copy-style convention.

KEY INSIGHT:
The PR solves the marketplace visibility problem with the smallest viable catalog change: add a locally installable non-OAuth MCP option while preserving the existing Atlassian-hosted OAuth option.


Improve this review? If any feedback above seems incorrect or irrelevant to this repository, you can teach the reviewer to do better:

  1. Add a .agents/skills/custom-codereview-guide.md file to your branch (or edit it if one already exists) with the /codereview trigger and the context the reviewer is missing (e.g., "Security concerns about X do not apply here because Y"). See the customization docs for the required frontmatter format.
  2. Re-request a review - the reviewer reads guidelines from the PR branch, so your changes take effect immediately.
  3. When your PR is merged, the guideline file goes through normal code review by repository maintainers.

Resolve with AI? Install the iterate skill in your agent and run /iterate to automatically drive this PR through CI, review, and QA until it's merge-ready.

Was this review helpful? React with 👍 or 👎 to give feedback.

@openhands-ai

openhands-ai Bot commented Jul 2, 2026

Copy link
Copy Markdown

Posted the PR review via GitHub API with event COMMENT:

#383 (review)

Summary:

  • Confirmed the changed files are integrations/catalog/atlassian.json and regenerated integrations/catalog-index.js.
  • Checked upstream mcp-atlassian docs for the uvx mcp-atlassian command and env var names.
  • Checked PyPI release metadata for supply-chain timing.
  • Confirmed CI checks are passing.
  • Ran a local Node catalog regeneration/smoke check; workspace stayed clean.
  • Noted one non-blocking repo convention issue: installHint uses an em dash where AGENTS.md asks marketplace JSON to use plain hyphens.

Co-authored-by: openhands <openhands@all-hands.dev>

@enyst enyst left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This approval was generated by an AI agent (OpenHands) on behalf of the user.

Approved after fixing the only issue from my review: the Atlassian install hint now uses a plain hyphen per repository convention. I re-ran the catalog generation/smoke check locally and the PR remains a focused catalog metadata change with generated artifacts in sync.

@enyst
enyst merged commit 7b0de54 into main Jul 2, 2026
6 checks passed
@enyst
enyst deleted the add-mcp-atlassian-stdio branch July 2, 2026 21:17
@openhands-release-bot openhands-release-bot Bot added the released: v0.9.0 Shipped in v0.9.0 label Jul 9, 2026
@openhands-release-bot

Copy link
Copy Markdown
Contributor

🚀 Released in v0.9.0.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

released: v0.9.0 Shipped in v0.9.0 type: feat A new feature

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants