Skip to main content
Glama
evlon

codebuddy-matrix-channel

by evlon

codebuddy-matrix-channel

Un plugin de canal (servidor MCP) que conecta Matrix por chat con las sesiones locales de CodeBuddy Code.

El efecto es equivalente a los canales integrados de Telegram / Discord / WeChat de CodeBuddy:

  • Enviar un mensaje en una sala de Matrix → aparece en la sesión de CodeBuddy como #matrix · @alice:matrix.org: hola

  • Las respuestas de CodeBuddy se envían de vuelta a la sala de Matrix mediante la herramienta reply

  • Opcional: reenviar las solicitudes de permiso de CodeBuddy a la "sala de control" para aprobar/rechazar llamadas de herramientas desde el móvil

Este plugin se basa en el mecanismo de extensión Channel de CodeBuddy (ver docs/cn/cli/channels.md y channels-reference.md), sin necesidad de modificar CodeBuddy en sí.


1. Cómo funciona

Matrix 房间  ──(matrix-js-sdk 收消息)──▶  matrix-channel (本插件)
                                              │  notifications/claude/channel
                                              ▼
                                        CodeBuddy Code 会话
                                              │  reply 工具 / 权限请求
                                              ▼
                                        matrix-channel ──(sendText)──▶ Matrix 房间

El plugin se inicia como subproceso por CodeBuddy mediante stdio y se comunica a través del protocolo MCP.


Related MCP server: mcacp

2. Instalación

cd matrix-channel
npm install
npm run build        # 编译到 dist/(也可直接用 tsx 运行,无需构建)

Se requiere Node >= 20 en tiempo de ejecución.


2.1 Inicio rápido (avatar digital)

  1. Instalar / compilar

    cd matrix-channel && npm install && npm run build
  2. Rellenar .env (conjunto mínimo viable, ver sección 3)

    MATRIX_HOMESERVER=https://im.yiq.pub
    MATRIX_ACCESS_TOKEN=<从 Element:设置 → 帮助 → 高级 → 访问令牌 复制>
    MATRIX_USER_ID=@evlon-ai:im.yiq.pub
    MATRIX_ALLOWLIST=@evlon:im.yiq.pub           # 防 prompt 注入,必填
    MATRIX_OWNER_ID=@evlon:im.yiq.pub            # 分身管理者=你,审批权只认此身份
    MATRIX_CONTROL_ROOM_ID=!<控制室房间ID>:im.yiq.pub
    MATRIX_MENTION_REQUIRED=true                 # 群里只响应 @分身
    # 可选:MATRIX_TRUSTED_SENDERS / MATRIX_TRUSTED_ROOMS / MATRIX_AUTHORIZED_WORK
  3. Autocomprobación (ejecutar cada vez que se modifique .env)

    npm run doctor      # 期望:连接 ✅、账号 ✅、E2EE ✅
  4. Conectar con CodeBuddy: registrar en el .mcp.json del proyecto (ruta absoluta) y luego iniciar

    codebuddy --channels server:matrix --dangerously-load-development-channels
  5. Uso diario

    • @mencionar al avatar en el grupo para asignar tareas → las fuentes de confianza/trabajos autorizados se ejecutan automáticamente; los trabajos desconocidos primero generan un plan y entran en la sala de control esperando tu approve.

    • Las herramientas de alto riesgo (Bash/escritura de archivos, etc.) siempre requieren tu aprobación en la sala de control.

    • Tú das órdenes en la sala de control (solo se reconoce MATRIX_OWNER_ID):

      • approve (run / go, puede ir seguido del ID de sala) → autoriza la tarea de esa sala

      • yes <id> / no <id> → aprobar / rechazar las solicitudes de permiso de alto riesgo en espera

Para grupos cifrados se necesita MATRIX_E2EE=true; si MATRIX_DEVICE_ID se deja vacío, se seleccionará automáticamente desde /devices; si da error, rellena el ID de dispositivo de «Configuración → Dispositivos».


3. Configuración

Copia .env.example como .env y rellénalo:

cp .env.example .env

Variable

Descripción

MATRIX_HOMESERVER

Dirección del servidor doméstico, p. ej. https://matrix.org (obligatorio)

MATRIX_ACCESS_TOKEN

access_token de la cuenta (recomendado; copiar desde Element «Configuración → Ayuda»)

MATRIX_USER_ID

Opcional, para identificar "los propios mensajes", p. ej. @alice:matrix.org

MATRIX_USER / MATRIX_PASSWORD

Método de autenticación alternativo; al iniciar se usará loginWithPassword para obtener el token

MATRIX_ALLOWLIST

IDs de usuario remitentes permitidos para enviar mensajes, separados por comas (configurar obligatoriamente)

MATRIX_ROOM_ALLOWLIST

IDs de sala permitidos para escuchar, separados por comas (vacío = todas)

MATRIX_CONTROL_ROOM_ID

ID de la sala de control para el relevo de permisos (opcional, pero obligatorio en modo avatar digital)

MATRIX_OWNER_ID

ID de usuario de Matrix del administrador (owner) del avatar (obligatorio). El poder de aprobación solo reconoce esta identidad

MATRIX_TRUSTED_SENDERS

IDs de usuario de colegas de confianza, separados por comas; los trabajos de ellos se ejecutan automáticamente (herramientas seguras)

MATRIX_TRUSTED_ROOMS

IDs de grupos de confianza, separados por comas; todos los trabajos en estas salas se ejecutan automáticamente

MATRIX_AUTHORIZED_WORK

Descripción de trabajos habituales autorizados (texto libre), para que el avatar juzgue «habitual vs desconocido»

MATRIX_MENTION_REQUIRED

Si en los grupos solo se responde a mensajes con @menciones (por defecto true; recomendado activarlo con múltiples avatares)

MATRIX_HIGH_RISK_TOOLS

Lista de herramientas de alto riesgo, separadas por comas; por defecto Bash,Write,Edit,MultiEdit,NotebookEdit

MATRIX_DOWNLOAD_MEDIA

Si se descargan imágenes/archivos localmente y se inyectan como [file: ruta] (por defecto false)

MATRIX_MEDIA_DIR

Directorio de descarga de medios (por defecto .matrix-media)

MATRIX_E2EE

Si se habilita el cifrado de extremo a extremo (por defecto false, ver sección 6 más abajo)

MATRIX_CRYPTO_DB

No tiene efecto en matrix-js-sdk 42.x (ver sección 6): el crypto Rust usa wasm + el shim de memoria fake-indexeddb, las claves no se guardan en disco. Déjalo vacío

⚠️ Seguridad: configura obligatoriamente MATRIX_ALLOWLIST (se valida por remitente, no por sala, para evitar que cualquier miembro del grupo inyecte contenido en la sesión). Dejarlo vacío permite a todos, solo para pruebas locales.


4. Conexión con CodeBuddy

Método A: período de desarrollo (omitiendo la lista blanca del mercado)

Registra este plugin en el .mcp.json de tu proyecto CodeBuddy:

{
  "mcpServers": {
    "matrix": {
      "command": "npx",
      "args": ["tsx", "/绝对路径/matrix-channel/src/index.ts"]
    }
  }
}

Luego inicia CodeBuddy:

codebuddy --channels server:matrix --dangerously-load-development-channels

Tras compilar, se puede ejecutar con node cambiando a:

"args": ["node", "/绝对路径/matrix-channel/dist/index.js"]

Método B: empaquetar como plugin (tras enviarlo al mercado oficial)

npm run build

Luego publica codebuddy-matrix-channel como plugin y úsalo con:

codebuddy --channels plugin:matrix-channel@<你的市场>

5. Uso

  1. Tras iniciar, envía un mensaje en una sala de Matrix permitida y aparecerá #matrix · @tú: ... en la sesión de CodeBuddy

  2. Cuando CodeBuddy termine de procesar, la respuesta aparecerá en la sala de Matrix

  3. Si se ha configurado MATRIX_CONTROL_ROOM_ID: cuando CodeBuddy llame a herramientas que requieren aprobación (Bash / Write, etc.), la sala de control recibirá un aviso (enviado como notificación de sistema m.notice, sin activar no leídos/alertas); responde yes <id> para permitir / no <id> para rechazar

Parámetros de la herramienta reply

Parámetro

Descripción

chat_id

ID de la sala de Matrix (tomado del atributo chat_id de la etiqueta del mensaje en la sesión)

text

Texto a enviar

html

Opcional, cuerpo HTML (se envía junto con text, usando el formato org.matrix.custom.html)

msgtype

Opcional, m.text (por defecto, mensaje normal) o m.notice (notificación de sistema: no activa no leídos/alertas/notificaciones en el cliente)

Por ejemplo, haz que CodeBuddy responda con una nota de estado usando m.notice: reply({ chat_id: "!abc:server", text: "procesado", msgtype: "m.notice" }).

Herramienta health_check

Se puede invocar directamente en la sesión de CodeBuddy, o activarla en la comprobación de salud de /mcp; equivale a la parte de conectividad/E2EE de npm run doctor y devuelve JSON:

{ "ok": true, "userId": "@alice:matrix.org", "e2ee": true, "cryptoReady": true }

Cuando ok=false se incluye el campo error explicando el motivo del fallo (conexión/autenticación/inicialización E2EE).


6. Limitaciones y notas

  • Salas con cifrado de extremo a extremo (E2EE): por defecto solo se admiten salas sin cifrar. Para conectar salas cifradas, pon MATRIX_E2EE=true; el plugin reutiliza el crypto Rust integrado de matrix-js-sdk (initRustCrypto), y el SDK se encarga automáticamente de «descifrar al recibir, cifrar al enviar» — no es necesario implementar el protocolo de cifrado. Al activarlo:

    • Los mensajes cifrados llegan como m.room.encrypted; tras ser descifrados por el SDK (evento Event.decrypted), el tipo cambia al real y el plugin los envía a la sesión;

    • Las respuestas enviadas a salas cifradas son cifradas automáticamente por el SDK;

    • Almacenamiento de claves (importante, depende de la versión): en matrix-js-sdk 42.x, el backend crypto Rust solo tiene una implementación wasm/IndexedDB (@matrix-org/matrix-sdk-crypto-wasm), sin backend nativo de Node. Para que funcione en Node, el plugin inyecta un shim global indexedDB en Node al iniciar usando fake-indexeddb/auto — este shim es puramente en memoria, por lo tanto:

      • Las claves solo existen realmente en la memoria del proceso; MATRIX_CRYPTO_DB no generará un archivo SQLite real en disco en esta versión; tras reiniciar el proceso, las claves deben renegociarse (no afecta al envío/recepción, solo requiere rehacer el reenvío de claves/verificación de dispositivos).

      • La persistencia real en disco requiere actualizar a una versión de matrix-js-sdk que incluya el backend nativo @matrix-org/matrix-sdk-crypto-nodejs, o una versión futura que admita la entrada nodejs (en ese caso, se elimina el shim fake-indexeddb y se usa el backend nativo).

      • Nota: el @matrix-org/matrix-sdk-crypto-nodejs ya instalado en las dependencias no es invocado por el SDK en la versión actual 42.2.0; solo sirve como alternativa para futuras actualizaciones; el núcleo de cifrado actual funciona con wasm + el shim de memoria fake-indexeddb.

    • Cuando un dispositivo nuevo entra por primera vez en una sala cifrada, se recomienda verificar el dispositivo de este bot en el cliente de Matrix (de lo contrario, la otra parte podría ver el aviso de "dispositivo no verificado", aunque los mensajes seguirán enviándose y recibiéndose con normalidad).

  • Medios: por defecto solo se conecta el texto del mensaje a la sesión; al activar MATRIX_DOWNLOAD_MEDIA, las imágenes/archivos se descargan localmente y se inyectan como [file: ruta], para que el Agente pueda leerlos.

  • Relevo de permisos: depende de la capacidad claude/channel/permission de CodeBuddy; si la versión de CodeBuddy no la admite, el puente de chat principal no se ve afectado.


7. Avatar digital: modelo de autorización del administrador (escenario principal)

Trata al avatar como un «colega en el grupo»: se le puede asignar trabajo con @ libremente, pero no modificará nada realmente sin el consentimiento del administrador.

Escenario

  • Los colegas crean varios grupos (p. ej. #ProyectoA, #Atención al cliente), donde puede haber varios bots avatar simultáneamente. Los colegas @mencionan a tu avatar en el grupo para asignar trabajo; solo responde cuando es @mencionado (en mensajes directos siempre responde).

  • Al recibir una asignación:

    • Trabajo habitual / autorizado (de MATRIX_TRUSTED_SENDERS / MATRIX_TRUSTED_ROOMS preconfigurados, o dentro del ámbito descrito en MATRIX_AUTHORIZED_WORK) → ejecución automática (herramientas seguras).

    • Trabajo desconocido (fuera del ámbito autorizado) → el avatar primero genera un plan, llama a request_approval para escalarlo a tu sala de control; solo se ejecuta cuando respondes approve.

    • Operaciones de alto riesgo (MATRIX_HIGH_RISK_TOOLS, como Bash / escritura de archivos) → independientemente del origen, siempre requieren tu aprobación.

Arquitectura en capas

  • Plugin MCP = transporte seguro + compuerta dura (impuesta por código, no se confía en el modelo): el filtro de @, la decisión de permisos allow/deny se basan únicamente en hechos verificables (si es owner, si es fuente de confianza, si es herramienta de alto riesgo), y la aprobación en la sala de control solo reconoce MATRIX_OWNER_ID.

  • SKILL = cerebro de políticas (juicio semántico, delegado al Agente): skills/matrix-avatar/SKILL.md guía al avatar para juzgar «habitual vs desconocido»; cuando es desconocido, entra en modo plan y llama a request_approval. El Agente solo solicita aprobación, nunca se autoautoriza; la autorización solo proviene de «los ajustes de fuentes de confianza del administrador» o del approve del administrador.

Las instructions del canal integradas en el plugin ya incluyen esta política, por lo que funciona sin instalar el SKILL adicionalmente; skills/matrix-avatar/SKILL.md está disponible para que lo reutilices/ajustes en CodeBuddy.

Estados de tarea en tres niveles (por sala)

Estado

Significado

Herramientas seguras

Herramientas de alto riesgo

approved

Fuente de confianza / ya approve

Ejecución automática

Consultar al administrador (sala de control yes)

pending

Escalado en espera de revisión (request_approval)

Bloqueado

Bloqueado

unauthorized

Fuente desconocida no autorizada

Bloqueado

Bloqueado (y avisar approve)

Comandos de la sala de control (solo válidos para el administrador MATRIX_OWNER_ID)

  • approve (o run / go, opcionalmente seguido del ID de sala, p. ej. approve !projectA:server) → autoriza la tarea actual de esa sala y el avatar comienza a ejecutarla.

  • yes <id> / no <id> → aprobar / rechazar las solicitudes de permiso de alto riesgo en espera.

  • Las respuestas de otras personas en la sala de control se ignoran.

Ejemplo de configuración (.env)

MATRIX_OWNER_ID=@you:matrix.org
MATRIX_TRUSTED_SENDERS=@alice:matrix.org,@bob:matrix.org
MATRIX_TRUSTED_ROOMS=!projectA:server
MATRIX_AUTHORIZED_WORK=回答产品问题、总结会议纪要、起草文档
MATRIX_MENTION_REQUIRED=true
MATRIX_HIGH_RISK_TOOLS=Bash,Write,Edit,MultiEdit,NotebookEdit

8. Autocomprobación (doctor)

Tras rellenar .env, puedes ejecutar la autocomprobación para confirmar la configuración, la conectividad y el estado E2EE antes de iniciar CodeBuddy:

npm run doctor

La autocomprobación imprime la configuración actual (token enmascarado), verifica que el homeserver sea accesible y que las credenciales sean válidas, e intenta inicializar el crypto Rust cuando MATRIX_E2EE=true. Si falla cualquier elemento, se indica claramente el motivo y se termina con código de salida distinto de 0.


9. Estructura de directorios

matrix-channel/
├── src/
│   ├── config.ts     # 环境变量 / 白名单 / 授权配置读取与校验
│   ├── matrix.ts     # Matrix 客户端封装(连接、@提及过滤、收/发、下载媒体、E2EE、自检)
│   ├── index.ts      # MCP 服务:channel 通知、授权硬闸、reply / request_approval 工具、控制室审批
│   └── doctor.ts     # `npm run doctor` 自检入口
├── skills/
│   └── matrix-avatar/
│       └── SKILL.md  # 分身行为策略(语义判断:常用 vs 陌生)
├── package.json
├── tsconfig.json
├── .gitignore
├── .env.example
└── README.md

Available Tools

6 tools
health_checkA

运行连接/E2EE 自检(等价于 npm run doctor),返回 Matrix 连接与加密状态。可在 /mcp 健康检查中调用。

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses that the tool performs a diagnostic self-check and returns connection and encryption status, which implies a read-only probe. It does not explicitly say it has no side effects, but the self-check framing makes the behavior sufficiently transparent for a zero-parameter tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one compact sentence that front-loads the action and scope, then adds the return value and invocation context. Every clause earns its place; there is no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple zero-parameter diagnostic tool with no output schema, the description covers purpose, method, return value, and invocation context. Nothing essential is missing for an agent to select and call the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has no parameters and schema description coverage is 100%, so there is nothing for the description to clarify. Baseline for zero parameters is 4, and the description adds no conflicting or misleading parameter information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: it runs a connection/E2EE self-check equivalent to 'npm run doctor' and returns Matrix connection and encryption status. It also distinguishes this health-check tool from the messaging/approval-oriented sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear usage context by stating it can be invoked during /mcp health checks and is for checking connection/encryption status. It does not explicitly name when-not-to-use conditions, but the sibling tools are clearly different in purpose, so the distinction is implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_roomsA

列出本分身已加入的所有 Matrix 房间(room_id + 标题),用于了解「我在哪些房间 / 群」。当不知道该回哪个房间时,可据此找到与管理者(owner)的私聊房间。

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and discloses the scope (only rooms the avatar has joined) and the output content (room_id + title). For a read-only, zero-parameter listing tool this is adequate, though it omits minor traits like ordering, pagination, and whether the owner room is guaranteed to exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with zero filler. The first sentence front-loads the core purpose and output fields; the second adds a practical decision aid without repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple 0-parameter list tool with no output schema, the description covers what is listed, what fields come back, and when to use it. Minor gaps (e.g., behavior when no rooms exist, pagination) are low-stakes for a read-only listing, so nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so schema coverage is trivially 100% and there is nothing to document. The baseline of 4 applies because no parameter semantics are needed; the description appropriately spends its effort on output and scope instead.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb (列出/list) and resource (all Matrix rooms this avatar has joined), and explicitly states the returned fields (room_id + title). The scope '本分身已加入' clearly separates it from per-room siblings like room_info and room_members, so an agent can tell them apart without opening another schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides a concrete usage scenario: when unsure which room to reply to, use this tool to locate the owner's private chat room. It does not, however, name alternatives or state when not to use it (e.g., room_info for a single room's details), so it lacks explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

replyA

通过 Matrix 把回复发送到指定房间(chat_id)。省略 chat_id 时回复发往最近一次转发进来的房间(原路返回)。发送会按配置自动重试;若多次仍发不回来源房间,则改用默认回复(MATRIX_DEFAULT_REPLY)发往控制室/owner 私聊兜底。

ParametersJSON Schema
NameRequiredDescriptionDefault
htmlNo可选,HTML 格式正文(与 text 同时发送)
textYes要发送的文本
chat_idNoMatrix 房间 ID,例如 !abc:server。省略时回复发往最近一次转发进来的房间。
msgtypeNo消息类型:m.text 普通消息;m.notice 系统提示(不触发未读/提醒)

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

没有 annotations,因此描述承担了全部行为披露责任。描述主动说明了自动重试机制、失败后的默认回复兜底行为(发往控制室/owner 私聊),以及原路返回的逻辑,这些都是非显而易见的关键行为。

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

描述短小精悍,三句话分别说明核心操作、chat_id 省略行为和重试/兜底机制,信息密度高且没有冗余。关键行为前置,结构清晰。

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

对于发送消息类工具,描述配合完整 schema 已覆盖调用所需信息:目标房间、默认回退行为、重试和失败兜底。没有输出 schema 也不影响理解,整体上下文完整。

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema 描述覆盖率为 100%,所有参数在 schema 中已有说明。描述额外强调了 chat_id 省略时的行为,但 schema 中同样包含该信息,因此描述在参数语义上未显著超出 schema 提供的价值。

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

描述明确说明该工具通过 Matrix 发送回复到指定房间,并解释了省略 chat_id 时的原路返回行为。动词和资源都很具体,与 list_rooms、room_info 等只读查询类兄弟工具形成清晰区分。

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

描述清晰说明了何时使用该工具(发送回复)以及省略 chat_id 时的行为,但未明确提及何时不应使用或列举替代工具。整体使用场景清楚,只是缺少显式的排他性说明。

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

request_approvalA

当判断当前任务来自陌生来源或含高风险时调用,把任务升级到管理者控制室等待审批。管理者回复 approve 后任务会被重放并执行。

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonYes需要审批的原因/计划摘要

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It explains that the task is escalated, that it waits for approval, and that it will be replayed and executed after the manager replies 'approve'. It does not mention rejection behavior, but the core lifecycle is clearly disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one concise sentence that front-loads the trigger condition, then states the action and outcome. Every part is informative and there is no redundant wording.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with a single required parameter and no output schema, the description covers the key context: when to call, what happens, and what triggers execution. It does not specify behavior on rejection, but the overall guidance is sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already covers the single parameter 'reason' with 100% coverage, including its meaning as the approval reason or plan summary. The description adds no further parameter-level detail, so the baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies a specific action: escalating the current task to a manager control room for approval. It also gives the triggering condition ('unfamiliar source or high risk'), which distinguishes it from the sibling tools like reply, health_check, and list_rooms.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool: when the task is from an unfamiliar source or carries high risk. It does not explicitly list alternatives or exclusions, but the condition is clear enough that an agent can decide appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

room_infoA

获取指定 Matrix 房间(群/私聊)的可读信息:名称、主题、成员昵称与 ID。用于配置与检查「房间 ID ↔ 名称」映射。chat_id 省略时取最近一次转发进来的房间。

ParametersJSON Schema
NameRequiredDescriptionDefault
chat_idNoMatrix 房间 ID,例如 !abc:server。省略时取最近对话房间。

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the behavioral disclosure burden. It does disclose that the operation retrieves readable info and defines the default behavior when chat_id is omitted, which is useful. However, it does not explicitly state that the operation has no side effects, what happens on invalid room IDs, or any permission requirements — gaps that matter for a tool with zero annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler. The first sentence states the tool's purpose and outputs, the second gives the use case and default behavior. Critical information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple getter with one optional parameter, the description is mostly complete: it lists return fields, the use case, and the fallback behavior. Since there is no output schema, describing the expected fields is important and done here. Minor omissions around error/not-found behavior prevent a 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds value beyond the schema by clarifying that 'recent conversation' specifically means the most recently forwarded room, and by explaining why chat_id is optional in terms of the mapping use case.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description specifies a clear verb ('获取' / get) and resource ('指定 Matrix 房间'), and lists the exact data returned (name, topic, member nicknames and IDs). It does not explicitly contrast itself with siblings such as list_rooms or room_members, but the resource scope and output fields are specific enough to distinguish it without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states a concrete use case: configuring and checking the 'room ID ↔ name' mapping. It also explains the optional chat_id behavior (fallback to the most recently forwarded room), which guides when to call the tool without an argument. No alternatives or when-not-to-use conditions are mentioned, hence not a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

room_membersA

获取指定 Matrix 房间(群聊)的在场成员列表,返回每个成员的 user_id 与 display_name,用于了解「谁在场」。chat_id 省略时取最近一次转发进来的房间。

ParametersJSON Schema
NameRequiredDescriptionDefault
chat_idNoMatrix 房间 ID,例如 !abc:server。省略时取最近对话房间。

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

无 annotations,描述承担行为说明职责。它说明了工具是只读查询、返回成员列表并解释 chat_id 缺省行为,但未披露任何可能的权限要求、失败情形或数据即时性等行为特征。

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

两句话完整说明用途、返回值与缺省行为,信息密度高且无冗余,属于精炼的合格描述。

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

对单参数只读列表工具,描述已说明返回字段、缺省行为和使用场景;缺少输出结构样例或错误条件,但整体足以让 agent 正确调用。

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

参数仅有 chat_id,schema 已包含描述;描述额外说明了省略 chat_id 时的默认行为(取最近对话房间),为参数语义增加了超出 schema 的价值。

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

描述使用明确动词「获取」与资源「指定 Matrix 房间(群聊)的在场成员列表」,并具体说明返回 user_id 与 display_name,足以与 siblings 如 list_rooms、room_info 区分。

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

描述说明 chat_id 省略时取最近转发进来的房间,提供了明确的使用上下文;但未明确说明何时不使用本工具(例如需要房间详情时用 room_info),因此未达满分。

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. 6 tool updatesv0.1.0
    • First observedhealth_check
    • First observedlist_rooms
    • First observedreply
    • First observedrequest_approval
    • First observedroom_info
    • First observedroom_members

TDQS

A4.1/5.0

Scored across 6 tools

Disambiguation4/5

The tools are mostly distinct: reply, health_check, request_approval, list_rooms, room_members, and room_info each target a different action or resource. The only mild overlap is between room_info and room_members, since room_info also includes member names/IDs, but the descriptions are clear enough to guide selection.

Naming Consistency3/5

All names are lowercase snake_case, but the semantic pattern is mixed: reply is a bare verb, list_rooms and request_approval are verb+noun, while room_members and room_info are noun+noun descriptors. This is readable but not consistently a verb_noun convention.

Tool Count5/5

Six tools is a tight, well-scoped set for a Matrix channel bridge. Each tool supports a distinct part of the workflow—responding, verifying health, escalating approval, and discovering rooms and participants—without redundancy or bloat.

Completeness4/5

The set covers the core bot workflow on a Matrix channel: replying, understanding room context, checking connection health, and handling approval escalation. Minor gaps like joining/leaving rooms or reading message history exist, but they are outside the apparent core purpose and do not create dead ends.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers