昨天我們透過 FastMCP 成功建立了一個簡單的 MCP Server,裡面只有一個簡單的工具 sayHello,能夠回傳一段打招呼的訊息。
今天,我要挑戰的是使用 ADK (Agent Development Kit),把這個 MCP Server 串接進一個 Agent 裡,讓 Agent 可以透過 MCP 工具來打招呼。這樣做的好處是,我們可以用統一的方式去管理 Agent 的 LLM 與 工具 Tools,而 MCP server 只需要專心提供功能即可。
我們昨天寫的 mcp_server.py 長這樣:
mcp = FastMCP("My MCP Server")
@mcp.tool
def sayHello(text: str) -> str:
"""回傳一段打招呼的訊息。"""
return f"Hello, {text}!"
if __name__ == "__main__":
mcp.run()
這個 Server 透過 mcp.run(),會使用 stdio 來跟外部溝通。
agent = Agent(
model=LiteLlm(
model=os.getenv("OPENAI_API_MODEL"),
api_key=os.getenv("OPENAI_API_KEY"),
),
name="gent",
description=prompt.AGENT_DESCRIPTION,
instruction=prompt.AGENT_INSTRUCTION,
tools=[
MCPToolset(
connection_params=StdioConnectionParams(
server_params=StdioServerParameters(
command="python",
args=["mcp_server.py"], # 指定昨天的 MCP server
env=os.environ.copy(),
)
)
)
]
)
在 prompt.py 裡,只讓 Agent 做打招呼:
AGENT_DESCRIPTION = """
這是一個專門用來打招呼的 Agent。
"""
AGENT_INSTRUCTION = """
- 當使用者輸入「打招呼」或相關需求時,請回覆一段簡單的招呼語。
- 如果輸入內容與打招呼無關,請直接回覆「我只能打招呼。」。
- 所有回覆一律使用繁體中文。
"""
load_dotenv()
app = FastAPI()
class QueryRequest(BaseModel):
query: str
session_service = InMemorySessionService()
artifacts_service = InMemoryArtifactService()
@app.post("/query")
async def ask_agent(request: QueryRequest):
session = await session_service.create_session(
state={"skip_agent": False},
app_name="backend",
user_id="user",
)
session_id = session.id
# 設定傳進 Agent 的內容
parts = [types.Part(text=request.query)]
content = types.Content(role="user", parts=parts)
# 建立執行 Agent 的 Runner
runner = Runner(
app_name="backend",
agent=app_agent,
artifact_service=artifacts_service,
session_service=session_service,
)
# 執行 Agent
events_async = runner.run_async(
session_id=session_id, user_id="user", new_message=content
)
# 獲取回傳內容
response = []
async for event in events_async:
if event.content:
for part in event.content.parts:
if part.text:
response.append(part.text)
return {"response": "\n".join(response)}