@stubbedev/atlassian-mcp 0.5.17 → 0.5.19

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 (2) hide show
  1. package/README.md +36 -24
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -28,7 +28,7 @@ A [Model Context Protocol](https://modelcontextprotocol.io) (MCP) server for **s
28
28
  |---|---|
29
29
  | `jira_search` | Discover resources: `issues`, `projects`, `issue_types`, `boards`, `sprints`, `board_overview`, `versions`, `components`, `fields`, or `users` via `resource` param |
30
30
  | `jira_get` | Full details for one issue: summary, description, status, sprint, transitions, comments, and attachment list |
31
- | `jira_mutate` | Create, update, transition, comment (`commentAction`: `add` / `update` / `delete`), upload attachments from a local path, URL, or `data:` URI, link, add to sprint, log work, change issue type, set any custom field by name (`create.customFields` / `update.customFields`), or manage a fix version (`version.action`: `create` / `update` / `release` / `archive` / `delete`) — several in one call. Markdown in any text field is converted to Jira wiki markup |
31
+ | `jira_mutate` | Create, update, transition, comment (`commentAction`: `add` / `update` / `delete`), upload attachments from a local path, URL, or `data:` URI, link, add to sprint, log work, change issue type, set any custom field by name (`create.customFields` / `update.customFields`), delete an issue (`delete=true`), or manage a fix version (`version.action`: `create` / `update` / `release` / `archive` / `delete`) — several in one call. Markdown in any text field is converted to Jira wiki markup |
32
32
 
33
33
  ### Bitbucket
34
34
 
@@ -77,6 +77,8 @@ A [Model Context Protocol](https://modelcontextprotocol.io) (MCP) server for **s
77
77
  - "set fix version 9.1.0 on FOO-123" → `jira_mutate` with `update.fixVersion=9.1.0`
78
78
  - "create a task under epic FOO-100" → `jira_mutate` with `create.issueType=Task`, `create.parent=FOO-100` (auto-detects Epic and sets Epic Link)
79
79
  - "move FOO-123 under epic FOO-100" → `jira_mutate` with `update.epicLink=FOO-100`
80
+ - "delete FOO-123" → `jira_mutate` with `delete=true` (irreversible; add `deleteSubtasks=true` for a parent). Closing the ticket is usually what is wanted instead
81
+ - "FOO-123 relates to FOO-100" → `jira_mutate` with `link={linkType: "Relates", targetIssueKey: "FOO-100"}` — the phrase ("is blocked by") works too and sets the direction
80
82
  - "create an epic" → `jira_mutate` with `create.issueType=Epic` (Epic Name defaults to the summary)
81
83
  - "set story points to 5" → `jira_mutate` with `update.customFields={"Story Points": 5}` — values are plain (option label, username, date, array of labels); the server wraps them per the field schema
82
84
  - "what can I set on this ticket / on an Epic?" → `jira_search resource=fields` with `issueKey=FOO-123` (edit screen) or `project=FOO`+`issueType=Epic` (create screen): required and optional fields, value shapes, allowed values
@@ -548,28 +550,33 @@ For Bitbucket, a source that already appears in the description or comment text
548
550
  by the attachment markup — that works for URLs too, so writing `![the widget](https://…/shot.png)`
549
551
  and passing the same URL in `attachments` keeps your caption and swaps in the uploaded file.
550
552
 
551
- **Sandboxed hosts.** Claude Desktop runs extensions in an OS sandbox that blocks arbitrary
552
- filesystem paths but still allows outbound HTTPS, so local paths generally fail there while URL and
553
- `data:` sources work. The error for an unreadable path says so. This also applies to chaining with
554
- another MCP server: a screenshot another server saved to *its* temp directory is not reachable
555
- from this one under a sandbox, though it is when both run unsandboxed (as in Claude Code).
553
+ **Confined hosts.** A host may run this server sandboxed, in which case a path it was not granted
554
+ comes back as a permission error while URL and `data:` sources keep working — neither needs the
555
+ filesystem. The startup log names the config file it read, or the error it got trying, which is the
556
+ quickest way to tell whether the filesystem is restricted on your setup. The same applies to
557
+ chaining with another MCP server: a screenshot another server wrote to *its* temp directory is only
558
+ reachable here if this process is allowed to read that path.
556
559
 
557
- > Files a user attaches to the chat itself still cannot be uploaded from these arguments: MCP has
558
- > no mechanism for passing conversation attachments to a server, and the model cannot re-emit image
560
+ > Files a user attaches to the chat itself cannot be uploaded from these arguments: MCP has no
561
+ > mechanism for passing conversation attachments to a server, and the model cannot re-emit image
559
562
  > bytes it was shown. Use [`attach_files`](#the-upload-panel-mcp-apps) — the user re-picks or pastes
560
563
  > the file into a panel that uploads it directly — or give this server a URL or a readable path.
561
564
 
562
565
  ### The upload panel (MCP Apps)
563
566
 
564
- `attach_files` opens a file picker **inside the chat**. It exists because neither of the
565
- other routes works everywhere:
567
+ `attach_files` opens a file picker **inside the chat**. It exists for the file that has no
568
+ path to pass:
566
569
 
567
- - a local path needs this server to share a filesystem with the file, which a sandboxed
568
- host (Claude Desktop extensions) does not allow;
569
- - a file the user drops into the conversation never reaches an MCP server at all — the
570
- protocol has no client-to-server file transfer, and the model cannot re-emit bytes it
571
- was shown. [SEP-2631](https://github.com/modelcontextprotocol/modelcontextprotocol/issues/2631)
572
- would add one; it is still a draft.
570
+ - a screenshot the user pasted or dragged into the conversation is not on disk anywhere
571
+ this server could look, and MCP has no client-to-server file transfer to carry it — the
572
+ model cannot re-emit bytes it was shown.
573
+ [SEP-2631](https://github.com/modelcontextprotocol/modelcontextprotocol/issues/2631)
574
+ would add one; it is still a draft;
575
+ - and a local path only works if the server is both on the same machine *and* permitted to
576
+ read it, which a host that confines the server may not allow.
577
+
578
+ Where a readable path or a URL does exist, the `attachments` arguments remain the better
579
+ route — no user interaction at all.
573
580
 
574
581
  [MCP Apps](https://github.com/modelcontextprotocol/ext-apps) routes around both. The tool
575
582
  declares a `ui://` resource, the host renders it as an iframe, and that iframe is an
@@ -588,14 +595,19 @@ never fills in `files` and never sees the file contents. Files are capped at 12
588
595
  since the bytes ride the JSON-RPC channel as base64 — anything larger should go up by URL.
589
596
 
590
597
  Support is negotiated: hosts advertise MCP Apps through the `io.modelcontextprotocol/ui`
591
- extension at `initialize`. Where it is absent — **Claude Code today** — `attach_files`
592
- returns a plain instruction to use a path or URL instead, and every other tool behaves
593
- exactly as before.
594
-
595
- The panel is one self-contained HTML document, because the host serves it under
596
- `default-src 'none'`: no CDN, no second resource, no build step. The MCP Apps browser SDK
597
- is vendored into `ui/vendor/ext-apps.js` by `scripts/vendor-ext-apps.sh` (re-run it to
598
- bump the version) and spliced into the page when the resource is read.
598
+ extension at `initialize`. Where it is absent — **Claude Code today** — the whole surface is
599
+ hidden rather than merely degraded: `attach_files` is filtered out of `tools/list`, the
600
+ widget is filtered out of `resources/list`, and reading it is refused (a client that fetched
601
+ it anyway would take a few hundred KB of inlined SDK into its context for a page it cannot
602
+ draw). Such a host sees exactly the tools it saw before, and is told to ask for a path or
603
+ URL instead.
604
+
605
+ The panel is one self-contained HTML document (`ui/upload.html`, ~19 KB), because the host
606
+ serves it under `default-src 'none'`: no CDN, no second resource, no build step. It carries
607
+ its own ~2 KB MCP Apps bridge rather than the official browser SDK — a view only needs one
608
+ `ui/initialize` round trip, an `initialized` notification, `tool-input` notifications in and
609
+ `tools/call` requests out, and the SDK brings ~400 KB of zod to validate messages this page
610
+ already treats as untrusted. Bundling it with esbuild makes it larger, not smaller.
599
611
 
600
612
  ### Attachment decoding pipeline
601
613
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stubbedev/atlassian-mcp",
3
- "version": "0.5.17",
3
+ "version": "0.5.19",
4
4
  "description": "MCP server for self-hosted Jira and Bitbucket (Go, distributed as a prebuilt binary)",
5
5
  "license": "MIT",
6
6
  "type": "module",