LLM—— 基于 MCP 协议(Stdio 模式)的工具调用实践

随着大语言模型的兴起,如何安全、高效、模块化地调用模型以外的外部工具函数(Tool) ,成为构建智能体系统的关键能力之一。OpenAI 提供了Function Calling 这一种高层封装(详情可见 基于 OpenAI Function Calling 的工具调用实践解析交互流程),而 MCP(Message Control Protocol)进一步提供了一种底层通信协议和标准化架构,支持双向消息、工具注册与执行、Agent 编排等高级能力。

本文将带领读者理解 MCP 的核心思想,并通过 Stdio 模式 实现一个本地交互式的 Agent-Tool 系统,其具备跨进程通信、动态工具发现、远程调用与安全隔离等优势。


一、什么是 MCP?

MCP(Message Control Protocol)是一个为 AI 工具链和智能体系统设计的 轻量级通信协议,支持:

  • 多语言之间的数据交互
  • LLM 与工具函数的解耦
  • 可插拔式工具发现、注册与调用
  • 支持 Stdio、SSE、Streamable HTTP三种传输机制

其目标是让 AI 系统具备"调用任何工具"的能力,并提供统一的接口定义与消息传输规范。

二、什么是 Stdio 模式?

Stdio 模式是 MCP 最轻量的通信方式,底层通过标准输入输出(stdin/stdout)进行通信。优势包括:

  • 无需网络环境,完全本地化运行
  • 进程隔离,避免工具崩溃影响主程序
  • 更适合开发、测试、调试小型工具代理系统
  • 性能稳定、通信延迟极低

非常适合构建一类"本地 LLM + 工具执行"的 AI 智能体系统,或将 Python 工具封装成标准 Agent。


三、示例项目结构

bash 复制代码
project/
├── stdio_server.py      # MCP 服务端,注册工具
└── stdio_client.py      # MCP 客户端,调用工具

MCP 服务端(工具注册者)

python 复制代码
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("MyServer")

@mcp.tool()
def say_hello(name: str) -> str:
    return f"Hello, {name}! Nice to meet you!"

@mcp.tool()
def add(a: int, b: int) -> int:
    return a + b

if __name__ == "__main__":
    mcp.run(transport="stdio")
关键解析:
  • FastMCP("MyServer"):初始化一个 MCP Server,内部会维护工具注册表
  • @mcp.tool():将本地函数注册为 MCP 工具,自动暴露名称、描述、参数结构等元数据
  • mcp.run(transport="stdio"):开启服务,监听标准输入/输出流,等待客户端请求

MCP 客户端(工具调用方)

python 复制代码
import asyncio

from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client


async def main():
    # Define server parameters
    server_params = StdioServerParameters(
        command="python",  # The command to run your server
        args=["stdio_server.py"],  # The arguments to pass to the command
    )

    # Connection to the server
    async with stdio_client(server_params) as (read_stream, write_stream):
        async with ClientSession(read_stream, write_stream) as session:
            # Initialize the connection
            await session.initialize()

            # List avaliable tools
            tools_result = await session.list_tools()
            print("Available tools:")
            for tool in tools_result.tools:
                print(f"- {tool.name}: {tool.description}")

            # Call our calculator tool
            result = await session.call_tool("add", arguments={"a": 1, "b": 2})
            print(f"1 + 2 = {result.content[0].text}")


if __name__ == "__main__":
    asyncio.run(main())
关键解析:
  • StdioServerParameters:用于描述目标 Server 的启动方式(命令 + 参数)
  • stdio_client(...):打开一个异步上下文环境,与 Server 通过标准 IO 建立连接
  • ClientSession:抽象出的"客户端会话",支持工具列举、函数调用等 API
  • call_tool(name, arguments):直接远程调用 MCP Server 上注册的某个工具

交互流程时序图

四、MCP 与 Function Calling 的对比

功能 OpenAI Function Calling MCP
工具注册 JSON Schema 注册函数 Python 装饰器注册
参数交互 模型生成 JSON 参数 客户端直接指定参数
执行隔离 模型内执行 可进程级别隔离(Stdio)
通信机制 内部封装 可选 Stdio、SSE、Streamable HTTP
场景适配 LLM 调用链 通用代理工具框架,适合 Agent

小结:Function Calling 更高层、针对 LLM 推理流程;而 MCP 更底层,更通用、组件化,更适合做 Tool Registry + Agent 系统。

五、总结

MCP 提供了一种强大而灵活的协议,可以帮助我们将任意 Python 工具函数注册为结构化、可调用的服务端组件 。通过 Stdio 模式,我们实现了本地进程间通信的高效工具系统,读者可在此基础上进一步拓展为:

  • 本地 LLM Agent + 工具系统
  • 与 LangGraph 等框架整合的流程图智能体
  • 支持多语言互通的插件机制

如果你正准备构建一个智能体执行平台,那么MCP 将会是一个非常值得探索的选项。

相关推荐
kishu_iOS&AI9 小时前
LLM —— 安全和合规性
安全·大模型·agent
其实防守也摸鱼11 小时前
Claude 大模型新手入门与实战指南
人工智能·python·功能测试·ai·大模型·测评
慢慢向上的蜗牛11 小时前
Qwen3-0.6B ONNX(KV-Cache)模型部署
llm·onnx·文本生成·自回归·kv-cache
战族狼魂11 小时前
AI巨头IPO热潮引爆资本市场
人工智能·chatgpt·大模型·大语言模型·ai工程化
质造者11 小时前
Python 本地 RAG 实战 | Ollama+ChromaDB 实现 PDF 离线智能问答
开发语言·python·pdf·大模型·rag
Java陈序员12 小时前
一键测算!一款筛选本机可流畅运行的大模型终端工具!
rust·llm
宋哥转AI12 小时前
MCP 第一天我没写@Tool,先在一个大仓库里划这三层
java·agent·mcp
填满你的记忆12 小时前
MCP协议是什么?为什么它被称为AI时代的“USB接口”?
java·人工智能·agent·mcp
Together_CZ13 小时前
OpenCV 5.0 重磅发布:全面技术深度解析
图像处理·人工智能·opencv·计算机视觉·llm·dnn·推理
AI原来如此13 小时前
Claude Opus与GPT-5激战,国内API中转站如何应对2026模型迭代潮?
大数据·人工智能·gpt·ai·大模型·ai编程