@stubbedev/atlassian-mcp 0.1.15 → 0.1.17

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/README.md CHANGED
@@ -273,10 +273,23 @@ This package is published to npm as `@stubbedev/atlassian-mcp`.
273
273
 
274
274
  Use semantic versioning for releases. Breaking tool-surface changes should bump the minor version while `<1.0.0` (for example `0.0.x` -> `0.1.0`).
275
275
 
276
- Automatic publish is configured in `.github/workflows/publish.yml`:
276
+ Automatic publish is configured in `.github/workflows/publish.yml` and runs when a new version tag is pushed.
277
277
 
278
- - Push a tag like `v1.0.1` to publish from CI
279
- - Or run the workflow manually via **Actions → Publish Package**
278
+ Release flow:
279
+
280
+ ```bash
281
+ # choose one: patch | minor | major
282
+ increment=patch
283
+
284
+ # bumps package.json + package-lock.json,
285
+ # creates a version commit, and creates a git tag (for example v0.1.17)
286
+ npm version "$increment"
287
+
288
+ # push commit and tag to GitHub
289
+ git push origin HEAD --follow-tags
290
+ ```
291
+
292
+ GitHub Actions will publish the npm release from that pushed tag.
280
293
 
281
294
  - The workflow is configured for npm Trusted Publisher (OIDC), so no `NPM_TOKEN` secret is required
282
295
 
@@ -284,13 +297,6 @@ Required npm setup (one-time):
284
297
 
285
298
  - In npm package settings, add this GitHub repo/workflow as a Trusted Publisher
286
299
 
287
- Manual publish from local machine:
288
-
289
- ```bash
290
- npm run build
291
- npm publish --access public
292
- ```
293
-
294
300
  ---
295
301
 
296
302
  ## Creating Personal Access Tokens
package/dist/index.js CHANGED
@@ -39,6 +39,7 @@ function normalizeJiraMutateArgs(args) {
39
39
  }
40
40
  return out;
41
41
  }
42
+ const JIRA_WIKI_MARKUP_HINT = 'Use Jira wiki markup (Atlassian renderer syntax), not GitHub/CommonMark markdown.';
42
43
  server.setRequestHandler(ListToolsRequestSchema, async () => ({
43
44
  tools: [
44
45
  // ── Context ───────────────────────────────────────────────────────────
@@ -157,7 +158,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
157
158
  },
158
159
  {
159
160
  name: 'jira_create_issue',
160
- description: 'Use when you want to create a new Jira ticket (bug, story, task, etc.). If projectKey/project is omitted, the server auto-picks from branch context or asks you to choose.',
161
+ description: `Use when you want to create a new Jira ticket (bug, story, task, etc.). If projectKey/project is omitted, the server auto-picks from branch context or asks you to choose. ${JIRA_WIKI_MARKUP_HINT}`,
161
162
  inputSchema: {
162
163
  type: 'object',
163
164
  properties: {
@@ -165,7 +166,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
165
166
  project: { type: 'string', description: 'Alias for projectKey' },
166
167
  issueType: { type: 'string', description: 'Issue type name, for example "Bug", "Story", or "Task"' },
167
168
  summary: { type: 'string', description: 'Issue title' },
168
- description: { type: 'string', description: 'Issue description (optional)' },
169
+ description: { type: 'string', description: `Issue description (optional). ${JIRA_WIKI_MARKUP_HINT}` },
169
170
  assignee: { type: 'string', description: 'Username to assign to (optional)' },
170
171
  priority: { type: 'string', description: 'Priority name, e.g. "High" (optional)' },
171
172
  sprintId: { type: 'number', description: 'Sprint ID to immediately add the new issue into (optional)' },
@@ -175,13 +176,13 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
175
176
  },
176
177
  {
177
178
  name: 'jira_update_issue',
178
- description: 'Use when you want to edit an existing Jira ticket: title, description, assignee, or priority.',
179
+ description: `Use when you want to edit an existing Jira ticket: title, description, assignee, or priority. ${JIRA_WIKI_MARKUP_HINT}`,
179
180
  inputSchema: {
180
181
  type: 'object',
181
182
  properties: {
182
183
  issueKey: { type: 'string', description: 'Jira issue key' },
183
184
  summary: { type: 'string', description: 'New summary (optional)' },
184
- description: { type: 'string', description: 'New description (optional)' },
185
+ description: { type: 'string', description: `New description (optional). ${JIRA_WIKI_MARKUP_HINT}` },
185
186
  assignee: { type: 'string', description: 'New assignee username, or empty string to unassign (optional)' },
186
187
  priority: { type: 'string', description: 'New priority name (optional)' },
187
188
  sprintId: { type: 'number', description: 'Sprint ID to add this issue into (optional)' },
@@ -204,7 +205,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
204
205
  },
205
206
  {
206
207
  name: 'jira_mutate_issue',
207
- description: 'Use when you want to bundle Jira mutations in one call: create or target an issue, then optional update, sprint assignment, transition, and comment.',
208
+ description: `Use when you want to bundle Jira mutations in one call: create or target an issue, then optional update, sprint assignment, transition, and comment. ${JIRA_WIKI_MARKUP_HINT}`,
208
209
  inputSchema: {
209
210
  type: 'object',
210
211
  properties: {
@@ -216,7 +217,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
216
217
  project: { type: 'string', description: 'Alias for projectKey' },
217
218
  issueType: { type: 'string', description: 'Issue type name, e.g. Bug, Story, Task' },
218
219
  summary: { type: 'string', description: 'Issue title' },
219
- description: { type: 'string', description: 'Issue description (optional)' },
220
+ description: { type: 'string', description: `Issue description (optional). ${JIRA_WIKI_MARKUP_HINT}` },
220
221
  assignee: { type: 'string', description: 'Username to assign to (optional)' },
221
222
  priority: { type: 'string', description: 'Priority name (optional)' },
222
223
  },
@@ -226,7 +227,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
226
227
  type: 'object',
227
228
  properties: {
228
229
  summary: { type: 'string', description: 'New summary (optional)' },
229
- description: { type: 'string', description: 'New description (optional)' },
230
+ description: { type: 'string', description: `New description (optional). ${JIRA_WIKI_MARKUP_HINT}` },
230
231
  assignee: { type: 'string', description: 'New assignee username, or empty string to unassign (optional)' },
231
232
  priority: { type: 'string', description: 'New priority name (optional)' },
232
233
  },
@@ -234,7 +235,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
234
235
  sprintId: { type: 'number', description: 'Sprint ID to add the issue into (optional)' },
235
236
  transitionId: { type: 'string', description: 'Transition ID (optional if transitionName is provided)' },
236
237
  transitionName: { type: 'string', description: 'Transition name, e.g. In Progress (optional if transitionId is provided)' },
237
- comment: { type: 'string', description: 'Comment to add after other mutations (optional, no emoji)' },
238
+ comment: { type: 'string', description: `Comment to add after other mutations (optional, no emoji). ${JIRA_WIKI_MARKUP_HINT}` },
238
239
  },
239
240
  },
240
241
  },
@@ -272,12 +273,12 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
272
273
  },
273
274
  {
274
275
  name: 'jira_add_comment',
275
- description: 'Use when you want to leave a comment on a Jira ticket. Keep comments concise, plain text, and free of filler. Never include emojis.',
276
+ description: `Use when you want to leave a comment on a Jira ticket. Keep comments concise and free of filler. Never include emojis. ${JIRA_WIKI_MARKUP_HINT}`,
276
277
  inputSchema: {
277
278
  type: 'object',
278
279
  properties: {
279
280
  issueKey: { type: 'string', description: 'Jira issue key' },
280
- body: { type: 'string', description: 'Concise comment text only. No filler. Do not include emojis.' },
281
+ body: { type: 'string', description: `Concise comment text. No filler. Do not include emojis. ${JIRA_WIKI_MARKUP_HINT}` },
281
282
  },
282
283
  required: ['issueKey', 'body'],
283
284
  },
package/dist/jira.js CHANGED
@@ -83,7 +83,7 @@ function validateCommentBody(body) {
83
83
  throw new Error('Jira comment body must not be empty.');
84
84
  }
85
85
  if (EMOJI_RE.test(trimmed)) {
86
- throw new Error('Jira comments must not include emoji. Use concise plain text only.');
86
+ throw new Error('Jira comments must not include emoji. Use concise Jira wiki markup or plain text only.');
87
87
  }
88
88
  return trimmed;
89
89
  }
@@ -292,6 +292,7 @@ export class JiraClient {
292
292
  const f = data.fields;
293
293
  const lines = [
294
294
  `Issue: ${data.key} — ${f.summary}`,
295
+ `URL: ${this.issueUrl(data.key)}`,
295
296
  `Status: ${f.status.name}`,
296
297
  `Type: ${f.issuetype.name}`,
297
298
  `Priority: ${f.priority?.name ?? 'None'}`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stubbedev/atlassian-mcp",
3
- "version": "0.1.15",
3
+ "version": "0.1.17",
4
4
  "description": "MCP server for self-hosted Jira and Bitbucket",
5
5
  "license": "MIT",
6
6
  "type": "module",