Skip to main content
Glama

MCP ToolHub

MCP ToolHub es un servidor local del Model Context Protocol, únicamente para stdio, que expone operaciones acotadas del sistema de archivos del espacio de trabajo, inspección de solo lectura de Git, ejecución estructurada de comandos y un registro de auditoría. Las operaciones de mutación del sistema de archivos y todos los comandos de shell externos seleccionados por el agente utilizan el modelo existente de aprobación humana fuera de banda.

ToolHub no expone ningún listener HTTP, SSE ni de otro tipo de red.

Características

  • Lectura de archivos confinada al espacio de trabajo, listado de directorios, escrituras y parches

  • Operaciones de estado y diff de Git de solo lectura

  • Comandos de shell estructurados con clasificación de riesgo de denegación por defecto

  • Solicitudes de aprobación atómicas, con caducidad y de un solo uso

  • CLI de administrador confiable separada; no existe ninguna herramienta MCP de autoaprobación

  • Eventos de auditoría en JSON Lines acotados y expurgados

  • Compatibilidad con Windows y POSIX

Related MCP server: agent-bridge-mcp

Requisitos

  • Python 3.12 o posterior (el CI valida actualmente 3.12 y 3.13)

  • Un cliente MCP que admita servidores stdio

  • git para las herramientas de Git y las solicitudes de shell de Git sujetas a aprobación

Instalación

Instale desde una copia del código fuente con uv:

uv tool install .

O compile e instale el wheel:

uv build
uv tool install dist/mcp_toolhub-0.1.0-py3-none-any.whl

La instalación proporciona dos ejecutables:

  • mcp-toolhub — el servidor MCP stdio

  • mcp-toolhub-admin — la CLI de aprobación humana confiable

Configuración en tiempo de ejecución

Raíz del espacio de trabajo

TOOLHUB_WORKSPACE_ROOT es obligatorio para mcp-toolhub serve y para la CLI de administrador. Debe contener una ruta absoluta a un directorio existente. ToolHub canonicaliza la ruta una vez y la congela durante toda la vida del proceso.

ToolHub no toma por defecto, deliberadamente, el directorio actual, la copia del código fuente ni el directorio de instalación.

Raíz de estado confiable

TOOLHUB_STATE_ROOT selecciona opcionalmente el directorio que contiene workspace-binding.json, approvals.json y audit.jsonl. Cuando se proporciona, debe ser absoluto. El directorio queda vinculado permanentemente, en su primer uso válido, a exactamente un espacio de trabajo canónico; reutilizarlo para otro espacio de trabajo falla de forma segura.

Cuando TOOLHUB_STATE_ROOT no está definido, ToolHub utiliza como base el directorio de estado por usuario apropiado para la plataforma de platformdirs. Cada espacio de trabajo canónico recibe un espacio de nombres independiente bajo workspaces/, denominado con un identificador SHA-256 determinista derivado de la ruta canónica del espacio de trabajo normalizada para la plataforma. El identificador evita colocar la ruta del espacio de trabajo en los nombres de directorio, pero es una separación de espacios de nombres, no un secreto de autenticación. Mover o renombrar un espacio de trabajo normalmente crea un nuevo espacio de nombres predeterminado.

El directorio de estado se crea según sea necesario, se canonicaliza y se congela junto con la configuración del espacio de trabajo. El inicio falla si la raíz de estado está dentro del espacio de trabajo. El servidor y la CLI de administrador deben ejecutarse como el mismo usuario y con la misma configuración de espacio de trabajo y estado para que compartan este estado.

Ejemplo en POSIX

export TOOLHUB_WORKSPACE_ROOT=/home/alice/projects/example
export TOOLHUB_STATE_ROOT=/home/alice/.local/state/mcp-toolhub
mcp-toolhub serve

Ejemplo en Windows PowerShell

$env:TOOLHUB_WORKSPACE_ROOT = "D:\work\example"
$env:TOOLHUB_STATE_ROOT = "$env:LOCALAPPDATA\mcp-toolhub"
mcp-toolhub serve

El servidor no escribe ningún banner ni texto de registro legible por humanos en stdout. Stdout está reservado exclusivamente para los mensajes del protocolo MCP. Los errores de configuración esperados se notifican de forma concisa en stderr y el proceso sale con un código distinto de cero.

Comandos

mcp-toolhub --version
mcp-toolhub serve
python -m mcp_toolhub serve

mcp-toolhub-admin --help
mcp-toolhub-admin list
mcp-toolhub-admin approve REQUEST_ID
mcp-toolhub-admin reject REQUEST_ID

El comando de administrador está orientado a humanos y puede escribir salida normal en stdout. No es un proceso de transporte MCP.

Configuración del cliente MCP

La clave de configuración externa exacta varía según el cliente. Una entrada de stdio típica en POSIX es:

{
  "mcpServers": {
    "toolhub": {
      "command": "mcp-toolhub",
      "args": ["serve"],
      "env": {
        "TOOLHUB_WORKSPACE_ROOT": "/home/alice/projects/example",
        "TOOLHUB_STATE_ROOT": "/home/alice/.local/state/mcp-toolhub"
      }
    }
  }
}

Las rutas de Windows requieren escape JSON:

{
  "mcpServers": {
    "toolhub": {
      "command": "mcp-toolhub",
      "args": ["serve"],
      "env": {
        "TOOLHUB_WORKSPACE_ROOT": "D:\\work\\example",
        "TOOLHUB_STATE_ROOT": "C:\\Users\\alice\\AppData\\Local\\mcp-toolhub"
      }
    }
  }
}

Utilice una ruta de ejecutable absoluta si el cliente MCP no hereda el PATH del shell.

Inventario de herramientas

El servidor de producción expone exactamente estas 12 herramientas MCP:

  • toolhub.ping

  • toolhub.audit_recent

  • filesystem.list_directory

  • filesystem.read_file

  • filesystem.write_file

  • filesystem.write_file_approved

  • filesystem.apply_patch

  • filesystem.apply_patch_approved

  • git.status

  • git.diff

  • shell.run

  • shell.run_approved

No existe ninguna herramienta MCP de administración, aprobación ni rechazo.

Flujo de aprobación humana

  1. Una mutación MCP o una solicitud de shell externa devuelve un ID de solicitud pendiente.

  2. El administrador ejecuta mcp-toolhub-admin list con el mismo espacio de trabajo y entorno de estado que el servidor.

  3. Para la aprobación, el administrador ejecuta mcp-toolhub-admin approve REQUEST_ID.

  4. La CLI muestra la solicitud protegida y exige que el operador escriba exactamente APPROVE.

  5. El llamador MCP invoca la herramienta _approved correspondiente con el ID de solicitud. El consumo correcto es atómico y de un solo uso.

Para las solicitudes de shell, la pantalla de aprobación incluye el programa original, el ejecutable resuelto canónico, el SHA-256, el tamaño en bytes, cwd y los valores de los argumentos con escape JSON por separado. No representa los argumentos como una cadena de comando de shell ambigua.

Modelo de seguridad y limitaciones

Comandos de shell estructurados

shell.run utiliza una política de denegación por defecto para comandos. LOW se limita a las funciones intrínsecas exactas de ToolHub, actualmente la consulta de la versión de Python en ejecución. LOW nunca busca en PATH y nunca crea un subproceso externo. Git genérico, intérpretes de shell, scripts batch de Windows, el lanzador py y los programas desconocidos nunca son LOW.

Todo comando de shell externo es MEDIUM o HIGH y requiere una aprobación de administrador fuera de banda. La aprobación captura instantáneas inmutables del programa, los argumentos, cwd, timeout, el espacio de trabajo y el ejecutable principal. Una solicitud de shell aprobada se consume de forma atómica antes de la validación de la instantánea; cualquier fallo posterior la consume permanentemente, por lo que un reintento requiere una nueva aprobación.

Inmediatamente antes del lanzamiento de subprocess, ToolHub valida la ruta canónica, el tamaño y el SHA-256 del ejecutable principal. La ejecución utiliza esa ruta absoluta con shell=False. Esto es una identidad del ejecutable principal validada inmediatamente antes del lanzamiento, no una garantía criptográfica de los bytes exactos que el sistema operativo mapea finalmente.

ToolHub garantiza:

  • LOW nunca crea un subproceso externo.

  • Toda ejecución de shell externa requiere aprobación MEDIUM o HIGH.

  • El agente no puede reemplazar el programa, los argumentos, cwd ni el timeout aprobados.

  • Las aprobaciones son atómicas, con caducidad y de un solo uso.

  • Las instantáneas del espacio de trabajo y del ejecutable principal son obligatorias y fallan de forma segura.

  • La identidad canónica y el hash del ejecutable principal se vuelven a validar inmediatamente antes del lanzamiento.

  • Las rutas del sistema de archivos permanecen dentro del límite congelado del espacio de trabajo.

  • Las rutas de mutación rechazan el cruce de enlaces simbólicos y aplican comprobaciones de concurrencia de expected_hash cuando corresponde.

ToolHub no garantiza:

  • La identidad exacta de los bytes frente a un adversario local concurrente del sistema de archivos durante la estrecha condición de carrera final entre la comprobación y la ejecución.

  • La identidad de las DLL, los intérpretes, los ayudantes, los complementos, los archivos de configuración, las dependencias seleccionadas por el entorno o los procesos descendientes.

  • Que los bytes del ejecutable aprobado sean benignos, estén firmados o provengan de un editor de confianza.

La pantalla de aprobación del administrador expone la ruta canónica protegida, el hash, el tamaño, cwd y los límites exactos de los argumentos con escape JSON. Los eventos de auditoría legibles por el agente omiten los directorios de los ejecutables externos y conservan el nombre base, el hash, el tamaño, el ámbito y la correlación con el ID de solicitud.

Comportamiento de auditoría

Los eventos de auditoría se añaden a audit.jsonl bajo la raíz de estado confiable. Contienen metadatos acotados, expurgan argumentos secretos reconocibles y almacenan recuentos de caracteres de stdout/stderr en lugar de la salida bruta del proceso. Los fallos de escritura de la auditoría no son fatales para la ejecución de las herramientas.

Desarrollo

Instale todas las dependencias de ejecución y de desarrollo bloqueadas:

uv sync --all-groups

Ejecute las comprobaciones requeridas:

uv run ruff check .
uv run ruff format --check .
uv run python -m compileall -q src/mcp_toolhub
uv run pytest -q
uv build
git diff --check

Para aplicar el formato deliberadamente:

uv run ruff format .

Prueba de humo del artefacto

Después de uv build, ejecute el controlador de prueba de humo multiplataforma con un entorno virtual fuera de la copia del código fuente.

POSIX:

uv run python scripts/artifact_smoke.py --dist-dir dist --venv /tmp/mcp-toolhub-wheel-env --repository .

Windows PowerShell:

uv run python scripts/artifact_smoke.py --dist-dir dist --venv "$env:TEMP\mcp-toolhub-wheel-env" --repository .

El controlador inspecciona el contenido del wheel, instala solo el wheel en el entorno aislado, verifica el comportamiento de consola/versión y ejecuta, desde fuera del repositorio, las pruebas de initialize, list_tools, ping, acceso al espacio de trabajo configurado, configuración no válida y estado compartido servidor/administrador.

Solución de problemas

  • TOOLHUB_WORKSPACE_ROOT is required: añada una ruta absoluta de un espacio de trabajo existente al entorno del cliente MCP.

  • El espacio de trabajo no es un directorio: cree el directorio o corrija la ruta.

  • La raíz de estado debe estar fuera del espacio de trabajo: mueva TOOLHUB_STATE_ROOT a un directorio confiable al que las herramientas del sistema de archivos de MCP no puedan acceder.

  • El espacio de nombres de estado pertenece a otro espacio de trabajo: seleccione un TOOLHUB_STATE_ROOT explícito diferente; los enlaces nunca se reasignan silenciosamente.

  • El cliente informa de un JSON stdio no válido: verifique que los envoltorios y los scripts de inicio no impriman banners ni registros en stdout.

  • El administrador no puede ver una solicitud: confirme que el servidor y el administrador se ejecutan como el mismo usuario con configuraciones idénticas de espacio de trabajo y raíz de estado.

  • El ejecutable cambió después de la aprobación: solicite una nueva aprobación; las aprobaciones consumidas o invalidadas nunca se reproducen.

El ToolHub de producción no expone deliberadamente ninguna superficie HTTP, SSE, de red pública, de servidor de autenticación, de orquestación de contenedores ni de alojamiento en la nube.

Available Tools

14 tools
filesystem.apply_patchApply workspace file patch (approval required)A
Destructive

Create a PENDING approval request for a narrowly-scoped patch.

The patch may modify only the requested file, and is applied only after out-of-band approval via filesystem.apply_patch_approved.

NameRequiredDescriptionDefault
pathYes
patchYes
expected_hashNo

Output Schema

NameRequiredDescription
pathYes
errorNo
changedNo
messageNo
outcomeYes
approvalNo
executedYes
new_hashNo
trace_idYes
additionsNo
deletionsNo
request_idNo
bytes_afterNo
bytes_beforeNo
previous_hashNo
approval_statusNo

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds meaningful non-structured behavior: no mutation occurs now, a pending request is created, and application requires an out-of-band approval step. It omits any concurrency/expected_hash behavior and what happens to a pending request that is never approved.

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 no filler; the crucial fact (a pending request is created, not an applied change) is front-loaded in the first sentence.

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?

An output schema exists, so return values need not be explained, and the description covers the approval workflow that dominates this tool's behavior. The remaining gap is the undocumented expected_hash parameter and the lifecycle of an unapproved request.

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

Parameters2/5

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

Schema description coverage is 0% across three parameters, so the description must carry the load. It only obliquely covers 'path' ('the requested file') and 'patch' ('narrowly-scoped patch'), and never mentions expected_hash at all, leaving a required-but-undocumented concurrency parameter.

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?

States a specific verb and resource ('Create a PENDING approval request') plus the scope constraint ('narrowly-scoped patch'). It explicitly names the sibling that performs the actual application (filesystem.apply_patch_approved), so an agent can distinguish it from the approval counterpart without opening either 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?

Gives clear context: this tool only stages a request, and the patch is applied only after out-of-band approval via filesystem.apply_patch_approved, naming the required follow-up tool. It stops short of telling the agent when to prefer a patch over filesystem.write_file for the same edit.

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

filesystem.apply_patch_approvedExecute an approved file patchA
Destructive

Execute exactly the patch stored in an APPROVED request.

Takes only a request_id; the stored snapshot is used. Single-use.

NameRequiredDescriptionDefault
request_idYes

Output Schema

NameRequiredDescription
pathYes
errorNo
changedNo
messageNo
outcomeYes
approvalNo
executedYes
new_hashNo
trace_idYes
additionsNo
deletionsNo
request_idNo
bytes_afterNo
bytes_beforeNo
previous_hashNo
approval_statusNo

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and non-read-only, so the safety profile is covered. The description adds genuine value beyond that: the patch is taken from a stored snapshot, the caller supplies nothing but an id, and the invocation is single-use. It does not disclose failure/consumption behavior on error.

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?

Three short sentences, zero waste, with the action and its precondition front-loaded before the parameter and lifecycle notes.

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?

An output schema exists, so return values need not be explained, and annotations cover the destructive profile. The description covers the approval prerequisite, snapshot source, and single-use nature; only post-failure behavior is unaddressed, which is minor.

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 description coverage is 0% and there is one parameter, so the description carries the burden. It clarifies that request_id is the sole input, that the patch content cannot be supplied or overridden, and that a stored snapshot is used — meaningfully constraining what the id refers to.

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?

Specific verb+resource: 'Execute exactly the patch stored in an APPROVED request.' The 'APPROVED' qualifier implicitly differentiates it from the sibling filesystem.apply_patch without naming it. Clear, though it never explicitly names the alternative sibling.

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

Usage Guidelines3/5

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

The word 'APPROVED' implies the prerequisite that a prior approval must exist, and 'Single-use' hints at the invocation constraint. However, it never states when to prefer this over filesystem.apply_patch, or what to do if the request is not approved.

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

filesystem.list_directoryList workspace directoryB
Read-only

List files and directories inside the ToolHub workspace.

NameRequiredDescriptionDefault
pathNo.

Output Schema

NameRequiredDescription
pathYes
entriesYes

TDQS

B3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds the useful constraint that listing is confined to the ToolHub workspace (a sandboxing detail), but says nothing about recursion, hidden files, or result limits.

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

Conciseness4/5

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

A single front-loaded sentence with no filler, which is efficient. It is arguably too terse given the undocumented path parameter, but it wastes no words.

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

Completeness3/5

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

An output schema exists, so return values need not be described, and annotations cover safety. However, the path parameter's semantics and any usage context are absent, leaving an agent to guess at basic invocation details.

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

Parameters2/5

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

One parameter ('path') with 0% schema description coverage; the only hint is the default '.'. The description never mentions the path argument, so it adds no meaning about what path selects or whether it is relative to the workspace root.

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?

States a specific verb ('List') and resource ('files and directories') scoped to the ToolHub workspace, which is more precise than a bare 'list'. It does not explicitly differentiate itself from siblings like filesystem.read_file or shell.run, so it falls short of a 5.

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

Usage Guidelines2/5

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

No when-to-use guidance, no alternatives named, and no indication of when to prefer this over shell.run or read_file. The only implied context is that it operates on the workspace.

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

filesystem.read_fileRead workspace fileB
Read-only

Read a UTF-8 text file inside the ToolHub workspace.

NameRequiredDescriptionDefault
pathYes

Output Schema

NameRequiredDescription
pathYes
sizeYes
sha256Yes
contentYes

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, covering the safety and closed-world aspects. The description adds that it reads only UTF-8 text files, which is useful context not in annotations, but does not disclose error behavior, encoding constraints, or path resolution rules.

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

Conciseness4/5

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

One short sentence, front-loaded with verb and resource. No waste, but minimal detail.

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

Completeness2/5

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

For a read tool with one undocumented parameter and no output schema explanation, the description is too sparse. It omits return format details (though output schema exists), error handling, and path constraints, leaving key gaps.

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

Parameters2/5

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

Schema coverage is 0% and the single path parameter is entirely undocumented in both schema and description. The description does not explain path syntax, relative vs absolute, or whether it must be within the workspace. It fails to compensate for the coverage gap.

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?

States a specific verb (read) and resource (UTF-8 text file inside workspace), which distinguishes it from the sibling write_file and apply_patch tools. It does not explicitly name alternatives, but the scope contrast is clear.

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

Usage Guidelines3/5

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

The description implies usage for reading text files in the workspace, but does not state when to use this vs list_directory or what happens for binary files. No explicit when-not or alternative routing.

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

filesystem.write_fileWrite workspace file (approval required)A
Destructive

Create a PENDING approval request for writing a UTF-8 text file.

The write happens only after a trusted administrator approves the request out-of-band and filesystem.write_file_approved executes the stored snapshot.

NameRequiredDescriptionDefault
pathYes
contentYes
expected_hashNo
create_parentsNo

Output Schema

NameRequiredDescription
pathYes
errorNo
createdNo
messageNo
outcomeYes
approvalNo
executedYes
new_hashNo
trace_idYes
request_idNo
bytes_writtenNo
previous_hashNo
approval_statusNo

TDQS

A4.4/5.0
Behavior5/5

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

Annotations only convey destructiveHint=true and readOnlyHint=false; the description adds the crucial behavioral facts the annotations cannot: the operation is deferred, produces a pending request, requires out-of-band admin approval, and is enacted by a separate tool. That is well beyond the structured safety hints and materially changes how an agent should reason about the call.

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

Conciseness4/5

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

Two sentences, front-loaded with the key fact that this creates a pending request rather than writing immediately. No filler, though the second sentence's clause structure could be tightened slightly.

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 deferred-mutation tool the approval workflow is fully explained, and an output schema exists so return values need not be described. The remaining shortfall is the undocumented parameter semantics (expected_hash, create_parents), which leaves an agent guessing about concurrency and directory creation behavior.

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

Parameters2/5

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

Schema description coverage is 0% and there are four parameters, yet the description never explains expected_hash (likely an optimistic-concurrency guard) or create_parents, and it does not clarify path scoping or content encoding beyond 'UTF-8'. With the schema carrying no parameter documentation, the description fails to compensate for the gap.

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?

States a specific verb and effect ('Create a PENDING approval request for writing a UTF-8 text file'), naming the exact artifact produced rather than just 'write a file'. It also names the sibling filesystem.write_file_approved, so an agent can distinguish this deferred-approval tool from the one that actually executes the write.

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

Usage Guidelines5/5

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

Explicitly states the condition under which the write occurs ('only after a trusted administrator approves the request out-of-band and filesystem.write_file_approved executes the stored snapshot'), which tells the agent this call is a request, not a completed write. It routes the agent to the correct follow-up tool rather than leaving the workflow to inference.

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

filesystem.write_file_approvedExecute an approved file writeA
Destructive

Execute exactly the file write stored in an APPROVED request.

Takes only a request_id; the path/content/hash snapshot captured at request time is used. Single-use.

NameRequiredDescriptionDefault
request_idYes

Output Schema

NameRequiredDescription
pathYes
errorNo
createdNo
messageNo
outcomeYes
approvalNo
executedYes
new_hashNo
trace_idYes
request_idNo
bytes_writtenNo
previous_hashNo
approval_statusNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the write/mutating nature is covered. The description adds real value beyond that: the path/content/hash are frozen at request time (so the executed write may not match current disk state) and execution is single-use, which prevents accidental replay. It stops short of describing failure behavior for unapproved/expired requests.

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?

Three short sentences, zero filler, with the decisive constraint (APPROVED, snapshot-based, single-use) front-loaded. Every sentence earns its place.

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?

An output schema exists so return values need not be described, the single parameter is explained, and the safety profile is covered by annotations. The remaining gap is error/edge behavior (what happens on unapproved, expired, or already-consumed requests), which an agent would want for a destructive write.

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 0% for the single request_id parameter, so the schema contributes no meaning. The description compensates by explaining that only a request_id is taken and that path/content/hash come from the stored request snapshot, which is the key semantic an agent needs.

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?

States a precise verb+resource ('execute ... the file write') with the crucial qualifier that it operates on a previously APPROVED request, which cleanly separates it from filesystem.write_file and filesystem.apply_patch. An agent can tell exactly what this does 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?

Clearly establishes the precondition that a request must already be APPROVED and that the operation is single-use, which tells the agent when this tool is usable. It does not explicitly name the alternative (e.g., filesystem.write_file to create the request, or toolhub.request_status to check approval), so routing guidance is implied rather than spelled out.

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

git.diffShow git diffA
Read-only

Read-only git diff. Never modifies repository state.

Args: path: Optional repository-relative path to filter the diff. staged: Show staged changes (git diff --cached) instead of unstaged ones.

NameRequiredDescriptionDefault
pathNo
stagedNo

Output Schema

NameRequiredDescription
rawYes
pathYes
binaryNo
stagedYes
additionsNo
deletionsNo

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so 'Read-only... Never modifies repository state' largely restates structured data. It does add the meaningful behavioral detail that `staged` switches the comparison baseline to --cached rather than merely toggling a flag, but no other behavior (scope of paths, empty-diff behavior) is disclosed.

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

Conciseness4/5

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

Front-loads the safety statement and then lists args compactly; no filler sentences. The second sentence slightly duplicates the first, keeping it short of a 5.

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?

With only two optional parameters, an output schema present, and annotations covering the safety profile, the description supplies everything needed to invoke it correctly. A brief note on what the diff is taken against by default would make it fully complete.

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 description coverage is 0%, so the description carries the full parameter burden and does so adequately: `path` is described as an optional repository-relative filter and `staged` is explained as selecting --cached instead of unstaged changes. Only minor detail (e.g. path behavior for untracked files) is missing.

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?

States a specific verb and resource ('git diff') and immediately scopes it as read-only. It does not name or differentiate itself from the closest sibling (git.status), but the purpose itself is unambiguous.

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

Usage Guidelines3/5

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

Usage is only implied: an agent can infer this is for inspecting working-tree changes, but the description never says when to prefer it over git.status or how to interpret 'unstaged' vs 'staged' in a workflow. No exclusions or alternatives are given.

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

git.statusShow git working tree statusA
Read-only

Read-only git status of the ToolHub workspace repository.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
rawYes
pathYes
cleanYes
branchNo
entriesYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered and the description's 'Read-only' label is largely redundant. The one genuine addition is scoping the target to the ToolHub workspace repository, which tells the agent which repo is inspected. No further behavioral context (e.g. whether untracked files are included) is offered.

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?

A single front-loaded sentence with no waste; the scope constraint (ToolHub workspace repository) is stated immediately.

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?

With an output schema present and rich annotations, the description need not explain return values. It adequately covers scope for a zero-parameter read tool, though it leaves minor ambiguity about what the status output includes.

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 takes zero parameters, which is the baseline-4 case. There is nothing for the description to clarify beyond the schema's empty argument object.

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 states a clear verb (status) and resource (the ToolHub workspace git repository), so an agent knows exactly what it inspects. It does not explicitly differentiate itself from the sibling git.diff, but the operation name carries most of that distinction.

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

Usage Guidelines2/5

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

There is no when-to-use guidance, no mention of alternatives such as git.diff, and no prerequisites stated. The agent must infer from the operation name alone that this is the entry point for inspecting working-tree state.

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

shell.runRun workspace commandA
Destructive

Run a structured subprocess inside the ToolHub workspace.

Only LOW-risk commands execute automatically. MEDIUM/HIGH commands create a PENDING approval request that a trusted administrator must approve out-of-band before it can be run via shell.run_approved.

NameRequiredDescriptionDefault
cwdNo.
argsNo
programYes
timeout_secondsNo

Output Schema

NameRequiredDescription
cwdYes
argsYes
riskYes
errorNo
stderrNo
stdoutNo
messageNo
outcomeYes
programYes
approvalNo
executedYes
trace_idYes
timed_outNo
request_idNo
returncodeNo
risk_reasonYes
approval_statusNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false, destructiveHint=true, openWorldHint=false, so the destructive profile is already covered. The description adds meaningful non-schema context: the risk-tiering policy and the out-of-band admin approval gate. It omits what happens on timeout, cancellation, or partial output, which keeps it from a 5.

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?

Four short sentences, front-loaded with the core action and risk-tiering rule, with no redundant restatement of the title or name. Every sentence carries distinct information.

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?

An output schema exists, so return values need not be explained, and the approval workflow is fully described. Given the tool's complexity, the remaining gap is execution semantics — timeout enforcement, cwd resolution, and any output-size or rate constraints.

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

Parameters2/5

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

Schema description coverage is 0% across four parameters (program, args, cwd, timeout_seconds), so the description carries the full burden — yet it mentions none of them. There is no guidance on program/args shaping, working-directory semantics, or timeout units and behavior, which an agent needs for a subprocess tool.

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?

States a specific verb and resource ('Run a structured subprocess inside the ToolHub workspace'), and the approval-split behavior clearly separates it from the sibling shell.run_approved. An agent can tell instantly what this does and which sibling to use for the elevated path.

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

Usage Guidelines5/5

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

Gives explicit when-to-use routing: LOW-risk commands run automatically here, while MEDIUM/HIGH commands create a PENDING approval that must be granted out-of-band before invocation via shell.run_approved. This names the alternative tool and the exact condition that selects it.

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

shell.run_approvedRun an approved commandA
Destructive

Execute a previously-APPROVED command exactly as stored.

Takes only a request_id; the program, args, and cwd are always the originals captured when the request was created. Approvals are single-use, so a request cannot be replayed.

NameRequiredDescriptionDefault
request_idYes

Output Schema

NameRequiredDescription
cwdYes
argsYes
riskYes
errorNo
stderrNo
stdoutNo
messageNo
outcomeYes
programYes
approvalNo
executedYes
trace_idYes
timed_outNo
request_idNo
returncodeNo
risk_reasonYes
approval_statusNo

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds real substance: the program, args, and cwd are fixed originals, and approvals are single-use so replay is impossible. That single-use/no-replay constraint is important behavioral context not present in the annotations.

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?

Three tight sentences, front-loaded with the action, then the parameter story, then the irreversibility caveat. No filler.

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?

An output schema exists so return values need no explanation, and annotations cover the safety profile. The description supplies the immutability and single-use rules; the only real omission is how a request_id is generated/obtained.

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 coverage is 0% and request_id has no schema description, so the description must compensate. It does clarify that request_id points to a stored approved request whose fields are immutable, but it never explains how to acquire a request_id or what happens if it is invalid/expired.

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?

States a precise verb and resource ('Execute a previously-APPROVED command exactly as stored') and the 'APPROVED' qualifier distinguishes it conceptually from the sibling shell.run. It never names shell.run explicitly, so differentiation is implied rather than stated.

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

Usage Guidelines3/5

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

Implies usage ('a previously-APPROVED command', 'request was created') but gives no explicit when-to-use vs shell.run, no prerequisite steps, and no hint about how a request_id is obtained. The reader must infer the workflow.

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

toolhub.audit_recentRecent audit eventsA
Read-only

Return the most recent sanitized audit events (max 100).

Read-only: returns bounded metadata summaries. Event contents are already sanitized at write time; no raw stdout/stderr or secrets are included.

NameRequiredDescriptionDefault
limitNo

Output Schema

NameRequiredDescription
countYes
eventsYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds valuable context: event contents are sanitized at write time, no raw stdout/stderr or secrets are included, and results are bounded metadata summaries. This goes beyond the annotations well.

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 concise sentences that are front-loaded with the core action and followed by relevant behavioral context. Every sentence earns its place with no 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?

Given the presence of an output schema, the description needn't explain return values in detail. It covers the essential behavior for a read-only audit tool, though it could clarify the limit parameter's default and effect given the 0% schema coverage.

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 coverage is 0%, so the schema does not describe the 'limit' parameter. The description mentions 'max 100' but doesn't explain the default of 20 or the parameter's purpose. With only one optional parameter, a baseline 3 is appropriate, but the description could compensate more for the low coverage.

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?

States a specific verb and resource ('Return the most recent sanitized audit events') with a clear scope bound (max 100). It's distinguishable from siblings like git.status or shell.run, though it doesn't explicitly differentiate from other toolhub tools beyond scope.

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

Usage Guidelines3/5

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

The description implies usage through 'most recent' and the bounded nature, but gives no explicit when-to-use/when-not or alternatives. It's adequate but leaves the agent to infer the appropriate context.

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

toolhub.capabilitiesShow ToolHub capabilitiesC
Read-only

Return the versioned public ToolHub execution contract.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
limitsYes
transportYes
approval_modelYes
package_versionYes
contract_versionYes
approval_operationsYes

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true, openWorldHint=false, and destructiveHint=false, so the safety profile is fully covered. The description adds only the words 'versioned' and 'public', contributing essentially no behavioral context beyond the structured fields.

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

Conciseness4/5

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

A single sentence with no wasted words and the core claim front-loaded. It is efficient, though bordering on under-specification rather than true comprehensiveness.

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

Completeness3/5

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

Output schema richness means return values need not be described, and annotations cover the safety profile. Still, for a discovery/meta tool the description is thin enough that an agent cannot tell what the contract actually contains or when this is the preferred call, leaving a real gap.

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?

This tool takes zero parameters, so there is no parameter semantics to explain and the baseline of 4 applies. Nothing in the description is needed to disambiguate inputs.

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

Purpose3/5

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

The verb 'Return' and resource 'ToolHub execution contract' are specific, and the title reinforces it as a capabilities/self-description tool. However, 'versioned public execution contract' is opaque jargon that does not plainly convey what an agent actually gets back, and it draws no line against siblings like toolhub.ping or toolhub.request_status.

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

Usage Guidelines2/5

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

There is no indication of when to call this versus toolhub.ping, toolhub.audit_recent, or toolhub.request_status. The description states what it returns but gives no trigger condition, prerequisites, or exclusion guidance.

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

toolhub.pingB

Check whether MCP ToolHub is running correctly.

NameRequiredDescriptionDefault
messageNohello

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden, and it only implicitly conveys a read-only diagnostic intent via 'check'. It does not state side effects, auth requirements, or latency/rate behavior, but for a trivial ping the implied read-only nature is reasonably clear, especially since an output schema handles return values.

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?

A single front-loaded sentence with zero filler that states the purpose immediately. Nothing is wasted or repeated.

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 health-check tool with an output schema covering return values, the description is largely sufficient. The only gap is the unexplained 'message' parameter, which is minor given it is optional with a default.

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

Parameters2/5

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

Schema coverage is 0%, so the description should compensate, yet it never mentions the single 'message' parameter (optional, default 'hello'). The one undocumented parameter is left with no semantic explanation in either the schema or the description.

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 states a specific verb (check) and resource (MCP ToolHub health/running state), which clearly reads as a health-check or liveness probe. It is distinguishable from siblings like toolhub.capabilities and toolhub.audit_recent, which serve different diagnostic purposes, though it does not explicitly name those alternatives.

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

Usage Guidelines2/5

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

No guidance is given on when to use this tool versus the other toolhub diagnostic siblings (capabilities, audit_recent, request_status), nor any prerequisites or timing (e.g., before/after a call). Usage is left entirely to inference from the name.

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

toolhub.request_statusShow approval request statusA
Read-only

Observe an approval request without approving, rejecting, or consuming it.

NameRequiredDescriptionDefault
request_idYes

Output Schema

NameRequiredDescription
errorNo
outcomeYes
approvalNo
trace_idYes
request_idYes

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already establish readOnly and non-destructive, but the description adds a genuinely new trait: the observation does not consume the request, so repeated calls are safe and the request remains actionable. It stops short of describing auth requirements or any 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.

Conciseness5/5

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

One sentence, front-loaded with the action and immediately followed by the key non-consuming constraint. Every word earns its place with no boilerplate.

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

Completeness3/5

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

An output schema exists, so return values need not be explained, and the tool is structurally simple with one parameter. The remaining gap is the provenance of request_id, which an agent needs in order to call this successfully.

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

Parameters2/5

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

Schema description coverage is 0% and the description adds nothing about request_id — not its format, nor where the agent obtains it (presumably from a prior approval-required response). The single required parameter carries no semantics in either location.

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?

Specific verb (observe) plus resource (approval request) in a single clause. It is distinguishable from the mutation siblings like filesystem.write_file_approved by emphasizing observation, though it does not name toolhub.audit_recent as an alternative for historical inspection.

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

Usage Guidelines3/5

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

The phrasing 'without approving, rejecting, or consuming it' implies the use case (safely polling an in-flight approval) but never states when to reach for this versus the *_approved tools or audit_recent. Usage is inferable rather than explicit, and no exclusions are given.

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. 14 tool updatesv0.1.0
    • First observedfilesystem.apply_patch
    • First observedfilesystem.apply_patch_approved
    • First observedfilesystem.list_directory
    • First observedfilesystem.read_file
    • First observedfilesystem.write_file
    • First observedfilesystem.write_file_approved
    • First observedgit.diff
    • First observedgit.status
    • First observedshell.run
    • First observedshell.run_approved
    • First observedtoolhub.audit_recent
    • First observedtoolhub.capabilities
    • First observedtoolhub.ping
    • First observedtoolhub.request_status

TDQS

A3.8/5.0

Scored across 14 tools

Disambiguation5/5

Tools are cleanly partitioned into namespaces (filesystem, shell, git, toolhub) and actions. The approval-request tools and their _approved counterparts have clearly distinct purposes, and descriptions explicitly explain the two-step approval flow, so an agent can reliably choose the right tool.

Naming Consistency5/5

All tool names follow a consistent namespace.action pattern using dot separators and snake_case actions. The _approved suffix is applied uniformly to the three post-approval execution tools, making the naming predictable throughout.

Tool Count5/5

The 14 tools are well-scoped for a secured execution hub: read/list, write/patch requests, shell requests, their approved counterparts, read-only git, and lightweight diagnostics/audit. No tool appears redundant, and the count stays within a reasonable range.

Completeness4/5

Core lifecycle operations for workspace inspection, file reading, controlled writes/patches, shell execution, git status/diff, and audit/request observation are covered. Minor gaps exist—no filesystem delete/move, no direct git history/log tools, and no pending-request listing—but agents can largely work around these via shell.run or request_status.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables controlled AI-agent access to enterprise-shaped tools with a deny-by-default gated write path, human approval, dry-run execution, and append-only audit logging.
    1
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI clients to safely read, search, understand, and edit local project code and files, with Git inspection, code indexing, and controlled command execution within permissioned workspaces.
    4 npm
    6
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables coding agents to safely inspect and modify project files within explicitly allowed workspace roots, with controls for file operations, git status/diff, and optionally allowlisted command execution.
    11
    Apache 2.0