MCP 模型上下文协议
前言
昨天看到一个抖音MCP服务的源码,发现实现起来还是比较清晰的。萌生了自己动手试着做了一个的想法,以此来加深对MCP理解。先回顾迭代一下MCP的一些相关知识,然后跑通一个简单的MCP服务demo。
MCP 核心架构
- • MCP 主机(MCP Hosts):发起请求的 LLM 应用程序(例如 Claude Desktop、IDE 或 AI 工具)。• MCP 客户端(MCP Clients):在主机程序内部,与 MCP server 保持连接。• MCP 服务器(MCP Servers):为 MCP client 提供上下文、工具和 prompt 信息。• 本地资源(Local Resources):本地计算机中可供 MCP server 安全访问的资源(例如文件、数据库)。• 远程资源(Remote Resources):MCP server 可以连接到的远程资源(例如通过 API)。
交互流程
MCP client 充当 LLM 和 MCP server 之间的桥梁,MCP client 的工作流程如下:
- 1. MCP client 首先从 MCP server 获取可用的工具列表。2. 将用户的查询连同工具描述通过 function calling 一起发送给 LLM。3. LLM 决定是否需要使用工具以及使用哪些工具。4. 如果需要使用工具,MCP client 会通过 MCP server 执行相应的工具调用。5. 工具调用的结果会被发送回 LLM。6. LLM 基于所有信息生成自然语言响应。7. 最后将响应展示给用户。
构建 MCP Server
MCP Server 是 MCP 架构中的关键组件,它可以提供 3 种主要类型的功能:
- • 资源(Resources):类似文件的数据,可以被客户端读取,如 API 响应或文件内容。• 工具(Tools):可以被 LLM 调用的函数(需要用户批准)。• 提示(Prompts):预先编写的模板,帮助用户完成特定任务。
这些功能使 MCP server 能够为 AI 应用提供丰富的上下文信息和操作能力,从而增强 LLM 的实用性和灵活性。
AI 应用的开发更多的是需要编写的不同的 MCP Server,因为 MCP Client 相对固定,且有很多现成的工具实现了这一部分。,不同的业务场景需要使用不同的工具和资源,意味着需要开发出各种各样的 MCP server,来为大模型提供工具和资源。
因此了解 MCP Server 的开发流程很有价值。
最小的 MCP Server 样例
学习新东西,最好先从最小且必要的开始。以下就是 mcp 的 python SDK 中 Quickstart 的样例:
安装环境
推荐使用 uv 来进行 python 项目管理
# 安装uvcurl -LsSf https://astral.sh/uv/install.sh | sh# 创建名为“mcp-server-demo”的项目uv init mcp-server-demo# 进入项目根目录cd mcp-server-demo# 创建虚拟环境venvuv venv# 进入项目虚拟环境source .venv/bin/activate# 安装项目依赖包uv add "mcp[cli]"
新增 server 代码文件
创建 server.py 文件,添加以下代码。
# server.pyfrom mcp.server.fastmcp import FastMCP# Create an MCP servermcp = FastMCP("Demo")# Add an addition tool@mcp.tool()def add(a: int, b: int) -> int: """Add two numbers""" return a + b# Add a dynamic greeting resource@mcp.resource("greeting://{name}")def get_greeting(name: str) -> str: """Get a personalized greeting""" return f"Hello, {name}!"
调试
为了调试,运行以下命令,使用 MCP Inspector 来运行 MCP 服务器。
MCP Insepector 会提供一个直观的调试页面,
mcp dev server.py
运行成功后会输出类似: MCP Inspector is up and running at http://127.0.0.1 ,浏览器访问地址这个地址,可以看到如下页面,然后依次点开:Connect》Tools,即可查看到当前 mcp server 拥有的一个名为“add”的工具。