MCP ToolHub
Provides read-only Git repository inspection with status and diff tools, and supports administrator-approved Git shell commands for broader Git operations.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@MCP ToolHubShow me the git status and current diff in the workspace."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MCP ToolHub
MCP ToolHub is a local, stdio-only Model Context Protocol (MCP) execution gateway for AI agents. It lets an agent inspect a bounded workspace and Git repository directly, while routing file mutations and every external command through an immutable, expiring, single-use request that only a human can approve.
It is deliberately small in surface area: 14 production tools, Contract V1 structured outcomes, no network listener, and no MCP endpoint for approval. The interesting work is at the execution boundary—turning an untrusted tool request into a bounded, reviewable, replay-resistant local action.
Why it is different
Boundary | What ToolHub does |
Human-only approval | The MCP client can submit and observe requests, but only the separate |
Immutable execution snapshots | Approved writes, patches, and commands resume from protected state, expire, and are consumed exactly once. |
Confined and observable execution | Workspace paths are bounded; subprocess output, runtime, and audit reads are capped; lifecycle events share a |
See it in 60 seconds
https://github.com/user-attachments/assets/8cab7be6-e43f-40a9-b6c6-ea7fae61acab
It lists exactly 14 tools, reads a file, pauses a write at
APPROVAL_REQUIRED, requires approval in the separate trusted admin process,
resumes execution, consumes the approval exactly once, and rejects replay.
For a reproducible walkthrough, see the demo guide.
Related MCP server: enterprise-agent-lab
Quick start
Requires Python 3.12 or newer and uv.
Install the two commands from a source checkout:
uv tool install .Point ToolHub at an existing absolute workspace. A separate state root is optional but useful when demonstrating the trust boundary:
export TOOLHUB_WORKSPACE_ROOT=/home/alice/projects/example
export TOOLHUB_STATE_ROOT=/home/alice/.local/state/mcp-toolhub-example
mcp-toolhub serveIn normal use, an MCP client starts mcp-toolhub serve as its stdio child
process. The server writes protocol messages only to stdout and opens no
HTTP/SSE listener.
For human review, open a separate terminal with the same two environment variables:
mcp-toolhub-admin list
mcp-toolhub-admin approve REQUEST_ID
# inspect the snapshot, then type APPROVE exactlyWindows PowerShell setup, MCP client JSON, default state locations, maintenance, and troubleshooting are in Operations.
For development, uv sync --all-groups creates the project environment and
editable install with the locked test and lint dependencies. This is distinct
from the normal uv tool install . source installation.
Architecture at a glance
The MCP client is untrusted. It receives direct access only to bounded inspection and control tools. An initial mutation or external-command call validates its input and stores the exact proposed action in trusted state outside the workspace; it does not perform that action.
The administrator reviews the protected snapshot out of band. After approval,
the client can invoke only the matching resume tool with the request_id.
ToolHub atomically consumes the approval before executing the stored action,
preventing replay.
initial tool -> APPROVAL_REQUIRED -> PENDING
-> human approve/reject
-> APPROVED / REJECTED / EXPIRED
-> resume tool -> execution result -> CONSUMEDRead the architecture and threat model for trust boundaries and guarantees, and the approval lifecycle for Contract V1 client logic.
Production tool surface
The production server exposes exactly 14 MCP tools:
Tool | Purpose | Execution class |
| Check server reachability | Direct control; default SDK annotations |
| Read recent sanitized audit metadata | Direct read-only |
| Discover Contract V1, mappings, and public limits | Direct read-only |
| Observe effective request state | Direct read-only; never approves or consumes |
| List bounded workspace entries | Direct read-only |
| Read a bounded UTF-8 workspace file and hash | Direct read-only |
| Inspect repository status | Direct read-only |
| Inspect staged or unstaged diff | Direct read-only |
| Validate and submit an exact file write | Approval submission; does not write |
| Resume the stored write by request ID | Approval-gated, single-use execution |
| Validate and submit a single-file patch | Approval submission; does not patch |
| Resume the stored patch by request ID | Approval-gated, single-use execution |
| Run the one LOW intrinsic or submit an external command | Direct LOW intrinsic; external execution requires approval |
| Resume the stored external command by request ID | Approval-gated, single-use execution |
The three pairs follow the same protocol:
initial tool -> APPROVAL_REQUIRED -> human approval -> resume toolThere is no toolhub.approve, toolhub.reject, administration namespace, or
other MCP path to a human decision.
Contract V1
Approval-gated results use MCP structuredContent as the authoritative
machine-readable response. Clients should branch on outcome, approval,
and error rather than parsing display text.
Every lifecycle carries a trace_id. Approval handles contain the
request_id, current status, expiry, and server-selected resume_tool.
Expected domain states—including pending, rejected, expired, consumed,
conflict, refusal, timeout, and nonzero command exit—are structured outcomes.
Schema validation failures and unexpected internal failures remain MCP/tool
errors.
Contract V1 is locked by a readable compatibility fixture and tests. Package
version 0.1.0 and contract version 1.0 are independent.
Security model
All workspace API paths are relative, canonically confined, and checked for portable traversal; mutation paths also reject symlink components.
File writes and patches require out-of-band human approval and execute only their protected immutable snapshots.
Approval requests are atomic, expiring, workspace-bound, and single-use.
Optional expected hashes provide optimistic concurrency checks for mutations; mismatches return
CONFLICTwithout publishing a write.External commands use structured arguments,
shell=False, a sanitized approval-bound environment, and a revalidated primary-executable snapshot.External commands and fixed Git helpers run inside OS-backed process-tree lifetime containment with bounded timeouts and output capture.
Read-only Git inspection refuses risky helper paths such as applicable executable filters, external diff/textconv, pagers, and submodules.
Trusted state is bound to one canonical workspace and must live outside that workspace.
Audit events are bounded and redact recognizable secret arguments; they do not store raw stdout or stderr.
These controls bound ToolHub itself and reduce confused-deputy risk; they do not turn approved programs into safely sandboxed code. See Architecture for precise assumptions and limitations.
Non-goals
Not a cloud or remote MCP gateway
Not an authentication, multi-user, or RBAC platform
Not a general operating-system sandbox or container
No autonomous or agent-driven approval
No HTTP, SSE, or other network transport
No claim that approved commands are filesystem- or network-isolated
Documentation
Development and verification
uv sync --all-groups
uv lock --check
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 --checkThe installed-wheel smoke driver validates the built artifact outside the checkout:
uv run python scripts/artifact_smoke.py --dist-dir dist --venv /tmp/mcp-toolhub-wheel-env --repository .On Windows, use a temporary path such as
"$env:TEMP\mcp-toolhub-wheel-env" for --venv. CI runs the complete gate and
wheel smoke test on Ubuntu and Windows with Python 3.12 and 3.13.
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 gradedqualityBmaintenanceEnables AI coding agents to evaluate actions against team-defined policies, record decisions, and obtain human approvals for potentially risky operations.88 npm1-
- 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