@stubbedev/atlassian-mcp 0.5.10 → 0.5.11

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 +48 -26
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -13,7 +13,7 @@ A [Model Context Protocol](https://modelcontextprotocol.io) (MCP) server for **s
13
13
  | Tool | Description |
14
14
  |---|---|
15
15
  | `get_dev_context` | Master entry point: git state + linked Jira ticket + open PR with reviewer/blocker status and next-step hints |
16
- | `start_work` | Start a Jira ticket: fetches it, creates a local branch (`feature/FOO-123-slug`) off the repository default branch, and optionally transitions the ticket |
16
+ | `start_work` | Start a Jira ticket: resolves it by key or free-text `query` (with a picker when several match), creates a local branch (`feature/FOO-123-slug`) off the repository default branch, fetches the project README from Bitbucket so commit/PR conventions are in context, and optionally transitions the ticket |
17
17
  | `complete_work` | Close out finished work: merges the open PR and transitions the Jira ticket to Done. Refuses to merge while reviewers have not approved or a build failed (`force=true` overrides) |
18
18
 
19
19
  ### Git
@@ -28,16 +28,16 @@ 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`), attach, link, add to sprint, log work, 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 local files as attachments, 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 |
32
32
 
33
33
  ### Bitbucket
34
34
 
35
35
  | Tool | Description |
36
36
  |---|---|
37
- | `bitbucket_search` | Discover resources: `pull_requests` (default), `repos`, `branches`, or `users` via `resource` param; `mine=true` for your inbox |
37
+ | `bitbucket_search` | Discover resources: `pull_requests` (default), `repos`, `branches`, or `users` via `resource` param; `mine=true` for your inbox, narrowed with `role=author` / `reviewer` / `participant` |
38
38
  | `bitbucket_get_pr` | Full PR details: metadata, commits, comments, blockers, build status, optional diff, and any attachments referenced from the description or comments |
39
39
  | `bitbucket_mutate` | Create/update a PR, or perform lifecycle actions: `approve`, `unapprove`, `needs_work`, `merge`, `decline`. Reviewer names are verified against Bitbucket, and an update that would drop existing reviewers needs `update.replaceReviewers=true` |
40
- | `bitbucket_comment` | Add, update, or delete a PR comment; for code changes use `suggestion` so Bitbucket shows Apply suggestion. Enforced here: one reply per thread, no new top-level comment on your own PR (`asAuthor=true` to override), `#123` references rewritten as links |
40
+ | `bitbucket_comment` | Add, update, or delete a PR comment; for code changes use `suggestion` so Bitbucket shows Apply suggestion. Enforced here: one reply per thread, no new top-level comment on your own PR (`asAuthor=true` to override), `#123` references rewritten as links. `pending=true` posts an unpublished draft-review comment |
41
41
  | `bitbucket_get_file` | Raw file content at a branch, tag, or commit — or pass `prId` to read the PR source branch. Every response names the path and ref it came from, and pages via `maxChars`/`charOffset` |
42
42
  | `bitbucket_pr_tasks` | Manage PR tasks (checklist items): `list`, `create`, `resolve`, `reopen`, `delete` |
43
43
 
@@ -47,6 +47,12 @@ A [Model Context Protocol](https://modelcontextprotocol.io) (MCP) server for **s
47
47
  |---|---|
48
48
  | `get_attachment` | Fetch an attachment by ID from Jira (`source=jira`, IDs from `jira_get`) or Bitbucket (`source=bitbucket`, IDs from `bitbucket_get_pr`). Images, videos, animated images (GIF/APNG/animated WebP), audio, and PDFs are decoded inline so the model can see/hear them; text/JSON inline. Oversized or non-renderable attachments are auto-saved to a temp file and the path is returned. `saveTo=/absolute/path` streams the original to disk |
49
49
 
50
+ ### Resources
51
+
52
+ | URI | Description |
53
+ |---|---|
54
+ | `dev-context://current` | The same live report as `get_dev_context` — branch state, linked Jira tickets, open PR — as an MCP resource. Re-read it for fresh state instead of spending another tool call. The repo is resolved per read from the caller's session, so the static URI serves whatever workspace the client is in |
55
+
50
56
  ### Natural language examples
51
57
 
52
58
  - "what am I working on?" → `get_dev_context`
@@ -137,7 +143,7 @@ The `$schema` field is optional but enables editor autocomplete and validation.
137
143
  - Jira: `project` (alias of `projectKey`)
138
144
  - Bitbucket: `project` and `repo` (aliases of `projectKey` and `repoSlug`)
139
145
  - For Bitbucket tools, `projectKey` and `repoSlug` are usually auto-detected from your local `origin` remote.
140
- - `bitbucket_create_pull_request` also auto-detects `fromBranch` from your current branch and returns the existing open PR if one already exists for that branch.
146
+ - `bitbucket_mutate` with `create` auto-detects `fromBranch` from your current branch and returns the existing open PR if one already exists for that branch. Other Bitbucket tools auto-target that PR when `prId` is omitted.
141
147
  - Jira project-scoped calls accept `projectKey` and work best when provided.
142
148
  - If `projectKey` is omitted for Jira issue creation/type lookup, the server tries to infer it from your current branch ticket key, falls back to auto-select when only one project is visible, and otherwise returns a numbered project list to pick from.
143
149
 
@@ -307,12 +313,13 @@ ATLASSIAN_MCP_HTTP=1 atlassian-mcp # same, via env
307
313
  `initialize` mints a session and returns an `Mcp-Session-Id` header, which the client
308
314
  **must** echo on every subsequent request and on the SSE stream. Requests with a
309
315
  missing/unknown/expired session id get **HTTP 404** so the client re-initializes
310
- (standard MCP-client behaviour). Each connected client/worktree is an isolated session.
316
+ (standard MCP-client behaviour). Each connected client/worktree is an isolated session;
317
+ per-session state (cached roots, PR review anchors) is dropped once the session ends.
311
318
  - **Auth:** on a loopback bind no token is needed. Binding a non-loopback address
312
319
  **requires** `ATLASSIAN_MCP_HTTP_TOKEN` (sent by clients as `Authorization: Bearer …`);
313
320
  the server refuses to start otherwise. Terminate TLS at your proxy.
314
321
  - **`GET /healthz`** is an unauthenticated liveness probe (returns `ok`) for proxies/load
315
- balancers. Idle sessions are evicted after 1h.
322
+ balancers.
316
323
 
317
324
  **Repo context comes from the client, not the server's working directory.** Tools that
318
325
  need a repo (`git_get_context`, `get_dev_context`, `start_work`, `complete_work`, and
@@ -333,12 +340,19 @@ round-trip (and working even when the client never advertised the `roots` capabi
333
340
  Send a `file://` URI or absolute path (comma-separated for multiple; first git repo wins):
334
341
 
335
342
  ```
343
+ X-Repo-Root: /srv/myrepo
336
344
  X-Mcp-Root: file:///srv/myrepo
337
345
  X-Mcp-Roots: /srv/a, /srv/b
338
346
  ```
339
347
 
340
- Accepted header names: `X-Mcp-Roots`, `X-Mcp-Root`, `Mcp-Roots`, `Mcp-Root`. A header value
341
- is authoritative — it takes precedence over `roots/list` and survives `list_changed`.
348
+ Accepted header names, in precedence order: `X-Repo-Root`, `X-Mcp-Roots`, `X-Mcp-Root`,
349
+ `Mcp-Roots`, `Mcp-Root`. A header value is authoritative — it takes precedence over
350
+ `roots/list` and survives `list_changed`.
351
+
352
+ > **Protocol note:** MCP revision **2026-07-28** (SEP-2322/2575) forbids server-initiated
353
+ > JSON-RPC requests, so `roots/list` is unavailable on that revision — the server says so
354
+ > explicitly instead of hanging. On 2026-07-28 clients, a root **header** (or an explicit
355
+ > `repoPath` / `projectKey`+`repoSlug`) is the only way to give the server repo context.
342
356
 
343
357
  Client config for an already-running HTTP server (Claude Code example):
344
358
 
@@ -398,16 +412,20 @@ On a pushed `v*` tag, `.github/workflows/publish.yml` cross-compiles the Go bina
398
412
  OS/arch targets, attaches them to a GitHub release, and publishes the npm wrapper (which
399
413
  downloads the matching binary on install).
400
414
 
401
- Release flow:
415
+ Release flow (`just` drives it; it refuses to run on a dirty tree):
402
416
 
403
417
  ```bash
404
- # choose one: patch | minor | major (also: npm run release:patch / :minor / :major)
405
- npm version patch # bumps package.json, commits, tags vX.Y.Z
406
- git push origin HEAD --follow-tags
418
+ just release-preview # show the next patch/minor/major versions
419
+ just release-patch # or release-minor / release-major
407
420
  ```
408
421
 
409
- `flake.nix` reads its version from `package.json`, so the Nix package tracks the same bump
410
- automatically. GitHub Actions builds + publishes from the pushed tag.
422
+ `just release-<level>` bumps the version in `package.json`, re-syncs the Nix `vendorHash`
423
+ (`just sync-flake`), runs the gates (`just check`), commits `release: vX.Y.Z`, tags, and
424
+ pushes both the branch and the tag. The tag push triggers `publish.yml`.
425
+
426
+ `package.json` is the single source of truth for the version: the binary embeds it via
427
+ `go:embed` (no `-ldflags`) and `flake.nix` reads it, so one bump moves everything.
428
+ The equivalent npm scripts (`npm run release:patch` / `:minor` / `:major`) still work.
411
429
 
412
430
  - The workflow is configured for npm Trusted Publisher (OIDC), so no `NPM_TOKEN` secret is required
413
431
 
@@ -457,20 +475,24 @@ Paste the token as the `token` value under `bitbucket` in your config file.
457
475
 
458
476
  The server is a single Go module at the repo root (no `src/` tree).
459
477
 
478
+ Tasks live in the `justfile` and mirror the CI gates, so a green `just check` predicts
479
+ green CI:
480
+
460
481
  ```bash
461
- # Build the binary
462
- go build -o atlassian-mcp .
482
+ just # list tasks
483
+ just check # vet + test + build (what ci.yml runs)
484
+ just fmt # gofmt -w .
485
+ just sync-flake # recompute the Nix vendorHash after a dependency change
463
486
 
464
- # Run it
487
+ # Or the raw commands
488
+ go build -o atlassian-mcp .
465
489
  ./atlassian-mcp --config /path/to/config.json
490
+ go vet ./... && go test ./...
466
491
 
467
- # Vet + unit tests
468
- go vet ./...
469
- go test ./...
470
-
471
- # Test the tool list
472
- echo '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' | ./atlassian-mcp
473
-
474
- # Quick release smoke check (build + tools/list validation)
492
+ # Quick release smoke check (build + tools/list validation; CI also does a full stdio handshake)
475
493
  npm run smoke
476
494
  ```
495
+
496
+ Tool schemas live in `tools.json` (embedded into the binary) and the MCP protocol layer is
497
+ the official [`modelcontextprotocol/go-sdk`](https://github.com/modelcontextprotocol/go-sdk);
498
+ the Go files at the repo root hold the tool logic.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stubbedev/atlassian-mcp",
3
- "version": "0.5.10",
3
+ "version": "0.5.11",
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",