跳到主要内容

MCP 知识速查表

本页面汇总了 MCP(Model Context Protocol)的核心知识点,方便快速查阅。

核心概念

概念说明
HostLLM 应用程序,启动连接(如 Claude Desktop、Cursor)
Client主机内部的连接器,负责与 Server 通信
Server提供上下文和能力的服务
ToolsAI 模型可调用的函数(服务器原语)
Resources可共享的上下文和数据(服务器原语)
Prompts预定义的提示模板(服务器原语)
Sampling服务器请求 LLM 推理(客户端原语)
Elicitation服务器请求用户输入(客户端原语)
Logging服务器发送日志消息(客户端原语)
Completions参数自动补全建议(服务器原语)
Tasks异步任务执行(实验性功能)
Roots文件系统访问边界定义

分层架构

层次说明
数据层JSON-RPC 2.0 协议、生命周期管理、原语定义
传输层STDIO 传输、Streamable HTTP 传输

协议版本

版本发布日期状态
2025-11-252025-11-25最新稳定版
2025-06-182025-06-18支持中
2024-11-052024-11-05支持中

消息格式

// 请求
{
"jsonrpc": "2.0",
"id": "unique-id",
"method": "tools/list",
"params": {}
}

// 响应
{
"jsonrpc": "2.0",
"id": "unique-id",
"result": {}
}

// 错误
{
"jsonrpc": "2.0",
"id": "unique-id",
"error": {
"code": -32601,
"message": "Method not found"
}
}

// 通知(无 id,无需响应)
{
"jsonrpc": "2.0",
"method": "notifications/tools/list_changed"
}

核心方法

生命周期

initialize                    # 初始化连接
notifications/initialized # 初始化完成通知
shutdown # 关闭连接
notifications/exit # 退出通知

工具相关

tools/list                    # 列出可用工具
tools/call # 调用工具
notifications/tools/list_changed # 工具列表变更通知

资源相关

resources/list                # 列出可用资源
resources/read # 读取资源内容
resources/subscribe # 订阅资源变更
resources/unsubscribe # 取消订阅
notifications/resources/updated # 资源更新通知
notifications/resources/list_changed # 资源列表变更通知

提示相关

prompts/list                  # 列出可用提示模板
prompts/get # 获取提示内容
notifications/prompts/list_changed # 提示列表变更通知

补全相关

completion/complete           # 获取补全建议

任务相关(实验性)

tasks/get                     # 获取任务状态
tasks/result # 获取任务结果
tasks/list # 列出任务
tasks/cancel # 取消任务
notifications/tasks/status # 任务状态变更通知

客户端原语

sampling/createMessage        # 服务器请求 LLM 采样
elicitation/create # 服务器请求用户输入
logging/setLevel # 设置日志级别
notifications/message # 日志消息通知

根目录相关

roots/list                    # 列出根目录
notifications/roots/list_changed # 根目录变更通知

Python SDK 常用代码

创建服务器

from mcp.server import Server

app = Server("my-server")

定义工具

from mcp.types import Tool, TextContent

@app.list_tools()
async def list_tools():
return [
Tool(
name="tool_name",
description="工具描述",
inputSchema={
"type": "object",
"properties": {
"param": {"type": "string", "description": "参数描述"}
},
"required": ["param"]
}
)
]

@app.call_tool()
async def call_tool(name: str, arguments: dict | None):
if name == "tool_name":
return [TextContent(type="text", text="result")]
raise ValueError(f"Unknown tool: {name}")

定义资源

from mcp.types import Resource

@app.list_resources()
async def list_resources():
return [Resource(
uri="resource://id",
name="资源名称",
mimeType="application/json"
)]

@app.read_resource()
async def read_resource(uri: str):
return [TextContent(type="text", text="content")]

定义提示

from mcp.types import Prompt, PromptArgument

@app.list_prompts()
async def list_prompts():
return [Prompt(
name="prompt_name",
description="提示描述",
arguments=[
PromptArgument(name="arg", description="参数", required=True)
]
)]

@app.get_prompt()
async def get_prompt(name: str, arguments: dict | None):
return [TextContent(type="text", text="prompt content")]

定义补全

@app.complete()
async def handle_completion(ref: dict, argument: dict, context: dict | None):
return {
"completion": {
"values": ["suggestion1", "suggestion2"],
"hasMore": False
}
}

处理任务

from mcp.types import Task, TaskStatus

@app.call_tool()
async def call_tool(name: str, arguments: dict | None, task: dict | None = None):
if task:
# 作为任务处理
task_id = create_task_id()
return {
"task": Task(
taskId=task_id,
status=TaskStatus.WORKING,
createdAt=datetime.utcnow().isoformat() + "Z"
).model_dump()
}
# 普通调用
return [TextContent(type="text", text="result")]

启动 STDIO 服务器

from mcp.server.stdio import stdio_server
import asyncio

async def main():
async with stdio_server() as (read_stream, write_stream):
await app.run(
read_stream,
write_stream,
app.create_initialization_options()
)

asyncio.run(main())

FastMCP 快速开发

from mcp.server.fastmcp import FastMCP
from pydantic import BaseModel, Field

mcp = FastMCP("my-server")

# 工具
@mcp.tool()
def calculate(expression: str) -> str:
"""计算数学表达式"""
return str(eval(expression))

# 资源
@mcp.resource("config://settings")
def get_settings() -> str:
"""获取配置"""
return json.dumps({"version": "1.0"})

# 提示
@mcp.prompt()
def review_code(language: str = "python") -> str:
"""代码审查模板"""
return f"请审查以下{language}代码..."

# 补全
@mcp.completion("ref/prompt", "review_code", "language")
def complete_language(argument: dict, context: dict | None):
return ["python", "javascript", "java", "go"]

# 运行
if __name__ == "__main__":
mcp.run()

TypeScript SDK 常用代码

创建服务器

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { z } from "zod";

const server = new McpServer({
name: "my-server",
version: "1.0.0"
});

定义工具

server.tool(
"tool_name",
{ param: z.string().describe("参数描述") },
async ({ param }) => ({
content: [{ type: "text", text: "result" }]
})
);

启动 STDIO 服务器

import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";

async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("Server running on stdio"); // 使用 stderr
}

main().catch(console.error);

传输层配置

STDIO 配置

{
"mcpServers": {
"my-server": {
"command": "python",
"args": ["/absolute/path/to/server.py"]
}
}
}

HTTP 配置

{
"mcpServers": {
"my-server": {
"url": "https://api.example.com/mcp",
"headers": {
"Authorization": "Bearer your-token"
}
}
}
}

错误码

错误码名称说明
-32700Parse errorJSON 解析错误
-32600Invalid Request无效请求
-32601Method not found方法不存在
-32602Invalid params无效参数
-32603Internal error内部错误

任务状态(实验性)

状态说明
working任务正在执行
input_required需要额外输入
completed执行成功
failed执行失败
cancelled已取消

常用 MIME 类型

类型MIME
JSONapplication/json
Markdowntext/markdown
纯文本text/plain
HTMLtext/html
PDFapplication/pdf
PNGimage/png
JPEGimage/jpeg

工具设计模板

Tool(
name="function_name", # snake_case 命名
description="清晰的描述,说明工具用途、参数含义和返回内容",
inputSchema={
"type": "object",
"properties": {
"param_name": {
"type": "string",
"description": "参数描述,包括格式要求"
},
"optional_param": {
"type": "integer",
"description": "可选参数描述",
"default": 10
}
},
"required": ["param_name"]
},
execution={"taskSupport": "optional"} # 任务支持(可选)
)

资源 URI 模式

# 静态资源
Resource(uri="config://app", ...)

# 模板资源(动态)
ResourceTemplate(
uriTemplate="file:///project/{filename}",
...
)

能力声明模板

服务器能力

from mcp.types import ServerCapabilities

capabilities = ServerCapabilities(
tools={"listChanged": True},
resources={"subscribe": True, "listChanged": True},
prompts={"listChanged": True},
completions={},
tasks={
"list": {},
"cancel": {},
"requests": {"tools": {"call": {}}}
},
logging={}
)

客户端能力

capabilities = {
"roots": {"listChanged": True},
"sampling": {},
"elicitation": {},
"tasks": {
"list": {},
"cancel": {},
"requests": {
"sampling": {"createMessage": {}},
"elicitation": {"create": {}}
}
}
}

调试命令

# 使用 Inspector 调试
npx @modelcontextprotocol/inspector python server.py

# 直接运行服务器
python server.py

# 查看日志(macOS)
tail -f ~/Library/Logs/Claude/mcp*.log

# 查看日志(Windows)
type %APPDATA%\Claude\Logs\mcp*.log

安全检查清单

  • 工具执行前验证所有输入参数
  • 敏感操作需要用户确认(使用 Elicitation)
  • 文件操作检查路径是否在允许的根目录内
  • API 调用设置合理超时时间
  • 日志输出到 stderr(STDIO 传输)
  • 不在工具描述中暴露敏感信息
  • 实现速率限制防止滥用
  • 任务 ID 使用加密安全的随机值
  • 验证资源 URI 防止路径遍历

官方资源

官方参考服务器

服务器功能安装命令
filesystem文件系统访问npx @modelcontextprotocol/server-filesystem /path
githubGitHub API 集成npx @modelcontextprotocol/server-github
postgresPostgreSQL 数据库npx @modelcontextprotocol/server-postgres
sqliteSQLite 数据库npx @modelcontextprotocol/server-sqlite
brave-searchBrave 搜索npx @modelcontextprotocol/server-brave-search
puppeteer浏览器自动化npx @modelcontextprotocol/server-puppeteer
slackSlack 集成npx @modelcontextprotocol/server-slack