import asyncio
from os import getenv
from textwrap import dedent
import nest_asyncio
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.playground import Playground
from agno.storage.agent.sqlite import SqliteAgentStorage
from agno.tools.mcp import MCPTools
from mcp import StdioServerParameters
# 允许嵌套事件循环
nest_asyncio.apply()
agent_storage_file: str = "tmp/agents.db"
async def run_server() -> None:
"""运行 GitHub 代理服务器。"""
github_token = getenv("GITHUB_TOKEN") or getenv("GITHUB_ACCESS_TOKEN")
if not github_token:
raise ValueError("需要 GITHUB_TOKEN 环境变量")
# 初始化 MCP 服务器
server_params = StdioServerParameters(
command="npx",
args=["-y", "@modelcontextprotocol/server-github"],
)
# 创建客户端会话以连接到 MCP 服务器
async with MCPTools(server_params=server_params) as mcp_tools:
agent = Agent(
name="MCP GitHub Agent",
tools=[mcp_tools],
instructions=dedent("""\
您是 GitHub 助手。帮助用户探索存储库及其活动。
- 使用标题组织您的回复
- 简洁明了,专注于相关信息\
"""),
model=OpenAIChat(id="gpt-4o"),
storage=SqliteAgentStorage(
table_name="basic_agent",
db_file=agent_storage_file,
auto_upgrade_schema=True,
),
add_history_to_messages=True,
num_history_responses=3,
add_datetime_to_instructions=True,
markdown=True,
)
playground = Playground(
agents=[agent],
name="MCP Demo",
description="一个 MCP 的演示场",
app_id="mcp-demo",
)
playground.get_app()
# 在保持 MCPTools 上下文管理器活动的同时提供应用程序
playground.serve(app="mcp_demo:app", reload=True)
if __name__ == "__main__":
asyncio.run(run_server())
# 可供探索的示例提示:
"""
问题查询:
1. "查找需要关注的问题"
2. "按标签显示问题"
3. "哪些问题正在被积极讨论?"
4. "查找相关问题"
5. "分析问题解决模式"
拉取请求查询:
1. "哪些 PR 需要审核?"
2. "显示最近已合并的 PR"
3. "查找有冲突的 PR"
4. "正在开发哪些功能?"
5. "分析 PR 审核模式"
存储库查询:
1. "显示存储库健康指标"
2. "贡献指南是什么?"
3. "查找文档缺失之处"
4. "分析代码质量趋势"
5. "显示存储库活动模式"
"""
创建虚拟环境
打开 Terminal
并创建一个 python 虚拟环境。
python3 -m venv .venv
source .venv/bin/activate
设置您的 API 密钥
export OPENAI_API_KEY=xxx
export GITHUB_TOKEN=xxx
安装库
pip install -U agno "uvicorn[standard]" openai nest-asyncio mcp
运行代理
python cookbook/apps/playground/mcp_demo.py