引言

模型上下文协议(Model Context Protocol,简称 MCP)正在迅速成为打造高度智能和可互操作 AI 应用的重要标准框架。大多数有关 MCP 的资料聚焦于单服务器部署,而在本文中,我们将介绍如何结合 Azure OpenAI,基于多服务器 MCP 架构实现一个可扩展、可定制的智能体平台,让你能够在一个前端界面下,便捷地连接和编排多个工具服务器,实现跨领域智能体工具协作。

什么是 MCP?为什么很重要?

MCP 为代理和 AI 应用与各种工具服务之间的交互提供了标准化方案,并且无关使用的编程语言或平台。它就像 AI 应用世界的“万能连接器”。目前,Azure AI Foundry 与 Azure MCP Server 已为生态带来了丰富的现有 MCP 工具,方便开发者直接集成与扩展。

MCP生态图

为什么选择多服务器 MCP?

在真实世界业务中,复杂流程常常需要多种专用 API(如:数据库查询、文件编辑、网页信息抓取等多种“工具”)。多服务器 MCP 允许我们灵活地将这些多样化的工具服务器无缝连接、编排在一起:

  • 即插即用工具服务器:支持自定义、远程及预置 MCP 服务器(如自定义数学、Fabric、Azure AI Foundry 等)
  • 互操作性:不同 AI 工具可自如协作
  • 智能体流程编排:AI 代理可在多个专用领域间自动推理、规划、跨域调用工具
  • Azure OpenAI 集成:利用企业级大模型与安全能力
  • 可扩展性:可轻松增加/删除工具服务器,无需重写主代理逻辑

系统架构综述

系统架构图

核心组件说明:

  • MCP 服务器:通过 MCP 协议(如 stdio、SSE 等)对外暴露工具(功能)
  • MCP 客户端:连接多个 MCP 服务器,实现工具发现与编排
  • Langchain MCP 适配器:连接 Langchain 智能体与 MCP 工具
  • FastAPI 后端:提供 API 并服务前端页面

此方式具备如下优势:

  • 服务去耦合、语言无关
  • 工具可动态发现
  • 可与 LLM 和外部 API 无缝集成
  • 尤其结合 Azure OpenAI 实现可扩展、可安全托管

快速实操:打造多服务器 MCP 平台

1. 在 client.py 引入 Langchain 与 MultiServer MCP

1
2
3
from langchain_openai import AzureChatOpenAI
from langchain_mcp_adapters.client import MultiServerMCPClient
from langgraph.prebuilt import create_react_agent

2. 用 FastAPI 创建前端 API(frontend_api.py)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse, FileResponse
import uvicorn

app = FastAPI()

@app.post("/ask")
async def ask(request: Request):
    data = await request.json()
    message = data.get("message", "")
    result = await run_agent(message)
    return JSONResponse(content={"result": result})

@app.get("/")
async def root():
    return FileResponse("frontend.html", media_type="text/html")

3. 定制 MCP 数学服务器示例(math_server.py)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("Math")

@mcp.tool(name="Addition", description="Adds two integers")
def add(a: int, b: int) -> int:
    return a + b

if __name__ == "__main__":
    mcp.run(transport="stdio")

4. 集成 Azure AI Foundry MCP 服务器

.vscode/mcp.json 加入 Azure AI Foundry 配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
{
  "servers": {
    "mcp_foundry_server": {
      "type": "stdio",
      "command": "uvx",
      "args": [
        "--prerelease=allow",
        "--from",
        "git+https://github.com/azure-ai-foundry/mcp-foundry.git",
        "run-azure-ai-foundry-mcp",
        "--envFile",
        "${workspaceFolder}/.env"
      ]
    }
  }
}

Python 代码中动态加载所有服务器:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import json, os

MCP_CLIENT_CONFIG = {}

with open(os.path.join(".vscode", "mcp.json"), "r") as f:
    mcp_config = json.load(f)
for name, cfg in mcp_config["servers"].items():
    args = [arg.replace("${workspaceFolder}", os.getcwd()) for arg in cfg["args"]]
    MCP_CLIENT_CONFIG[name] = {
        "command": cfg["command"],
        "args": args,
        "transport": cfg["type"]
    }
client = MultiServerMCPClient(MCP_CLIENT_CONFIG)

5. 展示工具列表接口

1
2
3
4
async def get_tools():
    async with client:
        tools = client.get_tools()
        return [{"name": t.name, "description": getattr(t, "description", "")} for t in tools]

6. 智能体编排与调用

1
2
3
4
5
6
async def run_agent(message):
    async with client:
        tools = client.get_tools()
        agent = create_react_agent(model, tools)
        agent_response = await agent.ainvoke({"messages": message})
        return agent_response["messages"][3].content

Bonus:前端实时查询所有 MCP 工具

后端新增 /tools 接口,便于前端动态展示已连接的 MCP 工具列表:

1
2
3
4
5
6
7
8
@app.get("/tools")
async def get_tools():
    async with client:
        tools = client.get_tools()
        return {"tools": [
            {"name": t.name, "description": getattr(t, "description", "")}
            for t in tools
        ]}

结语与实践建议

通过本文的架构与代码模版,开发者可以:

  • 便捷地集成自定义或现有 MCP 服务器(涵盖数学、Fabric、Azure AI Foundry 等)
  • 构建专属的 FastAPI 前端,打造交互式体验
  • 随时发现和编排各类工具
  • 在安全、可扩展的平台框架下高效用好 Azure OpenAI 及其他 LLM

动手实践:Fork 本代码仓库,开启你的智能体开发之旅!


拓展与注意事项

  • 企业级多服务器 MCP 推荐采用 SSE 方式暴露 MCP,便于扩展(但每个端口需独立,对扩展有挑战,当前 Demo 采用 stdio 简化启动)
  • 工具发现仅限于客户端配置中注册的 MCP 服务器
  • 小心命名空间冲突,尤其当连接多个自定义工具
  • 客户端需重新初始化以检测新增服务器/工具,影响运行时动态发现
  • 自定义 MCP 服务器的安全规范亟需标准化

推荐实践:


期待大家基于本文架构打造属于自己的 AI 智能体平台!