pnd-jira-mcp 1.0.0__tar.gz
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.
- pnd_jira_mcp-1.0.0/PKG-INFO +226 -0
- pnd_jira_mcp-1.0.0/README.md +200 -0
- pnd_jira_mcp-1.0.0/pnd_jira_mcp/__init__.py +28 -0
- pnd_jira_mcp-1.0.0/pnd_jira_mcp/__main__.py +12 -0
- pnd_jira_mcp-1.0.0/pnd_jira_mcp/client.py +792 -0
- pnd_jira_mcp-1.0.0/pnd_jira_mcp/server.py +392 -0
- pnd_jira_mcp-1.0.0/pnd_jira_mcp/tools.py +295 -0
- pnd_jira_mcp-1.0.0/pnd_jira_mcp.egg-info/PKG-INFO +226 -0
- pnd_jira_mcp-1.0.0/pnd_jira_mcp.egg-info/SOURCES.txt +13 -0
- pnd_jira_mcp-1.0.0/pnd_jira_mcp.egg-info/dependency_links.txt +1 -0
- pnd_jira_mcp-1.0.0/pnd_jira_mcp.egg-info/entry_points.txt +2 -0
- pnd_jira_mcp-1.0.0/pnd_jira_mcp.egg-info/requires.txt +7 -0
- pnd_jira_mcp-1.0.0/pnd_jira_mcp.egg-info/top_level.txt +1 -0
- pnd_jira_mcp-1.0.0/pyproject.toml +55 -0
- pnd_jira_mcp-1.0.0/setup.cfg +4 -0
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: pnd-jira-mcp
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Standalone Jira MCP (Model Context Protocol) connector for Claude Desktop integration
|
|
5
|
+
Author-email: Pandora Group <tech@pandora.net>
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/shvee-pandora/pnd-jira-mcp
|
|
8
|
+
Project-URL: Repository, https://github.com/shvee-pandora/pnd-jira-mcp
|
|
9
|
+
Project-URL: Documentation, https://github.com/shvee-pandora/pnd-jira-mcp#readme
|
|
10
|
+
Keywords: mcp,jira,claude,atlassian,connector
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Requires-Python: >=3.10
|
|
19
|
+
Description-Content-Type: text/markdown
|
|
20
|
+
Requires-Dist: httpx>=0.25.0
|
|
21
|
+
Requires-Dist: mcp>=1.0.0
|
|
22
|
+
Provides-Extra: dev
|
|
23
|
+
Requires-Dist: pytest>=7.4.0; extra == "dev"
|
|
24
|
+
Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
|
|
25
|
+
Requires-Dist: ruff>=0.1.0; extra == "dev"
|
|
26
|
+
|
|
27
|
+
# pnd-jira-mcp
|
|
28
|
+
|
|
29
|
+
A standalone Jira MCP (Model Context Protocol) connector for Claude Desktop integration.
|
|
30
|
+
|
|
31
|
+
## Installation
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
pip install pnd-jira-mcp
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Quick Start
|
|
38
|
+
|
|
39
|
+
1. Set environment variables:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
export JIRA_BASE_URL="https://your-instance.atlassian.net"
|
|
43
|
+
export JIRA_EMAIL="your-email@example.com"
|
|
44
|
+
export JIRA_API_TOKEN="your-api-token"
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
2. Run the MCP server:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
pnd-jira-mcp
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Or via Python:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
python -m pnd_jira_mcp
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Claude Desktop Integration
|
|
60
|
+
|
|
61
|
+
Add to your Claude Desktop configuration (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS):
|
|
62
|
+
|
|
63
|
+
```json
|
|
64
|
+
{
|
|
65
|
+
"mcpServers": {
|
|
66
|
+
"jira": {
|
|
67
|
+
"command": "pnd-jira-mcp",
|
|
68
|
+
"env": {
|
|
69
|
+
"JIRA_BASE_URL": "https://your-instance.atlassian.net",
|
|
70
|
+
"JIRA_EMAIL": "your-email@example.com",
|
|
71
|
+
"JIRA_API_TOKEN": "your-api-token"
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Available Tools
|
|
79
|
+
|
|
80
|
+
### Issue Operations
|
|
81
|
+
|
|
82
|
+
#### get_issue
|
|
83
|
+
Get details of a Jira issue by key.
|
|
84
|
+
```json
|
|
85
|
+
{"issue_key": "PROJ-123"}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
#### search_issues
|
|
89
|
+
Search for Jira issues using JQL.
|
|
90
|
+
```json
|
|
91
|
+
{"jql": "project = PROJ AND status = Open", "max_results": 50}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
#### add_comment
|
|
95
|
+
Add a comment to a Jira issue (supports markdown).
|
|
96
|
+
```json
|
|
97
|
+
{"issue_key": "PROJ-123", "body": "This is a **markdown** comment"}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
#### add_label
|
|
101
|
+
Add a label to a Jira issue.
|
|
102
|
+
```json
|
|
103
|
+
{"issue_key": "PROJ-123", "label": "reviewed"}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
#### update_fields
|
|
107
|
+
Update fields on a Jira issue.
|
|
108
|
+
```json
|
|
109
|
+
{"issue_key": "PROJ-123", "fields": {"summary": "New summary"}}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
#### update_ai_fields
|
|
113
|
+
Update AI-related custom fields.
|
|
114
|
+
```json
|
|
115
|
+
{"issue_key": "PROJ-123", "ai_used": true, "agent_name": "Claude"}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Transition Operations
|
|
119
|
+
|
|
120
|
+
#### get_transitions
|
|
121
|
+
Get available transitions for an issue.
|
|
122
|
+
```json
|
|
123
|
+
{"issue_key": "PROJ-123"}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
#### transition_issue
|
|
127
|
+
Transition an issue to a new status.
|
|
128
|
+
```json
|
|
129
|
+
{"issue_key": "PROJ-123", "transition_id": "31"}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Sprint Operations
|
|
133
|
+
|
|
134
|
+
#### get_boards
|
|
135
|
+
Get all Jira boards, optionally filtered by project or type.
|
|
136
|
+
```json
|
|
137
|
+
{"project_key": "PROJ", "board_type": "scrum"}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
#### get_sprints
|
|
141
|
+
Get sprints for a board.
|
|
142
|
+
```json
|
|
143
|
+
{"board_id": 123, "state": "active"}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
#### get_sprint
|
|
147
|
+
Get details of a specific sprint.
|
|
148
|
+
```json
|
|
149
|
+
{"sprint_id": 456}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
#### get_active_sprint
|
|
153
|
+
Get the currently active sprint for a board.
|
|
154
|
+
```json
|
|
155
|
+
{"board_id": 123}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
#### get_sprint_issues
|
|
159
|
+
Get all issues in a sprint.
|
|
160
|
+
```json
|
|
161
|
+
{"sprint_id": 456, "max_results": 200}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Utility
|
|
165
|
+
|
|
166
|
+
#### test_connection
|
|
167
|
+
Test the Jira connection and verify credentials.
|
|
168
|
+
```json
|
|
169
|
+
{}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## Environment Variables
|
|
173
|
+
|
|
174
|
+
| Variable | Description | Required |
|
|
175
|
+
|----------|-------------|----------|
|
|
176
|
+
| `JIRA_BASE_URL` | Jira instance URL | Yes |
|
|
177
|
+
| `JIRA_EMAIL` | Jira account email | Yes |
|
|
178
|
+
| `JIRA_API_TOKEN` | Jira API token | Yes |
|
|
179
|
+
| `JIRA_FIELD_AI_USED` | Custom field ID for AI used flag | No |
|
|
180
|
+
| `JIRA_FIELD_AGENT_NAME` | Custom field ID for agent name | No |
|
|
181
|
+
| `JIRA_FIELD_EFFICIENCY_SCORE` | Custom field ID for efficiency score | No |
|
|
182
|
+
| `JIRA_FIELD_DURATION` | Custom field ID for duration | No |
|
|
183
|
+
|
|
184
|
+
## Getting a Jira API Token
|
|
185
|
+
|
|
186
|
+
1. Go to https://id.atlassian.com/manage-profile/security/api-tokens
|
|
187
|
+
2. Click "Create API token"
|
|
188
|
+
3. Give it a descriptive name
|
|
189
|
+
4. Copy the token and store it securely
|
|
190
|
+
|
|
191
|
+
## Example Usage in Claude
|
|
192
|
+
|
|
193
|
+
Once configured, you can ask Claude to interact with Jira:
|
|
194
|
+
|
|
195
|
+
- "Add a comment to PROJ-123 saying the code review is complete"
|
|
196
|
+
- "What's the status of PROJ-456?"
|
|
197
|
+
- "Move PROJ-789 to In Progress"
|
|
198
|
+
- "Find all open bugs in the PROJ project"
|
|
199
|
+
- "Show me the active sprint for board 123"
|
|
200
|
+
- "List all issues in the current sprint"
|
|
201
|
+
|
|
202
|
+
## Programmatic Usage
|
|
203
|
+
|
|
204
|
+
```python
|
|
205
|
+
from pnd_jira_mcp import JiraClient, JiraConfig
|
|
206
|
+
|
|
207
|
+
config = JiraConfig(
|
|
208
|
+
base_url="https://your-instance.atlassian.net",
|
|
209
|
+
email="your-email@example.com",
|
|
210
|
+
api_token="your-api-token"
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
with JiraClient(config=config) as client:
|
|
214
|
+
issue = client.get_issue("PROJ-123")
|
|
215
|
+
print(f"Issue: {issue.summary}")
|
|
216
|
+
|
|
217
|
+
# Get active sprint
|
|
218
|
+
boards = client.get_boards(project_key="PROJ")
|
|
219
|
+
if boards:
|
|
220
|
+
sprint = client.get_active_sprint(boards[0]["id"])
|
|
221
|
+
print(f"Active sprint: {sprint['name']}")
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
## License
|
|
225
|
+
|
|
226
|
+
MIT
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
# pnd-jira-mcp
|
|
2
|
+
|
|
3
|
+
A standalone Jira MCP (Model Context Protocol) connector for Claude Desktop integration.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pip install pnd-jira-mcp
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
1. Set environment variables:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
export JIRA_BASE_URL="https://your-instance.atlassian.net"
|
|
17
|
+
export JIRA_EMAIL="your-email@example.com"
|
|
18
|
+
export JIRA_API_TOKEN="your-api-token"
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
2. Run the MCP server:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
pnd-jira-mcp
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Or via Python:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
python -m pnd_jira_mcp
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Claude Desktop Integration
|
|
34
|
+
|
|
35
|
+
Add to your Claude Desktop configuration (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS):
|
|
36
|
+
|
|
37
|
+
```json
|
|
38
|
+
{
|
|
39
|
+
"mcpServers": {
|
|
40
|
+
"jira": {
|
|
41
|
+
"command": "pnd-jira-mcp",
|
|
42
|
+
"env": {
|
|
43
|
+
"JIRA_BASE_URL": "https://your-instance.atlassian.net",
|
|
44
|
+
"JIRA_EMAIL": "your-email@example.com",
|
|
45
|
+
"JIRA_API_TOKEN": "your-api-token"
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Available Tools
|
|
53
|
+
|
|
54
|
+
### Issue Operations
|
|
55
|
+
|
|
56
|
+
#### get_issue
|
|
57
|
+
Get details of a Jira issue by key.
|
|
58
|
+
```json
|
|
59
|
+
{"issue_key": "PROJ-123"}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
#### search_issues
|
|
63
|
+
Search for Jira issues using JQL.
|
|
64
|
+
```json
|
|
65
|
+
{"jql": "project = PROJ AND status = Open", "max_results": 50}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
#### add_comment
|
|
69
|
+
Add a comment to a Jira issue (supports markdown).
|
|
70
|
+
```json
|
|
71
|
+
{"issue_key": "PROJ-123", "body": "This is a **markdown** comment"}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
#### add_label
|
|
75
|
+
Add a label to a Jira issue.
|
|
76
|
+
```json
|
|
77
|
+
{"issue_key": "PROJ-123", "label": "reviewed"}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
#### update_fields
|
|
81
|
+
Update fields on a Jira issue.
|
|
82
|
+
```json
|
|
83
|
+
{"issue_key": "PROJ-123", "fields": {"summary": "New summary"}}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
#### update_ai_fields
|
|
87
|
+
Update AI-related custom fields.
|
|
88
|
+
```json
|
|
89
|
+
{"issue_key": "PROJ-123", "ai_used": true, "agent_name": "Claude"}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Transition Operations
|
|
93
|
+
|
|
94
|
+
#### get_transitions
|
|
95
|
+
Get available transitions for an issue.
|
|
96
|
+
```json
|
|
97
|
+
{"issue_key": "PROJ-123"}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
#### transition_issue
|
|
101
|
+
Transition an issue to a new status.
|
|
102
|
+
```json
|
|
103
|
+
{"issue_key": "PROJ-123", "transition_id": "31"}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Sprint Operations
|
|
107
|
+
|
|
108
|
+
#### get_boards
|
|
109
|
+
Get all Jira boards, optionally filtered by project or type.
|
|
110
|
+
```json
|
|
111
|
+
{"project_key": "PROJ", "board_type": "scrum"}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
#### get_sprints
|
|
115
|
+
Get sprints for a board.
|
|
116
|
+
```json
|
|
117
|
+
{"board_id": 123, "state": "active"}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
#### get_sprint
|
|
121
|
+
Get details of a specific sprint.
|
|
122
|
+
```json
|
|
123
|
+
{"sprint_id": 456}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
#### get_active_sprint
|
|
127
|
+
Get the currently active sprint for a board.
|
|
128
|
+
```json
|
|
129
|
+
{"board_id": 123}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
#### get_sprint_issues
|
|
133
|
+
Get all issues in a sprint.
|
|
134
|
+
```json
|
|
135
|
+
{"sprint_id": 456, "max_results": 200}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Utility
|
|
139
|
+
|
|
140
|
+
#### test_connection
|
|
141
|
+
Test the Jira connection and verify credentials.
|
|
142
|
+
```json
|
|
143
|
+
{}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## Environment Variables
|
|
147
|
+
|
|
148
|
+
| Variable | Description | Required |
|
|
149
|
+
|----------|-------------|----------|
|
|
150
|
+
| `JIRA_BASE_URL` | Jira instance URL | Yes |
|
|
151
|
+
| `JIRA_EMAIL` | Jira account email | Yes |
|
|
152
|
+
| `JIRA_API_TOKEN` | Jira API token | Yes |
|
|
153
|
+
| `JIRA_FIELD_AI_USED` | Custom field ID for AI used flag | No |
|
|
154
|
+
| `JIRA_FIELD_AGENT_NAME` | Custom field ID for agent name | No |
|
|
155
|
+
| `JIRA_FIELD_EFFICIENCY_SCORE` | Custom field ID for efficiency score | No |
|
|
156
|
+
| `JIRA_FIELD_DURATION` | Custom field ID for duration | No |
|
|
157
|
+
|
|
158
|
+
## Getting a Jira API Token
|
|
159
|
+
|
|
160
|
+
1. Go to https://id.atlassian.com/manage-profile/security/api-tokens
|
|
161
|
+
2. Click "Create API token"
|
|
162
|
+
3. Give it a descriptive name
|
|
163
|
+
4. Copy the token and store it securely
|
|
164
|
+
|
|
165
|
+
## Example Usage in Claude
|
|
166
|
+
|
|
167
|
+
Once configured, you can ask Claude to interact with Jira:
|
|
168
|
+
|
|
169
|
+
- "Add a comment to PROJ-123 saying the code review is complete"
|
|
170
|
+
- "What's the status of PROJ-456?"
|
|
171
|
+
- "Move PROJ-789 to In Progress"
|
|
172
|
+
- "Find all open bugs in the PROJ project"
|
|
173
|
+
- "Show me the active sprint for board 123"
|
|
174
|
+
- "List all issues in the current sprint"
|
|
175
|
+
|
|
176
|
+
## Programmatic Usage
|
|
177
|
+
|
|
178
|
+
```python
|
|
179
|
+
from pnd_jira_mcp import JiraClient, JiraConfig
|
|
180
|
+
|
|
181
|
+
config = JiraConfig(
|
|
182
|
+
base_url="https://your-instance.atlassian.net",
|
|
183
|
+
email="your-email@example.com",
|
|
184
|
+
api_token="your-api-token"
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
with JiraClient(config=config) as client:
|
|
188
|
+
issue = client.get_issue("PROJ-123")
|
|
189
|
+
print(f"Issue: {issue.summary}")
|
|
190
|
+
|
|
191
|
+
# Get active sprint
|
|
192
|
+
boards = client.get_boards(project_key="PROJ")
|
|
193
|
+
if boards:
|
|
194
|
+
sprint = client.get_active_sprint(boards[0]["id"])
|
|
195
|
+
print(f"Active sprint: {sprint['name']}")
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## License
|
|
199
|
+
|
|
200
|
+
MIT
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"""
|
|
2
|
+
pnd-jira-mcp - Standalone Jira MCP Connector
|
|
3
|
+
|
|
4
|
+
A standalone MCP (Model Context Protocol) server for Jira integration.
|
|
5
|
+
Can be installed via pip and used independently without any other dependencies.
|
|
6
|
+
|
|
7
|
+
Usage:
|
|
8
|
+
pnd-jira-mcp
|
|
9
|
+
|
|
10
|
+
Or via Python:
|
|
11
|
+
python -m pnd_jira_mcp
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from .server import JiraMCPServer, main, main_sync
|
|
15
|
+
from .client import JiraClient, JiraConfig, JiraIssue
|
|
16
|
+
from .tools import get_jira_tools
|
|
17
|
+
|
|
18
|
+
__version__ = "1.0.0"
|
|
19
|
+
__all__ = [
|
|
20
|
+
"JiraMCPServer",
|
|
21
|
+
"JiraClient",
|
|
22
|
+
"JiraConfig",
|
|
23
|
+
"JiraIssue",
|
|
24
|
+
"get_jira_tools",
|
|
25
|
+
"main",
|
|
26
|
+
"main_sync",
|
|
27
|
+
"__version__",
|
|
28
|
+
]
|