IT资产经理-ADK+MCP POC
生产就绪的IT资产管理系统演示 谷歌ADK 与...的整合 模型上下文协议(MCP) 使用 可流式传输的HTTP (模式2)。
建筑
User (Terminal)
↓
ADK Agent (Ollama Mistral)
↓
MCP Toolset (Streamable HTTP)
↓
MCP Server (Port 8002)
↓
FastAPI Backend (Port 8005)组件
1.FastAPI后端(swagger_api/api_server.py)
- 用于IT资产管理的REST API
- 端点:GET/POST
/assets - 端口: 8005
2.MCP服务器(mcp_servers/mcp_server.py)
- 使用以下方式将FastAPI作为MCP工具公开 可流式传输的HTTP (生产模式)
- 工具:
list_assets,add_asset - 端口: 8002
- 端点:
/mcp
3.ADK代理商(it_asset_manager_app/agent.py)
- 谷歌ADK代理Ollama Mistral LLM
- 用途
McpToolset随着StreamableHTTPConnectionParams - 连接到MCP服务器以执行工具
设置
先决条件
- Python 3.11+
- 奥利玛与米斯特拉尔模型
- 虚拟环境
安装
# 1. Activate virtual environment
source venv/bin/activate
# 2. Install dependencies
pip install -r requirements.txt
# 3. Ensure Ollama is running
ollama run mistral运行系统
打开 3个独立的终端:
终端1:FastAPI服务器
cd /Users/sudhakarchigurupati/ADKProject/mcp_project
source venv/bin/activate
python swagger_api/api_server.py✅ 正在运行:http://localhost:8005
终端2:MCP服务器
cd /Users/sudhakarchigurupati/ADKProject/mcp_project
source venv/bin/activate
python mcp_servers/mcp_server.py✅ 正在运行:http://localhost:8002/mcp
3号航站楼:ADK代理
选项A:终端聊天(ADK CLI)
cd /Users/sudhakarchigurupati/ADKProject/mcp_project
source venv/bin/activate
adk run it_asset_manager_app选项B:网络聊天(流媒体)
cd /Users/sudhakarchigurupati/ADKProject/mcp_project
source venv/bin/activate
streamlit run streamlit_app/app.py在浏览器中打开http://localhost:8501
用法
ADK代理运行后,尝试以下命令:
You: hello
You: List all assets
You: Add asset id 10, name Surface Pro, owner Mike, status active
You: Show me the inventory关键文件
mcp_project/
├── swagger_api/
│ └── api_server.py # FastAPI backend
├── mcp_servers/
│ └── mcp_server.py # MCP server (Streamable HTTP)
├── it_asset_manager_app/
│ ├── agent.py # ADK agent with MCP toolset
│ ├── __init__.py
│ └── .env # Environment variables
├── requirements.txt # Python dependencies
└── README.md # This file运作原理
- 用户输入 → ADK代理接收用户消息
- LLM决策 → Ollama Mistral决定使用哪种工具
- MCP呼叫 → ADK's
McpToolset通过流式HTTP调用MCP服务器 - 工具执行 → MCP服务器执行工具(调用FastAPI)
- 响应 → 结果通过链返回给用户
MCP工具可用
list_assets()
从库存中检索所有IT资产。
示例:“列出所有资产”
add_asset(asset_id, name, owner, status)
将新的IT资产添加到库存中。
参数:
asset_id(int):唯一标识符name(str):资产名称/型号owner(str):分配给资产的人员status(str):状态(默认:“活动”)
示例:“添加资产id 5、名称iPad Pro、所有者Sarah、状态活动”
生产模式
此实现使用 模式2:远程MCP服务器(流式HTTP) 从 ADK MCP文档,建议用于生产部署,原因如下:
- ✅ 可扩展性(无状态模式)
- ✅ 基于HTTP的通信
- ✅ 适用于云运行/容器化部署
- ✅ 更好的错误处理和监控
验证
测试FastAPI
curl http://localhost:8005/assets测试MCP服务器
代理连接时,MCP服务器应显示连接日志。
测试代理
代理应回应问候,并在被询问时执行MCP工具。
故障排除
代理未响应
- 检查Ollama是否正在运行:
ollama list - 验证MCP服务器是否在端口8002上运行
- 检查FastAPI是否在端口8005上运行
端口冲突
# Check ports
lsof -i :8005 # FastAPI
lsof -i :8002 # MCP
lsof -i :11434 # Ollama
# Kill if needed
lsof -ti:8002 | xargs kill -9导入错误
运行时确保您处于项目根目录 adk run.
技术栈
- 谷歌ADK:代理框架
- MCP(模型上下文协议):工具集成协议
- 快速API:后端API
- 奥拉玛:本地法学硕士(西北)
- 可流式传输的HTTP:生产就绪的MCP运输
- Python 3.11:运行时
______________________________________________________________________
高级:使用多个MCP服务器
ADK支持连接到 多个MCP服务器 同时,允许您构建多服务AI代理。
用例
想象一下,您为不同的域提供单独的服务:
- IT资产管理 (端口8002)
- 人力资源管理 (端口8003)
- 金融 (端口8004)
每个服务都有自己的MCP服务器,提供特定于域的工具。
实施
from google.adk.agents.llm_agent import Agent
from google.adk.models.lite_llm import LiteLlm
from google.adk.tools.mcp_tool import McpToolset, StreamableHTTPConnectionParams
# MCP Server 1: IT Asset Management
asset_mcp = McpToolset(
connection_params=StreamableHTTPConnectionParams(
url="http://localhost:8002/mcp"
)
)
# MCP Server 2: HR Management
hr_mcp = McpToolset(
connection_params=StreamableHTTPConnectionParams(
url="http://localhost:8003/mcp"
)
)
# MCP Server 3: Finance
finance_mcp = McpToolset(
connection_params=StreamableHTTPConnectionParams(
url="http://localhost:8004/mcp"
)
)
# Create agent with ALL MCP toolsets
root_agent = Agent(
model=LiteLlm(
model="ollama_chat/mistral:latest",
api_base="http://localhost:11434"
),
name="multi_service_agent",
description="Multi-service agent managing IT, HR, and Finance",
instruction="""You are a multi-service assistant with access to:
IT Asset Management:
- list_assets, add_asset
HR Management:
- list_employees, add_employee, get_employee_details
Finance:
- list_invoices, create_invoice, get_budget
Use the appropriate tools based on user requests.""",
tools=[
asset_mcp, # All IT asset tools
hr_mcp, # All HR tools
finance_mcp # All finance tools
],
)建筑
User: "List all assets and show me John's employee details"
↓
ADK Agent (Single LLM)
├─→ Asset MCP Server (Port 8002) → list_assets()
└─→ HR MCP Server (Port 8003) → get_employee_details("John")益处
✅ 关注点分离 -每个服务都有自己的MCP服务器\ ✅ 独立缩放 -分别扩展每项服务\ ✅ 团队所有权 -不同的团队可以拥有不同的MCP服务器\ ✅ 易于集成 -只需添加另一个 McpToolset 连接新服务\ ✅ 单代理接口 -用户与一个代理交互,该代理协调所有服务
运作原理
- 工具发现:ADK自动发现所有MCP服务器中的所有工具
- LLM决策LLM分析用户请求并决定使用哪些工具
- 并行执行:ADK可以并行调用来自不同MCP服务器的多个工具
- 响应综合:LLM将多个服务的结果组合成一个连贯的响应
生产注意事项
- 服务发现:为MCP服务器URL使用环境变量
- 健康检查:为每个MCP服务器实施健康检查端点
- 错误处理:每个MCP服务器应独立处理错误
- 认证:为生产中的MCP服务器添加身份验证
- 速率限制:对每个MCP服务器实施速率限制
- 监控:分别监控每个MCP服务器
示例:基于环境的配置
import os
# Load MCP server URLs from environment
ASSET_MCP_URL = os.getenv("ASSET_MCP_URL", "http://localhost:8002/mcp")
HR_MCP_URL = os.getenv("HR_MCP_URL", "http://localhost:8003/mcp")
FINANCE_MCP_URL = os.getenv("FINANCE_MCP_URL", "http://localhost:8004/mcp")
# Create toolsets
asset_mcp = McpToolset(
connection_params=StreamableHTTPConnectionParams(url=ASSET_MCP_URL)
)
hr_mcp = McpToolset(
connection_params=StreamableHTTPConnectionParams(url=HR_MCP_URL)
)
finance_mcp = McpToolset(
connection_params=StreamableHTTPConnectionParams(url=FINANCE_MCP_URL)
)
# Agent with all services
root_agent = Agent(
model=LiteLlm(model="ollama_chat/mistral:latest"),
tools=[asset_mcp, hr_mcp, finance_mcp],
)此模式允许您构建 企业级多服务人工智能代理 它可以跨整个组织的服务进行编排! 🚀
