@simplysf/simply-atlassian-mcp 0.4.2 → 0.6.0
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 +17 -7
- package/docs/guides/mcp-server.md +402 -0
- package/lib/commands/atlassian/mcp.d.ts +28 -0
- package/lib/commands/atlassian/mcp.js +94 -0
- package/lib/commands/atlassian/mcp.js.map +1 -0
- package/oclif.manifest.json +65 -0
- package/package.json +21 -4
package/README.md
CHANGED
|
@@ -14,17 +14,27 @@ Using it takes four steps: install the server, tell your MCP client how to launc
|
|
|
14
14
|
connection, then ask the agent for what you want in plain language. This README walks through
|
|
15
15
|
each, then covers letting the agent write, the full tool list, results and errors, and what to
|
|
16
16
|
check when something does not work. The same material, with the rest of the CLI's guides, is on
|
|
17
|
-
the [documentation site](https://simplysf.github.io/simply-atlassian/guides/mcp-server/).
|
|
17
|
+
the [documentation site](https://simplysf.github.io/simply-cli/atlassian/guides/mcp-server/).
|
|
18
18
|
|
|
19
19
|
## Install
|
|
20
20
|
|
|
21
21
|
The server needs Node.js 22 or later.
|
|
22
22
|
|
|
23
23
|
```bash
|
|
24
|
-
npm install -g @simplysf/simply-
|
|
25
|
-
simply
|
|
24
|
+
npm install -g @simplysf/simply-cli
|
|
25
|
+
simply atlassian mcp --list
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
+
`--list` prints every tool this server would register, then exits. Run without it and the server
|
|
29
|
+
waits on stdin for a client, which at a terminal looks like a hang.
|
|
30
|
+
|
|
31
|
+
The plugin installs itself the first time you run the command, so `@simplysf/simply-cli` is the
|
|
32
|
+
only thing to install.
|
|
33
|
+
|
|
34
|
+
**The standalone binary still works.** `npm install -g @simplysf/simply-atlassian-mcp` and
|
|
35
|
+
`simply-atlassian-mcp` are unchanged, and an existing client configuration pointing at them keeps
|
|
36
|
+
running.
|
|
37
|
+
|
|
28
38
|
`--help` prints the options and every tool the server can register, so it doubles as a check that
|
|
29
39
|
the install worked. It prints to stderr, because stdout is reserved for the protocol stream.
|
|
30
40
|
|
|
@@ -35,7 +45,7 @@ forms.
|
|
|
35
45
|
## Connection settings
|
|
36
46
|
|
|
37
47
|
The server reads the same variables as the CLI, described in the
|
|
38
|
-
[Credentials](https://simplysf.github.io/simply-atlassian/guides/credentials/) guide:
|
|
48
|
+
[Credentials](https://simplysf.github.io/simply-cli/atlassian/guides/credentials/) guide:
|
|
39
49
|
|
|
40
50
|
```
|
|
41
51
|
JIRA_URL=https://your-site.atlassian.net
|
|
@@ -233,7 +243,7 @@ into:
|
|
|
233
243
|
|
|
234
244
|
Each tool's inputs are the matching command's arguments and flags in camel case, with arrays where
|
|
235
245
|
the CLI takes a repeatable or comma-separated flag; see the CLI's
|
|
236
|
-
[command reference](https://simplysf.github.io/simply-atlassian/reference/) for what each does.
|
|
246
|
+
[command reference](https://simplysf.github.io/simply-cli/atlassian/reference/) for what each does.
|
|
237
247
|
The first request above, for instance, becomes a call like:
|
|
238
248
|
|
|
239
249
|
```json
|
|
@@ -272,7 +282,7 @@ to also register the tools that create, update, transition, comment, link, and d
|
|
|
272
282
|
`ATLASSIAN_READ_ONLY` in the environment refuses every write, exactly as it does for the CLI.
|
|
273
283
|
|
|
274
284
|
That mirrors the two-credential-file arrangement in
|
|
275
|
-
[Write safety](https://simplysf.github.io/simply-atlassian/guides/write-safety/): give the agent's
|
|
285
|
+
[Write safety](https://simplysf.github.io/simply-cli/atlassian/guides/write-safety/): give the agent's
|
|
276
286
|
everyday server a read-scoped token, and configure a second server entry with `--allow-writes` and
|
|
277
287
|
a write-capable token that is enabled only when a person means to let the agent write. In a
|
|
278
288
|
`mcpServers` configuration the pair looks like this:
|
|
@@ -357,7 +367,7 @@ result whose text is a JSON object with a stable `code`:
|
|
|
357
367
|
|
|
358
368
|
The first three carry the same `name`, `message`, and `exitCode` the CLI writes to stderr,
|
|
359
369
|
scrubbed the same way, as described in
|
|
360
|
-
[Scripts and agents](https://simplysf.github.io/simply-atlassian/guides/scripting/). The agent
|
|
370
|
+
[Scripts and agents](https://simplysf.github.io/simply-cli/atlassian/guides/scripting/). The agent
|
|
361
371
|
sees these errors and can act on them, so a wrong key or a missing setting usually ends in the
|
|
362
372
|
agent telling you what went wrong rather than in silence.
|
|
363
373
|
|
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: MCP server
|
|
3
|
+
description: Give an AI agent in Claude Desktop, Claude Code, Cursor, Gemini CLI, or VS Code the same Jira and Confluence capabilities as the CLI, as Model Context Protocol tools, read-only by default.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
`@simplysf/simply-atlassian-mcp` is a [Model Context Protocol](https://modelcontextprotocol.io/)
|
|
7
|
+
server with one tool per CLI command. It calls the same library the CLI is built on, in-process,
|
|
8
|
+
so the agent gets the same credential handling, `dryRun` previews, read-only guard, and error
|
|
9
|
+
messages described elsewhere in these guides, and the same raw JSON the CLI prints with `--json`.
|
|
10
|
+
|
|
11
|
+
Using it takes four steps: install the server, tell your MCP client how to launch it, check the
|
|
12
|
+
connection, then ask the agent for what you want in plain language. This page walks through each,
|
|
13
|
+
then covers letting the agent write, the full tool list, results and errors, and what to check when
|
|
14
|
+
something does not work.
|
|
15
|
+
|
|
16
|
+
## Install
|
|
17
|
+
|
|
18
|
+
The server needs Node.js 22 or later.
|
|
19
|
+
|
|
20
|
+
```sh
|
|
21
|
+
npm install -g @simplysf/simply-atlassian-mcp
|
|
22
|
+
simply-atlassian-mcp --help
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
`--help` prints the options and every tool the server can register, so it doubles as a check that
|
|
26
|
+
the install worked. It prints to stderr, because stdout is reserved for the protocol stream.
|
|
27
|
+
|
|
28
|
+
You can skip the global install and have the client fetch the package on demand with
|
|
29
|
+
`npx -y @simplysf/simply-atlassian-mcp` as the command; the client configurations below show both
|
|
30
|
+
forms.
|
|
31
|
+
|
|
32
|
+
## Connection settings
|
|
33
|
+
|
|
34
|
+
The server reads the same variables as the CLI, described in [Credentials](/guides/credentials/):
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
JIRA_URL=https://your-site.atlassian.net
|
|
38
|
+
JIRA_USERNAME=you@example.com
|
|
39
|
+
JIRA_API_TOKEN=...
|
|
40
|
+
|
|
41
|
+
CONFLUENCE_URL=https://your-site.atlassian.net
|
|
42
|
+
CONFLUENCE_USERNAME=you@example.com
|
|
43
|
+
CONFLUENCE_API_TOKEN=...
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Put them in a `.env` file and pass it with `--env-file`, or set them in the `env` block of the
|
|
47
|
+
client's server entry. A variable already in the environment wins over the file, as it does for
|
|
48
|
+
the CLI. Settings are resolved when a tool is called rather than at startup, so a server given only
|
|
49
|
+
the `JIRA_*` variables still serves every Jira tool; only the Confluence tools report a missing
|
|
50
|
+
setting.
|
|
51
|
+
|
|
52
|
+
Use an absolute path for the env file. MCP clients launch the server from a working directory of
|
|
53
|
+
their own, so `~` and relative paths may not resolve. On Windows, write the path with forward
|
|
54
|
+
slashes or doubled backslashes inside JSON: `"C:/Users/me/atlassian.env"`.
|
|
55
|
+
|
|
56
|
+
## Configure a client
|
|
57
|
+
|
|
58
|
+
### Claude Desktop
|
|
59
|
+
|
|
60
|
+
Edit `claude_desktop_config.json` (macOS: `~/Library/Application Support/Claude/`; Windows:
|
|
61
|
+
`%APPDATA%\Claude\`) and restart Claude Desktop:
|
|
62
|
+
|
|
63
|
+
```json
|
|
64
|
+
{
|
|
65
|
+
"mcpServers": {
|
|
66
|
+
"simply-atlassian": {
|
|
67
|
+
"command": "simply",
|
|
68
|
+
"args": ["atlassian", "mcp", "--env-file", "/home/me/atlassian.env"]
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
The same entry with the settings inline and no global install:
|
|
75
|
+
|
|
76
|
+
```json
|
|
77
|
+
{
|
|
78
|
+
"mcpServers": {
|
|
79
|
+
"simply-atlassian": {
|
|
80
|
+
"command": "npx",
|
|
81
|
+
"args": ["atlassian", "mcp"],
|
|
82
|
+
"env": {
|
|
83
|
+
"JIRA_URL": "https://your-site.atlassian.net",
|
|
84
|
+
"JIRA_USERNAME": "you@example.com",
|
|
85
|
+
"JIRA_API_TOKEN": "..."
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Claude Code
|
|
93
|
+
|
|
94
|
+
```sh
|
|
95
|
+
claude mcp add simply-atlassian -- simply-atlassian-mcp --env-file ~/atlassian.env
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Add `--scope project` to write the entry to a `.mcp.json` at the repository root instead, which
|
|
99
|
+
can be committed so a team shares the server definition. Keep tokens out of a committed file by
|
|
100
|
+
pointing at an env file each person holds locally. Inside a session, `/mcp` lists the configured
|
|
101
|
+
servers and whether each one connected.
|
|
102
|
+
|
|
103
|
+
### Cursor
|
|
104
|
+
|
|
105
|
+
Cursor reads `.cursor/mcp.json` in the project, or `~/.cursor/mcp.json` for every project, with
|
|
106
|
+
the same `mcpServers` shape as Claude Desktop.
|
|
107
|
+
|
|
108
|
+
### Gemini CLI
|
|
109
|
+
|
|
110
|
+
Gemini CLI reads `~/.gemini/settings.json` for every project, or `.gemini/settings.json` inside a
|
|
111
|
+
project, with the same `mcpServers` shape as Claude Desktop:
|
|
112
|
+
|
|
113
|
+
```json
|
|
114
|
+
{
|
|
115
|
+
"mcpServers": {
|
|
116
|
+
"simply-atlassian": {
|
|
117
|
+
"command": "simply",
|
|
118
|
+
"args": ["atlassian", "mcp", "--env-file", "/home/me/atlassian.env"]
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
`gemini mcp add` writes the same entry. `--scope user` puts it in the global file; the default
|
|
125
|
+
`project` scope writes `.gemini/settings.json`, and `-e` sets one variable on the entry:
|
|
126
|
+
|
|
127
|
+
```sh
|
|
128
|
+
gemini mcp add --scope user \
|
|
129
|
+
-e JIRA_URL=https://your-site.atlassian.net \
|
|
130
|
+
-e JIRA_USERNAME=you@example.com \
|
|
131
|
+
-e JIRA_API_TOKEN=... \
|
|
132
|
+
simply-atlassian simply-atlassian-mcp
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Flags meant for the server itself, `--env-file` and `--allow-writes`, are easier to add by editing
|
|
136
|
+
`settings.json`, because `gemini mcp add` reads a leading-dash argument as one of its own options.
|
|
137
|
+
|
|
138
|
+
Values in `env` expand `$NAME` from the environment Gemini started in, which keeps the token out of
|
|
139
|
+
the settings file without an env file:
|
|
140
|
+
|
|
141
|
+
```json
|
|
142
|
+
{
|
|
143
|
+
"mcpServers": {
|
|
144
|
+
"simply-atlassian": {
|
|
145
|
+
"command": "npx",
|
|
146
|
+
"args": ["atlassian", "mcp"],
|
|
147
|
+
"env": {
|
|
148
|
+
"JIRA_URL": "https://your-site.atlassian.net",
|
|
149
|
+
"JIRA_USERNAME": "you@example.com",
|
|
150
|
+
"JIRA_API_TOKEN": "$JIRA_API_TOKEN"
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Two other fields on an entry matter here. `trust: true` bypasses the per-call confirmation for
|
|
158
|
+
every tool on that server, so leave it off on any entry started with `--allow-writes` and let a
|
|
159
|
+
person approve each write. `includeTools` and `excludeTools` narrow what the model is shown, which
|
|
160
|
+
is a second way to express the split in [Let the agent write](#let-the-agent-write): a write entry
|
|
161
|
+
can register the write tools while holding back the destructive ones.
|
|
162
|
+
|
|
163
|
+
```json
|
|
164
|
+
{
|
|
165
|
+
"mcpServers": {
|
|
166
|
+
"simply-atlassian-write": {
|
|
167
|
+
"command": "simply",
|
|
168
|
+
"args": ["atlassian", "mcp", "--allow-writes", "--env-file", "/home/me/atlassian-write.env"],
|
|
169
|
+
"excludeTools": ["jira_issue_delete", "jira_issue_comment_delete", "confluence_page_delete"],
|
|
170
|
+
"trust": false
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
Inside a session, `/mcp` lists the configured servers, whether each connected, and the tools it
|
|
177
|
+
registered.
|
|
178
|
+
|
|
179
|
+
### Gemini Code Assist
|
|
180
|
+
|
|
181
|
+
Agent mode in the VS Code extension reads that same `~/.gemini/settings.json`, so an entry added
|
|
182
|
+
for Gemini CLI is already in place. In IntelliJ the file is `mcp.json` in the IDE's configuration
|
|
183
|
+
directory, holding the same `mcpServers` object.
|
|
184
|
+
|
|
185
|
+
### VS Code
|
|
186
|
+
|
|
187
|
+
VS Code reads `.vscode/mcp.json`, with a `servers` key and an explicit transport type:
|
|
188
|
+
|
|
189
|
+
```json
|
|
190
|
+
{
|
|
191
|
+
"servers": {
|
|
192
|
+
"simply-atlassian": {
|
|
193
|
+
"type": "stdio",
|
|
194
|
+
"command": "simply",
|
|
195
|
+
"args": ["atlassian", "mcp", "--env-file", "/home/me/atlassian.env"]
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### Any other client
|
|
202
|
+
|
|
203
|
+
The server speaks MCP over stdio, so any client that can launch a local command works: give it the
|
|
204
|
+
command, its arguments, and optionally an environment, as above. It announces itself as
|
|
205
|
+
`simply-atlassian` with the package version during the handshake and supplies instructions that
|
|
206
|
+
summarise the tool conventions for the host's model.
|
|
207
|
+
|
|
208
|
+
## Check the connection
|
|
209
|
+
|
|
210
|
+
Ask the agent which Jira account it is connected as. It should call `jira_whoami`, whose
|
|
211
|
+
description tells the model to use it first for exactly this purpose, and report back the account
|
|
212
|
+
the credentials resolve to. If it does, the server is running and the credentials work; the
|
|
213
|
+
[troubleshooting](#troubleshooting) table covers the cases where it does not.
|
|
214
|
+
|
|
215
|
+
## Ask for what you want
|
|
216
|
+
|
|
217
|
+
You do not call tools yourself. Describe the outcome, and the agent chooses the tools and fills in
|
|
218
|
+
their inputs from the descriptions the server publishes. Some examples of what a request turns
|
|
219
|
+
into:
|
|
220
|
+
|
|
221
|
+
| You ask | The agent calls |
|
|
222
|
+
| ----------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- |
|
|
223
|
+
| "What's open in PROJ and assigned to me?" | `jira_issue_search` with `jql` such as `project = PROJ AND assignee = currentUser() AND statusCategory != Done` |
|
|
224
|
+
| "Summarise PROJ-42 and its comments." | `jira_issue_view`, then `jira_issue_comment_list` |
|
|
225
|
+
| "Who changed the priority on PROJ-42, and when?" | `jira_issue_history` with `field: "priority"` |
|
|
226
|
+
| "What's in the current sprint on the Platform board?" | `jira_board_list` to find the board id, `jira_sprint_list` for the active sprint, then `jira_sprint_issues` |
|
|
227
|
+
| "Find our release-notes pages in the DOCS space." | `confluence_page_search` with a CQL query |
|
|
228
|
+
| "Give me a link to PROJ-42." | `jira_open`, which returns the URL rather than launching a browser |
|
|
229
|
+
|
|
230
|
+
Each tool's inputs are the matching command's arguments and flags in camel case, with arrays where
|
|
231
|
+
the CLI takes a repeatable or comma-separated flag; see the [Command Reference](/reference/) for
|
|
232
|
+
what each does. The first request above, for instance, becomes a call like:
|
|
233
|
+
|
|
234
|
+
```json
|
|
235
|
+
{
|
|
236
|
+
"jql": "project = PROJ AND assignee = currentUser() AND statusCategory != Done",
|
|
237
|
+
"fields": ["summary", "status", "priority"],
|
|
238
|
+
"limit": 50
|
|
239
|
+
}
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
and returns the same envelope the CLI prints under `--json`:
|
|
243
|
+
|
|
244
|
+
```json
|
|
245
|
+
{ "issues": [...], "pages": 1, "complete": true }
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
A few things make the agent's job easier:
|
|
249
|
+
|
|
250
|
+
- **Name the fields you care about.** `fields` on the issue tools matters as much here as in the
|
|
251
|
+
CLI: raw issue payloads are large, and an agent pays for every token it reads. "Show me the
|
|
252
|
+
summary and status of..." lets it ask for only those.
|
|
253
|
+
- **Name boards and sprints; the agent resolves the numbers.** The sprint tools take numeric ids,
|
|
254
|
+
which the agent looks up with `jira_board_list` and `jira_sprint_list`.
|
|
255
|
+
- **Transitions go by name.** "Move it to Done" works; when unsure what the workflow allows, the
|
|
256
|
+
agent can call `jira_issue_transitions` first.
|
|
257
|
+
- **Mention people by name or email.** `mentions` resolves them to account ids; an ambiguous name
|
|
258
|
+
comes back as an error listing the candidates, so the agent can ask you which one.
|
|
259
|
+
- **Paste Confluence URLs.** Every page input accepts a page id or a page URL.
|
|
260
|
+
- **`open` tools return URLs.** A server cannot launch a browser, so `jira_open` and
|
|
261
|
+
`confluence_open` hand back the address for you to follow.
|
|
262
|
+
|
|
263
|
+
## Let the agent write
|
|
264
|
+
|
|
265
|
+
Started without options, the server registers only the read tools. Start it with `--allow-writes`
|
|
266
|
+
to also register the tools that create, update, transition, comment, link, and delete. Even then,
|
|
267
|
+
`ATLASSIAN_READ_ONLY` in the environment refuses every write, exactly as it does for the CLI.
|
|
268
|
+
|
|
269
|
+
That mirrors the two-credential-file arrangement in [Write safety](/guides/write-safety/): give the
|
|
270
|
+
agent's everyday server a read-scoped token, and configure a second server entry with
|
|
271
|
+
`--allow-writes` and a write-capable token that is enabled only when a person means to let the
|
|
272
|
+
agent write. In a `mcpServers` configuration the pair looks like this:
|
|
273
|
+
|
|
274
|
+
```json
|
|
275
|
+
{
|
|
276
|
+
"mcpServers": {
|
|
277
|
+
"simply-atlassian": {
|
|
278
|
+
"command": "simply",
|
|
279
|
+
"args": ["atlassian", "mcp", "--env-file", "/home/me/atlassian.env"]
|
|
280
|
+
},
|
|
281
|
+
"simply-atlassian-write": {
|
|
282
|
+
"command": "simply",
|
|
283
|
+
"args": ["atlassian", "mcp", "--allow-writes", "--env-file", "/home/me/atlassian-write.env"]
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
A read-scoped token is still the only layer that binds; the server-side default just keeps write
|
|
290
|
+
tools out of the agent's normal loop entirely. Most clients also ask you to approve each tool call,
|
|
291
|
+
and the tools carry MCP annotations (`readOnlyHint`, `destructiveHint`) so a host can tell a read
|
|
292
|
+
from a delete when it asks.
|
|
293
|
+
|
|
294
|
+
With writes allowed:
|
|
295
|
+
|
|
296
|
+
- **Ask for a preview first.** Every write tool accepts `dryRun: true`, which returns the request
|
|
297
|
+
that would be sent without sending it. "Show me what you'd send to move PROJ-42 to Done with a
|
|
298
|
+
comment, then do it" produces a call like the one below, which you can check before the agent
|
|
299
|
+
repeats it without `dryRun`.
|
|
300
|
+
|
|
301
|
+
```json
|
|
302
|
+
{ "issue": "PROJ-42", "transition": "Done", "comment": "Verified in staging.", "dryRun": true }
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
- **Irreversible deletes need consent.** `jira_issue_delete` and `jira_issue_comment_delete`
|
|
306
|
+
require `confirm: true`, and so does `confluence_page_delete` with `purge: true`. A call without
|
|
307
|
+
it is answered with a `confirm-required` error before anything is looked up, and the message
|
|
308
|
+
names the input to add, so the agent will come back and ask you. Trashing a page needs no
|
|
309
|
+
`confirm`, because it is reversible.
|
|
310
|
+
- **Confluence bodies can be Markdown.** The page and comment tools take a body as `text` (plain
|
|
311
|
+
prose), raw storage-format `body`, or `markdown` (converted to storage format), and
|
|
312
|
+
`confluence_page_update` takes `append` to add to a page instead of replacing it. "Add a
|
|
313
|
+
Decisions section to this page with these three bullets" becomes `confluence_page_update` with
|
|
314
|
+
`markdown` and `append: true`.
|
|
315
|
+
|
|
316
|
+
## Tools
|
|
317
|
+
|
|
318
|
+
| Read tools | Write tools (`--allow-writes`) |
|
|
319
|
+
| ------------------------------ | ------------------------------------------------------- |
|
|
320
|
+
| `jira_whoami` | `jira_issue_create` |
|
|
321
|
+
| `jira_user_search` | `jira_issue_update` |
|
|
322
|
+
| `jira_user_view` | `jira_issue_transition` |
|
|
323
|
+
| `jira_open` | `jira_issue_delete` (needs `confirm`) |
|
|
324
|
+
| `jira_issue_search` | `jira_issue_comment_add` |
|
|
325
|
+
| `jira_issue_view` | `jira_issue_comment_edit` |
|
|
326
|
+
| `jira_issue_history` | `jira_issue_comment_delete` (needs `confirm`) |
|
|
327
|
+
| `jira_issue_transitions` | `jira_issue_link_create` |
|
|
328
|
+
| `jira_issue_comment_list` | `jira_issue_link_delete` |
|
|
329
|
+
| `jira_issue_link_list` | `jira_sprint_add` |
|
|
330
|
+
| `jira_issue_link_types` | `confluence_page_create` |
|
|
331
|
+
| `jira_board_list` | `confluence_page_update` |
|
|
332
|
+
| `jira_sprint_list` | `confluence_page_delete` (needs `confirm` with `purge`) |
|
|
333
|
+
| `jira_sprint_issues` | `confluence_page_comment_add` |
|
|
334
|
+
| `confluence_open` | |
|
|
335
|
+
| `confluence_page_get` | |
|
|
336
|
+
| `confluence_page_search` | |
|
|
337
|
+
| `confluence_page_children` | |
|
|
338
|
+
| `confluence_page_comment_list` | |
|
|
339
|
+
|
|
340
|
+
## Results and errors
|
|
341
|
+
|
|
342
|
+
A successful call returns what the CLI prints with `--json`, verbatim. A failure returns an error
|
|
343
|
+
result whose text is a JSON object with a stable `code`:
|
|
344
|
+
|
|
345
|
+
| `code` | Meaning |
|
|
346
|
+
| ------------------ | ------------------------------------------------------------------------------------ |
|
|
347
|
+
| `config` | Missing or contradictory settings, a refused write, bad input. |
|
|
348
|
+
| `auth` | The instance rejected the credentials; carries the HTTP `status`. |
|
|
349
|
+
| `error` | Any other failure, including an API error with its HTTP `status` and sanitised body. |
|
|
350
|
+
| `confirm-required` | A destructive tool was called without `confirm: true`. |
|
|
351
|
+
|
|
352
|
+
The first three map one-to-one onto the CLI's exit codes 2, 3, and 1, described in
|
|
353
|
+
[Scripts and agents](/guides/scripting/), and carry the same `name` and `message`, scrubbed of
|
|
354
|
+
credentials and control characters the same way. The agent sees these errors and can act on them,
|
|
355
|
+
so a wrong key or a missing setting usually ends in the agent telling you what went wrong rather
|
|
356
|
+
than in silence.
|
|
357
|
+
|
|
358
|
+
## Troubleshooting
|
|
359
|
+
|
|
360
|
+
Run `simply-atlassian-mcp --help` at a terminal first. If it prints the tool list, the package is
|
|
361
|
+
installed and working, and the problem is in how the client launches it or what it passes.
|
|
362
|
+
|
|
363
|
+
| Symptom | Cause and fix |
|
|
364
|
+
| ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
365
|
+
| The client reports the server failed to start | Desktop apps do not load your shell profile, so the command may not be on their `PATH`. Use the full path to the executable (it lives in the directory `npm prefix -g` reports, under `bin/` on macOS and Linux), or the `npx` form above. |
|
|
366
|
+
| The client's log says `Env file ... not found.` | The only startup failure. The path is wrong or relative; make it absolute. The server exits with code 2. |
|
|
367
|
+
| Every tool returns `code: "config"` naming `JIRA_URL` | The settings are not reaching the server: the env file is not being read, or the variables were set in a shell the client did not inherit. Pass `--env-file` or an `env` block explicitly. |
|
|
368
|
+
| Confluence tools fail with `code: "config"` while Jira works | Only the `JIRA_*` variables are set. Add the `CONFLUENCE_*` ones; each product's settings are resolved separately. |
|
|
369
|
+
| `code: "auth"` with status `401` | The instance rejected the credentials. Cloud needs `JIRA_USERNAME` plus `JIRA_API_TOKEN`; Server/Data Center needs `JIRA_PERSONAL_TOKEN` alone. Set one style, not both. |
|
|
370
|
+
| `code: "auth"` with status `403` on a write | The token is read-scoped, which is the intended outcome for the everyday server. Use the write-capable server entry for this change. |
|
|
371
|
+
| The agent says it has no tool to create, update, or delete | The server was started without `--allow-writes`. That is the default; see [Let the agent write](#let-the-agent-write). |
|
|
372
|
+
| A write returns `code: "config"` mentioning `ATLASSIAN_READ_ONLY` | The variable is set in the environment or the env file. Unset it, or point the write server at a credential file meant for writing. |
|
|
373
|
+
|
|
374
|
+
## Embed in your own process
|
|
375
|
+
|
|
376
|
+
The stdio binary is the usual way to run the server, but the package also exports what it is
|
|
377
|
+
built from, so a host process can serve the same tools over a transport of its choosing:
|
|
378
|
+
|
|
379
|
+
```js
|
|
380
|
+
import { createServer, startServer } from '@simplysf/simply-atlassian-mcp';
|
|
381
|
+
|
|
382
|
+
// Serve over stdio, exactly as the binary does.
|
|
383
|
+
await startServer({ allowWrites: false, envFile: '/home/me/atlassian.env' });
|
|
384
|
+
|
|
385
|
+
// Or build the server and attach a transport yourself.
|
|
386
|
+
const server = createServer({ allowWrites: true, env: process.env });
|
|
387
|
+
await server.connect(transport);
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
`createServer` returns the MCP SDK's `McpServer` with the tools registered and nothing connected.
|
|
391
|
+
`TOOLS` is the full catalogue, `selectTools(allowWrites)` is the subset a given configuration
|
|
392
|
+
registers, and `invokeTool` and `mapError` run one tool and map a failure onto the error object
|
|
393
|
+
above, for tests and hosts that need to drive the server without a transport.
|
|
394
|
+
|
|
395
|
+
## Options
|
|
396
|
+
|
|
397
|
+
```
|
|
398
|
+
simply-atlassian-mcp [--allow-writes] [--env-file <path>]
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
`--help` prints the options and the full tool list. Because stdout is the protocol stream, it
|
|
402
|
+
prints to stderr.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
/**
|
|
3
|
+
* Serves this package's MCP tools over stdio, as a command of the `simply` CLI.
|
|
4
|
+
*
|
|
5
|
+
* The same server the `simply-atlassian-mcp` binary runs — that binary still exists and still works.
|
|
6
|
+
* This exists so an MCP client can be pointed at `simply` with no separate global install: the
|
|
7
|
+
* plugin is fetched on first use like any other.
|
|
8
|
+
*
|
|
9
|
+
* **Extends `Command` directly, not `AtlassianCommand`.** That is deliberate and load-bearing. stdout
|
|
10
|
+
* is the protocol channel here, and the shared base class enables oclif's `--json` flag, which
|
|
11
|
+
* makes oclif print this command's return value to stdout when it is passed. One stray object on
|
|
12
|
+
* that stream corrupts the session, and the client's error would say nothing about why.
|
|
13
|
+
*/
|
|
14
|
+
export default class AtlassianMcp extends Command {
|
|
15
|
+
static enableJsonFlag: boolean;
|
|
16
|
+
static readonly summary = "Serve the Atlassian MCP tools over stdio.";
|
|
17
|
+
static readonly description: string;
|
|
18
|
+
static readonly examples: {
|
|
19
|
+
description: string;
|
|
20
|
+
command: string;
|
|
21
|
+
}[];
|
|
22
|
+
static readonly flags: {
|
|
23
|
+
'allow-writes': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
24
|
+
'env-file': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
25
|
+
list: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
26
|
+
};
|
|
27
|
+
run(): Promise<void>;
|
|
28
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2026, SimplySF.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { Command, Flags } from '@oclif/core';
|
|
17
|
+
import { selectTools, startServer } from '../../index.js';
|
|
18
|
+
/**
|
|
19
|
+
* Serves this package's MCP tools over stdio, as a command of the `simply` CLI.
|
|
20
|
+
*
|
|
21
|
+
* The same server the `simply-atlassian-mcp` binary runs — that binary still exists and still works.
|
|
22
|
+
* This exists so an MCP client can be pointed at `simply` with no separate global install: the
|
|
23
|
+
* plugin is fetched on first use like any other.
|
|
24
|
+
*
|
|
25
|
+
* **Extends `Command` directly, not `AtlassianCommand`.** That is deliberate and load-bearing. stdout
|
|
26
|
+
* is the protocol channel here, and the shared base class enables oclif's `--json` flag, which
|
|
27
|
+
* makes oclif print this command's return value to stdout when it is passed. One stray object on
|
|
28
|
+
* that stream corrupts the session, and the client's error would say nothing about why.
|
|
29
|
+
*/
|
|
30
|
+
export default class AtlassianMcp extends Command {
|
|
31
|
+
// Explicitly off, restating the class comment as code so a later refactor onto a base class
|
|
32
|
+
// that enables it fails loudly here rather than silently corrupting a protocol stream.
|
|
33
|
+
static enableJsonFlag = false;
|
|
34
|
+
static summary = 'Serve the Atlassian MCP tools over stdio.';
|
|
35
|
+
static description = 'Runs a Model Context Protocol server exposing Jira and Confluence as tools, for Claude Desktop, Claude ' +
|
|
36
|
+
'Code, Cursor, Gemini CLI, VS Code, or any other MCP client. It speaks the protocol on stdout, ' +
|
|
37
|
+
'so it is meant to be launched by a client rather than run by hand — at a terminal it will ' +
|
|
38
|
+
'simply appear to hang, waiting for a client that is not there.\n\n' +
|
|
39
|
+
'Point a client at it with "command": "simply", "args": ["atlassian", "mcp"]. The plugin installs ' +
|
|
40
|
+
'itself on first use, so nothing needs installing beyond the simply CLI.\n\n' +
|
|
41
|
+
'Only read tools are registered unless --allow-writes is passed, and ATLASSIAN_READ_ONLY still ' +
|
|
42
|
+
'refuses every write even then.';
|
|
43
|
+
static examples = [
|
|
44
|
+
{
|
|
45
|
+
description: 'Register only the read tools, taking settings from the environment',
|
|
46
|
+
command: '<%= config.bin %> <%= command.id %>',
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
description: 'Allow writes, with settings from a file',
|
|
50
|
+
command: '<%= config.bin %> <%= command.id %> --allow-writes --env-file ~/atlassian.env',
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
description: 'List the tools this server would register, without starting it',
|
|
54
|
+
command: '<%= config.bin %> <%= command.id %> --list',
|
|
55
|
+
},
|
|
56
|
+
];
|
|
57
|
+
static flags = {
|
|
58
|
+
'allow-writes': Flags.boolean({
|
|
59
|
+
summary: 'Also register the tools that change data.',
|
|
60
|
+
description: 'Off by default, so a server launched without thinking about it can only read. ' +
|
|
61
|
+
'ATLASSIAN_READ_ONLY in the environment still refuses every write even when this is on.',
|
|
62
|
+
default: false,
|
|
63
|
+
}),
|
|
64
|
+
'env-file': Flags.string({
|
|
65
|
+
char: 'e',
|
|
66
|
+
summary: 'Path to a .env file holding connection settings.',
|
|
67
|
+
description: 'Use an absolute path. MCP clients launch a server from a working directory of their own, ' +
|
|
68
|
+
'so ~ and relative paths may not resolve.',
|
|
69
|
+
}),
|
|
70
|
+
list: Flags.boolean({
|
|
71
|
+
summary: 'Print the tools that would be registered, then exit without serving.',
|
|
72
|
+
description: 'Printed to stderr, because stdout belongs to the protocol.',
|
|
73
|
+
default: false,
|
|
74
|
+
}),
|
|
75
|
+
};
|
|
76
|
+
async run() {
|
|
77
|
+
const { flags } = await this.parse(AtlassianMcp);
|
|
78
|
+
if (flags.list) {
|
|
79
|
+
// stderr, like every other diagnostic here: a client that inspects stdout must only ever
|
|
80
|
+
// find protocol traffic on it.
|
|
81
|
+
const tools = selectTools(flags['allow-writes']);
|
|
82
|
+
process.stderr.write([
|
|
83
|
+
`${tools.length} tool(s) would be registered${flags['allow-writes'] ? ' (writes allowed)' : ' (read-only)'}:`,
|
|
84
|
+
...tools.map((tool) => ` ${tool.name.padEnd(28)} ${tool.title}`),
|
|
85
|
+
'',
|
|
86
|
+
].join('\n'));
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
// Resolves once the transport is connected; the process then stays alive until the client
|
|
90
|
+
// closes the stream, which is why this command never returns in normal use.
|
|
91
|
+
await startServer({ allowWrites: flags['allow-writes'], envFile: flags['env-file'] });
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/commands/atlassian/mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE1D;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,OAAO;IAC/C,4FAA4F;IAC5F,uFAAuF;IAChF,MAAM,CAAU,cAAc,GAAG,KAAK,CAAC;IAEvC,MAAM,CAAmB,OAAO,GAAG,2CAA2C,CAAC;IAC/E,MAAM,CAAmB,WAAW,GACzC,yGAAyG;QACzG,gGAAgG;QAChG,4FAA4F;QAC5F,oEAAoE;QACpE,mGAAmG;QACnG,6EAA6E;QAC7E,gGAAgG;QAChG,gCAAgC,CAAC;IAE5B,MAAM,CAAmB,QAAQ,GAAG;QACzC;YACE,WAAW,EAAE,oEAAoE;YACjF,OAAO,EAAE,qCAAqC;SAC/C;QACD;YACE,WAAW,EAAE,yCAAyC;YACtD,OAAO,EAAE,+EAA+E;SACzF;QACD;YACE,WAAW,EAAE,gEAAgE;YAC7E,OAAO,EAAE,4CAA4C;SACtD;KACF,CAAC;IAEK,MAAM,CAAmB,KAAK,GAAG;QACtC,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC;YAC5B,OAAO,EAAE,2CAA2C;YACpD,WAAW,EACT,gFAAgF;gBAChF,wFAAwF;YAC1F,OAAO,EAAE,KAAK;SACf,CAAC;QACF,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC;YACvB,IAAI,EAAE,GAAG;YACT,OAAO,EAAE,kDAAkD;YAC3D,WAAW,EACT,2FAA2F;gBAC3F,0CAA0C;SAC7C,CAAC;QACF,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC;YAClB,OAAO,EAAE,sEAAsE;YAC/E,WAAW,EAAE,4DAA4D;YACzE,OAAO,EAAE,KAAK;SACf,CAAC;KACH,CAAC;IAEK,KAAK,CAAC,GAAG;QACd,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAEjD,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,yFAAyF;YACzF,+BAA+B;YAC/B,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;YACjD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB;gBACE,GAAG,KAAK,CAAC,MAAM,+BAA+B,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,cAAc,GAAG;gBAC7G,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACjE,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;YACF,OAAO;QACT,CAAC;QAED,0FAA0F;QAC1F,4EAA4E;QAC5E,MAAM,WAAW,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACxF,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"commands": {
|
|
3
|
+
"atlassian:mcp": {
|
|
4
|
+
"aliases": [],
|
|
5
|
+
"args": {},
|
|
6
|
+
"description": "Runs a Model Context Protocol server exposing Jira and Confluence as tools, for Claude Desktop, Claude Code, Cursor, Gemini CLI, VS Code, or any other MCP client. It speaks the protocol on stdout, so it is meant to be launched by a client rather than run by hand — at a terminal it will simply appear to hang, waiting for a client that is not there.\n\nPoint a client at it with \"command\": \"simply\", \"args\": [\"atlassian\", \"mcp\"]. The plugin installs itself on first use, so nothing needs installing beyond the simply CLI.\n\nOnly read tools are registered unless --allow-writes is passed, and ATLASSIAN_READ_ONLY still refuses every write even then.",
|
|
7
|
+
"examples": [
|
|
8
|
+
{
|
|
9
|
+
"description": "Register only the read tools, taking settings from the environment",
|
|
10
|
+
"command": "<%= config.bin %> <%= command.id %>"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"description": "Allow writes, with settings from a file",
|
|
14
|
+
"command": "<%= config.bin %> <%= command.id %> --allow-writes --env-file ~/atlassian.env"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"description": "List the tools this server would register, without starting it",
|
|
18
|
+
"command": "<%= config.bin %> <%= command.id %> --list"
|
|
19
|
+
}
|
|
20
|
+
],
|
|
21
|
+
"flags": {
|
|
22
|
+
"allow-writes": {
|
|
23
|
+
"description": "Off by default, so a server launched without thinking about it can only read. ATLASSIAN_READ_ONLY in the environment still refuses every write even when this is on.",
|
|
24
|
+
"name": "allow-writes",
|
|
25
|
+
"summary": "Also register the tools that change data.",
|
|
26
|
+
"allowNo": false,
|
|
27
|
+
"type": "boolean"
|
|
28
|
+
},
|
|
29
|
+
"env-file": {
|
|
30
|
+
"char": "e",
|
|
31
|
+
"description": "Use an absolute path. MCP clients launch a server from a working directory of their own, so ~ and relative paths may not resolve.",
|
|
32
|
+
"name": "env-file",
|
|
33
|
+
"summary": "Path to a .env file holding connection settings.",
|
|
34
|
+
"hasDynamicHelp": false,
|
|
35
|
+
"multiple": false,
|
|
36
|
+
"type": "option"
|
|
37
|
+
},
|
|
38
|
+
"list": {
|
|
39
|
+
"description": "Printed to stderr, because stdout belongs to the protocol.",
|
|
40
|
+
"name": "list",
|
|
41
|
+
"summary": "Print the tools that would be registered, then exit without serving.",
|
|
42
|
+
"allowNo": false,
|
|
43
|
+
"type": "boolean"
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"hasDynamicHelp": false,
|
|
47
|
+
"hiddenAliases": [],
|
|
48
|
+
"id": "atlassian:mcp",
|
|
49
|
+
"pluginAlias": "@simplysf/simply-atlassian-mcp",
|
|
50
|
+
"pluginName": "@simplysf/simply-atlassian-mcp",
|
|
51
|
+
"pluginType": "core",
|
|
52
|
+
"strict": true,
|
|
53
|
+
"summary": "Serve the Atlassian MCP tools over stdio.",
|
|
54
|
+
"enableJsonFlag": false,
|
|
55
|
+
"isESM": true,
|
|
56
|
+
"relativePath": [
|
|
57
|
+
"lib",
|
|
58
|
+
"commands",
|
|
59
|
+
"atlassian",
|
|
60
|
+
"mcp.js"
|
|
61
|
+
]
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
"version": "0.6.0"
|
|
65
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplysf/simply-atlassian-mcp",
|
|
3
3
|
"description": "Model Context Protocol server exposing Jira and Confluence to AI agents, built on @simplysf/simply-atlassian-core",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.6.0",
|
|
5
5
|
"author": "@ClayChipps",
|
|
6
6
|
"homepage": "https://github.com/SimplySF/simply-atlassian",
|
|
7
7
|
"bugs": "https://github.com/SimplySF/simply-atlassian/issues",
|
|
@@ -14,7 +14,9 @@
|
|
|
14
14
|
"node": ">=22.0.0"
|
|
15
15
|
},
|
|
16
16
|
"files": [
|
|
17
|
-
"/
|
|
17
|
+
"/docs",
|
|
18
|
+
"/lib",
|
|
19
|
+
"/oclif.manifest.json"
|
|
18
20
|
],
|
|
19
21
|
"keywords": [
|
|
20
22
|
"mcp",
|
|
@@ -33,11 +35,14 @@
|
|
|
33
35
|
},
|
|
34
36
|
"dependencies": {
|
|
35
37
|
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
36
|
-
"@
|
|
38
|
+
"@oclif/core": "^4.11.2",
|
|
39
|
+
"@simplysf/simply-atlassian-core": "^0.6.0",
|
|
37
40
|
"zod": "^4.5.4"
|
|
38
41
|
},
|
|
39
42
|
"devDependencies": {
|
|
40
43
|
"@vitest/coverage-v8": "^4.1.10",
|
|
44
|
+
"oclif": "^4.23.0",
|
|
45
|
+
"shx": "^0.4.0",
|
|
41
46
|
"vitest": "^4.1.10"
|
|
42
47
|
},
|
|
43
48
|
"publishConfig": {
|
|
@@ -49,6 +54,8 @@
|
|
|
49
54
|
"fix-license": "eslint src test --fix --rule \"header/header: [2]\"",
|
|
50
55
|
"format": "wireit",
|
|
51
56
|
"lint": "wireit",
|
|
57
|
+
"postpack": "shx rm -f oclif.manifest.json",
|
|
58
|
+
"prepack": "pnpm run compile && oclif manifest",
|
|
52
59
|
"test": "wireit",
|
|
53
60
|
"test:coverage": "wireit",
|
|
54
61
|
"test:only": "wireit",
|
|
@@ -167,5 +174,15 @@
|
|
|
167
174
|
"service": true
|
|
168
175
|
}
|
|
169
176
|
},
|
|
170
|
-
"
|
|
177
|
+
"oclif": {
|
|
178
|
+
"bin": "simply",
|
|
179
|
+
"commands": "./lib/commands",
|
|
180
|
+
"topicSeparator": " ",
|
|
181
|
+
"topics": {
|
|
182
|
+
"atlassian": {
|
|
183
|
+
"description": "Work with Atlassian products."
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
"gitHead": "bde6b82c40ca4d9312eb8960cea1fdcd61931078"
|
|
171
188
|
}
|