Skip to main content
Glama
print-yuhuan

qq-mcp-server

by print-yuhuan

QQ-MCP-Server

把已登录的 NapCatQQ 机器人封装成 MCP Streamable HTTP 服务,让 Codex、Claude Desktop、Cursor、Cline、Cherry Studio 等客户端安全调用 QQ 能力。

Python MCP NapCatQQ Tools Deploy License


项目简介

QQ-MCP-Server 是一个轻量级 Python MCP 后端。它对外提供 MCP Streamable HTTP 接口,对内调用你已经部署好的 NapCatQQ OneBot HTTP API,从而让 MCP 客户端读取 QQ 机器人状态、群/好友列表、聊天记录,并执行发送消息、群禁言等操作。

本项目只负责 MCP 服务本身,不负责安装、登录、维护 NapCatQQ。

MCP Client
  └─ Streamable HTTP / JSON-RPC
     └─ QQ-MCP-Server
        └─ OneBot HTTP
           └─ NapCatQQ
              └─ QQ

Related MCP server: WhatsApp MCP Stream

目录

功能亮点

  • 标准 MCP Streamable HTTP:基于 JSON-RPC over HTTP,适配常见 MCP 客户端。

  • 三种客户端鉴权方式Authorization: BearerX-API-Key?token=

  • NapCatQQ OneBot HTTP 封装:统一处理 token、超时、HTTP 错误和 OneBot API 错误。

  • 12 个 MCP 工具:覆盖机器人状态、群/好友列表、群成员、禁言列表、群/私聊历史、发送/撤回消息、群管理。

  • 统一响应结构:所有工具返回 { "ok": true, "data": ... }{ "ok": false, "error": ... }

  • 部署友好:支持 .env 本地运行,也提供 deploy.sh 和 systemd 部署方案。

环境要求

组件

要求

Python

3.10+

MCP 传输

Streamable HTTP

NapCatQQ

已登录 QQ,并启用 OneBot HTTP Server

NapCat 消息格式

建议使用 Array

系统部署

Linux + systemd 推荐

NapCatQQ 资料:

Linux 一键部署

推荐在 Linux 云服务器上使用 deploy.sh。脚本会检查 Python、创建虚拟环境、安装依赖、生成配置、安装 systemd 服务并启动健康检查。

curl -O https://raw.githubusercontent.com/print-yuhuan/QQ-MCP-Server/refs/heads/main/deploy.sh
bash deploy.sh

已经克隆仓库时:

cd QQ-MCP-Server
bash deploy.sh

常用参数:

bash deploy.sh --no-start
bash deploy.sh --user appuser
bash deploy.sh --dir /opt/QQ-MCP-Server

脚本重复运行是安全的:已有配置不会被覆盖,源码和依赖会更新,服务会重启加载新代码。

快速开始

1. 安装

git clone <YOUR_REPO_URL> QQ-MCP-Server
cd QQ-MCP-Server

python3 -m venv .venv
source .venv/bin/activate

pip install -e .

Windows PowerShell:

git clone <YOUR_REPO_URL> QQ-MCP-Server
cd QQ-MCP-Server

python -m venv .venv
.\.venv\Scripts\Activate.ps1

pip install -e .

2. 配置

cp .env.example .env

编辑 .env,至少填入:

QQ_MCP_ACCESS_TOKEN=<MCP_ACCESS_TOKEN>
NAPCAT_BASE_URL=http://<NAPCAT_HOST>:<NAPCAT_PORT>
NAPCAT_ACCESS_TOKEN=<NAPCAT_ACCESS_TOKEN>

如果 QQ-MCP-Server 和 NapCat 在同一台宿主机,并且 NapCat HTTP 端口已经暴露到宿主机,可使用:

NAPCAT_BASE_URL=http://127.0.0.1:<NAPCAT_PORT>

如果 NapCat 在 Docker 容器内但没有把 HTTP 端口映射到宿主机,127.0.0.1 指向的是宿主机本身,不是容器内部。此时请使用已映射的宿主机端口、容器网络地址,或把 MCP 服务部署到同一 Docker 网络中。

3. 启动

python -m qq_mcp_server

或使用安装后的命令:

QQ-MCP-Server

默认端点:

http://<HOST>:8888/mcp

健康检查:

http://<HOST>:8888/health

MCP 客户端配置

下面示例均使用占位符。请将 <HOST><PORT><MCP_ACCESS_TOKEN> 替换为你的真实配置。

Authorization Bearer

{
  "mcpServers": {
    "QQ-MCP-Server": {
      "type": "streamable-http",
      "url": "http://<HOST>:<PORT>/mcp",
      "headers": {
        "Authorization": "Bearer <MCP_ACCESS_TOKEN>"
      }
    }
  }
}

X-API-Key

{
  "mcpServers": {
    "QQ-MCP-Server": {
      "type": "streamable-http",
      "url": "http://<HOST>:<PORT>/mcp",
      "headers": {
        "X-API-Key": "<MCP_ACCESS_TOKEN>"
      }
    }
  }
}

Query Token

需显式开启 QQ_MCP_ENABLE_QUERY_TOKEN=true(默认关闭)。注意 ?token= 会把 token 暴露在访问日志 / 反向代理 / 浏览器历史中(CWE-598),优先使用 Authorization: Bearer

{
  "mcpServers": {
    "QQ-MCP-Server": {
      "type": "streamable-http",
      "url": "http://<HOST>:<PORT>/mcp?token=<MCP_ACCESS_TOKEN>"
    }
  }
}

配置项

变量

必填

默认值

说明

QQ_MCP_HOST

0.0.0.0

MCP 服务监听地址。0.0.0.0 绑定所有网卡(公网可达,请配防火墙);仅本机访问设 127.0.0.1

QQ_MCP_PORT

8888

MCP 服务监听端口(1–65535)。

QQ_MCP_PATH

/mcp

MCP Streamable HTTP 路径。不可设为 /health(保留给健康检查)。

QQ_MCP_ACCESS_TOKEN

-

MCP 客户端访问 token。不接受 <...> 占位符。

QQ_MCP_ENABLE_QUERY_TOKEN

false

是否允许 ?token= 鉴权。默认关闭以防 token 进日志(CWE-598)。

NAPCAT_BASE_URL

-

NapCat OneBot HTTP API 基础 URL。不接受 <...> 占位符。

NAPCAT_ACCESS_TOKEN

NapCat OneBot HTTP token。

NAPCAT_TIMEOUT_SECONDS

30

单次 NapCat 请求超时时间(秒,支持小数,须 > 0)。

QQ_MCP_LOG_LEVEL

INFO

DEBUGINFOWARNINGERRORCRITICAL;非法值启动即报错。

QQ_MCP_LOG_MESSAGE_CONTENT

false

是否记录发送消息正文。生产环境建议关闭。

QQ_MCP_MAX_MESSAGE_CHARS

5000

单条发送文本最大字符数。

QQ_MCP_ALLOW_RICH_MEDIA

false

是否允许 image/record/video/file 等富媒体段。默认关闭以防 SSRF / 本地文件读取。

QQ_MCP_DEFAULT_HISTORY_COUNT

5

默认历史消息条数。

QQ_MCP_MAX_HISTORY_COUNT

1000

单次允许拉取的最大历史消息条数。

工具一览

工具只查询数据; 工具会真实发送消息或修改 QQ 群状态。

工具

类型

参数

用途

qq_get_bot_status

获取机器人在线状态、QQ 号、昵称。

qq_list_groups

列出机器人已加入的群。

qq_list_friends

列出机器人好友。

qq_get_group_members

group_id

获取指定群成员列表。

qq_get_group_banned_members

group_id

列出群内当前被禁言的成员及禁言到期时间。

qq_get_group_messages

group_idcountstart_message_seqreverse_orderparse_forward

拉取指定群聊天记录。

qq_get_private_messages

user_idcountstart_message_seqreverse_orderparse_forward

拉取指定好友私聊记录。

qq_send_group_message

group_idmessage

向指定群发送消息,支持 @ 提醒。

qq_send_private_message

user_idmessage

向指定好友发送私聊消息。

qq_delete_message

message_id

撤回一条消息(机器人自己发的,或作为管理员撤回他人消息)。

qq_set_group_ban

写 / 高风险

group_iduser_idduration

禁言或解禁群成员,duration=0 表示解禁。

qq_set_group_whole_ban

写 / 高风险

group_idenable

开启或关闭全员禁言。

发送消息工具说明:

  • qq_send_group_message / qq_send_private_messagemessage 参数支持两种写法:

    • 字符串:纯文本即可,同时支持 CQ 码。例如 "[CQ:at,qq=123] 早点睡" 会解析出真正的 @ 提醒。

    • 消息段数组:OneBot 消息段列表,例如 [{"type": "at", "data": {"qq": "123"}}, {"type": "text", "data": {"text": " 早点睡"}}]

  • @ 全体成员使用 {"type": "at", "data": {"qq": "all"}}

  • 文本部分合计长度受 QQ_MCP_MAX_MESSAGE_CHARS(默认 5000)限制。

撤回工具说明:

  • qq_delete_messagemessage_id 可来自发送工具的返回值,或从群/私聊历史记录中获取。

  • 机器人只能撤回自己发送的消息;撤回他人消息需要在目标群具备管理员权限。

  • message_id 仅校验为整数(不同 OneBot 实现允许负数),是否存在由 NapCat 判定,失败会返回 NAPCAT_API_ERROR

  • 返回里的 recalled: true 表示 NapCat 已受理该撤回请求,并不二次校验消息是否真的从客户端消失。

历史工具说明:

  • count 默认取 QQ_MCP_DEFAULT_HISTORY_COUNT

  • count 不能超过 QQ_MCP_MAX_HISTORY_COUNT

  • start_message_seq 会映射到 NapCat 的 message_seq

  • reverse_order 会映射到 NapCat 的 reverseOrder

  • parse_forward=true 时会尝试解析合并转发消息。

群管理工具说明:

  • qq_set_group_banqq_set_group_whole_ban 会真实修改群管理状态。

  • 机器人必须在目标群具备管理员权限,否则 NapCat 会返回失败。

  • qq_get_group_banned_members 为只读工具,返回当前被禁言成员;每条记录的 shut_up_time 是禁言到期的 Unix 秒级时间戳。

返回结构

成功:

{
  "ok": true,
  "data": {}
}

失败:

{
  "ok": false,
  "error": {
    "code": "NAPCAT_REQUEST_FAILED",
    "message": "Could not reach the NapCat HTTP server",
    "detail": {}
  }
}

错误码:

错误码

含义

MCP_AUTH_FAILED

MCP HTTP 鉴权失败。

INVALID_PARAMS

参数缺失、类型错误或格式不合法。

MESSAGE_TOO_LONG

发送文本超过 QQ_MCP_MAX_MESSAGE_CHARS

INVALID_DURATION

禁言时长不是非负整数。

NAPCAT_REQUEST_FAILED

NapCat 不可达、超时、HTTP 状态异常或响应不是 JSON。

NAPCAT_AUTH_FAILED

NapCat 拒绝 OneBot token。

NAPCAT_API_ERROR

NapCat API 返回失败,例如群号错误、好友不存在、机器人离线、权限不足。

INTERNAL_ERROR

服务端未预期异常。

验证服务

健康检查

curl -i "http://<HOST>:<PORT>/health"

预期返回:

{
  "ok": true,
  "service": "QQ-MCP-Server",
  "version": "0.1.0"
}

MCP initialize

调试底层 MCP Streamable HTTP 时必须带上 Accept: application/json, text/event-stream

curl -i "http://<HOST>:<PORT>/mcp" \
  -H "Authorization: Bearer <MCP_ACCESS_TOKEN>" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"curl","version":"test"}}}'

预期结果:

  • HTTP 状态码为 200

  • Content-Typeapplication/jsontext/event-stream

  • 响应内容包含 JSON-RPC initialize 结果。

如果返回 401,优先检查 MCP token、请求头名称和 QQ_MCP_ENABLE_QUERY_TOKEN

systemd 手动部署

假设项目位于 /root/QQ-MCP-Server

cd /root/QQ-MCP-Server
python3 -m venv .venv
.venv/bin/pip install -e .

cp deploy/QQ-MCP-Server.env.example /root/QQ-MCP-Server/QQ-MCP-Server.env
chmod 600 /root/QQ-MCP-Server/QQ-MCP-Server.env
nano /root/QQ-MCP-Server/QQ-MCP-Server.env

cp deploy/QQ-MCP-Server.service /etc/systemd/system/QQ-MCP-Server.service
systemctl daemon-reload
systemctl enable --now QQ-MCP-Server.service

服务管理:

systemctl status QQ-MCP-Server.service
systemctl restart QQ-MCP-Server.service
systemctl stop QQ-MCP-Server.service
systemctl start QQ-MCP-Server.service
journalctl -u QQ-MCP-Server.service -f

如果安装目录不是 /root/QQ-MCP-Server,请同步修改 unit 文件中的 WorkingDirectoryEnvironmentFileExecStart

安全建议

  • 使用足够长的随机 QQ_MCP_ACCESS_TOKEN

  • 不要把 .envQQ-MCP-Server.env、真实 token、真实 QQ 号或真实群号提交到公开仓库。

  • NapCat HTTP Server 应启用自身 token,本服务会通过 Authorization: Bearer 调用它。

  • 不需要公网直连 NapCat 时,不建议开放 NapCat HTTP 端口。

  • 服务默认监听 0.0.0.0(所有网卡,公网可达),务必配置防火墙 / 安全组;仅本机使用时设 QQ_MCP_HOST=127.0.0.1

  • ?token= 方式会把 token 暴露在代理日志、浏览器历史或服务日志中(CWE-598),默认已关闭;确需开启再设 QQ_MCP_ENABLE_QUERY_TOKEN=true,并优先用 Authorization: Bearer

  • 默认不要记录消息正文;仅在可信测试环境临时启用 QQ_MCP_LOG_MESSAGE_CONTENT=true

  • qq_send_*qq_set_group_* 是真实写操作,只应暴露给可信 MCP 客户端。

  • 当消息内容可能来自不可信来源(群消息 / LLM 输出)时,保持 QQ_MCP_ALLOW_RICH_MEDIA=false,避免富媒体段被用于 SSRF / 本地文件读取。

  • 生产环境建议通过反向代理启用 HTTPS,并使用防火墙或安全组限制访问来源。

开发与测试

安装开发依赖:

pip install -e ".[dev]"

运行测试:

pytest

运行本地 MCP initialize smoke:

python tests/smoke_initialize.py

测试使用假 token、假 URL 和 mock NapCat 响应,不需要真实 QQ、真实 NapCat 或公网网络。

常见问题

NapCat 在 Docker 容器内,为什么 127.0.0.1:<PORT> 不通?

127.0.0.1 总是指当前进程所在的网络命名空间。若 QQ-MCP-Server 跑在宿主机,127.0.0.1:<PORT> 指向宿主机端口;如果 NapCat 只在容器内监听且没有端口映射,宿主机访问会失败。

可选方案:

  • 给 NapCat 容器映射 HTTP 端口,例如 -p <HOST_PORT>:<CONTAINER_PORT>

  • QQ-MCP-Server 和 NapCat 加入同一个 Docker 网络,并使用容器名访问。

  • 在宿主机上把 NAPCAT_BASE_URL 配成可达的容器网络地址。

为什么 MCP initialize 需要 Accept 请求头?

Streamable HTTP 传输允许 JSON 和事件流响应。调试请求应显式带上:

Accept: application/json, text/event-stream

缺少该请求头时,部分 MCP 实现会拒绝或无法正确协商响应格式。

群管理工具返回权限不足怎么办?

确认机器人在目标群内,并且具备管理员或群主权限。NapCat 会把 QQ 侧权限不足、成员不存在、群不存在等结果返回为 API 错误,本服务会统一包装为 NAPCAT_API_ERROR

许可证

本项目基于 MIT 许可证发布。

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

No tool schema history has been recorded yet.

Maintenance

ActivityInactive
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    An MCP server that enables AI clients to send and receive QQ messages through NapCatQQ (OneBot v11) for both private and group chats. It supports message context management, real-time WebSocket listening, and human-like typing simulation.
    7
    25
    MIT
  • A
    license
    B
    quality
    C
    maintenance
    An MCP server that enables interaction with WhatsApp using the Baileys library and Streamable HTTP transport. It supports managing contacts, chats, and messages, while providing a web admin UI for QR code authentication and media handling.
    28
    5
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    QQ MCP Server with Auto-Wake, message send/receive, group management, file sharing, and timed tasks. Connects via NapCatQQ (OneBot v11). One-click setup with quickstart.ps1.Based on Amadeus-QQ-MCP.
    33
    3
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/print-yuhuan/qq-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server