MCP ToolHub
MCP ToolHub
MCP ToolHub는 제한된 작업 공간 파일 시스템 작업, 읽기 전용 Git 검사, 구조화된 명령 실행 및 감사 추적을 제공하는 로컬 stdio 전용 Model Context Protocol 서버입니다. 파일 시스템 변경 작업 및 에이전트가 선택한 모든 외부 셸 명령은 기존의 대역 외 인간 승인 모델을 사용합니다.
ToolHub는 HTTP, SSE 또는 기타 네트워크 리스너를 노출하지 않습니다.
기능
작업 공간으로 제한된 파일 읽기, 디렉터리 나열, 쓰기 및 패치
읽기 전용 Git 상태 및 diff 작업
기본 거부 위험 분류를 사용하는 구조화된 셸 명령
원자적이며 만료되고 일회용인 승인 요청
별도의 신뢰된 관리자 CLI; MCP 자체 승인 도구 없음
제한되고 민감 정보가 제거된 JSON Lines 감사 이벤트
Windows 및 POSIX 지원
Related MCP server: agent-bridge-mcp
요구 사항
Python 3.12 이상(CI는 현재 3.12 및 3.13을 검증함)
stdio 서버를 지원하는 MCP 클라이언트
Git 도구 및 승인 게이트가 적용된 Git 셸 요청을 위한
git
설치
소스 체크아웃에서 uv로 설치합니다:
uv tool install .또는 wheel을 빌드하여 설치합니다:
uv build
uv tool install dist/mcp_toolhub-0.1.0-py3-none-any.whl설치 시 두 개의 실행 파일이 제공됩니다:
mcp-toolhub— stdio MCP 서버mcp-toolhub-admin— 신뢰된 인간 승인 CLI
런타임 구성
작업 공간 루트
TOOLHUB_WORKSPACE_ROOT는 mcp-toolhub serve 및 관리자 CLI에 필수입니다. 기존 디렉터리의 절대 경로를 포함해야 합니다. ToolHub는 경로를 한 번 정규화하여 프로세스 수명 동안 고정합니다.
ToolHub는 의도적으로 현재 디렉터리, 소스 체크아웃 또는 설치 디렉터리를 기본값으로 사용하지 않습니다.
신뢰된 상태 루트
TOOLHUB_STATE_ROOT는 workspace-binding.json, approvals.json 및 audit.jsonl이 포함된 디렉터리를 선택적으로 지정합니다. 지정된 경우 절대 경로여야 합니다. 이 디렉터리는 첫 번째 유효 사용 시 정확히 하나의 정규 작업 공간에 영구적으로 바인딩됩니다. 다른 작업 공간에 재사용하면 실패 시 차단됩니다.
TOOLHUB_STATE_ROOT가 설정되지 않은 경우 ToolHub는 platformdirs의 플랫폼에 적합한 사용자별 상태 디렉터리를 기준으로 사용합니다. 각 정규 작업 공간은 플랫폼 정규화된 정규 작업 공간 경로에서 파생된 결정적 SHA-256 식별자로 이름이 지정된 workspaces/ 아래의 독립적인 네임스페이스를 받습니다. 이 식별자는 디렉터리 이름에 작업 공간 경로가 들어가는 것을 방지하지만, 인증 비밀이 아닌 네임스페이스 분리입니다. 작업 공간을 이동하거나 이름을 바꾸면 일반적으로 새 기본 네임스페이스가 생성됩니다.
상태 디렉터리는 필요에 따라 생성되고 정규화된 후 작업 공간 구성과 함께 고정됩니다. 상태 루트가 작업 공간 내부에 있으면 시작이 실패합니다. 서버와 관리자 CLI는 이 상태를 공유할 수 있도록 동일한 사용자로, 동일한 작업 공간 및 상태 구성으로 실행되어야 합니다.
POSIX 예제
export TOOLHUB_WORKSPACE_ROOT=/home/alice/projects/example
export TOOLHUB_STATE_ROOT=/home/alice/.local/state/mcp-toolhub
mcp-toolhub serveWindows PowerShell 예제
$env:TOOLHUB_WORKSPACE_ROOT = "D:\work\example"
$env:TOOLHUB_STATE_ROOT = "$env:LOCALAPPDATA\mcp-toolhub"
mcp-toolhub serve서버는 stdout에 배너나 사람이 읽는 로그 텍스트를 쓰지 않습니다. stdout은 MCP 프로토콜 메시지 전용으로 예약되어 있습니다. 예상되는 구성 오류는 stderr에 간결하게 보고되며 0이 아닌 종료 코드로 종료됩니다.
명령
mcp-toolhub --version
mcp-toolhub serve
python -m mcp_toolhub serve
mcp-toolhub-admin --help
mcp-toolhub-admin list
mcp-toolhub-admin approve REQUEST_ID
mcp-toolhub-admin reject REQUEST_ID관리자 명령은 사람을 대상으로 하며 stdout에 일반 출력을 쓸 수 있습니다. MCP 전송 프로세스가 아닙니다.
MCP 클라이언트 구성
정확한 외부 구성 키는 클라이언트에 따라 다릅니다. 일반적인 POSIX stdio 항목은 다음과 같습니다:
{
"mcpServers": {
"toolhub": {
"command": "mcp-toolhub",
"args": ["serve"],
"env": {
"TOOLHUB_WORKSPACE_ROOT": "/home/alice/projects/example",
"TOOLHUB_STATE_ROOT": "/home/alice/.local/state/mcp-toolhub"
}
}
}
}Windows 경로에는 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"
}
}
}
}MCP 클라이언트가 셸의 PATH를 상속하지 않는 경우 절대 실행 파일 경로를 사용하십시오.
도구 목록
프로덕션 서버는 정확히 다음 12개의 MCP 도구를 노출합니다:
toolhub.pingtoolhub.audit_recentfilesystem.list_directoryfilesystem.read_filefilesystem.write_filefilesystem.write_file_approvedfilesystem.apply_patchfilesystem.apply_patch_approvedgit.statusgit.diffshell.runshell.run_approved
MCP 관리, 승인 또는 거부 도구는 없습니다.
인간 승인 워크플로
MCP 변경 또는 외부 셸 요청이 보류 중인 요청 ID를 반환합니다.
관리자는 서버와 동일한 작업 공간 및 상태 환경으로
mcp-toolhub-admin list를 실행합니다.승인을 위해 관리자는
mcp-toolhub-admin approve REQUEST_ID를 실행합니다.CLI는 보호된 요청을 표시하고 운영자가
APPROVE를 정확히 입력하도록 요구합니다.MCP 호출자는 요청 ID로 해당
_approved도구를 호출합니다. 성공적인 소비는 원자적이며 일회용입니다.
셸 요청의 경우 승인 표시에는 원래 프로그램, 정규화된 실행 파일, SHA-256, 바이트 크기, cwd 및 별도로 JSON 이스케이프된 인자 값이 포함됩니다. 인자를 모호한 셸 명령 문자열로 나타내지 않습니다.
보안 모델 및 제한 사항
구조화된 셸 명령
shell.run은 기본 거부 명령 정책을 사용합니다. LOW는 정확한 ToolHub 고유 기능으로 제한되며, 현재는 실행 중인 Python 버전 조회입니다. LOW는 PATH를 검색하지 않으며 외부 하위 프로세스를 생성하지 않습니다. 일반 Git, 셸 인터프리터, Windows 배치 스크립트, py 실행기 및 알 수 없는 프로그램은 절대 LOW가 아닙니다.
모든 외부 셸 명령은 MEDIUM 또는 HIGH이며 대역 외 관리자 승인이 필요합니다. 승인은 불변의 프로그램, 인자, cwd, 시간 제한, 작업 공간 및 주 실행 파일 스냅샷을 캡처합니다. 승인된 셸 요청은 스냅샷 검증 전에 원자적으로 소비됩니다. 이후의 어떤 실패도 이를 영구히 소비하므로 재시도하려면 새 승인이 필요합니다.
subprocess 실행 직전에 ToolHub는 주 실행 파일의 정규 경로, 크기 및 SHA-256을 검증합니다. 실행은 shell=False로 해당 절대 경로를 사용합니다. 이는 실행 직전에 검증된 주 실행 파일 신원이며, 운영 체제가 최종적으로 매핑하는 정확한 바이트에 대한 암호학적 보장은 아닙니다.
ToolHub가 보장하는 사항:
LOW는 외부 하위 프로세스를 절대 생성하지 않습니다.
모든 외부 셸 실행에는 MEDIUM 또는 HIGH 승인이 필요합니다.
에이전트는 승인된 프로그램, 인자, cwd 또는 시간 제한을 교체할 수 없습니다.
승인은 원자적이며 만료되고 일회용입니다.
작업 공간 및 주 실행 파일 스냅샷은 필수이며 실패 시 차단됩니다.
주 실행 파일의 정규 신원과 해시는 실행 직전에 재검증됩니다.
파일 시스템 경로는 고정된 작업 공간 경계 내에 유지됩니다.
변경 경로는 심볼릭 링크 탐색을 거부하고 해당되는 경우
expected_hash동시성 검사를 적용합니다.
ToolHub가 보장하지 않는 사항:
좁은 최종 검사-실행 경합 동안 동시 로컬 파일 시스템 공격자에 대한 정확한 바이트 신원.
DLL, 인터프리터, 헬퍼, 플러그인, 구성 파일, 환경에 따라 선택되는 종속성 또는 후손 프로세스의 신원.
승인된 실행 파일 바이트가 무해하거나, 서명되었거나, 평판이 좋은 게시자로부터 온 것이라는 점.
관리자 승인 표시는 보호된 정규 경로, 해시, 크기, cwd 및 정확한 JSON 이스케이프된 인자 경계를 노출합니다. 에이전트가 읽을 수 있는 감사 이벤트는 외부 실행 파일 디렉터리를 생략하고 기본 이름, 해시, 크기, 범위 및 요청 ID 연관성을 유지합니다.
감사 동작
감사 이벤트는 신뢰된 상태 루트 아래의 audit.jsonl에 추가됩니다. 제한된 메타데이터를 포함하고, 식별 가능한 비밀 인자를 제거하며, 원시 프로세스 출력 대신 stdout/stderr 문자 수를 저장합니다. 감사 쓰기 실패는 도구 실행에 치명적이지 않습니다.
개발
모든 고정된 런타임 및 개발 종속성을 설치합니다:
uv sync --all-groups필요한 검사를 실행합니다:
uv run ruff check .
uv run ruff format --check .
uv run python -m compileall -q src/mcp_toolhub
uv run pytest -q
uv build
git diff --check의도적으로 포맷팅을 적용하려면:
uv run ruff format .산출물 스모크 테스트
uv build 후 체크아웃 외부의 가상 환경으로 크로스 플랫폼 스모크 드라이버를 실행합니다.
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 .드라이버는 wheel 내용을 검사하고, 격리된 환경에 wheel만 설치하며, 콘솔/버전 동작을 확인하고, initialize, list_tools, ping, 구성된 작업 공간 접근, 잘못된 구성 및 서버/관리자 공유 상태 테스트를 저장소 외부에서 실행합니다.
문제 해결
TOOLHUB_WORKSPACE_ROOT is required: MCP 클라이언트 환경에 절대 경로의 기존 작업 공간 경로를 추가하십시오.작업 공간이 디렉터리가 아닌 경우: 디렉터리를 만들거나 경로를 수정하십시오.
상태 루트는 작업 공간 외부에 있어야 합니다:
TOOLHUB_STATE_ROOT를 MCP 파일 시스템 도구가 접근할 수 없는 신뢰된 디렉터리로 이동하십시오.상태 네임스페이스가 다른 작업 공간에 속합니다: 다른 명시적
TOOLHUB_STATE_ROOT를 선택하십시오. 바인딩은 절대 자동으로 재할당되지 않습니다.클라이언트가 잘못된 stdio JSON을 보고하는 경우: 래퍼와 시작 스크립트가 stdout에 배너나 로그를 인쇄하지 않는지 확인하십시오.
관리자가 요청을 볼 수 없는 경우: 서버와 관리자가 동일한 사용자로, 동일한 작업 공간 및 상태 루트 설정으로 실행되는지 확인하십시오.
승인 후 실행 파일이 변경된 경우: 새 승인을 요청하십시오. 소비되었거나 무효화된 승인은 절대 재생되지 않습니다.
프로덕션 ToolHub는 의도적으로 HTTP, SSE, 공개 네트워크, 인증 서버, 컨테이너 오케스트레이션 또는 클라우드 호스팅 표면을 노출하지 않습니다.
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 gradedqualityCmaintenanceEnables 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 gradedqualityBmaintenanceEnables 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