MCP ToolHub
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
gitpara 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.whlLa instalación proporciona dos ejecutables:
mcp-toolhub— el servidor MCP stdiomcp-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 serveEjemplo en Windows PowerShell
$env:TOOLHUB_WORKSPACE_ROOT = "D:\work\example"
$env:TOOLHUB_STATE_ROOT = "$env:LOCALAPPDATA\mcp-toolhub"
mcp-toolhub serveEl 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_IDEl 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.pingtoolhub.audit_recentfilesystem.list_directoryfilesystem.read_filefilesystem.write_filefilesystem.write_file_approvedfilesystem.apply_patchfilesystem.apply_patch_approvedgit.statusgit.diffshell.runshell.run_approved
No existe ninguna herramienta MCP de administración, aprobación ni rechazo.
Flujo de aprobación humana
Una mutación MCP o una solicitud de shell externa devuelve un ID de solicitud pendiente.
El administrador ejecuta
mcp-toolhub-admin listcon el mismo espacio de trabajo y entorno de estado que el servidor.Para la aprobación, el administrador ejecuta
mcp-toolhub-admin approve REQUEST_ID.La CLI muestra la solicitud protegida y exige que el operador escriba exactamente
APPROVE.El llamador MCP invoca la herramienta
_approvedcorrespondiente 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_hashcuando 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-groupsEjecute 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 --checkPara 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_ROOTa 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_ROOTexplí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 toolsfilesystem.apply_patchApply workspace file patch (approval required)ADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| patch | Yes | ||
| expected_hash | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| error | No | |
| changed | No | |
| message | No | |
| outcome | Yes | |
| approval | No | |
| executed | Yes | |
| new_hash | No | |
| trace_id | Yes | |
| additions | No | |
| deletions | No | |
| request_id | No | |
| bytes_after | No | |
| bytes_before | No | |
| previous_hash | No | |
| approval_status | No |
TDQS
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.
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.
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.
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.
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.
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 patchADestructive
Execute exactly the patch stored in an APPROVED request.
Takes only a request_id; the stored snapshot is used. Single-use.
| Name | Required | Description | Default |
|---|---|---|---|
| request_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| error | No | |
| changed | No | |
| message | No | |
| outcome | Yes | |
| approval | No | |
| executed | Yes | |
| new_hash | No | |
| trace_id | Yes | |
| additions | No | |
| deletions | No | |
| request_id | No | |
| bytes_after | No | |
| bytes_before | No | |
| previous_hash | No | |
| approval_status | No |
TDQS
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.
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.
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.
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.
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.
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 directoryBRead-only
List files and directories inside the ToolHub workspace.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | . |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| entries | Yes |
TDQS
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.
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.
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.
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.
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.
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 fileBRead-only
Read a UTF-8 text file inside the ToolHub workspace.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| size | Yes | |
| sha256 | Yes | |
| content | Yes |
TDQS
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.
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.
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.
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.
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.
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)ADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| content | Yes | ||
| expected_hash | No | ||
| create_parents | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| error | No | |
| created | No | |
| message | No | |
| outcome | Yes | |
| approval | No | |
| executed | Yes | |
| new_hash | No | |
| trace_id | Yes | |
| request_id | No | |
| bytes_written | No | |
| previous_hash | No | |
| approval_status | No |
TDQS
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.
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.
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.
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.
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.
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 writeADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| error | No | |
| created | No | |
| message | No | |
| outcome | Yes | |
| approval | No | |
| executed | Yes | |
| new_hash | No | |
| trace_id | Yes | |
| request_id | No | |
| bytes_written | No | |
| previous_hash | No | |
| approval_status | No |
TDQS
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.
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.
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.
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.
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.
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 diffARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | ||
| staged | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| raw | Yes | |
| path | Yes | |
| binary | No | |
| staged | Yes | |
| additions | No | |
| deletions | No |
TDQS
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.
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.
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.
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.
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.
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 statusARead-only
Read-only git status of the ToolHub workspace repository.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| raw | Yes | |
| path | Yes | |
| clean | Yes | |
| branch | No | |
| entries | Yes |
TDQS
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.
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.
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.
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.
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.
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 commandADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | No | . | |
| args | No | ||
| program | Yes | ||
| timeout_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| cwd | Yes | |
| args | Yes | |
| risk | Yes | |
| error | No | |
| stderr | No | |
| stdout | No | |
| message | No | |
| outcome | Yes | |
| program | Yes | |
| approval | No | |
| executed | Yes | |
| trace_id | Yes | |
| timed_out | No | |
| request_id | No | |
| returncode | No | |
| risk_reason | Yes | |
| approval_status | No |
TDQS
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.
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.
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.
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.
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.
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 commandADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| cwd | Yes | |
| args | Yes | |
| risk | Yes | |
| error | No | |
| stderr | No | |
| stdout | No | |
| message | No | |
| outcome | Yes | |
| program | Yes | |
| approval | No | |
| executed | Yes | |
| trace_id | Yes | |
| timed_out | No | |
| request_id | No | |
| returncode | No | |
| risk_reason | Yes | |
| approval_status | No |
TDQS
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.
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.
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.
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.
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.
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 eventsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| events | Yes |
TDQS
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.
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.
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.
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.
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.
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 capabilitiesCRead-only
Return the versioned public ToolHub execution contract.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| limits | Yes | |
| transport | Yes | |
| approval_model | Yes | |
| package_version | Yes | |
| contract_version | Yes | |
| approval_operations | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| message | No | hello |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 statusARead-only
Observe an approval request without approving, rejecting, or consuming it.
| Name | Required | Description | Default |
|---|---|---|---|
| request_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | |
| outcome | Yes | |
| approval | No | |
| trace_id | Yes | |
| request_id | Yes |
TDQS
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.
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.
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.
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.
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.
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.
14 tool updates
v0.1.0- First observed
filesystem.apply_patch - First observed
filesystem.apply_patch_approved - First observed
filesystem.list_directory - First observed
filesystem.read_file - First observed
filesystem.write_file - First observed
filesystem.write_file_approved - First observed
git.diff - First observed
git.status - First observed
shell.run - First observed
shell.run_approved - First observed
toolhub.audit_recent - First observed
toolhub.capabilities - First observed
toolhub.ping - First observed
toolhub.request_status
TDQS
Scored across 14 tools
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.
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.
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.
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
Related MCP Connectors
Runtime permission, approval, and audit layer for AI agent tool execution.
Security gateway for AI agents: policy, approval, and audited execution, no secrets shared.
Supervised API-write gateway for AI agents with policy, human approval and execution receipts.
Operate Linux, macOS and Windows from your LLM. Every action runs through an auditable allowlist.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceEnables 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-
- AlicenseNot gradedqualityBmaintenanceEnables controlled delegation of tasks to local coding-agent CLIs and the Manus API, with strict sandboxing, approval tracking, and remote-egress safeguards.5 npmMIT
- AlicenseNot gradedqualityAmaintenanceEnables 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 npm6MIT
- AlicenseAqualityBmaintenanceEnables 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.11Apache 2.0