本篇目录
MCP这个概念出来很久了,当时给Trae装了个PlayWright MCP 操作浏览器,现在看Trae、Buddy、Qoder这几个编程智能体客户端都有MCP市场可以装它了。MCP是什么呢?我认为它是一种基于通信的服务方式,不同的MCP服务就是不同的“能力”,AI调用MCP就是给不同的MCP服务“打电话/视频”,打电话的内容需要按MCP的说明来,AI打完电话就是等MCP的返回结果了,不需要AI自己有操纵现实的能力。或者这么比方 如果AI 是“人”,某个MCP 服务是“智能家居”,人想要控制智能家具就需要 按规则对“小爱”说出指令,“小爱 打开客厅空调、打开卧室灯……”,AI 也是一样的连接MCP的时候就会阅读使用说明以及支持的工具,有需要的时候就发送指令文本来调用,MCP有结果了就会返回。
要开发一个MCP到底难不难呢?在这个AI时代你可以把任何问题交给它,不要低估它的能力、也不要太高估它的能力,下面跟我来看下怎么开发第一个MCP吧。
一、一时兴起开发的MCP功能
我的想法很简单,开发一个MCP可以实现电脑屏幕截图、执行cmd命令,直接给Qoder、OpenCode发了同样的指令。
我想开发一个本地MCP服务 给AI 智能体调用, 这个mcp服务提供 屏幕全屏截图、执行cmd命令 这个两种功能,全屏截图 会全屏截图后把图片保存到 调用时传的路径,执行cmd命令就是 直接把调用时传的命令直接执行。
上面图片是Qoder 开发后的python形式的mcp服务,下图是OpenCode 开发后的python形式的mcp服务,一次开发完成python程序本身没啥问题,主要是配置到AI智能体中以便调用。

OpenCode写的代码只有40行,比Qoder生成的快,但是感觉不够标准,而且工具description也缺少不够详细。
# mcp_server.pyimport subprocessfrom PIL import ImageGrabfrom mcp.server.fastmcp import FastMCP mcp = FastMCP("local-tools") @mcp.tool()def screenshot(save_path: str) -> str: """全屏截图并保存到指定路径""" img = ImageGrab.grab() img.save(save_path) return f"截图已保存到: {save_path}" @mcp.tool()def execute_command(command: str) -> str: """执行CMD命令并返回结果""" try: result = subprocess.run( command, shell=True, capture_output=True, text=True, encoding="gbk", timeout=30 ) output = "" if result.stdout: output += result.stdout if result.stderr: output += result.stderr if result.returncode != 0: output += f"\nExit code: {result.returncode}" return output if output else "(无输出)" except subprocess.TimeoutExpired: return "命令执行超时(30秒)" except Exception as e: return f"执行失败: {e}" if __name__ == "__main__": mcp.run(transport="stdio")Qoder写的比较详细 但是用了4分钟(OpenCode写了 31秒),这两个都是选的DeepSeek-V4-Flash模型。
"""MCP 本地工具服务器====================提供两个工具供 AI 智能体调用: 1. screenshot - 全屏截图并保存到指定路径 2. execute_command - 执行 CMD 命令并返回结果 用法: python server.py # 启动 stdio 模式(默认) python server.py --sse # 启动 SSE HTTP 模式""" import argparseimport subprocessimport sysfrom pathlib import Path from mcp.server.fastmcp import FastMCP # ── 创建 MCP 服务器实例 ─────────────────────────────────server = FastMCP( "local-tools", instructions="提供全屏截图和 CMD 命令执行的本地工具",) # ── Tool 1: 全屏截图 ───────────────────────────────────@server.tool( description="Capture a full-screen screenshot and save it to the specified file path. " "Supported formats: PNG, JPG, BMP, GIF. The parent directory must exist.",)def screenshot(save_path: str) -> str: """ 全屏截图,保存到 save_path 指定的路径。 Args: save_path: 截图保存的完整路径,例如 C:\\Users\\xxx\\screenshot.png Returns: 成功消息或错误信息 """ try: from PIL import ImageGrab path = Path(save_path) # 确保父目录存在 path.parent.mkdir(parents=True, exist_ok=True) # 全屏截图 img = ImageGrab.grab(all_screens=True) img.save(path) return f"[OK] Screenshot saved to: {path.resolve()}" except ImportError: return "[ERROR] Pillow library not found. Run: pip install pillow" except Exception as e: return f"[ERROR] Screenshot failed: {e}" # ── Tool 2: 执行 CMD 命令 ───────────────────────@server.tool( description="Execute a CMD command on the local Windows machine and return its output. " "The command runs via cmd.exe with shell=True. " "Timeout is 60 seconds by default.",)def execute_command(command: str, timeout: int = 60) -> str: """ 在本地 Windows 上执行一条 CMD 命令并返回输出。 Args: command: 要执行的命令字符串 timeout: 超时秒数(默认 60) Returns: 命令的标准输出、标准错误及返回码 """ try: result = subprocess.run( command, shell=True, capture_output=True, text=True, timeout=timeout, encoding="utf-8", errors="replace", ) parts = [] if result.stdout: parts.append(f"[STDOUT]\n{result.stdout.rstrip()}") if result.stderr: parts.append(f"[STDERR]\n{result.stderr.rstrip()}") parts.append(f"[EXIT_CODE] {result.returncode}") return "\n\n".join(parts) except subprocess.TimeoutExpired: return f"[ERROR] Command timed out ({timeout}s)" except Exception as e: return f"[ERROR] Command execution failed: {e}" # ── 启动入口 ──────────────────────────────def main(): parser = argparse.ArgumentParser(description="MCP 本地工具服务器") parser.add_argument( "--sse", action="store_true", help="以 SSE HTTP 模式启动(默认使用 stdio)", ) parser.add_argument("--host", default="127.0.0.1", help="SSE 模式监听地址") parser.add_argument("--port", type=int, default=8000, help="SSE 模式监听端口") args = parser.parse_args() if args.sse: print(f"[MCP Server] SSE mode: http://{args.host}:{args.port}/sse", file=sys.stderr) server.run(transport=f"sse://{args.host}:{args.port}") else: print("[MCP Server] stdio mode starting...", file=sys.stderr) server.run(transport="stdio") if __name__ == "__main__": main()二、在CodeBuddy中配置MCP
为什么开发MCP用的AI智能体不对接新开发的MCP 而是用CodeBuddy呢? Qoder Work版本不支持配置MCP,还剩500点活动额度这个额度跟Qoder CN又不通用配置上去也没AI点数用不了! OpenCode我用的是桌面版,好像也不支持MCP,又不想重新下载终端版,最后就只能选现成的CodeBuddy(而且最近选腾讯Hy3模型还免费哦)
升级到最新的CodeBuddy,右上角 – 设置 – MCP – 添加配置MCP。不同AI智能体里面配置MCP的方式可能不一样,我一开始是复制OpenCode给的推荐配置但是报错了,把错误复制给AI重新生成了就可以使用了,保存后记得“我的MCP”右边的开关打开 指示点变成绿色才生效。开启MCP会增加token消耗,如果不是必要建议按需求开启!
{ "mcpServers": { "local-tools": { "type":"stdio", "enabled":true, "command": "python", "args": ["C:\\Users\\Administrator\\Desktop\\MCP\\mcpTestOP\\mcp_server.py"] } }}
我在OpenCode桌面版的opencode.jsonc配置文件里面也尝试配置了但是没办法用,提示要在桌面版连接才能用但是根本没找到入口,遂放弃。
{ "$schema": "https://opencode.ai/config.json", "mcp":{ "local-tools": { "type":"local", "enabled":true, "command": "python", "args": ["C:\\Users\\Administrator\\Desktop\\MCP\\mcpTestOP\\mcp_server.py"] } }}
三、首次MCP测试体验
连接完毕后就是测试MCP了,可能是截图和执行命令 这两个指令太平常了,AI自己本身调用工具就能完成导致没有调用MCP来执行,前面测试几次都没有调用mcp 后面改成英文或指定mcp才进行调用。
1、顺利调用MCP的截图能力
先选择目前还限时免费的Hy3大模型,然后发 全屏截图 就会自动调用MCP截图了,点击mcp调用过程可以看到AI传递的参数信息。

2、不顺利的cmd指令执行
大概率是因为现在AI智能体原生支持调用shell、cmd,所以导致我让执行指令都优先执行内置工具了(前面试了3次都没调用MCP)。

最后我直接在指令里面指明MCP调用才好,如下图可见“使用mcp 执行命令 打开计算器”AI就知道调用mcp,以及把“打开计算器”这个指令对应出了 calc 这个指令。

四、个人还能开发哪些MCP?
通过上面的例子相信大家都了解了MCP基本的开发及对接实现了,如果有MCP 需求可以先在AI智能体客户端的MCP市场看看有没有需要的,如果没有也可以找找网上的尽量避免重复造轮子。
(下图左为CodeBuddy MCP市场,右图为Qoder MCP广场)

上面例子是使用python开发的,其实C#等都可以开发MCP,你只需要让AI开发MCP的时候指定下语言,一般开发成http服务来提供MCP能力,它的好处是你可以把key、账号密码等敏感数据封装在MCP服务里面,这样AI智能体只管调用根本接触不到敏感信息。大概想一想个人的话开发下面这些MCP还是可以的:
1、sql-mcp: 获取mcp连接的数据库的所有表信息、表结构、存储过程(让AI看懂项目数据库,分析sql性能)2、api-mcp: 调用mcp服务集成的api接口(比如查天气、创建待售商品、查订单、调用生图模型返图)3、exe-mcp:操作电脑程序(结束进程、打开程序、执行自动化脚本)4、com-mcp:操作串口/外设硬件(烧录程序、控制下位机)最后:MCP给了AI操作其他场景的能力,要注意限制权限及安全防护,自己开发的MCP别被人、被AI滥用。还有现在好像更流行CLI化……
发表评论