Xadeus-QQ-MCP
Xadeus-QQ-MCP connects AI agents to QQ via NapCatQQ (OneBot v11), enabling messaging, group management, automated wake, and scheduling workflows.
💬 Messaging
Send text (with splitting and optional reply wait), images (base64), voice (auto-converted to SILK), and files from URLs to groups or private chats
Wait for replies without sending a message; recall bot-sent messages
📜 Chat Context & History
Retrieve recent messages for one or multiple groups/friends from the in-memory buffer
Render iPhone-style dark mode chat screenshots (base64 PNG)
Compress/archive old messages into summaries to free buffer space
🔔 Auto-Wake System
Add/remove/list wake rules that automatically activate the AI agent window when incoming QQ messages match keywords or target IDs
Enable/disable rules individually or all at once; lock/unlock wake pending state to prevent duplicates
Configure target window title patterns and focus shortcut; diagnose, test, and debug the wake pipeline
⏰ Timer / Scheduler
Add scheduled wake tasks using cron expressions or fixed intervals (with optional one-shot mode); list and remove timers
👥 Group Management
List joined groups and members (with roles, join times, nicknames); get detailed member info
Mute/unmute, kick members, set group nicknames, and send group announcements
🔧 System & Status
Check QQ login and NapCat connection health; list all bot account friends
Xadeus-QQ-MCP
Built by a 15-year-old developer, based on Amadeus-QQ-MCP.
QQ MCP (Model Context Protocol) Server — connects to QQ via NapCatQQ (OneBot v11), giving AI agents direct control over QQ (send/receive messages, group management, auto-wake on incoming messages, and more).
Features
Feature | Description |
Auto-Wake | Incoming QQ messages matching rules trigger the AI agent window automatically. Cross-platform — Windows (keybd_event), macOS (osascript+pbcopy), Linux (xdotool+xclip). Supports any client — opencode, Cursor, Claude Desktop, Windsurf — configure via |
Dedup Lock | Prevents duplicate wake during processing. Unlock manually when done |
Persistent Rules | Wake rules saved to |
|
|
Group Moderation | Mute, unmute, kick, set card, send notices |
File Sending | Send any file from URL to QQ groups/private chats |
Message Recall | Recall bot-sent messages |
Timer Scheduler | Cron or interval-based timed wake |
One-Click Setup | Auto-detect NapCat, configure ports, update agent configs |
Related MCP server: kimi-bridge
Architecture
QQ ←→ NapCat (OneBot v11)
↓ WebSocket :3001 / HTTP :3000
Xadeus-QQ-MCP (Python MCP Server)
↓ MCP Protocol
AI Agent (opencode / Cursor / Claude / ...)Quick Start
Prerequisites
Install NapCat.Shell and QQ
Configure NapCat OneBot v11 (WebSocket :3001, HTTP :3000)
One-Click Setup (Recommended)
.\quickstart.ps1 -qq 你的QQ号Auto-detects NapCat, configures HTTP:3000/WS:3001, creates Python venv, writes QQ_OVERRIDE, generates NapCat start script, sets window wake patterns.
Options:
.\quickstart.ps1 -qq 123456 -windowTitle "OC,opencode,cmd" # Custom window patterns
.\quickstart.ps1 -configFile config.json # Config file mode
.\quickstart.ps1 -restart # Kill stale MCP + wait for recoveryDefault -windowTitle: OC,opencode,Administrator,cmd,管理员
(comma-separated substrings, matched case-insensitively against window titles)
Also available via Python:
python setup.py # Interactive mode
python setup.py --qq YOUR_QQ --fast # Non-interactiveManual Setup
git clone https://github.com/mouse114514/Xadeus-QQ-MCP
cd Xadeus-QQ-MCP
# Virtual env
uv venv
uv sync
# Start MCP Server
uv run python -m qq_agent_mcp --qq YOUR_QQConfigure Your AI Agent
Important: The
QQ_OVERRIDEenvironment variable before starting your agent:$env:QQ_OVERRIDE = "YOUR_QQ"Or edit the fallback value in
src/qq_agent_mcp/__main__.py:QQ_OVERRIDE.This works around AI agents that cache the MCP command at startup and ignore subsequent config file changes.
opencode — edit ~/.config/opencode/opencode.json:
{
"mcp": {
"qq-agent": {
"type": "local",
"command": [
"C:\\path\\.venv\\Scripts\\python.exe",
"-m", "qq_agent_mcp",
"--qq", "YOUR_QQ"
],
"enabled": true,
"timeout": 120000
}
}
}Cursor / Claude Desktop / Windsurf — edit the respective MCP config file:
{
"mcpServers": {
"qq-agent": {
"command": "C:\\path\\.venv\\Scripts\\python.exe",
"args": ["-m", "qq_agent_mcp", "--qq", "YOUR_QQ"],
"enabled": true
}
}
}Or just run python setup.py — it detects all installed agents automatically.
Wake Target Configuration
Use set_wake_config to bind to any AI agent window:
{
"window_title_patterns": ["opencode", "cursor", "claude"],
"focus_shortcut": "ctrl+l"
}Saved to src/qq_agent_mcp/wake_config.json.
MCP Tools
Messaging
Tool | Description |
| Send text with segmentation and optional reply wait |
| Send image (base64) |
| Send voice (base64) |
| Wait for new messages |
Context & History
Tool | Description |
| Recent messages for a group/friend |
| Batch query multiple targets |
| Render chat screenshot (iPhone dark mode style) |
| Archive old messages to summary |
Wake System
Tool | Description |
| Add auto-wake rule (group/private + keywords) |
| Remove wake rule by index |
| List all wake rules |
| Lock/unlock wake to prevent duplicates |
| Enable/disable all or specific rules |
| Configure target window and focus shortcut |
| View current wake config |
| Debug wake monitor state |
Group Management
Tool | Description |
| List joined groups |
| List group members |
| Get member details |
| Mute a member |
| Unmute a member |
| Kick a member |
| Set group nickname |
| Send group notice |
System
Tool | Description |
| Check QQ and NapCat connection |
| List friends |
| Recall bot message |
| Send file from URL |
| Add scheduled wake (cron/interval) |
| Remove timer |
| List all timers |
Known Issues & Workarounds
Issue | Cause | Workaround |
MCP won't restart after crash/kill | opencode has restart backoff; after ~3 kills it stops retrying | Restart your AI agent, or |
Two MCP processes always appear | FastMCP stdio transport spawns parent+child chain | Named mutex prevents duplicate typing (built-in fix) |
Config changes ignored after editing | opencode caches MCP command at startup | Restart opencode, or use |
Wake message doubled | Both processes try to type simultaneously | Fixed via Windows named mutex ( |
Messages from same QQ ignored |
| Removed in current build |
Wake won't fire even with matching rule | Lock ( | Auto-unlock after 5 min, or call |
Restart Helper
.\quickstart.ps1 -restartKills stale MCP processes and waits for auto-restart. If the agent doesn't recover, it prompts you to restart manually.
Tech Stack
Python 3.12+ (httpx, aiohttp, FastMCP)
NapCat.Shell (QQ + OneBot v11)
Win32 API (ctypes) — window activation, keyboard simulation
License
Based on Amadeus-QQ-MCP (MIT License).
中文版
Xadeus-QQ-MCP
由一位 15 岁高中生基于 Amadeus-QQ-MCP 深度优化改造。
QQ MCP (Model Context Protocol) Server — 通过 NapCatQQ (OneBot v11) 协议连接 QQ,为 AI Agent 提供直接操控 QQ 的能力(收发消息、管理群聊、自动唤醒等)。
功能亮点
功能 | 说明 |
Auto-Wake 自动唤醒 | QQ 消息匹配规则时自动激活 AI Agent 窗口。跨平台 — Windows (keybd_event)、macOS (osascript+pbcopy)、Linux (xdotool+xclip)。支持任意客户端 — opencode、Cursor、Claude Desktop、Windsurf,通过 |
Pending 防重复锁 | 唤醒后自动上锁,防止重复唤醒。Agent 干完活后手动解锁 |
规则持久化 | 唤醒规则自动保存到 |
|
|
群管理 | 禁言、解禁、踢人、设名片、发公告 |
文件发送 | 从 URL 下载文件发送到群/私聊 |
消息撤回 | 撤回机器人发送的消息 |
定时任务 | 支持 cron 和间隔两种模式的定时唤醒 |
一键配置 | 自动检测 NapCat、端口、多 Agent 配置 |
架构
QQ ←→ NapCat (OneBot v11)
↓ WebSocket :3001 / HTTP :3000
Xadeus-QQ-MCP (Python MCP Server)
↓ MCP 协议
AI Agent (opencode / Cursor / Claude / ...)快速开始
前置条件
安装 NapCat.Shell 和 QQ
配置 NapCat OneBot v11 (WebSocket :3001, HTTP :3000)
一键配置(推荐)
.\quickstart.ps1 -qq 你的QQ号自动检测 NapCat、配置 HTTP:3000/WS:3001、创建 Python venv、 写入 QQ_OVERRIDE、生成 NapCat 启动脚本、设置窗口唤醒匹配模式。
选项:
.\quickstart.ps1 -qq 123456 -windowTitle "OC,opencode,cmd" # 自定义窗口匹配模式
.\quickstart.ps1 -configFile config.json # 配置文件模式
.\quickstart.ps1 -restart # 杀死残留 MCP + 等待恢复默认 -windowTitle:OC,opencode,Administrator,cmd,管理员
(逗号分隔,不区分大小写子串匹配窗口标题)
Python 版(功能相同):
python setup.py # 交互模式
python setup.py --qq 你的QQ号 --fast # 静默模式手动安装
git clone https://github.com/mouse114514/Xadeus-QQ-MCP
cd Xadeus-QQ-MCP
# 虚拟环境
uv venv
uv sync
# 启动 MCP Server
uv run python -m qq_agent_mcp --qq 你的QQ号配置 AI Agent
重要:AI Agent 配置中的
$env:QQ_OVERRIDE = "你的QQ号"或直接修改
src/qq_agent_mcp/__main__.py:QQ_OVERRIDE的默认值。这样做是为了绕过 AI Agent 缓存 MCP 命令的问题—— Agent 只在启动时读取一次配置,改配置文件不生效。
opencode — 编辑 ~/.config/opencode/opencode.json:
{
"mcp": {
"qq-agent": {
"type": "local",
"command": [
"C:\\path\\.venv\\Scripts\\python.exe",
"-m", "qq_agent_mcp",
"--qq", "你的QQ号"
],
"enabled": true,
"timeout": 120000
}
}
}Cursor / Claude Desktop / Windsurf — 编辑对应 MCP 配置文件:
{
"mcpServers": {
"qq-agent": {
"command": "C:\\path\\.venv\\Scripts\\python.exe",
"args": ["-m", "qq_agent_mcp", "--qq", "你的QQ号"],
"enabled": true
}
}
}运行 python setup.py 可自动检测并配置所有已安装的 Agent。
唤醒目标配置
通过 set_wake_config 配置窗口标题,即可绑定到任意 AI Agent:
{
"window_title_patterns": ["opencode", "cursor", "claude"],
"focus_shortcut": "ctrl+l"
}配置文件保存在 src/qq_agent_mcp/wake_config.json。
MCP 工具一览
消息
工具 | 说明 |
| 发文本消息,支持分段、等待回复 |
| 发图片 |
| 发语音 |
| 等待新消息 |
上下文
工具 | 说明 |
| 查看最近消息 |
| 批量查看多目标 |
| 生成聊天截图(iPhone 深色模式) |
| 压缩缓存 |
唤醒系统
工具 | 说明 |
| 添加唤醒规则(群/私聊 + 关键词) |
| 删除唤醒规则 |
| 查看所有规则 |
| 锁定/解锁唤醒 |
| 启用/禁用规则 |
| 配置窗口标题和快捷键 |
| 查看唤醒配置 |
| 诊断唤醒状态 |
群管理
工具 | 说明 |
| 群列表 |
| 群成员列表 |
| 成员详情 |
| 禁言 |
| 解禁 |
| 踢出 |
| 设群名片 |
| 发群公告 |
系统
工具 | 说明 |
| 检查连接状态 |
| 好友列表 |
| 撤回消息 |
| 发送文件 |
| 添加定时任务 |
| 删除定时任务 |
| 查看所有定时任务 |
已知问题
问题 | 原因 | 解决方法 |
MCP 被杀后无法自启 | opencode 有重启退避策略 | 重启 AI Agent,或 |
总是有两个 MCP 进程 | FastMCP stdio 产生父子进程链 | 内置命名互斥锁解决重复打字 |
改 opencode.json 不生效 | opencode 启动时缓存命令 | 重启 opencode,或用 |
唤醒消息出现双倍字符 | 两个进程同时打字 | 已修复(Windows 命名互斥锁) |
同 QQ 号发消息不唤醒 |
| 已修复(移除 context.py/wake.py 过滤) |
匹配规则但不唤醒 | 唤醒锁 ( | 5 分钟自动解锁,或调用 |
重启助手
.\quickstart.ps1 -restart杀死残留 MCP 进程并等待自动重启。如果 Agent 不自动恢复,会提示你手动重启。
技术栈
Python 3.12+ (httpx, aiohttp, FastMCP)
NapCat.Shell (QQ + OneBot v11)
Win32 API (ctypes) — 窗口激活、键盘模拟
授权
基于 Amadeus-QQ-MCP (MIT License) 改造。
Available Tools
33 toolsadd_timerAIdempotent
Add a timer task that triggers a wake with the given message at scheduled times.
Supports cron expressions and fixed-interval scheduling:
cron_expr: "0 8 * * *" = every day at 8am
interval_seconds: 3600 = every hour
once: if True, auto-removes after first trigger
At least one of cron_expr or interval_seconds must be provided. Use list_timers to see active timers, remove_timer to cancel.
Mutates the timer configuration. Timers persist across restarts.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | ||
| cron_expr | No | ||
| interval_seconds | No | ||
| once | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false and destructiveHint=false, and the description explicitly states that it mutates the timer configuration and that timers persist across restarts, adding valuable behavioral context beyond annotations. No contradiction found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: a clear first sentence, bullet-like examples for scheduling, a note on constraints, and cross-references to sibling tools. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, usage, parameter details, and mutation behavior, but it omits any mention of what the tool returns (e.g., success indication, timer ID). With no output schema, this gap may leave the agent unsure how to handle the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates well by providing examples for cron_expr and interval_seconds, explaining the once flag, and noting the constraint that at least one of cron_expr or interval_seconds must be provided. The message parameter is required and self-explanatory, but no additional detail is given.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool adds a timer task with a message at scheduled times, and specifies two scheduling methods. It mentions related sibling tools (list_timers, remove_timer) but does not explicitly distinguish from add_wake_rule, which is a close sibling also dealing with scheduling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: supports cron and interval scheduling, with examples; notes that at least one must be provided; explains the 'once' flag; and points to list_timers and remove_timer for management. However, it does not specify when not to use this tool or compare it to alternatives like add_wake_rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_wake_ruleAIdempotent
Add a wake rule: when a matching message arrives, opencode wakes up.
When a message matches this rule, the agent is activated and the message context is made available. Use add_wake_rule to create rules, list_wake_rules to see them, remove_wake_rule to delete, and set_wake_enabled to toggle.
Rules are persisted to disk and survive restarts. Keywords are optional: empty list matches any message. target_id=None matches any source.
Mutates the wake rule configuration.
| Name | Required | Description | Default |
|---|---|---|---|
| target_type | Yes | ||
| target_id | No | ||
| keywords | No | ||
| ignore_if_focused | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses mutation of wake rule configuration, persistence across restarts, and specifics about keyword and target_id behavior. Aligns with annotations (idempotentHint true) without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise, well-structured: first sentence states purpose, second clarifies usage with siblings, third gives parameter details. No wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, usage, persistence, and key parameter semantics. Lacks mention of return value or behavior if rule already exists, but still fairly complete given no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 0% coverage, but description adds meaning for target_id ('matches any source') and keywords ('empty list matches any message'). However, target_type and ignore_if_focused are not explained, leaving some ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool adds a wake rule that activates opencode on matching messages. It differentiates from siblings by naming related tools (list, remove, set_wake_enabled) for other operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool (to create rules) and provides alternatives for other operations (list, remove, toggle). Also clarifies persistence and default behaviors for empty/null parameters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
batch_get_recent_contextARead-onlyIdempotent
Query recent messages for multiple groups/friends in one call.
More efficient than calling get_recent_context multiple times: uses at most 2 OneBot API calls (one for group names, one for friend names) regardless of how many targets you query. Each target's messages are returned independently with errors for unmonitored targets.
Use this when you need to read context from 2+ conversations at once. For a single target, use get_recent_context instead (simpler).
Read-only. No side effects.
| Name | Required | Description | Default |
|---|---|---|---|
| targets | Yes | ||
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, openWorldHint=false. The description adds: 'Read-only. No side effects.' It also explains efficiency and error handling ('uses at most 2 OneBot API calls... errors for unmonitored targets'). No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with 5 sentences, front-loaded with the purpose. Each sentence adds value. Could be slightly more structured, but overall efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool complexity (batching, two params, no output schema), the description covers efficiency, error handling, and usage context. It does not describe return format, but that is acceptable without an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does not directly describe the 'targets' or 'limit' parameters. The description gives context about targets being multiple groups/friends but lacks details on structure or meaning. This is insufficient for a 0% coverage tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Query recent messages for multiple groups/friends in one call.' It uses a specific verb and resource, and distinguishes from the sibling 'get_recent_context' by emphasizing batching and efficiency.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: 'Use this when you need to read context from 2+ conversations at once. For a single target, use get_recent_context instead (simpler).' This provides clear context and an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_statusARead-onlyIdempotent
Check QQ login status, NapCat connection, and monitored targets.
Returns the bot's QQ account, online status, uptime, list of monitored groups and friends, and buffer statistics. Use this to verify the server is running correctly before calling other tools. Not the same as get_group_list or get_friend_list — this is a health check, not a query.
Read-only. No side effects. Safe to call at any time.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, destructiveHint, idempotentHint. The description adds context by stating 'Read-only. No side effects. Safe to call at any time' and describes the return values. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, front-loaded with the purpose, and every sentence adds value. No unnecessary text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters, rich annotations, and no output schema requirement, the description fully covers what the tool does, its return values, and when to use it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, so schema coverage is 100%. Baseline of 4 for zero parameters is appropriate; the description adds no param info needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Check') and clearly defines the resource (QQ login status, NapCat connection, monitored targets). It distinguishes itself from siblings by stating it's a health check, not a query like get_group_list or get_friend_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states to use this tool to verify the server is running correctly before calling other tools. It also contrasts with similar tools, providing clear context. No explicit when-not-to-use scenarios are mentioned, but the guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compress_contextADestructive
Compress all buffered messages for a target into a single summary, freeing buffer space.
This is destructive: raw messages are replaced by a compressed summary. Once compressed, individual messages cannot be recovered from the buffer. Use this after get_recent_context when you want to archive old conversations and make room for new messages.
The compression uses the client LLM (via MCP sampling) to generate a concise summary. Falls back to rule-based compression if LLM is unavailable.
Destructive: permanently replaces raw messages with a summary.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | ||
| target_type | No | group |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant details beyond annotations: raw messages are replaced and unrecoverable, compression uses client LLM via MCP sampling with fallback. It fully aligns with destructiveHint=true and provides useful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a summary line followed by bullet points. It is concise but could be slightly more compact. No unnecessary content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity and no output schema, the description covers the essential aspects: usage, behavior, fallback, and side effects. It is sufficiently complete for an agent to understand what the tool does and its consequences.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description should explain the parameters but does not. 'target' and 'target_type' are not described, leaving the agent to infer their meaning from the tool's purpose. This is a clear gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool's purpose: compressing buffered messages into a summary to free space. It uses a specific verb-resource pair and distinguishes from related tools like get_recent_context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use ('after get_recent_context when you want to archive old conversations') and notes the destructive nature. However, it could more directly state when not to use it (e.g., when raw messages are needed).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
debug_wake_pipelineARead-onlyIdempotent
Simulate a wake trigger to debug the wake pipeline.
Creates a fake message from the given target_id and target_type and checks: is the callback registered, does any rule match the fake message, is the monitor currently pending or running. Then invokes the callback to exercise the full activation pipeline. The response fields (callback_set, matches_rules, pending, running, callback_invoked) tell you exactly where the pipeline is broken. Use diagnose_wake for a read-only snapshot without triggering the callback.
Read-only with respect to QQ. May invoke the wake callback.
| Name | Required | Description | Default |
|---|---|---|---|
| target_type | No | private | |
| target_id | No | 3838379219 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that it creates a fake message and may invoke the wake callback, and that it is 'read-only with respect to QQ'. These details add value beyond the annotations (readOnlyHint, destructiveHint, idempotentHint). No contradiction detected because the description qualifies the read-only scope.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (two paragraphs) and front-loads the purpose. Every sentence contributes, though the second paragraph could be slightly shorter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Explains the response fields, distinguishes from diagnose_wake, and covers the main purpose. However, it does not mention error cases or prerequisites. Given no output schema, the description adequately describes expected output.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It mentions parameters only in passing ('from the given target_id and target_type') without explaining valid values, constraints, or semantics. This provides minimal additional meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Simulate a wake trigger to debug the wake pipeline' and explains the steps and response fields. It explicitly distinguishes from sibling tool 'diagnose_wake' by noting that diagnose_wake is a read-only snapshot without callback invocation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit alternative: 'Use diagnose_wake for a read-only snapshot without triggering the callback.' It also explains the purpose (debugging) and what it checks, making it clear when to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diagnose_wakeARead-onlyIdempotent
Return the current state of the wake monitor for debugging.
Shows: whether the monitor is running, all active rules (with target_type, target_id, keywords, enabled state, ignore_if_focused), whether the message callback is registered on the context manager, and total buffered messages across all targets. Use this as the first step when wake is not working — if monitor_created or callback_set is False, the monitor was never initialized. For a more aggressive test that injects a fake message, use debug_wake_pipeline instead.
Read-only. No side effects.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, non-destructive. Description adds detail on output fields and explicitly states 'Read-only. No side effects.', reinforcing safety but not adding new behavioral insight beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise yet comprehensive: first sentence states purpose, then structured list of outputs, then usage guidance. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Fully describes the tool's output and usage context. No missing information for a debugging tool with no parameters and no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters, so baseline is 4. Description does not need to elaborate on parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it returns the current state of the wake monitor for debugging, listing specific components. Distinguishes from sibling 'debug_wake_pipeline' which injects fake messages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly recommends use as first step when wake is not working, and contrasts with 'debug_wake_pipeline' for more aggressive testing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_friend_listARead-onlyIdempotent
List all QQ friends of the bot account.
Returns user IDs and nicknames. Use this to discover valid friend IDs for send_message or get_recent_context with target_type="private". For group list use get_group_list instead.
Read-only. No side effects.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, idempotentHint. Description confirms 'Read-only. No side effects.' No contradictions, but doesn't add much beyond annotations. Still accurate and sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four succinct sentences with no wasted words. Front-loaded with the core action, then usage context, then contrast with sibling. Excellent structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters, no output schema, and rich annotations, the description is fully complete. It explains purpose, usage, and alternatives, leaving no gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters; baseline 4 as per rule. Description adds no parameter details, but none are needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists all QQ friends of the bot account, specifying it returns user IDs and nicknames. It distinguishes itself from get_group_list, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says use this to discover friend IDs for send_message or get_recent_context, and advises using get_group_list for groups. This provides clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_group_listARead-onlyIdempotent
List all QQ groups the bot has joined.
Returns group IDs, names, and member counts for every group the bot is a member of. Use this to discover valid group IDs for send_message, get_recent_context, or other group-targeting tools. For friend list use get_friend_list instead. For batch name resolution use batch_get_recent_context.
Read-only. No side effects.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds 'Read-only. No side effects,' which reinforces but doesn't significantly expand beyond annotations. It does mention return fields, adding some context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences with no wasted words. The main purpose is front-loaded, and each sentence adds value: purpose, return fields, usage, alternatives.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but the description explains return data (group IDs, names, member counts). The tool is simple with no parameters, and the description covers all needed context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no parameters (100% coverage). The description compensates by explaining what the tool returns and how to use it, which is sufficient. Baseline 4 for zero-parameter tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'List all QQ groups the bot has joined.' It specifies the return data (group IDs, names, member counts) and distinguishes from siblings like get_friend_list and batch_get_recent_context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to use the tool ('discover valid group IDs for send_message, get_recent_context, or other group-targeting tools') and provides alternatives: 'For friend list use get_friend_list instead. For batch name resolution use batch_get_recent_context.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_group_member_infoARead-onlyIdempotent
Get detailed info for a specific QQ group member.
Returns: user_id, nickname, card (group nickname), role (owner/ admin/member), join_time (unix timestamp), last_sent_time, level, title (group honorific), and age/gender if available. Unlike get_group_member_list which returns all members, this gives a single member's full profile. Use this to look up a specific user before deciding to mute, kick, or set their card. Use get_group_member_list when you need to enumerate all members.
Read-only. No side effects.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | Yes | ||
| user_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false. Description adds 'Read-only. No side effects.' consistent with annotations, and lists exact return fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two efficient sentences plus a bulleted list; front-loaded with purpose; no extraneous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only info retrieval with two obvious parameters and no output schema, the description provides all necessary context: what it does, return fields, and usage guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 0% description coverage, but parameters (group_id, user_id) are self-explanatory from names. Description does not elaborate on them, but minimal explanation needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it returns detailed info for a specific QQ group member, lists fields, and distinguishes from sibling tool get_group_member_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises when to use this tool (before muting, kicking, setting card) and when to use alternative (get_group_member_list for enumeration).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_group_member_listARead-onlyIdempotent
List all members of a QQ group.
Returns for each member: user_id (QQ number), nickname, card (group nickname), role (owner/admin/member), join_time (unix timestamp), last_sent_time, level, and title (group honorific). Use get_group_member_info for a single member's detailed info. Use get_group_list to discover valid group_id values. The response includes a count field for the number of members. Large groups (>200 members) may be paginated by QQ; the result includes all members QQ returns in one call.
Read-only. No side effects.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true. Description adds that the tool is 'Read-only. No side effects.' and discloses pagination behavior for large groups, which adds useful context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise with clear structure: main purpose, return fields, usage alternatives, pagination note, and read-only statement. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given one simple parameter, no output schema, the description covers return fields, usage context, pagination, and safety. Complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so description must compensate. It implies that group_id identifies a QQ group and suggests using get_group_list to discover valid values. This provides sufficient meaning for the single required parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'List all members of a QQ group' with verb and resource. It distinguishes from siblings by mentioning get_group_member_info for single member and get_group_list for valid group_ids.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit alternatives: use get_group_member_info for single member details, use get_group_list to discover valid group_id values. Also notes pagination handling for large groups (>200 members).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recent_contextARead-onlyIdempotent
Retrieve recent messages for one group or friend from the in-memory buffer.
Returns buffered messages (backfill from history + real-time via WebSocket) as raw message objects with sender info, content, timestamps, and image URLs. This is the primary tool for reading chat context. For multiple targets at once, use batch_get_recent_context instead (fewer API calls). To archive old messages and free buffer space, use compress_context.
Messages older than the buffer window are lost. Call compress_context periodically to preserve important conversations.
Read-only. No side effects on the chat.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | ||
| target_type | No | group | |
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, and idempotentHint. The description adds context about the in-memory buffer behavior: messages older than the buffer window are lost, and periodically calling compress_context is necessary to preserve conversations. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear first sentence stating purpose, followed by return details, alternatives, and cautions. It is slightly lengthy but every sentence adds value. Could be more concise, but no redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 3 parameters, no output schema, but informative annotations, the description covers purpose, behavior (read-only, buffer loss), and alternatives. Missing details on return format specifics and error handling, but sufficient for an agent to use effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It implies 'target' is a group or friend but does not explain 'target_type' or 'limit' parameters. No additional details about parameter values or constraints are provided beyond the schema's defaults and titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves recent messages for one group or friend from the in-memory buffer, specifying the return type. It distinguishes itself from siblings like batch_get_recent_context and compress_context by naming them and their purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states that this is the primary tool for reading chat context, advises using batch_get_recent_context for multiple targets to reduce API calls, and recommends compress_context to archive old messages and preserve important conversations. It also warns about buffer window data loss.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_wake_configARead-onlyIdempotent
Return the current wake configuration (window title patterns, shortcut).
Use set_wake_config to modify these settings. Changes take effect immediately for future wake activations.
Read-only. No side effects.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds 'Read-only. No side effects' which reinforces but does not significantly add beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences: first states purpose, second provides guidance, third summarizes behavior. No wasted words, front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While there is no output schema, the tool is simple with no parameters and clear annotations. The description lacks return structure details but is sufficient given low complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so schema coverage is 100%. The description adds no parameter details, but baseline for 0 parameters is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description specifies 'Return the current wake configuration (window title patterns, shortcut)' which is a specific verb+resource pair and distinguishes from the sibling 'set_wake_config'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states to use 'set_wake_config' for modifications, providing clear context for when to use this tool vs the alternative. No exclusions beyond that.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kick_memberADestructiveIdempotent
Kick a member from a QQ group.
group_id: the QQ group number. user_id: the QQ number to kick. reject_add_request: if True, rejects future join requests from this user. Requires bot to have admin privileges. This is irreversible for the current session — the user can re-join if not rejected. Consider using mute_member (temporary) as a less drastic alternative. The bot cannot kick group owners or admins of equal rank; returns error in those cases.
Destructive: removes a member from the group.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | Yes | ||
| user_id | Yes | ||
| reject_add_request | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructive and idempotent hints. Description adds key behavioral traits: irreversible for current session, returns error on privileged users, and clarifies reject_add_request behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured, front-loaded with action. Each sentence serves a purpose, no redundancy, and efficiently covers all necessary details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite complexity (irreversibility, admin privileges, error cases), description covers all necessary context, including effects and alternatives.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage, description fully explains all three parameters: group_id, user_id, and reject_add_request, providing meaning and usage context beyond type hints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Kick a member from a QQ group' with specific verb and resource. Distinguishes from sibling tool mute_member by emphasizing irreversible nature.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly recommends mute_member as a less drastic alternative, mentions admin privileges required, and explains limitations (cannot kick group owners/admins).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_timersARead-onlyIdempotent
List all configured timer tasks.
Shows each timer's index, message, cron expression, interval, once flag, and next run time. Use add_timer to create timers, remove_timer to cancel.
Read-only. No side effects.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, destructiveHint, idempotentHint; description adds context that it shows specific fields (index, message, cron, etc.) and confirms 'Read-only. No side effects.'
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the main action. Every sentence provides value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description covers what fields are shown (index, message, cron, etc.), making it complete for a simple list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters, so baseline is 4. Description doesn't need to add param info; it correctly implies no arguments needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List all configured timer tasks,' using a specific verb and resource. It distinguishes from sibling tools like add_timer and remove_timer by focusing on listing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description explicitly mentions when to use this tool (listing) and provides alternatives: 'Use add_timer to create timers, remove_timer to cancel.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_wake_rulesARead-onlyIdempotent
List all configured wake rules.
Shows each rule's target type, ID, keywords, enabled state, and focus-ignoring setting. Use add_wake_rule to create rules, remove_wake_rule to delete, and set_wake_enabled to toggle.
Read-only. No side effects.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, destructiveHint, and idempotentHint. The description reinforces these and adds detail on what each rule's output contains, which is helpful but not critical.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four concise sentences with no wasted words. Front-loaded with purpose, followed by output details and sibling pointers. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter list tool with thorough annotations, the description is complete. It explains what is listed and what fields are shown, compensating for lack of output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, so baseline 4 applies. The description does not need to add parameter details beyond what the empty schema already indicates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists all configured wake rules and specifies the fields shown (target type, ID, keywords, etc.). It distinguishes from siblings by mentioning add_wake_rule, remove_wake_rule, and set_wake_enabled.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use ('List all configured wake rules'), mentions alternatives for related operations, and declares read-only nature, guiding appropriate selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mute_memberBIdempotent
Mute a member in a QQ group.
group_id: the QQ group number. user_id: the QQ number to mute. duration: mute time in seconds (default 600 = 10 minutes). Requires bot to have admin privileges in the group. Use unmute_member to reverse.
Mutates the group by muting a member.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | Yes | ||
| user_id | Yes | ||
| duration | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate mutation (readOnlyHint=false) and idempotency (idempotentHint=true). Description adds 'Mutates the group by muting a member' and default duration, but lacks details on error states or behavior when bot lacks privileges.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, front-loaded with the purpose, and efficient. However, it repeats parameter explanations that could be inferred from the schema, making it slightly less concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the main points: purpose, parameters, prerequisite, and reversal. Lacks details on error handling or behavior when member is already muted. Acceptable for a simple mutation tool with no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 0% schema description coverage, the description explains each parameter: group_id as QQ group number, user_id as QQ number, and duration with default 600 seconds. This adds meaning beyond the schema's type/title only.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Mute a member in a QQ group' and explains parameters. It mentions unmute_member as a sibling tool but does not explicitly differentiate from other sibling tools like kick_member or set_member_card.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description includes prerequisite 'Requires bot to have admin privileges' and suggests unmute_member for reversal. However, it does not provide guidance on when to prefer mute over other mutation tools like kick_member.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recall_messageADestructiveIdempotent
Recall (delete) a message sent by the bot.
message_id: the message ID to recall (obtained from send_message's or send_image's message_id in the response). Only works for messages sent by the bot itself within approximately 2 minutes of sending, or anytime if the bot has admin/owner privileges in the group. Cannot recall messages sent by other users. Use this to undo accidental sends. The message is permanently deleted for all members.
Destructive: permanently deletes a message.
| Name | Required | Description | Default |
|---|---|---|---|
| message_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant behavioral context beyond the annotations. It details the permanent deletion for all members, time limits, permission requirements, and the source of message_id. This fully informs the agent of the tool's side effects and constraints, complementing the destructiveHint=true annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear first line, parameter details, usage conditions, and a final note. While it is slightly verbose, every sentence adds necessary information. Front-loading of the core purpose is good, though the parameter explanation could be integrated more concisely. Overall, it is effective without excess.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has one simple parameter, no output schema, and annotations already cover destructiveness, the description is fully complete. It covers permissions, time constraints, message source, scope (only bot's messages), and the permanent deletion effect. No important aspect is missing for correct usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has one parameter (message_id) with no description in the schema itself. The tool description fully explains what message_id is, where to obtain it (from send_message or send_image responses), and its role in the operation. This adds complete semantic meaning beyond the schema's type and required status.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool recalls (deletes) a message sent by the bot. It specifies the action ('Recall (delete)'), the target resource ('a message sent by the bot'), and distinguishes it from sibling tools like send_message or send_image by focusing on deletion. The purpose is unambiguous and specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear guidelines on when to use the tool ('Use this to undo accidental sends') and constraints (only within 2 minutes unless bot has admin/owner privileges, cannot recall other users' messages). It implicitly tells the agent not to use it for messages from other users. While it does not explicitly name alternative tools, the context is sufficient for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_timerADestructiveIdempotent
Remove a timer task by index.
Use list_timers to get current indices. Timers are renumbered after removal. This permanently deletes the timer.
Destructive: permanently removes a timer.
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description adds useful context beyond annotations: 'Timers are renumbered after removal' and reaffirms destructiveness. Annotations already cover destructiveness and idempotency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four concise sentences with no wasted words. Main action and key usage notes are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one param and no output schema, description covers action, prerequisite, renumbering behavior, and destructiveness. Could mention error handling for invalid index.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Parameter 'index' is only described as the position from list_timers but lacks specifics on indexing (0-based vs 1-based) or valid range. With 0% schema coverage, description insufficiently compensates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Remove a timer task by index.' with specific verb and resource. Distinguishes from siblings like add_timer and list_timers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises 'Use list_timers to get current indices.' and warns about renumbering after removal, guiding proper usage sequence and caution.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_wake_ruleADestructiveIdempotent
Remove a wake rule by index.
Use list_wake_rules to get the current indices. Rules are renumbered after removal. This permanently deletes the rule; to temporarily disable, use set_wake_enabled instead.
Destructive: permanently removes a wake rule.
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds context beyond annotations: renumbering after removal, permanent deletion. Annotations already mark destructiveHint=true, but description reinforces and explains behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short paragraphs with no wasted words. Front-loaded with action, then steps, then alternative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers main usage and alternatives. Lack of output schema is fine. Could mention error cases (e.g., invalid index) but overall adequate for single-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Single parameter 'index' is explained as identifier for the rule. Schema provides no description coverage, but description adds that index is used to select which rule to remove. Could specify starting index (e.g., 0-based) but not essential.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states removal of wake rule by index. Distinguishes from siblings by referencing list_wake_rules for indices and set_wake_enabled for temporary disable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use (permanent delete), prerequisite (list indices), and alternative (use set_wake_enabled for temporary disable).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screenshot_chatARead-onlyIdempotent
Render a QQ-style dark-mode chat screenshot starting from a given message.
Uses Playwright to render messages as an iPhone-style QQ chat screenshot and returns a base64-encoded PNG image. The screenshot starts from the given message_id and renders downward. If messages fit on one screen, earlier messages are prepended to fill it (bottom-aligned). If they overflow, later messages are cut off.
Requires: Playwright browser (lazy-started on first call). If the message_id is not found in the buffer, returns an error.
Use get_recent_context first to find valid message_ids. The screenshot is read-only and does not modify the chat.
Read-only. No side effects on the chat.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | ||
| message_id | Yes | ||
| target_type | No | group |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant behavioral details beyond annotations: Playwright usage, base64 PNG, rendering logic (bottom-aligned, overflow cut), error condition, and read-only nature. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is concise with three main sentences and extra notes. Front-loaded with purpose. Every sentence adds value, though slight redundancy in read-only statements.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description specifies base64 PNG and error conditions. Prerequisites and usage flow are clear given sibling tools. Slight gap in target parameter explanation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so description must compensate. It explains message_id usage well but does not clarify target (group/user ID?) or target_type (default group). Only partial param semantics covered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool renders a QQ-style dark-mode chat screenshot starting from a given message. It specifies the resource (chat screenshot) and action (render) and differentiates from siblings like send_message or get_recent_context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It advises to use get_recent_context first to find valid message IDs, providing a clear prerequisite. It does not explicitly state when not to use or list alternatives, but the context implies it's for visual output.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_fileA
Download a file from a URL and send it to a QQ group or friend.
Downloads the file to a temporary directory, uploads it to QQ, then cleans up. Supports any file type. For text use send_message, for images use send_image, for audio use send_voice.
Behavior: requires a publicly accessible URL (no auth). Download timeout is 60 seconds. The file is sent as a QQ file attachment.
Mutates the chat by sending a file.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | ||
| file_url | Yes | ||
| file_name | No | ||
| target_type | No | group |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses temporary directory usage, cleanup after upload, support for any file type, 60-second timeout, and that it mutates chat. Adds value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise paragraphs, front-loaded with main purpose, then behavioral details and alternatives. No fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers essential behavioral details and usage distinctions, but lacks explicit parameter descriptions for all four parameters. Output schema absent but acceptable given tool simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 0% description coverage; description mentions file_url and file_name (optional) and target_type (defaults group), but does not explain 'target' parameter (group ID vs friend ID). Partial clarity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it downloads a file from a URL and sends to QQ group/friend. Distinguishes from siblings by naming send_message, send_image, send_voice for alternative content types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use (download and send file from URL) and when not (text, image, audio). Mentions requirement of publicly accessible URL without auth.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_group_noticeAIdempotent
Send a group announcement (notice) to a QQ group.
group_id: the QQ group number. content: the announcement text (plain text only, no rich media). Requires bot to have admin privileges. The notice appears in the group's announcement bar for all members. Unlike send_message, this is persistent and visible to members who join later. Avoid posting notices too frequently — QQ may rate-limit or throttle excessive notices.
Mutates the group by posting an announcement.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | Yes | ||
| content | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description contradicts the idempotentHint annotation (true) by warning that excessive notices may be rate-limited, implying non-idempotent behavior. Annotations already indicate mutation (readOnlyHint=false), but the description adds useful admin privilege requirement and rate limit warning; nevertheless, the contradiction mandates a score of 1.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (5 lines) and front-loaded with the core purpose. Every sentence adds value: purpose, parameters, requirements, caveats, and sibling differentiation. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description covers prerequisites (admin privileges), behavior (persistent, visible to all), side effects (mutates group), and a caveat (rate limiting). It lacks return value or error details, but overall is sufficient for a mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates by explaining group_id as 'the QQ group number' and content as 'announcement text (plain text only)'. This adds meaning beyond the schema, though format details are minimal.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool sends a group announcement to a QQ group, using specific verbs ('send') and resources ('group announcement'). It distinguishes from the sibling tool send_message by noting persistence and visibility to later joiners.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool (persistent notices) and contrasts it with send_message. It warns about rate limiting and suggests not posting too frequently, but does not explicitly list when not to use it or other alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_imageA
Send a base64-encoded image to a QQ group or friend.
For text messages use send_message. For audio use send_voice. For files use send_file. This tool only sends images.
Behavior: same rate limiting and dedup as send_message. The image is sent as a QQ-native image (not a file attachment).
Mutates the chat by sending an image.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | ||
| image | Yes | ||
| target_type | No | group | |
| reply_to | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false (mutates). The description adds context: 'same rate limiting and dedup as send_message', 'sent as QQ-native image', and explicitly states 'Mutates the chat'. No contradictions with annotations and adds useful behavioral details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is five sentences without wasted words. Each sentence adds distinct value: purpose, sibling alternatives, exclusivity, behavioral note, mutation acknowledgment. Front-loaded with the core action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and 4 parameters, the description covers the core functionality but omits error handling, response format, size limits, and authentication. The openWorldHint suggests unknown side effects not clarified. Adequate but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must explain parameters. It clarifies that 'image' is base64-encoded and that 'target_type' defaults to group, but does not explain 'target' format, 'reply_to', or constraints like allowed image formats/sizes. Insufficient compensation for missing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool sends a base64-encoded image to a QQ group or friend. It explicitly distinguishes from siblings like send_message, send_voice, and send_file, leaving no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance by referencing siblings: 'For text messages use send_message. For audio use send_voice. For files use send_file. This tool only sends images.' It lacks mention of prerequisites or edge cases but is above average.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_messageA
Send a text message to a QQ group or friend, optionally waiting for a reply.
This is the primary tool for sending text messages. It supports message splitting via </分段> tags or punctuation-based chunking. The message is sent immediately and the bot's own message is written to the buffer.
To split a reply into multiple messages, insert </分段> at split points. For example: "Hi</分段>How are you?" sends two separate messages.
Behavior: rate-limited (60s dedup window), duplicate content within 60s is blocked. After sending, blocks until a reply arrives (unless wait_reply=False). The reply includes the full message objects.
Use send_image for images, send_voice for audio, send_file for files. For a standalone wait without sending, use wait_for_reply.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | ||
| content | Yes | ||
| target_type | No | group | |
| reply_to | No | ||
| split_content | No | ||
| num_chunks | No | ||
| wait_reply | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses rate-limiting (60s dedup window), blocking behavior on reply, and reply content. Annotations are minimal, so description adds significant context beyond readOnlyHint and destructiveHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with core function, example, behavior, and alternatives grouped. Slightly verbose but every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers usage, behavior, splitting, and alternatives. Lacks error cases and full reply format, but is sufficient for a messaging tool given 7 params and no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage, the description partially compensates by explaining content splitting and wait_reply behavior, but lacks explicit description for all parameters (e.g., num_chunks is only indirectly hinted).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool sends a text message to a QQ group or friend with optional reply waiting. It distinguishes from siblings by naming alternative tools for images, audio, files, and standalone waiting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly provides when to use alternatives (e.g., send_image for images) and describes message splitting technique with </分段> tags. This guides the agent to choose correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_voiceA
Send a base64-encoded voice message to a QQ group or friend.
NapCat auto-converts common audio formats (MP3, WAV, AMR, OGG, FLAC) to SILK for QQ voice playback. For text use send_message, for images use send_image, for files use send_file.
Behavior: same rate limiting as send_message. Voice messages cannot be replied to (no reply_to parameter).
Mutates the chat by sending a voice message.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | ||
| audio | Yes | ||
| target_type | No | group |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses auto-conversion to SILK, same rate limiting, and no reply_to parameter. Annotations confirm mutation (readOnlyHint=false). Adds valuable context beyond annotations, though could mention size limits or error cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with main purpose, followed by conversion info and sibling comparisons. Three sentences plus a behavior note are concise and well-structured. Could be slightly more streamlined, but effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, usage alternatives, conversion, and behavioral constraints. No output schema needed; complexity moderate. Missing explicit parameter details but otherwise complete for sending a voice message.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%. Description does not explicitly map parameters to variables. While overall context hints at target and audio, it lacks detailed semantics for each parameter, which is needed given no schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb 'Send' with specific resource 'base64-encoded voice message to a QQ group or friend.' Differentiates from siblings like send_message, send_image, send_file by naming alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool vs alternatives ('For text use send_message...'). Also mentions rate limiting same as send_message and notes that voice messages cannot be replied to.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_member_cardAIdempotent
Set a member's group nickname (card). Empty string clears it.
group_id: the QQ group number. user_id: the QQ number. card: the new nickname text. Requires bot to have admin privileges.
Mutates the member's group card.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | Yes | ||
| user_id | Yes | ||
| card | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=false, destructiveHint=false, idempotentHint=true. The description adds that it 'Mutates the member's group card,' which aligns. It does not disclose additional behavioral traits like rate limits or error handling, but the annotation coverage is sufficient to avoid major gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with three sentences, each serving a purpose: purpose, parameter explanation, privilege and mutation note. It is front-loaded and contains no unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, the description covers the essential: what it does, parameters, and admin requirement. It lacks details on possible errors or validation (e.g., invalid card length), but for a straightforward mutation, it is almost complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates by explaining each parameter: 'group_id: the QQ group number. user_id: the QQ number. card: the new nickname text.' It adds meaning beyond schema, but could be more explicit about formats (e.g., numeric strings).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Set a member's group nickname (card)' with the verb 'set' and resource 'member's group nickname'. It also notes the empty string behavior, distinguishing it from any sibling tool that might alter member properties.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes a crucial prerequisite: 'Requires bot to have admin privileges.' It implicitly guides when to use this tool (to change a nickname). However, it does not explicitly mention when not to use it or provide alternatives, though no direct competitor exists among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_wake_configAIdempotent
Configure the wake target window and focus shortcut.
window_title_patterns: substrings to match against the window title (e.g., ["opencode", "cursor"]). The wake system focuses the first matching window. focus_shortcut: keyboard shortcut to focus the input box (e.g., "ctrl+l"). Changes take effect immediately.
Mutates the wake configuration. Persisted across restarts.
| Name | Required | Description | Default |
|---|---|---|---|
| window_title_patterns | No | ||
| focus_shortcut | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide idempotentHint=true and readOnlyHint=false. The description adds that changes 'take effect immediately' and are 'persisted across restarts,' which goes beyond the annotations. However, it does not disclose potential side effects, permission requirements, or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (~80 words) and well-structured: it starts with the overall purpose, then explains each parameter, and ends with behavioral notes. Every sentence adds value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 optional parameters, no output schema), the description covers the core functionality and persistence. It lacks explicit mention of what happens when both parameters are null (likely resetting to defaults), but this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 0% coverage (no parameter descriptions), so the description fully compensates by explaining both parameters in detail: window_title_patterns are substrings for matching window titles, and focus_shortcut is a keyboard shortcut for focusing the input box. Examples are provided, adding essential meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Configure the wake target window and focus shortcut.' It uses a specific verb and resource, and the explanation of parameters distinguishes it from sibling tools like get_wake_config (read-only) and add_wake_rule (adds rules rather than setting config).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not provide explicit guidance on when to use this tool versus alternatives such as add_wake_rule or set_wake_enabled. It only describes what it does without context about appropriate scenarios or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_wake_enabledAIdempotent
Enable or disable a specific wake rule (or all rules if index is None).
Use list_wake_rules to see current indices and states. Disabled rules are skipped during wake matching but remain in the configuration. Use remove_wake_rule to permanently delete a rule.
Mutates the wake rule configuration.
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | ||
| enabled | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate non-readOnly, non-destructive, idempotent. Description adds context that mutation occurs and what disable means (skipped but kept). No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with main action, no redundant sentences, efficient and clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple toggle tool with two parameters, the description covers purpose, usage, and behavioral effects adequately with no output schema needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 0% description coverage. Description adds that index can be None (all rules) but this contradicts schema which marks index as required integer. Otherwise, parameters are minimally explained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (enable/disable) and resource (wake rule), and distinguishes from siblings like list_wake_rules and remove_wake_rule.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: use list_wake_rules to see current indices/states, explains disabled rules are skipped but remain, and directs to remove_wake_rule for permanent deletion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_wake_pendingAIdempotent
Manually set the wake pending state to block or allow new wakes.
When pending=True, incoming messages will NOT trigger wake even if they match a rule. When pending=False, messages trigger wake normally. Use this to prevent duplicate wakes while the agent is already working.
Mutates the wake monitor state.
| Name | Required | Description | Default |
|---|---|---|---|
| pending | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral detail beyond annotations: explains what happens when pending is True vs False, and states 'Mutates the wake monitor state.' Annotations already indicate idempotentHint=true and non-read-only, and the description aligns without contradiction, adding useful context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (5 short sentences) and front-loaded with the tool's purpose. Every sentence adds value, with no fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (single boolean parameter, no output schema), the description is largely complete. It explains the parameter, use case, and side effects. Minor gaps: no mention of permissions, error conditions, or return values, but these are not critical for a simple state setter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 0% schema coverage, the description fully explains the sole parameter 'pending' by detailing the behavior for True and False values. This adds significant meaning beyond the schema, which only specifies type and required status.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: manually set the wake pending state to block or allow new wakes. It uses specific verbs ('set', 'block', 'allow') and identifies the resource ('wake pending state'). However, it does not explicitly differentiate from sibling tools like set_wake_config or set_wake_enabled, but the distinct boolean parameter makes the purpose clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a use case: 'Use this to prevent duplicate wakes while the agent is already working.' This gives context but lacks explicit guidance on when not to use it or alternatives (e.g., set_wake_enabled) that might be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_wake_activationAIdempotent
Manually trigger the wake activation sequence to verify it works.
Sends a test keystroke to the opencode window. Use this to verify the wake system is functional. On Linux, this always returns False (wake is Windows-only). Does not affect any QQ messages.
Read-only with respect to QQ. May type text into opencode window.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description says 'sends a test keystroke' which is not idempotent, contradicting idempotentHint: true. Also adds platform behavior but contradiction lowers score.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five sentences, front-loaded purpose, no wasted words, each sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, usage, platform, and effect on QQ. Missing explicit return values for Windows, but sufficient for a no-param tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters; schema coverage 100% so baseline 3. Description adds no param info.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it manually triggers wake activation and sends test keystroke. Distinguishes from siblings by specifying it's for verification.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says use to verify wake system functionality and notes platform limitation. No explicit alternatives mentioned but context sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unmute_memberAIdempotent
Unmute a member in a QQ group (set mute duration to 0).
group_id: the QQ group number. user_id: the QQ number to unmute. Requires bot to have admin privileges. Use mute_member to mute. Unmuting a member who is not muted is a no-op (returns success). Call get_group_member_list first to verify a member is currently muted before deciding to unmute.
Mutates the group by unmuting a member.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | Yes | ||
| user_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes mutation effect ('Mutates the group by unmuting a member'), idempotency (no-op if already unmuted), and admin privilege requirement. Adds value beyond annotations which already indicate idempotent and non-destructive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Multiple sentences but each adds essential information (action, parameters, requirements, behavior, alternatives). Front-loaded with main purpose. Could be slightly shorter but still efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, description covers return behavior (success), idempotency, and prerequisites. Sufficient for a simple mutation tool. Annotations already cover safety and idempotency.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Adds context to both parameters by calling group_id a 'QQ group number' and user_id a 'QQ number', clarifying their meaning beyond the schema's generic titles. Schema coverage 0%, so description compensates well.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Unmute a member in a QQ group', providing specific verb and resource. Distinguishes from sibling 'mute_member' by mentioning it. No ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use (when member is muted), when-not (no-op if not muted), prerequisites (admin privileges, check member list via get_group_member_list), and alternatives (mute_member). Comprehensive guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_for_replyARead-onlyIdempotent
Block until a new message arrives from a specific group or friend.
Use this as a standalone follow-up after send_message (with
wait_reply=False) or when you need to wait for a reply without sending
first. Returns only messages from others (not the bot's own). Times out
after timeout seconds (max 300).
If you want to send a message AND wait for a reply in one call, use send_message with wait_reply=True instead — it's simpler.
Read-only. No side effects on the chat.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | ||
| target_type | No | group | |
| timeout | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds value beyond annotations: describes blocking behavior, timeout (max 300), return filtering (only others' messages), and explicitly states read-only and no side effects. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise, well-structured with clear sections. Front-loaded with purpose. Every sentence adds distinct value, no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 3 parameters, no output schema, and siblings, description fully explains behavior, constraints, side effects, and use cases. References sibling tool send_message for combined functionality. Complete for its complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so description compensates by explaining the timeout parameter and its max value. Implicitly describes target as 'specific group or friend' and target_type via context, though not as precisely as possible. Adds meaningful guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it blocks until a new message arrives from a specific group or friend, distinguishes from send_message by noting it returns only others' messages and has a timeout. Differentiates from sibling send_message by specifying when to use each.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs when to use: as a standalone follow-up after send_message with wait_reply=False or when waiting without sending first. Clearly tells when not to use: if sending and waiting in one call, use send_message with wait_reply=True. Provides alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.1.1- Changed
set_wake_enabled4 fields changed- removed
Input schema / properties / index / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - removed
Input schema / properties / index / defaultRemoved value: -null - added
Input schema / properties / index / typeAdded value: +"integer" - changed
Input schema / requiredPrevious value: -[ - "enabled" -]New value: +[ + "index", + "enabled" +]
33 tool updates
v0.1.0- First observed
add_timer - First observed
add_wake_rule - First observed
batch_get_recent_context - First observed
check_status - First observed
compress_context - First observed
debug_wake_pipeline - First observed
diagnose_wake - First observed
get_friend_list - First observed
get_group_list - First observed
get_group_member_info - First observed
get_group_member_list - First observed
get_recent_context - First observed
get_wake_config - First observed
kick_member - First observed
list_timers - First observed
list_wake_rules - First observed
mute_member - First observed
recall_message - First observed
remove_timer - First observed
remove_wake_rule - First observed
screenshot_chat - First observed
send_file - First observed
send_group_notice - First observed
send_image - First observed
send_message - First observed
send_voice - First observed
set_member_card - First observed
set_wake_config - First observed
set_wake_enabled - First observed
set_wake_pending - First observed
test_wake_activation - First observed
unmute_member - First observed
wait_for_reply
TDQS
Scored across 33 tools
Each tool has a clearly distinct purpose, with descriptions explicitly differentiating them (e.g., send_message vs send_image vs send_voice). Overlap is minimal and well-documented.
All tools follow a consistent verb_noun snake_case pattern (e.g., add_timer, list_timers, send_message). No mixing of conventions.
33 tools is high, but the domain (QQ bot management, wake rules, timers, configuration) justifies the count. Still, it feels heavy compared to typical well-scoped sets.
The tool surface covers the core domain comprehensively: messaging, group management, context handling, wake configuration, and debugging. Minor gaps exist (e.g., no message editing), but overall coverage is strong.
Maintenance
Related MCP Connectors
MCP server for AI dialogue using various LLM models via AceDataCloud
MCP server for Qwen Image 3 AI image generation
MCP server for Hailuo (MiniMax) AI video generation
Remote MCP server to read and manage your Atako AI agents, messages, files, and integrations.
Related MCP Servers
- AlicenseAqualityDmaintenanceAn 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.725MIT
- FlicenseNot gradedqualityDmaintenanceAn MCP server that enables WorkBuddy to invoke the kimi-code CLI locally via MCP protocol, allowing remote task execution through QQ messages.-
- FlicenseNot gradedqualityDmaintenanceMCP server for WeChat PC automation, enabling message sending, voice/video calls, and AI-powered listening through Cursor or WorkBuddy.2-
- AlicenseNot gradedqualityDmaintenanceA MCP server that exposes QQ bot capabilities over Streamable HTTP, enabling clients to query bot status, read group and friend info, fetch chat history, and send group/private text messages.2MIT