怎么开发第一个MCP?AI的事交给AI好了
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.py
import subprocess
from PIL import ImageGrab
from 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 argparse
import subprocess
import sys
from 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化……
发表评论