《MCP 入门实战》第 5 课:第一个 Client 与国产大模型接入

本文收录于专栏 AI Agent智能体系列 ------ 20 课从协议原理到生产部署的 MCP 中文实战课程,点击订阅可跟踪后续更新。

【摘要】

你的 MCP Client 想接国产大模型但不知道端点怎么填?这课给五家实测接入表:DeepSeek、Kimi(裸 /v1 报 404,必须 /coding/v1)、MiniMax(Anthropic 协议非 OpenAI)、GLM、Qwen,每家给 base_url、model id、协议类型与实测结论,配完整 tool-calling 五步链路代码,你能直接换成自己有 key 的那家跑通。

阶段 2 上手实战:Server / Client / LLM 接入 | 来源:【原·03-02 client + 03-03 llm-client】 | 知识更新至 2026-10(当日检索 + 本机实测)

关键字: 国产大模型API、DeepSeek API、Kimi API、MiniMax API、MCP Client、tool calling、OpenAI兼容端点、大模型工具调用

概念讲解

5.1 LLM Client 的完整链路

上一课的 Client 是"死"的------调什么工具写死在代码里。真实场景是模型来决定调什么。完整链路五步:

text 复制代码
用户提问 → LLM 看到工具列表,决定是否调工具 → 宿主把 tool_call 翻译成 MCP tools/call
→ Server 执行并返回 → 结果回给 LLM 生成最终回答

关键转换只有一步:把 MCP 的 tools/list 结果转成 LLM 的 tools 参数。两边 schema 几乎一样(都是 JSON Schema),只需字段映射。

5.2 国产六模型端点表(2026-10 本机实测)

模型 base_url 模型 ID 协议 工具调用实测
DeepSeek https://api.deepseek.com/v1 deepseek-chat OpenAI ✅ 本课全链路实测
Kimi https://api.kimi.com/coding/v1(裸 /v1 报 404) k3 / kimi-for-coding OpenAI ✅ 实测可调
MiniMax https://api.minimaxi.com/anthropic MiniMax-M3 Anthropic(非 OpenAI) ✅ 实测可调
GLM https://api.z.ai/api/coding/paas/v4 glm-5.3 OpenAI ⚠️ 接口通,写作当日配额耗尽(2026-10-05 恢复);thinking 用 extra_body={"thinking":{"type":"enabled"}},不用 reasoning_effort(报 422)
Qwen https://dashscope.aliyuncs.com/compatible-mode/v1 qwen-plus 等 OpenAI 未实测(本机无 key),按官方文档口径
小米 MiMo 开放平台申请 --- OpenAI 兼容 未实测,按官方文档口径

换模型 = 换 base_url + api_key + 模型名三行,其余代码不动(MiniMax 除外,它走 Anthropic 协议,SDK 不同)。

案例实战:DeepSeek + MCP 全链路

目标

DeepSeek 收到"帮我查一下蓝牙相关的订单"→ 自主决定调 search_orders → MCP Server 执行 → 模型汇总成自然语言回答。

完整代码【已实测 2026-10,mcp 2.3.0 + openai 2.x + DeepSeek】

05_llm_client.py(与第 4 课的 04_server.py 同目录):

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

llm = OpenAI(api_key=os.environ["DEEPSEEK_API_KEY"],
             base_url="https://api.deepseek.com/v1")

async def main():
    params = StdioServerParameters(command="python", args=["04_server.py"])
    async with stdio_client(params) as (r, w):
        async with ClientSession(r, w) as s:
            await s.initialize()
            # 1) MCP 工具列表 -> OpenAI tools 参数
            tools = await s.list_tools()
            oa_tools = [{"type": "function", "function": {
                "name": t.name,
                "description": t.description or "",
                "parameters": t.input_schema,   # mcp 2.x 是 snake_case
            }} for t in tools.tools]

            # 2) 第一轮:让模型决策
            msgs = [{"role": "user", "content": "帮我查一下蓝牙相关的订单"}]
            resp = llm.chat.completions.create(
                model="deepseek-chat", messages=msgs, tools=oa_tools)
            m = resp.choices[0].message
            print("LLM 决定调用:", [(tc.function.name, tc.function.arguments)
                                  for tc in (m.tool_calls or [])])
            msgs.append(m)

            # 3) 执行每个 tool_call,结果回填
            for tc in (m.tool_calls or []):
                args = json.loads(tc.function.arguments)
                result = await s.call_tool(tc.function.name, args)
                msgs.append({"role": "tool", "tool_call_id": tc.id,
                             "content": result.content[0].text})

            # 4) 第二轮:模型基于工具结果生成最终回答
            final = llm.chat.completions.create(model="deepseek-chat", messages=msgs)
            print("最终回答:", final.choices[0].message.content)

asyncio.run(main())

实测输出

text 复制代码
LLM 决定调用: [('search_orders', '{"keyword": "蓝牙"}')]
最终回答: 我找到了一个蓝牙相关的订单:

| 订单编号 | 商品名称 | 订单状态 |
|----------|----------|----------|
| E20261001001 | 蓝牙耳机 | 已发货 |

目前只查到这一个蓝牙相关的订单。如果你想查看更详细的信息......随时告诉我。

token 用量实测:两轮合计 168 tokens(prompt 94 + completion 74)。

三个要点

  1. 字段映射就一行 :t.input_schema(mcp 2.x snake_case;1.x 是 inputSchema)直接塞进 OpenAI 的 parameters,两边都是 JSON Schema。
  2. 多 tool_calls 要循环处理 :模型可能一次返回多个工具调用,for tc in m.tool_calls 逐个执行逐个回填,tool_call_id 必须对应。
  3. 这是"一轮工具调用"的最小骨架:真实 Agent 要加循环(模型可能根据结果再调工具)和最大迭代保护,那是 Agent 框架的事,不是 MCP 的事------MCP 只负责工具这一层。

Kimi / MiniMax 的差异化接入(实测摘要)

python 复制代码
# Kimi(OpenAI 兼容,base_url 必须带 /coding/v1,否则 404)
OpenAI(api_key=KIMI_KEY, base_url="https://api.kimi.com/coding/v1")
# 实测:model="k3" 或 "kimi-for-coding" 均可,需明确提示"调用工具"或给 tool_choice

# MiniMax(Anthropic 协议,用 anthropic SDK 或原生 HTTP)
# endpoint: https://api.minimaxi.com/anthropic/v1/messages
# 头: x-api-key + anthropic-version: 2023-06-01
# 实测返回 tool_use block: {"name": "add", "input": {"a": 5, "b": 6}}

小结

  • LLM Client = MCP Client + 一层 schema 映射 + 一个"决策→执行→回填→生成"循环
  • 国产模型主流是 OpenAI 兼容:DeepSeek/Kimi/GLM/Qwen 换 base_url 即用;MiniMax 走 Anthropic 协议要单独处理
  • 实测端点坑:Kimi 裸 /v1 报 404 必须 /coding/v1;GLM thinking 用 extra_body 不用 reasoning_effort
  • 换模型成本 = 三行配置,这就是标准协议的价值

下一课把 Server 从 stdio 搬到 HTTP,讲传输实战、测试与部署------参见第 6 课《传输实战、测试与部署》。

扩展阅读


系列导航 :本课程全集见专栏 AI Agent智能体系列;上一课·第 4 课 环境与第一个MCP Server;下一课·第 6 课 传输实战测试与部署


我的专栏

蛋白 / 抗体 / 多肽 / 核酸 分子模拟 / 动力学 / 对接 药物 / 设计 / 案例 AI / Agent / 大模型
开源蛋白结构预测 分子模拟基础 小分子药物设计案例 AI Agent系列
开源蛋白生成方法实践 分子动力学模拟-Amber 蛋白药物设计案例 化学大模型
开源多肽设计模型 分子动力学模拟-Gromacs 多肽药物设计案例 《AI Agent原理与实战》
开源多肽性质预测 分子动力学模拟-OpenMM 开源小分子生成设计 CADD中的机器学习模型
DNA/RNA药物设计 結合自由能 开源药代动力学软件 高效计算配置
siRNA药物设计模型 UCSF DOCK系列 我胡师兄说药
ASO药物设计模型 rDock系列 LeDock系列 gnina系列
相关推荐
xrlfreedom1 个月前
MCP 面试高频考点:用 Streamable HTTP 控制返回大小并降低上下文消耗
mcp·mcp client·typescript mcp sdk·streamable http 传输
xrlfreedom1 个月前
MCP 模拟面试:如何用 RAG 知识库与 MCP Client 防止提示注入诱导高风险 Tool 执行
mcp·rag 知识库·mcp client
EatFan1 个月前
多智能体协作的三套通信语言:MCP、A2A 与 Tool Calling 怎么选(附 LangGraph/DeepAgents 实战分工模式)
区块链·多智能体·ai agent·mcp·a2a·tool calling
余槐i2 个月前
从useState到Agent状态:React状态管理为何在AI工作流中失灵?
react·状态管理·ai agent·langgraph·tool calling
树码小子2 个月前
什么是Skill
skill·tool calling
可乐ea3 个月前
Agent 安全实战:提示词注入、权限边界、数据泄露与成本控制
rag·ai agent·提示词注入·tool calling
可乐ea3 个月前
MCP 是什么:Agent 如何通过标准协议连接工具和外部服务
ai agent·mcp·tool calling
赵大仁3 个月前
Tool Calling 工程化:Schema 设计、鉴权、失败重试
ai·大模型·agent·工程化·tool calling
心之伊始5 个月前
Spring AI Tool Calling 实战:让 Java Agent 调用本地 Bean 工具方法
java·spring boot·agent·spring ai·tool calling