|
ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">下面我会模拟三个“虚拟文件”,分别代表 Resources、Tools 和 Prompts,通过这些“文件”的内容来说明它们在 MCP 中的用法。每个文件都会有实际代码或伪代码,尽量贴近真实开发场景。 ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;padding-left: 8px;color: rgb(63, 63, 63);">文件 1:Resources 用法展示ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: inherit;color: rgb(15, 76, 129);">文件名:server_logs.txt ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: inherit;color: rgb(15, 76, 129);">描述:假设这是一个服务器日志文件,通过 MCP 的 Resources 暴露给 LLM,让它分析错误。 ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: inherit;color: rgb(15, 76, 129);">内容:ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-feature-settings: normal;font-variation-settings: normal;font-size: 14px;margin: 10px 8px;color: rgb(201, 209, 217);background: rgb(13, 17, 23);text-align: left;line-height: 1.5;overflow-x: auto;border-radius: 8px;padding: 0px !important;">[2025-02-22 10:00:01] ERROR: Database connection failed - Timeout [2025-02-22 10:00:05] INFO: Retry attempt 1 [2025-02-22 10:00:10] ERROR: Database connection failed - Timeout [2025-02-22 10:00:15] FATAL: System shutdowningFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: inherit;color: rgb(15, 76, 129);">MCP 配置(伪代码):ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-feature-settings: normal;font-variation-settings: normal;font-size: 14px;margin: 10px 8px;color: rgb(201, 209, 217);background: rgb(13, 17, 23);text-align: left;line-height: 1.5;overflow-x: auto;border-radius: 8px;padding: 0px !important;">// 在 MCP 服务器上暴露日志文件作为 Resource const server = new Server({ name: "log-server", version: "1.0.0" }, { capabilities: { resources: {} } });
// 列出可用资源 server.setRequestHandler("resources/list", async () => { return { resources: [{ uri: "file:///logs/server_logs.txt", name: "Server Logs", mimeType: "text/plain" }] }; });
// 读取资源内容 server.setRequestHandler("resources/read", async (request) => { if (request.params.uri === "file:///logs/server_logs.txt") { const logs = await readFile("server_logs.txt"); return { contents: [{ uri: request.params.uri, mimeType: "text/plain", text: logs }] }; } throw new Error("Resource not found"); });用法解析: - •实际操作:我在 Claude Desktop 里输入:“分析 server_logs.txt 的错误原因。” LLM 通过 MCP 访问这个 Resource,读取日志内容。
- •结果:LLM 可能会输出:“日志显示数据库连接多次超时,最终导致系统崩溃。建议检查网络延迟或数据库配置。”
就像上传了一个日志文件,LLM 直接“看到”内容并处理。Resources 的作用就是把数据喂给 LLM,类似“上传原材料”。
文件 2:Tools 用法展示文件名:weather_tool.py 描述:这是一个天气查询工具,通过 MCP 的 Tools 功能让 LLM 调用外部 API 获取实时天气。 内容: # Python MCP 服务器定义工具 from mcp.server import Server import requests
app = Server("weather-server")
定义天气查询工具 @app.tool("get_weather") async def get_weather(city: str) -> str: url = f"http://api.weatherapi.com/v1/current.json?key=YOUR_API_KEY&q={city}" response = requests.get(url).json() temp = response["current"]["temp_c"] condition = response["current"]["condition"]["text"] return f"{city} 当前温度: {temp}°C,天气: {condition}"
启动服务器 async def main(): async with app.stdio_server(): await app.run()
用法解析: - •实际操作:我在客户端输入:“告诉我上海的天气。” LLM 检测到需要实时数据,通过 MCP 调用 get_weather 工具,传入参数 city="上海"。
- •结果:工具返回:“上海当前温度: 15°C,天气: 多云。” LLM 再把这结果整合到回答里。
就像上传了一个“天气查询脚本”,LLM 不只是读,而是直接“执行”它获取结果。Tools 的核心是让 LLM 动手干活,而不是光看数据。
文件 3:Prompts 用法展示文件名:error_report_template.md 描述:这是一个错误报告模板,通过 MCP 的 Prompts 功能提供给 LLM,生成标准化的报告。 内容: 错误报告 日志文件: {log_file} 错误概要 {summary} 详细分析 {analysis} 修复建议 {suggestions}
MCP 配置(伪代码): const server = new Server({ name: "report-server", version: "1.0.0" }, { capabilities: { prompts: {} } });
// 定义 Prompt 模板 server.setRequestHandler("prompts/list", async () => { return { prompts: [{ id: "error_report", name: "Error Report Generator", template: await readFile("error_report_template.md"), parameters: ["log_file", "summary", "analysis", "suggestions"] }] }; });
用法解析: - •实际操作:我输入:“根据 server_logs.txt 生成错误报告。” LLM 通过 MCP 获取这个 Prompt 模板,结合 Resources 里的日志数据,填充参数:
- • log_file: "server_logs.txt"
- • summary: "数据库连接超时导致系统崩溃"
- • analysis: "多次重试失败,可能是网络问题"
- • suggestions: "检查数据库端口和网络稳定性"
- •结果:LLM 输出一个格式化的 Markdown 报告。
就像上传了一个“报告模板”,LLM 按照模板填充内容,生成结构化输出。Prompts 的作用是给 LLM 一个现成的套路,提升效率。
三者如何协作:假设我把这三个文件都“上传”到一个 MCP 支持的客户端(比如 Claude Desktop): - 1. Resources (server_logs.txt):LLM 先读取日志,获取上下文。
- 2. Tools (weather_tool.py):如果我顺便问了“今天天气如何影响服务器”,LLM 调用工具查天气。
- 3. Prompts (error_report_template.md):最后用模板把日志分析和天气数据整合成报告。
最终输出(模拟): 错误报告 日志文件: server_logs.txt 错误概要 数据库连接超时导致系统崩溃 详细分析 日志显示多次超时,可能是网络问题。今日上海天气多云,温度15°C,未见极端情况。 修复建议 检查数据库端口和网络稳定性,排除硬件故障。
写到最后通过上面的例子,模拟了“上传文件”的直观体验,展示了 MCP 这仨概念怎么落地。现实中,MCP 需要服务器和客户端支持,但原理就是这么简单直接。 |