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 将会是一个非常值得探索的选项。

相关推荐
最初的↘那颗心2 天前
Agent 实战:构建第一个 Agent 与记忆系统设计
java·大模型·agent·spring ai·记忆系统
Cosolar2 天前
LangChain实战:基于Streamlit+ LangChain + Qwen 快速构建一个多会话AI聊天页面
人工智能·llm·agent
云端FFF2 天前
LLM-based Agent 技术演进 —— 从 Prompt Engineering 到 Harness
llm·agent·skill·ai engineering
迷途酱2 天前
告别"玩具项目":用 MCP 协议让你的 AI Agent 真正干活
ai编程·mcp
小手智联老徐2 天前
OpenClaw 三小时连更三个版本
llm·ai编程·openclaw
最初的↘那颗心2 天前
Agent 核心原理:本质、ReAct 框架与工具设计最佳实践
大模型·agent·react·spring ai·工具设计
gz7seven2 天前
大模型学习笔记------微调之LoRA
lora·大模型·大模型微调·lora原理
竹之却2 天前
【Agent-阿程】AI先锋杯·14天征文挑战第14期-第1天-大模型微调技术实战
人工智能·机器学习·lora·大模型·qlora·微调技术
CoderJia程序员甲2 天前
GitHub 热榜项目 - 日榜(2026-04-08)
人工智能·ai·大模型·github·ai教程
handsomestWei2 天前
【开源】从设计文档到可交付技术交底书:专利.Skill
开源·大模型·agent·skill·clawhub·skillhub