公司动态

从零实现MCP Server:让AI大模型标准化调用本地工具

📅 2026/8/16 22:38:29
从零实现MCP Server:让AI大模型标准化调用本地工具
1. 项目概述为什么我们需要 MCP最近在折腾 AI 应用开发的朋友估计都绕不开一个词MCP。它全称是 Model Context Protocol你可以把它理解成 AI 大模型比如 ChatGPT、Claude和外部工具、数据源之间的一种“通用接线板”或“标准插口协议”。简单来说它定义了一套规则让 AI 能以一种标准化的方式去调用你电脑上、服务器上甚至云端的各种工具和 API。你可能会问现在不是有 Function Calling 或者各种 Agent 框架吗为什么还需要 MCP我以一个实际开发者的角度告诉你痛点就在这里。以前你想让 AI 帮你查数据库、调个内部 API、或者操作一下本地的 Git你得为每个工具写一堆胶水代码定义好函数名、参数格式然后“教”给 AI。这个过程不仅繁琐而且一旦工具接口变了或者你想换一个 AI 模型就得重新适配一遍。更麻烦的是这些工具和 AI 之间的“对话”往往是紧耦合的很难复用和分享。MCP 的出现就是为了解决这个“接线混乱”的问题。它把工具提供方Server和工具调用方Client通常是 AI解耦了。作为开发者你只需要按照 MCP 协议为你手头的工具无论是一个命令行脚本、一个 REST API还是一个本地数据库写一个标准的“适配器”即 MCP Server。写好后任何支持 MCP 协议的 AI 客户端比如 Claude Desktop、Cursor 等都能直接发现并使用你的工具无需为每个客户端单独适配。这个项目的标题“从零接入 MCP”直白点说就是手把手教你如何把你手边任意一个有用的工具——可能是一个用 Python 写的天气查询脚本、一个内部审批系统的 API甚至是一个控制智能家居的命令行工具——通过实现一个 MCP Server把它变成 AI 大模型可以随时调用的“原生能力”。这不是简单的 API 封装而是协议级的实践意味着我们关注的是如何遵循标准构建出可移植、可组合、真正具备生产力的 AI 工具链。接下来我会从设计思路、核心实现到避坑指南完整走一遍这个流程。2. MCP 核心概念与设计思路拆解在动手写代码之前我们必须先吃透 MCP 的几个核心概念这决定了我们整个项目的架构是否清晰、健壮。2.1 MCP 的核心组件Server, Client 与 TransportMCP 的架构非常简洁主要包含三个角色MCP Server工具提供方这是我们本次实践的核心。它封装了具体的工具能力比如“执行一个 Shell 命令”、“查询数据库”、“调用某云服务 API”。Server 向外界宣告自己提供了哪些“工具”Tools或“资源”Resources并等待 Client 的调用请求。MCP Client工具调用方通常是 AI 应用本身比如 Claude Desktop。Client 负责发现可用的 Server获取工具列表并在需要时例如用户提出了一个需要工具协助的请求向 Server 发起调用。Transport传输层连接 Server 和 Client 的通道。MCP 支持两种主要方式stdio标准输入输出最常见的方式。Server 作为一个独立的进程启动Client 通过管道stdin/stdout与其通信。这种方式部署简单适合本地工具。SSEServer-Sent Events基于 HTTP 的协议允许 Server 主动向 Client 推送信息。更适合远程或网络服务。我们的工作就是创建一个 MCP Server。选择 stdio 作为 Transport因为它最简单也最符合“将本地工具接入 AI”的初心。2.2 协议基石JSON-RPC 2.0MCP 的所有通信都构建在JSON-RPC 2.0协议之上。这是一个轻量级的远程过程调用协议。简单理解Client 和 Server 之间来回传递的都是 JSON 格式的消息。每一条消息要么是一个“请求”Request要么是一个“响应”Response或者是一个“通知”Notification。一个典型的调用流程是Client 发送一个request到 Server方法名是tools/call参数里包含了要调用的工具名称和具体参数。Server 收到后执行对应的工具逻辑然后返回一个response里面包含了执行结果文本、图片、数据等。如果执行过程中有错误则返回一个error对象。我们不需要从头实现 JSON-RPC社区已经有成熟的库如jsonrpcserver和jsonrpcclient来处理消息的解析、分发和封装。我们的重点是实现工具逻辑本身。2.3 工具Tools与资源Resources这是 MCP Server 向外提供能力的两种主要形式工具Tools顾名思义是一个可以执行某种操作并返回结果的函数。比如“搜索网络”、“计算器”、“文件读写”。AI 通过“函数调用”Function Calling的方式来使用它。在 MCP 中你需要为每个工具定义清晰的名称、描述和参数模式Schema。资源Resources可以理解为一种“只读”的数据源。AI 可以“读取”资源的内容。比如你可以定义一个资源指向你项目的README.md文件或者一个实时天气数据接口。AI 在需要背景信息时可以直接读取这些资源的内容而无需调用工具。对于初次接入我们优先实现Tools因为它的交互性更强更能体现 AI 使用工具的过程。Resources 更适合作为静态或动态数据的提供渠道。2.4 设计我们的第一个 MCP Server一个系统信息查询工具为了将理论落地我们设计一个简单的实战项目一个能够查询当前系统基本信息的 MCP Server。这个工具将向 AI 暴露几个能力获取当前系统类型Windows/Linux/macOS和版本。获取当前 CPU 和内存的使用情况。列出当前工作目录下的文件。这个工具看似简单但涵盖了 MCP Server 的所有基本要素初始化、工具定义、请求处理、结果返回。我们将使用Python来实现因为 Python 在 AI 和工具开发领域生态丰富且 MCP 的 Python SDK 相对成熟。3. 环境准备与核心依赖选择工欲善其事必先利其器。实现一个 MCP Server选对工具链可以事半功倍。3.1 Python 环境与包管理确保你有一个可用的 Python 环境3.8 及以上。强烈建议使用虚拟环境venv 或 conda来隔离项目依赖。# 创建项目目录并进入 mkdir my-mcp-server cd my-mcp-server # 创建虚拟环境 python -m venv .venv # 激活虚拟环境 # Windows: .venv\Scripts\activate # Linux/macOS: source .venv/bin/activate3.2 核心依赖库mcp目前实现 MCP Server 最官方和便捷的 Python 库就是mcp。它由 Anthropic 官方维护提供了高级 API极大地简化了 Server 的创建过程。pip install mcp这个库会自动处理底层的 JSON-RPC 通信、生命周期管理我们只需要关注工具的实现逻辑。除了mcp我们可能还需要一些辅助库来实现具体的工具功能例如psutil用于获取系统信息。pip install psutil3.3 开发与调试工具Claude Desktop这是体验 MCP 最直接的方式。它内置了 MCP Client可以方便地加载本地开发的 MCP Server。你需要从 Anthropic 官网下载安装。MCP Inspector一个强大的调试工具。它可以作为一个中间人可视化地展示 MCP Server 和 Client 之间的所有通信消息是排查协议问题的利器。可以通过 npm 安装npm install -g modelcontextprotocol/inspector。文本编辑器或 IDEVSCode 或 PyCharm 均可。确保配置好 Python 解释器指向你的虚拟环境。注意在开发初期强烈建议同时打开 Claude Desktop或 Inspector和你的代码编辑器边修改边测试能快速获得反馈。4. 从零编写第一个 MCP Server现在让我们开始编写代码。我们将创建一个名为system_info_server.py的文件。4.1 初始化 Server 与生命周期首先导入必要的模块并创建一个 MCP Server 实例。# system_info_server.py import asyncio import sys import platform import psutil from typing import Any from mcp import Server, StdioServerTransport import mcp.server.stdio import mcp.server.models as models # 创建 Server 实例 app Server(system-info-server)Server类是核心参数”system-info-server“是你的 Server 名称用于标识。接下来我们需要定义 Server 启动时的一些行为例如向 Client 注册我们提供的工具列表。这通过app.list_tools()装饰器来实现。app.list_tools() async def handle_list_tools() - list[models.Tool]: 返回此 Server 提供的所有工具列表 return [ models.Tool( nameget_system_info, description获取当前操作系统的类型和版本信息。, inputSchema{ type: object, properties: {}, # 此工具不需要输入参数 required: [] } ), models.Tool( nameget_system_usage, description获取当前系统的CPU和内存使用情况。, inputSchema{ type: object, properties: {}, required: [] } ), models.Tool( namelist_directory, description列出指定目录下的文件和文件夹。默认列出当前工作目录。, inputSchema{ type: object, properties: { directory_path: { type: string, description: 要列出的目录路径。如果未提供则使用当前工作目录。 } }, required: [] # directory_path 是可选参数 } ) ]这里我们定义了三个工具。每个models.Tool对象都包含了工具的唯一名称、给 AI 看的自然语言描述以及最重要的inputSchema。这个 Schema 遵循 JSON Schema 规范用于告诉 AI 这个工具需要什么参数什么类型。例如list_directory工具有一个可选的directory_path字符串参数。4.2 实现工具逻辑定义了工具列表接下来就要实现每个工具被调用时的具体逻辑。我们使用app.call_tool()装饰器。app.call_tool() async def handle_call_tool(name: str, arguments: dict[str, Any]) - list[models.TextContent]: 根据工具名称和参数执行对应的工具逻辑 if name get_system_info: # 实现获取系统信息 system platform.system() release platform.release() version platform.version() info_text f操作系统: {system}\n系统版本: {release}\n详细版本: {version} return [models.TextContent(typetext, textinfo_text)] elif name get_system_usage: # 实现获取系统资源使用情况 cpu_percent psutil.cpu_percent(interval0.5) # 短暂间隔获取更准确实时值 memory psutil.virtual_memory() usage_text ( fCPU 使用率: {cpu_percent}%\n f内存总量: {memory.total / (1024**3):.2f} GB\n f内存已使用: {memory.used / (1024**3):.2f} GB\n f内存使用率: {memory.percent}% ) return [models.TextContent(typetext, textusage_text)] elif name list_directory: # 实现列出目录 import os dir_path arguments.get(directory_path, .) # 默认为当前目录 try: items os.listdir(dir_path) # 简单区分文件和文件夹这里用/标记文件夹实际可更复杂 items_list [] for item in items: full_path os.path.join(dir_path, item) prefix [DIR] if os.path.isdir(full_path) else [FILE] items_list.append(f{prefix} {item}) list_text f目录 {dir_path} 下的内容:\n \n.join(items_list) except FileNotFoundError: list_text f错误目录 {dir_path} 不存在。 except PermissionError: list_text f错误没有权限访问目录 {dir_path}。 return [models.TextContent(typetext, textlist_text)] else: # 如果收到未知的工具名返回错误信息 return [models.TextContent(typetext, textf错误未知的工具 {name}。)]每个工具函数返回一个models.TextContent列表。目前我们只返回纯文本但 MCP 也支持返回图像、HTML 等内容。错误处理通过返回包含错误信息的TextContent来实现这是一种简单的处理方式。更复杂的错误应该通过 JSON-RPC 的 error 响应来传递。4.3 启动 Server 主循环最后我们需要编写启动代码让 Server 运行起来并通过 stdio 监听请求。async def main(): # 使用 stdio 传输层运行 Server async with mcp.server.stdio.stdio_server() as (read_stream, write_stream): await app.run( read_stream, write_stream, mcp.server.models.InitializationOptions( server_namesystem-info-server, server_version0.1.0 ) ) if __name__ __main__: asyncio.run(main())这段代码创建了一个 stdio 通信通道并启动了 Server 的主事件循环。Server 会一直运行等待来自 stdin 的 Client 请求处理后将结果写入 stdout。5. 配置与调试让 Claude Desktop 识别你的 Server代码写好了但如何让 Claude Desktop 知道并加载我们这个 Server 呢这就需要配置文件。5.1 创建 Claude Desktop 的 MCP 配置文件Claude Desktop 在特定位置查找 MCP Server 的配置。这个位置因操作系统而异macOS:~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:%APPDATA%\Claude\claude_desktop_config.jsonLinux:~/.config/Claude/claude_desktop_config.json如果文件不存在就创建一个。我们需要在其中添加一个mcpServers配置项。{ mcpServers: { system-info: { command: /path/to/your/venv/python, args: [ /absolute/path/to/your/project/system_info_server.py ], env: { PYTHONPATH: /absolute/path/to/your/project } } } }关键配置解析”system-info“: 这是你给这个 Server 起的别名在 Claude 内部显示。command: 解释器的绝对路径。这里必须指向你虚拟环境中的python可执行文件。你可以通过which python(Linux/macOS) 或where python(Windows在激活的虚拟环境中) 来获取。args: 一个列表第一个元素就是你 Python 脚本的绝对路径。env: 可选环境变量。这里设置了PYTHONPATH确保脚本能正确导入项目内的其他模块如果有的话。实操心得路径错误是 MCP Server 加载失败的最常见原因。务必使用绝对路径尤其是在 Windows 上路径中的反斜杠\需要转义或使用正斜杠/。一个检查方法是在终端中手动运行commandargs的组合看脚本是否能正常启动并等待输入。5.2 重启 Claude Desktop 并验证保存配置文件后完全关闭并重启 Claude Desktop。重启后当你新建一个对话时Claude 应该会自动启动你配置的 MCP Server 进程。如何验证是否成功在 Claude 的输入框里尝试问“你能用什么工具” 或者 “What tools do you have access to?”如果配置成功Claude 会回复它已连接到你的 Server并列出get_system_info,get_system_usage,list_directory这三个工具。你可以进一步测试“请帮我看看当前系统的 CPU 和内存使用情况。” Claude 应该会调用get_system_usage工具并返回类似“CPU 使用率: 15.2% ...”的结果。5.3 使用 MCP Inspector 进行深度调试如果 Claude Desktop 没有正确加载工具或者调用工具没有反应光看 Claude 的界面很难定位问题。这时就需要MCP Inspector。首先修改你的 Claude 配置文件将 Server 的命令指向 Inspector而不是直接指向你的 Python 脚本。Inspector 会作为代理运行。{ mcpServers: { system-info: { command: npx, args: [ -y, modelcontextprotocol/inspector, /absolute/path/to/your/venv/python, /absolute/path/to/your/project/system_info_server.py ] } } }注意这要求你的系统安装了 Node.js 和 npm。npx -y会确保运行指定包的最新版本。重启 Claude Desktop。这次Claude 会启动 Inspector而 Inspector 会再去启动你的 Python Server。打开浏览器访问http://localhost:5173Inspector 的默认地址。你会看到一个 Web 界面里面实时显示了 ClaudeClient和你的 Server 之间所有的 JSON-RPC 请求和响应消息。通过 Inspector你可以清晰地看到初始化阶段Client 发送了initialize请求Server 回复了initialized通知。工具列表请求Client 发送了tools/list请求Server 回复了你定义的三个工具。工具调用阶段当你提问时Client 发送了tools/call请求里面包含了工具名和参数。Server 回复了tools/call响应里面包含了TextContent结果。任何错误如果协议格式不对、工具名错误等都会在这里显示为error响应。Inspector 是开发和调试 MCP Server 不可或缺的利器它能帮你精准定位是协议通信问题还是你的工具逻辑本身的问题。6. 进阶实践实现更复杂的工具掌握了基础之后我们可以尝试实现更实用、更复杂的工具这涉及到更精细的参数设计、异步操作和状态管理。6.1 设计一个带复杂参数的工具文件搜索假设我们想提供一个能在指定目录下根据文件名和内容进行搜索的工具。这个工具需要多个参数有些是必填有些是选填。首先在handle_list_tools函数中添加这个新工具的定义models.Tool( namesearch_files, description在指定目录及其子目录中搜索文件。支持按文件名和文件内容进行过滤。, inputSchema{ type: object, properties: { root_dir: { type: string, description: 搜索的根目录路径。 }, name_pattern: { type: string, description: 用于匹配文件名的通配符模式如 *.py, data_*.csv。可选。 }, content_keyword: { type: string, description: 需要搜索的文件内容关键词。如果提供将只搜索包含此关键词的文本文件。可选。 }, max_results: { type: integer, description: 返回的最大结果数量默认为 20。, default: 20 } }, required: [root_dir] # 只有 root_dir 是必须的 } )注意inputSchema的设计required字段明确了必填参数default字段为可选参数提供了默认值description字段要尽可能清晰这直接决定了 AI 是否会正确使用这个工具。然后在handle_call_tool函数中实现它elif name search_files: import os import fnmatch root_dir arguments[root_dir] name_pattern arguments.get(name_pattern) content_keyword arguments.get(content_keyword) max_results arguments.get(max_results, 20) if not os.path.isdir(root_dir): return [models.TextContent(typetext, textf错误{root_dir} 不是一个有效的目录。)] results [] try: for dirpath, dirnames, filenames in os.walk(root_dir): for filename in filenames: # 1. 按文件名过滤 if name_pattern and not fnmatch.fnmatch(filename, name_pattern): continue filepath os.path.join(dirpath, filename) # 2. 按内容过滤如果提供了关键词 if content_keyword: try: # 只尝试读取文本文件 with open(filepath, r, encodingutf-8, errorsignore) as f: content f.read() if content_keyword.lower() not in content.lower(): continue except (UnicodeDecodeError, IOError): # 无法以文本方式读取跳过内容检查 continue # 记录匹配的文件 results.append(filepath) if len(results) max_results: break if len(results) max_results: break except Exception as e: return [models.TextContent(typetext, textf搜索过程中发生错误: {str(e)})] if results: result_text f在 {root_dir} 下找到 {len(results)} 个文件:\n \n.join(results[:10]) # 只显示前10个 if len(results) 10: result_text f\n... 以及另外 {len(results)-10} 个文件。 else: result_text f在 {root_dir} 下未找到匹配条件的文件。 return [models.TextContent(typetext, textresult_text)]这个实现包含了递归遍历目录 (os.walk)、通配符匹配 (fnmatch)、文件内容读取和简单的错误处理。它是一个功能完整的文件搜索工具。6.2 实现异步工具与长时间运行任务有些工具操作可能比较耗时比如调用一个慢速的网络 API。MCP 支持异步操作。我们可以利用 Python 的asyncio库在工具函数中执行async操作避免阻塞主线程。假设我们有一个模拟的慢速网络查询工具import asyncio # ... 在 handle_list_tools 中添加工具定义 models.Tool( nameslow_network_query, description模拟一个耗时的网络查询操作。, inputSchema{ type: object, properties: { query: {type: string, description: 查询关键词}, delay_seconds: { type: number, description: 模拟的网络延迟时间秒, default: 3 } }, required: [query] } ) # ... 在 handle_call_tool 中添加处理函数 elif name slow_network_query: query arguments[query] delay arguments.get(delay_seconds, 3) # 使用 asyncio.sleep 模拟异步等待 await asyncio.sleep(delay) result_text f模拟查询 {query} 完成耗时 {delay} 秒。返回模拟结果相关数据若干。 return [models.TextContent(typetext, textresult_text)]只要你的工具函数是async的并且在其中使用了awaitMCP 框架就能很好地处理这种异步操作不会影响其他请求的处理。6.3 管理 Server 状态谨慎使用MCP Server 在设计上是无状态的每个请求理论上应该是独立的。但有时我们可能需要维护一些简单的状态比如缓存、计数器或者一个共享的数据库连接池。重要警告在 stdio 传输模式下Server 进程在 Claude Desktop 会话期间是常驻的。这意味着模块级的变量可以在多次工具调用间保持状态。但这并不是一个健壮的设计因为 Server 进程可能被意外终止重启。状态应尽可能避免或使用外部存储如文件、数据库。如果确实需要可以非常谨慎地使用全局变量# 在文件顶部定义一个简单的缓存字典 _request_cache {} app.call_tool() async def handle_call_tool(name: str, arguments: dict[str, Any]) - list[models.TextContent]: global _request_cache if name cached_operation: key str(arguments) if key in _request_cache: return [models.TextContent(typetext, textf缓存命中: {_request_cache[key]})] else: # 执行耗时计算 result do_heavy_computation(arguments) _request_cache[key] result return [models.TextContent(typetext, textf计算结果: {result})] # ... 其他工具处理再次强调这种内存状态是脆弱的仅适用于非关键数据的临时缓存。7. 安全、错误处理与最佳实践将本地工具暴露给 AI 使用安全是重中之重。同时健壮的错误处理能提供更好的用户体验。7.1 安全考量最小权限与输入净化最小权限原则你的 MCP Server 进程将以你的用户权限运行。确保它只能访问必要的文件和系统资源。避免实现诸如execute_shell_command执行任意 Shell 命令这样高风险的通用工具除非你有极强的输入验证和沙箱机制。输入验证与净化对所有来自 AI即 Client的输入参数进行严格的验证。路径遍历攻击像list_directory或search_files这样的工具必须检查directory_path或root_dir是否包含..等试图访问上级目录的字符。最好将其解析为绝对路径并限制在某个安全根目录下。import os def sanitize_path(user_path, safe_root): # 将用户输入转换为绝对路径 abs_path os.path.abspath(os.path.join(safe_root, user_path)) # 确保解析后的路径仍在安全根目录之下 if not abs_path.startswith(os.path.abspath(safe_root) os.sep): raise ValueError(访问路径超出允许范围。) return abs_path命令注入如果你的工具需要构造系统命令绝对不要使用字符串拼接而应使用subprocess.run的列表参数形式或使用shlex.quote进行转义。敏感信息不要在工具描述、返回结果中泄露敏感信息如绝对路径中的用户名、API密钥片段等。7.2 全面的错误处理良好的错误处理能让 AI 和最终用户理解发生了什么而不是得到一个晦涩的崩溃信息。参数验证错误在工具逻辑开始时检查参数返回友好的错误信息。if name search_files: root_dir arguments.get(root_dir) if not root_dir: return [models.TextContent(typetext, text错误缺少必要参数 root_dir。)] if not isinstance(root_dir, str): return [models.TextContent(typetext, text错误参数 root_dir 必须是字符串类型。)]业务逻辑错误使用try...except捕获工具执行中可能出现的异常如文件不存在、权限不足、网络超时并返回结构化的错误信息。try: # 可能失败的操作 result do_something_risky(arguments) except FileNotFoundError as e: return [models.TextContent(typetext, textf文件未找到错误: {str(e)})] except PermissionError as e: return [models.TextContent(typetext, textf权限不足: {str(e)})] except Exception as e: # 捕获其他未预见的异常避免 Server 崩溃 # 但注意不要泄露过多内部细节 return [models.TextContent(typetext, textf工具执行过程中发生意外错误。)]使用 JSON-RPC 错误响应对于严重的、协议层面的错误如工具不存在、参数格式非法更好的做法是抛出异常让 MCP 框架将其转换为标准的 JSON-RPC error 响应。这需要更底层的控制在简单示例中我们返回错误文本也是可接受的。7.3 性能优化与工具设计建议工具粒度要适中不要设计一个“瑞士军刀”式的巨型工具。工具应该职责单一、功能明确。例如将“文件搜索”和“文件内容替换”分成两个独立工具而不是一个“文件操作”工具。描述要清晰具体工具的name和description是 AI 理解其功能的关键。使用动词开头如get_,search_,calculate_描述要说明输入、输出和副作用。Schema 定义要精确充分利用 JSON Schema 的特性。为数值参数设置minimum/maximum为字符串参数设置pattern正则表达式或enum枚举值这能极大提高 AI 调用工具的准确性。考虑分页与流式响应对于可能返回大量结果的工具如搜索设计offset和limit参数。MCP 协议也支持 Server 主动推送部分结果Progress Notifications对于长时间任务非常有用但这属于更高级的用法。编写工具使用示例在 Server 的初始化信息或一个特殊的get_instructions工具中提供一些工具的使用示例可以帮助 AI 更好地理解在什么场景下调用哪个工具。8. 部署、分享与生态集成开发调试完成后你可能希望将你的 MCP Server 分享给团队成员或者集成到更广泛的 AI 工具链中。8.1 打包与分发最简单的分享方式就是共享代码和配置文件。但为了更专业可以考虑打包使用pyproject.toml管理依赖创建一个标准的 Python 项目文件列出mcp和psutil等依赖。制作可执行入口点在pyproject.toml中配置[project.scripts]例如[project.scripts] system-info-mcp-server “my_mcp_package.main:main“这样用户安装你的包后可以直接通过命令system-info-mcp-server来启动 Server。发布到 PyPI如果你开发了一个通用、有价值的工具 Server例如连接公司内部 JIRA 或 Confluence 的 Server可以将其打包发布到 PyPI让更多人通过pip install来使用。8.2 集成到其他 AI 客户端除了 Claude Desktop其他支持 MCP 的客户端也可以使用你的 ServerCursor IDECursor 也支持 MCP。其配置方式类似需要在 Cursor 的设置中指定 MCP Server 的命令行参数。自定义 AI 应用如果你在开发自己的 AI 应用可以使用 MCP 的 Client SDK如mcp client库来动态加载和调用这些 Server从而快速为你的应用赋予工具使用能力。8.3 探索 MCP 生态系统Anthropic 维护了一个官方的 MCP Server 示例库。社区也在不断贡献新的 Server例如文件系统操作更安全的文件浏览、编辑。数据库连接查询 MySQL、PostgreSQL、SQLite。云服务与 AWS、GitHub、Slack 等服务的 API 交互。开发工具集成 Git、Docker、Kubernetes。研究这些开源项目是学习最佳实践、获取灵感的绝佳途径。你可以基于它们进行二次开发快速满足自己的特定需求。将任意工具变成 AI 的能力通过 MCP 协议级实践我们看到的不仅仅是一个技术实现更是一种思维方式的转变。它促使我们以“AI 可理解、可调用”为标准来重新设计和封装我们的工具最终构建出一个高度模块化、可组合的智能工具网络。从今天这个简单的系统信息查询 Server 开始你可以尝试将工作中那些重复、繁琐的操作包装起来让 AI 成为你得力的自动化助手。