大模型应用开发新范式:深入解读MCP协议设计思想 原创

发布于 2025-5-6 06:45
浏览
0收藏

MCP能解决什么问题

我们之前开发LLM应用的时候,这个应用不仅基于已有的知识库对话,还和外部连接访问数据和使用工具:

  1. 访问 google 进行内容检索
  2. 访问 youtube 进行视频检索
  3. 调用公司内部的CRM接口

我们在LLM应用内部做了很多的粘合工作,在之后如果我们要新开一个LLM应用,如果还需要使用这些工具怎么办呢?我们可以引入一个中间层,把这些能力放在中间层中,LLM 应用只负责和中间层打交道。这其实就是MCP做的事,MCP可以用来简化LLM应用和这些外部资源工具的集成。

MCP 有哪些优势

MCP的核心就是标准化和统一操作,其实这也是软件开发中一种常见的范式,比如有些厂商提供了统一的API网关,可以访问不同大模型厂家的模型。MCP的出现隔离了开发者的关注点,LLM应用专注于应用开发,MCP Server 关注于工具能力的开发,如果某个外部资源的接口发生变化,那么也只需要修改对应的MCP Server, 作为使用方的其他LLM应用是不需要修改的。具体意义体现在以下几个方面:

  • 简化了LLM应用的开发,LLM 应用只需要选择对应的MCP Server即可
  • AI能力共享:MCP Server的出现,使得新的LLM应用可以快速获得很多能力,形成了一种全新的合作体系

基于MCP的架构

大模型应用开发新范式:深入解读MCP协议设计思想-AI.x社区

MCP Server

MCP Server 并非是传统意义上的那种server,其实叫组件更合适。它可以和LLM应用部署在同一个服务器上,也可以远程部署。

怎么获取MCP Server

  1. 下载别人写好的MCP Server, 这种在github上一搜一大堆,比如下面这个地址https://github.com/punkpeye/awesome-mcp-servers
  2. 自己使用MCP 的包自己开发,后面我们自己开发一个

MCP Server 需要提供什么

  1. Tools: 这个MCP Server 有哪些工具,MCP Client 获取Server对应的Tools 之后才知道用户的什么请求可以使用什么Tool
  2. Resources: 提供结构化数据(如知识库、产品目录、术语表),补充LLM的静态知识或实时数据
  3. prompts: 提供给LLM应用的一些Prompt模板。比如你的应用是一个Chatbot,可以从MCP Server中取出这些模板,让使用者选择使用

MCP Server如何启动

  • 不同的 MCP Server 有不同的启动命令,参考对应的说明即可,可能有的还需要安装Server启动所需要的依赖
  • 一般MCP Server 启动之后就是本地的一个独立的进程了

MCP Client

MCP Client 是LLM 应用使用MCP的包创建的一个session会话,可以类比成数据库的一个connection连接。通过这个会话,可以调用MCP Server,比如查询Server支持哪些tools之类的。

Client & Server怎么通信

  • 如果 Server 部署在远端,那么通过网络协议进行通信
  • 如果 Server 部署在本地,那就是一个独立的进程,linux 进程间的通信可以通过管道,client 和 server的通信就是通过stdio交互数据。例如一个进程可以把另一个进程的​​stdout​​ 读入作为它的​​stdin​​,这样就能获取到第二个进程的输出数据

实操演示

先来个简单的demo:

from mcp.server import FastMCP

# 初始化 MCP 服务器,名称用于客户端识别
mcp = FastMCP("my-server")

# 注册工具:同步函数示例(加法器)
@mcp.tool()
def add(a: int, b: int) -> int:
    """计算两个数的和"""
    return a + b

# 注册工具:异步函数示例(模拟API请求)
@mcp.tool()
asyncdef fetch_data(url: str) -> str:
    """从URL获取数据"""
    import httpx
    asyncwith httpx.AsyncClient() as client:
        response = await client.get(url)
        return response.text

if __name__ == "__main__":
    mcp.run(transport="stdio")  # 使用标准输入输出通信
  • ​@mcp.tool()​​ 装饰器暴露函数为 MCP 工具。
  • 支持同步和异步函数(如​​async/await​​)。
  • 函数注释(​​"""..."""​​)会被 AI 客户端解析,帮助模型理解工具用途

我们也可以把这个server当做远程部署来启动:

mcp run server.py --transport=sse

接下来我们创建一个MCP Client:

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

# Client会使用这里的配置来启动本地MCP Server
server_params = StdioServerParameters(
    command="python3",
    args=["./mcp_server.py"],
    env=None
)


asyncdef main():
    asyncwith stdio_client(server_params) as (read, write):
        asyncwith ClientSession(
                read, write, sampling_callback=None
        ) as session:
            await session.initialize()
            print(await session.list_tools())
            print('\n正在调用工具...')
            result = await session.call_tool("add", {"a": 1, "b": 2})
            print(result.content)
   time.sleep(60)

asyncio.run(main())

最终返回的结果如下:

大模型应用开发新范式:深入解读MCP协议设计思想-AI.x社区

我们会发现mcp_server 作为mcp_client的一个子进程在运行

大模型应用开发新范式:深入解读MCP协议设计思想-AI.x社区


高级用法

​resources​​​ 和 ​​prompt​​ 是两类强大的扩展功能,分别用于动态数据共享引导AI模型行为

Resources

Resources 允许在工具之间共享状态或数据(如数据库连接、API密钥),无需全局变量。特点

  • 生命周期由 MCP 管理(如懒加载、自动清理)
  • 支持依赖注入(工具可声明需要某资源)

import sqlite3
from contextlib import contextmanager

@mcp.resource()
@contextmanager
def db_connection():
    """数据库连接资源(自动关闭)"""
    conn = sqlite3.connect("data.db")
    try:
        yield conn
    finally:
        conn.close()

@mcp.tool()
def query_users(query: str, conn: sqlite3.Connection = mcp.depends(db_connection)) -> list:
    """执行SQL查询"""
    return conn.execute(query).fetchall()

Prompt

​Prompt​​ 功能用于 动态控制 AI 模型的行为,通过修改模型的上下文提示词(System Prompt)或提供示例(Few-shot Examples),可以显著改变模型的输出风格和逻辑。

from fastmcp import FastMCP
import openai  # 官方OpenAI库

mcp = FastMCP("openai-integration")

# 配置OpenAI API密钥(实际应从环境变量读取)
openai.api_key = "sk-your-api-key"

@mcp.prompt()
def role_based_prompt(role: str):
    """动态Prompt:根据角色设定AI行为"""
    role_profiles = {
        "teacher": "你是一个严谨的数学老师,必须逐步解释推导过程",
        "joker": "用幽默的段子和网络流行语回答问题",
        "coder": "仅返回代码,不要任何解释"
    }
    return {"system": role_profiles.get(role, "默认助手模式")}

# 给工具绑定prompt
@mcp.tool(prompt=role_based_prompt)
def ask_question(question: str, role: str = "teacher") -> str:
    """实际调用OpenAI生成回答(非模拟)"""
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "system", "content": role_based_prompt(role)["system"]},
            {"role": "user", "content": question}
        ],
        temperature=0.7if role == "joker"else0.3# 幽默模式需要更高随机性
    )
    return response.choices[0].message["content"]  # 返回AI生成的文本

if __name__ == "__main__":
    mcp.run(transport="http", port=8000)  # 启动HTTP服务

总结

本文阐述的MCP框架知识体系为后续开发复杂智能Agent奠定了理论基础。在实际应用开发环节,我们将基于MCP架构设计并实现功能强大的LLM应用解决方案。

参考资料:


本文转载自公众号AI 博物院 作者:longyunfeigu

原文链接:​​https://mp.weixin.qq.com/s/rvZ7uDojJDxX6x3ZmQivLQ​


©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
收藏
回复
举报
回复
相关推荐