Skip to content

v0.23.0

Latest

Choose a tag to compare

@sooperset sooperset released this 18 Jul 00:34
737b1b8

This release adds JSM customer-request and internal-comment support, epic hierarchy and dependency tools, PAC/WPAD and mTLS connectivity, external auth passthrough, and Live Docs page creation, plus a broad batch of Jira/Confluence content fixes and security updates to Starlette and FastMCP.

✨ Features

Jira

  • New JSM customer request tools — jira_get_request_types, jira_get_request_type_fields, and jira_create_customer_request — let clients list request types, inspect their visible fields, and raise customer requests with participants, base64 attachments, and on-behalf-of support (#1241)
  • New jira_get_project_epic_hierarchy groups a project's epics under their cross-project parent issues with direction-aware link classification, and jira_get_cross_project_dependencies maps issue links by target project and link type (#1286)
  • jira_get_issue and jira_search accept use_display_names to return human-readable custom field keys such as Story Points instead of opaque IDs like customfield_10243; conflicting names safely fall back to the raw ID (#1156)
  • Jira issue and search results now include a browse_url pointing at the issue's /browse/ page, for quick open-ticket-in-browser workflows (#1471)
  • jira_update_issue accepts return_fields to trim the post-update re-fetch and cut response tokens; the full-issue default is unchanged (#1466)
  • Markdown {expand:Title} blocks in issue descriptions convert to native collapsible sections on Cloud, including nested headings, lists, and code blocks (#1309)
  • Development information queries discover case-sensitive application types from the dev-status summary endpoint when application_type is omitted, so custom connectors are found without guessing exact casing (#1329)

Confluence

  • GFM task lists (- [ ] / - [x]) convert to native Confluence task macros instead of literal checkbox text, and new page template tools let you list Cloud templates, fetch them, and create pages from them (#1180)
  • Page creation accepts a subtype — including live for Live Docs — on Cloud, and page responses expose the subtype (#1479)

Server/Transport

  • Opt-in external authentication passthrough: forward an operator-allowlisted set of incoming MCP headers to Jira and Confluence per request, supporting external proxy-managed auth without local Atlassian credentials. Dynamic per-request destinations require MCP_ALLOWED_URL_DOMAINS to prevent credential exfiltration (#1457)
  • Opt-in PAC/WPAD proxy auto-configuration for environments where the outbound route is selected by a PAC file. WPAD stays disabled by default, explicit proxy settings take precedence, and the SSRF/DNS-pinning defenses are preserved when PAC routing is enabled (#1367, #1461)
  • New cert auth type for Server/DC deployments that use mutual TLS: a client certificate/key pair alone now authenticates — previously setting JIRA_CLIENT_CERT / CONFLUENCE_CLIENT_CERT without a username or token left the service silently disabled (#1196)

🐛 Fixed

Jira

  • jira_get_issue_comments no longer crashes with a TypeError on Cloud, where REST v3 returns comment bodies as ADF — bodies are converted to text the same way the add/edit comment paths already do (#1489)
  • Transition comments are routed through the correct API version: Cloud uses REST v3 with ADF in one atomic request (so workflows whose transition screen requires a comment now work), while Server/DC keep wiki-markup via v2 (#1355)
  • jira_download_attachments returns non-image attachments as TextContent with a JSON envelope (base64 payload, filename, MIME type) instead of an EmbeddedResource blob that some MCP clients reject; images keep the embedded form (#1469)
  • Bare Jira issue keys in Cloud markdown are autolinked to the configured /browse/ URL when converted to ADF (#1468)
  • jira_add_comment accepts comment as a compatibility alias for the body parameter, so clients sending the older shape no longer fail argument validation (#1467)
  • Segmented hyphenated issue keys such as B7-214-68901 (Server/DC) pass validation and are preserved by smart-link extraction (#1476)
  • Blocking fetcher calls for jira_get_issue and jira_search are offloaded from the MCP event loop and bounded by JIRA_FETCHER_MAX_WORKERS (default 8), keeping the server responsive under concurrent issue reads (#1459)
  • Issue creation prefers an exact Epic issue type match, so custom types like Program Epic are no longer selected by accident (#1370)
  • Legacy 24-character hexadecimal Cloud account IDs are recognized regardless of their first character; malformed IDs, emails, and display names still go through normal user lookup (#1164)
  • Issue created / updated timestamps are routed through format_timestamp, returning localized timestamps instead of raw ISO strings (#1236)

Confluence

  • CQL searches like type=space return results instead of an empty list — space-type result items are now mapped and matched for excerpts (#1119, closes #907)
  • CQL search results include created / updated / author metadata again by expanding nested content history and version fields (#1480)
  • Comment replies preserve their bodies across API paths: v1 replies use the owning page as container with the parent in ancestors, and Cloud OAuth/PAT route through v2 with a storage-body fallback (#1485)
  • Legacy Server/DC timestamps that overflow the platform datetime range no longer crash page and comment formatting — the raw timestamp is returned instead of failing the whole tool response (#1483)
  • Updated to markdown-to-confluence 0.6 while preserving attachment handling, code-language normalization, table-layout conversion, and task-list behavior (#1486)
  • confluence_set_page_restrictions list parameters now declare an items schema, unblocking VS Code Agent mode, which rejected the generated tool schema entirely (#1487, closes #1455)
  • Date lozenges stored as <time datetime="..."> elements survive storage-to-Markdown conversion (#1107)

Server/Transport

  • Header-based PAT requests honour *_SSL_VERIFY and proxy settings instead of hardcoding SSL verification on and disabling proxies (#1211)
  • Hosts listed in NO_PROXY bypass the proxy even when proxies are explicitly configured on the session (#1191)
  • Unexpected tool failures surface detailed ToolErrors instead of generic masked errors, and Confluence search helpers no longer return empty success results for API/network failures (#1316, closes #1315)
  • Multi-user token validation results are cached across requests for a configurable TTL (MCP_ATLASSIAN_VALIDATION_CACHE_TTL, default 300s; 0 disables), cutting a validation round-trip from every request. Cache keys are SHA-256 material scoped by service and credential, so raw tokens are never stored (#1481, closes #1405)
  • MCP tool annotations align with actual behavior: additive write tools are marked non-destructive, while watcher removal and sprint reassignment keep their destructive annotations (#1458)

🔒 Security

Server/Transport

  • Upgraded the Starlette dependency to a patched release (>=1.0.1) for GHSA-86qp-5c8j-p5mr, with a malformed Host header regression test covering the path-based middleware gates (#1470)
  • Upgraded the bundled FastMCP framework from 2.x to 3.x, clearing known vulnerabilities in the 2.x line (#1234, #1348). The migration preserves the tool-visibility security boundary end to end: tools hidden by read-only mode, ENABLED_TOOLS, or toolset filtering remain both unlisted and uncallable, and denials are indistinguishable from unknown tools (#1442, supersedes #1388)
  • Follow-up hardening of the filter and SSRF defenses: caller-supplied projects_filter values are quoted as JQL literals and grouped so they cannot escape the configured allowlist, caller-controlled destinations stay on the direct DNS-pinned connection path when deployment proxies are configured, and relative redirect locations are resolved before SSRF validation (#1450)

Jira

  • New server-side internal-only comment guard for JSM projects: with JIRA_INTERNAL_ONLY_PROJECTS configured, comments created through the add, edit, transition, and issue-link paths in those projects are enforced as internal, so AI-authored comments cannot leak to service-desk customers. The guard fails closed unless Jira explicitly reports the comment as non-public (#1478)
  • Hardened JIRA_INTERNAL_ONLY_PROJECTS handling against invisible characters — zero-width characters or a BOM in configured project keys or incoming issue keys could previously make the guard fail open. Keys are now normalized, and entries that cannot match a valid project-key shape produce a warning (#1491)

🧰 Also in this release

Expanded regression coverage for Jira REST API v3 (#1110, closes #338), web and Confluence remote links (#1108), dynamic Epic Link fields (#1113), JSM queue request contracts (#1115), custom field option values (#1464, closes #673), and jira issues/epics (#1497); a deterministic rate-limit throttle test (#1449); a TruffleHog secret-scanning CI workflow (#1265); and setup docs for Autohand Code (#1472).

Contributors

Thanks to @trentzeigler (#1442, #1388), @sanjibani (#1489, #1487), @saidelike (#1367, #1459), @keithxm23 (#1196), @WZHBEDZ (#1316), @Troubladore (#1119, #1107), and @cblacknygc (#1497)!

Additional thanks to the contributors whose original work was carried into this release: @faizbawa, @kbichave, @deniszagitov, @slinkardbrandon, @cedrickcom, @trevorh, @jcbportela, @NickLoeza, @abhinavgaba, @tony-davis, @Niicolaa, @timwinders, and @balcsida.

Full Changelog: v0.22.1...v0.23.0