|
""" |
|
Service for managing GitHub issues in the MCP server. |
|
""" |
|
from pmcp.mcp_server.github_server.utils.github_api import GithubClient |
|
|
|
|
|
|
|
class IssueService: |
|
"""Business-logic layer for issue operations.""" |
|
|
|
def __init__(self, client: GithubClient): |
|
self.client = client |
|
|
|
|
|
|
|
async def get_issues(self, owner: str, repo: str) -> any: |
|
""" |
|
Return every open-issue JSON object for ``owner/repo``. |
|
|
|
Args: |
|
owner (str): Repository owner/organisation. |
|
repo (str): Repository name. |
|
|
|
Returns: |
|
any: List of issue dicts exactly as returned by the GitHub REST API. |
|
""" |
|
return await self.client.GET(f"{owner}/{repo}/issues") |
|
|
|
|
|
|
|
async def create_issue( |
|
self, owner: str, repo: str, title: str, body: str | None = None |
|
): |
|
""" |
|
Create a new issue. |
|
|
|
Args: |
|
owner (str): Repository owner. |
|
repo (str): Repository name. |
|
title (str): Issue title. |
|
body (str): Optional Markdown body. |
|
|
|
Returns: |
|
JSON payload describing the created issue. |
|
""" |
|
payload = {"title": title, "body": body or ""} |
|
return await self.client.POST(f"{owner}/{repo}/issues", json=payload) |
|
|
|
async def comment_issue( |
|
self, owner: str, repo: str, issue_number: int, body: str |
|
): |
|
""" |
|
Add a comment to an existing issue. |
|
|
|
Args: |
|
owner (str): Repository owner. |
|
repo (str): Repository name. |
|
issue_number (int): Target issue number. |
|
body (str): Comment body (Markdown). |
|
|
|
Returns: |
|
JSON with the new comment metadata. |
|
""" |
|
payload = {"body": body} |
|
return await self.client.POST( |
|
f"{owner}/{repo}/issues/{issue_number}/comments", json=payload |
|
) |
|
|
|
async def close_issue(self, owner: str, repo: str, issue_number: int): |
|
""" |
|
Close an issue by setting its state to ``closed``. |
|
|
|
Args: |
|
owner (str): Repository owner. |
|
repo (str): Repository name. |
|
issue_number (int): Issue to close. |
|
|
|
Returns: |
|
JSON for the updated issue. |
|
""" |
|
payload = {"state": "closed"} |
|
return await self.client.PATCH( |
|
f"{owner}/{repo}/issues/{issue_number}", json=payload |
|
) |
|
|
|
|
|
|