@crypto512/jicon-mcp 0.1.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/.env.example +9 -0
- package/.jicon.json.custom +21 -0
- package/.jicon.json.example +15 -0
- package/.jicon.json.readonly +15 -0
- package/CLAUDE.md +596 -0
- package/CONTRIBUTING.md +371 -0
- package/DEVELOPMENT.md +400 -0
- package/LICENSE +21 -0
- package/README.md +300 -0
- package/TOOL_LIST.md +435 -0
- package/dist/config/constants.d.ts +14 -0
- package/dist/config/constants.d.ts.map +1 -0
- package/dist/config/constants.js +18 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/config/loader.d.ts +35 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +108 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/types.d.ts +130 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +32 -0
- package/dist/config/types.js.map +1 -0
- package/dist/confluence/client.d.ts +30 -0
- package/dist/confluence/client.d.ts.map +1 -0
- package/dist/confluence/client.js +176 -0
- package/dist/confluence/client.js.map +1 -0
- package/dist/confluence/defaults.d.ts +23 -0
- package/dist/confluence/defaults.d.ts.map +1 -0
- package/dist/confluence/defaults.js +29 -0
- package/dist/confluence/defaults.js.map +1 -0
- package/dist/confluence/formatters.d.ts +22 -0
- package/dist/confluence/formatters.d.ts.map +1 -0
- package/dist/confluence/formatters.js +125 -0
- package/dist/confluence/formatters.js.map +1 -0
- package/dist/confluence/tools.d.ts +266 -0
- package/dist/confluence/tools.d.ts.map +1 -0
- package/dist/confluence/tools.js +376 -0
- package/dist/confluence/tools.js.map +1 -0
- package/dist/confluence/types.d.ts +122 -0
- package/dist/confluence/types.d.ts.map +1 -0
- package/dist/confluence/types.js +5 -0
- package/dist/confluence/types.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +161 -0
- package/dist/index.js.map +1 -0
- package/dist/jira/client.d.ts +46 -0
- package/dist/jira/client.d.ts.map +1 -0
- package/dist/jira/client.js +178 -0
- package/dist/jira/client.js.map +1 -0
- package/dist/jira/defaults.d.ts +19 -0
- package/dist/jira/defaults.d.ts.map +1 -0
- package/dist/jira/defaults.js +57 -0
- package/dist/jira/defaults.js.map +1 -0
- package/dist/jira/formatters.d.ts +22 -0
- package/dist/jira/formatters.d.ts.map +1 -0
- package/dist/jira/formatters.js +128 -0
- package/dist/jira/formatters.js.map +1 -0
- package/dist/jira/tools.d.ts +334 -0
- package/dist/jira/tools.d.ts.map +1 -0
- package/dist/jira/tools.js +372 -0
- package/dist/jira/tools.js.map +1 -0
- package/dist/jira/types.d.ts +110 -0
- package/dist/jira/types.d.ts.map +1 -0
- package/dist/jira/types.js +5 -0
- package/dist/jira/types.js.map +1 -0
- package/dist/permissions/filter.d.ts +30 -0
- package/dist/permissions/filter.d.ts.map +1 -0
- package/dist/permissions/filter.js +89 -0
- package/dist/permissions/filter.js.map +1 -0
- package/dist/permissions/tool-registry.d.ts +49 -0
- package/dist/permissions/tool-registry.d.ts.map +1 -0
- package/dist/permissions/tool-registry.js +111 -0
- package/dist/permissions/tool-registry.js.map +1 -0
- package/dist/tempo/client.d.ts +32 -0
- package/dist/tempo/client.d.ts.map +1 -0
- package/dist/tempo/client.js +125 -0
- package/dist/tempo/client.js.map +1 -0
- package/dist/tempo/formatters.d.ts +30 -0
- package/dist/tempo/formatters.d.ts.map +1 -0
- package/dist/tempo/formatters.js +172 -0
- package/dist/tempo/formatters.js.map +1 -0
- package/dist/tempo/tools.d.ts +184 -0
- package/dist/tempo/tools.d.ts.map +1 -0
- package/dist/tempo/tools.js +392 -0
- package/dist/tempo/tools.js.map +1 -0
- package/dist/tempo/types.d.ts +98 -0
- package/dist/tempo/types.d.ts.map +1 -0
- package/dist/tempo/types.js +5 -0
- package/dist/tempo/types.js.map +1 -0
- package/dist/types.d.ts +27 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/http-client.d.ts +22 -0
- package/dist/utils/http-client.d.ts.map +1 -0
- package/dist/utils/http-client.js +137 -0
- package/dist/utils/http-client.js.map +1 -0
- package/dist/utils/response-formatter.d.ts +8 -0
- package/dist/utils/response-formatter.d.ts.map +1 -0
- package/dist/utils/response-formatter.js +38 -0
- package/dist/utils/response-formatter.js.map +1 -0
- package/package.json +50 -0
package/.env.example
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Jira Configuration
|
|
2
|
+
JIRA_URL=https://jira.example.com
|
|
3
|
+
JIRA_USERNAME=your-email@example.com
|
|
4
|
+
JIRA_API_TOKEN=your-jira-api-token
|
|
5
|
+
|
|
6
|
+
# Confluence Configuration
|
|
7
|
+
CONFLUENCE_URL=https://confluence.example.com
|
|
8
|
+
CONFLUENCE_USERNAME=your-email@example.com
|
|
9
|
+
CONFLUENCE_API_TOKEN=your-confluence-api-token
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"jira": {
|
|
3
|
+
"url": "https://jira.example.com",
|
|
4
|
+
"username": "your-email@example.com",
|
|
5
|
+
"token": "your-jira-api-token"
|
|
6
|
+
},
|
|
7
|
+
"confluence": {
|
|
8
|
+
"url": "https://confluence.example.com",
|
|
9
|
+
"username": "your-email@example.com",
|
|
10
|
+
"token": "your-confluence-api-token"
|
|
11
|
+
},
|
|
12
|
+
"permissions": {
|
|
13
|
+
"mode": "custom",
|
|
14
|
+
"whitelist": [
|
|
15
|
+
"jira_read",
|
|
16
|
+
"jira_create_issue",
|
|
17
|
+
"confluence_read"
|
|
18
|
+
],
|
|
19
|
+
"blacklist": []
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"jira": {
|
|
3
|
+
"url": "https://jira.example.com",
|
|
4
|
+
"username": "your-email@example.com",
|
|
5
|
+
"token": "your-jira-api-token"
|
|
6
|
+
},
|
|
7
|
+
"confluence": {
|
|
8
|
+
"url": "https://confluence.example.com",
|
|
9
|
+
"username": "your-email@example.com",
|
|
10
|
+
"token": "your-confluence-api-token"
|
|
11
|
+
},
|
|
12
|
+
"permissions": {
|
|
13
|
+
"mode": "full"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"jira": {
|
|
3
|
+
"url": "https://jira.example.com",
|
|
4
|
+
"username": "your-email@example.com",
|
|
5
|
+
"token": "your-jira-api-token"
|
|
6
|
+
},
|
|
7
|
+
"confluence": {
|
|
8
|
+
"url": "https://confluence.example.com",
|
|
9
|
+
"username": "your-email@example.com",
|
|
10
|
+
"token": "your-confluence-api-token"
|
|
11
|
+
},
|
|
12
|
+
"permissions": {
|
|
13
|
+
"mode": "readonly"
|
|
14
|
+
}
|
|
15
|
+
}
|
package/CLAUDE.md
ADDED
|
@@ -0,0 +1,596 @@
|
|
|
1
|
+
# Jira and Confluence MCP Server
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
A Model Context Protocol (MCP) server that provides seamless integration with Atlassian Jira and Confluence Server/Data Center instances. This server enables AI assistants to interact with Jira issues, projects, boards, and Confluence pages, spaces, and content through a comprehensive set of tools.
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
### Jira Integration
|
|
10
|
+
- **Issue Management**: Search, create, update, and transition issues
|
|
11
|
+
- **Project Operations**: List projects, components, and versions
|
|
12
|
+
- **Agile Support**: Access boards, sprints, and backlogs
|
|
13
|
+
- **Comments & Collaboration**: Add and retrieve comments on issues
|
|
14
|
+
- **Issue Linking**: Create and manage relationships between issues
|
|
15
|
+
- **Advanced Search**: Execute JQL queries for complex issue searches
|
|
16
|
+
|
|
17
|
+
### Confluence Integration
|
|
18
|
+
- **Content Management**: Create, read, update Confluence pages
|
|
19
|
+
- **Search Capabilities**: Execute CQL queries to find content
|
|
20
|
+
- **Space Operations**: List and manage Confluence spaces
|
|
21
|
+
- **Page Hierarchy**: Navigate parent-child page relationships
|
|
22
|
+
- **Attachments**: Upload and retrieve file attachments
|
|
23
|
+
- **Comments**: Add and view page comments
|
|
24
|
+
|
|
25
|
+
## Installation
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
# Install globally
|
|
29
|
+
npm install -g @crypto512/jicon-mcp
|
|
30
|
+
|
|
31
|
+
# Or run directly with npx
|
|
32
|
+
npx @crypto512/jicon-mcp
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Configuration
|
|
36
|
+
|
|
37
|
+
The server supports multiple authentication methods depending on your Atlassian instance type.
|
|
38
|
+
|
|
39
|
+
### Jira/Confluence Cloud (Basic Auth)
|
|
40
|
+
|
|
41
|
+
For Cloud instances, use email + API token with Basic authentication:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# Jira Configuration
|
|
45
|
+
JIRA_URL=https://your-domain.atlassian.net
|
|
46
|
+
JIRA_USERNAME=your-email@example.com
|
|
47
|
+
JIRA_API_TOKEN=your-jira-api-token
|
|
48
|
+
|
|
49
|
+
# Confluence Configuration
|
|
50
|
+
CONFLUENCE_URL=https://your-domain.atlassian.net/wiki
|
|
51
|
+
CONFLUENCE_USERNAME=your-email@example.com
|
|
52
|
+
CONFLUENCE_API_TOKEN=your-confluence-api-token
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Jira/Confluence Data Center 8.14+ (Bearer Auth with PAT)
|
|
56
|
+
|
|
57
|
+
For Data Center instances version 8.14 and later (including 9.x), use Personal Access Tokens (PAT) with Bearer authentication. Simply omit the `USERNAME` variable or set `AUTH_TYPE=bearer`:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# Jira Configuration (PAT - recommended for Data Center)
|
|
61
|
+
JIRA_URL=https://jira.example.com
|
|
62
|
+
JIRA_API_TOKEN=your-personal-access-token
|
|
63
|
+
JIRA_AUTH_TYPE=bearer
|
|
64
|
+
|
|
65
|
+
# Confluence Configuration (PAT - recommended for Data Center)
|
|
66
|
+
CONFLUENCE_URL=https://confluence.example.com
|
|
67
|
+
CONFLUENCE_API_TOKEN=your-personal-access-token
|
|
68
|
+
CONFLUENCE_AUTH_TYPE=bearer
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**Note**: To generate a Personal Access Token in Jira/Confluence Data Center:
|
|
72
|
+
1. Click your avatar → Profile
|
|
73
|
+
2. Select "Personal access tokens" in the left menu
|
|
74
|
+
3. Create a new token with appropriate permissions
|
|
75
|
+
|
|
76
|
+
### Claude Desktop Configuration
|
|
77
|
+
|
|
78
|
+
#### For Jira/Confluence Cloud:
|
|
79
|
+
|
|
80
|
+
**MacOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
81
|
+
**Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
|
|
82
|
+
|
|
83
|
+
```json
|
|
84
|
+
{
|
|
85
|
+
"mcpServers": {
|
|
86
|
+
"jicon": {
|
|
87
|
+
"command": "npx",
|
|
88
|
+
"args": ["-y", "@crypto512/jicon-mcp"],
|
|
89
|
+
"env": {
|
|
90
|
+
"JIRA_URL": "https://your-domain.atlassian.net",
|
|
91
|
+
"JIRA_USERNAME": "your-email@example.com",
|
|
92
|
+
"JIRA_API_TOKEN": "your-jira-api-token",
|
|
93
|
+
"CONFLUENCE_URL": "https://your-domain.atlassian.net/wiki",
|
|
94
|
+
"CONFLUENCE_USERNAME": "your-email@example.com",
|
|
95
|
+
"CONFLUENCE_API_TOKEN": "your-confluence-api-token"
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
#### For Jira/Confluence Data Center 8.14+ with PAT:
|
|
103
|
+
|
|
104
|
+
```json
|
|
105
|
+
{
|
|
106
|
+
"mcpServers": {
|
|
107
|
+
"jicon": {
|
|
108
|
+
"command": "npx",
|
|
109
|
+
"args": ["-y", "@crypto512/jicon-mcp"],
|
|
110
|
+
"env": {
|
|
111
|
+
"JIRA_URL": "https://jira.example.com",
|
|
112
|
+
"JIRA_API_TOKEN": "your-personal-access-token",
|
|
113
|
+
"JIRA_AUTH_TYPE": "bearer",
|
|
114
|
+
"CONFLUENCE_URL": "https://confluence.example.com",
|
|
115
|
+
"CONFLUENCE_API_TOKEN": "your-personal-access-token",
|
|
116
|
+
"CONFLUENCE_AUTH_TYPE": "bearer"
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Tools
|
|
124
|
+
|
|
125
|
+
### Jira Tools
|
|
126
|
+
|
|
127
|
+
#### `jira_search_issues`
|
|
128
|
+
Search for Jira issues using JQL (Jira Query Language).
|
|
129
|
+
|
|
130
|
+
**Parameters:**
|
|
131
|
+
- `jql` (string, required): JQL query string
|
|
132
|
+
- `maxResults` (number, optional): Maximum number of results (default: 50)
|
|
133
|
+
- `fields` (string[], optional): Specific fields to return
|
|
134
|
+
|
|
135
|
+
**Example:**
|
|
136
|
+
```typescript
|
|
137
|
+
{
|
|
138
|
+
"jql": "project = PROJ AND status = 'In Progress'",
|
|
139
|
+
"maxResults": 10,
|
|
140
|
+
"fields": ["summary", "status", "assignee"]
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
#### `jira_get_issue`
|
|
145
|
+
Get detailed information about a specific Jira issue.
|
|
146
|
+
|
|
147
|
+
**Parameters:**
|
|
148
|
+
- `issueKey` (string, required): Issue key (e.g., "PROJ-123")
|
|
149
|
+
- `fields` (string[], optional): Specific fields to return
|
|
150
|
+
- `expand` (string[], optional): Additional data to expand (e.g., "changelog", "renderedFields")
|
|
151
|
+
|
|
152
|
+
**Example:**
|
|
153
|
+
```typescript
|
|
154
|
+
{
|
|
155
|
+
"issueKey": "PROJ-123",
|
|
156
|
+
"expand": ["changelog"]
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
#### `jira_create_issue`
|
|
161
|
+
Create a new Jira issue.
|
|
162
|
+
|
|
163
|
+
**Parameters:**
|
|
164
|
+
- `projectKey` (string, required): Project key
|
|
165
|
+
- `issueType` (string, required): Issue type (e.g., "Bug", "Story", "Task")
|
|
166
|
+
- `summary` (string, required): Issue summary
|
|
167
|
+
- `description` (string, optional): Issue description
|
|
168
|
+
- `priority` (string, optional): Priority name
|
|
169
|
+
- `assignee` (string, optional): Assignee username
|
|
170
|
+
- `labels` (string[], optional): Array of labels
|
|
171
|
+
- `components` (string[], optional): Array of component names
|
|
172
|
+
- `customFields` (object, optional): Custom field values
|
|
173
|
+
|
|
174
|
+
**Example:**
|
|
175
|
+
```typescript
|
|
176
|
+
{
|
|
177
|
+
"projectKey": "PROJ",
|
|
178
|
+
"issueType": "Bug",
|
|
179
|
+
"summary": "Login button not responding",
|
|
180
|
+
"description": "When clicking the login button, nothing happens",
|
|
181
|
+
"priority": "High",
|
|
182
|
+
"labels": ["ui", "authentication"]
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
#### `jira_update_issue`
|
|
187
|
+
Update an existing Jira issue.
|
|
188
|
+
|
|
189
|
+
**Parameters:**
|
|
190
|
+
- `issueKey` (string, required): Issue key
|
|
191
|
+
- `fields` (object, required): Fields to update
|
|
192
|
+
- `notifyUsers` (boolean, optional): Send notifications (default: true)
|
|
193
|
+
|
|
194
|
+
**Example:**
|
|
195
|
+
```typescript
|
|
196
|
+
{
|
|
197
|
+
"issueKey": "PROJ-123",
|
|
198
|
+
"fields": {
|
|
199
|
+
"summary": "Updated summary",
|
|
200
|
+
"priority": { "name": "Critical" }
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
#### `jira_transition_issue`
|
|
206
|
+
Transition an issue to a different status.
|
|
207
|
+
|
|
208
|
+
**Parameters:**
|
|
209
|
+
- `issueKey` (string, required): Issue key
|
|
210
|
+
- `transitionName` (string, required): Transition name (e.g., "In Progress", "Done")
|
|
211
|
+
- `comment` (string, optional): Comment to add with transition
|
|
212
|
+
- `fields` (object, optional): Fields to update during transition
|
|
213
|
+
|
|
214
|
+
**Example:**
|
|
215
|
+
```typescript
|
|
216
|
+
{
|
|
217
|
+
"issueKey": "PROJ-123",
|
|
218
|
+
"transitionName": "Done",
|
|
219
|
+
"comment": "Completed and tested"
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
#### `jira_add_comment`
|
|
224
|
+
Add a comment to a Jira issue.
|
|
225
|
+
|
|
226
|
+
**Parameters:**
|
|
227
|
+
- `issueKey` (string, required): Issue key
|
|
228
|
+
- `comment` (string, required): Comment text (supports Jira markdown)
|
|
229
|
+
- `visibility` (object, optional): Visibility restrictions
|
|
230
|
+
|
|
231
|
+
**Example:**
|
|
232
|
+
```typescript
|
|
233
|
+
{
|
|
234
|
+
"issueKey": "PROJ-123",
|
|
235
|
+
"comment": "This has been fixed in the latest build"
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
#### `jira_get_issue_comments`
|
|
240
|
+
Retrieve comments from a Jira issue.
|
|
241
|
+
|
|
242
|
+
**Parameters:**
|
|
243
|
+
- `issueKey` (string, required): Issue key
|
|
244
|
+
- `maxResults` (number, optional): Maximum number of comments
|
|
245
|
+
- `orderBy` (string, optional): Sort order ("created" or "-created")
|
|
246
|
+
|
|
247
|
+
#### `jira_list_projects`
|
|
248
|
+
List all accessible Jira projects.
|
|
249
|
+
|
|
250
|
+
**Parameters:**
|
|
251
|
+
- `recent` (boolean, optional): Only return recent projects
|
|
252
|
+
- `expand` (string[], optional): Additional data to expand
|
|
253
|
+
|
|
254
|
+
#### `jira_get_project`
|
|
255
|
+
Get detailed information about a specific project.
|
|
256
|
+
|
|
257
|
+
**Parameters:**
|
|
258
|
+
- `projectKey` (string, required): Project key
|
|
259
|
+
- `expand` (string[], optional): Additional data to expand
|
|
260
|
+
|
|
261
|
+
#### `jira_get_transitions`
|
|
262
|
+
Get available transitions for an issue.
|
|
263
|
+
|
|
264
|
+
**Parameters:**
|
|
265
|
+
- `issueKey` (string, required): Issue key
|
|
266
|
+
|
|
267
|
+
#### `jira_link_issues`
|
|
268
|
+
Create a link between two issues.
|
|
269
|
+
|
|
270
|
+
**Parameters:**
|
|
271
|
+
- `issueKey` (string, required): Source issue key
|
|
272
|
+
- `linkedIssueKey` (string, required): Target issue key
|
|
273
|
+
- `linkType` (string, required): Link type (e.g., "Blocks", "Relates to")
|
|
274
|
+
- `comment` (string, optional): Comment for the link
|
|
275
|
+
|
|
276
|
+
**Example:**
|
|
277
|
+
```typescript
|
|
278
|
+
{
|
|
279
|
+
"issueKey": "PROJ-123",
|
|
280
|
+
"linkedIssueKey": "PROJ-456",
|
|
281
|
+
"linkType": "Blocks"
|
|
282
|
+
}
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
#### `jira_get_board`
|
|
286
|
+
Get information about an Agile board.
|
|
287
|
+
|
|
288
|
+
**Parameters:**
|
|
289
|
+
- `boardId` (number, required): Board ID
|
|
290
|
+
|
|
291
|
+
#### `jira_get_sprints`
|
|
292
|
+
List sprints for a board.
|
|
293
|
+
|
|
294
|
+
**Parameters:**
|
|
295
|
+
- `boardId` (number, required): Board ID
|
|
296
|
+
- `state` (string, optional): Sprint state filter ("active", "future", "closed")
|
|
297
|
+
|
|
298
|
+
#### `jira_get_sprint_issues`
|
|
299
|
+
Get issues in a specific sprint.
|
|
300
|
+
|
|
301
|
+
**Parameters:**
|
|
302
|
+
- `sprintId` (number, required): Sprint ID
|
|
303
|
+
- `maxResults` (number, optional): Maximum number of results
|
|
304
|
+
|
|
305
|
+
### Confluence Tools
|
|
306
|
+
|
|
307
|
+
#### `confluence_search_content`
|
|
308
|
+
Search Confluence content using CQL (Confluence Query Language).
|
|
309
|
+
|
|
310
|
+
**Parameters:**
|
|
311
|
+
- `cql` (string, required): CQL query string
|
|
312
|
+
- `limit` (number, optional): Maximum number of results (default: 25)
|
|
313
|
+
- `expand` (string[], optional): Additional data to expand
|
|
314
|
+
|
|
315
|
+
**Example:**
|
|
316
|
+
```typescript
|
|
317
|
+
{
|
|
318
|
+
"cql": "type=page AND space=DOCS AND title~'API'",
|
|
319
|
+
"limit": 10
|
|
320
|
+
}
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
#### `confluence_get_page`
|
|
324
|
+
Get a Confluence page by ID.
|
|
325
|
+
|
|
326
|
+
**Parameters:**
|
|
327
|
+
- `pageId` (string, required): Page ID
|
|
328
|
+
- `expand` (string[], optional): Additional data to expand (e.g., "body.storage", "version")
|
|
329
|
+
|
|
330
|
+
**Example:**
|
|
331
|
+
```typescript
|
|
332
|
+
{
|
|
333
|
+
"pageId": "123456",
|
|
334
|
+
"expand": ["body.storage", "version", "ancestors"]
|
|
335
|
+
}
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
#### `confluence_get_page_by_title`
|
|
339
|
+
Get a Confluence page by title and space.
|
|
340
|
+
|
|
341
|
+
**Parameters:**
|
|
342
|
+
- `spaceKey` (string, required): Space key
|
|
343
|
+
- `title` (string, required): Page title
|
|
344
|
+
- `expand` (string[], optional): Additional data to expand
|
|
345
|
+
|
|
346
|
+
**Example:**
|
|
347
|
+
```typescript
|
|
348
|
+
{
|
|
349
|
+
"spaceKey": "DOCS",
|
|
350
|
+
"title": "API Documentation"
|
|
351
|
+
}
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
#### `confluence_create_page`
|
|
355
|
+
Create a new Confluence page.
|
|
356
|
+
|
|
357
|
+
**Parameters:**
|
|
358
|
+
- `spaceKey` (string, required): Space key
|
|
359
|
+
- `title` (string, required): Page title
|
|
360
|
+
- `content` (string, required): Page content (Confluence storage format or HTML)
|
|
361
|
+
- `parentId` (string, optional): Parent page ID
|
|
362
|
+
- `labels` (string[], optional): Array of labels
|
|
363
|
+
|
|
364
|
+
**Example:**
|
|
365
|
+
```typescript
|
|
366
|
+
{
|
|
367
|
+
"spaceKey": "DOCS",
|
|
368
|
+
"title": "New Feature Documentation",
|
|
369
|
+
"content": "<p>This page describes the new feature...</p>",
|
|
370
|
+
"labels": ["api", "v2"]
|
|
371
|
+
}
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
#### `confluence_update_page`
|
|
375
|
+
Update an existing Confluence page.
|
|
376
|
+
|
|
377
|
+
**Parameters:**
|
|
378
|
+
- `pageId` (string, required): Page ID
|
|
379
|
+
- `title` (string, optional): New title
|
|
380
|
+
- `content` (string, optional): New content
|
|
381
|
+
- `version` (number, required): Current version number (for optimistic locking)
|
|
382
|
+
- `minorEdit` (boolean, optional): Whether this is a minor edit
|
|
383
|
+
|
|
384
|
+
**Example:**
|
|
385
|
+
```typescript
|
|
386
|
+
{
|
|
387
|
+
"pageId": "123456",
|
|
388
|
+
"content": "<p>Updated content...</p>",
|
|
389
|
+
"version": 5
|
|
390
|
+
}
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
#### `confluence_delete_page`
|
|
394
|
+
Delete a Confluence page.
|
|
395
|
+
|
|
396
|
+
**Parameters:**
|
|
397
|
+
- `pageId` (string, required): Page ID
|
|
398
|
+
|
|
399
|
+
#### `confluence_list_spaces`
|
|
400
|
+
List all accessible Confluence spaces.
|
|
401
|
+
|
|
402
|
+
**Parameters:**
|
|
403
|
+
- `limit` (number, optional): Maximum number of results
|
|
404
|
+
- `type` (string, optional): Space type filter ("global" or "personal")
|
|
405
|
+
|
|
406
|
+
#### `confluence_get_space`
|
|
407
|
+
Get detailed information about a space.
|
|
408
|
+
|
|
409
|
+
**Parameters:**
|
|
410
|
+
- `spaceKey` (string, required): Space key
|
|
411
|
+
- `expand` (string[], optional): Additional data to expand
|
|
412
|
+
|
|
413
|
+
#### `confluence_get_page_children`
|
|
414
|
+
Get child pages of a page.
|
|
415
|
+
|
|
416
|
+
**Parameters:**
|
|
417
|
+
- `pageId` (string, required): Parent page ID
|
|
418
|
+
- `expand` (string[], optional): Additional data to expand
|
|
419
|
+
- `limit` (number, optional): Maximum number of results
|
|
420
|
+
|
|
421
|
+
#### `confluence_add_comment`
|
|
422
|
+
Add a comment to a Confluence page.
|
|
423
|
+
|
|
424
|
+
**Parameters:**
|
|
425
|
+
- `pageId` (string, required): Page ID
|
|
426
|
+
- `comment` (string, required): Comment text (HTML format)
|
|
427
|
+
|
|
428
|
+
#### `confluence_get_comments`
|
|
429
|
+
Get comments on a Confluence page.
|
|
430
|
+
|
|
431
|
+
**Parameters:**
|
|
432
|
+
- `pageId` (string, required): Page ID
|
|
433
|
+
- `limit` (number, optional): Maximum number of results
|
|
434
|
+
|
|
435
|
+
#### `confluence_upload_attachment`
|
|
436
|
+
Upload an attachment to a Confluence page.
|
|
437
|
+
|
|
438
|
+
**Parameters:**
|
|
439
|
+
- `pageId` (string, required): Page ID
|
|
440
|
+
- `filePath` (string, required): Local file path
|
|
441
|
+
- `comment` (string, optional): Attachment comment
|
|
442
|
+
|
|
443
|
+
#### `confluence_list_attachments`
|
|
444
|
+
List attachments on a Confluence page.
|
|
445
|
+
|
|
446
|
+
**Parameters:**
|
|
447
|
+
- `pageId` (string, required): Page ID
|
|
448
|
+
- `limit` (number, optional): Maximum number of results
|
|
449
|
+
|
|
450
|
+
## Authentication
|
|
451
|
+
|
|
452
|
+
The server supports multiple authentication methods depending on your Atlassian instance:
|
|
453
|
+
|
|
454
|
+
### Basic Authentication (Jira/Confluence Cloud)
|
|
455
|
+
For Cloud instances, use API tokens with Basic Auth:
|
|
456
|
+
- **Username**: Your email address (e.g., user@example.com)
|
|
457
|
+
- **Token**: API token generated from your Atlassian account settings
|
|
458
|
+
- **Method**: Basic Auth (automatically used when username is provided)
|
|
459
|
+
|
|
460
|
+
Generate Cloud API tokens at: https://id.atlassian.com/manage-profile/security/api-tokens
|
|
461
|
+
|
|
462
|
+
### Bearer Token Authentication (Jira/Confluence Data Center 8.14+)
|
|
463
|
+
For Data Center instances version 8.14 and later (including 9.x), use Personal Access Tokens (PAT):
|
|
464
|
+
- **Token**: Personal Access Token generated from your Jira/Confluence profile
|
|
465
|
+
- **Method**: Bearer Auth (automatically used when username is omitted or `authType=bearer` is set)
|
|
466
|
+
- **Recommended for**: Jira 9.x, Confluence 7.9+
|
|
467
|
+
|
|
468
|
+
To generate a PAT:
|
|
469
|
+
1. Log into your Jira/Confluence Data Center instance
|
|
470
|
+
2. Click your avatar → Profile
|
|
471
|
+
3. Select "Personal access tokens" from the left menu
|
|
472
|
+
4. Click "Create token" and set appropriate permissions
|
|
473
|
+
5. Copy the token immediately (it won't be shown again)
|
|
474
|
+
|
|
475
|
+
### Authentication Auto-Detection
|
|
476
|
+
The server automatically detects the authentication method:
|
|
477
|
+
- If `username` is provided → uses **Basic Auth**
|
|
478
|
+
- If `username` is omitted → uses **Bearer Auth**
|
|
479
|
+
- If `authType` is explicitly set → uses the specified method
|
|
480
|
+
|
|
481
|
+
## Error Handling
|
|
482
|
+
|
|
483
|
+
All tools return structured error responses:
|
|
484
|
+
|
|
485
|
+
```typescript
|
|
486
|
+
{
|
|
487
|
+
"error": true,
|
|
488
|
+
"message": "Description of the error",
|
|
489
|
+
"statusCode": 401,
|
|
490
|
+
"details": { /* Additional error context */ }
|
|
491
|
+
}
|
|
492
|
+
```
|
|
493
|
+
|
|
494
|
+
Common error scenarios:
|
|
495
|
+
- **401 Unauthorized**: Invalid credentials or token
|
|
496
|
+
- **403 Forbidden**: Insufficient permissions
|
|
497
|
+
- **404 Not Found**: Resource doesn't exist
|
|
498
|
+
- **400 Bad Request**: Invalid parameters
|
|
499
|
+
- **500 Internal Server Error**: Server-side issue
|
|
500
|
+
|
|
501
|
+
## Best Practices
|
|
502
|
+
|
|
503
|
+
### Rate Limiting
|
|
504
|
+
The server implements intelligent rate limiting to respect Atlassian API limits:
|
|
505
|
+
- Automatic retry with exponential backoff
|
|
506
|
+
- Request queuing to prevent overwhelming the API
|
|
507
|
+
- Configurable rate limits per endpoint
|
|
508
|
+
|
|
509
|
+
### Caching
|
|
510
|
+
Certain read-only operations are cached to improve performance:
|
|
511
|
+
- Project metadata (5 minutes)
|
|
512
|
+
- User information (10 minutes)
|
|
513
|
+
- Space information (5 minutes)
|
|
514
|
+
|
|
515
|
+
### Security
|
|
516
|
+
- Never commit credentials to version control
|
|
517
|
+
- Use environment variables or secure credential storage
|
|
518
|
+
- API tokens should have minimal required permissions
|
|
519
|
+
- Regularly rotate API tokens
|
|
520
|
+
|
|
521
|
+
## Development
|
|
522
|
+
|
|
523
|
+
### Project Structure
|
|
524
|
+
```
|
|
525
|
+
jicon/
|
|
526
|
+
├── src/
|
|
527
|
+
│ ├── index.ts # MCP server entry point
|
|
528
|
+
│ ├── jira/
|
|
529
|
+
│ │ ├── client.ts # Jira API client
|
|
530
|
+
│ │ ├── tools.ts # Jira tool implementations
|
|
531
|
+
│ │ └── types.ts # Jira type definitions
|
|
532
|
+
│ ├── confluence/
|
|
533
|
+
│ │ ├── client.ts # Confluence API client
|
|
534
|
+
│ │ ├── tools.ts # Confluence tool implementations
|
|
535
|
+
│ │ └── types.ts # Confluence type definitions
|
|
536
|
+
│ └── utils/
|
|
537
|
+
│ ├── auth.ts # Authentication utilities
|
|
538
|
+
│ ├── cache.ts # Caching layer
|
|
539
|
+
│ └── rate-limit.ts # Rate limiting
|
|
540
|
+
├── tests/
|
|
541
|
+
│ ├── jira/
|
|
542
|
+
│ └── confluence/
|
|
543
|
+
├── package.json
|
|
544
|
+
├── tsconfig.json
|
|
545
|
+
└── README.md
|
|
546
|
+
```
|
|
547
|
+
|
|
548
|
+
### Building
|
|
549
|
+
```bash
|
|
550
|
+
npm install
|
|
551
|
+
npm run build
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
### Testing
|
|
555
|
+
```bash
|
|
556
|
+
npm test
|
|
557
|
+
npm run test:integration
|
|
558
|
+
```
|
|
559
|
+
|
|
560
|
+
## Roadmap
|
|
561
|
+
|
|
562
|
+
### v1.0 (Current)
|
|
563
|
+
- ✅ Core Jira issue operations
|
|
564
|
+
- ✅ Core Confluence page operations
|
|
565
|
+
- ✅ Basic search capabilities
|
|
566
|
+
- ✅ Authentication support
|
|
567
|
+
|
|
568
|
+
### v1.1 (Planned)
|
|
569
|
+
- Advanced filtering and sorting
|
|
570
|
+
- Bulk operations
|
|
571
|
+
- Webhooks support
|
|
572
|
+
- Custom field templates
|
|
573
|
+
|
|
574
|
+
### v1.2 (Future)
|
|
575
|
+
- Jira Automation integration
|
|
576
|
+
- Confluence templates
|
|
577
|
+
- Analytics and reporting
|
|
578
|
+
- Multi-instance support
|
|
579
|
+
|
|
580
|
+
## Contributing
|
|
581
|
+
|
|
582
|
+
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
|
|
583
|
+
|
|
584
|
+
## License
|
|
585
|
+
|
|
586
|
+
MIT License - see LICENSE file for details
|
|
587
|
+
|
|
588
|
+
## Support
|
|
589
|
+
|
|
590
|
+
- GitHub Issues: https://github.com/crypto512/jicon/issues
|
|
591
|
+
- Documentation: https://github.com/crypto512/jicon
|
|
592
|
+
- Community: https://github.com/crypto512/jicon/discussions
|
|
593
|
+
|
|
594
|
+
## Acknowledgments
|
|
595
|
+
|
|
596
|
+
Built on the [Model Context Protocol](https://modelcontextprotocol.io) by Anthropic.
|