quickcall-integrations 0.3.7__tar.gz → 0.3.9__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.
- quickcall_integrations-0.3.9/.github/ISSUE_TEMPLATE/bug_report.yml +24 -0
- quickcall_integrations-0.3.9/.github/ISSUE_TEMPLATE/feature_request.yml +16 -0
- quickcall_integrations-0.3.9/.github/ISSUE_TEMPLATE/task.yml +19 -0
- quickcall_integrations-0.3.9/.quickcall-issue-template.yaml +23 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/PKG-INFO +105 -6
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/README.md +104 -5
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/mcp_server/api_clients/github_client.py +73 -1
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/mcp_server/tools/auth_tools.py +30 -13
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/mcp_server/tools/github_tools.py +45 -3
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/plugins/quickcall/.claude-plugin/plugin.json +1 -1
- quickcall_integrations-0.3.9/plugins/quickcall/commands/connect-github-pat.md +37 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/pyproject.toml +1 -1
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/uv.lock +1 -1
- quickcall_integrations-0.3.7/.quickcall-issue-template.yaml +0 -38
- quickcall_integrations-0.3.7/plugins/quickcall/commands/connect-github-pat.md +0 -43
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/.claude-plugin/marketplace.json +0 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/.github/workflows/publish-pypi.yml +0 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/.gitignore +0 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/.pre-commit-config.yaml +0 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/Dockerfile +0 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/assets/logo.png +0 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/mcp_server/__init__.py +0 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/mcp_server/api_clients/__init__.py +0 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/mcp_server/api_clients/slack_client.py +0 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/mcp_server/auth/__init__.py +0 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/mcp_server/auth/credentials.py +0 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/mcp_server/auth/device_flow.py +0 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/mcp_server/resources/__init__.py +0 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/mcp_server/resources/github_resources.py +0 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/mcp_server/resources/slack_resources.py +0 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/mcp_server/server.py +0 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/mcp_server/tools/__init__.py +0 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/mcp_server/tools/git_tools.py +0 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/mcp_server/tools/slack_tools.py +0 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/mcp_server/tools/utility_tools.py +0 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/plugins/quickcall/commands/appraisal.md +0 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/plugins/quickcall/commands/connect.md +0 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/plugins/quickcall/commands/slack-summary.md +0 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/plugins/quickcall/commands/status.md +0 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/plugins/quickcall/commands/updates.md +0 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/requirements.txt +0 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/tests/README.md +0 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/tests/appraisal/__init__.py +0 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/tests/appraisal/setup_test_data.py +0 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/tests/test_appraisal_integration.py +0 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/tests/test_appraisal_tools.py +0 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/tests/test_integrations.py +0 -0
- {quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/tests/test_tools.py +0 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
name: Bug Report
|
|
2
|
+
description: Report a bug
|
|
3
|
+
labels: [bug]
|
|
4
|
+
body:
|
|
5
|
+
- type: textarea
|
|
6
|
+
id: description
|
|
7
|
+
attributes:
|
|
8
|
+
label: Description
|
|
9
|
+
description: What happened?
|
|
10
|
+
validations:
|
|
11
|
+
required: true
|
|
12
|
+
- type: textarea
|
|
13
|
+
id: steps
|
|
14
|
+
attributes:
|
|
15
|
+
label: Steps to Reproduce
|
|
16
|
+
description: How can we reproduce this?
|
|
17
|
+
placeholder: |
|
|
18
|
+
1. Run '...'
|
|
19
|
+
2. See error
|
|
20
|
+
- type: textarea
|
|
21
|
+
id: expected
|
|
22
|
+
attributes:
|
|
23
|
+
label: Expected Behavior
|
|
24
|
+
description: What should have happened?
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
name: Feature Request
|
|
2
|
+
description: Suggest a new feature
|
|
3
|
+
labels: [enhancement]
|
|
4
|
+
body:
|
|
5
|
+
- type: textarea
|
|
6
|
+
id: problem
|
|
7
|
+
attributes:
|
|
8
|
+
label: Problem
|
|
9
|
+
description: What problem does this solve?
|
|
10
|
+
validations:
|
|
11
|
+
required: true
|
|
12
|
+
- type: textarea
|
|
13
|
+
id: solution
|
|
14
|
+
attributes:
|
|
15
|
+
label: Proposed Solution
|
|
16
|
+
description: How should it work?
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
name: Task
|
|
2
|
+
description: A general task or todo item
|
|
3
|
+
labels: [task]
|
|
4
|
+
body:
|
|
5
|
+
- type: textarea
|
|
6
|
+
id: description
|
|
7
|
+
attributes:
|
|
8
|
+
label: Description
|
|
9
|
+
description: What needs to be done?
|
|
10
|
+
validations:
|
|
11
|
+
required: true
|
|
12
|
+
- type: textarea
|
|
13
|
+
id: acceptance
|
|
14
|
+
attributes:
|
|
15
|
+
label: Acceptance Criteria
|
|
16
|
+
description: How do we know it's done?
|
|
17
|
+
placeholder: |
|
|
18
|
+
- [ ] Criteria 1
|
|
19
|
+
- [ ] Criteria 2
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
defaults:
|
|
2
|
+
labels: ["triage"]
|
|
3
|
+
body: |
|
|
4
|
+
## Description
|
|
5
|
+
|
|
6
|
+
## Details
|
|
7
|
+
|
|
8
|
+
templates:
|
|
9
|
+
docs:
|
|
10
|
+
labels: ["documentation"]
|
|
11
|
+
title_prefix: "[Docs QC] "
|
|
12
|
+
body: |
|
|
13
|
+
## Documentation Update
|
|
14
|
+
|
|
15
|
+
## What needs to be documented?
|
|
16
|
+
|
|
17
|
+
chore:
|
|
18
|
+
labels: ["chore"]
|
|
19
|
+
title_prefix: "[Chore QC] "
|
|
20
|
+
body: |
|
|
21
|
+
## Task
|
|
22
|
+
|
|
23
|
+
## Why is this needed?
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: quickcall-integrations
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.9
|
|
4
4
|
Summary: MCP server with developer integrations for Claude Code and Cursor
|
|
5
5
|
Requires-Python: >=3.10
|
|
6
6
|
Requires-Dist: fastmcp>=2.13.0
|
|
@@ -90,7 +90,7 @@ Add to MCP config (`~/.cursor/mcp.json` or `.cursor/mcp.json`):
|
|
|
90
90
|
| **Slack** | Read/send messages, threads, channels | Yes |
|
|
91
91
|
|
|
92
92
|
<details>
|
|
93
|
-
<summary><strong>Available Tools (
|
|
93
|
+
<summary><strong>Available Tools (24)</strong></summary>
|
|
94
94
|
|
|
95
95
|
### Git
|
|
96
96
|
| Tool | Description |
|
|
@@ -102,10 +102,11 @@ Add to MCP config (`~/.cursor/mcp.json` or `.cursor/mcp.json`):
|
|
|
102
102
|
|------|-------------|
|
|
103
103
|
| `list_repos` | List accessible repositories |
|
|
104
104
|
| `list_prs` | List pull requests (open/closed/all) |
|
|
105
|
-
| `
|
|
105
|
+
| `get_prs` | Get PR details (title, description, files changed) |
|
|
106
106
|
| `list_commits` | List commits with optional filters |
|
|
107
107
|
| `get_commit` | Get commit details (message, stats, files) |
|
|
108
108
|
| `list_branches` | List repository branches |
|
|
109
|
+
| `manage_issues` | List, view, create, update, close, reopen, comment on issues + sub-issues |
|
|
109
110
|
| `check_github_connection` | Verify GitHub connection |
|
|
110
111
|
|
|
111
112
|
### Slack
|
|
@@ -172,9 +173,13 @@ GITHUB_USERNAME=your-username # Optional: for better UX
|
|
|
172
173
|
|
|
173
174
|
**Create a PAT at:** https://github.com/settings/tokens
|
|
174
175
|
|
|
175
|
-
**Required scopes:**
|
|
176
|
-
|
|
177
|
-
|
|
176
|
+
**Required scopes (classic PAT):**
|
|
177
|
+
|
|
178
|
+
| Scope | Used For |
|
|
179
|
+
|-------|----------|
|
|
180
|
+
| `project` | GitHub Projects access |
|
|
181
|
+
| `read:user` | Read user profile data |
|
|
182
|
+
| `repo` | PRs, commits, branches, issues |
|
|
178
183
|
|
|
179
184
|
**Note:** PAT mode provides access to GitHub tools only. For Slack integration, use QuickCall authentication.
|
|
180
185
|
|
|
@@ -228,6 +233,100 @@ List open PRs on [repo] and send titles to #updates channel
|
|
|
228
233
|
What did I work on this week? Send summary to #standup
|
|
229
234
|
```
|
|
230
235
|
|
|
236
|
+
## Issue Management
|
|
237
|
+
|
|
238
|
+
The `manage_issues` tool provides full issue lifecycle management:
|
|
239
|
+
|
|
240
|
+
### Actions
|
|
241
|
+
|
|
242
|
+
| Action | Description |
|
|
243
|
+
|--------|-------------|
|
|
244
|
+
| `list` | List issues with filters |
|
|
245
|
+
| `view` | View issue details |
|
|
246
|
+
| `create` | Create new issue (with optional template) |
|
|
247
|
+
| `update` | Update issue title/body/labels |
|
|
248
|
+
| `close` | Close issue(s) |
|
|
249
|
+
| `reopen` | Reopen issue(s) |
|
|
250
|
+
| `comment` | Add comment to issue(s) |
|
|
251
|
+
| `add_sub_issue` | Add child issue to parent |
|
|
252
|
+
| `remove_sub_issue` | Remove child from parent |
|
|
253
|
+
| `list_sub_issues` | List sub-issues of a parent |
|
|
254
|
+
|
|
255
|
+
### List Filters
|
|
256
|
+
|
|
257
|
+
| Filter | Description |
|
|
258
|
+
|--------|-------------|
|
|
259
|
+
| `state` | `'open'`, `'closed'`, or `'all'` (default: `'open'`) |
|
|
260
|
+
| `labels` | Filter by one or more labels |
|
|
261
|
+
| `assignees` | Filter by assignee |
|
|
262
|
+
| `creator` | Filter by issue creator username |
|
|
263
|
+
| `milestone` | Filter by milestone: number, title, `'*'` (any), or `'none'` |
|
|
264
|
+
| `sort` | Sort by: `'created'`, `'updated'`, or `'comments'` (default: `'updated'`) |
|
|
265
|
+
| `limit` | Max issues to return (default: 30) |
|
|
266
|
+
|
|
267
|
+
**Examples:**
|
|
268
|
+
```
|
|
269
|
+
List open issues in milestone v1.0
|
|
270
|
+
List issues created by sagar
|
|
271
|
+
Show closed bugs sorted by comments
|
|
272
|
+
List issues without a milestone
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### Issue Templates
|
|
276
|
+
|
|
277
|
+
QuickCall supports issue templates from two sources:
|
|
278
|
+
|
|
279
|
+
**1. GitHub Native Templates** (`.github/ISSUE_TEMPLATE/*.yml`)
|
|
280
|
+
|
|
281
|
+
Standard GitHub issue templates are automatically detected:
|
|
282
|
+
```yaml
|
|
283
|
+
# .github/ISSUE_TEMPLATE/bug_report.yml
|
|
284
|
+
name: Bug Report
|
|
285
|
+
description: Report a bug
|
|
286
|
+
labels: [bug]
|
|
287
|
+
body:
|
|
288
|
+
- type: textarea
|
|
289
|
+
attributes:
|
|
290
|
+
label: Description
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
**2. Custom Templates** (`.quickcall.env`)
|
|
294
|
+
|
|
295
|
+
Define custom templates in your project config:
|
|
296
|
+
```bash
|
|
297
|
+
# .quickcall.env
|
|
298
|
+
ISSUE_TEMPLATE_PATH=/path/to/templates.yml
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
```yaml
|
|
302
|
+
# templates.yml
|
|
303
|
+
bug_report:
|
|
304
|
+
name: Bug Report
|
|
305
|
+
description: Report a bug
|
|
306
|
+
labels: [bug]
|
|
307
|
+
title_prefix: "[BUG] "
|
|
308
|
+
body: |
|
|
309
|
+
## Description
|
|
310
|
+
|
|
311
|
+
## Steps to Reproduce
|
|
312
|
+
|
|
313
|
+
## Expected Behavior
|
|
314
|
+
|
|
315
|
+
feature_request:
|
|
316
|
+
name: Feature Request
|
|
317
|
+
labels: [enhancement]
|
|
318
|
+
body: |
|
|
319
|
+
## Problem
|
|
320
|
+
|
|
321
|
+
## Proposed Solution
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
**Usage:**
|
|
325
|
+
```
|
|
326
|
+
Create a bug report issue titled "Login fails on Safari"
|
|
327
|
+
Create issue with feature_request template
|
|
328
|
+
```
|
|
329
|
+
|
|
231
330
|
## Troubleshooting
|
|
232
331
|
|
|
233
332
|
### Clean Reinstall
|
|
@@ -77,7 +77,7 @@ Add to MCP config (`~/.cursor/mcp.json` or `.cursor/mcp.json`):
|
|
|
77
77
|
| **Slack** | Read/send messages, threads, channels | Yes |
|
|
78
78
|
|
|
79
79
|
<details>
|
|
80
|
-
<summary><strong>Available Tools (
|
|
80
|
+
<summary><strong>Available Tools (24)</strong></summary>
|
|
81
81
|
|
|
82
82
|
### Git
|
|
83
83
|
| Tool | Description |
|
|
@@ -89,10 +89,11 @@ Add to MCP config (`~/.cursor/mcp.json` or `.cursor/mcp.json`):
|
|
|
89
89
|
|------|-------------|
|
|
90
90
|
| `list_repos` | List accessible repositories |
|
|
91
91
|
| `list_prs` | List pull requests (open/closed/all) |
|
|
92
|
-
| `
|
|
92
|
+
| `get_prs` | Get PR details (title, description, files changed) |
|
|
93
93
|
| `list_commits` | List commits with optional filters |
|
|
94
94
|
| `get_commit` | Get commit details (message, stats, files) |
|
|
95
95
|
| `list_branches` | List repository branches |
|
|
96
|
+
| `manage_issues` | List, view, create, update, close, reopen, comment on issues + sub-issues |
|
|
96
97
|
| `check_github_connection` | Verify GitHub connection |
|
|
97
98
|
|
|
98
99
|
### Slack
|
|
@@ -159,9 +160,13 @@ GITHUB_USERNAME=your-username # Optional: for better UX
|
|
|
159
160
|
|
|
160
161
|
**Create a PAT at:** https://github.com/settings/tokens
|
|
161
162
|
|
|
162
|
-
**Required scopes:**
|
|
163
|
-
|
|
164
|
-
|
|
163
|
+
**Required scopes (classic PAT):**
|
|
164
|
+
|
|
165
|
+
| Scope | Used For |
|
|
166
|
+
|-------|----------|
|
|
167
|
+
| `project` | GitHub Projects access |
|
|
168
|
+
| `read:user` | Read user profile data |
|
|
169
|
+
| `repo` | PRs, commits, branches, issues |
|
|
165
170
|
|
|
166
171
|
**Note:** PAT mode provides access to GitHub tools only. For Slack integration, use QuickCall authentication.
|
|
167
172
|
|
|
@@ -215,6 +220,100 @@ List open PRs on [repo] and send titles to #updates channel
|
|
|
215
220
|
What did I work on this week? Send summary to #standup
|
|
216
221
|
```
|
|
217
222
|
|
|
223
|
+
## Issue Management
|
|
224
|
+
|
|
225
|
+
The `manage_issues` tool provides full issue lifecycle management:
|
|
226
|
+
|
|
227
|
+
### Actions
|
|
228
|
+
|
|
229
|
+
| Action | Description |
|
|
230
|
+
|--------|-------------|
|
|
231
|
+
| `list` | List issues with filters |
|
|
232
|
+
| `view` | View issue details |
|
|
233
|
+
| `create` | Create new issue (with optional template) |
|
|
234
|
+
| `update` | Update issue title/body/labels |
|
|
235
|
+
| `close` | Close issue(s) |
|
|
236
|
+
| `reopen` | Reopen issue(s) |
|
|
237
|
+
| `comment` | Add comment to issue(s) |
|
|
238
|
+
| `add_sub_issue` | Add child issue to parent |
|
|
239
|
+
| `remove_sub_issue` | Remove child from parent |
|
|
240
|
+
| `list_sub_issues` | List sub-issues of a parent |
|
|
241
|
+
|
|
242
|
+
### List Filters
|
|
243
|
+
|
|
244
|
+
| Filter | Description |
|
|
245
|
+
|--------|-------------|
|
|
246
|
+
| `state` | `'open'`, `'closed'`, or `'all'` (default: `'open'`) |
|
|
247
|
+
| `labels` | Filter by one or more labels |
|
|
248
|
+
| `assignees` | Filter by assignee |
|
|
249
|
+
| `creator` | Filter by issue creator username |
|
|
250
|
+
| `milestone` | Filter by milestone: number, title, `'*'` (any), or `'none'` |
|
|
251
|
+
| `sort` | Sort by: `'created'`, `'updated'`, or `'comments'` (default: `'updated'`) |
|
|
252
|
+
| `limit` | Max issues to return (default: 30) |
|
|
253
|
+
|
|
254
|
+
**Examples:**
|
|
255
|
+
```
|
|
256
|
+
List open issues in milestone v1.0
|
|
257
|
+
List issues created by sagar
|
|
258
|
+
Show closed bugs sorted by comments
|
|
259
|
+
List issues without a milestone
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### Issue Templates
|
|
263
|
+
|
|
264
|
+
QuickCall supports issue templates from two sources:
|
|
265
|
+
|
|
266
|
+
**1. GitHub Native Templates** (`.github/ISSUE_TEMPLATE/*.yml`)
|
|
267
|
+
|
|
268
|
+
Standard GitHub issue templates are automatically detected:
|
|
269
|
+
```yaml
|
|
270
|
+
# .github/ISSUE_TEMPLATE/bug_report.yml
|
|
271
|
+
name: Bug Report
|
|
272
|
+
description: Report a bug
|
|
273
|
+
labels: [bug]
|
|
274
|
+
body:
|
|
275
|
+
- type: textarea
|
|
276
|
+
attributes:
|
|
277
|
+
label: Description
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
**2. Custom Templates** (`.quickcall.env`)
|
|
281
|
+
|
|
282
|
+
Define custom templates in your project config:
|
|
283
|
+
```bash
|
|
284
|
+
# .quickcall.env
|
|
285
|
+
ISSUE_TEMPLATE_PATH=/path/to/templates.yml
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
```yaml
|
|
289
|
+
# templates.yml
|
|
290
|
+
bug_report:
|
|
291
|
+
name: Bug Report
|
|
292
|
+
description: Report a bug
|
|
293
|
+
labels: [bug]
|
|
294
|
+
title_prefix: "[BUG] "
|
|
295
|
+
body: |
|
|
296
|
+
## Description
|
|
297
|
+
|
|
298
|
+
## Steps to Reproduce
|
|
299
|
+
|
|
300
|
+
## Expected Behavior
|
|
301
|
+
|
|
302
|
+
feature_request:
|
|
303
|
+
name: Feature Request
|
|
304
|
+
labels: [enhancement]
|
|
305
|
+
body: |
|
|
306
|
+
## Problem
|
|
307
|
+
|
|
308
|
+
## Proposed Solution
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
**Usage:**
|
|
312
|
+
```
|
|
313
|
+
Create a bug report issue titled "Login fails on Safari"
|
|
314
|
+
Create issue with feature_request template
|
|
315
|
+
```
|
|
316
|
+
|
|
218
317
|
## Troubleshooting
|
|
219
318
|
|
|
220
319
|
### Clean Reinstall
|
|
@@ -582,8 +582,16 @@ class GitHubClient:
|
|
|
582
582
|
# Issue Operations
|
|
583
583
|
# ========================================================================
|
|
584
584
|
|
|
585
|
-
def _issue_to_dict(self, issue) -> Dict[str, Any]:
|
|
585
|
+
def _issue_to_dict(self, issue, summary: bool = False) -> Dict[str, Any]:
|
|
586
586
|
"""Convert PyGithub Issue to dict."""
|
|
587
|
+
if summary:
|
|
588
|
+
return {
|
|
589
|
+
"number": issue.number,
|
|
590
|
+
"title": issue.title,
|
|
591
|
+
"state": issue.state,
|
|
592
|
+
"labels": [label.name for label in issue.labels],
|
|
593
|
+
"html_url": issue.html_url,
|
|
594
|
+
}
|
|
587
595
|
return {
|
|
588
596
|
"number": issue.number,
|
|
589
597
|
"title": issue.title,
|
|
@@ -595,6 +603,70 @@ class GitHubClient:
|
|
|
595
603
|
"created_at": issue.created_at.isoformat(),
|
|
596
604
|
}
|
|
597
605
|
|
|
606
|
+
def list_issues(
|
|
607
|
+
self,
|
|
608
|
+
owner: Optional[str] = None,
|
|
609
|
+
repo: Optional[str] = None,
|
|
610
|
+
state: str = "open",
|
|
611
|
+
labels: Optional[List[str]] = None,
|
|
612
|
+
assignee: Optional[str] = None,
|
|
613
|
+
creator: Optional[str] = None,
|
|
614
|
+
milestone: Optional[str] = None,
|
|
615
|
+
sort: str = "updated",
|
|
616
|
+
limit: int = 30,
|
|
617
|
+
) -> List[Dict[str, Any]]:
|
|
618
|
+
"""
|
|
619
|
+
List issues in a repository.
|
|
620
|
+
|
|
621
|
+
Args:
|
|
622
|
+
owner: Repository owner
|
|
623
|
+
repo: Repository name
|
|
624
|
+
state: Issue state: 'open', 'closed', or 'all'
|
|
625
|
+
labels: Filter by labels
|
|
626
|
+
assignee: Filter by assignee username
|
|
627
|
+
creator: Filter by issue creator username
|
|
628
|
+
milestone: Filter by milestone (number, title, or '*' for any, 'none' for no milestone)
|
|
629
|
+
sort: Sort by 'created', 'updated', or 'comments'
|
|
630
|
+
limit: Maximum issues to return
|
|
631
|
+
|
|
632
|
+
Returns:
|
|
633
|
+
List of issue summaries
|
|
634
|
+
"""
|
|
635
|
+
gh_repo = self._get_repo(owner, repo)
|
|
636
|
+
|
|
637
|
+
kwargs = {"state": state, "sort": sort, "direction": "desc"}
|
|
638
|
+
if labels:
|
|
639
|
+
kwargs["labels"] = labels
|
|
640
|
+
if assignee:
|
|
641
|
+
kwargs["assignee"] = assignee
|
|
642
|
+
if creator:
|
|
643
|
+
kwargs["creator"] = creator
|
|
644
|
+
if milestone:
|
|
645
|
+
# Handle milestone - can be number, '*', 'none', or title
|
|
646
|
+
if milestone == "*" or milestone == "none":
|
|
647
|
+
kwargs["milestone"] = milestone
|
|
648
|
+
elif milestone.isdigit():
|
|
649
|
+
kwargs["milestone"] = gh_repo.get_milestone(int(milestone))
|
|
650
|
+
else:
|
|
651
|
+
# Search by title
|
|
652
|
+
for ms in gh_repo.get_milestones(state="all"):
|
|
653
|
+
if ms.title.lower() == milestone.lower():
|
|
654
|
+
kwargs["milestone"] = ms
|
|
655
|
+
break
|
|
656
|
+
|
|
657
|
+
issues = []
|
|
658
|
+
count = 0
|
|
659
|
+
for issue in gh_repo.get_issues(**kwargs):
|
|
660
|
+
# Skip pull requests (GitHub API returns PRs in issues endpoint)
|
|
661
|
+
if issue.pull_request is not None:
|
|
662
|
+
continue
|
|
663
|
+
issues.append(self._issue_to_dict(issue, summary=True))
|
|
664
|
+
count += 1
|
|
665
|
+
if count >= limit:
|
|
666
|
+
break
|
|
667
|
+
|
|
668
|
+
return issues
|
|
669
|
+
|
|
598
670
|
def create_issue(
|
|
599
671
|
self,
|
|
600
672
|
title: str,
|
{quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/mcp_server/tools/auth_tools.py
RENAMED
|
@@ -10,7 +10,7 @@ Also provides GitHub PAT authentication for users who can't install the GitHub A
|
|
|
10
10
|
import os
|
|
11
11
|
import logging
|
|
12
12
|
import webbrowser
|
|
13
|
-
from typing import Dict, Any
|
|
13
|
+
from typing import Dict, Any, Optional
|
|
14
14
|
|
|
15
15
|
import httpx
|
|
16
16
|
from github import Github, Auth, GithubException
|
|
@@ -20,6 +20,7 @@ from pydantic import Field
|
|
|
20
20
|
from mcp_server.auth import (
|
|
21
21
|
get_credential_store,
|
|
22
22
|
DeviceFlowAuth,
|
|
23
|
+
get_github_pat,
|
|
23
24
|
)
|
|
24
25
|
|
|
25
26
|
logger = logging.getLogger(__name__)
|
|
@@ -532,9 +533,10 @@ def create_auth_tools(mcp: FastMCP):
|
|
|
532
533
|
|
|
533
534
|
@mcp.tool(tags={"auth", "github"})
|
|
534
535
|
def connect_github_via_pat(
|
|
535
|
-
token: str = Field(
|
|
536
|
-
|
|
537
|
-
description="GitHub Personal Access Token (ghp_xxx or github_pat_xxx)"
|
|
536
|
+
token: Optional[str] = Field(
|
|
537
|
+
default=None,
|
|
538
|
+
description="GitHub Personal Access Token (ghp_xxx or github_pat_xxx). "
|
|
539
|
+
"If not provided, auto-detects from .quickcall.env or GITHUB_TOKEN env var.",
|
|
538
540
|
),
|
|
539
541
|
) -> Dict[str, Any]:
|
|
540
542
|
"""
|
|
@@ -543,17 +545,13 @@ def create_auth_tools(mcp: FastMCP):
|
|
|
543
545
|
Use this if your organization can't install the QuickCall GitHub App.
|
|
544
546
|
This is an alternative to the standard connect_github flow.
|
|
545
547
|
|
|
546
|
-
|
|
547
|
-
1.
|
|
548
|
-
2.
|
|
549
|
-
3.
|
|
550
|
-
|
|
551
|
-
After connecting, you can use GitHub tools like list_repos, list_prs, etc.
|
|
548
|
+
Token auto-detection locations (in order):
|
|
549
|
+
1. GITHUB_TOKEN or GITHUB_PAT environment variable
|
|
550
|
+
2. .quickcall.env in your project root (where .git is)
|
|
551
|
+
3. ~/.quickcall.env in your home directory
|
|
552
552
|
|
|
553
553
|
Create a PAT at: https://github.com/settings/tokens
|
|
554
|
-
Required scopes:
|
|
555
|
-
- repo (full access to private repos)
|
|
556
|
-
- OR public_repo (public repos only)
|
|
554
|
+
Required scopes (classic PAT): project, read:user, repo
|
|
557
555
|
|
|
558
556
|
Note: PAT mode works independently of QuickCall. You don't need
|
|
559
557
|
to run connect_quickcall first. However, Slack tools still require
|
|
@@ -571,11 +569,29 @@ def create_auth_tools(mcp: FastMCP):
|
|
|
571
569
|
"hint": "Use disconnect_github_pat to remove it, then connect again with a new token.",
|
|
572
570
|
}
|
|
573
571
|
|
|
572
|
+
# Auto-detect token if not provided
|
|
573
|
+
token_source = "provided directly"
|
|
574
|
+
if not token:
|
|
575
|
+
token, token_source = get_github_pat()
|
|
576
|
+
if not token:
|
|
577
|
+
return {
|
|
578
|
+
"status": "error",
|
|
579
|
+
"message": "No token provided and none found automatically.",
|
|
580
|
+
"searched_locations": [
|
|
581
|
+
"GITHUB_TOKEN / GITHUB_PAT environment variables",
|
|
582
|
+
".quickcall.env in project root (where .git is located)",
|
|
583
|
+
"~/.quickcall.env in home directory",
|
|
584
|
+
],
|
|
585
|
+
"hint": "Either provide the token directly, set GITHUB_TOKEN env var, "
|
|
586
|
+
"or create .quickcall.env with GITHUB_TOKEN=ghp_xxx",
|
|
587
|
+
}
|
|
588
|
+
|
|
574
589
|
# Validate token format
|
|
575
590
|
if not token.startswith(("ghp_", "github_pat_")):
|
|
576
591
|
return {
|
|
577
592
|
"status": "error",
|
|
578
593
|
"message": "Invalid token format. GitHub PATs start with 'ghp_' or 'github_pat_'",
|
|
594
|
+
"token_source": token_source,
|
|
579
595
|
"hint": "Create a new token at https://github.com/settings/tokens",
|
|
580
596
|
}
|
|
581
597
|
|
|
@@ -619,6 +635,7 @@ def create_auth_tools(mcp: FastMCP):
|
|
|
619
635
|
"message": f"Successfully connected GitHub as {username}!",
|
|
620
636
|
"username": username,
|
|
621
637
|
"mode": "pat",
|
|
638
|
+
"token_source": token_source,
|
|
622
639
|
"hint": "You can now use GitHub tools. Run check_github_connection to verify.",
|
|
623
640
|
}
|
|
624
641
|
|
{quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/mcp_server/tools/github_tools.py
RENAMED
|
@@ -270,7 +270,7 @@ def _get_client() -> GitHubClient:
|
|
|
270
270
|
"2. Run connect_quickcall to use QuickCall (GitHub App + Slack)\n"
|
|
271
271
|
"3. Set GITHUB_TOKEN environment variable\n\n"
|
|
272
272
|
"For PAT: Create token at https://github.com/settings/tokens\n"
|
|
273
|
-
"Required scopes
|
|
273
|
+
"Required scopes (classic PAT): project, read:user, repo"
|
|
274
274
|
)
|
|
275
275
|
|
|
276
276
|
|
|
@@ -570,7 +570,7 @@ def create_github_tools(mcp: FastMCP) -> None:
|
|
|
570
570
|
def manage_issues(
|
|
571
571
|
action: str = Field(
|
|
572
572
|
...,
|
|
573
|
-
description="Action: 'view', 'create', 'update', 'close', 'reopen', 'comment', "
|
|
573
|
+
description="Action: 'list', 'view', 'create', 'update', 'close', 'reopen', 'comment', "
|
|
574
574
|
"'add_sub_issue', 'remove_sub_issue', 'list_sub_issues'",
|
|
575
575
|
),
|
|
576
576
|
issue_numbers: Optional[List[int]] = Field(
|
|
@@ -610,13 +610,35 @@ def create_github_tools(mcp: FastMCP) -> None:
|
|
|
610
610
|
default=None,
|
|
611
611
|
description="Repository name. Required.",
|
|
612
612
|
),
|
|
613
|
+
state: Optional[str] = Field(
|
|
614
|
+
default="open",
|
|
615
|
+
description="Issue state filter for 'list': 'open', 'closed', or 'all' (default: 'open')",
|
|
616
|
+
),
|
|
617
|
+
creator: Optional[str] = Field(
|
|
618
|
+
default=None,
|
|
619
|
+
description="Filter by issue creator username (for 'list')",
|
|
620
|
+
),
|
|
621
|
+
milestone: Optional[str] = Field(
|
|
622
|
+
default=None,
|
|
623
|
+
description="Filter by milestone: number, title, '*' (any), or 'none' (for 'list')",
|
|
624
|
+
),
|
|
625
|
+
sort: Optional[str] = Field(
|
|
626
|
+
default="updated",
|
|
627
|
+
description="Sort by: 'created', 'updated', or 'comments' (for 'list', default: 'updated')",
|
|
628
|
+
),
|
|
629
|
+
limit: Optional[int] = Field(
|
|
630
|
+
default=30,
|
|
631
|
+
description="Maximum issues to return for 'list' action (default: 30)",
|
|
632
|
+
),
|
|
613
633
|
) -> dict:
|
|
614
634
|
"""
|
|
615
|
-
Manage GitHub issues: view, create, update, close, reopen, comment, and sub-issues.
|
|
635
|
+
Manage GitHub issues: list, view, create, update, close, reopen, comment, and sub-issues.
|
|
616
636
|
|
|
617
637
|
Supports bulk operations for view/close/reopen/comment via issue_numbers list.
|
|
618
638
|
|
|
619
639
|
Examples:
|
|
640
|
+
- list: manage_issues(action="list", state="open", milestone="v1.0")
|
|
641
|
+
- list by creator: manage_issues(action="list", creator="username")
|
|
620
642
|
- view: manage_issues(action="view", issue_numbers=[42])
|
|
621
643
|
- create: manage_issues(action="create", title="Bug", template="bug_report")
|
|
622
644
|
- create as sub-issue: manage_issues(action="create", title="Task 1", parent_issue=42)
|
|
@@ -629,6 +651,26 @@ def create_github_tools(mcp: FastMCP) -> None:
|
|
|
629
651
|
try:
|
|
630
652
|
client = _get_client()
|
|
631
653
|
|
|
654
|
+
# === LIST ACTION ===
|
|
655
|
+
if action == "list":
|
|
656
|
+
issues = client.list_issues(
|
|
657
|
+
owner=owner,
|
|
658
|
+
repo=repo,
|
|
659
|
+
state=state or "open",
|
|
660
|
+
labels=labels,
|
|
661
|
+
assignee=assignees[0] if assignees else None,
|
|
662
|
+
creator=creator,
|
|
663
|
+
milestone=milestone,
|
|
664
|
+
sort=sort or "updated",
|
|
665
|
+
limit=limit or 30,
|
|
666
|
+
)
|
|
667
|
+
return {
|
|
668
|
+
"action": "list",
|
|
669
|
+
"state": state or "open",
|
|
670
|
+
"count": len(issues),
|
|
671
|
+
"issues": issues,
|
|
672
|
+
}
|
|
673
|
+
|
|
632
674
|
# === CREATE ACTION ===
|
|
633
675
|
if action == "create":
|
|
634
676
|
if not title:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "quickcall",
|
|
3
3
|
"description": "Integrate quickcall into dev workflows - eliminate interruptions for developers. Ask about your work, get instant answers. No more context switching.",
|
|
4
|
-
"version": "0.6.
|
|
4
|
+
"version": "0.6.8",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Sagar Sarkale"
|
|
7
7
|
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Connect GitHub using a Personal Access Token (for enterprise users)
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Connect GitHub via PAT
|
|
6
|
+
|
|
7
|
+
Use this if your organization can't install the QuickCall GitHub App.
|
|
8
|
+
|
|
9
|
+
## Steps
|
|
10
|
+
|
|
11
|
+
1. **Call `connect_github_via_pat` (no arguments needed):**
|
|
12
|
+
- The tool auto-detects tokens from these locations (in order):
|
|
13
|
+
1. `GITHUB_TOKEN` or `GITHUB_PAT` environment variable
|
|
14
|
+
2. `.quickcall.env` in project root (where `.git` is located)
|
|
15
|
+
3. `~/.quickcall.env` in home directory
|
|
16
|
+
- If a token is found, it validates and connects automatically
|
|
17
|
+
- If no token is found, it returns an error with helpful instructions
|
|
18
|
+
|
|
19
|
+
2. **If no token found automatically:**
|
|
20
|
+
- Ask the user for their GitHub Personal Access Token
|
|
21
|
+
- Remind them: "Create a PAT at https://github.com/settings/tokens with scopes: project, read:user, repo"
|
|
22
|
+
- Or suggest: "Create a `.quickcall.env` file in your project root with `GITHUB_TOKEN=ghp_xxx`"
|
|
23
|
+
- Call `connect_github_via_pat` with the provided token
|
|
24
|
+
|
|
25
|
+
3. **Show result:**
|
|
26
|
+
```
|
|
27
|
+
GitHub connected via PAT!
|
|
28
|
+
Username: {username}
|
|
29
|
+
Token source: {token_source}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Notes
|
|
33
|
+
|
|
34
|
+
- PAT mode works independently of QuickCall
|
|
35
|
+
- Slack tools still require QuickCall authentication (`/quickcall:connect`)
|
|
36
|
+
- To disconnect PAT: call `disconnect_github_pat`
|
|
37
|
+
- The `.quickcall.env` file should NOT be committed to git (it contains secrets)
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
defaults:
|
|
2
|
-
labels: ["triage"]
|
|
3
|
-
body: |
|
|
4
|
-
## Description
|
|
5
|
-
|
|
6
|
-
## Details
|
|
7
|
-
|
|
8
|
-
templates:
|
|
9
|
-
bug:
|
|
10
|
-
labels: ["bug", "triage"]
|
|
11
|
-
body: |
|
|
12
|
-
## Bug Description
|
|
13
|
-
|
|
14
|
-
## Steps to Reproduce
|
|
15
|
-
1.
|
|
16
|
-
2.
|
|
17
|
-
|
|
18
|
-
## Expected Behavior
|
|
19
|
-
|
|
20
|
-
## Actual Behavior
|
|
21
|
-
|
|
22
|
-
feature:
|
|
23
|
-
labels: ["enhancement"]
|
|
24
|
-
body: |
|
|
25
|
-
## Feature Request
|
|
26
|
-
|
|
27
|
-
## Problem Statement
|
|
28
|
-
|
|
29
|
-
## Proposed Solution
|
|
30
|
-
|
|
31
|
-
## Alternatives Considered
|
|
32
|
-
|
|
33
|
-
docs:
|
|
34
|
-
labels: ["documentation"]
|
|
35
|
-
body: |
|
|
36
|
-
## Documentation Update
|
|
37
|
-
|
|
38
|
-
## What needs to be documented?
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Connect GitHub using a Personal Access Token (for enterprise users)
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Connect GitHub via PAT
|
|
6
|
-
|
|
7
|
-
Use this if your organization can't install the QuickCall GitHub App.
|
|
8
|
-
|
|
9
|
-
## Steps
|
|
10
|
-
|
|
11
|
-
1. **Check if PAT already configured:**
|
|
12
|
-
- Call `check_quickcall_status`
|
|
13
|
-
- If `github_pat.configured` is true, inform user and ask if they want to reconnect
|
|
14
|
-
|
|
15
|
-
2. **Auto-detect PAT from .quickcall.env (IMPORTANT):**
|
|
16
|
-
- Use the Read tool to check if `.quickcall.env` exists in the current project directory
|
|
17
|
-
- If found, read it and look for `GITHUB_TOKEN=...` or `GITHUB_PAT=...`
|
|
18
|
-
- If a token is found in the file, use it automatically (do NOT ask the user)
|
|
19
|
-
- Also check `~/.quickcall.env` if not found in project root
|
|
20
|
-
|
|
21
|
-
3. **Get PAT from user (only if not found in .quickcall.env):**
|
|
22
|
-
- If no token was found in config files, ask the user for their GitHub Personal Access Token
|
|
23
|
-
- Remind them: "Create a PAT at https://github.com/settings/tokens with `repo` scope"
|
|
24
|
-
- Or suggest: "You can also create a `.quickcall.env` file with `GITHUB_TOKEN=your_token`"
|
|
25
|
-
|
|
26
|
-
4. **Connect:**
|
|
27
|
-
- Call `connect_github_via_pat` with the token (from file or user input)
|
|
28
|
-
- The tool validates the token and auto-detects username
|
|
29
|
-
|
|
30
|
-
5. **Show result:**
|
|
31
|
-
```
|
|
32
|
-
GitHub connected via PAT!
|
|
33
|
-
Username: {username}
|
|
34
|
-
Mode: Personal Access Token
|
|
35
|
-
Source: .quickcall.env (or "manually provided")
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
## Notes
|
|
39
|
-
|
|
40
|
-
- PAT mode works independently of QuickCall
|
|
41
|
-
- Slack tools still require QuickCall authentication (`/quickcall:connect`)
|
|
42
|
-
- To disconnect PAT: call `disconnect_github_pat`
|
|
43
|
-
- The `.quickcall.env` file should NOT be committed to git (it contains secrets)
|
{quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/.claude-plugin/marketplace.json
RENAMED
|
File without changes
|
{quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/.github/workflows/publish-pypi.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/mcp_server/api_clients/__init__.py
RENAMED
|
File without changes
|
{quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/mcp_server/api_clients/slack_client.py
RENAMED
|
File without changes
|
|
File without changes
|
{quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/mcp_server/auth/credentials.py
RENAMED
|
File without changes
|
{quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/mcp_server/auth/device_flow.py
RENAMED
|
File without changes
|
{quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/mcp_server/resources/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/mcp_server/tools/slack_tools.py
RENAMED
|
File without changes
|
{quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/mcp_server/tools/utility_tools.py
RENAMED
|
File without changes
|
|
File without changes
|
{quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/plugins/quickcall/commands/connect.md
RENAMED
|
File without changes
|
|
File without changes
|
{quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/plugins/quickcall/commands/status.md
RENAMED
|
File without changes
|
{quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/plugins/quickcall/commands/updates.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/tests/appraisal/setup_test_data.py
RENAMED
|
File without changes
|
{quickcall_integrations-0.3.7 → quickcall_integrations-0.3.9}/tests/test_appraisal_integration.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|