
大模型应用开发新范式:深入解读MCP协议设计思想 原创
MCP能解决什么问题
我们之前开发LLM应用的时候,这个应用不仅基于已有的知识库对话,还和外部连接访问数据和使用工具:
- 访问 google 进行内容检索
- 访问 youtube 进行视频检索
- 调用公司内部的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 Server
MCP Server 并非是传统意义上的那种server,其实叫组件更合适。它可以和LLM应用部署在同一个服务器上,也可以远程部署。
怎么获取MCP Server
- 下载别人写好的MCP Server, 这种在github上一搜一大堆,比如下面这个地址https://github.com/punkpeye/awesome-mcp-servers
- 自己使用MCP 的包自己开发,后面我们自己开发一个
MCP Server 需要提供什么
- Tools: 这个MCP Server 有哪些工具,MCP Client 获取Server对应的Tools 之后才知道用户的什么请求可以使用什么Tool
- Resources: 提供结构化数据(如知识库、产品目录、术语表),补充LLM的静态知识或实时数据
- 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_server 作为mcp_client的一个子进程在运行
高级用法
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应用解决方案。
参考资料:
- https://modelcontextprotocol.io/introduction
- https://github.com/punkpeye/awesome-mcp-servers
- https://glama.ai/mcp/servers
- https://github.com/supercorp-ai/supergateway
- https://github.com/langchain-ai/langchain-mcp-adapters
本文转载自公众号AI 博物院 作者:longyunfeigu
原文链接:https://mp.weixin.qq.com/s/rvZ7uDojJDxX6x3ZmQivLQ
