Spaces:
Sleeping
Sleeping
| """GitHub MCP Agent - An agent that uses GitHub MCP tools for repository management.""" | |
| import logging | |
| from datetime import datetime | |
| from langchain.agents import create_agent | |
| from langchain_core.tools import BaseTool | |
| from langchain_mcp_adapters.client import MultiServerMCPClient | |
| from langchain_mcp_adapters.sessions import StreamableHttpConnection | |
| from langgraph.graph.state import CompiledStateGraph | |
| from agents.lazy_agent import LazyLoadingAgent | |
| from core import get_model, settings | |
| logger = logging.getLogger(__name__) | |
| current_date = datetime.now().strftime("%B %d, %Y") | |
| prompt = f""" | |
| You are GitHubBot, a specialized assistant for GitHub repository management and development workflows. | |
| You have access to GitHub MCP tools that allow you to interact with GitHub repositories, issues, pull requests, | |
| and other GitHub resources. Today's date is {current_date}. | |
| Your capabilities include: | |
| - Repository management (create, clone, browse) | |
| - Issue management (create, list, update, close) | |
| - Pull request management (create, review, merge) | |
| - Branch management (create, switch, merge) | |
| - File operations (read, write, search) | |
| - Commit operations (create, view history) | |
| Guidelines: | |
| - Always be helpful and provide clear explanations of GitHub operations | |
| - When creating or modifying content, ensure it follows best practices | |
| - Be cautious with destructive operations (deletes, force pushes, etc.) | |
| - Provide context about what you're doing and why | |
| - Use appropriate commit messages and PR descriptions | |
| - Respect repository permissions and access controls | |
| NOTE: You have access to GitHub MCP tools that provide direct GitHub API access. | |
| """ | |
| class GitHubMCPAgent(LazyLoadingAgent): | |
| """GitHub MCP Agent with async initialization.""" | |
| def __init__(self) -> None: | |
| super().__init__() | |
| self._mcp_tools: list[BaseTool] = [] | |
| self._mcp_client: MultiServerMCPClient | None = None | |
| async def load(self) -> None: | |
| """Initialize the GitHub MCP agent by loading MCP tools.""" | |
| if not settings.GITHUB_PAT: | |
| logger.info("GITHUB_PAT is not set, GitHub MCP agent will have no tools") | |
| self._mcp_tools = [] | |
| self._graph = self._create_graph() | |
| self._loaded = True | |
| return | |
| try: | |
| # Initialize MCP client directly | |
| github_pat = settings.GITHUB_PAT.get_secret_value() | |
| connections = { | |
| "github": StreamableHttpConnection( | |
| transport="streamable_http", | |
| url=settings.MCP_GITHUB_SERVER_URL, | |
| headers={ | |
| "Authorization": f"Bearer {github_pat}", | |
| }, | |
| ) | |
| } | |
| self._mcp_client = MultiServerMCPClient(connections) | |
| logger.info("MCP client initialized successfully") | |
| # Get tools from the client | |
| self._mcp_tools = await self._mcp_client.get_tools() | |
| logger.info(f"GitHub MCP agent initialized with {len(self._mcp_tools)} tools") | |
| except Exception as e: | |
| logger.error(f"Failed to initialize GitHub MCP agent: {e}") | |
| self._mcp_tools = [] | |
| self._mcp_client = None | |
| # Create and store the graph | |
| self._graph = self._create_graph() | |
| self._loaded = True | |
| def _create_graph(self) -> CompiledStateGraph: | |
| """Create the GitHub MCP agent graph.""" | |
| model = get_model(settings.DEFAULT_MODEL) | |
| return create_agent( | |
| model=model, | |
| tools=self._mcp_tools, | |
| name="github-mcp-agent", | |
| system_prompt=prompt, | |
| ) | |
| # Create the agent instance | |
| github_mcp_agent = GitHubMCPAgent() | |