MCP是什么。如何创建一个MCP服务
什么是MCP?
Model Context Protocol (MCP) 是一个开放协议,它为大型语言模型 (LLM)连接外部数据源和工具提供了一套标准化的通信方式。可以把它理解为 AI 模型与外部世界连接的“通用插头”或“桥梁”。
简单来说,它主要由三个核心组成部分组成:
下面用一个例子介绍MCP的工作流程:
第一步:连接与初始化 - 客户端“发现”可用的工具
当MCP客户端(如Claude Desktop )启动并加载一个MCP服务器时,它们之间会立即进行一次初始化对话。这个过程是自动的。
1客户端发送初始化请求:客户端会发送一个请求,表明自己准备开始了。这个请求会调用 initialize 方法,并携带客户端自身的信息和能力。
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2024-11-05",
"capabilities": {
// ... 客户端支持的功能 ...
},
"clientInfo": {
"name": "Claude Desktop",
"version": "1.0.0"
}
}
}
2服务器响应并列出所有“家当”:服务器收到初始化请求后,会回复一个成功的响应。紧接着,服务器会主动发送一个 tools/list 通知,告诉客户端:“我这里提供了所有这些工具,你记一下。”
服务器发送 (tools/list):
{
"jsonrpc": "2.0",
"id": 2,
"result": {
"tools": [
{
"name": "get_student_count", // 工具的唯一标识符
"description": "获取学生的总人数。", // 这个工具是干什么的?
"inputSchema": { // 工具所需的参数格式(本例中为空)
"type": "object",
"properties": {}
}
},
{
"name": "get_student_by_id", // 另一个工具的例子
"description": "根据学生ID查询学生详细信息。",
"inputSchema": {
"type": "object",
"properties": {
"studentId": {
"type": "number",
"description": "学生的唯一ID。"
}
},
"required": ["studentId"]
}
}
// ... 可能还有其他工具 ...
]
}
}
至此,客户端就完成了“发现”过程。 它现在知道:
-
服务器上有一个名为
get_student_count的工具。 -
这个工具的描述是“获取学生的总人数”。
-
调用这个工具不需要任何参数。

第二步:AI 模型决策 - 匹配用户意图与工具
现在,客户端(具体来说是客户端里的AI模型,如Claude)已经拥有了工具列表。当用户提出问题时:
用户提问:“多少名学生?”
AI模型推理:
AI读取用户的问题。
查看自己已知的工具列表(刚刚从服务器获取的)。
进行匹配:“用户想查询学生数量。我有一个名为 get_student_count 的工具,它的描述正好是‘获取学生的总人数’,而且不需要参数。这完全匹配用户的需求。”
AI决定行动:于是,AI模型决定调用 get_student_count 这个工具。

第三步:工具调用 - 客户端发起请求
客户端向服务器发送结构化的工具调用请求

第四步:服务器执行 - 处理业务逻辑并返回结果
服务器内部处理细节:
请求验证:检查工具是否存在、参数格式是否正确
业务逻辑执行:
连接数据库/外部API
执行查询:SELECT COUNT(*) FROM students;
处理结果集
结果格式化:将原始数据转换为MCP标准格式

第五步:结果整合 - 客户端呈现最终答案
将服务器返回的数据转化为用户友好的响应。客户端处理过程:
响应解析:从MCP响应中提取核心数据(数字42)
上下文整合:AI模型结合对话历史和返回数据
自然语言生成:生成友好、信息完整的回复
后续建议:基于当前结果提供可能的下一步操作

完整业务流程总结

MCP核心功能
就像快递员帮你跑腿办事一样,MCP在电脑程序之间传递指令和结果。
核心三板斧:统一话术:所有工具都用JSON格式对话(类似网购时的订单模板)
灵活通道:支持本地直接通话(stdio)和网络远程呼叫(HTTP/2)
自动说明书:开发者加个@mcp.tool标签就能生成API文档

流程特征说明:
并行执行:工具A/B/C同时启动,互不阻塞
动态聚合:各工具输出自动合并为结构化数据
异步协调:MCP管理任务生命周期和超时控制
第一个 MCP Server:Hello World
创建基础服务器
# src/hello_mcp/server.py
from fastmcp import FastMCP
# 创建 MCP 服务器实例
mcp = FastMCP("hello-mcp-server")
@mcp.tool(description="Say hello to someone")
async def say_hello(name: str = "World") -> str:
"""Say hello to someone."""
message = f"Hello, {name}! Welcome to MCP!"
return message
@mcp.tool(description="Get current server time")
async def get_time() -> str:
"""Get the current server time."""
import datetime
current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
return f"Current time: {current_time}"
def main():
"""Main entry point."""
print("Starting Hello MCP Server...")
# 使用 HTTP 传输模式
mcp.run(transport="streamable-http")
if __name__ == "__main__":
main()
项目配置
# pyproject.toml
[project]
name = "hello-mcp-server"
version = "0.1.0"
description = "A simple Hello World MCP Server"
requires-python = ">=3.10"
dependencies = [
"fastmcp>=2.8.0",
]
[project.scripts]
hello-mcp-server = "hello_mcp:main"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.build.targets.wheel]
packages = ["src/hello_mcp"]
运行测试
# 创建虚拟环境
python -m venv .venv
# 激活虚拟环境
source .venv/bin/active
#安装 uv
pip install uv
# 安装项目
uv pip install -e .
# 运行服务器
hello-mcp-server
# 服务器将在 HTTP 模式下启动,默认地址: http://127.0.0.1:8000

与客户端集成
Cursor 配置(HTTP 模式)
{
"mcpServers": {
"hello-mcp": {
"url": "http://127.0.0.1:8000/mcp"
}
}
}

参考文献:
更多推荐



所有评论(0)