ForgeMCP
ForgeMCP is an MCP server for C/C++ development workflows, offering workspace file operations, Clangd analysis, CMake build/test, process inspection, toolchain discovery, and server status.
Workspace: list/find/read/info/search/write/edit/move/delete/mkdir files and directories; resources for text, raw bytes, trees, lists, metadata, and search results.
Clangd: list configurations; diagnostics, hover, definitions, references, document symbols, workspace symbols.
CMake: list profiles; configure, build, run CTest; per-profile results and process logs.
Process: overview of external tools; get process transcripts; resources for process list/details.
Toolchain: list toolsets; get executable paths, kinds, versions; resources.
Server status: version, workspace, lifecycle state, Core services.
No prompts; no arbitrary command execution; public process surface read-only.
Widgets: interactive console-style results with filters, JSON views, copying, syntax highlighting, search, diffs, and Clangd diagnostics.
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., "@ForgeMCPRun the server status diagnostic"
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.
ForgeMCP
ForgeMCP is a Python MCP server for structured C and C++ development workflows. The repository contains workspace, process, toolchain, and initial CMake services. Clangd tools provide read-only analysis across CMake configurations with a shared result widget. External file reads ask for confirmation through MCP elicitation. Quality and debugger modules are planned.
Current MCP surface
Workspace tools browse directory trees, find files, read UTF-8 text and file metadata, search literal text or regex, write/edit/move/delete files, and create directories. Each tool reports progress and has a packaged MCP App and icon.
Workspace resources mirror UTF-8 text and raw bytes, and expose directory trees, file lists, metadata, and search results as Markdown. Resource parameters have completions for qualified paths, extensions, depth, and boolean options.
Clangd tools list available configurations and provide diagnostics, hover, definitions, references, document symbols, and workspace symbols. Empty configuration selections use all available contexts.
No prompts are currently registered.
CMake tools list operator profiles, configure projects, build targets, and run CTest.
cmake_run_testdirectly runs a project/storage test executable with literal command-line arguments. Each tool has its own widget with Fields/JSON views, copying and per-test results. Command logs are available throughprocess_get. CMake syntax highlighting remains deferred.Tool
processes_overviewshows running and completed external development tools, including exit codes and timeout interruptions.process_get(process_id)returns one process with its ordered stdin/stdout/stderr transcript.Resources
forgemcp://processesandforgemcp://processes/{process_id}expose Markdown snapshots of the list and one process.Tool
toolsets_listlists every discovered toolset;toolset_get(toolset_id)returns its absolute executable paths, kinds, and versions. Both open the toolsets widget.Resources
forgemcp://toolsetsandforgemcp://toolsets/{toolset_id}expose the toolsets as markdown, querying available versions for details, with completion for retained toolset IDs.
Every tool returns readable English plain text in content alongside its typed
structuredContent. Trees use branch characters, source excerpts use line numbers,
and diagnostics use compiler-style messages. Text does not include Markdown
formatting or Workspace provider resource links; the structured data retains those
links for widgets. Clients decide how to display the text and may prefer structured
data when supplying results to a model.
All widgets share a compact console style with a fixed 420px height and adapt to the
host width. The move confirmation uses only two rows, source and destination.
Long values wrap and remain selectable; overflow scrolls vertically.
File views separate line numbers and offer a wrap toggle with horizontal scrolling.
Search groups matching lines by collapsible file, highlights matches, expands clipped
context on click, and keeps skipped files in a separate tab.
Fields, local filters, copy icons and syntax-highlighted JSON show the supplied result
without making additional tool calls. Process times are readable to seconds; JSON and
copying preserve the original precision. A toolsets list shows summaries, while a
toolset_get result shows the details returned by that call.
ForgeMCP can directly run an explicitly selected test executable inside the project or storage root; it does not expose shell commands or external executable paths over MCP. Feature services use the shared process service internally; its public MCP surface is read-only.
Related MCP server: C++ MCP Server
Requirements
Python 3.13 or newer
Node.js
^20.19.0or>=22.12.0for source builds, clean editable installs, and widget development; it is not required to install or run the release wheel
The server is built against MCP Python SDK 2.1.1.
Install a release
Download the .whl file from GitHub Releases
and install it in a virtual environment:
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install .\forge_cpp_mcp-0.2.4-py3-none-any.whl
.\.venv\Scripts\forgemcp.exe --helpThe wheel includes the compiled HTML widgets and icons. No npm commands or separate
frontend deployment are needed. CMake, Ninja, compilers, and clangd are external
tools: install the ones needed by your workflows separately.
The distribution name is forge-cpp-mcp; the Python module and server command are forgemcp.
After the package is published to PyPI, the install command can instead be:
.\.venv\Scripts\python.exe -m pip install forge-cpp-mcp==0.2.4Setup from source
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -e ".[dev]"Build
One command installs the locked frontend dependencies, builds every widget, and creates the Python wheel with its HTML and icon assets:
.\.venv\Scripts\python.exe -m build --wheelThe wheel is written to dist/. To build both the source distribution and a wheel
from that source distribution, use python -m build in the development environment.
Generated HTML under src/forgemcp/assets/ is build
output; change its source under frontend/, never the HTML directly.
Run
Run against the current directory:
.\.venv\Scripts\forgemcp.exePass --workspace only when the target differs from the server process working
directory:
.\.venv\Scripts\forgemcp.exe --workspace examples/cpp-acceptance-projectIn VS Code, the ForgeMCP: server launch configuration is the one-button path: it
builds the wheel first and then starts the server for this repository.
All MCP traffic uses stdout. Operational logs must go to stderr.
Connect Codex or Claude Code
After installation or source setup, copy the appropriate example into the root of the C/C++ project you want ForgeMCP to work on:
Client | Example | Destination |
Codex |
| |
Claude Code |
|
In the copied file, replace both example paths with absolute paths: the first points
to the forgemcp.exe installed by setup, and the --workspace argument points to
the C/C++ project root. The examples use Windows paths with forward slashes, which
work in both TOML and JSON. On macOS or Linux, point command to the virtual
environment's bin/forgemcp instead. If either destination file already exists,
add the forgemcp entry to it rather than replacing the file. Restart the client
after editing its configuration. Check the connection with codex mcp list or
claude mcp get forgemcp, respectively.
To require agents to use ForgeMCP for supported operations, append the
example agent instructions to your
project's AGENTS.md (Codex) or CLAUDE.md (Claude Code). The same block works
for both clients and requires evidence of an unsupported operation, tool failure,
or unavailability before using alternatives. Preserve existing project instructions.
Workspace files and storage
All file tools use string paths such as project/src/main.cpp and
storage/build/debug. Directory tools default to project/; the separate tool
argument root has been removed. Python consumers use the shared WorkspacePath
type, which serializes as the same string. Tool path arguments also accept ordinary
relative paths: src/main.cpp and ./src/main.cpp both mean project/src/main.cpp,
and ./ means project/. One trailing / is accepted for managed paths:
project/src/ becomes project/src. Results always use canonical qualified paths.
The prefixes project/, storage/, and root/ are reserved; use ./storage/...
to access a project directory named storage. Absolute paths, .., and repeated
separators remain invalid; external locations require an explicit root/ prefix.
Storage defaults to .<project-name>.forgemcp beside the project. Set its location
explicitly when needed:
forgemcp --workspace C:\Projects\Example --workspace-storage D:\ForgeMCP\ExampleProgress notifications in workspace, process, and toolchain are limited to one per second per invocation by
default. Configure this with --progress-interval 2.5 (seconds), or use
0 to disable throttling. The first notification is immediate; intervening updates
are dropped, not queued. Tool results signal completion even when its progress
notification is suppressed. The interval must be finite and nonnegative.
Storage is created on first use. Its persistent directories survive restarts; each feature module manages its own directories and cleanup. The process service permits working directories inside either configured root. This is a working-directory check, not an operating-system sandbox.
Tool | Operation |
| Directory tree; |
| Recursive filename/path glob search |
| Creation/modification times, byte size, owner; unavailable metadata is null |
| UTF-8 text, with an optional inclusive line range |
| Bounded matching lines, exact counts, and a linked skipped-file list |
| Create or overwrite; return removed/added line counts |
| Exact replacement; zero or ambiguous matches fail without modifying the file |
| Move a file or directory; destination must not exist |
| Delete a file or empty directory |
| Create a directory and missing parents |
Text is UTF-8; writes use a sibling temporary file and os.replace. There are no
revision/hash parameters. Edits preserve text outside the replacement, including
line endings. Parents must already exist for file writes and moves.
Directory trees hide dot-prefixed directories unless include_hidden=true;
dot-prefixed files remain visible. Searches skip directories beginning with a dot and do not follow links. Ordinary
build directories and dot-prefixed files are searchable. Explicit file reads may
access hidden directories and in-root links. Mutations cannot traverse links;
moving/removing a whole tree containing links is rejected. Dependent modules may
register protected paths, which remain readable but cannot be changed through the
workspace API. Searches have no application-level timeout or pagination. Text search
returns at most max_matches matching lines (positive integer, default 100), with
all spans on each returned line. It continues scanning to return exact
matches_count and skipped_files_count; matches_truncated indicates omitted
matching lines. The complete binary/non-UTF-8 file list is an immutable JSON resource
linked as resources.skipped_files when nonempty, rather than inline output.
The widget loads that snapshot for its skipped-files tab. Narrow the path/extensions
or increase max_matches to retrieve more matching lines. Individual lines and their
span arrays have no byte limit.
File resource templates use a single path including its project/ or storage/ prefix:
forgemcp://workspace/file{/path*}
forgemcp://workspace/raw{/path*}
forgemcp://workspace/list{?path,depth,include_hidden}
forgemcp://workspace/find-files{?pattern,path}
forgemcp://workspace/file-info{?path}
forgemcp://workspace/search{?query,path,regex,extensions,case_sensitive,max_matches}
forgemcp://workspace/results/{result_id}/{name}.json
forgemcp://workspace/results/{result_id}/{name}.mdExamples: forgemcp://workspace/file/project/src/main.cpp,
forgemcp://workspace/raw/storage/build/debug/app.exe, and
forgemcp://workspace/search?path=project/&query=TODO&extensions=cpp,hpp.
Use depth=all for a full resource tree and include_hidden=true to include
dot-prefixed directories. Text-search extensions are comma-separated;
an omitted parameter means any extension and extensions= means extensionless
files. Encode query values using percent encoding (spaces as %20, not +);
regex is supported. Text mirrors return the original text, raw mirrors return MCP
binary content, and the other four resources return text/markdown.
Dependent modules may register workspace result providers. A tool's resources
object maps each contributing provider name to a descriptor with uri and
mime_type. There is no manifest
or extensions_uri. All result resources are immutable, held in memory, and
disappear on restart.
Write/edit return resources.diff linking to diff.json with URI and MIME type.
This typed resource contains path, compact changes ranges, and hunks with
context/added/removed lines, original/new numbers, exact text including line
endings, and character spans in zero-based Unicode code points [start, end).
Starts are one-based; a zero count denotes an empty range at an insertion position.
Diff data is absent from the primary result. Widgets read the named resource
and display changes without headers or a redundant diff label. The Highlight
changes button toggles changed-substring highlighting next to Wrap lines; local
search uses a separate color. JSON and Copy all retain the original tool result.
A resource-loading failure does not change the successful file-operation outcome.
When a CMake configuration has a compilation database and clangd in its toolset,
Workspace reads, writes, and edits of C/C++ files also return
resources.clangd. This immutable JSON contains diagnostics and semantic
highlighting grouped by configuration, always across all available configurations.
Clangd analyzes the complete file even for a partial Workspace read, but the saved
diagnostics and semantic spans include only those intersecting the lines actually
returned. Their coordinates remain absolute file positions; an empty partial-read
excerpt (for example, beyond EOF) has no annotations.
Clangd starts sessions from CMake's configuration subscription and keeps them until
the configuration disappears, its database changes, or the server stops.
Each process receives -j=2; this worker setting does not impose a memory limit.
File analysis opens the complete current file, collects the requested result, and
closes the document before returning. Documents are not retained between calls, so
the next analysis incorporates saved header changes without reopening other files
after each Workspace mutation. Repeated calls pay the cost of a fresh file parse;
closing a document does not release clangd's whole index. Workspace mutations still
notify sessions of filesystem changes and reconcile changed compilation databases.
Explicit clangd tools use their existing configurations argument to select a
subset, for example
clangd_diagnostics(path="project/src/main.cpp", configurations=["debug"]).
Omitting that argument or passing [] selects all available configurations.
Workspace widgets load both resources independently. The source view lets you
select a configuration for semantic highlighting and inline diagnostic markers;
lexical C/C++ colors also cover keywords, comments, literals, directives, and nested
brackets. Diagnostic hover panels show messages and related locations on underlined
ranges. Symbol type/signature hover is not yet included in Workspace snapshots.
Diff annotations apply to new/context lines only. Resources shows the complete saved
JSON with copying; large JSON uses plain text to keep tab switching responsive.
JSON and Copy all preserve the original tool result.
Moves synchronize clangd sessions without collecting a diagnostic resource.
The standalone diagnostics widget uses severity cards with ranges and related notes;
hover renders Markdown descriptions and highlights C/C++ signature blocks.
Definitions, references, and workspace symbols group matches by file and show a
saved source excerpt when a location is selected. Workspace symbols also show their
kind and containing scope; document symbols form a collapsible document outline.
Managed excerpts are captured with the tool result; external root/ locations have
no source preview because explicit external reads require confirmation.
CMake profiles
cmake_profiles lists profiles. cmake_configure, cmake_build, and cmake_test
operate on all profiles unless a nonempty profiles list selects a subset.
Configuration must precede building, and building must precede testing. Profiles
run sequentially; one failed execution does not suppress later executions.
Each tool returns its own list of per-profile/preset results. The sole outcome
field is error: null means success, otherwise it explains the failure (including
the exit code for a failed command). Results include process_id for reading
command output through process_get; they do not duplicate logs. Configure returns the build-directory and compilation-database paths
when known; build returns parsed step counts when available; test returns JUnit cases.
Full process transcripts remain in the process module; CMake results contain no
transcript links. The default command timeout is 600 seconds per execution and
can be overridden with the existing ProcessTimeout shape (total, idle).
cmake_run_test(executable, arguments=null, cwd="project/", timeout={"total":600})
runs one already-built test executable directly, without a profile or CTest
registration. Executable and working-directory paths use project/... or
storage/... and must resolve inside their respective roots. The working directory
must exist; storage is not created automatically. On Windows, batch files are not
supported. Arguments are a list of literal strings, preserving spaces and empty
strings; NUL is rejected. For example:
{
"executable": "project/build/ninja-debug/fixture_tests.exe",
"arguments": ["--fail"],
"cwd": "project/build/ninja-debug",
"timeout": {"total": 30}
}The process inherits the server environment, closes stdin, and waits for completion.
It does not replay toolset/preset environments or CTest properties such as
WILL_FAIL, fixtures, or per-test timeouts. Exit zero means success; a nonzero
exit or process failure is reported in error. The single structured result
contains executable, arguments, cwd, error, and process_id; logs are read
through process_get. No JUnit or framework case report is inferred from output.
With no explicit profiles:
If
CMakePresets.jsonorCMakeUserPresets.jsonexists, the automaticpresetsprofile runs all available configure, build, or test presets for that operation. Names come from the selected CMake's--list-presets=all; ForgeMCP does not parse preset JSON, inheritance, conditions, macros, or associations.Otherwise,
DebugandReleaseprofiles use separatestorage/build/cmake-Debugandstorage/build/cmake-Releasedirectories.
--cmake-toolset ID_OR_NAME selects the automatic profiles' toolset (default:
system). Repeated --cmake-profile NAME KEY=VALUE ... replaces automatic profiles:
forgemcp --workspace C:\Projects\Example `
--cmake-profile debug toolset=system configuration=Debug generator=Ninja `
--cmake-profile release toolset=system configuration=Release generator=NinjaProfile settings are toolset, configuration, generator, build-directory,
c-compiler, cxx-compiler, toolchain-file, and repeatable
define=CMAKE_VARIABLE=value. Compiler names refer to tools in the selected
toolset. Build directories and toolchain files use project/... or storage/....
Plain profiles default to the Ninja generator and enable compilation-database
export. Ninja must exist in the selected toolset; there is no generator fallback.
Without a compiler setting, CMake discovers the compiler in the toolset's
environment. ForgeMCP does not select another toolset as a fallback.
When the generator changes, configure completely removes the existing build
directory and recreates it before configuring. The cache must belong to this
project, and workspace root, protected-path, and symlink checks still apply.
Native preset profiles use repeatable configure-preset, build-preset, and
test-preset settings; ForgeMCP does not infer links between them:
forgemcp --workspace C:\Projects\Example `
--cmake-profile native toolset=system `
configure-preset=ninja-debug `
build-preset=build-ninja-debug `
test-preset=test-ninja-debugPreset execution delegates directories, toolchains, and environments to CMake/CTest;
ForgeMCP neither resolves nor prevalidates binaryDir. A profile may supply
build-directory for ordinary build/test commands when corresponding presets are
absent. This must identify the preset's actual build directory inside project/storage.
Such ordinary commands use the toolset environment, not a replay of configure-preset
environment variables; use build/test presets when their inherited environment is needed.
Preset configure settings cannot be mixed with manual generator/compiler/cache settings.
No profile settings are read from environment variables or persisted by ForgeMCP.
Progress messages identify the profile and current configure step, build action,
or CTest case, with the common notification throttle. Preset generators are not
overridden; their compilation-database settings remain controlled by the preset.
The initial CMake slice does not yet include clean/project-inspection tools or syntax highlighting. Unit and in-process MCP tests cover profiles, command parsing, generator changes, result resources, and qualified paths.
Toolchain discovery
Before serving requests, ForgeMCP discovers one System toolset from PATH and, on
Windows, a separate toolset for every Visual Studio instance reported by the standard
Installer vswhere.exe. Each VS toolset uses its own VsDevCmd.bat environment.
Toolsets can be incomplete or empty. ForgeMCP does not select a current or preferred
toolset; consumers must supply an explicit ID.
Add separate user toolsets with repeated --toolset NAME TOOL=PATH ... options:
forgemcp `
--toolset "LLVM 20" `
"cmake=C:\Tools\CMake\bin\cmake.exe" `
"clang=C:\LLVM20\bin\clang.exe" `
"clang++=C:\LLVM20\bin\clang++.exe" `
"clangd=C:\LLVM20\bin\clangd.exe" `
--toolset "LLVM 22" `
"clang++=D:\LLVM22\bin\clang++.exe" `
"lldb-dap=D:\LLVM22\bin\lldb-dap.exe"Names must be unique, and tool names must match built-in specs. Relative paths resolve against the server working directory; paths inside the workspace are permitted. Invalid explicit paths are configuration errors and never fall back to system tools. User toolsets inherit the server environment. Their IDs are deterministic hashes of their names, so changing paths keeps an ID stable.
Built-ins cover CMake, CTest, Ninja, Make, MSBuild, MSVC (cl), link, Clang,
clang++, clang-cl, GCC, g++, LLD, lld-link, clangd, Git, LLDB-DAP, GDB, and
cppvsdbg. The last adapter may be found as OpenDebugAD7.exe or VS Code's bundled
vsdbg.exe; it has no portable version probe. An unknown or failed version probe
leaves the discovered path available with a null version. Version methods for cl,
link, cppvsdbg, and lldb-dap are not implemented in this iteration.
Toolsets are discovered once per server lifetime; restart to discover changed
installations. Detail tools and resources query available versions on each request,
without caching them. Listing toolsets does not launch version probes. All probes,
vswhere, and the command capturing VsDevCmd plus set remain visible in the process
overview and retain their transcripts. Toolset resources omit environments; the
environment capture's stdout is retained in its ordinary process transcript.
Tests
Tests that need a C/C++ workspace use the shared cpp_acceptance_project fixture from
tests/conftest.py. It copies the complete acceptance project into a fresh pytest
temporary directory for each test, so tests can modify their workspace without
changing repository files.
Verify
.\.venv\Scripts\python.exe -m build --wheel
.\.venv\Scripts\python.exe -m pytest -q
git diff --checkSee docs/architecture.md for module boundaries and the registration lifecycle. Repository rules for coding agents live in AGENTS.md. See docs/releasing.md for distribution checks, GitHub Releases, and the separate final PyPI publishing step.
Reading process logs
process_get accepts lines, time, and max_bytes (default 65536). With neither
selector it reads the last 100 lines. For example:
{"process_id": 42, "time": {"last": 1}, "lines": {"last": 100}, "max_bytes": 4000}Each selector takes exactly one form: {"first": N}, {"last": N}, or
{"start": A, "end": B}. Lines start at 1 and ranges include both endpoints.
Time uses seconds from process start and includes start but excludes end. Last
seconds are relative to request time while running and completion after exit.
Time is measured when a chunk is recorded, not when each character was produced.
Selection applies time, then lines within that selection, then the combined UTF-8
text byte budget (excluding JSON/metadata). Absolute line numbers are retained.
Tail selections keep the end when bytes run out; other selections keep the start.
A lines selector determines direction when supplied, otherwise the time selector does.
Partial lines are allowed, but UTF-8 characters are never split. max_bytes=0
returns metadata without text. The response adds only lines: [first, last], or
null for an empty selection; each entry carries its own inclusive start/end lines.
All streams share line numbering in observed order; entries can overlap a line.
LF advances the line, including split CRLF; standalone CR is preserved as text.
The retained journal and the existing process Markdown resource remain complete.
Available Tools
25 toolsclangd_configurationsBRead-only
List CMake contexts with an existing compilation database and clangd.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds that only contexts with an existing compilation database and clangd are listed, which is useful filtering context, but it does not disclose any other behavioral traits like rate limits or performance.
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 or redundancy. It communicates the core function immediately and 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?
Given the simple read-only nature, zero parameters, and an output schema, the description is adequate but minimal. It does not explain what a 'CMake context' is or when an agent should prefer this discovery tool, leaving a small contextual 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?
The tool has zero parameters, so there is no parameter semantics to document. Per the rubric, this yields a baseline score of 4, and the description does not need to compensate for any schema 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 ('List') and resource ('CMake contexts'), plus qualifying conditions ('existing compilation database and clangd'). It is clear enough to distinguish from sibling tools like clangd_diagnostics or cmake_configure, but does not explicitly name or contrast with any 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 description gives no guidance on when to use this tool versus alternatives such as cmake_profiles or clangd_workspace_symbols. It simply states what is listed, leaving 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.
clangd_definitionBRead-only
Find definitions of the symbol at the supplied position.
External locations use root/. Empty configurations selects all.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| timeout | No | ||
| position | Yes | ||
| configurations | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds two useful behavioral facts (external locations resolve against root/, empty configurations selects all), but says nothing about indexing prerequisites, failure modes, or latency/timeout behavior.
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, purpose front-loaded, no filler. The second sentence is telegrammatic ('External locations use root/') and slightly cryptic, but it is compact rather than verbose.
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. However, for a 4-parameter tool with 0% schema description coverage, the description leaves path, timeout, and the position coordinate convention unaddressed, which is a real gap for correct invocation.
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% for the four top-level parameters. The description explains only 'configurations' (empty selects all); path and timeout are undocumented anywhere, and position is only implied by 'at the supplied position'. With low coverage the description should compensate more than it does.
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 ('Find definitions of the symbol at the supplied position'), which is unambiguous. It does not distinguish itself from near-siblings like clangd_references or clangd_hover, so an agent must infer the boundary from the names alone.
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 guidance on when to use this versus clangd_references, clangd_hover, or clangd_document_symbols, nor any prerequisites (e.g. that the file must be indexed by clangd). The only usage-like text concerns configuration resolution, which is parameter behavior rather than tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clangd_diagnosticsBRead-only
Get diagnostics for a managed file in selected configurations. Empty configurations selects all.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| timeout | No | ||
| configurations | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | 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 that an empty configurations array selects all, which is useful, but says nothing about timeout behavior or what diagnostics are produced. With annotations carrying the safety profile, this is adequate but not rich.
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 waste, and the core purpose is front-loaded. The second sentence is slightly awkwardly worded but still earns its place by documenting a non-obvious default.
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 description, and annotations cover the read-only nature. However, the definition should do more to document the timeout parameter and clarify path semantics for a tool with zero 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 description coverage is 0%, so the description must compensate. It clarifies the 'managed file' meaning of path and the empty-equals-all semantics of configurations, but leaves timeout entirely undocumented. Partial compensation for a 3-parameter 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?
The description states a specific verb and resource ('Get diagnostics for a managed file'), which is clear enough to distinguish from read/edit siblings. However, it doesn't explicitly name or contrast with the other clangd_* tools, so differentiation is only partial.
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 or mention of alternatives. The sentence 'Empty configurations selects all' describes parameter behavior rather than routing the agent to this tool over siblings like clangd_hover or clangd_references.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clangd_document_symbolsBRead-only
List the symbols declared in a managed file. Empty configurations selects all.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| timeout | No | ||
| configurations | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds the default-selection behavior of the configurations array but says nothing about return shape, timing, or clangd-server dependency; with annotations and an output schema present, this is an acceptable but thin addition.
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, purpose first, parameter note second. No filler or 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?
Output schema and annotations relieve the description of return-value and safety duties, and the configurations semantics are covered. However, for a 3-parameter tool with zero schema descriptions, 'path' (what counts as a managed file) and 'timeout' semantics remain unexplained.
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 must compensate. It does explain the configurations default ('empty selects all'), which is genuinely useful, but leaves 'path' and 'timeout' entirely undefined, so it only partially covers the three parameters.
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 ('List the symbols declared in a managed file'), which distinguishes it from the sibling clangd_workspace_symbols (project-wide) by scoping to a single file. The term 'managed file' is slightly jargon-y but understandable in context.
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 or comparison to alternatives like clangd_hover, clangd_definition, or clangd_workspace_symbols. The only usage-ish statement ('Empty configurations selects all') is about parameter behavior, not tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clangd_hoverBRead-only
Describe the symbol at a one-based line and zero-based code-point position. Empty configurations selects all.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| timeout | No | ||
| position | Yes | ||
| configurations | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safe-read profile is covered. The description adds one behavioral detail: 'Empty configurations selects all,' which clarifies default behavior, but it does not discuss timeout handling, path semantics, or output characteristics.
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?
The description is two short sentences with the purpose front-loaded. The only minor issue is the awkward phrasing 'Empty configurations selects all,' but overall there is little wasted text.
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 read-only hover tool with an output schema and safety annotations, the description covers the core action and position semantics. However, it lacks usage guidance and does not explain the required path or timeout parameters, leaving some gaps for an agent selecting the tool.
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 reported as 0% for top-level parameters, so the description must compensate. It clarifies the position format (one-based line, zero-based code-point) and configurations default behavior, but it omits any explanation of the required path parameter or the timeout 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?
The description states a specific verb and resource: 'Describe the symbol' at a given position. It is clear what the tool does, though it does not explicitly differentiate itself from sibling clangd tools like clangd_definition or clangd_references.
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 guidance on when to use this tool versus alternatives, nor any mention of prerequisites or exclusions. The description only states the positional input format, leaving usage context to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clangd_referencesCRead-only
Find references to the symbol at the supplied position. Empty configurations selects all.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| timeout | No | ||
| position | Yes | ||
| configurations | No | ||
| include_declaration | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds one useful behavioral default (empty configurations = all), but omits whether the declaration itself is included, timeout semantics, 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?
Two tight sentences with the core action front-loaded and no filler. The second sentence is slightly awkwardly phrased ("Empty configurations selects all") but still earns its place as a default-behavior note.
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 five parameters at 0% schema coverage and no annotation detail on defaults, the description leaves too much undocumented for an agent to call this confidently. The existence of an output schema excuses it from explaining return values, but not from the parameter 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 description coverage is 0%, so the description carries the full burden, yet it only glosses 'position' and 'configurations'. The required 'path', plus 'timeout' and 'include_declaration' (which defaults to true and materially changes results), are never explained.
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+resource ("Find references to the symbol") with a clear scope anchor ("at the supplied position"). It is distinct from clangd_definition/hover/document_symbols, though it does not explicitly name those siblings to differentiate.
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?
Only the note that an empty configurations list selects all is offered; there is no guidance on when to prefer this tool over clangd_definition or the workspace_* search tools, and no prerequisites are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clangd_workspace_symbolsCRead-only
Find workspace symbols by name query. Empty configurations selects all.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| timeout | No | ||
| configurations | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds no behavioral context beyond that: no scope of search, no return shape, no cost/rate behavior. The 'empty configurations' line describes a parameter rather than a trait.
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 core action is front-loaded. The second sentence is tersely worded ('Empty configurations selects all') but earns its place by clarifying a default.
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. However, with zero schema-description coverage, no usage guidance, and only one of three parameters clarified, the definition is too thin for an agent to invoke confidently.
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 must carry parameter meaning. It explains only that empty configurations selects all, leaving the required 'query' semantics and the 'timeout' parameter undocumented anywhere. That is well short of compensating for a 3-param, zero-coverage schema.
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: 'Find workspace symbols by name query.' The scope ('workspace symbols' vs the sibling 'document_symbols') is implicit in the name, so an agent can mostly distinguish it, but the description does not explicitly differentiate from clangd_document_symbols.
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 exclusions, and no named alternative among the many clangd_* siblings. The only contextual hint is the configurations behavior, which is a parameter detail, not usage routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cmake_buildBDestructive
Build selected profiles and their build presets after configuration.
Omitted targets use CMake or preset defaults; a nonempty targets list selects explicit build targets.
| Name | Required | Description | Default |
|---|---|---|---|
| targets | No | ||
| timeout | No | ||
| parallel | No | ||
| profiles | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destruction, non-idempotency, and open-world behavior, so the safety profile is covered structurally. The description adds the targets/default semantics but says nothing about build side effects, artifact production, or failure behavior beyond the annotation layer.
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 compact sentences with the core action front-loaded and no filler. The second sentence earns its place by clarifying target defaulting, though the description is arguably under-specified for a 4-param tool.
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, but for a destructive build tool with 4 undocumented parameters and no annotations-level elaboration on side effects, the description is too thin to call it sufficient.
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 4 parameters, so the description carries the full burden. It explains only the targets parameter (omitted vs nonempty), leaving timeout, parallel, and profiles completely undocumented anywhere.
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 (build) and resource (selected profiles/build presets), and the phrase 'after configuration' places it relative to cmake_configure and cmake_test. It is clear what the tool does, though it does not name any sibling explicitly.
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 phrase 'after configuration' implies a prerequisite and workflow position, which is genuine usage context. However, it never states when to use this over cmake_configure/cmake_test or any exclusions, so guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cmake_configureADestructive
Configure selected profiles; return build/database paths and per-execution errors.
Changing a manual profile's generator removes and recreates its build directory.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout | No | ||
| profiles | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, idempotentHint=false and openWorldHint=true, so the safety profile is partially known. The description adds genuinely new behavioral context by disclosing that changing a manual profile's generator deletes and recreates the build directory, and that per-execution errors are returned.
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 tight sentences, with the core purpose and output front-loaded before the caveat about build directory recreation. No filler, though it is terse rather than optimally structured with headings.
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-value detail is not the description's burden, and annotations cover the destructive/idempotency profile. The remaining gaps are the undocumented timeout parameter and the absent usage workflow, which keep it from being 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 must carry parameter meaning. It clarifies that 'profiles' is the selection list to configure, but says nothing about the 'timeout' object (idle/total seconds), leaving half the parameters undocumented at the top level.
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 ('Configure selected profiles') and notes the return content (build/database paths and per-execution errors). It clearly sits between cmake_profiles and cmake_build, though it never names or contrasts with those siblings explicitly.
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 or when-not-to-use guidance, and no mention of the sibling alternatives cmake_profiles, cmake_build, or cmake_test. The reader can infer that 'selected profiles' must come from cmake_profiles, but nothing states the workflow or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cmake_profilesARead-only
List effective profiles with their toolsets, build settings, and preset selections.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already declares this as a safe, non-mutating read, and the description confirms the listing nature by naming the fields returned. It adds little beyond that: no mention of scoping (per-workspace? per-project?), caching, or freshness. With annotations covering the safety profile and an output schema present, a 3 is appropriate.
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 naming the verb, resource, and returned content with no filler. Every clause 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?
For a parameterless read-only list tool with an output schema documenting the return shape, the description is nearly sufficient. The only gap is the absence of any scoping or usage context, which is minor given the simplicity of the operation.
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, so the baseline is 4; there is nothing for the description to disambiguate. The description correctly refrains from inventing parameter behavior.
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 gives a specific verb ('List') and resource ('effective profiles') and enumerates the content surfaced (toolsets, build settings, preset selections), which separates it from siblings like toolsets_list and cmake_configure. It is clear but doesn't explicitly distinguish itself from toolsets_list, which also lists a related CMake concept.
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 statement of when to use this tool versus alternatives such as toolsets_list or cmake_configure, and no prerequisites or context. Usage must be inferred entirely from the name and description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cmake_testBDestructive
Run CTest for selected profiles and test presets after building; return test cases.
names selects exact test names, not regex patterns; omit it to use CTest or preset defaults.
| Name | Required | Description | Default |
|---|---|---|---|
| names | No | ||
| timeout | No | ||
| parallel | No | ||
| profiles | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true and openWorldHint=true, so the mutating/unsafe profile is covered. The description adds workflow context ('after building') but does not disclose anything beyond the annotations such as execution side effects or permission requirements.
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, front-loaded with the core action before the parameter detail. No significant waste, though the parenthetical asides could be tightened.
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?
The tool has four optional parameters, a nested ProcessTimeout type, and an output schema. The output schema covers return values and annotations cover safety, but the description leaves three of four parameters (timeout, parallel, profiles) entirely unexplained, which is a notable gap for a moderately complex tool.
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 must compensate. It clarifies only the 'names' parameter (exact names, not regex; omit for defaults) and leaves 'timeout', 'parallel' and 'profiles' undocumented in both schema and 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?
States a specific verb and resource ('Run CTest ... return test cases') and adds the 'after building' sequencing context. It is clear what the tool does, though it does not explicitly name cmake_build/cmake_configure as the related siblings.
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?
'after building' implies the tool should be invoked following a build, which gives some usage context. However, there is no explicit when-to-use/when-not guidance or routing to alternatives among the cmake_* siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
processes_overviewBRead-onlyIdempotent
Show current and completed external processes managed by ForgeMCP.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | all |
Output Schema
| Name | Required | Description |
|---|---|---|
| running | Yes | Number of processes currently running or starting. |
| completed | Yes | Number of processes in a terminal state. |
| processes | Yes | Processes matching the requested filter. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a safe, idempotent, non-destructive, closed-world read, so the safety profile is fully covered. The description adds only the scope ('current and completed' external processes), which partially duplicates the status enum rather than disclosing new behavior.
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. It is appropriately sized for a one-parameter read tool, though extremely terse.
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. For a trivial overview tool the remaining gaps are the missing sibling routing and status-filter semantics.
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% for the single status parameter, so the description must compensate. 'Current and completed' loosely maps to the running/completed enum values but omits the 'all' default and gives no explicit guidance on how the filter behaves.
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 (Show) and resource (external processes managed by ForgeMCP) with clear scope (current and completed). It does not differentiate itself from the sibling process_get, which an agent would need to distinguish a list-overview from a single-process lookup.
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 statement of when to use this versus process_get or any other sibling, and no prerequisites or exclusions. The reader must infer that this is the list/overview variant from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
process_getARead-onlyIdempotent
Read a log slice: time, then lines, then UTF-8 text bytes.
With neither selector, return the last 100 lines. Line ranges are inclusive; time ranges are [start, end) seconds from process start. Last seconds end at now for running processes, at completion otherwise. Returned line numbers remain absolute; a byte limit can cut a line.
| Name | Required | Description | Default |
|---|---|---|---|
| time | No | ||
| lines | No | ||
| max_bytes | No | ||
| process_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| lines | No | |
| process | Yes | |
| transcript | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so safety is covered. Beyond that the description discloses non-obvious behavior: truncation order (time, then lines, then bytes), half-open time ranges versus inclusive line ranges, the running-vs-completed meaning of 'last seconds', and that a byte cap can cut a line. That is substantive context annotations cannot carry, though interaction between simultaneous time and lines selectors is only hinted at.
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-loaded with the core action, then defaults, then range semantics, then edge cases — a sensible order with no filler sentences. The opening phrase 'time, then lines, then UTF-8 text bytes' is terse to the point of being slightly cryptic about the precedence it is describing.
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; the description instead spends its budget on the genuinely ambiguous parts (defaults, interval inclusivity, byte-budget truncation, absolute line numbering). For a read tool with rich annotations, nothing an agent needs in order to call it correctly is missing.
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?
With measured schema coverage at 0% for top-level properties, the description must compensate and largely does: it explains the units and interval semantics of the time selectors, the inclusivity of line ranges, and the truncation behavior of max_bytes. It adds nothing about process_id beyond the implicit 'process', so it falls short of fully covering every 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?
The opening clause 'Read a log slice' gives a specific verb and resource, and the description immediately bounds it to a single process's log stream, which cleanly separates it from siblings like processes_overview that enumerate processes. An agent can identify the operation 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?
It specifies the default behavior when no selector is given ('return the last 100 lines'), which is real usage guidance, but it never states when to prefer this tool over processes_overview or any other sibling, nor any prerequisites. Usage is implied by the selector semantics rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
toolset_getCRead-onlyIdempotent
Read tool paths and kinds, querying available versions for this request.
| Name | Required | Description | Default |
|---|---|---|---|
| toolset_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| tools | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered structurally. The description adds only "querying available versions for this request," which hints at version awareness but is too vague to be actionable.
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 compact sentence with no filler, which is appropriate in size. The wording is slightly run-on and unclear, but nothing is wasted.
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 the tool is a simple one-param fetch. However, the description leaves the required identifier and the relationship to toolsets_list unexplained, which is a real gap for an agent choosing between them.
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 single required parameter toolset_id has 0% schema description coverage, and the description does not explain what a toolset ID is, its format, or where to obtain it. The description fails to compensate for the schema 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?
"Read tool paths and kinds" gestures at retrieving information, but the phrasing is ambiguous and never states plainly that this fetches a single toolset by ID. It does not distinguish itself from the sibling toolsets_list, so an agent cannot easily tell the two apart.
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 guidance on when to use this versus toolsets_list, nor any stated prerequisite. The agent is left to infer that "get" means a single fetch while the sibling "list" means enumeration.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
toolsets_listARead-onlyIdempotent
List all discovered toolsets and the tools available in each.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint=false, so safety is covered. The description adds only the hint that toolsets are 'discovered' (dynamic), and says nothing about result size, caching, or whether discovery is live; with an output schema present, this is adequate but thin.
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 filler, front-loading the action and the returned content. Every word 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?
For a simple no-param read with an output schema and full annotation coverage, the description is sufficient to call the tool correctly. It could be improved by naming toolset_get as the single-item alternative, but nothing essential is missing.
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, so per the rubric the baseline is 4. There are no parameter semantics to clarify and the description correctly implies a no-argument enumeration.
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 (toolsets) plus the scope 'all discovered' and the payload ('tools available in each'). It does not explicitly contrast with the sibling toolset_get, but the plural/aggregate framing makes the distinction reasonably inferable.
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 mention of the singular sibling toolset_get, and no conditions or exclusions. The agent must infer from the name alone that this is the enumeration counterpart.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workspace_deleteADestructive
Delete a file or empty directory; protected paths and roots cannot be deleted.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| action | Yes | |
| source | No | |
| resources | 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 safety profile is covered. The description adds genuinely new behavioral context: deletion is limited to files and EMPTY directories (implying non-recursive), and protected paths/roots are refused. It does not say what error or response a refused delete produces, holding it below 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?
One sentence, front-loaded with the operation and immediately followed by the key constraint. Zero waste.
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 annotations covering safety and an output schema covering return values, the description only needs to supply the operation's limits, which it does. Minor gaps remain around recursion behavior and failure semantics for a destructive tool.
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 would ideally clarify the 'path' parameter, but it offers no syntax, relative-vs-absolute, or workspace-root semantics. The single parameter is largely self-evident from its name, so this sits at the minimum-viable baseline rather than being actively unhelpful.
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 ('Delete') and resource ('file or empty directory'), scoping the operation precisely enough to distinguish it from siblings like workspace_mkdir or workspace_move. It does not name an alternative tool directly, but the resource+scope 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?
No when-to-use guidance and no alternatives are named. The only constraint offered ('protected paths and roots cannot be deleted') is a precondition on the target, not routing advice for choosing this tool over siblings such as workspace_move or workspace_edit_file.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workspace_edit_fileADestructive
Replace one exact text occurrence, or all with replace_all=true.
old_text must be nonempty. Missing or ambiguous matches leave the file unchanged. Text and line endings outside replacements are preserved.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| new_text | Yes | ||
| old_text | Yes | ||
| replace_all | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| resources | No | |
| replacements | Yes |
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 profile is covered. The description adds genuine behavioral context beyond that: missing or ambiguous matches leave the file unchanged (safety on failure), and text/line endings outside replacements are preserved (scope of mutation). It stops short of noting permission or concurrency requirements.
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 with zero filler, and the core behavior (one occurrence, or all) is front-loaded in the first line. Every sentence adds a distinct fact: replacement scope, failure behavior, preservation guarantee.
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, return values need no explanation, and the description covers mutation scope, failure behavior, and preservation of surrounding content. An agent has what it needs to call this safely; only the sibling-routing and permission story are missing.
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 must carry the load. It explains old_text (must be nonempty) and replace_all (single vs. all occurrences), which are the two parameters whose semantics aren't self-evident. Only path and new_text go unexplained, and both are obvious from their names.
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: replace one exact text occurrence, or all occurrences when replace_all=true. This is clearly distinguishable from a full-file write, though it never names workspace_write_file as the alternative. The purpose is unambiguous 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?
Usage is implied by 'replace one exact text occurrence' versus replace_all=true, which tells the agent which mode to pick. However, there is no explicit guidance on when to prefer this over workspace_write_file, nor any exclusions for when editing is inappropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workspace_file_infoARead-only
Read creation/modification times, byte size, and owner of one file.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| owner | Yes | |
| resources | No | |
| created_at | Yes | |
| size_bytes | Yes | |
| modified_at | 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 fully covered without the description. The description adds the returned field list but says nothing about error behavior (e.g., non-existent path) or path resolution, so it only marginally exceeds the annotation baseline.
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 verb and the returned fields, zero filler. Every word 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 explained, and annotations cover the safety profile; the remaining gap is only the undocumented path semantics. For a trivial one-parameter stat tool this is essentially 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% for the single 'path' parameter, so the description carries the burden — but it only implies a single file path without clarifying whether it is absolute, workspace-relative, or how symlinks/directories are handled. This is the baseline 3 rather than full compensation.
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 (file info) and enumerates the exact fields returned — creation/modification times, byte size, owner — which cleanly separates it from workspace_read_file (contents) and workspace_find_files (search). It does not explicitly name a sibling, so it stops 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?
Usage is only implied: 'of one file' signals a single-target stat operation, but there is no statement of when to prefer this over workspace_read_file or workspace_list, and no prerequisites. Adequate minimum-viable guidance, no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workspace_find_filesARead-only
Find file paths recursively by case-sensitive glob, skipping dot directories and links.
Patterns without / match basenames; patterns with / match paths relative to the search directory.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | project/ | |
| pattern | No | * |
Output Schema
| Name | Required | Description |
|---|---|---|
| files | No | |
| paths | Yes | |
| resources | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare read-only, non-destructive, closed-world behavior. The description adds operational traits beyond annotations: recursive traversal, case-sensitive matching, and skipping of dot directories and symlinks. These are useful behavioral details.
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 tight paragraphs, front-loaded with the core function and followed by necessary pattern semantics. No wasted sentences.
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 a simple two-parameter schema, existing annotations, and an output schema that handles return values, the description covers the essential operational details. Only the 'path' parameter's default and role could be made more explicit, a minor 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?
Schema coverage is 0%, so the description must compensate. It explains pattern semantics ('/'-based basename vs path matching) and implicitly defines the search directory role of 'path'. While the 'path' parameter itself is not explicitly described, the description provides substantial meaning for the pattern 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 (find), resource (file paths), and method (recursive case-sensitive glob). It distinguishes itself from text-search siblings by focusing on path discovery, though it does not name alternatives explicitly.
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 provides pattern-matching semantics but offers no guidance on when to choose this tool over siblings like workspace_list or workspace_text_search. Usage is implied by the glob-based purpose, but tool selection remains unaddressed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workspace_listARead-only
Show a directory tree; null depth expands every directory.
File paths are errors. include_hidden controls dot directories; dot files remain visible and links are listed without traversal.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | project/ | |
| depth | No | ||
| include_hidden | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| entries | Yes | |
| resources | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It discloses notable behaviors beyond the safety annotations, such as 'null depth expands every directory', 'File paths are errors', and that 'dot files remain visible and links are listed without traversal'. These are useful operational details, though it doesn't cover the output format or performance implications.
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?
The description is two sentences: the first states the core action and a key behavior; the second packs parameter semantics and file handling rules. It is front-loaded and 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?
For a read-only listing tool with an output schema, the description covers scope, hidden-file behavior, and error conditions. It omits potential rate limits or pagination, but given the annotations and output schema, it is largely complete for correct invocation.
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?
With 0% schema description coverage, the description must clarify parameters, and it does: 'depth' (null expands all) and 'include_hidden' (controls dot directories) are explained meaningfully, adding semantic value beyond the bare schema types.
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 says 'Show a directory tree', which is a clear verb+resource, but it doesn't name or distinguish itself from its sibling workspace_find_files, which also deals with files. The purpose is understandable but lacks explicit differentiation.
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 guidance on when to use this tool versus alternatives like workspace_find_files or workspace_file_info. The tool lists directories, but the description offers no conditions or exclusions to help an agent select it over siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workspace_mkdirAIdempotent
Create a directory and missing parents, or report that it already exists.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| action | Yes | |
| source | No | |
| resources | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=false, and non-read-only, and the description reinforces this by disclosing that missing parents are created and an existing directory is reported rather than erroring. It stops short of covering path format, permissions, or error behavior, but the added behavioral context is real.
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 the core action first and the idempotency clause second. No filler, every clause 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?
For a one-parameter tool, the description plus annotations and an existing output schema cover enough to invoke it correctly. The only omission is path-format guidance, which is minor given the tool's simplicity.
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 must carry parameter meaning, yet it only implies the single 'path' argument points at a directory to create. It does not clarify whether the path is workspace-relative or absolute, leaving a genuine gap for the one required 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 (create) and resource (directory), and adds the distinguishing mkdir -p behavior of creating missing parents. No sibling performs directory creation, so the tool is unambiguous among the file/workspace tools listed.
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: the parent-creation and 'already exists' clauses hint at when this is preferred over manual sequencing, but there is no explicit when-to-use or precondition statement. No alternative sibling exists to route against, which keeps it merely adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workspace_moveADestructive
Move a file or directory within project/ or within storage/.
The destination must not exist, and its parent directory must exist.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | ||
| destination | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| action | Yes | |
| source | No | |
| resources | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=false, so the safety profile is partly covered. The description adds real behavior beyond that: the destination is never clobbered (must not exist), the parent must pre-exist, and the operation is confined to project/ or storage/ (no cross-root moves). It stops short of describing failure/reversibility semantics, so a 4.
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: the action and its scope come first, the preconditions second. Nothing is redundant and every clause 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 explained, and annotations cover the safety profile. The remaining gap is path-format semantics for the two parameters, which an agent must still infer.
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 must carry the burden. It clarifies that destination cannot already exist and that its parent must exist, and implies source may be a file or a directory, which adds meaning over the bare 'source'/'destination' strings. It does not specify the path format expected relative to project/ vs storage/, leaving a real ambiguity.
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 gives a specific verb and resource ('Move a file or directory') plus scope ('within project/ or within storage/'), which is enough to separate it from workspace_write_file, workspace_delete, and workspace_mkdir. It does not name a sibling or an alternative operation explicitly, so it falls just 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?
It states two invocation preconditions ('destination must not exist', 'its parent directory must exist') that tell the agent when the call will succeed, and the scope clause implies moves are confined to a single root. However, there is no guidance on when to choose this over alternatives (e.g., workspace_write_file+delete, or a rename), so it is implied rather than explicit usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workspace_read_fileARead-only
Read UTF-8 text, optionally selecting an inclusive range of one-based lines.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| end_line | No | ||
| start_line | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| text | Yes | |
| resources | No | |
| start_line | 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 real context beyond annotations: the content is UTF-8 text and line selection is inclusive and one-based. It does not disclose behavior for out-of-range lines, missing files, or encoding errors.
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 tight sentence that front-loads the core action ('Read UTF-8 text') before the optional range qualifier. Every clause 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?
For a simple read tool, an output schema exists (so return values need no explanation) and annotations carry the safety profile. The description is nearly complete, missing only error/out-of-range behavior for the line-range feature.
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 must carry parameter meaning. It does explain that start_line/end_line form an inclusive, one-based range, which is genuinely additive. However, it omits edge semantics (what happens if only one bound is supplied, or bounds exceed file length), so compensation is partial.
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+resource ('Read UTF-8 text' from a file) and the optional line-range capability. An agent can distinguish it from workspace_write_file/workspace_edit_file, but it never names or contrasts with the closest sibling for content retrieval (workspace_text_search, workspace_file_info).
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 'optionally' hints that the line range is not required, which is the only usage signal. There is no explicit when-to-use guidance versus text search or file info, nor any when-not-to-use or prerequisite statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workspace_text_searchARead-only
Search lines by literal text or regex; report skipped binary/non-UTF-8 files.
extensions accepts suffixes with or without a leading dot; null selects all files, while an empty list selects none. max_matches limits returned matching lines, not scanning. Counts are exact; skipped-file paths are available through the linked immutable resource.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | project/ | |
| query | Yes | ||
| regex | No | ||
| extensions | No | ||
| max_matches | No | ||
| case_sensitive | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| matches | Yes | |
| resources | No | |
| matches_count | Yes | |
| matches_truncated | Yes | |
| skipped_files_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, non-destructive safety profile, and the description adds real value on top: skipped binary/non-UTF-8 files are reported, counts are exact, and max_matches bounds returned lines rather than scanning. This exceeds what the annotations convey.
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?
Tight, front-loaded prose with no filler; the core purpose leads and the caveats follow. Dense but each clause (null vs empty list, counts exact, skipped-file resource) 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?
With an output schema present, return-value detail is not required, and the description still adds behavior (skipped files, exact counts, linked immutable resource). It is nearly complete for a 6-param read tool; missing only a note on case_sensitive/regex interaction.
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 must carry parameter semantics. It does well for the nuanced ones (extensions: leading dot optional, null = all, empty = none; max_matches limits returned lines, not scanning) but leaves query, path, regex, and case_sensitive undocumented, so compensation is only partial.
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: 'Search lines by literal text or regex.' Clearly a content-search tool, distinguishable from workspace_find_files (by name) and workspace_read_file. Lacks an explicit sibling callout but the purpose reads unambiguously.
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 implied by the operation (search text in a workspace path), but no when-to-use/when-not guidance or routing to alternatives such as workspace_find_files is given. An agent must infer the right situation for content search versus filename search.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workspace_write_fileADestructive
Create or fully overwrite a UTF-8 file; its parent directory must exist.
Return removed/added line counts and linked change resources.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| text | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| action | Yes | |
| resources | No | |
| lines_added | Yes | |
| lines_removed | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered. The description adds genuine context beyond that: the file is UTF-8, existing content is fully replaced, and the parent directory must pre-exist. It doesn't cover encoding failures or permission behavior, so not 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?
Two short sentences, with the destructive create/overwrite action front-loaded and the prerequisite attached. The return-value sentence is borderline redundant given an output schema exists, but it is brief.
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 two-parameter write tool with annotations covering the destructive profile and an output schema covering the return shape, the description supplies the missing pieces: encoding and the parent-directory prerequisite. Remaining gaps (path conventions, overwrite failure modes) are 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 are two parameters, so the description carries the full burden. It clarifies only that the content is UTF-8 text; neither 'path' (format, relative vs absolute, workspace scoping) nor 'text' semantics are explained.
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 or fully overwrite a UTF-8 file'), and the word 'fully' signals the distinction from the sibling workspace_edit_file. It stops short of naming the alternative, so it isn't 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?
Gives a real prerequisite ('its parent directory must exist'), which is useful for correct invocation. But it never says when to choose this over workspace_edit_file or workspace_mkdir, so the when-to-use guidance is only implied.
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.
26 tool updates
v0.2.2- Added
clangd_configurations - Added
clangd_definition - Added
clangd_diagnostics - Added
clangd_document_symbols - Added
clangd_hover - Added
clangd_references - Added
clangd_workspace_symbols - Added
cmake_build - Added
cmake_configure - Added
cmake_profiles - Added
cmake_test - Added
process_get - Added
processes_overview - Removed
server_status - Added
toolset_get - Added
toolsets_list - Added
workspace_delete - Added
workspace_edit_file - Added
workspace_file_info - Added
workspace_find_files - Added
workspace_list - Added
workspace_mkdir - Added
workspace_move - Added
workspace_read_file - Added
workspace_text_search - Added
workspace_write_file
1 tool update
v0.1.0- First observed
server_status
TDQS
Scored across 25 tools
Tools are mostly well-separated by resource (workspace, process, clangd, cmake, toolset). Some ambiguity exists within the clangd and cmake families (e.g., clangd_* language features), but operation names and descriptions clarify intent.
Mostly consistent verb_noun with clear prefixes: workspace_*, cmake_*, clangd_*. Minor deviations: processes_overview and process_get, workspace_list vs. workspace_find_files, and toolset_get vs. toolsets_list, but overall predictable.
25 tools is on the higher side but reasonable for a multi-domain server covering workspace, CMake, clangd, and process management. Each domain contributes a focused set.
Covers essential operations for each domain: file CRUD, CMake configure/build/test, clangd diagnostics/navigation, process monitoring, and toolset listing. Minor gaps like process termination/start, CMake clean, or clangd rename may limit some workflows.
Maintenance
Related MCP Connectors
Lean 4 MCP server: compile, prove theorems, and formalize math with Mathlib.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceAn MCP server that exposes Language Server Protocol features to external clients, allowing access to hover information, definitions, completions, references, and rename functionalities.8 npm42MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that provides semantic understanding of C++ codebases using libclang, allowing Claude to instantly find classes, functions, and their relationships without having to grep through thousands of files.33MIT
- AlicenseNot gradedqualityBmaintenanceA production-ready MCP server that enables AI assistants to intelligently understand, analyze, edit, navigate, and review software projects with multi-workspace support, Git integration, and semantic search.1MIT
- FlicenseNot gradedqualityCmaintenanceA single MCP server that bridges to any LSP, enabling code intelligence features like hover, go-to-definition, references, and diagnostics for multiple languages via configurable language servers.1-