
# mcp_server.pyfromfastmcpimportFastMCP mcpFastMCP(demo-mcp-server)# --- Tool Example ---# 定义工具 1: 加法mcp.tool()defadd(a:int,b:int)-int:Add two integers together.returnab# 定义工具 2: 乘法mcp.tool()defmultiply(a:int,b:int)-int:Multiply two integers together.returna*b# 定义工具 3: 减法mcp.tool()defsubtract(a:int,b:int)-int:Subtract b from a.returna-b# 定义工具 4: 除法mcp.tool()defdivide(a:float,b:float)-float:Divide a by b.ifb0:raiseValueError(Cannot divide by zero)returna/b# --- Prompt Example ---mcp.promptdefsummarize(text:str)-str:Prompt: ask the LLM to summarize a given text.return(f请对以下文本进行简要总结控制在 3 句话以内\n\n{text})if__name____main__:mcp.run(transportstreamable-http,host127.0.0.1,port8081)# agent_demo.pyimportasyncioimporthttpxfromlangchain_mcp_adapters.clientimportMultiServerMCPClientfromlangchain.agentsimportcreate_agentfromlangchain_openaiimportChatOpenAIfrompydanticimportBaseModel,FieldclassMathResult(BaseModel):数学运算结果expression:strField(...,description计算表达式)result:intField(...,description计算结果)step:strField(...,description计算步骤说明)def_make_mcp_http_client(headers:dict|NoneNone,timeout:httpx.Timeout|NoneNone,auth:httpx.Auth|NoneNone):避免使用代理和ssl验证客户端必须有headerstimeout auth这三个参数否则会报错returnhttpx.AsyncClient(trust_envFalse,proxyNone,verifyFalse,timeout100,headersheaders,authauth)defmcp_client():# 配置 MCP 客户端 - 使用 streamable_http 传输# 注意transport 参数可以设置为 streamable_http 或简写为 http# MultiServerMCPClient 支持四种传输协议stdio、sse、streamable_http、websocket[reference:2]clientMultiServerMCPClient({math_server:{url:http://localhost:8081/mcp,# MCP 服务器端点transport:streamable_http,# 使用 streamable HTTP 传输httpx_client_factory:_make_mcp_http_client}},tool_name_prefixTrue,# 为工具添加服务器前缀以区分来源)returnclientasyncdefcreat_agent_():clientmcp_client()toolsawaitclient.get_tools()# 从 MCP 服务器加载工具print(fLoaded{len(tools)}tools from MCP server:)fortoolintools:print(f -{tool.name}:{tool.description})llmChatOpenAI(modelqwen2.5,base_urlhttp://xxxx/v1,default_headers{# 必须设置的请求头参数Authorization:xxx,Content-Type:application/json},http_async_clienthttpx.AsyncClient(trust_envFalse,proxyNone,verifyFalse,timeout30),api_keyEMPTY,# 必须得有否则报错因为vllm启动模型时没有设置api—key此处访问时必须设置为EMPTYtemperature0.7,extra_body{chat_template_kwargs:{enable_thinking:False}},# 额外body体参数此处表示不启用思考)# 4. 创建 ReAct Agentagentcreate_agent(llm,toolstools,response_formatMathResult# 没起作用不清楚为什么)returnagentasyncdefmain():agentawaitcreat_agent_()queryWhat is 15 plus 27?# 1. 获取 Agent 响应responseawaitagent.ainvoke({messages:[{role:user,content:query}]})formsginresponse[messages]:msg.pretty_print()if__name____main__:asyncio.run(main())