MCP 怎么接大模型?Model Context Protocol 接入教程

MCP 怎么接大模型?Model Context Protocol 接入教程

Agent 想读文件、查数据库、调内部接口,早期每个工具都得自己写一套适配代码。MCP(Model Context Protocol)把「模型 ↔ 工具」的协议统一了:只要工具实现了 MCP server,任何支持 MCP 的客户端都能直接用。这篇文章讲怎么在应用里接上 MCP server,让大模型调起真实工具。

MCP 在架构里的位置

复制代码
大模型
  ↑ 函数调用(function calling)
应用客户端(把 MCP 工具转成函数 schema)
  ↑ MCP 协议
MCP server(文件系统 / 数据库 / 内部 API ...)

MCP server 暴露三类能力:tools (可执行的动作)、resources (可读取的数据)、prompts(预设提示)。我们最常用的是 tools。

环境准备

bash 复制代码
pip install mcp openai
# 以官方 filesystem server 为例
pip install mcp-server-filesystem

启动一个文件系统 MCP server(stdio 方式):

bash 复制代码
# 让 server 能访问 /data 目录
python -m mcp_server_filesystem /data

客户端列出工具并转成函数 schema

python 复制代码
import asyncio
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client

async def list_tools():
    server_params = StdioServerParameters(
        command="python",
        args=["-m", "mcp_server_filesystem", "/data"],
    )
    async with stdio_client(server_params) as (read, write):
        async with ClientSession(read, write) as session:
            await session.initialize()
            tools = await session.list_tools()
            for t in tools.tools:
                print(t.name, "→", t.description)
            return tools.tools

tools = asyncio.run(list_tools())

把工具交给大模型调用

拿到工具后,转成 OpenAI 的函数定义,让模型决定什么时候调:

python 复制代码
from openai import OpenAI

def to_function_schema(tool):
    return {
        "type": "function",
        "function": {
            "name": tool.name,
            "description": tool.description or "",
            "parameters": tool.inputSchema,
        },
    }

client = OpenAI(api_key="YOUR_API_KEY", base_url="YOUR_BASE_URL")

messages = [{"role": "user", "content": "把 /data/report.txt 的前 5 行读出来"}]
resp = client.chat.completions.create(
    model="YOUR_MODEL",
    messages=messages,
    tools=[to_function_schema(t) for t in tools],
)

执行模型选中的工具,再把结果喂回去

python 复制代码
import json

tool_call = resp.choices[0].message.tool_calls[0]
name = tool_call.function.name
args = json.loads(tool_call.function.arguments)

# 真正执行 MCP 工具
async def call_tool(name, args):
    server_params = StdioServerParameters(
        command="python", args=["-m", "mcp_server_filesystem", "/data"])
    async with stdio_client(server_params) as (read, write):
        async with ClientSession(read, write) as session:
            await session.initialize()
            return await session.call_tool(name, args)

result = asyncio.run(call_tool(name, args))

# 把工具结果回传给模型,让它生成最终回答
messages.append(resp.choices[0].message)
messages.append({
    "role": "tool",
    "tool_call_id": tool_call.id,
    "content": str(result.content),
})
final = client.chat.completions.create(
    model="YOUR_MODEL", messages=messages)
print(final.choices[0].message.content)

Agent 循环:多轮工具调用

真实 Agent 会反复「模型选工具 → 执行 → 回传」直到模型不再调用工具:

python 复制代码
while True:
    resp = client.chat.completions.create(
        model="YOUR_MODEL", messages=messages, tools=function_schemas)
    msg = resp.choices[0].message
    if not msg.tool_calls:
        print(msg.content)
        break
    messages.append(msg)
    for call in msg.tool_calls:
        out = asyncio.run(call_tool(call.function.name,
                                    json.loads(call.function.arguments)))
        messages.append({"role": "tool", "tool_call_id": call.id,
                          "content": str(out.content)})

安全:工具别裸奔

MCP 让模型能执行真实动作,权限必须收口:

风险 做法
模型删库 只暴露只读工具,写操作加人工确认
越权读文件 server 根目录锁死,禁止 .. 逃逸
工具参数注入 校验参数类型与范围
无限循环 限制最大工具调用轮数

快速排错表

问题 可能原因 解决方法
连不上 server 命令/路径错 先本地手动起 server
工具列表为空 没 initialize 调用前 session.initialize()
模型不调工具 schema 描述差 写清名称与用途
参数解析失败 类型不符 按 inputSchema 校验
死循环 无轮数上限 限制最大调用次数
执行报错 权限不足 检查 server 目录/账号
结果太大 返回超长 工具侧截断再回传
超时 工具太慢 设客户端超时

配置检查清单

检查项 怎么确认
server 能独立启动 手动运行无报错
工具 schema 清晰 名称/描述/参数齐全
权限最小化 只读优先、写操作确认
轮数有上限 防止无限循环
参数校验 类型与范围都检查
结果截断 大返回先裁剪
超时设置 慢工具不卡死
日志留痕 每次调用可回溯

MCP 的价值是把「接工具」从体力活变成标准协议。客户端负责把 MCP 工具转成函数调用,模型负责决定何时调用,你负责把权限收口。三层各管各的,Agent 就能稳稳跑起来。

相关推荐
泯泷几秒前
做 AI 产品,路线图该数“实验”,而不是数“功能”
人工智能·llm·产品
百度Geek说12 分钟前
AI 内容核查怎么做:智能内容 AI 核查系统实践
人工智能
武子康37 分钟前
Qwen-Drive 到底是什么:4B 级 VLM 如何成为驾驶策略底座
人工智能·算法·机器学习
落798.1 小时前
《启元 PrimeSim 如何用生成视频评估机器人策略》
人工智能·机器人·启元·具身应用
老纪的技术唠嗑局1 小时前
token 暴降75%!减少长程 Agent 任务中的重复开销,PowerContext v1.5.0 发布
人工智能
智塑未来1 小时前
明源云AI走播机器人,打造智能直播新体验
人工智能·机器人
brave10251 小时前
LLMGuide 大模型面试指南
人工智能·ai·面试·ai编程
机 _ 长2 小时前
05 智算运维|8 张卡怎么才算「捆成一张」:NCCL 实测与拓扑
运维·人工智能·算法·智算运维
用户4356782936372 小时前
五线并行认知架构:从算力内卷到思考秩序的底层革命
人工智能
一 铭3 小时前
WrenAI 详解:给 AI Agent 的开源 GenBI 引擎
人工智能·开源