quickcall-integrations 0.3.7__py3-none-any.whl → 0.3.8__py3-none-any.whl
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.
- mcp_server/api_clients/github_client.py +73 -1
- mcp_server/tools/github_tools.py +44 -2
- {quickcall_integrations-0.3.7.dist-info → quickcall_integrations-0.3.8.dist-info}/METADATA +1 -1
- {quickcall_integrations-0.3.7.dist-info → quickcall_integrations-0.3.8.dist-info}/RECORD +6 -6
- {quickcall_integrations-0.3.7.dist-info → quickcall_integrations-0.3.8.dist-info}/WHEEL +0 -0
- {quickcall_integrations-0.3.7.dist-info → quickcall_integrations-0.3.8.dist-info}/entry_points.txt +0 -0
|
@@ -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,
|
mcp_server/tools/github_tools.py
CHANGED
|
@@ -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
|
mcp_server/__init__.py,sha256=6KGzjSPyVB6vQh150DwBjINM_CsZNDhOzwSQFWpXz0U,301
|
|
2
2
|
mcp_server/server.py,sha256=kv5hh0J-M7yENUBBNI1bkq1y7MB0zn5R_-R1tib6_sk,3108
|
|
3
3
|
mcp_server/api_clients/__init__.py,sha256=kOG5_sxIVpAx_tvf1nq_P0QCkqojAVidRE-wenLS-Wc,207
|
|
4
|
-
mcp_server/api_clients/github_client.py,sha256=
|
|
4
|
+
mcp_server/api_clients/github_client.py,sha256=Mlh6BzMhZ05NqkX9A2O80eJIQXWuW4FnnN1DBM0WKC8,40135
|
|
5
5
|
mcp_server/api_clients/slack_client.py,sha256=w3rcGghttfYw8Ird2beNo2LEYLc3rCTbUKMH4X7QQuQ,16447
|
|
6
6
|
mcp_server/auth/__init__.py,sha256=D-JS0Qe7FkeJjYx92u_AqPx8ZRoB3dKMowzzJXlX6cc,780
|
|
7
7
|
mcp_server/auth/credentials.py,sha256=sDS0W5c16i_UGvhG8Sh1RO93FxRn-hHVAdI9hlWuhx0,20011
|
|
@@ -12,10 +12,10 @@ mcp_server/resources/slack_resources.py,sha256=b_CPxAicwkF3PsBXIat4QoLbDUHM2g_iP
|
|
|
12
12
|
mcp_server/tools/__init__.py,sha256=vIR2ujAaTXm2DgpTsVNz3brI4G34p-Jeg44Qe0uvWc0,405
|
|
13
13
|
mcp_server/tools/auth_tools.py,sha256=kCPjPC1jrVz0XaRAwPea-ue8ybjLLTxyILplBDJ9Mv4,24477
|
|
14
14
|
mcp_server/tools/git_tools.py,sha256=jyCTQR2eSzUFXMt0Y8x66758-VY8YCY14DDUJt7GY2U,13957
|
|
15
|
-
mcp_server/tools/github_tools.py,sha256=
|
|
15
|
+
mcp_server/tools/github_tools.py,sha256=ZBJzRhg1BSFdn9VS4qi0PYLCSGBXRfHviKzjR0LxO08,40058
|
|
16
16
|
mcp_server/tools/slack_tools.py,sha256=-HVE_x3Z1KMeYGi1xhyppEwz5ZF-I-ZD0-Up8yBeoYE,11796
|
|
17
17
|
mcp_server/tools/utility_tools.py,sha256=oxAXpdqtPeB5Ug5dvk54V504r-8v1AO4_px-sO6LFOw,3910
|
|
18
|
-
quickcall_integrations-0.3.
|
|
19
|
-
quickcall_integrations-0.3.
|
|
20
|
-
quickcall_integrations-0.3.
|
|
21
|
-
quickcall_integrations-0.3.
|
|
18
|
+
quickcall_integrations-0.3.8.dist-info/METADATA,sha256=d5t3CbdPI7v4PkgeoJ4x4i8KuB_RZ_GDZv2N6GhkghA,7070
|
|
19
|
+
quickcall_integrations-0.3.8.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
20
|
+
quickcall_integrations-0.3.8.dist-info/entry_points.txt,sha256=kkcunmJUzncYvQ1rOR35V2LPm2HcFTKzdI2l3n7NwiM,66
|
|
21
|
+
quickcall_integrations-0.3.8.dist-info/RECORD,,
|
|
File without changes
|
{quickcall_integrations-0.3.7.dist-info → quickcall_integrations-0.3.8.dist-info}/entry_points.txt
RENAMED
|
File without changes
|