怎么开发第一个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服务 给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")
"""
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指令执行

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

四、个人还能开发哪些MCP?

通过上面的例子相信大家都了解了MCP基本的开发及对接实现了,如果有MCP 需求可以先在AI智能体客户端的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化……

染卷

本站文章也会定期同步到微信公众号,可以关注下避免错过~

建站 11年 319天
微信公众号

发表评论