unfour
Unfour's MCP server lets an agent inspect and operate a local Unfour workspace—API requests, SSH, databases, Flows, variables, connections, activity, and diagnostics—through the command bus with policy and confirmation safeguards.
Workspace/context: get the current or all workspaces, list connections, list/replace/create/update/delete workspace variables, read activity, and check system health.
API client: list collections, requests, environments, and request history; get redacted request/history detail; send saved or ad-hoc HTTP requests; create/update/delete requests and collections; manage environments and environment variables.
Database: list connections/tables/history; describe tables; run read-only SQL and EXPLAIN; execute guarded SQL; export tables; create/update/delete/test database connections.
SSH: list/create/update/delete/test connections; run diagnostics or policy-guarded commands; read/write/patch/list remote files; manage, duplicate, reorder, run, cancel, and delete SSH tasks; inspect task runs, logs, and command history.
Flow runbooks: list/get/save/delete Flows; run/cancel Flows; list/get run history and inspect step results.
Safety boundaries: operations are workspace-scoped, secrets are generally masked, and destructive/high-risk actions may require confirmation. MCP assists with runtime investigation but does not author troubleshooting playbooks or detect root causes.
Provides database integration for MySQL, allowing agents to list and describe tables, run read-only queries, execute EXPLAIN plans, and perform guarded writes against saved MySQL connections.
Provides database integration for PostgreSQL, allowing agents to list and describe tables, run read-only queries, execute EXPLAIN plans, and perform guarded writes against saved PostgreSQL connections.
Provides database integration for SQLite, allowing agents to list and describe tables, run read-only queries, and execute guarded writes against saved SQLite database files.
Unfour
A unified, local-first developer workspace for tracing backend failures from API requests through server logs and database state to verified fixes.
Unfour brings API testing, SSH, database tools, local Flow runbooks, and MCP-assisted troubleshooting into one desktop application.

Unfour v0.12.0 was released on 2026-10-23. Windows NSIS
installers are unsigned and may trigger SmartScreen or other operating-system
security warnings. UseSHA256SUMS.txt from the GitHub Release to verify
downloaded files.
See the v0.12.0 changelog, Release Notes, and final release verification.
The capabilities below describe v0.12.0 Standard stable, including Flow Definition Cloud Sync and reviewed SSH Task reruns. CI, RC builds and formal publication passed on the tagged source. Native install/update and detailed live-service/manual checks without evidence remain NOT VERIFIED. The original RC checklist preserves the user's general Flow Sync confirmation and the outstanding scenario matrix.
Download
Download the latest Unfour release from GitHub Releases.
Windows is the primary distribution path: NSIS
.exeinstaller. It is unsigned and may trigger SmartScreen.macOS has Apple Silicon and Intel packages; real-device install/run verification was recorded for v0.9.0. They are not Apple-signed or notarized; Gatekeeper may block them.
Linux publishes an x86_64 (x64) AppImage only. It is Experimental and currently targets Ubuntu 22.04+; Ubuntu 20.04 is not supported. v0.12.0 was built on Ubuntu 22.04; installed-artifact runtime verification remains
NOT VERIFIED..deband.rpmpackages are not formally supported or published.Verify downloaded installers with the release
SHA256SUMS.txtasset.
Related MCP server: Workspace MCP
What Is Unfour?
Unfour helps backend developers investigate failures that span an API, a server, and its database. Troubleshooting is Unfour's core product loop: reproduce an issue with an API request, inspect server logs over SSH, check database state, identify the cause, and make and verify a fix.
A unified, local-first workspace keeps requests, connections, local activity, and layout together throughout the investigation. API testing, SSH terminals, and database tools provide the capabilities for each step in that loop. Flow combines those capabilities into local runbooks for repeatable checks and tasks. Flow definitions are included in whole-Workspace import/export and the current Pro Cloud Sync client. Execution and run history stay on the device. Flow is a runbook for this workspace, not a general workflow platform.
MCP is an optional assisted layer: Codex and Cursor can use the local stdio MCP server to work with the same saved API, SSH, database, and Flow data as the desktop app. Its workspace-scoped tools run through the shared command bus, subject to MCP policy and high-risk action confirmation checks. MCP can save, run, cancel, and query Flows. It does not generate a troubleshooting playbook, correlate requests with logs and database state, or detect root causes. You author and start runbooks. Boundaries and confirmation are in the MCP overview.
Unfour is one application and one product. Its core desktop features are free and open source under Apache-2.0. An active Pro subscription unlocks Cloud Sync in the same application. Pro is an entitlement within Unfour, not a separate client, package, repository, or release.
The app is built with Tauri 2, React, TypeScript, and Rust. The frontend owns the workbench UI, while security-sensitive execution such as HTTP, SSH, database drivers, local storage, and credential references lives behind Rust capability crates and the command bus.
Troubleshooting Workflow
API error
↓
Inspect server logs over SSH
↓
Check related database state
↓
Identify the cause
↓
Repeat the request and verify the fixThe investigation stays in one workspace, while you remain in control of each request, SSH session, query, and verification step.
For Coding Agents
Codex or Cursor can use their own repository tools to inspect, change, and test code. Unfour complements those tools with controlled access to API behavior, SSH/server evidence, and database state through MCP, so the agent can help investigate the running backend and re-check it after a change.
Unfour does not edit the repository itself: the coding client owns code changes, while Unfour provides the runtime side of the investigation. You control the workspace, environment, risky actions, and final decision.
Modules
API Client - Compose and send HTTP requests, organize saved requests into collections and folders, resolve shared workspace variables, inspect response body/headers/cookies/timing, run saved pre-request and post-response scripts, review script tests and console output, keep redacted history, and import or export collections and environments.
SSH Terminal - Manage SSH connections and terminal sessions (split panes, search, clipboard context menu, persistent redacted command history and typing suggestions, host-key trust, redacted logs), browse and transfer remote files over SFTP, and automate multi-step SSH tasks (command, upload, download) from the Connections / Files / Tasks sidebar.
Database - Manage database connections, browse schemas, run SQL with confirmation-aware safety checks (including multi-statement Run All / Run Selected), preview and edit table rows, review query output, and export table structure as SQL and data as SQL, CSV, or JSON.
Flow - Compose saved API requests, SSH tasks, and Database queries into local runbooks with Condition branches and Wait Until checks. Author them on the Canvas and inspect step results and run history. Definitions travel with a whole-Workspace import or export and the current Pro Cloud Sync client. Only definitions sync; run history and actual runtime inputs/outputs remain local. Detailed manual acceptance is tracked separately. See Flow V1.
Workspace - Scope saved requests, shared environments/variables, connections, activity, tabs, and layout state to a local workspace, with title-bar active-environment switching. Export/import whole Workspace definitions, including Flow definitions, or create a password-encrypted local backup with optional saved credentials. Import previews create independent copies. See Workspace exchange and backups.
MCP integration for Codex and Cursor - Expose local stdio tools through the same command bus used by the desktop app. Codex and Cursor can use the same saved API, SSH, and database connections to reproduce issues, inspect logs and database state, and verify a fix. They can also save, run, cancel, and query local Flows under the same safety checks. MCP does not generate a troubleshooting playbook. See the MCP overview.
Encrypted backups are local files, separate from Pro Cloud Sync. A Workspace export includes Flow definitions and omits run history. The current client syncs Flow definitions with a 64 KiB payload limit, including input declarations and ordinary defaults, but excludes actual runtime inputs/outputs, history and credentials. Recognized sensitive/device-local material is rejected; arbitrary secrets in free text cannot be reliably detected. Keep secrets in runtime secret inputs or resource credential storage. Backups do not embed database or private-key files. Review free-form scripts and SQL before sharing or syncing.
Cloud Sync refreshes saved data in already-open modules and the workspace switcher after remote changes commit locally, while preserving drafts and execution state. SSH Tasks support reviewed reruns and previous-parameter recall, with shared English/Chinese feedback and retry for loading/refresh failures. Database MCP calls bind policy and execution to one workspace per call; guarded UPDATE/DELETE confirmation checks the parsed outer WHERE.
Screenshots
App overview — sidebar with module switcher and the API Client workspace

API Client — request builder with params, auth, headers, body, and response

SSH Terminal — connections, sessions, remote files, and tasks

Database — schema browsing and SQL query output

Local Development
Requirements:
Node.js and pnpm.
A stable Rust toolchain.
Tauri 2 prerequisites for your operating system.
Install and run:
pnpm install
pnpm tauri devpnpm install also installs Git hooks through lefthook. A commit formats staged
Rust files with cargo fmt and auto-fixes staged TypeScript with ESLint.
Skip once with LEFTHOOK=0 git commit.
Common commands:
pnpm tauri build # create local Stable-channel Tauri bundles
pnpm tauri build:test # create isolated Test-channel Tauri bundles
pnpm run build # build the desktop frontend only
pnpm run check # frontend build + Rust check + large-file check
pnpm run lint # ESLint
pnpm run test # frontend unit tests (Vitest)
pnpm run test:e2e # Playwright smoke tests
pnpm run check:rust # cargo check --workspace
pnpm run check:rust:ssh # cargo check with the ssh-native feature
pnpm run test:rust # cargo test --workspace
pnpm run test:release-env # release/channel contract unit testsRun commands from the repository root unless a package document says otherwise.
pnpm tauri dev defaults to the Test release channel, while local
pnpm tauri build defaults to Stable. Use pnpm tauri build:test for an
isolated Test-channel bundle. Set UNFOUR_STORAGE_PROFILE=dev when development
data should use ~/.unfour-dev; this storage override is independent from
release identity. Only CI should create formal publishable Stable artifacts,
with UNFOUR_RELEASE_CHANNEL=stable and an exact UNFOUR_BUILD_COMMIT.
Project Layout
Path | Role |
| Tauri/Vite desktop app entry and Tauri adapter layer. |
| Global shell composition and module mount slots. |
| API Client frontend module. |
| SSH Terminal frontend module. |
| Database frontend module. |
| Local Flow runbook editor, Canvas, and run history. |
| Shared frontend workspace state. |
| Workspace environments and variables management UI. |
| Local workspace lifecycle and whole-Workspace import/export UI. |
| Shared UI primitives and stateless layout helpers. |
| Typed Tauri command wrappers and frontend command types. |
| Rust backend capability crates and adapters. |
See docs/architecture/project-structure.md for the full package and crate
map.
Release Status
Unfour v0.12.0 was
published as a Standard stable release on 2026-10-23. CI, Standard Release
Candidate, Standard Release, published assets, checksums, and live updater/download
manifests are verified. Native platform, live-service, and manual regressions
without v0.12.0 evidence remain NOT VERIFIED. Earlier releases and v0.12.0
RC preparation records retain their historical scope.
Release verification evidence is documented in:
docs/testing/release-verification.mddocs/testing/manual-test-cases.mddocs/release/release-checklist.mddocs/release/distribution.mddocs/release/signing.md
Windows is the primary distribution path and ships an unsigned NSIS .exe
installer that may trigger SmartScreen. macOS has Apple Silicon and Intel
packages, with real-device verification recorded for v0.9.0, but they are not
Apple-signed or notarized and Gatekeeper may block them. Linux publishes an
x86_64 (x64) AppImage only,
remains Experimental, and uses Ubuntu 22.04+ as its current runtime/test baseline.
Ubuntu 20.04 is not supported; compatibility with other distributions is not
guaranteed solely by their glibc version. .deb and .rpm packages are not
formally supported or published. Use the release SHA256SUMS.txt to verify
downloaded artifacts, and do not claim a release check passes unless it was run
successfully for the target platform or is backed by current repository evidence.
The published v0.9.0 Linux AppImage built successfully but failed to launch on
Ubuntu 20.04 because it requires Ubuntu 24.04-era GLIBC/GLIBCXX symbols. The
v0.12.0 AppImage was built on Ubuntu 22.04; the immutable v0.9.0 download
remains unchanged. v0.12.0 Ubuntu 22.04/24.04 runtime regression remains
NOT VERIFIED until installed-artifact testing is recorded; see
release verification.
Earlier live and manual results, including checks that remain NOT VERIFIED,
are collected in release verification.
That record still leaves these v0.12.0 items NOT VERIFIED: native install and
update journeys, released-artifact Workspace/Auth/Database/MCP/Flow regressions,
Account/Cloud Sync and MCP production-policy journeys, Linux runtime, macOS and
Linux credential stores, and the manual MSIX/Store path. Publication does not
convert those items to PASS. Historical v0.9.0 platform results keep their
original scope.
Documentation
Read the document that owns the question. The README stays usable on its own; the links below are the detailed sources.
Question | Document |
How do I use the app? | |
What can MCP do, and what must be confirmed? | |
How do I connect Codex or Cursor? | |
What does a tool accept and return? | |
How do I build the MCP server? | |
What shipped, and what is only planned? | |
Which release checks passed? | |
How is the repository split? | |
How are secrets and local data stored? | |
How do Flow and Workspace exchange work? |
AGENTS.md and docs/agents/START_HERE.md are for coding agents working in
this repository. docs/release/release-checklist.md is the public release
checklist. docs/architecture/diagnostics.md covers local logs and diagnostic
bundles.
Contributing
Please read CONTRIBUTING.md, CODE_OF_CONDUCT.md, and the package boundary
rules in AGENTS.md before opening a pull request.
Security issues should be reported through SECURITY.md, not a public issue.
Support Unfour
If Unfour is useful to you, you can support its continued open-source development through GitHub Sponsors.
Sponsorship is optional and does not include Unfour Pro or paid cloud services.
Why Unfour?
The name “Unfour” is partly inspired by the Chinese idea of 四不像 — something that doesn’t quite fit into any single category.
Unfour isn’t just an API client, an SSH tool, a database client, or an agent workspace. It brings those usually separate capabilities together, so the name carries a bit of self-deprecating humor: it’s not quite any one of them, but has a little of each.
In traditional Chinese mythology, 四不像 is also associated with an auspicious mythical creature. That gave the name another meaning for me — a small hope that Unfour can grow into something a little unusual, but genuinely useful and built to last.
License
Licensed under the Apache License 2.0.
Available Tools
72 toolsunfour.activity.listList Workspace ActivityARead-onlyIdempotent
Lists recent workspace activity events (workspace, connection, API, database, and SSH changes) through the Unfour command bus, newest first. Sensitive fields in event details are masked. Useful for diagnosing what changed before a failure started.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of events to return (default 50, max 200). | |
| workspaceId | No | Optional workspace ID. Uses the active workspace if omitted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| source | Yes | |
| activity | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, plus has output schema. The description adds value by noting that sensitive fields are masked and that it uses the command bus, and the 'newest first' ordering. It does not contradict annotations; in fact, it reinforces them. Some behavioral aspects like pagination or default limit are covered by schema (default 50) but description adds masking which is beyond schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the main action and scope, then a practical use case. No filler or redundant phrases. Every sentence adds value.
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 rich output schema and full parameter coverage, the description is sufficient. It mentions masking (a key behavior) and the diagnostic use case. Missing explicit note about pagination or default limit, but schema covers that. The tool is read-only with annotations, so no need to disclose mutations. Slightly could mention that it doesn't filter by connection type, but not essential.
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 100% for both parameters (limit, workspaceId) with good descriptions including defaults and active workspace semantics. The description adds no additional parameter details beyond what the schema provides, so baseline 3 is appropriate. It doesn't need to compensate for gaps.
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 clearly states the tool lists recent workspace activity events, specifying the event types (workspace, connection, API, database, SSH) and the order (newest first). It distinguishes from siblings like unfour.connection.list or unfour.api.list_history by focusing on 'activity events' across all types via the command bus.
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 explains when to use it ('useful for diagnosing what changed before a failure started'), implying a diagnostic context. It does not explicitly name alternatives or when-not to use, but the purpose clarity and sibling list implicitly distinguish it. Lacks explicit exclusions but provides clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.api.create_collectionCreate API CollectionA
Creates an API collection in local Unfour metadata through the command bus. Dev/test allow it; prod blocks by workspace policy. Returns the new collection id and summary.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a non-read-only write, so no contradiction is present. The description adds useful behavioral context beyond the annotations: local metadata scope, command-bus execution, environment/production restrictions, and the returned id and summary.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no filler. The main action is front-loaded and each sentence adds useful information: what is created, where it is created, environment restrictions, and the return value.
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 fairly simple two-parameter create tool, the description captures the essential behavior, environment constraints, and return value. It is slightly incomplete on parameter guidance, but that is factored into the parameter semantics score.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain the name or workspaceId parameters at all. The property names are self-explanatory to some extent, but the description provides no added semantics over the input 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?
The description has a specific verb and resource: "Creates an API collection in local Unfour metadata." This clearly distinguishes it from sibling tools like update_collection, delete_collection, and list_collections.
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 clear environment-based usage context: dev/test environments allow it, while prod blocks by workspace policy. It does not explicitly name alternatives, but the create operation is obvious enough from the title and sibling set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.api.create_environmentCreate API EnvironmentA
Creates an empty API environment in local Unfour metadata through the command bus. Dev/test allow it; prod blocks by workspace policy.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal a non-read-only, non-idempotent write, so the description's added context is valuable: it creates an 'empty' environment in 'local' metadata through the command bus. It does not contradict annotations and adds behavior beyond the structured hints, though it omits error or conflict 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 front-loaded sentences that state the verb and resource immediately. No filler or redundant restatement of the tool name; each clause adds useful 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?
Given a simple two-parameter create tool and an output schema, the description covers the action and policy context. However, the lack of parameter clarification and the absence of any guidance on how this environment relates to other API entities leaves notable gaps, especially with 0% schema coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, but it does not explain 'name' or 'workspaceId' at all. No meaning is added beyond the raw schema property names, leaving the agent to guess what workspaceId refers to or what naming constraints exist.
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?
Description uses a specific verb ('creates') with a clear resource ('empty API environment') and scope ('local Unfour metadata'). It distinguishes from sibling tools like update_environment, delete_environment, and list_environments by indicating a create operation with an initial empty state.
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 a clear usage context: dev/test environments allow creation, while prod blocks it by workspace policy. This provides an explicit when-not condition, though it does not name alternative tools such as update_environment for existing environments.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.api.create_requestCreate API RequestA
Creates a saved API request record in the workspace through the Unfour command bus. This mutates local Unfour metadata only; it does not send traffic. Dev/test allow it by default, while prod blocks by workspace policy. Returns the new request id and a redacted summary.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| auth | No | ||
| body | No | ||
| name | Yes | ||
| query | No | ||
| method | Yes | ||
| headers | No | ||
| authJson | No | ||
| bodyKind | No | ||
| parentId | No | ||
| workspaceId | No | ||
| collectionId | No | ||
| parentFolderId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations are limited to safety flags, but the description adds rich behavioral detail: it 'mutates local Unfour metadata only,' avoids sending traffic, explains production policy differences, and notes the return includes a new request ID and redacted summary. This significantly improves the agent's ability to predict side effects.
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 three short sentences, front-loaded with the core operation, and every sentence adds useful behavioral or contextual information. There is no filler or redundant repetition of the tool name.
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 description effectively covers tool behavior, environment constraints, and result shape, and the output schema may fill in return details. However, with 13 input parameters and no input schema descriptions, the record/model for required fields (name, method, url) and optional override (auth, body, headers, collection fields) still remains too vague for a complete understanding.
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%, yet the description gives no input guidance for the 13 parameters. Fields like auth vs authJson, body vs bodyKind, and parentId/collectionId/parentFolderId remain completely unexplained; the description must compensate but does not.
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 clearly states the tool 'Creates a saved API request record in the workspace' and distinguishes it from a live request by explicitly confirming 'it does not send traffic.' This separates it from sibling tools like send_request and update_request.
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 clear context for when the tool is usable ('Dev/test allow it by default') and when not ('prod blocks by workspace policy'). It also gives an implicit when-not by saying it does not send traffic, though it does not name an alternative tool explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.api.delete_collectionDelete API CollectionADestructive
Soft-deletes an API collection and cascades soft-deletion to its folders and requests through the command bus. Dev/test require a content-bound confirmation_text; prod blocks by policy.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | ||
| workspaceId | No | ||
| collectionId | Yes | ||
| confirmationText | No | ||
| confirmation_text | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations already signaling destructiveness (destructiveHint: true, readOnlyHint: false), the description goes beyond by disclosing what gets destroyed (cascading soft-deletion to folders and requests), distinguishing soft vs hard delete semantics, and revealing environment-dependent auth requirements (confirmation_text needed, prod policy block). This matches the 'what gets destroyed' and 'auth needs' categories for added context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero fluff. The first sentence front-loads the core action and effect, the second delivers the environment/confirmation requirement. Every phrase earns its place, and the density is appropriate for the destructive nature of the operation.
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 destructive operation with 5 parameters, the description efficiently covers the cascade scope, the soft-delete behavior, and environment rules. The presence of an output schema means return values don't need explanation. Minor gaps remain: the confirmationText/confirmation_text distinction isn't fully specified, and the 'content-bound' keyword format is left vague, but the key safety-relevant details are present.
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 carries the full burden for parameter meaning. It mentions 'confirmation_text' and its requirement in dev/test, which directly helps resolve the potentially confusing confirmationText vs confirmation_text distinction. However, it never explains 'confirm', 'workspaceId', or 'collectionId' (though collectionId is self-evident and required). The description partially compensates but leaves the two similar confirmation parameters ambiguous beyond a passing mention.
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 uses a specific verb-action pair ('Soft-deletes an API collection') with resource scope ('cascades soft-deletion to its folders and requests'). It distinguishes itself from siblings like delete_request (different target resource) by clarifying the cascade behavior, which is unique to this tool among the siblings. The 'through the command bus' detail adds architectural precision.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear environmental context: 'Dev/test require a content-bound confirmation_text; prod blocks by policy.' This tells the agent when the tool can be used (dev/test with confirmation) versus when it cannot (prod), which is crucial for a destructive tool. However, it doesn't explicitly name alternatives or exclusions versus sibling tools, though the namespace and cascade detail imply when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.api.delete_environmentDelete API EnvironmentADestructive
Soft-deletes an API environment through the command bus. Guarded policy requires a content-bound confirmation_text; read-only policy blocks deletion.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | ||
| workspaceId | No | ||
| environmentId | Yes | ||
| confirmationText | No | ||
| confirmation_text | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false. The description goes beyond this by adding that the deletion is a 'soft-delete', that a content-bound confirmation_text is required, and that read-only policies block the action. These are meaningful behavioral details not present in the annotations, though it doesn't discuss reversibility or side effects.
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 long, immediately states the primary action, and includes policy caveats without fluff. Every word adds value, and the structure front-loads the most important 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?
For a destructive operation with 5 parameters, the description covers the core delete behavior and key policy constraints but omits any mention of return values (output schema exists), the purpose of the 'confirm' flag, or what happens to associated resources. It is adequate but leaves notable gaps for an operation of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the description only hints at 'confirmation_text' without explaining the relationship between the two similar parameters 'confirmationText' and 'confirmation_text', nor the roles of 'confirm' or 'workspaceId'. The description adds minimal semantic value beyond the schema for parameter understanding.
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 'Soft-deletes an API environment through the command bus,' clearly identifying the verb (delete), resource (API environment), and mechanism (soft-delete, command bus). It distinguishes itself from sibling delete tools by naming the specific resource type and it is not tautological.
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 useful usage context by mentioning the requirement for 'content-bound confirmation_text' and that 'read-only policy blocks deletion.' While it doesn't explicitly name alternative tools or say 'when not to use', the policy conditions offer clear guidance for when deletion is allowed, which is effectively usage direction for a guarded operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.api.delete_environment_variableDelete API Environment VariableADestructive
Deletes one API environment variable by environmentId and key through the command bus. Guarded policy requires confirmation; read-only policy blocks deletion.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| confirm | No | ||
| workspaceId | No | ||
| environmentId | Yes | ||
| confirmationText | No | ||
| confirmation_text | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| key | Yes | |
| source | Yes | |
| deleted | Yes | |
| environmentId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and readOnlyHint=false, and the description adds extra behavioral context: 'Guarded policy requires confirmation; read-only policy blocks deletion.' This explains permission-related behavior beyond what annotations provide, though it does not detail what happens to dependent data or partial failures.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no redundancy. The core action and identifiers are front-loaded, followed by a brief policy note. 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?
While the description is accurate and concise, it leaves several parameters unexplained (confirm, confirmationText, confirmation_text, workspaceId) and does not describe the output or any side effects. Given the tool's complexity and the absence of schema descriptions, more detail is needed for an agent to invoke it correctly.
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 only explains environmentId and key, but the schema also has confirm, confirmationText, confirmation_text, and workspaceId with no descriptions. The mention of 'requires confirmation' hints at these fields but does not clarify which one to use or their semantics. This is insufficient for a 6-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?
Description begins with a specific verb 'Deletes', names the exact resource 'API environment variable', and identifies the two key identifiers (environmentId and key). It clearly distinguishes this deletion operation from related sibling tools like delete_environment or delete_request.
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 explicit when-to-use or alternative guidance is provided. The purpose is implied through the verb, but there is no mention of when to choose this over similar operations or any prerequisites. The policy statement hints at conditions but does not directly guide usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.api.delete_requestDelete API RequestADestructive
Soft-deletes a saved API request through the Unfour command bus. Dev/test require a content-bound confirmation_text before deletion; prod blocks by policy. Returns the remaining request count and confirms softDelete=true.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | ||
| requestId | Yes | ||
| workspaceId | No | ||
| confirmationText | No | ||
| confirmation_text | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though destructiveHint=true is already in the annotations, the description goes further by explaining that this is only a soft-delete, that confirmation_text is required in dev/test, that prod blocks the action, and that the response will indicate the remaining request count and softDelete=true. This gives the agent important behavioral context beyond the annotation flags.
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 only two sentences and packs in the key environmental constraints, behavioral nuance, and return-value information. There is no filler aside from the brief 'through the Unfour command bus' phrase, which does not meaningfully hurt clarity.
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 description explains the operation's outcome and environment-specific guardrails well, and there is an output schema. However, with 5 parameters and no schema-level descriptions, the omission of confirm and workspaceId makes it incomplete for reliable invocation without additional tooling or user clarification.
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 had to carry the parameter semantics load, but it only clarifies confirmation_text. It does not explain the role of confirm, workspaceId, or the dual confirmationText/confirmation_text fields, leaving meaningful ambiguity about what values should be supplied.
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 begins with 'Soft-deletes a saved API request,' clearly identifying the action and the resource. It also distinguishes this from hard deletion and ties the behavior to the Unfour command bus, which differentiates the tool from sibling delete tools like delete_collection.
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 clear context on when this tool is usable: dev/test require a confirmation_text, while prod blocks deletion by policy. It does not explicitly mention alternative tools, but for a delete-specific operation the environmental conditions are the key guidance and they are stated clearly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.api.get_historyGet API Request History DetailARead-onlyIdempotent
Returns a sanitized API history snapshot through the Unfour command bus. Sensitive headers, query parameters, and body fields are masked. This is not a replayable template: original Auth, scripts and variable references are unavailable. To rerun a template, use its saved requestId with the intended environmentId; never resend mask placeholders.
| Name | Required | Description | Default |
|---|---|---|---|
| historyId | Yes | The API history entry ID. | |
| workspaceId | No | Optional workspace ID. Uses the active workspace if omitted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| source | Yes | |
| history | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent/non-destructive annotations by disclosing that headers, query params, and body fields are masked, and that original Auth, scripts, and variable references are unavailable. The warning never to resend mask placeholders is exactly the kind of behavioral caveat an agent needs.
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: purpose, masking behavior, and replay guidance, with the critical constraint front-loaded. No redundant restatement of the name or title.
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 shape needn't be described; the description covers the two things an agent must know (data is masked, not replayable). Nothing material for correct invocation 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?
Schema description coverage is 100%, so both historyId and workspaceId are already documented in the schema; the description adds no syntax or default detail for them. Mentioning requestId and environmentId risks slight confusion since those are not parameters of this tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Returns') and resource ('sanitized API history snapshot') tied to the historyId-driven detail lookup. It implicitly contrasts with the sibling list_history by returning a snapshot rather than a listing, though it never names that 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?
Explicitly rules out the tempting misuse ('This is not a replayable template') and names the correct alternative path: rerun via the saved requestId plus the intended environmentId. It does not say how to obtain a historyId (e.g., via list_history), which keeps it short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.api.get_requestGet API Request DetailARead-onlyIdempotent
Returns a saved API request with sensitive headers, query parameters, body fields, and URL parameters redacted through the Unfour command bus.
| Name | Required | Description | Default |
|---|---|---|---|
| requestId | Yes | The saved API request ID. | |
| includeBody | No | Whether to include the request body preview. Defaults to true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| source | Yes | |
| request | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is clear. The description adds value by disclosing that sensitive data is redacted, which is a behavioral trait not covered by annotations. It also mentions the command bus, but that's minor. No contradiction.
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 a single sentence that is concise and front-loaded with the main purpose. No wasted words, and it includes the key detail about redaction.
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 tool has an output schema and annotations, the description is fairly complete. It covers the main purpose and the redaction behavior. It could mention the includeBody parameter's effect, but the schema already describes that. Overall, it's sufficient for a read-only retrieval 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 100%, so both parameters are documented in the schema. The description adds no additional parameter semantics beyond what the schema provides, so baseline 3 is appropriate.
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 clearly states the tool returns a saved API request with redaction of sensitive fields, which is specific and distinguishes it from sibling tools like list_requests or send_request. However, it doesn't explicitly mention the 'get' action or the resource type beyond 'API request', but the title and name make that clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving a saved request, but it doesn't explicitly state when to use this vs alternatives like list_requests or get_history. It doesn't mention any prerequisites or exclusions, so it's adequate but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.api.list_collectionsList API CollectionsARead-onlyIdempotent
Lists API request collections for the active workspace through the Unfour command bus.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional workspace ID. Uses the active workspace if omitted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| source | Yes | |
| collections | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe read-only, idempotent, non-destructive profile. The description adds the active-workspace scoping and command-bus context, but offers no additional behavioral details such as ordering, pagination, or workspace membership semantics.
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 one focused sentence, front-loads the verb and resource, and contains no filler or redundant detail. It is appropriately sized for such a simple list operation.
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 low complexity, full schema coverage, safe-reader annotations, and presence of an output schema, the description provides enough context for an agent to select and invoke the tool effectively. No major missing information stands out.
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 100% because workspaceId has an embedded explanation and is optional. The description adds little beyond what the schema already says, relying on the schema to carry parameter meaning.
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 uses a specific verb ('Lists') and identifies the resource ('API request collections') plus its scope ('for the active workspace'). This distinguishes it clearly from sibling tools like list_requests or workspace.list.
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 active-workspace scoping implies when the tool is useful, and the workspaceId parameter is covered in the schema. However, it does not provide explicit guidance about when to choose this over related tools such as api.list_requests or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.api.list_environmentsList API EnvironmentsARead-onlyIdempotent
Lists API environments and their variables for the active workspace through the Unfour command bus. Sensitive variable values are masked; non-sensitive values (e.g. base URLs) are shown so requests using variables can be understood.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional workspace ID. Uses the active workspace if omitted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| source | Yes | |
| environments | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the masking behavior for sensitive variable values and confirms non-sensitive values like base URLs are shown, which is critical context beyond the annotations. This complements the readOnlyHint:true and destructiveHint:false annotations by explaining the safe, read-only nature of the tool and its variable-inspection semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero fluff. The first sentence establishes purpose and scope while acknowledging the umbrella architecture, and the second adds critical security/behavioral context in a compact way. 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 read-only tool with 1 optional parameter and strong annotations, the description covers the essentials: what it does, what it returns (including masking behavior), and scope. It doesn't need to over-explain return structure since output schema exists, and the brief did not require listing sibling alternatives explicitly.
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 100% (single optional workspaceId), and the description adds behavioral nuance by clarifying the parameter controls workspace selection — though it doesn't explicitly call out the fallback behavior like 'active workspace' — which is a minor gap. The description explains the parameter's masking behavior via the tool's response semantics, adding value beyond the 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?
The description uses a specific verb ('Lists') with a clear resource ('API environments and their variables') and scope ('active workspace'). It implicitly distinguishes itself from sibling tools like unfour.workspace.list_variables (workspace variables) and unfour.api.list_collections (collections), though it does not explicitly name them.
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 clearly implies read-only usage by stating it 'lists' environments and variables, and explains the masking behavior without explicitly stating when not to use it or naming alternatives like list_variables. The context of 'requests using variables can be understood' gives clear signals for API request/realm use cases, only stopping short of explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.api.list_historyList API Request HistoryARead-onlyIdempotent
Lists recent API request/response history for the active workspace through the Unfour command bus. Sensitive URL parameters are masked. Useful for diagnosing when a request started failing.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of history entries to return (default 50, max 200). | |
| workspaceId | No | Optional workspace ID. Uses the active workspace if omitted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| source | Yes | |
| history | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is clear. The description adds valuable context: it mentions that sensitive URL parameters are masked, which is a behavioral trait not covered by annotations. It also notes the scope ('active workspace') and the command bus mechanism, which adds transparency.
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, front-loaded with the core purpose, and includes a practical use case. Every sentence earns its place: the first states what it does, the second adds a security-relevant detail and a usage hint. No fluff.
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 tool's simplicity (2 optional params, no nested objects, output schema exists), the description is fairly complete. It covers purpose, scope, security masking, and a use case. It could mention pagination or the output format, but the output schema likely covers that. The description is adequate for an agent to select and invoke correctly.
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 100%, so both parameters (limit and workspaceId) are already well-documented in the schema. The description adds minimal extra meaning: it mentions 'active workspace' which aligns with workspaceId, and 'recent' which implies a default limit. But it doesn't add syntax or format details beyond the schema, so baseline 3 is appropriate.
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 clearly states the tool lists recent API request/response history for the active workspace, with a specific verb ('lists') and resource ('API request/response history'). It distinguishes from siblings like unfour.api.get_history (which likely retrieves a single history entry) and unfour.ssh.list_history (which is for SSH, not API).
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 a clear use case: 'Useful for diagnosing when a request started failing.' It implies when to use (when debugging API request failures) but does not explicitly mention when not to use or alternatives. However, the sibling context and the tool's name make it clear this is for API history, not SSH history.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.api.list_requestsList API RequestsARead-onlyIdempotent
Lists saved API requests for the active workspace through the Unfour command bus. Sensitive URL parameters are redacted.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional workspace ID. Uses the active workspace if omitted. | |
| collectionId | No | Optional collection ID filter. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| source | Yes | |
| requests | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is clear. The description adds value by noting that sensitive URL parameters are redacted, which is a behavioral trait not covered by annotations. It also mentions the 'command bus' mechanism, adding context. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with zero waste. It front-loads the core purpose and adds one key behavioral note (redaction). 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?
Given the tool's simplicity (2 optional params, no required fields, output schema present), the description is complete enough. It covers purpose, scope, and a key behavioral detail. The output schema handles return value documentation. The only minor gap is not explicitly stating the default behavior of workspaceId, but the schema already covers that.
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 100%, so both parameters (workspaceId and collectionId) are already documented in the schema. The description adds minimal extra meaning beyond the schema, only implying that workspaceId defaults to the active workspace. This meets the baseline of 3 for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists saved API requests for the active workspace, with a specific verb ('lists') and resource ('saved API requests'). It distinguishes from siblings like unfour.api.get_request (single request) and unfour.api.list_collections (collections) by focusing on requests and mentioning the command bus 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?
The description implies usage for listing requests in the active workspace, with optional filters for workspace and collection. It doesn't explicitly state when not to use it or name alternatives, but the context of 'active workspace' and optional filters provides clear usage context. Sibling tools like unfour.api.get_request suggest alternatives for single-request retrieval, but this isn't stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.api.send_requestSend API RequestA
Sends either a saved API request by requestId or one ad-hoc request described by method/url/headers/query/body through the Unfour command bus. Use it to reproduce API failures during agent troubleshooting. Dev allows all HTTP methods; test allows sends but marks mutating methods as write risk; prod only allows GET/HEAD/OPTIONS. Non-2xx HTTP responses return structured status/body data rather than MCP tool failure. Sensitive headers, cookies, URL tokens, and JSON body fields are masked.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | URL for ad-hoc sends. | |
| body | No | Optional request body for ad-hoc sends. | |
| name | No | Optional display name for ad-hoc request history. | |
| query | No | Optional query parameters as an object or array of {key,value,enabled}. | |
| method | No | HTTP method for ad-hoc sends, such as GET, POST, PUT, PATCH, DELETE. | |
| headers | No | Optional headers as an object or array of {key,value,enabled}. Sensitive values are redacted in results. | |
| bodyKind | No | Optional body kind for ad-hoc sends (json, text, form, xml). Defaults to json. | |
| requestId | No | Optional saved API request ID to replay. Omit when sending method/url directly. | |
| timeoutMs | No | Optional timeout in milliseconds. Omitted or null defaults to 60000ms. 0 disables the HTTP timeout; positive values are passed through to the HTTP layer. All MCP calls remain subject to the independent 120-second MCP safety deadline. | |
| workspaceId | No | Optional workspace ID for ad-hoc requests. Uses the active workspace if omitted. | |
| environmentId | No | Optional per-call environment override. It is used for variable resolution and saved request scripts without changing the workspace active environment. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| error | No | |
| source | Yes | |
| status | No | |
| headers | No | |
| bodyType | No | |
| warnings | No | |
| sizeBytes | No | |
| truncated | No | |
| durationMs | No | |
| statusText | No | |
| bodyPreview | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses that non-2xx responses return structured status/body data instead of a tool failure, that responses mask sensitive headers/cookies/URL tokens/body fields, and that prod restricts methods. These are exactly the behavioral traits an agent needs before invoking an open-world, non-read-only send.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the two send modes in the first sentence, then stacks usage, environment rules, error semantics, and masking with no filler. Dense but purposeful; every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter open-world tool with an output schema, the description covers purpose, environment constraints, error behavior, and masking, which is most of what an agent needs. Remaining details like timeout and workspace/environment overrides are handled in the schema, so completeness is high but not exhaustive.
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 100%, so the baseline is 3; the description adds value by explaining the either/or relationship between requestId replay and method/url ad-hoc sends, which the flat schema does not convey. It stops short of explaining timeoutMs, workspaceId, or environmentId nuances, but the schema already documents those.
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 (sends) and resource, and disambiguates the two invocation modes: replay by requestId vs ad-hoc by method/url/headers/query/body. This is clearly distinguishable from sibling read tools like unfour.api.get_request and unfour.api.list_requests.
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?
Names a concrete use case ('reproduce API failures during agent troubleshooting') and lays out environment gating: dev allows all methods, test flags mutating methods as write risk, prod restricts to GET/HEAD/OPTIONS. That is strong when-to-use context, though it does not name a competing sibling tool as an explicit alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.api.set_environment_variableSet API Environment VariableA
Creates or updates one API environment variable by environmentId and key through the command bus. Empty values are allowed. Omitted isSecret/description preserve existing metadata, and returned secrets are masked.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| value | Yes | ||
| enabled | No | ||
| isSecret | No | ||
| description | No | ||
| workspaceId | No | ||
| environmentId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| source | Yes | |
| created | Yes | |
| variable | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false (not read-only) and idempotentHint=false. The description adds meaningful behavioral details beyond these: 'Empty values are allowed,' 'Omitted isSecret/description preserve existing metadata,' and 'returned secrets are masked.' These are not derivable from the schema or annotations and help the agent understand edge-case semantics.
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 concise sentences, front-loaded with the core action. Each sentence adds distinct value: the action, the empty-value edge case, and the preservation/masking behavior. No fluff or repetition.
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 7-parameter tool with an output schema, the description covers the most critical contextual aspects: create-or-update behavior, empty values, metadata preservation, and secret masking. Missing details like the role of 'enabled' and 'workspaceId' are minor, and the presence of an output schema reduces the need to describe return values. Overall, sufficient for an agent to call the tool correctly in most scenarios.
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 explicitly names environmentId and key as locators, implies value via 'Empty values are allowed,' and explains behavior for isSecret/description when omitted. However, it does not address the 'enabled' or 'workspaceId' parameters, leaving some parameter semantics undocumented. It partially compensates but is not exhaustive.
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 opens with a specific verb phrase, 'Creates or updates,' and names the exact resource, 'one API environment variable,' with the identifying keys (environmentId and key). This clearly distinguishes the tool from siblings like workspace.create_variable or api.update_environment, and the title reinforces the purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by stating what the tool does, but it does not explicitly state when to use this tool versus alternatives such as workspace.create_variable or api.update_environment. There is no mention of exclusions or conditions that would route an agent to a different tool. The naming and context make the use case inferable, but the description itself offers no explicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.api.update_collectionUpdate API CollectionA
Renames an API collection in local Unfour metadata through the command bus. Dev/test allow it; prod blocks by workspace policy.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| workspaceId | No | ||
| collectionId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (not read-only, not idempotent, not destructive), the description adds that the update goes through a command bus and has environment restrictions. However, it does not elaborate on side effects, reversibility, or permission requirements, providing only moderate additional transparency.
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 concise (two sentences) and well-structured, conveying the essential information without unnecessary detail or repetition.
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 rename operation, the description covers the action, the fact it modifies local metadata, and environment constraints. Since an output schema is present, return value details are not needed. It could mention that only the name field is updated, but that is implied by 'renames'. Overall, it is sufficiently complete for the tool's complexity.
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 description implies that 'name' is the new collection name and 'collectionId' identifies the target collection, but it does not explicitly define each parameter. The workspaceId is mentioned only in the context of environment blocking, giving some insight but not a full explanation. The schema lacks descriptions, so the tool description partially compensates but could be more explicit.
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 clearly states that the tool renames an API collection, which is a specific and unambiguous action. It also mentions the local metadata aspect and command bus, making the purpose distinct and easy to understand.
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 usage context by noting that the operation is allowed in dev/test environments but blocked in production, and it operates on a specific workspace. This helps users decide when to invoke it, though it does not explicitly compare with alternative tools like update_request or create_collection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.api.update_environmentUpdate API EnvironmentA
Updates an API environment name and variables through the command bus. Sensitive variable values are masked in the result. Dev/test allow it; prod blocks by workspace policy.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| variables | Yes | ||
| workspaceId | No | ||
| environmentId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds genuinely useful behavioral context beyond the annotations (readOnlyHint: false, destructiveHint: false) by disclosing that sensitive variable values are masked in the result and that production is blocked by workspace policy. These additions help an agent reason about mutation side effects and output handling. No contradiction with annotations — 'Updates' is consistent with readOnlyHint: false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, purposeful sentences: purpose, security/masking behavior, and policy constraint. Zero wasted words; each sentence earns its place and is front-loaded.
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 there is an output schema (reducing the need to document return values) and given the tool's moderate complexity, the description covers the most important operational nuances (masking, prod block). However, it leaves the key update-semantics question unanswered — whether passing a partial variables array replaces or merges existing variables — which is critical for a mutation tool like this. The 'through the command bus' detail adds minimal value.
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 schema description coverage at 0%, the description must compensate, and it partially does by naming 'name and variables' and adding the masking nuance relevant to variable values. However, it doesn't clarify the semantics of the `enabled` field on each variable, how `workspaceId` resolves, or whether the variables array is a full replace or a merge — a critical distinction for an update 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?
'Updates an API environment name and variables' uses a specific verb, specific resource, and names the exact fields being modified. It clearly differentiates from sibling tools like create_environment, delete_environment, and list_environments by stating the scope of the update. The naming of specific fields (name, variables) removes ambiguity about what the update covers.
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?
'Dev/test allow it; prod blocks by workspace policy' provides explicit context on which environments support this operation, preventing wasted calls in production. However, it doesn't explicitly name alternatives or say 'use create_environment to create, this to update' — the sibling contrast is implicit rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.api.update_requestUpdate API RequestA
Updates a saved API request record through the Unfour command bus. Omitted fields keep their existing values. This mutates local metadata only; dev/test allow it, prod blocks or requires future explicit policy. Returns the updated redacted request summary.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| auth | No | ||
| body | No | ||
| name | No | ||
| query | No | ||
| method | No | ||
| headers | No | ||
| authJson | No | ||
| bodyKind | No | ||
| parentId | No | ||
| requestId | Yes | ||
| workspaceId | No | ||
| collectionId | No | ||
| parentFolderId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant behavioral context beyond the annotations: it states the update is partial (omitted fields keep values), confined to local metadata, subject to environment policies, and that the return is a redacted summary. These details are not present in annotations and help set expectations around side effects and limitations. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences that front-load the core action and immediately follow with key behavioral notes. Every sentence delivers new information without fluff, making it highly efficient.
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 is moderately complex (14 params) and lacks schema-level descriptions, so the description carries a heavy burden. It provides some completeness through partial-update semantics and return format, but misses field-level clarifications and any mention of error conditions or required authentication. Given the output schema exists, it partially compensates, but the description still leaves 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?
With 0% schema description coverage, the description must explain parameter meanings, but it only offers the generic behavior that omitted fields retain prior values. It does not describe what each of the 14 parameters (url, auth, body, method, etc.) represents or how they interplay. This is inadequate for an agent to correctly use the tool, leaving significant 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 clearly states the action ('Updates a saved API request record') and names the resource type (API request) via the command bus. It distinguishes itself from sibling tools like create_request and delete_request by using 'update' and referencing existing records. The mention of partial updates via omitted fields further clarifies its purpose.
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 context for when to use the tool by noting it updates saved requests and explicitly states environment constraints ('dev/test allow it, prod blocks or requires future explicit policy'). However, it does not explicitly compare with alternatives like create_request or delete_request, nor does it state when to avoid using it, such as for new records.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.connection.listList Unfour ConnectionsARead-onlyIdempotent
Lists safe connection summaries for the active workspace through the Unfour command bus.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Optional connection type filter. | all |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| source | Yes | |
| connections | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive behavior, so the bar is lower. The description adds useful context with 'safe summaries' and 'active workspace', giving agent signals about output scope and safety beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one short, focused sentence. It front-loads the core action and adds scope and result-nature information without unnecessary words 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?
For a simple tool with one optional parameter, a strong annotation profile, and an output schema, the description is reasonably complete. It could be more explicit about which connection types are covered and how this tool relates to db/ssh-specific connection listings, but nothing critical 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 single parameter is fully described in the input schema with an enum, default value, and clear description. Since schema description coverage is 100%, the description does not need to repeat parameter details; baseline 3 is appropriate.
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 clearly identifies an action and scope: listing connection summaries scoped to the active workspace. It uses a concrete verb and noun phrasing, but it does not explicitly distinguish this generic connection listing from sibling tools such as unfour.db.list_connections or unfour.ssh.list_connections.
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 no explicit guidance about when to use this tool versus alternatives such as db.list_connections or ssh.list_connections. It also does not mention whether the optional type filter changes which sibling tool would be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.db.create_connectionCreate Database ConnectionA
Creates a saved database connection through the Unfour command bus. Optional password input is stored in the OS credential store and only a credential reference is persisted; the tool never returns the password or credential reference.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | ||
| name | Yes | ||
| port | No | ||
| driver | Yes | ||
| sslMode | No | ||
| database | No | ||
| password | No | ||
| readOnly | No | ||
| username | No | ||
| sqlitePath | No | ||
| workspaceId | No | ||
| credentialRef | No | ||
| credentialLabel | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses important side effects: password storage in the OS credential store, persistence of only a reference, and never returning the credential. This adds valuable transparency not covered by the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, consisting of two clear sentences. It efficiently conveys the core action and important security details without unnecessary verbosity.
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 large set of sibling tools, the description lacks sufficient context for when to use this specific tool. It does not mention any prerequisites, edge cases, or the expected outcome/return, and it does not clarify the role of many parameters. This leaves the agent with incomplete information for decision-making.
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 schema lists 13 parameters with no descriptions, and the description only mentions 'optional password input'. It fails to explain the meaning or purpose of host, port, sslMode, database, username, sqlitePath, workspaceId, credentialRef, or credentialLabel, leaving the agent without essential context for correct usage.
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 clearly states the tool's purpose: creating a saved database connection. It also distinguishes it from sibling tools like listing or testing connections, leaving no ambiguity about its function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is used when creating a new connection, but it does not explicitly mention when to prefer this over alternatives such as test_connection or list_connections. The guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.db.delete_connectionDelete Database ConnectionADestructive
Soft-deletes a saved connection through CommandBus. Guarded policy requires confirmation bound to workspace, connection and revision; read-only policy rejects deletion.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | ||
| workspaceId | No | ||
| connectionId | Yes | ||
| confirmation_text | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| source | Yes | |
| deleted | Yes | |
| workspaceId | Yes | |
| connectionId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as destructive and non-read-only, but the description adds important behavior beyond them: the deletion is a soft delete, it goes through CommandBus, and a guarded confirmation policy applies. This meaningfully clarifies what the tool actually does.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The primary purpose is front-loaded, and the policy constraint is stated efficiently in the second sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value details are not required, and annotations cover the destructive safety profile. However, for a policy-guarded delete, the agent still needs to know how to satisfy the confirmation requirement; the description mentions confirmation but does not map it to confirm/confirmation_text, and 'revision' is referenced without a corresponding parameter.
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 for the parameters, but it does not explain confirm vs confirmation_text or state that connectionId is required. It hints at workspace and connection binding, but the two confirmation-related parameters remain ambiguous.
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 action (soft-delete) on a specific resource (a saved connection) and is consistent with the title 'Delete Database Connection.' The verb and resource make it distinct from sibling operations like update_connection or create_connection.
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 clear policy context: confirmation is required, it must be bound to workspace/connection/revision, and read-only policy rejects deletion. This tells the agent when deletion will be permitted, though it does not explicitly name alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.db.describe_tableDescribe Database TableARead-onlyIdempotent
Describes a table's columns, available indexes, foreign keys and DDL, with runtime metadata capabilities, through the Unfour command bus. Does not read table data.
| Name | Required | Description | Default |
|---|---|---|---|
| schema | No | Optional schema name filter (e.g. 'public'). | |
| catalog | No | Optional database catalog. | |
| tableName | Yes | Required table name to describe. | |
| workspaceId | No | Optional workspace ID. Uses the active workspace if omitted. | |
| connectionId | Yes | Required saved database connection ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| table | Yes | |
| source | Yes | |
| connectionId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the useful boundary that it is metadata-only, but 'with runtime metadata capabilities, through the Unfour command bus' is vague rather than informative, and no auth or latency behavior is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with the scope and the exclusion front-loaded, which is efficient. The phrase 'with runtime metadata capabilities, through the Unfour command bus' is filler that does not carry actionable meaning and slightly dilutes the otherwise tight structure.
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, a fully documented parameter schema, and read-only annotations, the description needn't explain return values or safety. It states the resource and the metadata-vs-data boundary, which is sufficient for correct invocation, though it stops short of describing any return-shape nuance.
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 100%, so all five parameters (including optional schema, catalog, and workspaceId) are already documented in the schema. The description adds no additional parameter meaning, making the baseline 3 appropriate.
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 names a specific verb and resource ('Describes a table') and enumerates the returned artifacts (columns, indexes, foreign keys, DDL), which lets an agent distinguish it from siblings like db.list_tables, db.query_readonly, and db.export_table. The closing clause 'Does not read table data' draws an explicit boundary against the data-reading 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?
The negative constraint 'Does not read table data' functions as an implicit when-not, steering the agent away from this tool for data retrieval. However, no alternative is named and there is no positive statement of when to prefer this over db.list_tables or db.query_readonly, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.db.executeExecute Database SQLB
Executes one SQL statement against a saved database connection through the Unfour command bus. Use for INSERT/UPDATE/DELETE/DDL when an agent needs to repair dev/test data. Dev allows non-high-risk writes by default; test allows small writes but high-risk SQL requires confirm; prod blocks writes. DELETE/UPDATE without WHERE, DROP, TRUNCATE, ALTER, and multi-row destructive statements require a second call with the returned confirmation_text. Returns affectedRows, statementType, durationMs, and engine safety metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | ||
| limit | No | ||
| dryRun | No | ||
| schema | No | ||
| catalog | No | ||
| confirm | No | ||
| timeoutMs | No | ||
| transaction | No | ||
| workspaceId | No | ||
| connectionId | Yes | ||
| confirmationText | No | ||
| confirmation_text | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| rows | No | |
| dryRun | Yes | |
| safety | No | |
| source | Yes | |
| columns | No | |
| rowCount | No | |
| warnings | No | |
| truncated | No | |
| durationMs | No | |
| transaction | No | |
| affectedRows | No | |
| connectionId | Yes | |
| statementType | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is unusually rich about behavior: environment-gated write policy, a two-call confirmation flow using the returned confirmation_text, and the specific statement classes that trigger it. However, it directly conflicts with the annotation destructiveHint=false by advertising DROP, TRUNCATE, ALTER, DELETE/UPDATE-without-WHERE and 'multi-row destructive statements' — an agent trusting the annotation would severely underestimate the blast radius.
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?
Dense but front-loaded: what it does, then when to use it, then the environment policy, then the confirmation requirement, then the return shape. Every sentence carries information; the only near-waste is enumerating return fields when an output schema already exists.
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 12-parameter, open-world write tool the description covers execution policy and the confirmation workflow well, and the output schema relieves it of explaining return values. But with 0% parameter documentation and an annotation that understates destructiveness, an agent still lacks enough to call it safely with the optional flags.
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 12 parameters, so the description carries the full burden and largely fails: only the confirmation_text parameter is explained (via the second-call flow). Nothing clarifies dryRun, limit, timeoutMs, transaction, confirm vs. confirmationText/confirmation_text duplication, or schema/catalog scoping, leaving several ambiguous or overlapping fields undocumented.
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 ('Executes one SQL statement against a saved database connection') and scopes it with 'Use for INSERT/UPDATE/DELETE/DDL', which implicitly separates it from the read-only sibling unfour.db.query_readonly. It never names that sibling outright, so an agent must infer the boundary rather than read it.
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 real usage context ('when an agent needs to repair dev/test data') and a per-environment policy matrix (dev allows, test gates high-risk SQL behind confirm, prod blocks writes) that tells the agent when the call will succeed. It does not explicitly name the alternative to use for SELECTs, so the read/write routing is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.db.explainExplain Database QueryARead-onlyIdempotent
Runs EXPLAIN for a read query against a saved database connection through the Unfour command bus. Use before optimizing slow SELECT/WITH queries. This is read-only in dev/test/prod; it returns structured columns/rows, durationMs, and truncation metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | ||
| limit | No | ||
| schema | No | ||
| catalog | No | ||
| timeoutMs | No | ||
| workspaceId | No | ||
| connectionId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| sql | Yes | |
| rows | No | |
| source | Yes | |
| columns | No | |
| rowCount | No | |
| truncated | No | |
| durationMs | No | |
| connectionId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states it is read-only in dev/test/prod and returns structured columns/rows, durationMs, and truncation metadata, which adds valuable behavioral context beyond the annotations. There is no contradiction with the annotations (readOnlyHint, idempotentHint, destructiveHint all align). The description also implies non-destructiveness and clarifies expected outputs, though it could mention that it does not execute the query for side effects or that it requires an existing connection.
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 concise, at two sentences, and front-loads the action and use case. Every phrase adds value: the command bus, read-only guarantee, use-before-optimization guidance, and return value highlights. No filler or repetition of schema details.
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 tool's moderate complexity (7 params, but only 2 required) and the presence of an output schema (which explains return values), the description provides sufficient context for selection and core usage. It covers the purpose, use case, safety profile, and return format highlights. The main gap is the lack of parameter semantics, but the required parameters (connectionId, sql) are intuitive from the description, and the output schema handles return structure.
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 for the seven parameters. It mentions 'saved database connection' and 'read query', but does not explain parameters like limit, schema, catalog, timeoutMs, workspaceId, or connectionId. The description adds minimal semantic detail beyond the schema; it indicates connectionId and sql are key but does not explain their roles or optionality, so the agent may struggle with how to set these parameters for optimal use.
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 clearly states the tool runs EXPLAIN for a read query against a saved database connection, which is a specific verb+resource combination. It distinguishes itself from siblings like unfour.db.query_readonly and unfour.db.execute by focusing on query optimization via EXPLAIN, making its purpose 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?
The description explicitly says to use it 'before optimizing slow SELECT/WITH queries', giving a clear use case. However, it does not explicitly mention when NOT to use it or name alternative tools for other scenarios, such as unfour.db.query_readonly for actual data retrieval, though the context implies it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.db.export_tableExport Database TableA
Exports one table to a file in Unfour's managed exports directory. Optional columns, structured filters, and limit apply to the data portion. Data exports without limit require content-bound confirmation; omitted limit still means all matching rows. Returns file metadata; no destination path is accepted.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional maximum number of data rows. Omit for all matching rows, which requires confirmation when content includes data. | |
| format | Yes | ||
| schema | No | ||
| catalog | No | ||
| columns | No | Optional columns to include in the data portion. Omit to export every column. | |
| confirm | No | ||
| content | Yes | ||
| filters | No | Optional structured row predicates combined with AND. Each value is a string, number, or null and is bound; this is not a raw WHERE clause. | |
| tableName | Yes | ||
| workspaceId | No | ||
| connectionId | Yes | ||
| confirmationText | No | ||
| confirmation_text | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| format | Yes | |
| rowCount | Yes | |
| bytesWritten | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, non-idempotent, open-world). The description adds real value beyond them: it discloses the managed-directory write target, that no destination path is accepted, the content-bound confirmation requirement for unbounded data exports, and that file metadata is 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?
Four tight sentences with zero redundancy; the scope and target directory are front-loaded, and the confirmation and return-value notes each carry distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no elaboration, and the description covers the key confirmation behavior. But for a 13-parameter tool at 23% schema coverage it omits meaningful parameter semantics, and the duplicate confirmation parameters (confirm/confirmationText/confirmation_text) are left unclarified.
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 only 23% across 13 parameters, so the description is expected to compensate, and it covers columns, filters, limit, and content. It leaves format, catalog, schema, workspaceId, and the three confirmation-related parameters (confirm, confirmationText, confirmation_text) unexplained, 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 (exports), a specific resource (one table), and a specific destination (Unfour's managed exports directory), plus the constraint that no destination path is accepted. This is unambiguous and easily separable from siblings like db.query_readonly or db.execute.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies when the confirmation flow kicks in ('Data exports without limit require content-bound confirmation; omitted limit still means all matching rows'), which is useful operational context. However, it never states when to choose this over db.query_readonly or db.execute, nor any prerequisites, 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.
unfour.db.list_connectionsList Database ConnectionsARead-onlyIdempotent
Lists saved database connections for the active workspace through the Unfour command bus. Returns safe summaries without passwords, tokens, or connection strings.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional workspace ID. Uses the active workspace if omitted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| source | Yes | |
| connections | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable context: it returns 'safe summaries without passwords, tokens, or connection strings', which is important behavioral information beyond the annotations. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste. The first sentence states the purpose and scope, the second adds a critical safety detail. Perfectly front-loaded and concise.
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 is simple (1 optional param, no required params, output schema exists). The description covers the purpose, scope, and a key safety behavior. It doesn't describe the output format, but the output schema exists, so that's not required. Complete enough for a list 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?
Schema description coverage is 100% for the single optional parameter (workspaceId), so the schema already documents it. The description adds the context that it uses the active workspace if omitted, which is helpful but not extensive. Baseline 3 is appropriate.
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 clearly states the tool lists saved database connections for the active workspace, using a specific verb ('Lists') and resource ('saved database connections'). It distinguishes from siblings like unfour.connection.list and unfour.ssh.list_connections by specifying 'database' and 'active workspace'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context: it's for listing database connections in the active workspace, and the optional workspaceId parameter allows targeting a different workspace. It doesn't explicitly state when not to use it or name alternatives, but the context is clear enough given the sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.db.list_historyList Database Query HistoryARead-onlyIdempotent
Lists workspace-scoped query history (default 50, maximum 200). SQL literals and quoted tokens are masked; statements with comments, dollar quoting or sensitive markers are withheld. Returns execution summaries, never raw errors or result rows.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| source | Yes | |
| history | Yes | |
| workspaceId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so safety is covered. The description adds valuable behavioral details: default/max limit, masking of SQL literals, withholding of statements with comments or sensitive markers, and promise to return execution summaries rather than raw errors or rows. This goes beyond what annotations provide, enhancing the agent's understanding of data shape and privacy.
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 sentences, each adding essential detail: the purpose, the key limits and masking behavior, and the nature of returned data. No fluff; the most critical info (workspace scoping, limits) is front-loaded, and the privacy constraints follow logically.
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 list operation with a clear output schema (execution summaries) and minimal parameters, the description fully covers what an agent needs: the scope, the limits, what is excluded, and what is returned. There is no ambiguity about the function's behavior or output format.
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%, but there are only two parameters. The description mentions 'default 50, maximum 200' which directly clarifies the 'limit' parameter, and implies workspace scoping for the workspaceId. However, it does not explicitly define field types or requirements, but given the simplicity, the baseline 3 is justified.
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 clearly states the tool lists workspace-scoped query history, distinguishing it from similar tools by naming workspace scoping, default/max limits, and filtering behavior. Identifies the resource (database query history) with a specific verb (list).
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 clearly states when to use this tool (to list query history) but does not explicitly contrast with alternatives like unfour.api.list_history or unfour.ssh.list_history. However, the workspace scoping and explicit masking behavior imply usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.db.list_tablesList Database TablesARead-onlyIdempotent
Lists tables and views for a saved database connection through the Unfour command bus. Optional catalog and schema scope the listing. Requires a saved connectionId; does not accept ad-hoc connection strings.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of tables to return (default 200, max 500). | |
| schema | No | Optional schema name. pg_catalog and information_schema are excluded even when specified. | |
| catalog | No | Optional database catalog. Omit to use the connection's default database. | |
| workspaceId | No | Optional workspace ID. Uses the active workspace if omitted. | |
| connectionId | Yes | Required saved database connection ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| source | Yes | |
| tables | Yes | |
| truncated | Yes | |
| totalTables | Yes | |
| connectionId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety is covered. The description adds meaningful context beyond that: the operation runs through the 'Unfour command bus' and is restricted to saved connections, which is a real operational constraint. It adds little else (no pagination/return behavior), but that is largely carried by the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action, then scoping parameters, then the connection constraint. No filler or restatement of the title.
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, rich annotations and fully documented parameters, the description only needs to establish scope and prerequisites, which it does. The one remaining gap is that it does not hint at result ordering or the effect of the limit parameter, but that is minor given the 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 100%, so the schema already documents limit, schema, catalog, workspaceId and connectionId in detail. The description only restates that catalog and schema scope the listing and that connectionId is required, adding no syntax or format information beyond the schema. Baseline 3 applies when the schema does the heavy lifting.
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 (Lists) and resource (tables and views) scoped to a saved database connection, which clearly separates it from siblings like unfour.db.describe_table and unfour.db.query_readonly. It does not explicitly name a sibling, but the resource scope makes the intent unmistakable.
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 clear precondition (requires a saved connectionId) and an explicit exclusion (does not accept ad-hoc connection strings), which tells the agent when this tool applies versus constructing a new connection. It stops short of naming an alternative tool for the ad-hoc case, so it is strong but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.db.query_readonlyExecute Read-Only SQL QueryARead-onlyIdempotent
Executes a read-only SQL query against a saved database connection through the Unfour command bus. Only SELECT, WITH, SHOW, DESCRIBE, DESC, and EXPLAIN statements are allowed. Write operations, DDL, and multi-statement queries are rejected. Optional catalog, schema, and timeoutMs match unfour.db.execute and unfour.db.explain.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | Required SQL query. Only read-only statements are allowed. | |
| limit | No | Maximum number of rows to return (default 100, max 1000). | |
| schema | No | Optional schema to resolve unqualified names against. | |
| catalog | No | Optional catalog (database) to run the query against. | |
| timeoutMs | No | Optional per-statement timeout in milliseconds. | |
| workspaceId | No | Optional workspace ID. Uses the active workspace if omitted. | |
| connectionId | Yes | Required saved database connection ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| rows | No | |
| source | Yes | |
| columns | No | |
| rowCount | No | |
| truncated | No | |
| durationMs | No | |
| connectionId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the specific allowed statement types and the rejection of write/DDL/multi-statement queries, which is useful behavioral context beyond the annotations. It doesn't mention return format, but the output schema exists, so that's covered.
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 sentences with no waste. The core purpose and constraints are front-loaded, and the sibling reference is concise. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a read-only query tool. The description covers allowed statements, rejected operations, and parameter alignment with siblings. The output schema exists, so return values are documented. An agent has everything needed to call it correctly.
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 100%, so the schema already documents all 7 parameters. The description adds the note that optional catalog, schema, and timeoutMs match unfour.db.execute and unfour.db.explain, which is a small addition. Baseline 3 is appropriate since the schema does the heavy lifting.
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 ('Executes'), a resource ('read-only SQL query against a saved database connection'), and the allowed statement types. It clearly distinguishes this from unfour.db.execute and unfour.db.explain by naming them as siblings and noting the matching optional parameters.
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 explicitly lists which SQL statements are allowed and which are rejected, and it references sibling tools (unfour.db.execute and unfour.db.explain) for the optional parameters. This gives clear guidance on when to use this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.db.test_connectionTest Database ConnectionARead-onlyIdempotent
Tests connectivity to a saved database connection through the Unfour command bus. Returns whether the connection succeeded and the server version when available.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional workspace ID. Uses the active workspace if omitted. | |
| connectionId | Yes | Required saved database connection ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| source | Yes | |
| message | Yes | |
| connectionId | Yes | |
| serverVersion | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description mentions the return value (success and server version), which is informative. Combined with annotations (readOnly, idempotent, non-destructive), it gives a clear picture of the tool's behavior, though it doesn't explicitly state the lack of side effects beyond the annotation coverage.
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 a single sentence that is concise and directly states the action and expected output. No unnecessary details or fluff.
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 test tool, the description sufficiently covers what the tool does and what it returns. It does not require extensive elaboration, and the provided information is complete in context.
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 description does not add any details about the parameters beyond what the input schema already provides. Since the schema has clear descriptions for both workspaceId and connectionId, the description adds no extra meaning, aligning with the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: testing connectivity to a saved database connection. The action is specific and unambiguous, and the tool name reinforces the purpose.
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 does not explicitly contrast this tool with related alternatives (e.g., create_connection, list_connections). While the name implies its role, there is no guidance on when to prefer it over other connection-related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.db.update_connectionUpdate Database ConnectionA
Updates saved connection metadata through CommandBus. The ID must exist in the selected workspace. Omitted fields and stored credentials are preserved. Secret rotation is not exposed; the result contains only connectionId, workspaceId and source.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | ||
| name | No | ||
| port | No | ||
| driver | No | ||
| sslMode | No | ||
| database | No | ||
| readOnly | No | ||
| username | No | ||
| sqlitePath | No | ||
| workspaceId | No | ||
| connectionId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| source | Yes | |
| workspaceId | Yes | |
| connectionId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With all annotations false, the description carries the behavioral burden and delivers: partial-update semantics ('Omitted fields and stored credentials are preserved'), a clear limitation ('Secret rotation is not exposed'), a precondition ('The ID must exist in the selected workspace'), and response scope. These go well beyond what the annotations express, giving the agent accurate expectations about side effects and return content.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each earning its place: purpose first, then precondition, partial-update behavior, and the secret-rotation caveat with response shape. The only minor blemish is 'through CommandBus,' which adds implementation detail without helping an agent decide or invoke correctly.
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 an 11-parameter, 1-required mutation tool with zero parameter descriptions, the description covers the essentials: what is updated, the workspace precondition, merge semantics, the secrets limitation, and result scope. The presence of an output schema and self-documenting enums offsets the missing per-parameter prose. Only permission requirements and error behavior for a nonexistent connectionId are left unstated.
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 high-level semantics—connectionId must reference an existing item, omitted fields are preserved (explaining why all 11 params are optional), and no secret parameter exists. However, it does not explain individual parameters beyond what names/types/enums already convey, leaving host/port/driver/sslMode/database/readOnly/sqlitePath semantics to inference.
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 opens with a specific verb-plus-resource: 'Updates saved connection metadata through CommandBus.' Among siblings like create_connection, delete_connection, list_connections, and test_connection, the term 'saved connection metadata' clearly marks this as the modifier of existing connection configs and distinguishes it from query/execution tools. No ambiguity about what action is performed.
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 context is implied rather than stated: 'Updates saved connection metadata' and 'The ID must exist in the selected workspace' suggest the agent reaches for this when editing an existing connection. However, there are no explicit when-not-to-use rules, alternatives (e.g., ssh.update_connection for SSH connections, test_connection for connectivity), or exclusion conditions naming sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.flow.cancel_rununfour.flow.cancel_runA
Request cancellation of a running Flow; remote effects are not rolled back.
| Name | Required | Description | Default |
|---|---|---|---|
| runId | Yes | ||
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| run | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=true), so the bar is lower. The description adds genuinely useful semantics beyond them: it is a *request* (may not be immediate) and 'remote effects are not rolled back', which is important consequence information an agent cannot infer from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler that still conveys the key action and the most important consequence. 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 described, and annotations cover safety. However, with 0% parameter coverage and no statement of prerequisites (run must be in 'running' status) or how cancellation is observed, the definition is only minimally adequate for a mutation-style 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?
Schema description coverage is 0% with two parameters (required runId, optional workspaceId), so the description carries the burden. It only obliquely references 'a running Flow'; it never explains what runId identifies, that workspaceId scopes the lookup, or their formats. The gap is not compensated.
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 ('Request cancellation of a running Flow'), which is clearly distinct from siblings like unfour.flow.run, unfour.flow.get_run, and unfour.flow.list_runs. It does not explicitly name those siblings, but the action 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?
The phrase 'of a running Flow' implies the trigger condition (the run must be active) but the description never states when to reach for this tool versus the alternatives, nor any exclusion such as not calling it on an already-finished run. Usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.flow.deleteunfour.flow.deleteADestructive
Soft-delete a saved Flow definition at expectedRevision while retaining local run history. Guarded workspaces require confirmation bound to that revision.
| Name | Required | Description | Default |
|---|---|---|---|
| flowId | Yes | ||
| confirm | No | ||
| workspaceId | No | ||
| confirmationText | No | ||
| expectedRevision | Yes | ||
| confirmation_text | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| flowId | Yes | |
| deleted | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds meaningful details: this is a soft delete, local run history is retained, and guarded workspaces require revision-bound confirmation. It stops short of explaining revision mismatch behavior or permission requirements, but adds substantial context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, front-loaded with the primary action and followed immediately by the guarded-workspace caveat. Every sentence adds relevant information without repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering the destructive profile, the description need not explain return values. It covers the core delete semantics and confirmation requirement, though it could do more to resolve parameter-level ambiguity given the lack of schema descriptions.
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 six parameters, so the description must compensate heavily. It clarifies expectedRevision and implies confirmation, but does not explain flowId, workspaceId, confirm, or the duplicate confirmationText/confirmation_text parameters, leaving significant 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?
States a specific verb and resource: "Soft-delete a saved Flow definition." It also names the key scoping mechanism, expectedRevision, and clarifies retention behavior, making it distinguishable from generic flow run/cancel/list 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?
Provides an important precondition for guarded workspaces: confirmation must be bound to the expected revision. However, it does not explicitly compare this tool with alternatives such as cancelling a run or retrieving a flow, so usage guidance is present but incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.flow.getunfour.flow.getBRead-onlyIdempotent
Read a saved Flow definition for use in Desktop Canvas or MCP.
| Name | Required | Description | Default |
|---|---|---|---|
| flowId | Yes | ||
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| flow | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered structurally. The description adds only a target-consumer note ('for use in Desktop Canvas or MCP') and says nothing about auth requirements, errors for missing flows, or workspace scoping behavior. It clears the lower bar set by annotations but adds little.
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 with the action front-loaded and zero filler. It is appropriately sized, though that brevity is also what leaves the parameter and usage gaps unaddressed.
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?
A rich output schema exists (the full Flow definition structure), so return values need not be explained. But for a retrieval tool with two undocumented parameters and no guidance on when to prefer it over flow.list or flow.get_run, the description is only minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden of explaining the two parameters, yet it mentions neither flowId nor workspaceId. The schema supplies types and patterns but no meaning, and the description does nothing to clarify required vs optional or what workspaceId scoping implies.
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 (saved Flow definition), which cleanly distinguishes it from unfour.flow.get_run. However, it does not name or contrast with sibling tools like flow.list or flow.get_run, leaving the agent to infer the distinction. Clear purpose but no sibling 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?
The description says what it does but never says when to use it versus alternatives such as unfour.flow.list (enumerate) or unfour.flow.get_run (inspect execution). No conditions, prerequisites, or exclusions are given. Usage must be inferred entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.flow.get_rununfour.flow.get_runCRead-onlyIdempotent
Read the complete redacted Flow run history shared with Desktop.
| Name | Required | Description | Default |
|---|---|---|---|
| runId | Yes | ||
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| run | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false, and destructiveHint=false, so the safety profile is covered. The description adds useful context that results are redacted, but does not explain permissions, data scope boundaries, or pagination 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?
The definition is a single front-loaded sentence with no wasted words. It is concise, though the brevity contributes to missing parameter and usage guidance.
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. However, for a two-parameter retrieval tool with 0% schema description coverage and no usage guidance, the description is too incomplete to help an agent invoke it correctly beyond the basic action.
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 two parameters, and the description does not explain runId or workspaceId at all. An agent must infer how to identify the target run and whether workspaceId is required or scoping.
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: reading a Flow run's complete redacted run history. It is clearly distinguishable from list_runs and flow.get, though it does not explicitly name sibling alternatives. The phrase 'shared with Desktop' adds scope but is slightly ambiguous.
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 explicit guidance on when to use this tool versus alternatives like unfour.flow.list_runs or unfour.flow.get. It implies retrieval of a run, but leaves context and exclusions to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.flow.listunfour.flow.listARead-onlyIdempotent
List saved Flow summaries; use get for the complete definition.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| flows | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered by structured data. The description adds one useful behavioral note — that results are abbreviated summaries and that full definitions require `get` — but says nothing about result size, ordering, pagination, or whether the list is workspace-scoped or global.
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 action, the returned artifact, and the alternative tool. Zero waste and no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-shape explanation is unnecessary, and the description adequately covers purpose plus the summary-vs-definition distinction. It remains incomplete on the two things an agent most needs for correct invocation: workspace scoping of the optional parameter and disambiguation from unfour.flow.list_runs.
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?
There is one optional parameter (workspaceId) with 0% schema description coverage, and the description never mentions it. The description does not explain whether omitting it lists flows across all workspaces or defaults to the current one — meaningful semantics that are left entirely undocumented in both the schema and the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list saved Flow summaries) and contrasts with the sibling get tool in the same sentence. However, the term 'Flow summaries' is not disambiguated from the closely named sibling unfour.flow.list_runs, which an agent could easily confuse with this tool given the schema's summary objects carry run-like fields (status, startedAt, finishedAt).
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 one explicit routing rule: use `get` when you need the complete definition rather than a summary. This is clear when-to-use guidance for the list-vs-get choice, but it is silent on when to use this versus unfour.flow.list_runs, and states no exclusions or preconditions (e.g., workspace scoping) for the listing itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.flow.list_runsunfour.flow.list_runsBRead-onlyIdempotent
Read lightweight FlowRunSummary history without loading run details.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| flowId | Yes | ||
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| runs | Yes | |
| nextCursor | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive behavior. The description adds useful payload context: it returns lightweight FlowRunSummary records and avoids loading full run details. It does not mention pagination 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?
The definition is a single front-loaded sentence with no wasted words. It is appropriately concise for the core purpose, even though other dimensions are under-specified.
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 safety. But with four undocumented input parameters and no mention of required flowId, scoping, or pagination, the description is not complete enough to guide invocation beyond the bare schema.
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 four parameters and 0% schema description coverage. The description mentions no parameter names, required flowId, workspace scoping, limit, or cursor, so it fails to compensate for the missing schema descriptions.
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 ("Read"), resource ("FlowRunSummary history"), and scope ("without loading run details"). It implies contrast with detail-loading siblings like unfour.flow.get_run, but does not explicitly name an alternative tool.
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?
"Lightweight ... without loading run details" implies this tool should be used when summary-only history is sufficient. However, it does not explicitly state when to use it versus alternatives or any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.flow.rununfour.flow.runB
Start a Flow with initiator=mcp. Requires payload-bound confirmation even with full_access. Read-only/disabled policy blocks execution. Cancellation does not undo effects.
| Name | Required | Description | Default |
|---|---|---|---|
| flowId | Yes | ||
| inputs | No | ||
| confirm | No | ||
| workspaceId | No | ||
| environmentId | No | ||
| confirmationText | No | ||
| secretInputNames | No | ||
| confirmation_text | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| run | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds meaningful traits beyond the annotations: payload-bound confirmation is required even with full_access, policy can block execution, and cancellation does not undo effects. These are valuable operational facts for a non-destructive but open-world mutating tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense, front-loaded sentences with no wasted filler. Some phrasing ('payload-bound confirmation') is cryptic, but overall it is efficient and scannable.
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 coverage, and behavioral traits are decently covered. But for a tool with 8 parameters, nested objects, and 0% schema description coverage, the absence of parameter guidance leaves the definition incomplete.
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 8 parameters (flowId, inputs, confirm, confirmationText, confirmation_text, workspaceId, environmentId, secretInputNames). The description mentions 'payload-bound confirmation' but never maps it to the confirm/confirmationText params nor explains any input semantics, leaving a major 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+resource ('Start a Flow'), which is clearly distinguishable from siblings like unfour.flow.cancel_run and unfour.flow.get_run. It does not explicitly name those alternatives, but the action 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?
Implies usage context by noting the confirmation requirement and that read-only/disabled policy blocks execution, giving implicit preconditions. However, it never states when to use this versus alternatives such as unfour.flow.cancel_run or unfour.flow.get_run, nor exclusions for appropriate scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.flow.saveunfour.flow.saveB
Save a FlowDefinition using existing validation and revision checks. Empty id creates; updates require the current revision.
| Name | Required | Description | Default |
|---|---|---|---|
| definition | Yes | ||
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| flow | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so the mutation/idempotency profile is covered. The description usefully adds that validation runs and that updates enforce a current-revision check (optimistic concurrency), but it omits what happens on a stale revision or validation failure. Adds context beyond annotations without being 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 tight sentences with no filler, and the create/update behavior is front-loaded right after the purpose statement. Sized appropriately for a definition whose nested schema is large.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the description states the validation and revision invariants. But it leaves workspaceId behavior, error handling on stale revisions, and permission needs unaddressed, which is thin for a mutation tool with a large nested input schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description covers only the nested id and revision fields (empty id = create, revision must be current), leaving the top-level workspaceId and the bulk of the definition structure undocumented. The id/revision semantics are genuinely useful beyond the raw schema, but coverage of the actual two parameters is incomplete.
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 (Save) and resource (FlowDefinition) and adds the create-vs-update semantics, which clearly marks it as the write counterpart to flow.get, flow.delete, and flow.run. It does not explicitly name a sibling, but the save semantics distinguish it adequately.
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?
"Empty id creates; updates require the current revision" gives a concrete usage condition and the precondition for the update path, which is more than nothing. However, it never contrasts with alternatives such as flow.run or flow.get, nor states when not to use it, so guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.ssh.cancel_task_runCancel SSH Task RunB
Cancels an active SSH task run through the command bus.
| Name | Required | Description | Default |
|---|---|---|---|
| runId | Yes | ||
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is consistent with annotations (a mutating operation where readOnlyHint=false). It adds 'active' scoping (only running tasks can be canceled) and 'command bus' mechanism, but doesn't disclose what happens if the run has already completed or failed, nor the non-idempotent behavior hinted by idempotentHint=false. No contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, tightly worded sentence that front-loads the verb and object with zero filler. Every word earns its place, and the sentence is appropriately sized for this simple cancellation operation.
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 2-parameter cancel operation with an output schema available, the description is minimally adequate. It identifies the action, target, and mechanism, but omits useful context like behavior on already-finished runs. The presence of an output schema mitigates some gaps, though the description could have mentioned cancellation semantics without bloating the size.
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 carried the full burden for explaining parameters but says nothing at all about them. The parameter names runId and workspaceId are reasonably self-explanatory, which is the only saving grace, but no additional semantic detail is provided for the two-parameter call.
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 uses a specific verb ('Cancels') with a clear object ('active SSH task run') and states the mechanism ('through the command bus'). This clearly differentiates cancellation of a run from sibling operations like clearing runs or reading run logs, though it doesn't explicitly contrast with the similar-sounding clear_task_runs 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?
No guidance is provided on when to use this tool versus alternatives. Given siblings like unfour.ssh.clear_task_runs and unfour.ssh.run_task, an agent could easily confuse 'cancel a run' with 'clear runs' — explicit when/when-not guidance would be valuable, but none is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.ssh.clear_task_runsClear SSH Task RunsBDestructive
Deletes saved SSH task run records and local log files for one task or the workspace. Guarded policy requires content-bound confirmation.
| Name | Required | Description | Default |
|---|---|---|---|
| taskId | No | ||
| confirm | No | ||
| workspaceId | No | ||
| confirmationText | No | ||
| confirmation_text | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| source | No | |
| warnings | No | |
| deletedLogs | No | |
| deletedRuns | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, so the safety profile is largely covered; the description nonetheless adds real value by disclosing that local log files are deleted alongside records and that a content-bound confirmation gate applies. It stops short of explaining what 'content-bound confirmation' means operationally or whether deletion is recoverable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste, with the destructive action and its scope front-loaded before the confirmation caveat.
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 needn't be explained, and annotations carry the destructiveness signal. But for a 5-parameter destructive tool with 0% schema documentation, the description leaves the confirmation mechanics and the taskId/workspaceId selector ambiguous.
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 5 parameters, and the description only vaguely gestures at confirmation ('content-bound confirmation') without clarifying the interplay between confirm, confirmationText and the duplicated confirmation_text, nor whether taskId or workspaceId selects the scope. It does not compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Deletes') and resource ('saved SSH task run records and local log files') plus the scoping choice ('one task or the workspace'), which distinguishes it from read-only siblings like list_task_runs and read_task_run_log. It does not explicitly name a sibling alternative, so 4 rather than 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?
The scope phrase implies when the tool applies (per-task cleanup vs whole-workspace cleanup) and 'Guarded policy requires content-bound confirmation' hints at a prerequisite. However, it never says when NOT to use it or how it differs from cancel_task_run or delete_task, so usage must be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.ssh.create_connectionCreate SSH ConnectionA
Creates a saved SSH connection through the Unfour command bus. Optional secret input is stored in the OS credential store by the SSH engine and only a credential reference is persisted; the tool never returns the secret or credential reference.
| Name | Required | Description | Default |
|---|---|---|---|
| host | Yes | ||
| name | Yes | ||
| port | No | ||
| secret | No | ||
| keyPath | No | ||
| authKind | Yes | ||
| username | Yes | ||
| workspaceId | No | ||
| credentialRef | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds valuable behavioral context beyond the annotations: optional secret input is stored in the OS credential store, only a credential reference is persisted, and the tool never returns the secret or credential reference. This meaningfully discloses side effects and data handling. It does not mention all possible side effects, but the added detail is strong.
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, front-loaded with the primary purpose, and contains no filler. Every sentence contributes meaningful information about creation and credential handling.
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 tool has nine parameters, four required fields, and zero schema-level descriptions, the description is not complete enough for reliable invocation. It covers credential storage well but omits guidance on authKind selection, keyPath vs. secret, port defaults, workspaceId usage, and the meaning of credentialRef as an input. The presence of an output schema reduces the need to explain return values, but parameter context remains a major 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 description coverage is 0%, so the description must compensate for the nine undocumented parameters. It only clarifies the behavior of 'secret' and 'credentialRef', leaving host, username, authKind, port, keyPath, and workspaceId unexplained. This is insufficient for an agent to correctly populate the 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?
The description clearly states the tool's action: 'Creates a saved SSH connection through the Unfour command bus.' The verb 'creates' plus the resource 'saved SSH connection' precisely identifies the tool's function and distinguishes it from siblings like unfour.ssh.list_connections or unfour.db.create_connection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for persisting an SSH connection, but it does not explicitly state when to use this tool versus alternatives such as unfour.ssh.exec for ad-hoc commands or unfour.db.create_connection for database connections. There is clear context but no explicit when/when-not guidance or named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.ssh.delete_connectionDelete SSH ConnectionBDestructive
Soft-deletes a saved connection through CommandBus. Guarded policy requires confirmation bound to workspace, connection and revision; read-only policy rejects deletion.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | ||
| workspaceId | No | ||
| connectionId | Yes | ||
| confirmation_text | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| source | Yes | |
| deleted | Yes | |
| workspaceId | Yes | |
| connectionId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true and readOnlyHint=false. The description adds valuable behavioral details: it is a 'soft-delete' (not permanent), and it describes a 'Guarded policy' requiring confirmation bound to workspace, connection, and revision, plus read-only rejection. This goes beyond the annotations and gives the agent a better sense of side effects.
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 concise at two sentences and front-loaded with the core action. The policy details in the second sentence are relevant but could be streamlined. It avoids unnecessary fluff and is appropriately sized for a destructive operation.
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 destructive tool with 4 parameters, no schema descriptions, and no parameter semantics, the description is insufficient. It hints at confirmation requirements but does not explain the confirmation flow, what confirmation_text should be, or whether workspaceId is always required. Even though an output schema exists, an agent cannot confidently call this tool without guessing parameter values.
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, but it only vaguely references 'confirmation' and 'workspace' without explaining individual parameters. It does not clarify the meaning of 'confirm' (boolean), 'confirmation_text', or how 'revision' maps to parameters. The description fails to provide the necessary semantic detail for correct invocation.
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 ('soft-deletes') and resource ('saved connection'), making the primary purpose clear. It distinguishes from generic delete tools by mentioning 'through CommandBus' and 'soft-deletes', but it does not explicitly differentiate from siblings like unfour.db.delete_connection or unfour.ssh.delete_task.
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 explicit guidance on when to use this tool versus alternatives. It mentions policy constraints (confirmation, read-only rejection) but does not state scenarios like 'use this for SSH connections' or compare to unfour.db.delete_connection. The usage context is implied by the tool name only.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.ssh.delete_taskDelete SSH TaskBDestructive
Soft-deletes a saved SSH task. Guarded policy requires content-bound confirmation.
| Name | Required | Description | Default |
|---|---|---|---|
| taskId | Yes | ||
| confirm | No | ||
| workspaceId | No | ||
| confirmationText | No | ||
| confirmation_text | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the destructive nature is known. The description adds 'soft-deletes' and 'Guarded policy requires content-bound confirmation,' which provides extra context about the deletion being reversible and requiring confirmation. However, it doesn't detail what happens to associated data or the exact confirmation mechanism. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very short (two sentences) and front-loaded with the main action. It is concise, but the second sentence about 'Guarded policy' is vague and could be more specific. Overall, it is efficient with no wasted 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 tool has 5 parameters, 0% schema coverage, and a destructive action, the description is insufficient. It does not explain the confirmation parameters, the workspaceId requirement, or the soft-delete behavior in detail. The output schema exists but the description doesn't clarify what the response will be. The tool is complex enough that more detail is needed.
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 for parameter meaning. The description only mentions 'content-bound confirmation' but does not explain the purpose of taskId, confirm, workspaceId, confirmationText, or confirmation_text. The presence of both confirmationText and confirmation_text is confusing and unexplained. The description fails to clarify which parameters are required or how they interact.
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 clearly states the action: 'Soft-deletes a saved SSH task.' It specifies the resource (SSH task) and the operation (delete), and the 'soft-deletes' qualifier adds nuance. It distinguishes from siblings like 'clear_task_runs' and 'cancel_task_run' by focusing on deleting a saved task, though it doesn't explicitly name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions 'Guarded policy requires content-bound confirmation,' which implies a usage condition (confirmation needed) but does not explicitly state when to use this tool versus alternatives like 'clear_task_runs' or 'cancel_task_run'. It provides some context but lacks explicit when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.ssh.duplicate_taskDuplicate SSH TaskB
Duplicates a saved SSH task and its steps through the command bus.
| Name | Required | Description | Default |
|---|---|---|---|
| taskId | Yes | ||
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are all false and carry no safety or behavioral signal. The description adds some context ('through the command bus', copies steps) but does not disclose side effects, whether a new task ID is generated, permissions needed, or what happens to the original task. This is minimal beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one concise, front-loaded sentence. Every word contributes to defining the operation and its scope without unnecessary filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low parameter coverage and false annotations, the description is too sparse for a mutation tool. It does not clarify required vs optional inputs, return behavior, or how duplicates are saved—leaving the agent to infer critical operational details despite an output schema being present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain taskId or workspaceId. While taskId is reasonably inferable, workspaceId's role is unspecified, and no compensation is provided for the lack of parameter metadata.
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 uses a specific verb and resource ('Duplicates a saved SSH task') and explicitly scopes the scope of duplication ('and its steps'). It clearly distinguishes from sibling tools like save_task, run_task, and delete_task.
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 verb 'duplicates' implies the use case—copying an existing task—but there is no explicit guidance on when to choose this over save_task, get_task, or other related tools. No alternatives or exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.ssh.execExecute SSH CommandA
Executes one non-interactive SSH command on a saved connection. Use for dev/test repair loops after diagnostics identify a fix. Dev allows ordinary commands; test allows safe diagnostics and guarded commands; prod only allows read-only diagnostic commands. High-risk commands such as rm -rf, restart/shutdown, kill, docker/kubectl delete, and curl-pipe-shell require confirm with the returned confirmation_text.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | No | ||
| env | No | ||
| command | Yes | ||
| confirm | No | ||
| timeoutMs | No | ||
| workspaceId | No | ||
| connectionId | Yes | ||
| confirmationText | No | ||
| confirmation_text | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| warnings | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior the annotations do not convey: per-environment command policy, an enumerated list of high-risk patterns (rm -rf, restart/shutdown, kill, docker/kubectl delete, curl-pipe-shell), and the confirm/confirmation_text gating flow. This is exactly the context an agent needs before a write-ish remote execution. Slight tension with destructiveHint=false given it can run rm -rf, though the confirmation gate plausibly reconciles that; no explicit contradiction is stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences with no filler; the core action and the environment policy are front-loaded before the high-risk/confirmation detail. Slightly compressed for the amount of policy it encodes, but every sentence carries 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?
Behavioral policy is well covered and an output schema exists, so return-value explanation is not needed. However, for a nine-parameter tool with zero schema coverage and a duplicated confirmation parameter, the description leaves too much of the call signature unexplained for an agent to fill in cwd/env/timeout correctly.
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 nine parameters, so the description must compensate and largely does not. It only touches command, confirm, and confirmation_text ('confirm with the returned confirmation_text'), while cwd, env, timeoutMs, workspaceId, and connectionId go completely unexplained — and the schema confusingly exposes both confirmationText and confirmation_text, which the description does not disambiguate.
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 ('Executes one non-interactive SSH command on a saved connection'), which is unambiguous and names the key constraint (non-interactive, saved connection). It partially distinguishes itself from siblings by scoping use to 'repair loops after diagnostics identify a fix', implicitly separating it from unfour.ssh.run_diagnostic, but it never names that sibling or explains the boundary versus unfour.ssh.run_task.
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?
Provides clear context for when to reach for this tool (dev/test repair loops, after a diagnostic identifies a fix) and ties allowed command classes to environment (dev ordinary, test diagnostics/guarded, prod read-only). It stops short of explicitly naming the alternative tools to use instead when you have not yet diagnosed a problem, so the routing is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.ssh.get_host_keyGet SSH Host FingerprintARead-onlyIdempotent
Reads only the stored host fingerprint for a saved connection in the selected workspace. Returns known and a nullable fingerprint without contacting the host, changing trust, or exposing raw known_hosts.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | ||
| connectionId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| known | Yes | |
| source | Yes | |
| fingerprint | Yes | |
| workspaceId | Yes | |
| connectionId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, but the description adds critical behavioral specifics: it does not contact the host, does not change trust, and does not expose raw known_hosts. It also clarifies the return shape (known and nullable fingerprint), which goes beyond annotation coverage and adds real value.
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 a single, well-structured sentence that front-loads the core purpose ('Reads only the stored host fingerprint') and then adds necessary clarifications without unnecessary words. It is concise and efficient.
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 output schema exists, the description need not detail return values, yet it already mentions the nullable fingerprint. It covers the tool's scope, side-effect-free nature, and prerequisites (saved connection, workspace), making it complete for an agent to use correctly.
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 mentions 'a saved connection' and 'selected workspace', indirectly referencing connectionId and workspaceId, but does not explicitly explain their roles, requiredness, or formats. It provides some context but is not fully adequate given the zero schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads only the stored host fingerprint for a saved connection, using a specific verb and resource. It distinguishes itself from siblings by emphasizing 'only' and explicitly noting it does not contact the host, which differentiates it from test_connection and other SSH tools.
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 clear context on when to use this tool by highlighting that it avoids contacting the host, changing trust, or exposing raw known_hosts. This implicitly guides the agent to use it when a side-effect-free fingerprint lookup is needed, though it does not name alternative tools explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.ssh.get_taskGet SSH TaskARead-onlyIdempotent
Returns one SSH task with steps and local connection binding. Sensitive fields inside step configuration are masked.
| Name | Required | Description | Default |
|---|---|---|---|
| taskId | Yes | ||
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so safety is covered. The description adds valuable behavior beyond annotations by revealing that the returned object includes steps and local connection binding, and that sensitive step-configuration fields are masked. No contradiction found.
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 concise sentences with no filler. It front-loads the primary purpose in the first sentence and adds the essential security note in the second. Every word contributes value.
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 there is an output schema and the annotations describe the read-only, idempotent nature, the description is sufficiently complete for a get-by-id operation. It addresses the notable extra context (masking, binding, steps) without redundant return-format details. It could clarify workspaceId behavior, but the tool is simple enough to remain functional.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain the parameters at all. While 'Returns one SSH task' implies taskId is the selector, the optional workspaceId is entirely unexplained, leaving a semantic gap for that 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 'Returns one SSH task with steps and local connection binding,' which is a specific verb+resource+scope statement. It clearly differentiates from sibling tools like list_tasks (plural listing) and read_task_run_log by focusing on task configuration details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this tool is used when a single SSH task's full details are needed, including steps and binding. It does not explicitly state when not to use it or name alternatives, but the context 'one SSH task' is sufficient to separate it from list/run/delete operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.ssh.list_connectionsList SSH ConnectionsARead-onlyIdempotent
Lists saved SSH connections for a workspace through the Unfour command bus. Returns connection id, name, host, port, username, and environment; never returns passwords, private keys, passphrases, or credential references.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as read-only and idempotent, but the description adds crucial behavioral detail by explicitly stating that passwords, private keys, passphrases, and credential references are never returned. It also lists the exact fields that are returned, offering valuable transparency beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences that immediately state the action and provide useful details without any fluff. It is well-structured and front-loaded, making it easy to parse.
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 tool's simplicity and the presence of an output schema plus safety annotations, the description is complete enough. It covers the purpose, the return contents, and the critical security behavior, providing all necessary context for an agent to invoke the tool correctly.
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 description references the workspace scoping in the phrase 'for a workspace', which implicitly points to the workspaceId parameter, but it does not explicitly detail the parameter's optionality or type beyond what the schema provides. With 0% schema description coverage, the description only partially compensates for the missing parameter documentation.
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 uses a specific verb 'Lists' with a clear resource ('saved SSH connections') and scope ('for a workspace'), making it easy to understand the tool's function. It also distinguishes itself from sibling tools that create or manage connections by focusing on the read-only list operation.
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 clearly implies the tool is used when you need to list the saved SSH connections for a workspace. It does not explicitly mention alternatives or exclusions, but the purpose is self-evident and distinct from sibling tools, providing adequate usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.ssh.list_dirList SSH DirectoryBRead-onlyIdempotent
Lists a bounded remote directory through SSH and returns structured entry summaries when the remote find utility is available. Safe in dev/test/prod.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| limit | No | ||
| timeoutMs | No | ||
| workspaceId | No | ||
| connectionId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| warnings | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=true, so the safety profile is largely covered. The description adds useful behavioral context by noting that results are 'bounded' and that structured summaries depend on the remote find utility being available, though it does not explain fallback behavior 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?
The description is two concise sentences with the main action front-loaded. It avoids repetition and does not waste space on boilerplate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter tool with 0% schema description coverage, the description is too thin. While annotations and the output schema reduce the need to explain safety and return values, the description still leaves key parameters and when-to-use alternatives 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 schema itself provides no meaning for the five parameters. The description hints that 'bounded' relates to limit and 'remote directory' relates to path, but it says nothing about connectionId, timeoutMs, or workspaceId, leaving most parameters unexplained.
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: 'Lists a bounded remote directory through SSH.' It is clearly distinct from SSH siblings like read_file, write_file, and exec, but it does not explicitly name alternatives or clarify the boundary with those tools.
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 no guidance on when to use this tool versus alternatives such as read_file, exec, or list_connections. 'Safe in dev/test/prod' is an environment safety note, not a usage guideline, and there are no explicit exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.ssh.list_historyList SSH Command HistoryARead-onlyIdempotent
Lists structured SSH command history for the current MCP workspace. Returns connection, command, executedAt, and cwd/exitCode/durationMs when recorded. Results are workspace-scoped and never include terminal buffers or full session logs. Sensitive commands are excluded or replaced with [redacted command]. Use this to inspect recent host activity, then draft a reusable SSH Task for the user to confirm. Do not call unfour.ssh.save_task unless the user explicitly asks to save the draft.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of history entries to return (default 50, max 200). | |
| query | No | Optional substring filter matched against the stored command text. | |
| since | No | Optional inclusive RFC 3339 lower bound on executedAt. | |
| until | No | Optional inclusive RFC 3339 upper bound on executedAt. | |
| workspaceId | No | Optional workspace ID. Uses the active MCP workspace if omitted. History from other workspaces is never returned. | |
| connectionId | No | Optional saved SSH connection ID. Unknown or out-of-workspace connections return an empty list. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| source | Yes | |
| history | Yes | |
| workspaceId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool safe (readOnlyHint=true, destructiveHint=false), and the description adds meaningful behavioral disclosure beyond those flags: sensitive commands 'are excluded or replaced with [redacted command]', results are 'workspace-scoped', and fields are returned 'when recorded'. The redaction behavior and scope guarantees are exactly the kind of non-obvious context agents need and are not inferable from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences and roughly 90 words cover purpose, return shape, scope guarantees, redaction policy, and the follow-up workflow. The first sentence front-loads the core purpose, and no sentence is wasted on restating annotations or schema 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 read-only tool with 6 optional (100% schema-documented) parameters, an output schema, and rich annotations, the description covers the remaining gaps: what fields come back, what is excluded (terminal buffers, session logs), redaction behavior, and the recommended post-step (drafting a task). No material behavioral question is left unaddressed.
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 100%, so the rubric baseline is 3. All six parameters are individually documented with type, constraints (max 200, RFC 3339 format), and edge-case behavior ('Unknown or out-of-workspace connections return an empty list'). The description adds workspace-scoping and redaction context, but no parameter-level semantics that meaningfully exceed what the schema already provides, so a baseline 3 is appropriate.
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 opens with a specific verb+resource+scope: 'Lists structured SSH command history for the current MCP workspace,' and enumerates the returned fields (connection, command, executedAt, cwd/exitCode/durationMs). It clearly differentiates from close siblings like unfour.api.list_history and unfour.activity.list by scoping to SSH commands and explicitly ruling out terminal buffers/session logs.
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?
Explicit when-to-use guidance is present: 'Use this to inspect recent host activity, then draft a reusable SSH Task for the user to confirm,' along with a pointed when-not instruction: 'Do not call unfour.ssh.save_task unless the user explicitly asks to save the draft.' It could be stronger by naming read-alternatives (e.g., when to prefer activity.list), but the primary workflow and one key guardrail are explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.ssh.list_task_runsList SSH Task RunsARead-onlyIdempotent
Lists saved run summaries for one SSH task without exposing local log paths.
| Name | Required | Description | Default |
|---|---|---|---|
| taskId | Yes | ||
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds value by clarifying the return specifically contains 'saved run summaries' and explicitly excludes 'local log paths', which is a meaningful behavioral detail beyond the annotations. It does not repeat the annotation info but enriches the agent's understanding of the data 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?
The description is a single sentence of 15 words, immediately front-loading the action ('Lists') and object ('saved run summaries') and adds one critical exclusion at the end. Every word earns its place with no fluff.
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 this is a read-only list operation with a wealth of sibling context (like list_tasks, exec, read_file), the description provides solid coverage of the core purpose. The presence of an output schema (even though not shown) reduces the need to describe return values. The only gap is the lack of parameter semantics, but for a simple listing tool with two parameters, the description adequately serves an agent's basic need without padding.
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 fails to explain the purpose of 'taskId' and 'workspaceId'. While 'taskId' might be inferable from the tool name, 'workspaceId' is optional and its role is unclear. The description does not clarify whether workspaceId is needed for filtering or required in any context, and no parameter details are provided to compensate for the schema's lack of descriptions.
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 uses specific language: 'Lists saved run summaries for one SSH task' with the verb 'Lists', a specific resource ('saved run summaries'), and scope ('for one SSH task'). It also differentiates from siblings by noting it does not expose 'local log paths', which is useful given the related tool `unfour.ssh.read_task_run_log`.
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 clearly implies a read-only, non-destructive listing use case with 'saved run summaries'. It gives context that local log paths are not exposed, which helps the agent know this is not the tool for retrieving full logs. However, it does not explicitly name an alternative or state when NOT to use it in favor of a sibling tool, though it comes close.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.ssh.list_tasksList SSH TasksBRead-onlyIdempotent
Lists saved SSH task summaries for a workspace.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the tool is known to be safe. The description adds that it lists 'summaries' which implies a high-level view, but does not disclose what fields are included, whether it returns all tasks or paginated, or any specifics about the output format. With annotations covering the safety, the description provides minimal additional behavioral context, so 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?
The description is a single sentence, very concise, and directly states the purpose. No fluff or redundant information. It's appropriately brief for a simple list operation.
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 tool's simplicity (one parameter, read-only list operation), the description might be sufficient. However, there is an output schema (not shown) that could provide details, and the description does not mention any pagination, filtering, or ordering. It also doesn't clarify the difference between 'task summaries' and other task-related tools. The presence of sibling tools like list_task_runs suggests there is nuance missing, so it's not 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?
There is one parameter, workspaceId, and the schema coverage is 0% (the property description is empty). The description says 'for a workspace' which implies workspaceId is needed, but it doesn't clarify the semantics of the workspaceId (e.g., where to find it, if it's optional, or if it filters by workspace). With no param descriptions in the schema, the description should compensate, but it provides only a vague hint. Since it's the only parameter and the description mentions workspace, it adds minimal value, but not enough for a higher score.
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 clearly states it lists saved SSH task summaries for a workspace, using the verb 'list' with a specific resource (SSH task summaries) and a scope (workspace). However, it does not differentiate from sibling tools like unfour.ssh.list_task_runs or unfour.ssh.get_task, so it could be confused with those.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool vs alternatives. The description does not mention that this tool is for listing task summaries (metadata) as opposed to task runs or individual task details, nor does it mention any preconditions or context. Sibling tools list_task_runs, get_task, and others exist but the description offers no differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.ssh.patch_filePatch SSH FileA
Applies a small search/replace patch to a remote file through SSH and returns a diff summary without file content. Dev allows single-match project-file patches; test, system paths, or multi-match replacements require confirmation; prod is blocked by policy.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| search | Yes | ||
| confirm | No | ||
| replace | Yes | ||
| timeoutMs | No | ||
| workspaceId | No | ||
| connectionId | Yes | ||
| confirmationText | No | ||
| confirmation_text | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| warnings | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare openWorldHint=true, readOnlyHint=false and idempotentHint=false, so mutability and remote reach are known. The description meaningfully adds policy gating by environment, the confirmation requirement, and the diff-only return shape. It does not clarify how confirm relates to the two confirmation-text parameters or what happens when a patch is rejected mid-application; note that destructiveHint=false sits uneasily with editing a live remote file, but a targeted single-match replace is a reasonable read of that flag, so this is a tension rather than a contradiction.
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 dense sentences with no filler. The core action and return shape lead, and the environment policy matrix follows immediately, so the most decision-relevant information is front-loaded.
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 elaboration, and the notable behavioral constraints (prod blocked, confirmation triggers) are present. However, for a 9-parameter mutation tool with zero schema description coverage, nearly half the parameters are undocumented anywhere, which is a real completeness 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 description coverage is 0% across 9 parameters, so the description must carry the load. It covers search, replace and (implicitly) path and confirm, but leaves connectionId, workspaceId, timeoutMs and the duplicated confirmationText/confirmation_text pair completely unexplained — that duplication is exactly the kind of ambiguity a description should resolve.
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: applies a search/replace patch to a remote file over SSH, and adds the scope qualifier 'small' plus a return contract (diff summary, no file content). This implicitly separates it from ssh.write_file and ssh.exec, but neither sibling is named, so an agent must infer the boundary rather than being routed 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 environment rules are unusually concrete: dev permits single-match project-file patches, test/system paths/multi-match require confirmation, prod is blocked. That covers when-not-to-use and what triggers an extra step. It stops short of pointing to the alternative tool (write_file/exec) when a patch isn't appropriate, so a 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.ssh.read_fileRead SSH FileBRead-onlyIdempotent
Reads a bounded remote file slice or tail through SSH. Useful for logs and config inspection. Dev/test/prod allow ordinary reads; output is capped and line-redacted by the SSH engine. Sensitive paths may still be blocked by connection or OS permissions.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| limit | No | ||
| offset | No | ||
| tailLines | No | ||
| timeoutMs | No | ||
| workspaceId | No | ||
| connectionId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| warnings | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing that output is capped and line-redacted by the SSH engine, that ordinary reads are allowed across dev/test/prod, and that sensitive paths may be blocked by connection or OS permissions. That is genuinely useful behavioral context not carried by readOnlyHint/idempotentHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core action, followed by use case and constraints. No wasted text, though the constraint sentence could be ordered slightly better.
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 needn't be explained, and the safety/redaction profile is covered. But for a seven-parameter tool with zero schema descriptions, the description leaves the paging/subset parameters too underspecified for confident 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%, so the description must compensate, and it largely does not. The phrase 'bounded remote file slice or tail' hints that limit/offset/tailLines exist, but it never explains their semantics, interaction, defaults, or what timeoutMs, workspaceId, and connectionId mean.
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: reads a bounded remote file slice or tail over SSH. It implicitly contrasts with the write/patch siblings, but it never names them or distinguishes itself from exec (which could also cat a file) or read_task_run_log.
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?
'Useful for logs and config inspection' gives an implied usage context but no explicit when-not guidance and no alternatives. An agent must infer on its own whether to prefer exec, read_task_run_log, or list_dir for a given inspection task.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.ssh.read_task_run_logRead SSH Task Run LogARead-onlyIdempotent
Reads a capped SSH task run log. The SSH engine redacts configured secret inputs and the MCP response omits the local log path.
| Name | Required | Description | Default |
|---|---|---|---|
| runId | Yes | ||
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate a safe read-only operation, and the description adds valuable behavioral details: the log is capped, configured secret inputs are redacted, and the local log path is omitted from the response. This exceeds the annotation-only baseline without contradicting it.
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 extremely concise: two short sentences, each adding distinct information. There is no filler or repetition of the structured schema and annotations.
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 tool's low complexity, the required runId, and the presence of an output schema, the description covers the primary behavioral aspects. Minor gaps remain around the meaning of 'capped' and the role of workspaceId, but these are modest for a simple read-only log 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 should compensate by explaining the parameters. It does not explain how runId or workspaceId should be used. The parameter names are somewhat self-explanatory, but the description adds no semantic detail about them.
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 uses a specific verb and resource: 'Reads a capped SSH task run log.' This clearly distinguishes it from sibling tools like listing or running tasks, and the title aligns exactly with the described operation.
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 intended use case is implied by the name and description: retrieve the run log for an SSH task run. However, there is no explicit guidance about when to use this rather than related tools such as list_task_runs or get_task, and no mention of when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.ssh.reorder_tasksReorder SSH TasksA
Reorders all active SSH tasks in a workspace. taskIds must contain the exact active task set.
| Name | Required | Description | Default |
|---|---|---|---|
| taskIds | Yes | ||
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as a non-read-only, non-idempotent write operation. The description adds useful context by stating it reorders all active tasks and requires the exact task set. However, it does not disclose failure behavior, stale-task handling, or workspaceId 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?
Exactly two sentences with no filler; the core operation and the critical constraint are both present and front-loaded. 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?
The description captures the main invariant and scope well, and an output schema is present, so the return value need not be described. Minor gaps remain around workspaceId semantics and edge cases like stale taskIds, but overall the tool is adequately specified for selection and 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 supplies the essential meaning for taskIds: it must be the exact active task set and its order determines the new order. However, workspaceId is left undefined in both the schema and description, so the description only partially compensates for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it reorders active SSH tasks in a workspace, with a precise scope and the key constraint that taskIds must be the exact active set. This distinguishes it from sibling task tools like delete_task, run_task, and save_task.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the agent must obtain the current active task set before calling, but it does not explicitly say when to prefer this tool over other task operations or when not to use it. Usage guidance is mostly implicit through the 'exact active task set' constraint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.ssh.run_diagnosticRun SSH Diagnostic CommandARead-onlyIdempotent
Runs a single read-only diagnostic command on a saved SSH connection through the Unfour command bus and returns captured stdout/stderr. Safe in dev/test/prod for allowlisted diagnostics. For broader command execution use unfour.ssh.exec, which applies environment policy and high-risk confirmation.
| Name | Required | Description | Default |
|---|---|---|---|
| command | Yes | ||
| timeoutMs | No | ||
| workspaceId | No | ||
| connectionId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| warnings | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and open-world, so the safety profile is covered. The description adds real context beyond them: the call is gated to allowlisted diagnostics and routed through the command bus, and it returns captured stdout/stderr. It stops short of describing timeout behavior, error surfaces, or what happens to non-allowlisted commands.
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 no filler. The capability statement leads, and the sibling routing guidance follows it, so the most decision-relevant information is front-loaded.
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 and the description notes stdout/stderr capture, so return values need no elaboration. However, for a 4-parameter tool with zero schema descriptions, the silence on timeoutMs and workspaceId leaves an agent guessing how to scope the call or bound execution time.
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 burden falls entirely on the description — and it names none of them. Only faint implication exists ('saved SSH connection' implies connectionId references a stored connection; 'single ... command' implies no script chaining). timeoutMs and workspaceId are completely unaddressed.
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 ('Runs a single read-only diagnostic command on a saved SSH connection') and names the mechanism ('through the Unfour command bus'). It explicitly distinguishes itself from the sibling unfour.ssh.exec, so an agent can pick between the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a positive condition ('safe in dev/test/prod for allowlisted diagnostics') and a negative/alternative condition ('for broader command execution use unfour.ssh.exec, which applies environment policy and high-risk confirmation'). The routing decision is fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.ssh.run_taskRun SSH TaskA
Starts a saved SSH task on its selected saved connection. Production/read-only policy blocks execution; guarded policy requires content-bound confirmation because a task may execute commands or transfer files.
| Name | Required | Description | Default |
|---|---|---|---|
| inputs | No | ||
| taskId | Yes | ||
| confirm | No | ||
| workspaceId | No | ||
| connectionId | No | ||
| confirmationText | No | ||
| secretInputNames | No | ||
| confirmation_text | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, openWorldHint=true, and idempotentHint=false. The description enhances this by clarifying the execution policy behavior: blocked on production/read-only and requiring content-bound confirmation on guarded systems because tasks may execute commands or transfer files, adding genuine value about side effects without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with essential information about execution policy and safety delivered efficiently. Each sentence serves a purpose, though the 'selected saved connection' phrasing is slightly 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?
For a task-runner with nested objects and an output schema, the description gives appropriate context about side effects and policy restrictions. The existence of an output schema reduces the need to document return values, and the description covers the ambiguity of what 'saved task' means in terms of policy constraints effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the description focuses on the tool's behavior rather than explaining individual parameters. The description clarifies the 'inputs' concept generally by noting tasks may execute commands or transfer files, but with 8 parameters and no explanation of confirm vs confirmationText vs confirmation_text (a likely inconsistency worth mentioning) or secretInputNames, the description could have compensated more for the lack of schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool starts a saved SSH task on its selected saved connection, using the specific verb 'starts' with the resource being the saved SSH task/connection. It partially distinguishes from siblings by explaining the policy implications (production/read-only blocks execution, guarded needs confirmation), which relates to when operations proceed.
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?
While it doesn't name alternatives explicitly, the policy language tells the agent when execution will be blocked or need confirmation, which is crucial for an agent deciding to call this. It provides useful context about the execution context even though it could be more explicit about when to use this versus other SSH sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.ssh.save_taskSave SSH TaskA
Creates or updates a saved SSH task through the command bus. On update, omitted description and defaultConnectionId keep their current values; pass null for defaultConnectionId to clear it. Step types and configuration are validated by the SSH engine.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| steps | Yes | ||
| taskId | No | ||
| description | No | ||
| workspaceId | No | ||
| defaultConnectionId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds valuable behavioral context beyond the annotations: on update, omitted description and defaultConnectionId retain current values, null clears defaultConnectionId, and step types/configuration are validated by the SSH engine. This meaningfully explains side effects and update behavior. No contradiction with annotations exists.
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 three sentences, front-loaded with the core action, and every sentence carries useful information. No filler or repetition of schema details.
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 create/update behavior, nested step objects, and several optional parameters, and the description captures the key update semantics and validation. However, the create/update identification mechanism (taskId) and step configuration contract remain underspecified, so the description is not fully complete for an agent needing to construct valid requests.
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, but it only explains update behavior for description and defaultConnectionId and the validation of step types/config. It does not clarify how taskId identifies a task for update, the role of workspaceId, or the structure of configJson and step id/configVersion fields.
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 clearly identifies the tool as creating or updating a saved SSH task, with a specific resource and action. The partial-update semantics and validation detail further distinguish it from sibling task operations like duplicate_task, delete_task, and reorder_tasks.
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 clear context for when to use this tool: creating or updating a saved SSH task. It does not explicitly mention alternatives or exclusion criteria, but the create/update framing is strong enough to guide selection among task-related siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.ssh.test_connectionTest SSH ConnectionA
Tests a saved SSH connection using the existing CommandBus connection test and host-key checks. Requires native SSH. Returns only success status and a safe generic message, never credentials or raw engine error text.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | ||
| connectionId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| source | Yes | |
| message | Yes | |
| workspaceId | Yes | |
| connectionId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as non-read-only and non-idempotent, and the description adds substantial context: it requires native SSH, runs host-key checks, returns only success status/generic message, and never exposes credentials or raw engine errors. This goes well beyond the structured annotation fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action, followed by the key constraints. Every clause adds information; no filler or redundant restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering side-effect posture, the description is largely sufficient: it names prerequisites, safety behavior, and output scope. It loses one point because parameter semantics for workspaceId are absent and no alternative tools are referenced.
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, but it only vaguely implies that connectionId refers to a saved SSH connection. workspaceId is not mentioned or explained, leaving a required contextual gap for the agent.
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 uses a specific verb ('Tests'), a specific resource ('saved SSH connection'), and a concrete mechanism ('CommandBus connection test and host-key checks'). It clearly distinguishes this from db.test_connection and other SSH tools by scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'saved SSH connection' establishes clear context for when this tool applies, but the description does not explicitly name alternatives or state when not to use it. There are no exclusions, so it stops just short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.ssh.update_connectionUpdate SSH ConnectionA
Updates saved connection metadata through CommandBus. The ID must exist in the selected workspace. Omitted fields and stored credentials are preserved. Secret rotation is not exposed; the result contains only connectionId, workspaceId and source.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | ||
| name | No | ||
| port | No | ||
| keyPath | No | ||
| authKind | No | ||
| username | No | ||
| workspaceId | No | ||
| connectionId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| source | Yes | |
| workspaceId | Yes | |
| connectionId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses substantial behavior beyond the annotations: the existence precondition, non-destructive partial-update semantics, the explicit exclusion of secret rotation, and the exact response shape ('only connectionId, workspaceId and source'). This is fully consistent with annotations (readOnlyHint=false, destructiveHint=false) — there is no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each carrying distinct information: purpose, precondition, update semantics, and capability/result boundary. Every sentence earns its place and the purpose is front-loaded. Slightly dense with unexplained terms ('CommandBus,' 'source') but appropriately sized.
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?
Covers purpose, precondition, partial-update behavior, a capability exclusion, and result shape — substantial for a partial-update tool with an output schema. Gaps are the absence of routing guidance to siblings (create_connection, db.update_connection) and no clarification of what 'selected workspace' means or how it maps to the optional workspaceId parameter.
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 adds one cross-cutting semantic — 'omitted fields and stored credentials are preserved' — which is the most important behavior for these optional parameters. It does not explain individual fields such as authKind, keyPath, or how they interact, leaving the schema's bare types and enum to carry that weight. A 3 reflects partial compensation for a large 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 and resource: 'Updates saved connection metadata.' This clearly differentiates it from sibling create/delete/test connection operations by name and description. The phrase 'through CommandBus' is unexplained jargon that adds little for an agent, and it does not explicitly contrast with unfour.db.update_connection, so a 4 rather than 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 concrete usage context: the precondition that the ID 'must exist in the selected workspace,' the partial-update guarantee that 'omitted fields and stored credentials are preserved,' and the capability boundary that 'secret rotation is not exposed.' These explain when and how the tool should be invoked, though no alternative sibling tool is named for cases like secret rotation or new connections.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.ssh.write_fileWrite SSH FileA
Writes or appends a remote file through SSH. Dev allows ordinary project paths; test and high-risk paths require confirmation; prod is blocked by policy. The returned result contains only path/mode/byte counts and command status, never file content.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | ||
| path | Yes | ||
| confirm | No | ||
| content | Yes | ||
| timeoutMs | No | ||
| workspaceId | No | ||
| connectionId | Yes | ||
| confirmationText | No | ||
| confirmation_text | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| warnings | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial context beyond the annotations: path-risk policy tiers, the confirmation gate, and the fact that the response deliberately omits file content. It does not spell out that overwrite mode destroys prior content while destructiveHint is false, nor whether writes are atomic or partially applied on failure — material for a 9-param mutation.
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: the operation first, then the policy and output contract. No filler, and the safety-critical gating is front-loaded before the return-shape 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?
Safety and policy coverage is good and an output schema exists, so return values need not be restated. However, for a 9-parameter mutation with zero schema descriptions, several parameters and the overwrite-vs-create blast radius remain unexplained, leaving the agent guessing at call correctness.
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 all parameter meaning, and it only partially does: it implies confirm/confirmation flow and modes, but never explains timeoutMs, workspaceId, or the duplicated confirmationText vs confirmation_text fields. The distinction between create and overwrite is also left to the bare enum.
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?
"Writes or appends a remote file through SSH" gives a specific verb and resource and is clearly distinct from read_file and list_dir. It does not explicitly distinguish itself from patch_file or exec-with-redirect, so sibling differentiation against the nearest alternative is left to inference.
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 environment tiering (dev allows project paths, test/high-risk requires confirmation, prod blocked by policy) is explicit when-to-use and when-blocked guidance that an agent can act on immediately. It stops short of naming alternatives such as patch_file for partial edits, so the routing half of the guidance is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.system.healthUnfour System HealthARead-onlyIdempotent
Returns command-bus and storage readiness for diagnostics through the Unfour command bus.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| source | Yes | |
| appName | Yes | |
| storageReady | Yes | |
| commandBusReady | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, and closed-world behavior, so the safety profile is clear. The description adds that it returns 'command-bus and storage readiness', which is useful context, but does not disclose further behavioral traits such as authentication requirements or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, tightly constructed sentence that front-loads the action and resource. Every word contributes to understanding, with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters, a full output schema, and comprehensive annotations, the description provides sufficient context for invocation. A minor gap is the lack of explicit differentiation from other diagnostic tools, but overall it is complete enough for an agent to use correctly.
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 are no parameter semantics to explain. The description does not need to compensate for missing schema details, and the baseline score of 4 is appropriate.
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 specifies a clear verb (Returns) and resource (command-bus and storage readiness), and adds the diagnostic context. No sibling tool performs this exact health check, so it is easily distinguishable from the listed alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for diagnostics' implies when to use the tool, but there are no explicit guidelines about when to choose this over other diagnostic tools like unfour.ssh.run_diagnostic or unfour.db.test_connection. The usage is suggested but not fully elaborated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.workspace.create_variableCreate Workspace VariableC
Creates one workspace-global variable through the command bus. Returned values are masked when secret or sensitive.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| value | Yes | ||
| isSecret | No | ||
| isEnabled | No | ||
| sortOrder | No | ||
| description | No | ||
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate a mutating operation (readOnlyHint=false), and the description adds one extra behavioral detail: returned values are masked when secret or sensitive. However, it omits other relevant behaviors like idempotency, potential errors, or permissions. The masking note is useful but minimal.
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 exceptionally concise: two sentences that state the purpose and a key behavioral note. It's front-loaded and avoids redundancy, though it could elaborate on parameters or usage.
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 7 parameters with zero schema descriptions, the description provides almost no contextual guidance. It doesn't explain parameter semantics, required vs optional, or how workspaceId is used. While output is implicitly described, the lack of parameter context makes it incomplete.
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 input schema has 7 parameters with no descriptions, and the tool description provides no explanation of any parameter. With 0% schema coverage, the description completely fails to compensate, leaving key, value, isSecret, isEnabled, sortOrder, description, and workspaceId unexplained.
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 clearly states the action: 'Creates one workspace-global variable' with the specific verb 'creates' and resource 'variable'. It distinguishes itself from sibling tools like update_variable and delete_variable by the explicit creation action, though it does not explicitly differentiate from replace_variables.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like update_variable or replace_variables. The description provides no context about prerequisites, scenarios, or when not to use it, leaving the agent to infer from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.workspace.currentCurrent Unfour workspaceARead-onlyIdempotent
Returns the active local workspace through the Unfour command bus.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| source | Yes | |
| mcpPolicy | Yes | |
| workspaceId | Yes | |
| workspaceName | Yes | |
| workspaceRoot | Yes | |
| environmentType | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare the tool read-only, idempotent, and non-destructive, and the description does not contradict those. It adds modest context by noting 'active local workspace' and the command-bus mechanism, but it does not disclose extra behavioral details such as fallbacks, errors, or scope limitations.
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 a single, front-loaded sentence with no filler, repetition, or unnecessary qualifiers. 'Returns the active local workspace' is the core message, and the rest is minimal.
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?
This is a simple no-parameter query tool with strong annotations and an output schema present. The description is sufficient for the agent to understand the tool's basic purpose and safely invoke it.
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 and the input schema is empty, so there is no parameter semantics burden on the description. The baseline of 4 applies because there is nothing additional the description needs to clarify about arguments.
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 clearly states the tool returns the active local workspace, using a specific verb and resource. It is not tautological, but it does not explicitly contrast itself with the sibling unfour.workspace.list, relying mostly on the name and 'active local' wording 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?
The description implies it should be used when the active/current local workspace is needed. However, it provides no explicit when-to-use or when-not-to-use guidance and does not mention alternatives like unfour.workspace.list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.workspace.delete_variableDelete Workspace VariableADestructive
Soft-deletes one workspace-global variable. Guarded policy requires the content-bound confirmation handshake.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | ||
| variableId | Yes | ||
| workspaceId | No | ||
| confirmationText | No | ||
| confirmation_text | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, so the description adds value by clarifying the operation is a 'soft-delete' rather than a hard delete. It also reveals a 'content-bound confirmation handshake' required by guarded policy, which is meaningful behavioral context beyond the annotation flags.
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 concise sentences with no wasted words. It front-loads the core action and then adds the critical confirmation requirement. It is well-sized for the tool's complexity.
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 description covers the core purpose, soft-delete behavior, and confirmation policy, but important gaps remain: the exact confirmation parameter requirements are ambiguous, and the 0% schema coverage means the description needed to explain parameter roles more thoroughly. The output schema exists, so return values don't need explanation, but parameter clarity is still incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not sufficiently compensate. It hints at the confirmation handshake but does not clarify the roles of 'confirm', 'confirmationText', 'confirmation_text', or 'workspaceId'. The presence of two similarly named confirmation fields without disambiguation is particularly problematic.
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: 'Soft-deletes one workspace-global variable.' This clearly differentiates the tool from siblings like create_variable, update_variable, and replace_variables. The scope ('workspace-global') and soft-delete semantics add precision.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when a workspace-global variable should be deleted, but it does not explicitly say when to use this over alternatives or when not to. No exclusions or alternative tool references are provided, leaving usage context mostly inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.workspace.listList Unfour workspacesARead-onlyIdempotent
Lists all local workspaces through the Unfour command bus, marking which one is active.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| source | Yes | |
| workspaces | Yes | |
| activeWorkspaceId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds behavioral value by noting that results are obtained 'through the Unfour command bus' and that the active workspace is marked, which is not present in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, tightly worded sentence that front-loads the main action ('Lists all local workspaces') and adds only the essential detail about marking the active workspace. 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?
Given the tool's low complexity, zero parameters, strong annotations, and presence of an output schema, the description is sufficient. It tells the agent what the tool does, the scope of results, and one meaningful output detail (active marker) without unnecessary elaboration.
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 the baseline of 4 applies. The description does not need to explain parameter behavior because there are no inputs to interpret.
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 clearly states the tool 'lists all local workspaces', which is a specific verb and resource scope. It also notes the active-workspace marker, distinguishing it from the sibling unfour.workspace.current, which focuses on a single workspace.
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 'all local workspaces' provides clear context for when to use this tool: when the agent needs a full list rather than only the current workspace. It does not explicitly mention exclusions or alternatives, but the sibling list makes the intended usage reasonably inferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.workspace.list_variablesList Workspace VariablesARead-onlyIdempotent
Lists workspace-global variables through the command bus. Secret variables and sensitive keys are masked before returning to the MCP client.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only and idempotent behavior. The description adds valuable info about masking secret variables and sensitive keys, which is not covered by annotations. This improves transparency about the tool's output handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences provide the core purpose and one key behavior (masking). No fluff or irrelevant details.
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 operation and presence of an output schema, the description is adequate but lacks param semantics (e.g., whether workspaceId is optional, default behavior) and does not describe any pagination or grander behavior. It covers the essentials but leaves some 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% and the description does not explain the 'workspaceId' parameter at all. While not required, its purpose is unclear beyond the implied workspace context, leaving the agent to guess whether it is mandatory or how to format it.
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 clearly states it lists workspace-global variables, using a specific verb and resource scope. It distinguishes from sibling tools like unfour.workspace.create_variable or delete_variable, and clarifies it operates on workspace-level data.
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 mentions the scope (workspace-global) but does not explicitly contrast with alternatives or state when to use this tool versus other list tools (e.g., connection lists). It gives enough context via the name and scope, but lacks explicit guidance on alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.workspace.replace_variablesReplace Workspace VariablesA
Replaces the complete workspace-global variable set through the command bus. Omitted existing variables are soft-deleted. For items that include an existing id, omitted optional fields keep their current values. Returned values are masked when secret or sensitive.
| Name | Required | Description | Default |
|---|---|---|---|
| variables | Yes | ||
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are all false, but description adds significant behavioral detail: soft-deletion of omitted variables, merge behavior for existing ids, and masking of sensitive returned values. These traits go well beyond what annotations disclose.
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 sentences, each packed with information: core action, behavior for omitted variables, behavior for existing ids, and output masking. No fluff, well-structured.
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?
Despite having an output schema (not shown) and all-false annotations, the description covers the critical behaviors: replace-all scope, soft-delete, field merging, and sensitive masking. This is sufficient for an agent to understand and correctly invoke 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 coverage is 0% and the description does not explain the variables array fields individually. It adds meaning for id (existing id merge) and isSecret (masking), but doesn't cover key, value, isEnabled, sortOrder, description. Partial compensation but not enough for zero coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb 'Replaces' with resource 'complete workspace-global variable set'. Clearly distinguishes from sibling tools that handle individual variables (create/update/delete). The description's focus on the entire set makes the purpose 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?
Implies usage for bulk replacement of the entire variable set, and clarifies that omitted variables are soft-deleted, which sets expectations. However, it doesn't explicitly mention alternatives or when not to use it, but the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unfour.workspace.update_variableUpdate Workspace VariableA
Updates one workspace-global variable through the command bus. Omitted optional fields keep their current values. Returned values are masked when secret or sensitive.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| value | Yes | ||
| isSecret | No | ||
| isEnabled | No | ||
| sortOrder | No | ||
| variableId | Yes | ||
| description | No | ||
| workspaceId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds valuable behavioral details beyond annotations: partial-update semantics ('Omitted optional fields keep their current values') and output masking ('Returned values are masked when secret or sensitive'). These are not evident from annotations (readOnlyHint=false, etc.) and help the agent understand side effects and response 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 concise (two sentences) with no redundant wording. It front-loads the core purpose and immediately adds the key behavioral notes. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 8 parameters and an output schema present, the description provides high-level behavior but leaves parameter details entirely to the schema. It covers partial update and masking, which are crucial, but does not mention required identifiers, permission prerequisites, or error scenarios. Given the tool's moderate complexity, it is minimally adequate but could be more 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% — the description does not mention any of the 8 parameters or their meanings. While the schema provides types and required flags, the description fails to clarify the role of fields like key, value, isSecret, isEnabled, or how variableId identifies the target. The description offers no additional insight beyond what the schema already shows.
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 clearly states the action ('Updates one workspace-global variable') and the resource ('workspace-global variable'), distinguishing it from sibling tools like create_variable and delete_variable. The mention of 'one' distinguishes it from batch operations like replace_variables, though not 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 implies usage for updating a single workspace variable, but does not provide explicit guidance on when to use this tool versus siblings like replace_variables or create_variable. No exclusions or alternative recommendations are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
11 tool updates
v0.12.0- Changed
unfour.api.send_request1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
unfour.db.execute1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
unfour.flow.delete2 fields changed- added
Input schema / properties / expectedRevisionAdded value: +{ + "minimum": 1, + "type": "integer" +} - changed
Input schema / requiredPrevious value: -[ - "flowId" -]New value: +[ + "flowId", + "expectedRevision" +]
- Changed
unfour.ssh.clear_task_runs1 field changed- added
Output schema / propertiesAdded value: +{ + "deletedLogs": { + "type": "integer" + }, + "deletedRuns": { + "type": "integer" + }, + "source": { + "type": "string" + }, + "warnings": { + "items": { + "type": "string" + }, + "type": "array" + } +}
- Changed
unfour.ssh.exec1 field changed- added
Output schema / propertiesAdded value: +{ + "warnings": { + "items": { + "type": "string" + }, + "type": "array" + } +}
- Changed
unfour.ssh.list_dir1 field changed- added
Output schema / propertiesAdded value: +{ + "warnings": { + "items": { + "type": "string" + }, + "type": "array" + } +}
- Changed
unfour.ssh.patch_file1 field changed- added
Output schema / propertiesAdded value: +{ + "warnings": { + "items": { + "type": "string" + }, + "type": "array" + } +}
- Changed
unfour.ssh.read_file1 field changed- added
Output schema / propertiesAdded value: +{ + "warnings": { + "items": { + "type": "string" + }, + "type": "array" + } +}
- Changed
unfour.ssh.run_diagnostic1 field changed- added
Output schema / propertiesAdded value: +{ + "warnings": { + "items": { + "type": "string" + }, + "type": "array" + } +}
- Changed
unfour.ssh.write_file1 field changed- added
Output schema / propertiesAdded value: +{ + "warnings": { + "items": { + "type": "string" + }, + "type": "array" + } +}
- Changed
unfour.system.health1 field changed- removed
Output schema / properties / aiReservedCapabilitiesRemoved value: -{ - "items": { - "type": "string" - }, - "type": "array" -}
11 tool updates
v0.10.0- Changed
unfour.db.describe_table10 fields changed- added
Input schema / properties / catalogAdded value: +{ + "description": "Optional database catalog.", + "type": "string" +} - added
Output schema / properties / table / properties / capabilitiesAdded value: +{ + "additionalProperties": false, + "properties": { + "ddl": { + "type": "boolean" + }, + "foreignKeys": { + "type": "boolean" + }, + "indexes": { + "type": "boolean" + } + }, + "required": [ + "indexes", + "foreignKeys", + "ddl" + ], + "type": "object" +} - added
Output schema / properties / table / properties / columns / items / properties / autoIncrementAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / table / properties / columns / items / properties / defaultValueAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / table / properties / columns / items / properties / generatedAdded value: +{ + "type": "boolean" +} - changed
Output schema / properties / table / properties / columns / items / requiredPrevious value: -[ - "name", - "dataType", - "nullable", - "primaryKey" -]New value: +[ + "name", + "dataType", + "nullable", + "primaryKey", + "defaultValue", + "generated", + "autoIncrement" +] - added
Output schema / properties / table / properties / ddlAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / table / properties / foreignKeysAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "columns": { + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "referencedColumns": { + "items": { + "type": "string" + }, + "type": "array" + }, + "referencedTable": { + "type": "string" + } + }, + "required": [ + "name", + "columns", + "referencedTable", + "referencedColumns" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / table / properties / indexesAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "columns": { + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "primary": { + "type": "boolean" + }, + "unique": { + "type": "boolean" + } + }, + "required": [ + "name", + "columns", + "unique", + "primary" + ], + "type": "object" + }, + "type": "array" +} - changed
Output schema / properties / table / requiredPrevious value: -[ - "name", - "kind", - "columns", - "columnCount" -]New value: +[ + "catalog", + "schema", + "name", + "kind", + "ddl", + "columnCount", + "columns", + "indexes", + "foreignKeys", + "capabilities" +]
- Added
unfour.db.export_table - Changed
unfour.db.list_tables2 fields changed- added
Input schema / properties / catalogAdded value: +{ + "description": "Optional database catalog. Omit to use the connection's default database.", + "type": "string" +} - added
Input schema / properties / schemaAdded value: +{ + "description": "Optional schema name. pg_catalog and information_schema are excluded even when specified.", + "type": "string" +}
- Added
unfour.flow.cancel_run - Added
unfour.flow.delete - Added
unfour.flow.get - Added
unfour.flow.get_run - Added
unfour.flow.list - Added
unfour.flow.list_runs - Added
unfour.flow.run - Added
unfour.flow.save
8 tool updates
v0.9.6- Changed
unfour.api.send_request1 field changed- changed
Input schema / properties / timeoutMs / descriptionPrevious value: -"Optional timeout in milliseconds. Omitted or null defaults to 60000ms; 0 means unlimited; positive values are used exactly."New value: +"Optional timeout in milliseconds. Omitted or null defaults to 60000ms. 0 disables the HTTP timeout; positive values are passed through to the HTTP layer. All MCP calls remain subject to the independent 120-second MCP safety deadline."
- Added
unfour.db.delete_connection - Added
unfour.db.list_history - Added
unfour.db.update_connection - Added
unfour.ssh.delete_connection - Added
unfour.ssh.get_host_key - Added
unfour.ssh.test_connection - Added
unfour.ssh.update_connection
1 tool update
v0.9.3- Changed
unfour.api.send_request3 fields changed- changed
Input schema / properties / timeoutMs / descriptionPrevious value: -"Optional timeout in milliseconds. Maximum 60000ms (60 seconds)."New value: +"Optional timeout in milliseconds. Omitted or null defaults to 60000ms; 0 means unlimited; positive values are used exactly." - added
Input schema / properties / timeoutMs / minimumAdded value: +0 - changed
Input schema / properties / timeoutMs / typePrevious value: -"number"New value: +[ + "integer", + "null" +]
3 tool updates
v0.9.1- Added
unfour.api.delete_environment_variable - Changed
unfour.api.send_request1 field changed- changed
Input schema / properties / environmentId / descriptionPrevious value: -"Optional environment ID (currently uses the workspace default environment)."New value: +"Optional per-call environment override. It is used for variable resolution and saved request scripts without changing the workspace active environment."
- Added
unfour.api.set_environment_variable
4 tool updates
v0.6.0- Changed
unfour.db.describe_table1 field changed- added
Output schema / properties / table / properties / catalogAdded value: +{ + "type": [ + "string", + "null" + ] +}
- Changed
unfour.db.execute2 fields changed- added
Output schema / properties / transactionAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / truncatedAdded value: +{ + "type": "boolean" +}
- Changed
unfour.db.list_tables1 field changed- added
Output schema / properties / tables / items / properties / catalogAdded value: +{ + "type": [ + "string", + "null" + ] +}
- Changed
unfour.db.query_readonly3 fields changed- added
Input schema / properties / catalogAdded value: +{ + "description": "Optional catalog (database) to run the query against.", + "type": "string" +} - added
Input schema / properties / schemaAdded value: +{ + "description": "Optional schema to resolve unqualified names against.", + "type": "string" +} - added
Input schema / properties / timeoutMsAdded value: +{ + "description": "Optional per-statement timeout in milliseconds.", + "type": "integer" +}
54 tool updates
v0.1.0- First observed
unfour.activity.list - First observed
unfour.api.create_collection - First observed
unfour.api.create_environment - First observed
unfour.api.create_request - First observed
unfour.api.delete_collection - First observed
unfour.api.delete_environment - First observed
unfour.api.delete_request - First observed
unfour.api.get_history - First observed
unfour.api.get_request - First observed
unfour.api.list_collections - First observed
unfour.api.list_environments - First observed
unfour.api.list_history - First observed
unfour.api.list_requests - First observed
unfour.api.send_request - First observed
unfour.api.update_collection - First observed
unfour.api.update_environment - First observed
unfour.api.update_request - First observed
unfour.connection.list - First observed
unfour.db.create_connection - First observed
unfour.db.describe_table - First observed
unfour.db.execute - First observed
unfour.db.explain - First observed
unfour.db.list_connections - First observed
unfour.db.list_tables - First observed
unfour.db.query_readonly - First observed
unfour.db.test_connection - First observed
unfour.ssh.cancel_task_run - First observed
unfour.ssh.clear_task_runs - First observed
unfour.ssh.create_connection - First observed
unfour.ssh.delete_task - First observed
unfour.ssh.duplicate_task - First observed
unfour.ssh.exec - First observed
unfour.ssh.get_task - First observed
unfour.ssh.list_connections - First observed
unfour.ssh.list_dir - First observed
unfour.ssh.list_history - First observed
unfour.ssh.list_task_runs - First observed
unfour.ssh.list_tasks - First observed
unfour.ssh.patch_file - First observed
unfour.ssh.read_file - First observed
unfour.ssh.read_task_run_log - First observed
unfour.ssh.reorder_tasks - First observed
unfour.ssh.run_diagnostic - First observed
unfour.ssh.run_task - First observed
unfour.ssh.save_task - First observed
unfour.ssh.write_file - First observed
unfour.system.health - First observed
unfour.workspace.create_variable - First observed
unfour.workspace.current - First observed
unfour.workspace.delete_variable - First observed
unfour.workspace.list - First observed
unfour.workspace.list_variables - First observed
unfour.workspace.replace_variables - First observed
unfour.workspace.update_variable
TDQS
Scored across 72 tools
The domain-namespaced names (api/db/ssh/flow/workspace) plus explicit verb+noun phrasing make nearly every tool's target resource and action clear, and descriptions reinforce the boundaries (read-only vs mutating vs confirmation-gated). A few pairs remain genuinely confusable: unfour.api.get_history vs unfour.api.list_history, unfour.connection.list vs unfour.db.list_connections/unfour.ssh.list_connections, and the identically-described db.update_connection and ssh.update_connection.
Strong, predictable domain.verb_noun convention throughout (api.create_request, ssh.delete_task, workspace.update_variable). Minor deviations are noun-only tools like workspace.current, system.health, activity.list, and connection.list, which break the verb pattern but stay readable and unambiguous within their namespace.
72 tools across eight sub-domains is very heavy for a single MCP surface and requires an agent to route through many near-sibling options before acting. While the sub-domain grouping is logical, the sheer breadth pushes well past the comfortable 3-15 range and raises selection cost substantially.
Coverage is broad and lifecycle-complete for most resources: variables, collections, requests, environments and env vars, DB/SSH connections, SSH tasks and runs, and flows all have list/get/create/update/delete plus execution and history. Gaps exist around API folders (referenced in cascade deletes but no create/list/update tool), no get_collection, and no per-connection get for SSH, but agents can work around these via list tools.
Maintenance
Related MCP Connectors
A full backend your AI coding agent can set up over MCP
Self-hosted AI workspace: semantic RAG document search, long-term memory, and AI chat via MCP.
Private-by-default, local-first memory/context/task orchestrator for MCP apps and agents.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Related MCP Servers
- AlicenseBqualityDmaintenanceProduction-grade MCP server that gives AI agents safe access to your local dev environment: filesystem, databases, processes, and OpenAPI specs.1565 npm4MIT
- FlicenseNot gradedqualityDmaintenanceSecure local development platform that exposes controlled developer capabilities (FS, Git, search, command execution) to AI assistants via MCP with deny-by-default security and audit logging.-
- AlicenseNot gradedqualityCmaintenanceLocal-first MCP server that provides project context, verification gates, and structured tools for coding agents to discover knowledge, run diagnostics, and execute allowlisted commands within a repository.10 npmMIT
- AlicenseCqualityBmaintenanceLocal-first MCP runtime for coding agents with bounded workspace access, content-preconditioned writes, AST search, LSP navigation and diagnostics, and Git status/diff. Designed to give coding agents useful repository access without treating unrestricted shell access as the default integration boundary.133MIT