Skip to main content
Glama

Server Details

MCP server that lets your AI assistant build and deploy apps, hosting each one at a live URL.

Ownership verified
Status
Healthy
Uptime
4.2% over 77 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
Server4Agent/server4agent-mcp
GitHub Stars
0
ChatGPT
–
Claude
–

TDQS

A3.6/5.0

Scored across 34 tools

Disambiguation4/5

Tool boundaries are mostly explicit because each tool is tied to a distinct resource or lifecycle action, and descriptions clarify the tricky pairs such as start_app vs deploy, start_build vs prompt, and cleanup_project vs delete_project. Some agent/build/run lifecycle tools still overlap conceptually and require careful reading, so the set is not perfectly unambiguous.

Naming Consistency4/5

Nearly all tools follow a snake_case verb_noun pattern such as create_project, get_server, list_files, and delete_secret. A few single-verb names like deploy, exec, and prompt, plus control_server, are minor deviations but remain readable and predictable.

Tool Count2/5

At 34 tools the surface is heavy for an MCP server, even accounting for the broad platform scope. Several lifecycle and agent/build tools could be consolidated, and the count is well above a comfortable range.

Completeness4/5

The surface covers the main lifecycle for servers, projects, files, secrets, deployments, logs, templates, usage, and agent runs/builds. There are still gaps around stopping app processes independently, listing or canceling builds/runs, and some administrative operations, but core workflows are covered.

Available Tools

34 tools
attach_secretBind a secret to a scopeA
DestructiveIdempotent
Inspect

Bind a secret to a scope so runs there see it as an env var. Server-wide when only server_id is given; project-scoped when project_id is also given. Pass value to set-and-bind in one call; omit it to bind an existing secret by key. A key has one value on the account, shared everywhere it is bound: passing value here changes it for every server and project that key is bound to. Give a project that needs its own value a key of its own.

NameRequiredDescriptionDefault
keyYesEnv var name of the secret to bind. With value, the secret is created or changed in the same call.
valueNoOptional: set the value while binding. Write-only.
server_idYesThe server's id, as returned by create_server or list_servers.
project_idNoOptional. Bind to just this project instead of server-wide.

Output Schema

NameRequiredDescription
idYesSecret id. Pass it to delete_secret.
keyYesEnv var name.
maskedNoA masked hint of the value. The value itself is never returned.
created_atNoISO 8601 timestamp.
server_idsNoServers it is bound to.
updated_atNoISO 8601 timestamp.
descriptionNoNote about what it is for.
project_idsNoProjects it is bound to.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds important behavior beyond the annotations: a key has one account-wide value shared across every server and project where it is bound, and passing value changes it everywhere. It also warns that a project needing its own value requires a separate key, which is exactly the kind of consequence an agent needs before invoking a destructiveHint=true tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is four tight sentences with the primary action and scoping rules front-loaded. Every sentence adds distinct, necessary information, especially the account-wide value warning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given full schema coverage, an output schema, and annotations covering mutation/idempotency, the description supplies the missing conceptual model: binding scope, set-versus-bind behavior, and the shared account-wide value semantics. Nothing material for correct invocation appears to be missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds semantic context not obvious from the schema: value is not scoped to the single binding but mutates the account-wide key value everywhere it is bound. It also clarifies the server_id/project_id scoping relationship.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb+resource ('Bind a secret to a scope') and immediately explains the resulting behavior ('runs there see it as an env var'), distinguishing server-wide from project-scoped binding. It also distinguishes binding-only from set-and-bind in one call, making the tool's role clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit conditions for the two invocation modes: server-wide when only server_id is supplied, project-scoped when project_id is also supplied, and set-and-bind when value is passed versus binding an existing key when omitted. It does not name sibling alternatives such as set_secret, so it stops short of full 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.

cleanup_projectClean up ephemeral projectA
DestructiveIdempotent
Inspect

Clean up an ephemeral project once its task is done. Deletes the workspace, retires the slug, and frees the project slot. Errors on persistent projects; use delete_project for those.

NameRequiredDescriptionDefault
project_idYesThe project's id, as returned by create_project or list_projects.

Output Schema

NameRequiredDescription
cleaned_upYestrue once the workspace is gone and the slot is free.
project_idYesThe project that was cleaned up.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds the substance those hints lack: exactly what is destroyed (workspace, slug, project slot) and the failure mode for persistent projects. It stops short of stating irreversibility or recovery options, so it is strong rather than exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences: action and effects first, the exclusion rule last. Every clause carries information an agent needs; nothing is redundant with the title or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no explanation, and the single param is fully documented in the schema. The description covers the destructive scope and the sibling routing, leaving nothing an agent needs missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is a single parameter with 100% schema coverage, and the schema already explains that project_id comes from create_project or list_projects. The description adds no format, validation, or sourcing detail beyond that, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (clean up) plus a specific resource (ephemeral project), with concrete effects enumerated: deletes the workspace, retires the slug, frees the project slot. It also names the sibling it is not (delete_project), so an agent can distinguish it 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States the selection condition explicitly: use this once the task is done and the project is ephemeral; persistent projects error here and should go to delete_project. Both when-to-use and when-not-to-use are covered with the named alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

control_serverStart, stop, or restart serverA
Destructive
Inspect

Pause a server (stop), resume it (start), or reboot it (restart). A paused server stays down until it is started again: its projects are offline, it does not bill, and tools that reach it (prompt, exec, start_app, the file tools, start_build) answer that it is paused instead of waking it.

NameRequiredDescriptionDefault
actionYesstart resumes a paused server. stop pauses it: its projects go offline and it stops billing until started again. restart reboots it.
server_idYesThe server's id, as returned by create_server or list_servers.

Output Schema

NameRequiredDescription
idYesServer id.
statusYesLifecycle status after the action.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true; the description adds genuinely new context beyond that — projects going offline, billing stopping, and dependent tools returning a 'paused' response rather than waking the server. That last point is a non-obvious side effect an agent could not learn from the annotations or schema. It stops short of saying whether restart is disruptive to running builds or whether a paused server auto-resumes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: the first front-loads the action mapping, the second delivers the state semantics. No filler, and the most decision-relevant fact (a paused server stays down until started) is not buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 safety profile, the description gives enough to call this correctly, including the counterintuitive 'does not wake' behavior. A minor gap remains around restart-specific impact (e.g., in-flight builds or unsaved state) and whether permission requirements apply.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the enum already documents start/stop/restart semantics in nearly the same words used here ('stop pauses it', 'restart reboots it'). The description restates rather than extends that meaning, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb set (pause/stop, resume/start, reboot/restart) against a specific resource, and the parenthetical mapping to the enum values leaves no ambiguity about what the tool does. It does not explicitly distinguish itself from lifecycle siblings such as delete_server, update_server, or get_server, so the reader must infer that boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage via the consequence model (a paused server stays down until started), but never states when an agent should prefer this tool over delete_server, update_server, or when to use restart rather than a stop+start pair. The mentions of prompt, exec, start_app, file tools and start_build describe downstream effects rather than selection guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_projectCreate projectAInspect

Create a project on a server: the home for one web page, site, app, API or bot, with its own URL at .apps.server4agent.com. Projects default to private; set visibility to "public" to expose that URL. Use lifecycle="ephemeral" for one-shot work that should be cleaned up when done (call cleanup_project after); default is "persistent" for long-lived monitors / dashboards / tools. Pass template (see list_templates) to apply a starter's defaults, or a source to seed the workspace from your own code (kind git/archive); name is derived from the repo/archive when omitted. Pass secrets to set project-scoped env vars at creation (values are write-only). Explicit fields override the template. Fails if the server is at its tier's project cap. Returns listen_port, the port inside the box that this project's URL is routed to: a project serves only while a process is listening there, so bind that rather than a port of your own choosing.

NameRequiredDescriptionDefault
nameNoHuman-friendly project name. Optional when a source or template supplies one.
accessNoWho may open the URL once visibility is public. public = anyone with the link (default). team = the visitor has to sign in to Server4Agent and be a member of this account. password = anyone with the link who enters the password given in access_password, no account needed. No effect while the project is private.
sourceNoWhere to seed the workspace from. Omit for a blank project. For your own code use kind 'git' (git_url, optional ref/subdir/auth_secret) or 'archive' (archive_path).
secretsNoProject-scoped env vars to set and bind. Values are write-only.
templateNoOptional template id from list_templates (e.g. 'import-git', 'invoice-and-quote-maker'). Pre-fills name/description/visibility/lifecycle; any explicit field overrides the template's default.
lifecycleNopersistent = lives until deleted (default). ephemeral = call cleanup_project when the task is done.
server_idYesThe server's id, as returned by create_server or list_servers.
visibilityNopublic = live at the project URL; private = not publicly reachable. Defaults to private.
descriptionNoOptional one-line description.
access_passwordNoThe password visitors enter when access is password. Required with access password. At least 4 characters, so a 4 digit code works. Write-only: it is stored encrypted and never returned.

Output Schema

NameRequiredDescription
idYesProject id.
urlNoPublic URL. null while the project is private.
nameNoProject name.
noteNoSet when the project was created but its code was not set up, with what to do instead.
slugNoURL slug. Stays the same when visibility changes.
accessNoWho may open the URL once it is public.
sourceNoWhat the workspace was seeded from: kind plus git_url, ref, subdir, or archive_path.
templateNoTemplate id it was created from.
lifecycleNoephemeral projects are removed with cleanup_project.
server_idYesThe server the project lives on.
created_atNoISO 8601 timestamp.
init_phaseNoWhere bring-up has got to, for a project seeded from a source.
updated_atNoISO 8601 timestamp.
url_statusNoWhether the address and certificate are ready. Not a health check.
visibilityNopublic = live at url. private = not publicly reachable.
cert_statusNoState of the shared certificate. null while private.
descriptionNoOne-line description.
init_run_idNoThe bring-up run started for a git or archive source. Poll it with get_run.
listen_portNoThe port inside the box this project's URL is routed to.
runtime_statusNoWhether the project is running or paused.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare non-read-only, open-world, non-idempotent, non-destructive, so the description focuses on what annotations cannot express: the cap-based failure mode, secrets being write-only, template-default override precedence, and the critical operational fact that a project only serves while a process listens on `listen_port`. It does not discuss deletion/teardown reversibility beyond pointing at cleanup_project, which is a minor gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One dense paragraph, front-loaded with purpose and URL semantics before lifecycle/template/secrets details. Nearly every sentence carries distinct operational information, though the block is long enough that a reader must scan rather than parse quickly; splitting the `listen_port` note into its own line would help.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter nested-object creation tool with an output schema, the description covers the decisions the schema cannot: seeding strategy, lifecycle/cleanup pairing, template override precedence, cap failure, and the binding requirement for `listen_port`. 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, and the description earns a step up by adding rules not in the schema: name is derived from the repo/archive when omitted, explicit fields override template defaults, and secrets are write-only env vars bound at creation. The access vs visibility interplay is left to the schema, which is reasonable.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Create a project on a server") and immediately scopes what a project is: a home for one web page/site/app/API/bot with its own URL. It distinguishes itself from create_server and from list_templates by naming the prerequisite relationships explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete when-to-use routing: lifecycle="ephemeral" for one-shot work plus "call cleanup_project after", persistent as the default for monitors/dashboards; `template` when a starter exists vs `source` for your own code. It also names the failure condition (tier project cap), so the agent knows when this call will not succeed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_serverCreate serverAInspect

Provision a sized server box. Servers hold projects; each project gets a stable URL that serves once you make it public. One server holds several projects, so check list_servers for one with room before creating another. Pass secrets to set server-wide env vars (shared by every project on the server); values are write-only. Pass kind: "browser" for a box with a screen and a browser on it. Returns the server id. A new server takes about a minute to start: poll get_server until provisioning reads ready before writing files or starting apps.

NameRequiredDescriptionDefault
kindNoWhat kind of box. standard is a headless server, the default. browser adds a screen with Chrome on it, so a run can use sites that need a real browser: take a screenshot with `s4a-computer screenshot`, then click and type with `s4a-computer`. A browser box costs more to run and needs a plan that allows the medium tier.
taskNoShort nickname for the server.
tierNoSize tier. small=3 projects/5 GB, medium=10 projects/20 GB, large=unlimited projects/100 GB. Available tiers depend on your plan. Defaults to small.
regionNoWhere the box runs. Defaults to us-east.
secretsNoServer-wide env vars to set and bind. Values are write-only.
project_sharingNoWhat an agent run in one of this server's projects may do with the others on it. isolated = runs are not told the other projects exist. read = runs may read them for reference and are told not to change them. shared = runs may work across projects. Defaults to read. Guidance for runs, not a hard boundary: projects on a server share one machine.

Output Schema

NameRequiredDescription
idYesThe new server's id.
urlNoThe server's own address, when it has one.
kindNostandard = headless. browser = a box with a screen and a browser on it.
tierNoSize tier.
statusNoLifecycle status. A new box takes a minute or two to become ready.
project_sharingNoWhat a run in one project may do with the others.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint=false, openWorldHint=true), it discloses the non-obvious operational traits: roughly one minute of asynchronous provisioning that must be awaited via get_server, secrets being write-only, and the returned server id. No contradiction with the declared hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then workflow constraint, then parameter notes, then the provisioning delay — a sensible order. Slightly redundant with the schema on secrets and the browser kind, and the sentences are long, but no line is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a six-parameter, zero-required creation tool with an output schema, nothing an agent needs is missing: prerequisite check, side effects, write-only values, latency, and the readiness gate are all covered. Return shape is delegated to the output schema, as appropriate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so kind, tier, region, project_sharing, and the secrets item shape are already fully documented. The description's mentions of `secrets` (server-wide, shared by every project, write-only) and `kind: "browser"` largely restate the schema in abbreviated form, adding only the sharing scope implied by 'server-wide'. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Provision a sized server box') and immediately situates it in the object model: servers hold projects, projects get URLs. It is clearly distinguishable from create_project, get_server, and list_servers named in the text.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing logic: check list_servers for a server with room before creating another, and poll get_server until provisioning reads ready before writing files. It also names the condition that selects the browser variant, so precedence between this tool and its siblings is fully determined.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_fileDelete workspace fileB
DestructiveIdempotent
Inspect

Delete a file from the server's workspace. With project_id, path is resolved inside that project's folder; without it, path is relative to the server workspace root.

NameRequiredDescriptionDefault
pathYesFile path, e.g. "public/index.html". Relative to the project folder when project_id is given, otherwise to the server workspace root.
server_idYesThe server's id, as returned by create_server or list_servers.
project_idNoOptional. Resolve path inside this project's workspace folder instead of the server workspace root.

Output Schema

NameRequiredDescription
pathYesThe path, as given.
deletedYestrue once the file is gone.
project_idNoThe project the path was resolved in. null for the server workspace root.

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the danger profile and repeat-safety are covered structurally. The description adds only the path-resolution rule and says nothing about behavior on a missing path, permission requirements, or whether deletion is recoverable, so it contributes modestly 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the action, then the one non-obvious resolution rule. No filler and nothing repeated unnecessarily.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 destructiveness and idempotency. The path-resolution gotcha, the main source of wrong calls, is addressed; only error behavior on nonexistent files is unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the description's statement about project_id resolving path inside the project folder is essentially a restatement of the project_id and path schema descriptions. Baseline 3 applies since the schema already does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Delete a file from the server's workspace") with clear scope. It does not distinguish itself from nearby siblings such as delete_project, cleanup_project, or delete_secret, so an agent must infer the boundary between deleting a file and deleting a project/secret.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains path resolution but never says when to use this tool versus alternatives (e.g., cleanup_project for bulk removal, list_files to confirm existence). There are no prerequisites, no confirmation guidance, and no when-not-to-use clause.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_projectDelete projectA
DestructiveIdempotent
Inspect

Delete a project. The public URL stops working immediately.

NameRequiredDescriptionDefault
project_idYesThe project's id, as returned by create_project or list_projects.

Output Schema

NameRequiredDescription
deletedYestrue once it is gone.

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint and idempotentHint, so the safety profile is covered. The description adds a concrete, user-visible consequence beyond the annotations: 'The public URL stops working immediately,' which tells the agent the effect is instantaneous and externally observable. It stops short of saying whether nested resources (files, secrets, deployments) are also removed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with zero filler, and the effect is front-loaded right after the action. Nothing to trim.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists and annotations cover destructiveness, so the description only needs the essential effect, which it provides. The remaining gap is cascade scope — whether deleting a project also destroys its files, secrets, and servers — which matters for a destructive tool in a suite with many child resources.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter and schema description coverage is 100%, with the schema already explaining where project_id comes from. The description adds no syntax, format, or constraint information beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Delete a project') that unambiguously identifies the operation. It does not distinguish itself from the sibling cleanup_project, which is the most plausible alternative an agent could confuse it with.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this instead of cleanup_project, no prerequisites (ownership/permissions), and no warning about when not to use it. The agent must infer everything from the name and the destructive annotation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_secretDelete a secretA
DestructiveIdempotent
Inspect

Delete a secret and all of its bindings.

NameRequiredDescriptionDefault
secret_idYesThe secret's id, from list_secrets.

Output Schema

NameRequiredDescription
deletedYestrue once it is gone.

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds information annotations cannot express — that all of the secret's bindings are destroyed alongside it — which is exactly the kind of blast-radius context an agent needs. It stops short of saying whether deletion is recoverable or what permissions are required.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the verb and resource, with zero filler. The destructive scope detail is attached to the action rather than buried later.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the annotations carry the safety profile for this single-parameter tool. The one real gap is that irreversibility and the downstream effect on anything using those bindings are not spelled out.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single parameter's description already tells the agent to obtain the id from list_secrets. The tool description adds nothing about the parameter, but with full schema coverage the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource ('Delete a secret') with the added scope detail that bindings are removed too. It is clearly distinguishable from set_secret, attach_secret, and list_secrets, though it does not name any sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this versus alternatives (e.g., detaching a binding vs. deleting the secret), no prerequisites, and no warning about when not to call it. The only usage signal is the implied 'call this to remove a secret.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_serverDelete serverA
DestructiveIdempotent
Inspect

Tear down a server and every project on it.

NameRequiredDescriptionDefault
server_idYesThe server's id, as returned by create_server or list_servers.

Output Schema

NameRequiredDescription
deletedYestrue once it is gone.

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=true, and openWorldHint=false, so safety semantics are covered. The description's real contribution is disclosing the cascade — every project on the server is destroyed — which is not derivable from annotations or schema and is exactly the fact an agent must know before calling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, zero waste, front-loaded with the action and immediately qualified by its blast radius. Nothing extraneous and nothing buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need no explanation, and annotations carry the destructive/idempotent profile. The cascade is covered; only irreversibility/confirmation expectations and any permission requirements are left implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with a single required server_id whose description already explains provenance (create_server or list_servers). The description adds nothing about the parameter, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb ("tear down") paired with a specific resource ("server"), plus the critical scope detail that all projects on the server go with it. It is clearly distinct from delete_project or cleanup_project, though it never names them explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States no conditions for use, no preconditions, and no alternatives. An agent must infer on its own when to prefer this over cleanup_project or delete_project, and whether confirmation or a prior get_server check is expected.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

deployDeploy to a live URLAInspect

Deploy a project to its live public URL at .apps.server4agent.com: the last step in putting a web page, site, app or API online. Checks that something in the project is listening on its listen_port, makes the project public, and checks its URL answers, then returns that URL with status live (or publishing, when it is public but has not answered yet). It builds and starts nothing: when nothing is listening it refuses and leaves the project as it was, so start the app first with start_app (after write_file, for code you write yourself), or have the on-server agent build and start it with start_build or prompt. Pass project_id; a server with exactly one project deploys that one without it.

NameRequiredDescriptionDefault
server_idYesThe server's id, as returned by create_server or list_servers.
project_idNoThe project to deploy. Optional when the server has exactly one project.

Output Schema

NameRequiredDescription
urlYesThe project's public URL.
nameNoProject name.
noteNoWhat to do next, in a sentence.
accessNoWho may open the URL.
statusYeslive = public and answering. publishing = public but not answering yet: deploy again shortly.
project_idYesThe deployed project.
visibilityNoAlways public after a deploy.
listen_portNoThe port the app listens on.
published_nowNoWhether this call made the project public. false if it already was.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (openWorldHint, non-idempotent, non-destructive), it discloses the exact preflight checks (listen_port, making the project public, URL answering), the two possible statuses returned (live vs publishing), and the failure semantics (refusal with no state change). This is exactly the behavioral context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the verb, the resource, and the resulting URL before any caveats, and every clause carries information. It is dense and somewhat run-on with stacked colons and parentheticals, costing a bit of scannability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers preconditions, side effects, failure mode, and workflow ordering for a non-idempotent, open-world mutation. Even though an output schema exists, the description's status explanation reinforces what success looks like without redundant detail.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters are already documented at baseline. The line 'Pass project_id; a server with exactly one project deploys that one without it' restates what the schema's project_id description already says, adding emphasis but no new semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (deploy) and resource (a project to its live public URL), and concretely describes the outcome URL pattern. It explicitly positions itself against start_app, start_build, and prompt, so an agent can distinguish it from siblings without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use (last step in putting a site online), when-it-won't-work (nothing listening on listen_port → refuses and leaves project unchanged), and named alternatives plus ordering (start_app after write_file, or start_build/prompt). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

execRun a shell commandA
Destructive
Inspect

Run a shell command on the server and return its output. Pass project_id to run inside that project's workspace folder, with PORT set to the project's routed port; omit it to run at the server workspace root. For one-off work: installing dependencies, building, inspecting files. Runs as the workspace user, the same one the agent and the apps run as, so what it creates stays editable by both; prefix a command with sudo when it needs root. A project command also gets the project's secrets as env. The command's session ends with the call, so do not use it to start an app or any other long-running process: use start_app, which keeps it running, brings it back after a restart, and tells you whether it answered. Output comes back for about 20 seconds: a command that runs longer keeps going on the server, but its output does not return, and the server's other commands wait for it. Start long work (a big install, a long build) in the background with its output in a file, then read the file.

NameRequiredDescriptionDefault
commandYesThe shell command to run, e.g. "npm install" or "ls -la".
server_idYesThe server's id, as returned by create_server or list_servers.
project_idNoOptional. Run the command inside this project's workspace folder instead of the server workspace root.

Output Schema

NameRequiredDescription
stdoutYesWhat the command printed, stdout and stderr together.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the destructive/openWorld annotations: execution user, sudo requirement, project secrets injected as env, session lifetime tied to the call, the ~20s output window, and the blocking side effect on other commands. These are exactly the traits an agent would otherwise learn by failing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: purpose, project_id behavior, intended uses, then the critical timeout and long-running caveats. The last two sentences are long and would read better as separate short rules, but nothing is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need no explanation; the description instead covers the operational facts that schema can't convey – timeouts, blocking, environment, permissions, and the correct pattern for long work.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3; the description adds real meaning for project_id by explaining the workspace folder, the PORT variable it sets, and the secrets it exposes. server_id and command get no extra detail, but the schema already covers them.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Run a shell command on the server and return its output') and immediately distinguishes the two modes via project_id. It also explicitly separates itself from start_app, so an agent can route correctly without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names concrete intended tasks (installing dependencies, building, inspecting files) and an explicit exclusion with the alternative ('do not use it to start an app... use start_app, which keeps it running'). The when-not is paired with the reason and the sibling that handles it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

export_projectExport project to a bundleA
Idempotent
Inspect

Package a project into a portable bundle and return a time-limited download link. The bundle carries the project's source tree, its settings, its run plan, and the NAMES of the env vars it needs. Left out: dependency caches, git history, and any .env or credential file in the workspace, so the bundle never carries a secret value. Hand the file to import_project on this deployment or any other Server4Agent deployment to recreate the project there.

NameRequiredDescriptionDefault
project_idYesThe project's id, as returned by create_project or list_projects.
ttl_secondsNoHow long the download link stays valid. Defaults to 24 hours, up to 7 days.

Output Schema

NameRequiredDescription
envNoEnv vars the project needs. Names only, never values.
urlYesTime-limited download link for the bundle. Anyone holding it can fetch it.
bytesNoBundle size.
filenameNoThe bundle's file name.
expires_atNoWhen the link stops working, ISO 8601.
project_idYesThe exported project.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations, the description discloses exactly what is included and excluded from the bundle, including security-relevant behavior: dependency caches, git history, .env files, and credential files are never included. It also explains the time-limited link and portability across deployments, which are meaningful behavioral details not captured by the annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, front-loaded with the core action and return value, followed by security exclusions and the import handoff. Every sentence adds useful information without repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the description need not explain return values in detail. It still covers inclusion/exclusion rules, security constraints, link behavior, and cross-deployment compatibility, leaving no major gap for an agent to call the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both project_id and ttl_seconds are already documented in the input schema. The description mentions a time-limited link but does not add syntax or format details beyond the schema's default and maximum ttl behavior. Baseline 3 is appropriate when the schema carries parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: it packages a project into a portable bundle and returns a time-limited download link. It also distinguishes the output from import_project by explaining the bundle's intended handoff, so an agent can identify the tool without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly states the downstream use case: hand the bundle to import_project on this or another Server4Agent deployment. It does not explicitly say when not to use export_project, but the import context strongly implies the intended workflow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_buildGet build statusA
Read-only
Inspect

Get a build's status. The steps move together: running while the run works, done when it finished, failed when it did not (status still reads completed, and error says why). url is the project's address once it is built and public. run_id is the run doing the work: get_run shows its live progress, and when run_status is awaiting_input, answer its question with prompt and follow_up_of set to that run_id.

NameRequiredDescriptionDefault
build_idYesThe build_id returned by start_build.
server_idYesThe server's id, as returned by create_server or list_servers.

Output Schema

NameRequiredDescription
urlNoThe project's address once it is built and public.
errorNoWhy the build failed. null unless it did.
stepsYesThe stages in order.
run_idNoThe agent run doing the work. Follow it with get_run.
statusYesBuild status. completed with a failed step means it failed: see error.
questionNoWhat the run is asking, when it is awaiting_input.
artifactsNoWhat the build produced.
run_statusNoThat run's status.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds genuinely useful state semantics beyond the readOnly/non-destructive annotations: a failed build still reports status 'completed' with error explaining why, and url only appears once built and public. These edge cases are exactly what an agent would otherwise misread. It does not cover auth or freshness/refresh expectations, keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose is front-loaded, but the remaining text is a dense run-on that mixes status vocabulary, URL timing, and run linkage in one breath; 'The steps move together' is unclear on first read. Every clause carries information, yet the packing hurts scanability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return structure need not be explained, and the description still covers the non-obvious state model and the build-to-run linkage. For a two-param read tool this is sufficient, with only minor gaps like whether repeated polling is expected.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so build_id and server_id are already fully documented as inputs, and the description adds no format or constraint detail for them. Its extra explanation is about output fields (url, run_id, status), which does not raise input-parameter clarity above the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get a build's status') and immediately frames the linked run so the agent can distinguish this from get_run, which it names explicitly. The status vocabulary (running/done/failed) further pins down what is being retrieved.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Routes the agent to get_run for live progress and to prompt with follow_up_of when run_status is awaiting_input, which is real when-to-use guidance. It stops short of stating exclusions (e.g., when to prefer get_run over get_build entirely), so it is strong but not fully exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_download_urlGet file download linkAInspect

Mint a time-limited link to download one file from the server's workspace, e.g. after generating a report or converting a file, hand this URL back to the user instead of the raw content. With project_id, path is resolved inside that project's folder. The link needs no login and works for anyone who has it, so only mint it for files that are OK to share.

NameRequiredDescriptionDefault
pathYesFile path, e.g. "public/index.html". Relative to the project folder when project_id is given, otherwise to the server workspace root.
server_idYesThe server's id, as returned by create_server or list_servers.
project_idNoOptional. Resolve path inside this project's workspace folder instead of the server workspace root.
ttl_secondsNoOptional. Link lifetime in seconds. Default 86400 (24h), max 604800 (7 days).

Output Schema

NameRequiredDescription
urlYesThe link. Anyone holding it can download the file without signing in.
pathYesThe path, as given.
expires_atNoWhen the link stops working, ISO 8601.
project_idNoThe project the path was resolved in. null for the server workspace root.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds security-critical behavior beyond annotations: the link is time-limited, requires no login, and works for anyone holding it. The explicit warning to only mint shareable files gives the agent the access-control implications that openWorldHint alone does not convey. This is exactly the contextual disclosure annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the core action, followed by the project-scoping nuance and the sharing caveat. Every sentence earns its place with no repetition of the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 100% schema coverage, a non-trivial annotation set, and an output schema, the description supplies everything the agent needs: purpose, invocation context, scoping behavior, and the security implication of the returned URL. No material gap remains.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description's note that path resolves inside a project's folder when project_id is given restates what the schema already documents, and it adds no new syntax or format detail for ttl_seconds or server_id.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Mint') and resource ('time-limited link to download one file from the server's workspace'), and implicitly distinguishes itself from content-reading siblings via 'hand this URL back to the user instead of the raw content'. It also gives concrete usage examples (after generating a report or converting a file).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context for when to use ('after generating a report or converting a file') and a safety-based when-not ('only mint it for files that are OK to share'). The alternative is only implied ('instead of the raw content') rather than explicitly naming read_file, so it falls just short of a full when/when-not/alternatives rubric.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_logsGet server logsA
Read-only
Inspect

Read the latest log tails from a server: one entry per log file that a project's processes have written (each long-running process appends to .server4agent/.log in its project folder). Read live from the server at the moment you call. If the server does not answer in time (starting, restarting, or paused), you get the tails saved earlier with stale: true and a note saying how old they are. An app keeps the same log file across restarts. Pass project_id to get only that project's logs. Use this to debug a crashing app or check what a background process is doing.

NameRequiredDescriptionDefault
linesNoMax tail lines per file (default 200, max 1000).
server_idYesThe server's id, as returned by create_server or list_servers.
project_idNoOptional. Only log files from this project's workspace folder.

Output Schema

NameRequiredDescription
noteNoWhy the tails are stale and how old they are. null when they are live.
filesYesOne entry per log file.
staleYesfalse when the tails were read from the server at this call. true when it could not be read, so they are the copy saved at updated_at, which can be days old.
updated_atNoWhen the log tails were read. null when the server has reported none yet.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/non-destructive annotations, it discloses that reads are live at call time, that a non-responsive server yields cached tails with stale: true and an age note, and that logs persist across restarts. This is exactly the failure-mode context an agent needs that annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action and return shape before the caveats about staleness and usage. Dense with information and largely waste-free, though the parenthetical path detail could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description need not explain return values, and annotations cover the safety profile. It nonetheless covers the one thing structured fields cannot: degraded/stale behavior when the server is unavailable. Nothing needed to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so the field-level meaning is already documented, but the description adds purpose-level semantics for project_id (narrowing to one project's workspace logs) and clarifies the entry-per-log-file return shape. It adds modest value above the schema baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (read) and resource (latest log tails from a server), and precisely defines the unit of return: one entry per log file written by a project's processes. The log file path convention (.server4agent/<name>.log) further concretizes what is being read, distinguishing it from generic file-reading siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit use cases: debug a crashing app or check what a background process is doing, and explains the project_id narrowing behavior. It does not explicitly name alternative siblings (exec, read_file) or state when not to use it, so it stops 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.

get_projectGet project detailsA
Read-only
Inspect

Get a single project: name, slug, description, public URL, listen port, run plan, timestamps. listen_port is the port inside the box that this project's URL is routed to, so an app here binds that rather than a port of its own choosing, and has to be running for the URL to answer. listen_port is null on a project created before the field existed, and on a box old enough to predate the in-pod proxy the published port (8080) is reached directly instead, so treat those two as the fallback when an app that binds listen_port still cannot be reached. url_status covers only whether the address and its certificate are ready, so it reads "active" for a public project with nothing listening; it is not a health check. run_plan is how bring-up installs and starts it, or null if no plan has been settled yet; a run_plan whose port is null means the project isn't a server.

NameRequiredDescriptionDefault
project_idYesThe project's id, as returned by create_project or list_projects.

Output Schema

NameRequiredDescription
idYesProject id.
urlNoPublic URL. null while the project is private.
nameNoProject name.
slugNoURL slug. Stays the same when visibility changes.
accessNoWho may open the URL once it is public.
sourceNoWhat the workspace was seeded from: kind plus git_url, ref, subdir, or archive_path.
run_planNoHow bring-up installs and starts the project: stack, install, start, port, env, notes. null until one is settled.
templateNoTemplate id it was created from.
lifecycleNoephemeral projects are removed with cleanup_project.
server_idYesThe server the project lives on.
created_atNoISO 8601 timestamp.
init_phaseNoWhere bring-up has got to, for a project seeded from a source.
updated_atNoISO 8601 timestamp.
url_statusNoWhether the address and certificate are ready. Not a health check.
visibilityNopublic = live at url. private = not publicly reachable.
cert_statusNoState of the shared certificate. null while private.
descriptionNoOne-line description.
listen_portNoThe port inside the box this project's URL is routed to.
runtime_statusNoWhether the project is running or paused.

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuinely non-obvious behavioral context: url_status is explicitly not a health check, listen_port can be null on legacy projects requiring the published 8080 fallback, and run_plan may be unsettled. These caveats prevent real misinterpretation, though error/not-found behavior is unaddressed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is correctly front-loaded in one clean sentence, but it is followed by a dense three-part exposition on output-field semantics that reads as documentation for the return payload rather than the tool call. Every clause is factual, yet the block is long and unstructured relative to a one-parameter read.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description need not explain return values, yet it goes further and clarifies the traps in those values, which makes it more than complete on that axis. The remaining gap is failure modes and whether listing alternatives exist, which for a simple single-resource read is minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single project_id parameter is fully documented as coming from create_project or list_projects. The description adds nothing about the parameter itself, so baseline 3 applies with the schema doing all the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb and resource and enumerates the exact fields returned (name, slug, description, URL, listen port, run plan, timestamps). It is unambiguous about what the tool does, but it never contrasts itself with siblings like list_projects or get_run, so the agent must infer the distinction from the name alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the required project_id and the schema note that ids come from create_project or list_projects hint at the retrieval workflow. There is no explicit statement of when to call this versus list_projects for a batch, nor what to do when the project is missing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_runGet run statusA
Read-only
Inspect

Get a run's status, its latest progress note, the agent's final response, and what it changed in the workspace (commit, branch, files). Poll this with the run_id returned by prompt or init_project.

NameRequiredDescriptionDefault
run_idYesThe run_id returned by prompt, init_project or start_build.
server_idYesThe server's id, as returned by create_server or list_servers.

Output Schema

NameRequiredDescription
logNoLatest progress note while it runs.
goalNoWhat the run was asked to do.
usageNoWhat it cost: cost_usd, token counts, turns, duration_ms.
changeNoWhat it changed in the workspace: commit, branch, merge_commit, files_changed, insertions, deletions, files.
resultNoThe agent's final response.
run_idYesRun id.
statusYesRun status.
questionNoWhat it is asking, when status is awaiting_input. Answer with prompt and follow_up_of.
server_idYesThe server it ran on.
created_atNoISO 8601 timestamp.
project_idNoThe project whose folder it worked in. null at the server root.
message_typeNoWho wrote the goal: user, or a system run such as bring-up.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, so the safety profile is covered. The description adds genuinely non-redundant behavior: this is a polling endpoint and the response is a snapshot including workspace mutations, not just a boolean status.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler, and the highest-value facts (what you get back, then how to poll it) are front-loaded in that order.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return-value explanation is optional; combined with 100% parameter coverage and annotations covering safety, this description leaves nothing an agent needs for correct invocation. Polling semantics are the one extra piece of intent that structured fields can't express, and they are stated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already documented; baseline 3 applies. The description restates the run_id provenance but drops start_build from the list the schema gives, adding no meaning beyond the schema and introducing a minor inconsistency.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb+resource ("get a run's status") and enumerates the four payload components returned: status, latest progress note, final response, and workspace changes (commit, branch, files). It is clear enough to distinguish from get_build/get_logs by payload, though it never names those siblings explicitly, so a 4 rather than a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Poll this with the run_id returned by prompt or init_project" gives a concrete usage pattern (repeated polling) and identifies the upstream call that produces the identifier. It stops short of saying when to prefer get_build or get_logs instead, so no explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_serverGet server detailsB
Read-only
Inspect

Get a server's tier, kind, status, capacity, project count, and project sharing. kind is standard for a headless box or browser for one with a screen and a browser on it.

NameRequiredDescriptionDefault
server_idYesThe server's id, as returned by create_server or list_servers.

Output Schema

NameRequiredDescription
idYesServer id.
urlNoThe server's own address, when it has one.
kindNostandard = headless. browser = a box with a screen and a browser on it.
taskNoThe server's nickname.
tierNoSize tier.
regionNoWhere the box runs.
statusNoLifecycle status, e.g. running or stopped.
project_capNoMost projects the tier holds.
provisioningNoLive provisioning phase: creating, provisioning, ready, or error. null until a box exists.
project_countNoProjects on the server now.
storage_cap_gbNoStorage the tier allows, in GB.
project_sharingNoWhat a run in one project may do with the others.
storage_used_gbNoStorage in use, in GB.
credits_used_usdNoAI spend on this server, in USD.
provisioning_messageNoDetail from the compute backend about the provisioning phase.

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description contributes interpretation help for one returned field (kind: 'standard' for headless vs 'browser' for a screen), but says nothing about error behavior, missing servers, or freshness of capacity/project counts.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, both earning their place: the first front-loads what is retrieved, the second disambiguates an otherwise opaque field value. 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.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A read-only getter with one fully documented parameter and an output schema, so return structure needn't be re-explained. The description is sufficient to call it correctly; only usage routing against list_servers is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With a single parameter at 100% schema coverage, the schema already fully documents server_id including where to obtain it (create_server or list_servers). The 'kind' explanation describes a response field rather than a parameter, so it adds no parameter-level meaning. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Get') plus a resource ('a server') and enumerates the exact attributes returned (tier, kind, status, capacity, project count, project sharing), so it is clearly distinct from list_servers and get_project. It stops short of naming siblings or stating the single-server vs. list distinction explicitly, which keeps it out of the top band.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no mention of how this differs from list_servers or update_server, and no stated prerequisite such as needing a server that already exists. Usage is only inferable from the name and required server_id.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_usageGet spend & budgetA
Read-only
Inspect

Get the account's AI spend and budget: how much has been spent this billing period, the plan's included credits, any budget cap, and whether new tasks are blocked (with the reason). Call this before a long series of prompts to check remaining budget, since dispatch fails once a spend ceiling is reached. Only agent runs stop: write_file, exec, start_app and deploy keep working, so the code can still be written and run by hand.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
planNoThe account's plan.
reasonNoWhy tasks are blocked: budget_cap, credits_exhausted, or ai_disabled (agent tasks turned off for this account).
blockedYesWhether new tasks are refused right now.
serversNoServers on the account.
projectsNoProjects on the account.
bonus_usdNoRemaining one-time welcome credit, in USD.
spend_usdNoAI spend this billing period, in USD.
budget_cap_usdNoYour own budget cap, or null when none is set.
hard_limit_usdNoThe lowest ceiling that blocks new tasks, or null.
overage_allowedNoWhether the plan allows billable spend past its credits.
included_credits_usdNoAI credits the plan includes, in USD.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered; the description goes well beyond that by disclosing the failure mode (dispatch fails at the ceiling) and precisely which operations are blocked versus unaffected. That is exactly the kind of operational context annotations cannot express.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with what is returned, then the when-to-call guidance, then the blast-radius detail. Every sentence carries information, though the trailing list of unaffected tools is slightly verbose relative to the core message.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 re-explained, and the description still covers the operational semantics an agent needs: when to call, why it matters, and what breaks versus what keeps working. Nothing material is missing for a zero-parameter read tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes no parameters, so the baseline is 4 and there is nothing for the description to disambiguate. The enumerated output fields are a bonus that helps the agent interpret results, though the output schema already covers them.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get the account's AI spend and budget') and then enumerates exactly what is returned: spend this period, included credits, budget cap, and blocked status with reason. No sibling tool in the list touches billing or budget, so the agent can route here unambiguously.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger ('Call this before a long series of prompts to check remaining budget') and the reason ('dispatch fails once a spend ceiling is reached'). It also scopes the consequence — only agent runs stop, while write_file, exec, start_app and deploy keep working — so the agent knows when the check matters and when it does not.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

import_projectImport project from a bundleAInspect

Recreate a project on a server from a bundle that export_project produced, here or on another Server4Agent deployment. Pass the bundle base64 encoded in bundle; large bundles are better uploaded from the dashboard, since the request body has a size limit. The new project is always private, gets its own slug and URL, and starts bringing itself up right away (the bundle only reaches the server as part of that run). Env vars the bundle names are bound only where this account already holds a value, and no .env file travels: the result lists what is still missing in missing_env, and the app will not run until you set those with set_secret.

NameRequiredDescriptionDefault
nameNoName the project here. Defaults to the name in the bundle.
bundleYesThe export file, base64 encoded.
server_idYesThe server's id, as returned by create_server or list_servers.

Output Schema

NameRequiredDescription
idYesProject id.
urlNoPublic URL. null while the project is private.
nameNoProject name.
slugNoURL slug. Stays the same when visibility changes.
accessNoWho may open the URL once it is public.
sourceNoWhat the workspace was seeded from: kind plus git_url, ref, subdir, or archive_path.
templateNoTemplate id it was created from.
warningsNoAnything about the bundle worth knowing.
bound_envNoEnv vars bound from secrets this account already holds.
lifecycleNoephemeral projects are removed with cleanup_project.
server_idYesThe server the project lives on.
created_atNoISO 8601 timestamp.
init_phaseNoWhere bring-up has got to, for a project seeded from a source.
updated_atNoISO 8601 timestamp.
url_statusNoWhether the address and certificate are ready. Not a health check.
visibilityNopublic = live at url. private = not publicly reachable.
cert_statusNoState of the shared certificate. null while private.
descriptionNoOne-line description.
exported_atNoWhen the bundle was made, ISO 8601.
init_run_idNoThe bring-up run that unpacks and starts it. Poll it with get_run.
listen_portNoThe port inside the box this project's URL is routed to.
missing_envNoEnv vars still unset. Set them with set_secret before the app will run.
imported_fromNoThe deployment the bundle was exported from.
runtime_statusNoWhether the project is running or paused.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover safety flags, yet the description discloses the resulting state (always private, new slug and URL, build starts immediately), the env-var binding rule, the absence of a .env file, and the blocking condition that the app won't run until secrets are set. That is substantial behavior beyond structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then size caveat, then post-conditions, then env-var semantics. Every clause carries operational information; nothing is padding despite the length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a non-idempotent, open-world write with an output schema present, the description covers the full lifecycle of the call: input constraint, side effects, resulting visibility, and the follow-up action required before the app runs. An agent can invoke it correctly and know what to do next.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaning: bundle must be base64 and is subject to a body size limit with a better path for large bundles, and name falls back to the bundle value. server_id gains no extra context beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Recreate a project on a server from a bundle') and immediately ties it to the producing sibling, export_project. That pairing makes it unmistakable versus create_project or init_project without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes large bundles to the dashboard upload path due to request-body size limits, and directs the agent to set_secret afterward for missing env vars. What's missing is an explicit statement of when to prefer create_project over import, though the bundle prerequisite implies it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

init_projectStart a project's bring-upA
Destructive
Inspect

Start or resume bring-up for a project seeded from a git/archive source: the on-server agent installs dependencies, starts the app, and confirms it responds. Returns a run_id to poll with get_run. Set proceed to true to continue past still-missing optional secrets. Not for a project whose files you wrote yourself: start that one with start_app.

NameRequiredDescriptionDefault
proceedNoContinue even if some discovered secrets are still unset.
project_idYesThe project's id, as returned by create_project or list_projects.

Output Schema

NameRequiredDescription
init_phaseNoWhere bring-up has got to.
project_idYesThe project being brought up.
init_run_idNoThe bring-up run. Poll it with get_run.

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds real context beyond annotations: the agent-side install/start/verify sequence and the run_id return path. But annotations declare destructiveHint=true and idempotentHint=false, and the description never says the bring-up mutates server state or that re-invoking restarts rather than resumes cleanly — the 'start or resume' phrasing arguably softens the non-idempotent trait without explaining it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with purpose, then routing, then the polling pointer — minimal waste. The middle sentence packs several claims but each earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists and the description still points to get_run for polling, so return handling is covered. The main gap is that the destructive/non-idempotent profile from annotations is not elaborated, which matters for a tool that installs packages and starts processes on a server.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters are already documented. The description restates proceed ('continue past still-missing optional secrets') with only the added nuance that the secrets are optional, and adds nothing for project_id beyond the schema's pointer to create_project/list_projects.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Start or resume bring-up for a project') and enumerates what the operation actually does: installs dependencies, starts the app, confirms it responds. It also distinguishes itself from the closest sibling by name ('Not for a project whose files you wrote yourself: start that one with start_app').

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-to-use ('seeded from a git/archive source'), an explicit when-not-to-use with the alternative tool named ('start_app'), and a follow-up action ('poll with get_run'). The proceed flag condition is also stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_filesList workspace filesA
Read-only
Inspect

List paths in the server's workspace. Pass project_id to list only that project's folder (paths come back relative to the project); omit it to list the whole server workspace.

NameRequiredDescriptionDefault
server_idYesThe server's id, as returned by create_server or list_servers.
project_idNoOptional. List only this project's workspace folder; returned paths are relative to the project.

Output Schema

NameRequiredDescription
filesYesFile paths.
project_idNoThe project the paths are relative to. null for the server workspace root.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds genuinely new behavior information: that omitted project_id widens the scope to the entire server workspace and that returned paths are relative to the project — a non-obvious output nuance. It stops short of noting any listing limits or pagination.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero waste, with the scoping rule front-loaded ahead of the optional-parameter explanation. Nothing is repeated or padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With only two well-documented parameters, full annotation coverage, and an output schema handling return values, the description covers nearly everything an agent needs. A minor gap remains around whether the listing recurses into subdirectories or has any size/limit behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters are already documented, and the description's explanation of project_id largely restates the schema text. The one added nuance is the contrast between project-relative and whole-workspace listing, which is the baseline-plus credit for a fully covered schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb+resource ('List paths in the server's workspace') and immediately scopes the behavior via project_id, so an agent knows exactly what this returns. It does not explicitly name a sibling tool to differentiate from (e.g., list_projects or read_file), which keeps it just short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a concrete conditional rule: pass project_id for one project's folder, omit it for the whole workspace. However, it offers no guidance on when to reach for this tool versus alternatives like list_projects, list_servers, or read_file — usage is implied rather than stated against the sibling set.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_projectsList projectsA
Read-only
Inspect

List projects. Optionally filter by server_id to see what's already on a particular server before creating a new one.

NameRequiredDescriptionDefault
server_idNoOptional. If provided, only projects on that server are returned.

Output Schema

NameRequiredDescription
projectsYesMatching projects.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, and an output schema exists, so the description's burden is light. It adds a workflow intent (pre-create inspection) but says nothing about result volume, ordering, or pagination.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero filler, with the core action front-loaded and the filter rationale immediately after.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single optional-parameter read tool with full annotation coverage and an output schema, the description is sufficient to call it correctly. Only minor gaps remain around return set size and ordering.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the server_id description already states 'Optional. If provided, only projects on that server are returned.' The tool description restates the same filtering behavior with intent rather than adding format or semantics beyond the schema. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("List projects") and adds the scope of the optional filter. It doesn't contrast itself with get_project or list_servers, so an agent must infer the boundary from names alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The second sentence gives a concrete use case for the filter — checking what already exists on a server before creating a new project — which implicitly points to create_project. No explicit when-not or exclusion guidance is offered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_secretsList secretsA
Read-only
Inspect

List the account's secrets: keys, notes, and where each is bound (servers/projects). Never returns values; only a masked hint.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
secretsYesThe account's secrets.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so safety is covered structurally. The description adds genuinely new behavioral information beyond that: it never returns secret values, only a masked hint — a critical disclosure that prevents the agent from assuming it can retrieve usable credentials.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences: the first defines scope and returned fields, the second front-loads the most important safety fact ('Never returns values'). No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return structure needn't be explained, and the description still contributes the masked-hint caveat. The only gap is pagination/ordering behavior, which matters for a listing tool but is minor here.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate. The description correctly implies a full account-wide listing with no filtering options.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List the account's secrets') and enumerates what is returned (keys, notes, bindings to servers/projects). This clearly separates it from set_secret/delete_secret/attach_secret, though it never names a sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the verb 'List'; there is no explicit 'use this when...' or pointer to an alternative tool. For a no-parameter listing tool this is adequate, but it leaves the agent to infer the trigger condition.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_serversList serversA
Read-only
Inspect

List your servers with their tier, kind, status, project sharing, and current project count. kind is standard for a headless box or browser for one with a screen and a browser on it.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
serversYesYour servers.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so safety is covered. The description adds the returned field set and decodes the 'kind' values ('standard' vs 'browser'), which is useful domain context beyond the annotations, but says nothing about ordering, pagination, or what an empty result means.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core action and field list, with the glossary sentence appended where it is needed. No filler, though the kind sentence is slightly terse in phrasing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description needn't document return structure, and it still summarizes the fields. For a zero-param read tool with full annotations, it is essentially complete; only result-ordering details are absent, which is minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so per the baseline this is a 4. The kind explanation pertains to a returned value rather than an input parameter, so it neither helps nor hurts this dimension.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource and enumerates the fields returned (tier, kind, status, sharing, project count), which is more informative than the bare title. It doesn't explicitly contrast with get_server, but the list-vs-fetch distinction is implied clearly enough.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the verb 'List'; there is no statement of when to call this versus get_server for a single server or list_projects. The kind glossary hints at interpreting results but offers no selection guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_templatesList project templatesA
Read-only
Inspect

List the available project starters. Each template has an id, a human label, a one-line description, default visibility/lifecycle, and a source_kind. The first entries are import templates (source_kind "git" or "archive") that seed a project from your own code; the rest are ordinary starters (source_kind null). Pass the id as template to create_project to pre-pick sensible defaults for that use case.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
templatesYesAvailable project starters.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds genuinely behavioral context beyond that: it discloses the ordering convention (import templates first), the source_kind values that distinguish them, and that no filtering is available — information an output schema alone would not convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, front-loaded with purpose and then the entry taxonomy, ending with the actionable next step. The enumeration of fields (id, label, description, visibility, lifecycle) is mildly redundant with the output schema, which is the only real slack.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A zero-parameter read-only tool with an output schema and full annotation coverage needs exactly this: what it returns, how to read the ordering, and what to do with the result. Nothing an agent needs in order to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so baseline is 4. The description does not invent phantom parameters and correctly frames the returned `id` as the value to feed into create_project's `template` argument, linking the two tools' parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("List the available project starters") and immediately characterizes what a template is, separating it from the sibling list_projects which returns actual projects. An agent can distinguish 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete downstream use: pass the id as `template` to create_project to pre-pick defaults. That is clear context for when to call it, though it states no exclusions or conditions under which a different tool would be preferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

promptPrompt the on-server agentA
Destructive
Inspect

Send a freeform prompt to the on-server agent. It plans, writes code, runs commands, and ships whatever the prompt asks for. It spends the account's AI budget, so use it when the user asks for the on-server agent or to continue a run it started; to build something yourself, write_file, exec, start_app and deploy cost nothing. Returns a run_id to poll with get_run. Each call starts a new conversation unless you pass follow_up_of: the run_id of an earlier run to continue, so the agent remembers what it did there. Use it to answer a run that is awaiting_input, or to ask for changes to what a run built. Pass project_id to work inside one project's workspace, or omit it to work across the whole server workspace (e.g. scaffolding a new project).

NameRequiredDescriptionDefault
promptYesWhat you want the agent to do, in plain language. The more specific, the better the result.
server_idYesThe server's id, as returned by create_server or list_servers.
project_idNoOptional. Scope the run to this project's workspace folder. Omit to run at the server workspace root. Not needed with follow_up_of, which runs where the earlier run did.
follow_up_ofNoOptional. The run_id of an earlier run on this server to continue. The agent picks up that conversation, in the same folder and project. The result's resumed is false when there was no conversation left to pick up: the agent then works in the same folder without that memory.

Output Schema

NameRequiredDescription
run_idYesThe run. Poll it with get_run.
statusYesRun status.
resumedNoWhether the earlier conversation was picked up. false means the same folder, without that memory.
project_idNoThe project whose folder it works in. null at the server root.
follow_up_ofNoThe earlier run this one continues, when follow_up_of was passed.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already flag destructive and openWorld, and the description adds substantive context beyond them: it spends the account's AI budget, it returns a run_id to poll with get_run, each call starts a fresh conversation unless follow_up_of is passed, and project scoping behavior. That async, stateful, cost-bearing profile is exactly what an agent needs and is not derivable 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core action and cost warning are front-loaded, and every sentence carries information. It is on the long side at six sentences, and the project_id/follow_up_of guidance partly duplicates schema descriptions, but nothing is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a non-idempotent, destructive, open-world tool with four parameters, the description covers cost, async polling via get_run, conversation continuity, and scoping. An output schema exists, so omitting return-value detail is appropriate, and it still names run_id and resumed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description goes further by explaining the consequence of omitting project_id (whole-server workspace, e.g. scaffolding a new project) and the conversational semantics of follow_up_of (memory is retained, and a run continues where the earlier one ran). These are effects, not restatements of the schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (send a freeform prompt to the on-server agent) and then enumerates the agent's capabilities (plans, writes code, runs commands, ships). It explicitly contrasts itself with the manual siblings write_file, exec, start_app and deploy, so an agent can separate this tool from them without reading any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use conditions: when the user asks for the on-server agent, to continue a run it started, to answer a run awaiting_input, or to request changes to what a run built. It also gives a when-not rule (build it yourself with the free tools) and names those alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_fileRead workspace fileA
Read-only
Inspect

Read a file from the server's workspace. With project_id, path is resolved inside that project's folder; without it, path is relative to the server workspace root. Use encoding:"base64" for binary files (e.g. .xlsx, images); plain text mode will corrupt non-text bytes.

NameRequiredDescriptionDefault
pathYesFile path, e.g. "public/index.html". Relative to the project folder when project_id is given, otherwise to the server workspace root.
encodingNoOptional, default "utf8". Use "base64" to read a binary file without corrupting it: the returned content is base64-encoded.
server_idYesThe server's id, as returned by create_server or list_servers.
project_idNoOptional. Resolve path inside this project's workspace folder instead of the server workspace root.

Output Schema

NameRequiredDescription
pathYesThe path that was read.
contentYesThe file's contents. Base64 encoded when encoding is base64.
encodingYesHow content is encoded.
project_idNoThe project the path was resolved in. null for the server workspace root.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, and closed-world scope, so the safety profile is covered. The description adds real behavioral value beyond that by warning that plain-text mode will corrupt non-text bytes — a failure mode no annotation encodes. It stops short of covering error behavior for missing files.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, each carrying distinct information (scope, path resolution, binary handling), with the primary purpose front-loaded. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists, so return values needn't be described. With four params, full schema coverage, and an output schema, the remaining burden on the description is path resolution and binary safety — both are present. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 earns an extra point by explaining the interaction between project_id and path resolution, which is the one semantic subtlety not obvious from the fields alone. The encoding advice also reinforces the enum's purpose.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Read a file from the server's workspace') and immediately scopes it to the workspace, which cleanly separates it from siblings like list_files and write_file. An agent knows exactly what it retrieves without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete conditional guidance: supply project_id to resolve inside a project folder, omit it for the workspace root, and use base64 for binary files. It doesn't mention using list_files first to discover paths, but the core when/how conditions are explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_secretSet a secretA
DestructiveIdempotent
Inspect

Create or update a secret (an env var, key → value) on the account. One secret per key; setting an existing key updates its value. Values are write-only: never returned by any tool. Use attach_secret to bind it to a server or project.

NameRequiredDescriptionDefault
keyYesEnv var name (letters, digits, underscore).
valueYesThe secret value. Write-only.
descriptionNoOptional note about what it's for.

Output Schema

NameRequiredDescription
idYesSecret id. Pass it to delete_secret.
keyYesEnv var name.
maskedNoA masked hint of the value. The value itself is never returned.
created_atNoISO 8601 timestamp.
server_idsNoServers it is bound to.
updated_atNoISO 8601 timestamp.
descriptionNoNote about what it is for.
project_idsNoProjects it is bound to.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=true, and idempotentHint=true, and the description is consistent with all three. It adds real context beyond them: upsert semantics (one secret per key, setting an existing key overwrites its value) and a security trait not encoded anywhere else — values are write-only and never returned by any tool. Auth/permission requirements are the main omission.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences with the core action and resource first, then the upsert rule, then the write-only constraint, then the sibling pointer. No filler and no repetition of the title or schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and all three parameters documented in the schema, the description covers everything an agent needs: what it writes, overwrite behavior, that values can't be read back, and how to make the secret usable. Nothing material is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, and the description still adds meaning: the key is unique and re-setting it mutates rather than duplicates, and the value is unrecoverable. Those are behavioral implications the schema's terse field descriptions don't convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb pair and resource ("Create or update a secret") plus a concrete definition of the resource ("an env var, key → value") on an explicit scope (the account). It also disambiguates the create-vs-update behavior in the same breath, which an agent can use to tell it apart from attach_secret, list_secrets, and delete_secret.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the follow-up step: "Use attach_secret to bind it to a server or project," which is the main ambiguity an agent would have with a sibling named attach_secret. It doesn't address when to prefer delete_secret or list_secrets, but the create/update vs bind distinction is the one that matters for correct selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

start_appStart or restart a project's appA
DestructiveIdempotent
Inspect

Start a project's app and keep it running: the step that puts a project online after its files are written. Runs command in the project folder as a background process with PORT set to the project's routed port (the app must listen on PORT), records it so it comes back after a restart, and waits up to about 10 seconds for the port to answer. Calling it again with the same name restarts it, which is how you pick up changed code. Returns whether the app is answering, its log tail, and the URL. A project's URL serves only while its visibility is public, so set that with update_project when the app should be reachable. For static files, put them under public/ and serve that folder, e.g. "python3 -m http.server $PORT --bind 0.0.0.0 --directory public". Never serve the project folder itself, which holds the project's secrets in .server4agent/env.

NameRequiredDescriptionDefault
nameNoOptional, default "web": the app the URL serves. Give a second process (a worker, a queue consumer) its own name so starting it leaves the web app alone. Lowercase letters, digits, - and _.
commandYesWhat starts the app, run from the project folder, e.g. `node server.js` or `npm start`. It must stay in the foreground (no trailing &) and listen on $PORT.
project_idYesThe project's id, as returned by create_project or list_projects.

Output Schema

NameRequiredDescription
urlNoPublic URL. null while the project is private.
nameNoThe app's name. web is the one the URL serves.
notesNoAnything worth acting on, e.g. the project is private.
accessNoWho may open the URL once it is public.
statusYesrunning = answering (or not a server). starting = not answering yet.
log_tailNoThe end of the app's log.
listeningYesWhether something answered on the port.
project_idYesThe project.
visibilityNoThe project's visibility.
listen_portNoThe port the app has to listen on.
restart_commandNoThe line recorded so the app comes back after a restart.
replaced_previousNoWhether a running copy was stopped and replaced.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial context beyond the annotations: background process execution with PORT injected, persistence across restarts, a ~10 second port-readiness wait, what is returned (answering state, log tail, URL), and the visibility prerequisite for the URL to serve. It also carries a genuine safety warning that serving the project folder would expose .server4agent/env secrets, which directly explains the destructive/open-world profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads what the tool does and how it behaves, then moves to caveats and the security warning at the end. It is dense but long; the static-file example and URL-visibility note are justified, though the paragraph could be broken into shorter units for faster scanning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers prerequisites (files written, visibility public via update_project), execution semantics, timing expectations, and restart behavior; an output schema exists so the description need not detail return values beyond its one-line mention. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so the baseline is 3, but the description adds semantics the schema does not: the name field controls restart identity and isolating a worker from the web app, and the command must run in the foreground without a trailing & and bind to the injected PORT. It repeats the 'web' default rather than adding to it, keeping it from a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Start a project's app') plus its lifecycle meaning ('the step that puts a project online after its files are written') and that re-invocation restarts. An agent can distinguish it from write_file, exec, and deploy without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear sequencing cues (use after files are written; call again with the same name to pick up changed code) and a concrete static-file recipe. It does not explicitly say when to prefer this over sibling alternatives like exec or deploy, so it stops short of full 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.

start_buildStart a buildA
Destructive
Inspect

Have the on-server agent build a web page, site, app or API from a plain-language goal. Use it only when the user asks for that agent: it counts against the AI budget like prompt, and you can write the code yourself with write_file, exec and start_app, then deploy. Starts an agent run that works through each stage in order: plan, scaffold, write the code, install, build and test, then start it on the project's port. Returns a build_id to poll with get_build, and the run_id of the run doing the work. Pass project_id to build inside that project's workspace folder, then deploy it to put the result online; omit project_id to build at the server workspace root.

NameRequiredDescriptionDefault
goalYesWhat to build, in plain language, e.g. "a page that turns a CSV upload into a chart".
server_idYesThe server's id, as returned by create_server or list_servers.
project_idNoOptional. Target this project's workspace folder instead of the server workspace root.

Output Schema

NameRequiredDescription
run_idNoThe agent run doing the work. Follow it with get_run.
statusYesBuild status.
build_idYesThe build. Poll it with get_build.
project_idNoThe project it builds in. null at the server root.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare non-read-only, destructive, open-world, non-idempotent, so the safety profile is covered. The description still adds real value: the staged pipeline (plan, scaffold, write, install, build, test, start on project's port), the budget consumption, and the polling contract with get_build. It does not say what on-disk state a build may overwrite despite destructiveHint=true, which keeps it below a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and the usage gate, then lifecycle, return values, and parameter behavior in a logical order. It is dense and runs long in a single block, with the project_id guidance partly duplicating the schema, but no sentence is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, open-world agent-launching tool, the description covers cost, pipeline stages, return values (build_id, run_id), polling target, and the project-vs-root branching. An output schema exists, so return-value explanation need not be exhaustive, and nothing required to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all three parameters are already documented, including project_id's workspace-folder behavior. The description largely restates that and adds only the workflow hint that a project build is followed by deploy; it offers no additional format or constraint detail. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Have the on-server agent build a web page, site, app or API from a plain-language goal') and immediately names the sibling alternatives (write_file, exec, start_app, deploy) that do the same job manually. An agent can distinguish this from prompt or deploy without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-to-use gate ('Use it only when the user asks for that agent') plus the cost signal ('counts against the AI budget like prompt') and the do-it-yourself fallback. This is exactly the routing information an agent needs before choosing between start_build and prompt/exec.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_projectUpdate projectA
DestructiveIdempotent
Inspect

Rename a project, update its description, change visibility, link access or lifecycle, or correct its run plan. The slug + URL stay the same. Setting run_plan only records how the project should be brought up; call init_project when you want it rebuilt.

NameRequiredDescriptionDefault
nameNoNew project name. The slug and URL do not change.
accessNoWho may open the URL. public = anyone with the link. team = sign-in required, and only for members of this account. password = anyone who enters the password set with access_password, no account needed. Switching away from password discards the password.
run_planNoHow this project installs and starts, as returned by get_project. Replaces the stored plan wholesale, so send every field you want kept. Set port to null when the project isn't a server (a library, a CLI, a batch job): bring-up then installs it and stops, instead of trying to serve it.
lifecycleNopersistent = lives until deleted. ephemeral = remove it with cleanup_project when its task is done.
project_idYesThe project's id, as returned by create_project or list_projects.
visibilityNopublic = live at the project URL. private = not publicly reachable. The slug and URL stay the same either way.
descriptionNoNew one-line description.
access_passwordNoSet or change the password for access password. Required when switching to password unless one is already set; send it alone to change the password, which signs out everyone who used the old one. At least 4 characters, so a 4 digit code works. Write-only: it is stored encrypted and never returned.

Output Schema

NameRequiredDescription
idYesProject id.
urlNoPublic URL. null while the project is private.
nameNoProject name.
accessNoWho may open the URL once it is public.
run_planNoHow bring-up installs and starts the project.
lifecycleNoephemeral projects are removed with cleanup_project.
updated_atNoISO 8601 timestamp.
visibilityNopublic = live at url. private = not publicly reachable.
descriptionNoOne-line description.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructive=true and idempotent=true. The description adds non-obvious behavior beyond the schema: the slug and URL do not change on rename or visibility change, and run_plan is a stored intention rather than an action. What is actually destroyed by the destructive hint (e.g. wholesale run_plan replacement, password invalidation) is left to the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, the operation scope first and the run_plan/init_project caveat second. Nothing redundant; every clause carries distinct information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and fully documented parameters, the description only needs to convey scope and the run_plan caveat, which it does. Minor gap: the destructive nature of wholesale run_plan replacement and password invalidation isn't surfaced at the top level, though the schema covers it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the parameter descriptions are richer than the summary text (e.g. the access enum semantics, port rules, password behavior). The description mostly restates the field list, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (update/rename/change) plus resource and an enumeration of the mutable facets: name, description, visibility, access, lifecycle, run plan. It also explicitly distinguishes itself from init_project, so an agent can tell the two apart 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States clearly that setting run_plan only records intent and that init_project should be called when a rebuild is wanted, which is a real routing decision. It does not, however, cover other nearby alternatives (deploy, start_app, update_server) or when not to update at all.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_serverUpdate serverC
DestructiveIdempotent
Inspect

Update a server's nickname, region, or how much its projects may see of each other.

NameRequiredDescriptionDefault
taskNoNew nickname for the server.
regionNoNew region for the server.
server_idYesThe server's id, as returned by create_server or list_servers.
project_sharingNoWhat an agent run in one of this server's projects may do with the others on it. isolated = runs are not told the other projects exist. read = runs may read them for reference and are told not to change them. shared = runs may work across projects. Defaults to read. Guidance for runs, not a hard boundary: projects on a server share one machine. Applies to the next run.

Output Schema

NameRequiredDescription
idYesServer id.
taskNoThe server's nickname.
regionNoWhere the box runs.
project_sharingNoWhat a run in one project may do with the others.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true; the description adds no behavioral context such as what gets disrupted or that project_sharing only applies to the next run bakes the fact that the update is not retroactively applied. That crucial timing detail lives only in the schema, so the description contributes nothing beyond structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no padding. Slightly under-specified rather than verbose, but structurally sound.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema and full annotation set carry much of the burden, so the tool is callable. Still, the description omits the delayed-effect behavior of project_sharing and uses a field name that doesn't match the schema, leaving avoidable ambiguity for a destructive mutation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already documents server_id, region, and the project_sharing semantics in detail. The description only loosely paraphrases the fields and its 'nickname' phrasing actually diverges from the schema's 'task' parameter, so it adds no meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (update) and resource (server) and enumerates the affected fields, which separates it from siblings such as update_project or control_server. The one weakness is the loose field label 'nickname', which does not match the actual parameter name 'task'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No indication of when to use this versus alternatives like control_server or get_server, and no prerequisites such as needing the server_id from list_servers. The agent must infer usage entirely.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

write_fileWrite or overwrite fileA
DestructiveIdempotent
Inspect

Write or overwrite a file in the server's workspace. With project_id, path is resolved inside that project's folder; without it, path is relative to the server workspace root. Use encoding:"base64" to write binary content (e.g. a generated .xlsx); plain text mode assumes UTF-8 and will corrupt binary bytes. One call carries up to 512 KB of content; write anything larger in pieces, or fetch it on the server with exec. Writing a file does not serve it: a project's URL is answered by a running app, so after writing the files call start_app (a changed server needs start_app again to pick the change up).

NameRequiredDescriptionDefault
pathYesFile path, e.g. "public/index.html". Relative to the project folder when project_id is given, otherwise to the server workspace root.
contentYesThe file's full contents. Base64 encoded when encoding is base64.
encodingNoOptional, default "utf8". Set "base64" when content is base64-encoded binary data.
server_idYesThe server's id, as returned by create_server or list_servers.
project_idNoOptional. Resolve path inside this project's workspace folder instead of the server workspace root.

Output Schema

NameRequiredDescription
pathYesThe path, as given.
writtenYestrue once the file is written.
encodingNoHow content was decoded.
project_idNoThe project the path was resolved in. null for the server workspace root.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial context beyond annotations: the overwrite risk, the 512 KB per-call limit, encoding corruption warnings, and the non-obvious fact that writing does not serve a project until start_app runs. These behavioral traits are exactly what annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded, with the core action first and constraints/follow-up after. It is fairly dense with several distinct clauses, but each sentence carries actionable information, so little is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with an output schema, the description covers the safety profile, size limits, encoding, path resolution and the start_app follow-up. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so the schema already documents parameters, but the description adds value by explaining the binary-corruption rationale for base64 and path resolution relative to project vs workspace root. It reinforces and slightly exceeds the schema's own descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Write or overwrite a file') and scopes it to the server's workspace, distinguishing it from read_file, delete_file and list_files. An agent can tell exactly what it does and its overwrite semantics without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use base64 vs utf8, when to split large content (512 KB cap, or fetch via exec), and critically routes the agent to start_app after writing files. It names alternatives and the conditions that select them.

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.

  1. 5 tool updates
    • Changedget_run1 field changed
      • changedInput schema / properties / run_id / description
        Previous value: -"The run_id returned by prompt, init_project, start_build, or start_tuning."New value: +"The run_id returned by prompt, init_project or start_build."
    • Removedget_tuning_session
    • Removedlist_tuning_sessions
    • Removedreport_tuning_result
    • Removedstart_tuning
  2. 38 tool updates
    • First observedattach_secret
    • First observedcleanup_project
    • First observedcontrol_server
    • First observedcreate_project
    • First observedcreate_server
    • First observeddelete_file
    • First observeddelete_project
    • First observeddelete_secret
    • First observeddelete_server
    • First observeddeploy
    • First observedexec
    • First observedexport_project
    • First observedget_build
    • First observedget_download_url
    • First observedget_logs
    • First observedget_project
    • First observedget_run
    • First observedget_server
    • First observedget_tuning_session
    • First observedget_usage
    • First observedimport_project
    • First observedinit_project
    • First observedlist_files
    • First observedlist_projects
    • First observedlist_secrets
    • First observedlist_servers
    • First observedlist_templates
    • First observedlist_tuning_sessions
    • First observedprompt
    • First observedread_file
    • First observedreport_tuning_result
    • First observedset_secret
    • First observedstart_app
    • First observedstart_build
    • First observedstart_tuning
    • First observedupdate_project
    • First observedupdate_server
    • First observedwrite_file

Publisher details

Operator
Server4Agent · Publisher source
Vendor relationship
Not applicable
Trust center
Not applicable
Restrictions
Not applicable

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.