Skip to main content
Glama

Server Details

Build and publish full-stack web and mobile apps on Floot from any MCP client. Building is free.

Ownership verified
Status
Healthy
Uptime
92.0% over 55 days
OAuth
Works in Glama
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A3.9/5.0

Scored across 45 tools

Disambiguation4/5

Most tools have sharply delineated purposes, aided by unusually explicit descriptions (query_database vs execute_sql, read_file vs read_files, run_code_in_vm vs run_code_in_browser). However, several overlapping clusters exist: search vs search_code vs list_projects, upload_asset vs request_user_upload vs generate_image vs card_upload_asset, and list_resources vs provision_resource vs request_external_resource. These boundaries are documented but still require careful reading to pick correctly.

Naming Consistency4/5

The dominant convention is consistent snake_case verb_noun (add_dependency, create_project, get_logs, rename_file, delete_file). Minor deviations are bare verbs like fetch, search, typecheck, and noun-ish forms (upload_asset, request_user_upload), but these remain readable and clearly related to their resource.

Tool Count3/5

45 tools is heavy and sits in the 'too many' band for a single server. The surface spans files, dependencies, database, deployment, resources, assets, previews and code execution, so most tools earn their place, but the breadth makes the set hard to scan and invites selection errors.

Completeness5/5

Coverage is very thorough: full file lifecycle (read/list/write/edit/patch/delete/rename/copy), dependency management, DB read/write plus schema pull, publish/unpublish/status, resource provisioning and external credential requests, asset upload/generation, code execution in both VM and browser, testing and typechecking. Very few obvious dead ends, aside from no project-deletion or project-rename operation.

Available Tools

45 tools
add_dependencyAdd DependencyInspect

Add npm packages to the project (validated against Floot's supported set — rejected packages get a supported alternative named; some versions are pinned/substituted). Avoid node-gyp/native packages (exception: sharp is supported, auto-pinned), WASM modules, and packages bundling large binaries (e.g. ffmpeg/ffprobe); pure JS/TS preferred. A bare kysely keeps the version the project already records (a project without one gets 0.28.17), the version its db/schema helpers are written against; pass an explicit kysely@<version> only when upgrading it deliberately. Installs on the project VM and persists resolved versions. After a slow install completes as a job, call add_dependency again with the same packages — the second call is fast and persists.

ParametersJSON Schema
NameRequiredDescriptionDefault
packagesYes
projectIdYes
apply_patchApply PatchAInspect

Apply a V4A patch to a Floot project — create and update multiple files in ONE atomic operation. Format: "*** Begin Patch" envelope with "*** Add File: path" (+ prefixed lines) and "*** Update File: path" (hunks: optional "@@ anchor" locator, space-prefixed context, -/+ lines, optional "*** End of File"), then "*** End Patch". Paths follow the Floot item scheme (see read_file). To replace a file wholesale use Add File on its own path; the item's other files (e.g. its .module.css) are kept. This tool does not delete or rename: "*** Delete File:" sections are skipped and listed in the result (delete_file removes files), and "*** Move to:" is rejected (rename_file renames items and rewrites their importers). Every applied patch is recorded in the project history and can be reverted. Keep each patch MODEST (a few files / few hundred lines): chat clients cap per-message output, and a patch cut off mid-way is rejected whole ("missing *** End Patch") — split big changes across several apply_patch calls.

ParametersJSON Schema
NameRequiredDescriptionDefault
patchYes
projectIdYes
expected_versionNo

TDQS

A4.3/5.0
Behavior4/5

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

Very rich disclosure beyond the annotations: atomicity, that unmatched Delete/Move sections are skipped or rejected rather than applied, that history records and revert is possible, and that truncated patches fail as a whole. The annotations only say readOnly=false/destructiveHint=false/openWorld=false, so this added context is genuinely informative; it stops short of describing the response shape or conflict behavior.

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

Conciseness4/5

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

One dense paragraph, but the most decision-relevant facts (verb, atomicity, patch format, then limitations, then size cap) are front-loaded and each sentence carries operational weight; length is justified by the format's complexity, though it could be broken into clearer blocks.

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 complex mutation tool with no output schema, the description covers format, atomicity, failure modes, undo, and size limits, and hints at result content (skipped sections are 'listed in the result'). The remaining gap is the undocumented expected_version parameter and the absence of a conflict/version-mismatch explanation.

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 0% for 3 parameters, and the description thoroughly documents the syntax of the `patch` string value (envelope, Add File/Update File hunks, anchors, End of File) but never mentions projectId or expected_version, the latter being an optimistic-concurrency control an agent could easily mis-set.

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 ('Apply a V4A patch to a Floot project') plus the key scope ('create and update multiple files in ONE atomic operation'), which immediately separates it from single-file siblings like write_file and edit_file.

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 routes the agent away from the wrong tools: Delete File sections are skipped and delete_file is named as the alternative, Move to is rejected in favor of rename_file, Add File on the same path is given as the wholesale-replace idiom, and oversized changes are told to be split across calls.

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

cancel_requestCancel RequestA
Destructive
Inspect

Withdraw a pending request you created — a credential request from request_external_resource, a custom-domain setup request from publish_app, or an open screenshot job from screenshot_preview (jobId from that tool). Only pending requests can be cancelled — completed ones are final — and cancelling is final too: a cancelled request can't be resumed (the user would need a new one). Use when the user says to stop or they don't want to proceed.

ParametersJSON Schema
NameRequiredDescriptionDefault
jobIdYes
projectIdYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is known. The description adds substantive context beyond that: the operation is irreversible and non-resumable, the user must create a new request, and only pending (not completed) requests qualify. It doesn't cover auth/permission requirements, which keeps it just 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-loads the verb and the three request sources, then layers constraints and the use case, so the critical routing information appears first. It is slightly dense with em-dash clauses but every sentence carries 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?

For a destructive mutation with no output schema and no annotations covering reversibility, the description supplies the missing essentials: what is being destroyed, that it is final, preconditions, and the triggering user intent. The unexplained projectId parameter is the main remaining gap.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must carry the full explanatory burden. It hints that jobId originates from screenshot_preview ('jobId from that tool'), but that parenthetical is ambiguous for the credential/custom-domain cases, and projectId is never explained at all. Half the parameters remain undocumented in both schema and description.

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 (withdraw/cancel) and resource (a pending request), and enumerates exactly the three request sources it operates on — request_external_resource, publish_app, screenshot_preview — naming sibling tools directly. An agent can distinguish this from other mutation tools 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 clear context for use ('when the user says to stop or they don't want to proceed') and preconditions ('only pending requests can be cancelled'). It stops short of naming alternate tools for genuinely different situations, but the operation is narrow enough that this is minor.

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

card_upload_assetUpload Card BridgeAInspect

Internal bridge for the upload card (not for agents — use request_user_upload / upload_asset). phase 'presign' mints the PUT URL for the picked file; phase 'complete' verifies the object landed and finishes the request_user_upload call with the publicUrl.

ParametersJSON Schema
NameRequiredDescriptionDefault
jobIdYes
phaseYes
file_nameNo
projectIdYes
size_bytesNo
content_typeNo

TDQS

A3.9/5.0
Behavior3/5

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

Annotations provide readOnlyHint=false and destructiveHint=false, so the description does not need to repeat safety traits. The description adds the two-phase behavioral context (minting PUT URL, verifying landing, finishing request_user_upload) which is useful. However, it does not disclose side effects, permissions, or error behaviors beyond that. For a tool with these annotations, this is adequate but not rich.

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

Conciseness4/5

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

The description is concise and front-loaded with the critical warning that it is not for agents, then explains both phases efficiently. Every sentence earns its place, though it could be structured slightly clearer by separating the exclusion from the functional description.

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?

With 6 parameters, no output schema, and zero param descriptions, an agent would struggle to invoke this correctly without additional hints. The description does clarify the purpose and phases, but leaves parameter semantics and return behavior unexplained. Given its explicit exclusion from agent use, the incompleteness is partially mitigated, but as a tool definition it is not fully complete for an agent that might still attempt it.

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

Parameters2/5

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

Schema description coverage is 0%, so the description carries the full burden for parameter explanation. It mentions the 'picked file' and phases, but does not explain jobId, projectId, file_name, size_bytes, or content_type. The phase parameter is described indirectly ('presign'/'complete' roles) but not the others. The description fails to compensate for the lack of schema 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?

The description clearly states that this is an internal bridge for the upload card and explicitly warns it is not for agents, directing them to request_user_upload / upload_asset. It also details the two phases ('presign' and 'complete') with specific actions, making its function unambiguous and distinguishing it from siblings.

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?

The description explicitly states when not to use this tool ('not for agents') and names the alternatives (request_user_upload / upload_asset). It also explains the two-phase usage flow, giving practical guidance on how the tool operates, which fully addresses when and when not to invoke it.

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

copy_fileCopy FileAInspect

Copy one or more items to new names (e.g. {from:'components/Card', to:'components/BigCard'}). Item names without extensions; same type only. Importers of the source are left unchanged. Pass several copies to apply them in one call.

ParametersJSON Schema
NameRequiredDescriptionDefault
copiesYes
projectIdYes
expected_versionNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false and destructiveHint=false, so the description is not responsible for those basics. It adds valuable behavioral information: 'Importers of the source are left unchanged' clarifies a non-obvious side effect, and 'same type only' sets an important constraint. This goes beyond the annotations without contradicting them.

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 two sentences with no wasted words. It front-loads the core purpose with an example, then covers constraints and batching efficiently. Every sentence 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?

For an operation that copies multiple items, the description covers the main behavioral details: naming rules, type constraints, side effects on importers, and batch invocation. The schema handles parameter structure. There is no output schema, so return values need not be explained. Minor gaps like error handling or directory recursion are not critical for an agent to call this 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 description coverage is 0%, so the description must compensate. It explains the semantics of 'from' and 'to' through the example and the naming rules, and clarifies that 'copies' is an array applied in one call. However, it omits any context for 'expected_version' and 'projectId', which are also required. The description adds some meaning but does not fully cover all parameters.

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 clearly states it copies items to new names, with a concrete example. It distinguishes itself from siblings like rename_file by explicitly noting that importers of the source are left unchanged, which is a key differentiating behavior. It also adds constraints ('same type only', 'without extensions') that define scope precisely.

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 provides clear context: 'Importers of the source are left unchanged' implies that rename_file would be the alternative if importers should be updated, and 'Pass several copies to apply them in one call' gives batching guidance. However, it does not explicitly name an alternative tool or state when not to use it, leaving a small gap.

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

create_checkpointCreate CheckpointAInspect

Create a NAMED checkpoint — a labeled restore point the user sees in the project's Checkpoints panel and can revert to later. All file/dependency changes since the previous checkpoint are grouped under it. Call this AFTER completing a coherent unit of work (a feature, a fix, a requested change set) — not after every file write. Give it a short user-meaningful title describing what was accomplished (e.g. 'Added login page with email auth'), optionally a description with detail. No-op when nothing changed since the last checkpoint. Restoring a checkpoint reverts code and project config only — database rows, uploaded assets and published deployments are not rolled back.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes
projectIdYes
descriptionNo

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only convey readOnlyHint=false and destructiveHint=false, but the description adds substantial behavioral context: it groups file/dependency changes, no-ops when nothing changed, and clarifies the restore scope (code/config only, not DB/assets/deployments). This goes well beyond the annotations' minimal mutation hints.

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 front-loaded with the primary purpose and key constraints, then expands on timing, no-op behavior, and restore scope. Every sentence adds valuable information without redundancy. It is appropriately sized for a tool with 3 parameters and no output 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?

The description covers what the tool does, when to use it, parameter semantics, behavioral edge cases (no-op, restore scope), and even provides a title example. No output schema exists, so explaining the return value is not required. There is no missing information an agent would need 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 0%, but the description compensates by explaining the title parameter ('short user-meaningful title describing what was accomplished') and description (optional detail). The required projectId is only implied through 'the project's Checkpoints panel,' not explicitly defined. Given that two of three params are meaningfully described and projectId is self-evident, this is a solid score.

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 states a specific verb ('Create') and resource ('a NAMED checkpoint — a labeled restore point'), and clearly distinguishes it from sibling file-operation tools by framing it as a checkpoint for grouping changes. It also specifies the user-facing panel, leaving no ambiguity about what the tool does.

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 instructs when to call: 'AFTER completing a coherent unit of work (a feature, a fix, a requested change set) — not after every file write.' It also gives a no-op condition and implies that other tools handle the actual file changes. This is strong usage guidance with a clear positive and negative directive.

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 new Floot project (pre-seeded with the shared component library) and return its id. initial_prompt describes the app to build — what it does and for whom — keeping the user's own wording where they gave one rather than a summary. It becomes the project's system prompt (static/__dev/system-prompt.md, which the user can edit) and grounds the project (served back as in list_files). The result renders a live preview card for the user and includes the first-build playbook: a fresh project is EMPTY until pages are written, so a session normally continues straight into get_guides("design") and the first page rather than ending at the card.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
initial_promptYesA description of the app to build, in the user's own wording where they gave one. Stored as the project's system prompt.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare the safety profile (not read-only, not destructive, not open-world). The description goes well beyond: it discloses that projects are pre-seeded with a shared component library, that initial_prompt becomes an editable system prompt on disk, that it is served back as <project-instructions>, that a preview card renders, and critically that a fresh project is EMPTY until pages are written.

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 value in the first clause, then layers the prompt semantics and workflow guidance. Dense but nearly every sentence carries information; the closing playbook sentence is long yet genuinely actionable.

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 no output schema, the description carries the return burden and does so (id plus live preview card). Combined with the prompt-grounding and empty-project details, an agent has everything needed to call 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 50% (only initial_prompt is documented). The description compensates strongly for that parameter — it explains what the prompt should contain (app purpose and audience, preserving user wording), where it is stored, and how it grounds the project — though the `name` parameter remains unexplained 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?

States a specific verb+resource ('Create a new Floot project') and immediately distinguishes it from siblings like list_projects by naming the returned artifact (the id) and the pre-seeding behavior.

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?

Explains the workflow context — a session normally continues into get_guides("design") and writing the first page rather than ending at the preview card. It gives clear when-to-use context but does not spell out when NOT to create a project or name a specific alternative tool.

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

delete_fileDelete FileA
Destructive
Inspect

Delete a project file. Deleting an item's main code file (e.g. components/Foo.tsx) removes the whole item including its css/tests; deleting an aux file (e.g. Foo.module.css) only clears that part.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
projectIdYes
expected_versionNo

TDQS

A4/5.0
Behavior4/5

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

Annotations already provide destructiveHint=true, so the agent knows it's destructive. The description adds valuable behavioral detail beyond that: it explains cascading effects (deleting main code file removes css/tests; aux file only clears that part). This is significant context that annotations don't cover. It does not mention permissions or reversibility, but given destructiveHint is explicit, this is adequate. No contradiction found.

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

Conciseness5/5

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

Two clear sentences with no filler. The critical nuance (cascading deletion) is front-loaded after the main verb. Every sentence adds value; no redundancy or irrelevant details.

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 destructive delete tool, the description covers the key side effects (cascading behavior) that an agent must know to avoid accidental harm. It does not explain return values or error conditions, but since there is no output schema and the tool is destructive, the pragmatic aspects are well covered. The main gap is parameter semantics (especially expected_version), but overall it's sufficient for safe 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?

Schema has 0% description coverage, meaning the description must compensate for parameters. The description mentions 'project file' and distinguishes between main and aux files, which maps partially to the 'path' parameter. However, it does not explain 'expected_version' (likely for optimistic concurrency) or 'projectId' purpose, which are not obvious. Since parameters are few (3) and two are required, the baseline is 3; description provides some but not full compensation.

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 clearly states the tool deletes a project file and specifies a verb-resource pair, distinguishing it from siblings like copy_file, rename_file, and edit_file. It also covers a key aspect: deleting an item's main code file removes the whole item; this adds a specific behavioral nuance that differentiates it from generic deletion. However, it doesn't explicitly name alternative tools (e.g., 'to remove dependencies use remove_dependency'), so it's slightly below 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?

The description explains when the tool is appropriate: deleting files, and crucially, clarifies the consequences for main vs. aux files (removing whole item vs. part). This context is useful for deciding whether to delete a file versus editing it or using a different tool. However, it does not explicitly state when NOT to use it (e.g., when the file is a dependency, use remove_dependency) or list alternatives, so it's not a 5.

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

edit_fileEdit FileAInspect

Replace old_string with new_string in a project file. old_string must match the current content exactly (including whitespace) and be unique unless replace_all is set. Prefer this over write_file for changes to existing files.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
new_strNo
old_strNo
projectIdYes
new_stringNo
old_stringNo
replace_allNo
expected_versionNo

TDQS

A3.8/5.0
Behavior3/5

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

It discloses the two most operationally important behaviors: old_string must match current content exactly (including whitespace) and must be unique unless replace_all is set. But it is silent on the expected_version parameter's conflict-locking behavior and on failure modes (e.g., what happens when old_string is not found or is non-unique without replace_all). With only readOnlyHint/destructiveHint annotations carrying no safety meaning, the description bears the burden and covers the core but not the conflict semantics.

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 with no filler; the core purpose is front-loaded, the matching constraint follows, and the sibling routing closes it. Every sentence earns its place, though the version/conflict behavior gap means it is not maximally packed.

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?

For a tool with 8 parameters, 0% schema coverage, and no output schema, the description covers the editing semantics well but leaves meaningful gaps: expected_version behavior, failure/error behavior, and the duplicated str/string parameter ambiguity are all unexplained. An agent could call it correctly for the happy path but would not know how it handles version mismatches or non-unique matches.

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 0%, so the description must compensate. It explains old_string, new_string, and replace_all meaningfully. However, it omits expected_version (a version-locking guard that likely carries conflict semantics) and projectId/path, and it does not resolve the schema's confusing duplication of old_str/new_str versus old_string/new_string — a real hazard for an agent choosing parameters.

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 names a specific verb ('Replace... with...') and a precise resource ('a project file'), and it explicitly distinguishes itself from the sibling write_file by instructing agents to prefer it for changes to existing files. This gives an agent enough to separate it from write_file 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?

It gives explicit guidance — 'Prefer this over write_file for changes to existing files' — which routes the agent correctly for the modification case. However, it does not mention apply_patch, another sibling capable of file modification, nor state the when-not-to case (new files) explicitly, though that is cleanly implied.

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

execute_sqlExecute SQL (Writes)A
Destructive
Inspect

Run a WRITE SQL statement against the project's Postgres database (the Floot-managed one, or an external Postgres the user connected) — CREATE/ALTER TABLE, INSERT, UPDATE, DELETE, DROP, migrations. Destructive statements are allowed but your MCP client will show the user the SQL and ask them to approve it (they can allow once or for the session). Schema-changing statements (CREATE/ALTER/DROP of tables, types, …) automatically re-pull the typed schema helper and return the updated schema — no separate pull_database_schema call needed. Pass database only if the project has more than one. The query runs in a single transaction by default; set no_transaction for statements that cannot run inside a transaction block (VACUUM, CREATE INDEX CONCURRENTLY, …). Queries are killed after 90 seconds either way.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
databaseNo
projectIdYes
no_transactionNoRun the statement without a wrapping transaction — required for VACUUM, CREATE INDEX CONCURRENTLY, and other statements Postgres rejects inside a transaction block.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and openWorldHint=true, but the description adds critical operational context: the user-approval flow, automatic schema helper re-pull on DDL, default single-transaction wrapping, and a 90-second kill timeout. This is exactly the behavioral detail 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-loaded with the core purpose and statement types, then layers operational details. It is dense and somewhat long, but nearly every sentence earns its place by conveying approval, transaction, or timeout behavior.

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 no output schema, the description itself closes the loop by explaining that schema-changing statements return the updated typed schema. Transaction handling, timeout, multi-DB selection, and approval are all covered, leaving no significant gaps for a high-risk write 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?

Schema coverage is only 25% (just no_transaction documented), so the description must compensate. It explains `database` semantics (needed only for multi-database projects) and reinforces `no_transaction`, though `projectId` and the `query` string itself receive no explicit elaboration.

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+resource ('Run a WRITE SQL statement against the project's Postgres database') and enumerates the statement classes (CREATE/ALTER/INSERT/UPDATE/DELETE/DROP, migrations). The write framing clearly distinguishes it from the read sibling query_database.

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?

Explains exactly when to use it (write statements), when `database` is needed ('only if the project has more than one'), and when `no_transaction` applies (VACUUM, CREATE INDEX CONCURRENTLY). Also tells the agent a separate pull_database_schema call is unnecessary after schema changes.

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

fetchFetch Search ResultA
Read-only
Inspect

Fetch a search result by id: a project overview ('') or a file (':'). For direct access to a known file or project, read_file/list_files give more detail.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes

TDQS

A4.2/5.0
Behavior3/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 the id format behavior, but does not disclose what the response contains, error behaviors, or any limits. Given the simplicity and read-only nature, this is adequate but not rich.

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

Conciseness5/5

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

The description is two sentences with zero waste. The primary purpose and formats are front-loaded, and the alternative tool is mentioned in a second sentence. Every word serves a clear function.

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 tool with a single parameter and no output schema, the description is fairly complete. It clarifies the id format and points to alternatives for direct access. It does not describe the return value, but given it's a fetch of a search result, the agent likely has prior context from the search tool. A minor gap is the lack of explicit mention that this id originates from the search 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?

Schema description coverage is 0%, so the description must compensate. It thoroughly explains the 'id' parameter by defining two valid formats with placeholders, which is essential for correct usage. This adds significant meaning beyond the schema's bare 'string' type.

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 clearly states the tool fetches a search result by id, and explicitly defines the two id formats: a project overview ('<projectId>') or a file ('<projectId>:<path>'). It distinguishes itself from siblings by noting that read_file/list_files provide more detail for direct access, making the purpose unmistakable.

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 gives clear context for when to use this tool vs. alternatives by stating 'For direct access to a known file or project, read_file/list_files give more detail.' This implies fetch is meant for search result ids, not known paths. While it doesn't enumerate other alternatives, the primary distinction is covered.

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

generate_imageGenerate ImageInspect

Generate AI image assets directly into the project. Each image is written to the project's own asset storage and registered in its asset manifest; the tool returns the project-relative asset paths (/_cdn/static/...), which only resolve on the app's own domain — reference them in code or set one as the app/PWA icon via update_project_metadata (iconUrl). Use this for PROJECT-SPECIFIC imagery (mascots, tailored illustrations, app/PWA icons, imagery in a particular style); if you already HAVE an image as a local file (generated or downloaded yourself), use upload_asset. To edit or restyle an existing image, or keep a character/product/logo consistent, pass it in reference_images (this project's stored assets only: an outside image or the user's photo goes in with upload_asset / request_user_upload first, then pass the path it returns); the prompt then says what to change or produce from it. Generate BEFORE building the components that use the images.

ParametersJSON Schema
NameRequiredDescriptionDefault
imagesYes
projectIdYes
get_current_contextGet Current Editor ContextA
Read-only
Inspect

What the user is looking at RIGHT NOW in their open Floot editor: the active page/component, the preview element they selected (mapped to source file:line), the preview device size, whether they drew a screenshot annotation for you, whether they REVERTED recent changes (undoing edits — re-read before editing if so), and any requests they queued via editor action buttons ("Fix with Floot" etc.). Call this FIRST when the user refers to something without naming it ("this", "here", "the button"), reports a problem without saying where ("it's broken", "looks wrong"), or implies they triggered something in Floot ("go", "I clicked fix", "I undid that"). Cheap and text-only. With several windows open, one answers (the result says which) — but a selection made in ANY window is merged in, so a "no selection" from the answering window plus a deposited selection from another window means the deposited one is what the user means. If it reports a pending annotation, call view_annotation to see the image.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations declare readOnlyHint=true and destructiveHint=false, and the description aligns with those. It adds substantial behavior beyond annotations: 'Cheap and text-only,' the reverting-detection warning ('re-read before editing if so'), and the multi-window selection semantics. It also instructs to call view_annotation for pending annotations. No contradiction with annotations.

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

Conciseness4/5

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

The description is long (~150 words) but every sentence carries weight: it covers when to call, what it returns, edge cases (multi-window, revert), and follow-up actions. The most critical guidance (call FIRST, cheap) is front-loaded. It is not padded, though it could be tightened slightly without losing value.

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 tool that aggregates rich context from multiple windows and states, the description leaves nothing missing. It explains the output semantics (what the result says), the merging behavior, the revert caution, and the annotation follow-up. Even without an output schema, the agent knows what to expect and how to act. Fully complete for its complexity.

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?

The only parameter is projectId, with 0% schema description coverage. The description does not explain projectId at all, relying on it being an obvious identifier. While not misleading, it adds no meaning beyond the schema. Given low coverage, some compensation would be ideal, but the parameter is trivially understood, so a '3' reflects acceptable but not strong semantic support.

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 states a specific verb ('get') and resource ('current editor context'), then enumerates the concrete contents: active page/component, selection mapped to file:line, preview device, annotations, revert status, and queued requests. This goes well beyond a vague summary and clearly distinguishes it from siblings like view_annotation, which is referenced as a follow-up for annotations.

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-call guidance: 'Call this FIRST when the user refers to something without naming it... reports a problem without saying where... or implies they triggered something in Floot.' Provides concrete examples ('this', 'here', 'the button', 'it's broken', 'I clicked fix'). Also explains the multi-window selection merging behavior, directing the agent on how to interpret a 'no selection' from the answering window versus a deposited selection from another.

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

get_guidesFloot GuidesA
Idempotent
Inspect

Floot documentation for agents. Call with no arguments to list available guides. Pass topic for one guide (e.g. topic:'floot-overview') or topics (an array of ids) to fetch several at once. floot-overview explains how Floot projects work — read it before your first code change. Skill guides that ship seed code (marked in the list) AUTO-INJECT it into the project the first time they're loaded with a projectId — pass projectId whenever you're working on a project; idempotent, never overwrites existing files.

ParametersJSON Schema
NameRequiredDescriptionDefault
topicNo
topicsNo
projectIdNo

TDQS

A4.1/5.0
Behavior5/5

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

Goes beyond the annotations by disclosing the side effect of auto-injecting seed code, stating it is idempotent and never overwrites existing files. This is exactly the kind of behavioral context an agent needs beyond the idempotentHint and readOnlyHint flags, and it aligns with annotations (readOnlyHint=false).

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

Conciseness4/5

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

The description is a single dense paragraph but well-organized: it starts with the core function, then details parameter usage, and ends with important side-effect caveats. No wasted words, though slightly long; the key points are front-loaded.

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?

Covers parameter usage and side effects thoroughly, but lacks a clear distinction from the similarly named sibling get_guide, and does not mention the response format of the guide list or any error/edge cases. Given the absence of an output schema, the description should at least hint at what the returned guides look like.

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

Parameters5/5

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

Schema coverage is 0%, so the description must compensate. It explains all three parameters: topic (single guide id), topics (array of ids for multiple), and projectId (for injection context). Provides examples and clarifies the relationship between topic and topics. This fully makes up for the bare 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 clear purpose: 'Floot documentation for agents' with explicit call patterns (no args, topic, topics). Provides a concrete example (topic:'floot-overview'). However, it does not differentiate from the sibling get_guide (singular), so it falls short of a 5.

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

Usage Guidelines3/5

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

Provides some context (read floot-overview before first code change, pass projectId when working on a project) but never explicitly says when to use this tool over the alternative get_guide. No exclusions or conditional routing to the sibling are mentioned.

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

get_job_statusGet Job StatusA
Read-only
Inspect

Poll a pending tool call by its jobId. Each poll either returns the final result (succeeded/failed/cancelled), or reports the call as still running — call it again until you get the result. Failed calls return their stored error message. A jobId belongs to exactly ONE task: it never blocks other tools or other jobs (run them freely in parallel), and once terminal it is frozen history — a NEW user request means a fresh call on the originating tool, never re-polling an old jobId. Legacy v!/b! job ids are also accepted.

ParametersJSON Schema
NameRequiredDescriptionDefault
jobIdYes
wait_secondsNo

TDQS

A4.1/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses detailed behavior: each poll returns a terminal state or 'still running', failed calls return stored errors, jobId uniqueness, non-blocking concurrency, frozen history after terminal, and acceptance of legacy ids. This adds significant value beyond the structured annotations.

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

Conciseness4/5

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

The description is ~100 words, front-loaded with the core purpose, and each sentence adds relevant detail. It is slightly dense with many clauses but remains efficient and well-structured, earning a 4 for conciseness rather than verbosity.

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?

The description covers return behavior (terminal states, error messages) and usage context (concurrency, history, legacy ids), which is essential. However, it omits any explanation of the optional wait_seconds parameter, a gap that prevents full completeness for callers. Otherwise it's quite thorough.

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

Parameters2/5

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

The schema provides no descriptions for jobId or wait_seconds, and the description only explains jobId (as the identifier of the polled job). The optional wait_seconds parameter is completely unmentioned, leaving agents without guidance on how it affects polling. With 0% schema coverage, the description must compensate but only partially does.

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 states a precise verb ('Poll') and resource ('a pending tool call by its jobId'), and clarifies the operation's nature as polling for result. It distinguishes itself from sibling tools like cancel_request by focusing on status retrieval, not cancellation or other actions.

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 gives clear when-to-use guidance: poll pending calls and repeat until terminal. It also specifies when NOT to use it (new user request should trigger a fresh call, not re-poll). However, it does not explicitly name alternative tools, though siblings like get_publish_status exist; the guidance is still sufficient for routing.

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

get_live_paymentsGet Live Payments (Read-Only)
Read-only
Inspect

Look up your Floot Payments records in Stripe (payments, charges, refunds, customers, subscriptions, invoices…) across all your projects. Lookup only: GET by id or list. Reads LIVE mode unless mode is "test", which reads the test payments made in the preview (those never appear in the user's Stripe dashboard). Refunds, cancels and every other change are not possible here; for those the user logs in at stripe.com. Read get_guides('live-payments') before your first call. Responses follow Stripe API version 2026-08-26.dahlia.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNo"live" (default): the published app's real payments. "test": test payments made in the preview.
pathYesStripe API path, e.g. /v1/payment_intents or /v1/payment_intents/pi_123
paramsNo
projectIdNoLimit a list to one project: /v1/<family> becomes a Stripe search on that project
get_logsGet LogsA
Read-only
Inspect

Your FIRST step when debugging any runtime problem — a 500, a failed request, a blank page, or 'it doesn't work' from the user. Call this before theorizing from an error message alone. Reads the project's runtime logs. source 'server' (default): the dev backend's request logs from the last hour — method, URL, status, duration, and per-request server log lines (pass log_reference_id from a previous listing for one request's full logs); includes background jobs (queueTask/scheduled/failure). source 'browser': console output AND client-side network requests (each fetch as ⇄ METHOD url → status, with the error body for failed/4xx/5xx ones — the client-side view server logs miss, e.g. CORS/timeouts/third-party calls) captured from the user's open editor session. A browser network line's ref=<id> is a log_reference_id you can pass back with source 'server' for that request's full server logs. Empty if no editor is open. NOT CloudWatch: entries live ~1 hour and cover the dev backend + live session only — for the PUBLISHED app's logs, use run_code_in_vm's _floot.getProdBackendLogs (details: get_guides('prod-backend-logs')).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
sourceNo
projectIdYes
log_reference_idNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already mark readOnly and non-destructive; the description adds substantial context: logs live ~1 hour, cover dev backend + live session only, empty if no editor open, includes background jobs, and describes the browser network line format. This far exceeds the annotation baseline and fully discloses the tool's scope and limitations.

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 description is long but extremely dense, with the 'FIRST step' hook front-loaded. Each clause adds new information (retention, source details, prod alternative). It is not a single-sentence terse statement, but it avoids redundancy and earns its 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 tool with 4 parameters (1 required), 0% schema coverage, and no output schema, the description is remarkably complete. It covers parameter semantics for two complex params, describes return contents, explains cross-referencing via log_reference_id, notes empty response conditions, and provides the alternative for prod logs. Nothing critical is missing for an agent to call this 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 description coverage is 0%, so the description must compensate. It thoroughly explains 'source' (server vs. browser), 'log_reference_id' (pass from previous listing), and implies projectId via 'reads the project's runtime logs.' However, it never explains the 'limit' parameter (what it bounds, default, etc.) and projectId is only implied, not explicitly tied to the parameter. Two of four parameters lack direct treatment.

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 states a specific verb ('Reads') and resource ('project's runtime logs') and differentiates two modes (server and browser) with distinct contents. It also distinguishes itself from CloudWatch and directs to run_code_in_vm for published logs, making it non-confusable with siblings.

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 says 'Your FIRST step when debugging any runtime problem' and 'Call this before theorizing from an error message alone.' It also lists the alternative for published logs (run_code_in_vm's _floot.getProdBackendLogs) and even references get_guides for details. This is textbook when-to-use vs. when-not-to-use guidance.

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

get_preview_urlGet Preview URLA
Read-only
Inspect

Show the user a live preview card and return the preview link. On an EXISTING project this is typically called EARLY, before the first change, so the user watches edits live from the start; the result is informational and a working session normally continues past it. It is not needed right after create_project, whose result already includes the same card. The preview URL carries an access token in its query string and only works shared EXACTLY as returned (no Floot login, view-only — which is also what lets it open on a phone); it live-updates as you edit, so it also suits an in-app browser tab if your client has one. The result additionally includes the sandbox API base for your own headless /_api/* testing — the frontend does not render there and it is not a user-facing URL; the preview link is the one meant for the user. Floot hosts the app: publish_app publishes it to production.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations declare readOnly/destructive=false, and the description substantially extends them: the URL embeds an access token, must be shared exactly as returned, is view-only with no Floot login, live-updates during edits, and the result also exposes a sandbox API base that is NOT user-facing. This is exactly the kind of behavioral context annotations cannot convey, with no contradiction.

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

Conciseness4/5

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

Purpose is front-loaded and most sentences carry real signal (token behavior, live updates, sandbox API distinction). It is dense and somewhat over-long, and the trailing 'Floot hosts the app' framing sentence is only marginally load-bearing, but there is little true 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?

No output schema exists, yet the description explains what the result contains (preview card, preview link, sandbox API base) and how each should be used. Combined with the usage and security notes, an agent has everything needed to invoke and interpret 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 0% and the sole parameter (projectId) is never mentioned in the description. However, projectId is a self-evident, unambiguous single required argument, so the practical risk is minimal. Not a perfect score because the description technically leaves the parameter to 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?

States a specific verb and resource: 'Show the user a live preview card and return the preview link.' It goes further, distinguishing itself from create_project (whose result already includes the card) and from publish_app (production publishing). An agent can place it precisely among the many siblings.

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?

Explicit timing guidance ('On an EXISTING project this is typically called EARLY, before the first change'), an exclusion ('It is not needed right after create_project'), and a named alternative for the production case ('publish_app publishes it to production'). Covers when, when-not, and the alternative.

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

get_publish_statusGet Publish StatusA
Read-only
Inspect

Read-only publish snapshot for a project: published (true/false, with the live URL when published), customDomains (the user's own domains attached to the project — apex and www are listed separately; empty when none), paid (the workspace owner has a paid plan, which allows removing the Floot badge), plan (free | pro | power — paid cannot tell Pro from Power), nativeBuilds (the owner's remaining monthly iOS/Android app-build allowance; unlimited is true on plans where the ceiling is only a fair-use backstop, and while an Action Boost is live (boostUntil says until when; builds started before then never count toward the allowance) — read this BEFORE passing mobile: true, and on a metered plan build only when the user asked for a native/TestFlight/Play build), displayFlootLogo (whether the live app shows the 'Made with Floot' badge; true until a paid owner turns it off), and mobileBuild (the project's latest native app build: building, succeeded, or failed with what to fix; isMobileTestMode marks a mobile test build — an app build finishes minutes AFTER the publish job it rode on, so read this to learn how it ended before telling the user it worked). This is the ONLY tool that reports attached custom domains — read it before telling a user whether their domain is connected, and never conclude a domain is unattached from any other output. The publish card calls this on load to render fresh state; also check it before publishing to know whether publish_app will publish fresh or publish the live app again.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYes

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only mark the call read-only/non-destructive; the description adds substantial behavior: paid vs plan distinctions, fair-use unlimited semantics, boostUntil timing, and the fact that mobileBuild finishes after its publish job. No contradiction with the readOnlyHint.

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?

Every detail serves a purpose, but it is delivered as one long, dense run-on paragraph with deeply nested parentheticals. The core is front-loaded, but bulleted field breakdowns would make it far more scannable.

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 no output schema, the description carries the full burden of explaining return values, and it does so thoroughly: every response field, its possible values, and its caveats are described. An agent has enough to interpret the snapshot and decide next actions.

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 one parameter, projectId, with 0% schema description coverage. The description repeatedly ties the data to 'a project' and 'the project's latest', giving semantic context, but it never states the expected identifier format or type beyond the schema's plain string.

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 opens with a precise verb and object — 'Read-only publish snapshot for a project' — then enumerates the exact fields returned. It also differentiates from sibling outputs by stating it is 'the ONLY tool that reports attached custom domains'.

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?

Provides explicit when-to-use gates: read before asserting a domain is connected/unattached, read before passing mobile: true, and check before publish_app to know whether it will publish fresh. It also warns against concluding domains are unattached from any other output, effectively excluding alternatives.

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

list_filesList Project FilesA
Read-only
Inspect

List a Floot project's virtual file tree with sizes, plus its dependencies, current version (pass the version to write tools as expected_version), and current project metadata — title, description, app icon (iconUrl), splash screen, mobile app id, SSR, iOS Info.plist overrides, share target (iOS + Android), native system bars. This is where to look up those settings; update_project_metadata changes them.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYes

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 and destructiveHint=false, lowering the burden on the description. The description adds useful behavioral context by specifying it returns a virtual file tree with sizes, dependencies, version, and metadata fields, and clarifies that update_project_metadata performs mutations. No contradiction with annotations.

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

Conciseness4/5

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

The description is a long single paragraph but information-dense; every clause contributes value, and the second sentence provides operational guidance. A bulleted list would improve scannability, but there is no filler or redundancy.

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 read-only listing tool with no output schema, the description thoroughly enumerates what the response contains: file tree, dependencies, expected_version, and detailed metadata fields. It even tells agents how to use the version value with write tools, making the definition effectively complete for correct invocation.

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

Parameters2/5

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

Schema description coverage is 0%, and the description does not explain projectId beyond implying a project is selected. The property name is self-explanatory, so the gap is minor, but the description still adds no parameter-level meaning and does not compensate for the missing schema description.

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 ('List') and clearly identifies the resource: a Floot project's virtual file tree, dependencies, version, and project metadata. It also distinguishes itself from update_project_metadata by stating that this is the lookup tool while update_project_metadata changes those settings.

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 explicitly says 'This is where to look up those settings' and names update_project_metadata as the sibling that changes them, giving agents a clear when-to-use signal. It does not enumerate all exclusions, but the primary usage context is unambiguous.

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 your Floot projects (id, name, last-updated, whether an app icon is set), most recently updated first. name_filter is a case-insensitive substring match on the stored name, which is often not the name the user uses for a project — on a small account a filter that matches nothing returns the whole list instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
name_filterNo

TDQS

A4/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 description doesn't need to repeat that. It adds valuable behavioral context: the list is ordered by last-updated, name_filter is case-insensitive and matches the stored name (not the user-facing name), and a no-match filter returns the whole list on small accounts. This goes beyond annotations and helps the agent predict edge cases.

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 two concise sentences with no filler. It front-loads the core functionality (what it returns and ordering) and then details the filter behavior. Every sentence adds information, and the structure is efficient.

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 simple read-only list tool with no output schema, the description is fairly complete: it lists the returned fields, ordering, and filter semantics. It doesn't cover pagination or error behavior, but given the minimal parameter set (limit and name_filter) and read-only annotation, what's missing is not critical. It could note that limit defaults, but the schema covers that.

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 schema description coverage at 0%, the description must compensate for both parameters. It thoroughly explains name_filter semantics (case-insensitive substring, stored vs. user name, fallback behavior), which adds real value. However, it does not describe limit at all, though limit's min/max are in the schema. Since name_filter gets rich treatment but limit is left to schema defaults, the compensation is partial.

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 states a specific verb ('List'), a specific resource ('Floot projects'), and enumerates the returned fields (id, name, last-updated, app icon) and ordering (most recently updated first). This clearly distinguishes it from sibling list tools like list_files and list_resources, which target different resources.

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 provides contextual details (ordering, filter behavior) but does not explicitly state when to use this tool versus alternatives or mention any prerequisites. It's implied that this is for listing projects, but there is no direct guidance on when not to use it or which sibling to prefer.

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

list_resourcesList Available ResourcesA
Read-only
Inspect

List the env vars a project's code can use and the resources behind them: (1) resources CONNECTED to the project — usable as process.env. in endpoint code now; (2) the owner's other account-level credentials — reusable, but not usable in code until connected; (3) everything Floot can add. Call it to learn what env vars exist before writing backend code, and BEFORE provisioning or requesting any credential (the owner may already have the one you need). Pass query (case-insensitive substring over names, descriptions, types, and env var names) to filter when the account has many resources. Read-only. Details: get_guides('resources').

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNo
projectIdYes

TDQS

A4.7/5.0
Behavior4/5

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

The annotations already declare readOnlyHint=true, so the read-only nature is known. The description adds useful behavior: the three categories with their usability, the case-insensitive substring filtering behavior of 'query', and a pointer to get_guides('resources') for details. This goes beyond the annotations by explaining what the list contains and how filtering works, without contradicting them.

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 well-organized with a numbered list for the three resource categories, a clear 'Call it to...' sentence for usage timing, and a brief note about the query parameter. Every sentence contributes meaning; there is no redundancy or filler. The key purpose is front-loaded, and the 'Read-only. Details: get_guides('resources').' coda is a compact pointer. This is appropriately sized for the amount of information conveyed.

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 tool with only two parameters (one required), no output schema, and annotations covering the safety profile, the description is complete. It gives the purpose, usage timing, parameter semantics, and even a fallback for deeper details (get_guides). The absence of a detailed return format is acceptable because the tool's purpose is clear and the read-only annotation reassures the agent; an output schema is not present, so the description does not need to explain it, but it does enough to enable 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 0%, so the description must carry the burden. It thoroughly explains the 'query' parameter ('case-insensitive substring over names, descriptions, types, and env var names') and its purpose. The 'projectId' parameter is not explicitly described, but the opening line ('a project's code') makes its role obvious. The description compensates well for the lack of schema detail.

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 clearly states the verb 'List' and the resource ('env vars a project's code can use and the resources behind them'), then enumerates three specific categories. It distinguishes itself from siblings like provision_resource and request_external_resource by explicitly saying to call it before provisioning or requesting any credential. This is a specific, unambiguous purpose.

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?

Explicit guidance is given: 'Call it to learn what env vars exist before writing backend code, and BEFORE provisioning or requesting any credential (the owner may already have the one you need).' This tells the agent when to use this tool and implicitly when not to (i.e., before provisioning/requesting). It also explains the query parameter's filtering use case. No alternative tools are named, but the timing and rationale are unambiguous.

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

provision_resourceProvision ResourceAInspect

Provision a Floot-managed backend resource for the project — fully server-side (Floot mints all secrets; no keys to paste). Also seeds the working code for it. Available:

  • database — A Floot-managed Postgres database (Neon). FLOOT_DATABASE_URL is set for the app.

  • auth — Email/password + session auth (JWT_SECRET, auto-provisions a database if none). Injects auth pages, endpoints, and helpers.

  • oauth-login — Sign in with Google via Floot's brokered OAuth (FLOOT_OAUTH). Injects OAuth provider classes, login buttons, helpers.

  • microsoft-login — Sign in with Microsoft via Floot's brokered login (FLOOT_MICROSOFT_LOGIN). Injects button + auth endpoints.

  • google-integration — FLOOT_GOOGLE_INTEGRATIONS is built-in Google integration. Use it to let end users connect their Google account so the app can read/write their Gmail, Google Calendar, or Google Drive — unless the user specifies they want to use their own Google client. See get_guides("floot-provided-google-integrations").

  • microsoft-integration — Microsoft Graph access (Outlook/Teams/etc.) via Floot's brokered Microsoft OAuth (FLOOT_MICROSOFT_INTEGRATIONS). Injects Connect button + endpoints.

  • push-notifications — Web + native push (FLOOT_PUSH). Mints VAPID keys, injects helpers/pushClient (subscribe/unsubscribe) + a service worker. Enum values not listed above are beta-gated and unavailable on most accounts. SENDING email from the app is NOT a resource — the builtin @floot/email handles it with zero setup (get_guides("email")). For a user's OWN external key (their OpenAI key, an external database), this is NOT the tool — use request_external_resource instead. Idempotent: re-running returns the existing resource and skips seed files that already exist.

  • app-connection — let this project's backend call functions ANOTHER Floot app exports (no API keys): pass app_target and app_functions. Only apps the user can edit, only functions in the other app's helpers/flootAppExports.tsx (saved is enough: write both apps first, connect, then publish both); the user confirms in a dialog. Read get_guides("app-calls") first.

ParametersJSON Schema
NameRequiredDescriptionDefault
app_noteNoOnly for resource "app-connection": one sentence for the user on why this project needs these functions. Shown in the confirmation dialog.
resourceYes
projectIdYes
app_targetNoOnly for resource "app-connection": the OTHER Floot app — its project id, name.floot.app address or custom domain.
app_functionsNoOnly for resource "app-connection": the exact function names this project needs from the other app's helpers/flootAppExports.tsx.

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the annotations (readOnlyHint=false, destructiveHint=false, openWorldHint=true) by disclosing that Floot mints all secrets server-side, that the tool seeds working code, that it is idempotent (re-running returns the existing resource and skips existing seed files), and that app-connection requires an in-dialog user confirmation.

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 purpose and scope before the bullet list. The length is driven by 11 enum values that each need disambiguation, so most sentences earn their place, though the dense prose on google-integration and app-connection could be trimmed slightly.

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 mutating, no-output-schema tool this covers side effects (minted secrets, injected files, service worker), idempotency, cross-app prerequisites, and the confirmation dialog. 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 60%, and the description compensates by explaining what each resource value produces (env vars like FLOOT_DATABASE_URL, JWT_SECRET, injected pages/helpers) and by flagging that unlisted enum values are beta-gated. It also clarifies app_target/app_functions constraints, though projectId remains undocumented.

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 and resource ('Provision a Floot-managed backend resource for the project') and immediately scopes it as fully server-side. The bulleted enumeration of each resource type makes it unmistakable against siblings like add_dependency or request_external_resource.

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 routes away from the tool when appropriate: 'For a user's OWN external key ... this is NOT the tool — use request_external_resource instead,' and 'SENDING email from the app is NOT a resource.' It also names the precondition for app-connection (write both apps first, connect, then publish) and points to get_guides for deeper flows.

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

publish_appPublish AppA
Destructive
Inspect

Publish the app to production — call for the first publish, to publish again after changes the user wants live, and to set up a custom domain. Omit domain and the user gets the publish form in the editor. Pass mobile: true whenever the user mentions iOS, Android, TestFlight, App Store, Google Play, or a mobile/native app — with no store account connected that returns a Connect card; with one connected it publishes with the store builds attached. When the project takes payments and its owner has not finished Stripe setup, the publish is refused and a Set up payments card is returned (nothing published): tell the owner to click the button on the card and finish Stripe setup, then call publish_app again. publish_app always publishes live (web, and the mobile app when it is built; payments in Stripe live mode) — never ask the user test or live. Mobile test builds are started by the user on floot.com. Read get_guides('publishing') for modes, inputs, and statuses before your first call.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNofloot_subdomain only: subdomain label (lowercase, digits, hyphens, max 40). Omit to show the user the publish form instead; on a published app a different subdomain is refused (unpublish_app first, confirming with the user). Ignored for custom_domain — the wizard collects the domain.
mobileNoSet true whenever the request mentions iOS, Android, TestFlight, App Store, Google Play, Play Store, a native or mobile app, or a phone build — they all mean a mobile build. No store account connected → returns a Connect card (nothing published). Connected → publishes the web app with the store builds attached; the job completes when the web build is live. Omitted on a live app follows the project's saved setting: on plans with unlimited app builds that setting decides (mobile switched off stays web-only); on metered plans omitted always means web-only, and true spends one of a small monthly allowance (the remaining count comes back in the result) — read get_publish_status for the plan and allowance first. Passing true or false also updates the saved setting; omitting leaves it alone.
projectIdYes
add_anotherNocustom_domain only: the project ALREADY has a custom domain and the user has explicitly asked for an ADDITIONAL one. Without it, a custom_domain call on a project that already has domains returns those domains instead of opening the wizard — so a user whose domain is already connected is told so rather than sent to add it again.
domain_typeNoOmit for the floot subdomain (shows the publish form in the editor when domain is omitted). 'custom_domain' for domain setup — a paid-plan feature (get_publish_status reports `paid`); it fails for free accounts.
include_made_with_flootNofalse removes the 'Made with Floot' badge (paid plans only — fails for free accounts). Omit to keep the current setting.

TDQS

A4.9/5.0
Behavior5/5

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

Compared to annotations (readOnlyHint=false, destructiveHint=true, openWorldHint=true), the description adds crucial behavioral context beyond structured fields: Stripe setup refusal behavior, Connect card generation for mobile, that publish always goes live, the editor publish form for web omissions, and the allowance mechanics on metered plans for mobile builds.

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 the primary action and branches logically through mobile, payments, and domain cases. Some sentences are long and packed with conditional clauses (the mobile: true paragraph), but every clause carries operational value and nothing is redundant.

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 the complexity of the publish flow (different modes, payment setup gates, mobile build semantics, paid plan limits), the description covers the key decision points an agent needs to call correctly. It defers detailed modes and statuses to get_guides('publishing') and defers plan/allowance checks to get_publish_status, which is appropriate for preserving conciseness.

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

Parameters5/5

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

Although schema coverage is high (83%), the description adds substantial meaning beyond the schema: explains that omitting domain shows the publish form, that passing mobile: true triggers store build handling and updates the saved setting, and the refusal conditions when payments aren't set up. This is far richer than what the schema alone conveys.

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+resource (publish the app to production) and enumerates the distinct use cases: first publish, republish after changes, and custom domain setup. The agent can distinguish this from siblings like unpublish_app or get_publish_status.

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 instructs when to pass mobile: true (iOS, Android, TestFlight, App Store, Google Play, native/mobile app). Explains onboarding edge cases (Stripe setup refusal, Connect card) and explicitly says never to ask the user test vs live. Points to get_guides('publishing') for first-call context.

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

pull_database_schemaPull Database SchemaAInspect

Introspect the database and write a typed schema helper the app uses for queries (kysely on current projects; some legacy projects use drizzle or snake_case kysely — the pull matches whatever the project already uses). Usually NOT needed after execute_sql — schema-changing statements re-pull automatically. Use it to refresh manually, or with helper_name to generate the helper for an additional/external database. The helper is GENERATED — never hand-edit it or cast around its types: if a column's type is too loose (e.g. role as string when code expects "user" | "admin"), fix the DATABASE (CREATE TYPE … AS ENUM + ALTER COLUMN … TYPE) and re-pull, and the union type falls out.

ParametersJSON Schema
NameRequiredDescriptionDefault
databaseNo
projectIdYes
helper_nameNo

TDQS

A4.5/5.0
Behavior5/5

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

Annotations (readOnlyHint=false, openWorldHint=true) are consistent with this, and the description adds substantial context beyond them: the helper is GENERATED, must never be hand-edited or cast around, and loose types must be fixed in the DATABASE then re-pulled. This is exactly the extra behavioral context the dimension rewards.

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 the core action and the execute_sql relationship, then the usage cases. The closing type-fixing tangent is long and somewhat tangential, though genuinely useful, keeping this just short of a 5.

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 write-oriented tool with no output schema and 0% param coverage, the description covers behavior, usage, and constraints thoroughly. The main gap is that the three parameters' semantics and formats remain largely undocumented.

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 0%, so the description must compensate. It explains helper_name's purpose (generate the helper for an additional/external database) and implies what `database` selects, but projectId and the exact semantics/format of `database` are left unexplained.

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+resource: "Introspect the database and write a typed schema helper the app uses for queries," and clarifies dialect handling (kysely, drizzle, snake_case kysely). This clearly distinguishes it from siblings like execute_sql and query_database.

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 names the alternative and the condition that selects it: "Usually NOT needed after execute_sql — schema-changing statements re-pull automatically. Use it to refresh manually, or with helper_name..." It provides both when-to-use and when-not-to-use guidance.

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

query_databaseQuery Database (Read-Only)A
Read-only
Inspect

Run a READ-ONLY SQL query against the project's Postgres database (SELECT, EXPLAIN, etc.) — the Floot-managed database, or an external Postgres the user connected to the project. Writes are rejected — use execute_sql for those. Returns JSON: {rows, rowCount, command, truncated?} (or {results: [...]} for multi-statement queries). Pass database only if the project has more than one.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
databaseNo
projectIdYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnlyHint, destructiveHint=false, openWorldHint), but the description adds genuinely new behavioral detail: write rejection, and the exact return shape including the truncated indicator and multi-statement results array. This is valuable because there is no output schema.

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

Conciseness5/5

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

Three sentences, front-loaded with the action and read-only constraint, then routing guidance, then return shape. No filler; every sentence delivers information an agent needs to invoke the tool.

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 read-only query tool with annotations covering safety and no output schema, the description fills the remaining gaps by documenting return structure and the write-rejection behavior. Nothing essential to correct invocation 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 description coverage is 0%, so the description carries the burden. It meaningfully explains the non-obvious 'database' parameter's conditional use, while 'query' and 'projectId' are self-evident from name and surrounding context. No syntax guidance for query is given, but the description's framing implies SQL.

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 (Run) and resource (READ-ONLY SQL query against Postgres), names the accepted statement classes (SELECT, EXPLAIN, etc.), and clarifies both database scopes (Floot-managed vs. external Postgres). It explicitly differentiates itself from the sibling execute_sql for write operations.

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?

Provides an explicit when-not with a routing alternative: 'Writes are rejected — use execute_sql for those.' It also gives conditional guidance for the database parameter ('Pass database only if the project has more than one'), removing the main ambiguity an agent would face.

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

read_fileRead File
Read-only
Inspect

Read a file from a Floot project (cat -n style). Paths follow the item scheme: components/Name.tsx, components/Name.module.css, helpers/Name.tsx, pages/name.tsx, pages/name.pageLayout.tsx, endpoints/route_POST.ts, endpoints/route_POST.schema.ts, static/file.txt, base.css. Use offset/limit for large files. Pass include_references:true to also list which project files reference this one (static import graph plus queueTask/runCode name references and, for endpoints, URL-path string usage) — check it before renaming or deleting a file, or use rename_file which rewrites importers itself. Hosted assets are readable too: pass the project-relative asset path (/_cdn/, as returned by upload_asset / generate_image or used in the app's ; private/ for private storage) and a png/jpeg/gif/webp image is returned as an image you can see (≤3.75 MB), text-typed assets as text, other binaries as a size/type summary. A read does not typecheck by default: pass diagnostics:"auto" to append a .ts/.tsx file's CURRENT type errors when the project's compute VM is already warm (so you see latent errors before editing), or "wait" to boot the VM and force the check. older_than walks the file's HISTORY: pass "current" to see the file as it was just before its latest change, then the cursor from that result to step one change further back — use it when something used to work and you want to compare or restore an earlier version (write the old content back with write_file).

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
limitNo
offsetNo
projectIdYes
older_thanNoOmit (or leave empty) to read the current file. Set it only to read the file as it was BEFORE an earlier change. Pass "current" for the version just before the latest change to it, then the cursor each result gives you to step one change further back — until you find a good version, then write it back with write_file (or merge by hand). Not a version number: each step is one recorded change to the file. Type errors and references are skipped for past versions.
diagnosticsNo
include_referencesNo
read_filesRead Files
Read-only
Inspect

Read MULTIPLE files from a Floot project in ONE call — much cheaper than repeated read_file (the whole project is loaded once, one round-trip). Prefer this whenever you need several files together (e.g. an endpoint + its .schema.ts + the hook that calls it, or orienting in a feature). Pass up to 20 paths (same item scheme as read_file; /_cdn/ asset paths are accepted too and images come back as image blocks). Each file is returned cat -n style under a header. Reads do not typecheck by default: diagnostics:"auto" appends each .ts/.tsx file's current type errors when the compute VM is warm, "wait" forces the check. include_references:true appends each file's referencing files (same analysis as read_file). Output is capped overall; if the batch is too large, whole files at the end are omitted and listed by name so you can read them individually. With older_than (up to 5 paths) the files are walked back through history TOGETHER on one timeline — the way to keep a component and its stylesheet consistent.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
pathsYes
projectIdYes
older_thanNoOmit (or leave empty) to read the current file. Set it only to read the file as it was BEFORE an earlier change. Pass "current" for the version just before the latest change to it, then the cursor each result gives you to step one change further back — until you find a good version, then write it back with write_file (or merge by hand). Not a version number: each step is one recorded change to the file. Type errors and references are skipped for past versions.
diagnosticsNo
include_referencesNo
remove_dependencyRemove DependencyAInspect

Remove npm packages from a Floot project's dependency record (record-only; nothing runs).

ParametersJSON Schema
NameRequiredDescriptionDefault
packagesYes
projectIdYes

TDQS

A3.9/5.0
Behavior4/5

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

The description adds the key behavioral fact that this operation is 'record-only; nothing runs', which communicates that it does not execute code or have side effects on the environment. This goes beyond the annotations (readOnlyHint=false, destructiveHint=false) by clarifying the mutation is restricted to a record. No contradiction with annotations.

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

Conciseness5/5

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

A single sentence that is concise, front-loaded with the action and resource, and ends with the critical behavioral note. No redundant words or repetition; every part adds value.

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?

The tool is simple (two required parameters) and the description covers the core operation and its non-execution nature. Since there is no output schema, the description doesn't need to explain return values. It is adequate for a record-only update, though it lacks details on error behavior or what happens if a package doesn't exist, which are minor given the simplicity.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate. It gives context for the 'packages' parameter by mentioning 'npm packages', but it does not explain 'projectId' at all. The description provides only a partial hint about parameters, insufficient for an agent to correctly construct inputs without external knowledge.

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 states a specific verb ('Remove'), a resource ('npm packages from a Floot project's dependency record'), and implies a domain (Floot project). It clearly distinguishes from the sibling add_dependency by the verb and context. No ambiguity about what the tool does.

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 mentions 'record-only; nothing runs' which is a usage caveat indicating safety, but it does not explicitly state when to choose this tool over alternatives (e.g., 'use this instead of edit_file'). The purpose is clear from the name and sibling context, but explicit guidance on condition of use is missing.

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

rename_fileRename FileAInspect

Rename one or more items and automatically rewrite every file that imports them. Use item names WITHOUT extensions (e.g. {from:'components/OldName', to:'components/NewName'}). Preferred over delete+create — preserves content and fixes importers. Same type only. Pass several renames to apply them atomically in ONE pass; importer rewrites are resolved across the whole batch (including chains where one rename's target is another's source).

ParametersJSON Schema
NameRequiredDescriptionDefault
renamesYes
projectIdYes
expected_versionNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations only state readOnlyHint=false and destructiveHint=false, so the description carries the burden of disclosing behavior. It does so by revealing the rewrite side effect, atomic batch application, and chain resolution. However, it doesn't mention error handling, rollback, or permissions, which are less critical but still relevant for a mutating tool.

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

Conciseness4/5

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

The description is dense but every sentence adds value: main function, format example, preference rationale, constraint, and batching semantics are all present without fluff. It is front-loaded with the core purpose, though a bit long for a simple rename tool.

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 rename tool without an output schema, the description covers the essential aspects: what it does, how to specify renames, constraints, and batch behavior. It lacks return-value details and error-case notes, but these are often predictable. Given the tool's complexity, this is sufficiently complete.

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 0%, so the description must compensate. It clarifies the 'renames' parameter with an example and the no-extension rule, which adds meaning. But it says nothing about 'projectId' or 'expected_version', leaving those under-specified for a tool with 0% schema coverage. The partial clarification earns a middle score.

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 clearly states a specific action ('Rename one or more items') with a key side effect ('automatically rewrite every file that imports them'). It distinguishes from delete+create and implies a precise use case, making it easy to differentiate from sibling tools like copy_file or delete_file.

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?

Provides explicit guidance: 'Preferred over delete+create', clarifies the required name format ('Use item names WITHOUT extensions'), imposes a constraint ('Same type only'), and explains batching behavior ('atomic in ONE pass' with chain resolution). This tells the agent exactly when and how to use the tool versus alternatives.

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

request_external_resourceRequest External ResourceAInspect

Request the USER'S OWN external credential for this project — their OpenAI or Anthropic API key, an external Postgres connection string (ALWAYS type POSTGRES — a Postgres credential requested as GENERIC is refused, because only POSTGRES gives the user a database: the Databases tab, helpers/db, the typed schema and query_database), or any other service's key (type GENERIC, e.g. Stripe/Resend — secret_env_vars is REQUIRED for GENERIC and the call is refused without it; a var the user can only produce LATER, like a webhook signing secret, goes in optional_env_vars so the dialog doesn't demand it up front). NOT for Floot-managed resources (database/auth/push/oauth/…) — use provision_resource for those; they need no user input. REUSE FIRST: if the project owner already has a matching credential on their account (list_resources section 2), this connects that saved credential to the project directly and returns the env var names — no link, no dialog, nothing to poll. Pass the name exactly as list_resources shows it to make that happen. Reusing a POSTGRES credential also seeds helpers/db, installs the query stack, and pulls the typed schema helper, so do NOT write those yourself afterwards. Otherwise it returns a secure connect link: SHOW it to the user (UI-capable hosts render a Connect button automatically; on terminal hosts with shell access open it in the user's default browser yourself and paste the URL as plain text) and ask them to open it. The call completes only when the user finishes the connect flow — it never expires. Do NOT block on it: request the credential EARLY, keep building everything that doesn't need the secret (the env var names are known now — reference process.env.X in code before the secret exists), and check the request between tasks; the user may never connect it, and the build must not stall. NEVER ask the user to paste a secret into the chat. On completion you get the env var names — never the secret values. Re-calling with the same type returns the same pending request. If the credential is already connected and holds every value you asked for, you get those env var names and their value SHAPES back immediately and the user is not interrupted — to reopen a dialog because a stored value is wrong, re-call with instructions saying what is wrong.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoDisplay name for GENERIC requests, e.g. 'Stripe'.
typeYes
projectIdYes
instructionsNoWhy the key is needed / where the user can find it — shown to the user in the dialog.
secret_env_varsNoREQUIRED for GENERIC (the call is refused without it): the env var name(s) the secret(s) should be exposed as — e.g. ["STRIPE_SECRET_KEY"]. Name what you will actually reference as process.env.<NAME> in code; it is the identity of the request, what account-credential reuse matches on, and what the value is stored under, so there is no usable default. Every var listed here is a REQUIRED field in the connect dialog — the user cannot submit while one is blank, so only list vars the user can produce right now; anything they'd fill in later belongs in optional_env_vars instead.
optional_env_varsNoGENERIC only: env vars the user may leave blank at connect time and fill in later — e.g. a webhook signing secret that only exists after the webhook endpoint is created. Rendered as optional fields; names here need not repeat secret_env_vars (a name in both stays required). To collect a skipped value later, call request_external_resource again — the connected resource opens in an update dialog.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnly=false, destructive=false, openWorld=true; the description goes far beyond by disclosing that the call completes only when the user finishes the connect flow, never expires, returns env var names but never secret values, re-calling returns the same pending request, and that already-connected credentials short-circuit without a dialog. It also warns never to ask the user to paste a secret and how to reopen a dialog via `instructions`.

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?

Nearly every sentence conveys real, load-bearing information, but the entire description is one enormous run-on paragraph with deeply nested parentheticals, making it hard to scan and front-load. Structure is the weak point: it would benefit from paragraph breaks or ordering, but the density is justified by the tool's complexity.

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 complex mutation tool with no output schema, the description covers completion behavior, return shape (env var names, not values), reuse/dedup behavior, non-blocking workflow guidance, and error/refusal conditions. 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.

Parameters5/5

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

Schema coverage is 67% and the `type` enum carries no schema description, yet the description supplies the critical semantics: POSTGRES is mandatory for Postgres credentials (GENERIC is refused), GENERIC requires secret_env_vars, and later-producible vars belong in optional_env_vars. It explains why secret_env_vars has no default and how names drive reuse matching, adding substantial meaning beyond 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?

The description opens with a precise verb+resource ('Request the USER'S OWN external credential for this project') and immediately enumerates the concrete credential kinds it handles (OpenAI/Anthropic keys, Postgres connection strings, generic service keys). It also explicitly contrasts itself with the sibling 'provision_resource', so an agent can distinguish the two 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?

It states when to use this tool, when NOT to ('NOT for Floot-managed resources ... use provision_resource for those'), and a clear reuse-first ordering with the fallback connect-link path. The condition selecting each type (POSTGRES vs GENERIC, GENERIC requiring secret_env_vars) is spelled out, leaving almost nothing to inference.

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

request_user_uploadRequest a File From the UserInspect

Show the user an inline upload card so they can hand you a file from their device (image/font/audio/…) — it lands in the project's hosted assets and the card gives you the hosted publicUrl. This is the path for any file the user has: an image they attached in this chat (attachments never reach MCP servers — you see them through vision only, so the user re-picks the same file here), a file on their machine, or a user-provided file you hold but can't upload yourself (over the 3 MB inline cap with no S3 egress — the card uploads from their browser, which is never egress-blocked). Returns a jobId — poll get_job_status; it stays running until they upload, then returns the publicUrl to reference in code. When you show the card, tell the user in a sentence why you're asking — e.g. that you can see their image but the file itself doesn't reach Floot, so re-adding it here is a one-click step — and ask them to say "uploaded" when done in case your polling ends before they finish. For files you hold yourself, use upload_asset; for AI-generated imagery, use generate_image. Some clients can't show the card (Microsoft Copilot Studio, for one): if the user says they don't see it, give them the project's preview link (get_preview_url) and ask them to sign in there and drag the file into Storage › Static (or use its Upload button), then call list_files — the file is listed under "Files uploaded in the editor" with the /_cdn/static/ path to use.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYes
descriptionNoShown in the card — what you're asking for, e.g. "the logo image you attached".
run_code_in_browserRun Code in BrowserA
Destructive
Inspect

Run a TypeScript snippet inside the RUNNING APP's preview document in the user's open Floot editor (document/window ARE the live app's DOM — query document directly; do NOT look for a preview iframe, there is none from the snippet's point of view). Use it to read the live app's DOM — measuring elements, reading computed styles, inspecting rendered output. The preview is a cross-origin iframe inside the editor page, so DOM reads and clicks made from the editor page do not reach the app; this tool runs the snippet inside the preview document itself. _floot.* helpers are available. The snippet MUST export default async function and return a string — the returned value is the tool result (unlike run_code_in_vm, which is a plain script returning stdout). It can import project files by relative path from the root (e.g. ./helpers/foo). Requires the user to have the project open in the editor — fails fast with guidance if no browser is connected; prefer run_code_in_vm for anything that doesn't need the DOM. Simple interaction checks work well: element.click() a button, await a beat, then read the resulting DOM/state to verify a flow end-to-end — do this instead of asking the user to test basic interactions. Multi-step e2e journeys and typed text input are where simulation gets unreliable (React controlled inputs ignore assigned values) — leave THOSE to the user.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesA TypeScript module that exports a default async function returning a string; that string is the tool result. Runs at the project root, so import other files by relative path. No top-level `return` (it's a module, not a function body) and no React hooks (not a component). Example: export default async function () { const el = document.querySelector("main"); return JSON.stringify({ width: el?.clientWidth ?? null }); }
projectIdYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations declare destructiveHint=true and openWorldHint=true, so the mutation surface is flagged. The description adds real value beyond that: the fails-fast-on-disconnected-browser behavior, the cross-origin iframe constraint, and the returned-string contract. Minor gap: it doesn't state that arbitrary code execution can mutate app state through clicks, though 'destructiveHint' covers the safety profile.

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 content is dense and useful, but the description is long-winded with parenthetical asides ('(unlike run_code_in_vm, which is a plain script returning stdout)'). Front-loading is good, but some sentences could be tightened.

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?

No output schema, so the returned-string contract must be stated — and it is. No annotations cover the iframe/editor context, and the description covers it thoroughly. Remaining gap is the undocumented projectId, which matters for 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 coverage is 50%, with projectId undocumented in the schema. The description compensates by clarifying the code parameter's contract (module exporting a default async function, returns a string, runs at project root, imports by relative path), though projectId itself remains unexplained.

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 execution context ('Run a TypeScript snippet inside the RUNNING APP's preview document'), and explicitly disambiguates from the sibling run_code_in_vm. An agent knows exactly what this does and how it differs.

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?

Provides explicit when/when-not routing: 'prefer run_code_in_vm for anything that doesn't need the DOM', names simple interaction checks as good fits, and calls out multi-step e2e journeys and typed input as cases to leave to the user. This is exemplary guidance.

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

run_code_in_vmRun Code in VM
Destructive
Inspect

Run a Node.js snippet on the project's compute VM (headless — no browser needed). The project's npm dependencies are importable; network access works, so you can call the project's /_api/* endpoints (get_preview_url → apiBaseUrl). ESM by default; bare require() snippets run as CJS. Returns stdout+stderr.

Calls to the project's /_api/* are rate-guarded exactly like the browser preview: more than 20 calls to one endpoint or 150 total within 5s rejects that fetch and every later /_api/* fetch in the snippet with 'Backend endpoint is called too frequently'. This is a hard guard, not a retry hint — do NOT loop fetch() over rows/ids or fire many parallel calls; batch into one endpoint call, or read/write the rows directly (query_database / execute_sql).

Runs in an ISOLATED temp dir, NOT the project root, with NO access to the project's environment: process.env carries none of the project's env vars or secrets (only PATH/HOME/NODE_ENV are set — anything like process.env.POSTHOG_API_KEY reads back undefined), and project source files are NOT importable by relative path (import './helpers/foo' fails with ERR_MODULE_NOT_FOUND — only npm dependencies resolve; contrast run_code_in_browser, which runs at the project root and CAN import project files). For anything that needs project secrets, env config, or DB access, use the _floot helpers below (they proxy to the project's server context) or fetch the project's /_api/* endpoints over the network — those run server-side WITH the full env; the VM snippet itself never sees it.

Plain SQL does not belong in a snippet: read data or inspect the schema (information_schema / pg_catalog, several statements per call) with query_database, read the typed schema with pull_database_schema, and run writes and DDL with execute_sql, where the user sees each statement. Use _floot.runSQLQuery only when the SQL is part of a program — a loop that seeds rows, or results the snippet goes on to process.

A _floot global is available with project-scoped server-data helpers (no DB creds needed, no HTTP wiring): await _floot.runSQLQuery({ query, resourceName?, reasonAndExplanationForNotReadOnly?, dryRun? }) (omit the reason for a read-only query; pass it to allow NON-DESTRUCTIVE writes — INSERT, CREATE TABLE, additive ALTER — e.g. programmatic seeding loops. DESTRUCTIVE statements — DELETE/UPDATE/TRUNCATE/DROP — are rejected here because the user never sees snippet SQL; run those through the execute_sql tool, where the statement appears in the tool call for approval. Resolves to {rows, rowCount, command, truncated?} — or {results: [...]} for multi-statement queries), getHostingUsage({days?}), getLambdaUsage({days?}), getPushHistory({subscription?,from?,to?,offset?}), getProdBackendLogs({filter?,from?,to?,nextToken?,limit?}) (the PUBLISHED app's backend CloudWatch logs; details: get_guides('prod-backend-logs')), storageList(prefix) (prefix MUST start with "public/" or "private/" — e.g. storageList("public/") to list everything public), storageGetUrl(key), storageGetFileSizes(visibility, continuationToken?), storageUpload({filename,sizeBytes,contentType}), storageDelete(key), and getFileById(id) (returns {url, fileName, contentType} — fetch the url for bytes). Same surface as runCodeInBrowser's _floot, minus the DOM/editor-only helpers.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYes
projectIdYes
timeout_secondsNo
run_testsRun TestsA
Read-only
Inspect

Run the project's Jasmine spec files (helpers/.spec.tsx) headlessly on the project VM (jsdom — no browser needed). Frontend AND backend code is testable: specs may render components (@testing-library/react) or import endpoint handlers/backend helpers and call them directly. Limits: fetch throws inside tests (mock with spyOn(globalThis, "fetch")), process.env secrets are absent, and specs importing @floot/ service modules are skipped (no mocks yet). Returns per-file PASS/FAIL with failing expectations. Defaults to all spec files except hook specs (file name contains "use" — those need real React scheduling and are excluded, matching the in-editor checker); pass paths to run specific spec files, including hook specs.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathsNo
projectIdYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already indicate readOnlyHint=true and destructiveHint=false, and the description adds substantial behavioral context beyond that: it runs headlessly on a VM with jsdom, details the testing environment limitations, explains that @floot/* modules are skipped, and describes the output format (per-file PASS/FAIL). This transparency helps the agent anticipate side-effects and constraints without contradicting the annotations.

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

Conciseness4/5

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

The description is fairly long but densely packed with useful information. It front-loads the core action and then logically covers scope, limitations, and customization. Every sentence adds value, though it could be slightly more structured (e.g., bullet points). The length is justified by the tool's complexity, so it earns a 4 rather than a lower score.

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 the tool's complexity (test execution, environment constraints, multiple spec types), the description covers all essential aspects: what runs, how it runs, what to expect (PASS/FAIL), default exclusions, and how to override. It lacks an output schema but compensates with descriptive output information. An agent would know exactly what to do and what to expect, making this complete.

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 0%, so the description must compensate for both parameters. It explains 'paths' well ('pass paths to run specific spec files') and implies that projectId identifies the project. However, it does not explicitly describe projectId's format or purpose, leaving some ambiguity. Since the tool is project-specific, projectId is likely obvious, but the description could be more explicit. Given the limited compensation, a score of 3 is fair.

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 states a specific verb ('run') and resource ('Jasmine spec files'), with precise scope ('helpers/*.spec.tsx', headlessly on VM with jsdom). It clearly distinguishes itself from siblings like run_code_in_vm or typecheck by focusing exclusively on test execution. The title and name align, and the description leaves no ambiguity about the tool's function.

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?

The description provides explicit guidance on when and how to use the tool: defaults to all spec files except hook specs, pass 'paths' to run specific files including hook specs. It also explains constraints (fetch throws, no env secrets, @floot/* skipped) that inform usage decisions. This is thorough and actionable, covering both default behavior and overrides.

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

screenshot_previewScreenshot the User's PreviewA
Read-only
Inspect

Capture a screenshot of the user app. Call it whenever you want to SEE what the app currently looks like (layout, styling, rendered state) or want to debug the app. By default it shows whatever device the user has the preview on. Pass viewport to see it on another device — this is how to check a mobile or tablet layout: the preview switches to that device for the capture only, then back. Never build a separate "mobile" page or example just to look at a narrow layout.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewportNoDevice to capture on: "desktop", "iphone-15", "pixel-7", "ipad" — the preview's own device presets (Desktop, iPhone (393×852), Pixel (412×915), iPad (820×1180)) — or a custom "WIDTHxHEIGHT" such as "600x800". "iphone-15" is the usual phone check. Omit to capture what the user sees.
projectIdYes

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, so the read-only nature is covered. The description adds valuable behavioral context: default capture uses the user's current device, and passing viewport temporarily switches the preview only for the capture. This prevents an agent from assuming the device change is persistent. It doesn't mention response format, but that is not central to behavioral safety.

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 sentences deliver purpose, usage timing, default behavior, device-switching semantics, and a guardrail against an anti-pattern. Everything is front-loaded and substantive; there is no filler or redundant restatement of the title or annotations.

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?

The description provides enough context for an agent to decide when to call the tool, what projectId to supply, and how to use viewport correctly. The only minor gap is not describing what the tool returns (e.g., an image path or data), but for a screenshot capture this is largely inferable.

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

Parameters5/5

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

The viewport parameter is richly documented with concrete presets, pixel dimensions, a custom WIDTHxHEIGHT format, and a recommended default for phone checks. The description body reinforces the default behavior when viewport is omitted. projectId is straightforward as the required project identifier, so the 50% schema coverage is adequately compensated.

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 states a specific verb and resource: 'Capture a screenshot of the user app.' It also clarifies why to call it — to see layout, styling, or rendered state, or to debug — which distinguishes it from sibling tools that navigate or return URLs. The anti-pattern warning about building a separate mobile page further sharpens its unique purpose.

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 explicitly says to call it whenever the agent wants to see the current app state, and it gives concrete guidance for the viewport parameter, including that the preview switches only for capture and then back. It does not explicitly compare against sibling read-only tools like get_preview_url or navigate_preview, but the context is strong enough to guide selection.

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

search_codeSearch CodeA
Read-only
Inspect

Search a Floot project's files (string or regex) with optional glob filters (e.g. ['components/*', 'endpoints/**']). Returns file:line excerpts plus filename matches; capped at 40 results.

ParametersJSON Schema
NameRequiredDescriptionDefault
globNo
queryYes
regexNo
projectIdYes

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 and destructiveHint=false, so the description adds value by disclosing the result format (file:line excerpts plus filename matches) and the 40-result cap. It does not contradict annotations and provides useful behavioral details about output and limits.

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 a single, dense sentence that front-loads the purpose (search project files) and immediately provides key options (string or regex, glob filters) and output characteristics (file:line excerpts, 40-result cap). No filler or redundant statements; every clause adds information.

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 that annotations cover the safety profile (non-destructive, read-only), and the description states the return format and result cap, an agent has enough information to invoke this tool correctly. The parameters are adequately described, and the optional glob filtering is explained with examples. No missing critical information for a search operation.

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?

With 0% schema description coverage, the description compensates by explaining the query parameter (string or regex), the regex boolean (interpretation toggle), and providing examples for the glob filter array. The projectId parameter is implied via 'a Floot project' but not explicitly detailed, which is a minor gap. Overall, the description adds meaningful semantics beyond the bare 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?

The description states a specific verb ('Search'), a specific resource ('a Floot project's files'), and key capabilities (string or regex, glob filters). It distinguishes from the sibling 'search' by specifying 'project's files' and 'file:line excerpts', making its purpose unambiguous.

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

Usage Guidelines4/5

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

The description provides clear context: it is for searching code files within a project, with optional glob scoping. However, it does not explicitly contrast with sibling tools like 'search' or 'read_file', or state when to avoid this tool. Given the tool name and description, an agent can infer its role, but explicit exclusions would improve it.

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

typecheckTypecheck ProjectB
Read-only
Inspect

Typecheck the project (incremental tsc on the project VM). Type errors don't block the app from running.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathsNo
projectIdYes

TDQS

B3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, covering the safety profile. The description adds the key behavioral fact that 'type errors don't block the app from running', which is useful context beyond the annotations. However, it does not describe what the tool outputs (e.g., exit codes, error list), so the additional disclosure is limited.

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 concise sentences, with the core purpose first and a behavioral note second. No wasted words or redundant details. It is appropriately sized for a simple tool, though the sentence order could optionally front-load the non-blocking behavior.

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?

For a simple typecheck tool with annotations covering safety, the description covers the basic purpose and a key behavioral nuance. However, it omits semantics for the optional 'paths' parameter and does not describe the return value or how errors are surfaced. Given the low schema coverage, this is a notable incompleteness.

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

Parameters2/5

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

Schema description coverage is 0%. The description implies projectId from 'the project' but provides no explanation of the optional 'paths' parameter. An agent cannot infer whether 'paths' restricts typechecking to specific files or directories. The lack of parameter documentation is a significant gap.

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 clearly states the tool's action ('Typecheck the project') and provides implementation detail ('incremental tsc on the project VM'). It is specific about the resource (project) and the operation, distinguishing it from siblings like run_tests or run_code_in_vm without explicit differentiation, but the purpose is unambiguous.

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 guidance on when to use this tool versus alternatives. It does not mention that it is lightweight or incremental compared to a full typecheck, nor does it reference any sibling tool or condition. The note about type errors not blocking the app is informative but not a usage directive.

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

unpublish_appUnpublish AppA
Destructive
Inspect

Take the published app offline and release its subdomain — destructive, confirm with the user first. Details: get_guides('publishing').

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds value beyond them: the subdomain is released, and the agent is told to require user confirmation before acting. It doesn't cover reversibility or post-unpublish state, which keeps it from a 5.

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

Conciseness5/5

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

Two tightly written sentences, front-loaded with the action and the destructive warning, with a pointer to a guide at the end. No wasted words.

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 one-parameter destructive tool with no output schema, the description covers purpose, destructiveness, confirmation, and a guide pointer. The only real gap is the undocumented projectId parameter.

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

Parameters2/5

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

Schema description coverage is 0% and the single required parameter 'projectId' is undocumented in both schema and description. The description says nothing about which project identifier is expected, so it fails to compensate for the coverage gap.

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

Purpose5/5

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

States a precise verb+resource ('take the published app offline') and even names the side effect ('release its subdomain'). This clearly distinguishes it from the sibling publish_app.

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 usage context: take the live app offline. It adds an operational precondition ('confirm with the user first') and routes the agent to get_guides('publishing') for detail. It does not explicitly name publish_app as the reverse alternative, so it falls short of full when/when-not coverage.

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

update_project_metadataUpdate Project MetadataAInspect

Update project settings (current values appear at the top of list_files). Keys: title (2-100 chars), description, iconUrl (the app's icon/logo: favicon, home-screen icon and native app icon — a /_cdn/static/… path from upload_asset, generate_image or request_user_upload, or an absolute https URL; null resets), splashUrl (native splash screen, same value forms), mobileAppId, enableSSR (boolean), flootAiDisallowed (boolean — true opts the project out of @floot/ai), and iOS Info.plist purpose strings (NS…UsageDescription — set to a string, or null to remove) plus boolean Info.plist keys (UIViewControllerBasedStatusBarAppearance — set to a boolean, or null to restore the template default). Invalid keys/values are reported and skipped. NOTE: these take effect on the published app only after the next publish (publish_app, or the user's Publish button). The iosInfoPlist keys only affect builds made before the first iOS publish; after the iOS app is published, edit the project file static/__dev/native/ios-info.plist directly with write_file/edit_file (see get_guides('ios-info-plist')). Likewise, after the first Android publish, edit static/__dev/native/android-manifest.xml directly for manifest changes (see get_guides('android-manifest')). shareTarget makes the native app appear in the iOS and Android share sheets (other apps can share photos/videos/files/text into it): pass { enabled: true, mimeTypes?, allowMultiple? } to register, { enabled: false } to remove; receiving the shared items still needs the handler in app code — read get_guides('share-target') first and ship both together. nativeSystemBars controls how the native app treats the status bar / Android navigation bar: mode 'inset' (default) keeps the app below the bars and paints the exposed strips color (default black — set it to the app's header color for a seamless look); mode 'edge-to-edge' runs the app under the bars, which REQUIRES the app to pad by var(--safe-area-inset-top/bottom) itself — read get_guides('native-system-bars') first and ship both changes together. Not superseded by the __dev/native files. serverMemoryMb sets the memory (MB) of the project's server Lambda, which runs every endpoint, queued task, scheduled job and SSR render (default 1024 MB; 2048 for the published app when SSR is on — the dev backend never bumps). EXPERT SETTING — NEVER change it on your own initiative or as a side effect of another request, only when the user explicitly asks to change the server memory AND understands the trade-off: too low and the backend stops working entirely (killed out-of-memory); Lambda CPU scales with memory, so a lower value also makes every request slower and — because compute is billed per GB-second of billed duration — can cost MORE, not less; a higher value costs more per millisecond. Allowed range 512–4096 MB, whole MB (if a size turns out not to be available for the app's server, the deploy fails and the error names this setting). It applies to the dev backend at the next backend deploy and to the published app at the next publish. Pass null to restore the default. Read get_guides('server-memory') before changing it. analyticsMode controls the built-in visitor analytics tracker every published app includes (the project's Analytics tab): 'storage' (default) keeps a 30-minute session id in the visitor's localStorage, which is device storage that needs consent under EU ePrivacy / UK PECR — an app with EU/UK visitors pairs it with a consent banner that calls window.flootAnalytics.setMode(); 'memory' keeps the id in memory only (nothing stored on the device, no consent needed, but a reload or new tab counts as a new session); 'off' sends no analytics at all. Only change it when the user asks about analytics, cookies, consent or privacy for their published app; it takes effect at the next publish. Read get_guides('analytics') for the consent-banner API before changing it. iosDeviceFamily picks the devices the native iOS app is built for: 'iphone-and-ipad' (default, universal) or 'iphone' (iPhone only — the app still installs on iPads but runs there in iPhone compatibility mode, and App Store Connect no longer asks for iPad screenshots). This is the ONLY way to make the app iPhone-only: it is an Xcode build setting, so a UIDeviceFamily key in static/__dev/native/ios-info.plist is overwritten at build and does nothing. One-way door: App Store Connect rejects an update that drops iPad once a version supporting iPad has been released on the App Store, and the build then fails at upload. Before setting 'iphone', ask the user whether the app is already live on the App Store; if it is, tell them it cannot be made iPhone-only and do not set it. Takes effect at the next iOS publish. securityHeaders sets the published app's own page headers: embedding (who may show the app in an iframe: 'anyone' (default), 'self', 'none', or a list of https origins), csp (directive -> the COMPLETE source list for it, replacing the platform's; other directives keep the platform's), cspReportOnly (try csp without enforcing it) and referrerPolicy. Each field passed replaces the stored one and null removes it (inside csp, per directive); securityHeaders: null restores the platform defaults. Changes that would break the app are refused with the reason. Change it only when the user asks about embedding / iframes / clickjacking, a security scan finding, a stricter or looser Content-Security-Policy, or referrer privacy; it takes effect at the next publish and never in the preview. Read get_guides('security-headers') before changing it.

ParametersJSON Schema
NameRequiredDescriptionDefault
updatesNoFlat metadata fields (see the tool description).
projectIdYes
shareTargetNoShare-sheet target config (iOS Share Extension + Android share sheet). Omit to leave unchanged; { enabled: false } removes it.
analyticsModeNoBuilt-in visitor analytics mode for the published app: 'storage' (default, session id in localStorage — needs a consent banner for EU/UK visitors), 'memory' (nothing stored on the device, no consent needed) or 'off' (no analytics). Omit to leave unchanged.
serverMemoryMbNoMemory (MB) of the project's server Lambda, 512–4096. EXPERT SETTING: only on an explicit user request to change the server memory (see the tool description for the risks); never touch it otherwise. Omit to leave unchanged; null restores the platform default.
iosDeviceFamilyNoDevices the native iOS app is built for: 'iphone-and-ipad' (default) or 'iphone' (iPhone only). Not possible for an app already released on the App Store with iPad support. Omit to leave unchanged.
securityHeadersNoThe published app's own page headers. Omit to leave unchanged; null restores the platform defaults. Fields: embedding ('anyone' | 'self' | 'none' | list of https origins), csp ({ directive: [complete source list] } replacing the platform's for that directive; a directive set to null goes back to the platform's), cspReportOnly (boolean), referrerPolicy. A field passed as null is removed; a field left out is kept.
nativeSystemBarsNoNative system-bars config. Omit to leave unchanged; { mode: 'inset' } with no color restores the default.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only say readOnlyHint=false/destructiveHint=false; the description discloses far more: changes apply on next publish not now, invalid keys are reported and skipped, iosDeviceFamily is a one-way door that can fail at App Store upload, securityHeaders changes that would break the app are refused, and several settings require coordinated app-code changes. This is rich behavioral context beyond the annotations.

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

Conciseness3/5

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

The purpose is front-loaded and every topic is relevant, but the description is a single unbroken wall of text and re-explains several settings (analyticsMode, serverMemoryMb, iosDeviceFamily, securityHeaders) that the schema already documents in detail, so a meaningful share of the length is redundant. Given the genuine complexity of an 8-parameter tool, the size is defensible but the structure is not.

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 complex, high-risk mutation tool with no output schema, the description covers deploy timing, prerequisites (get_guides), failure modes, null/reset semantics and cross-file caveats, so an agent has everything needed to invoke it safely. No return-value documentation is required since there is no output schema.

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

Parameters5/5

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

Schema coverage is already 88%, but the generic `updates` flat object carries no per-key meaning on its own, and the description supplies it: title length bounds, iconUrl/splashUrl accepted value forms, null-to-reset semantics, boolean key behavior, and the full shape/meaning of shareTarget, nativeSystemBars, securityHeaders and analyticsMode beyond 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 ('Update project settings') and then enumerates the exact keys that can be changed, with a pointer to where current values live (list_files). It distinguishes itself from siblings by referencing publish_app, write_file/edit_file, upload_asset, generate_image and request_user_upload for adjacent tasks.

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/when-not rules for the risky settings: 'EXPERT SETTING — NEVER change it on your own initiative', 'Only change it when the user asks about analytics, cookies, consent or privacy', 'Change it only when the user asks about embedding / iframes'. It also routes the agent to alternatives (edit static/__dev/native/*.plist directly after first publish, read get_guides first) so the agent knows when another tool is correct.

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

upload_assetUpload AssetAInspect

Upload a binary asset (image, font, audio, …) to the project's hosted storage. This uploads bytes you actually hold — a file you generated, downloaded, or read yourself. Chat attachments don't qualify: the user's attachments never reach MCP servers (you see attached images through vision only; there is no file, id, or URL behind them you can read), so for those use request_user_upload instead and the user re-picks the file in a card that uploads from their browser. Three modes. ChatGPT conversation files — a generated image, a file ChatGPT itself holds: pass the file as the file parameter and the host attaches a download link itself; this server fetches the bytes directly, at full quality (nothing goes through your sandbox or through base64 in arguments; content_type and size_bytes are optional here). Never downscale or re-encode a generated image to fit the inline cap — pass it as file instead. Files up to 3 MB you hold yourself — pass content_base64 plus size_bytes (the decoded byte count) and the upload completes in this call, returning publicUrl. Larger files — pass size_bytes alone to get an uploadUrl; PUT the raw bytes to it with the same content_type and exact byte count (e.g. curl -X PUT -H 'Content-Type: image/png' --data-binary @file.png '<uploadUrl>'), then reference publicUrl. Some sandboxes (claude.ai Cowork, ChatGPT containers) block egress to S3: if the PUT fails in any way — connection failure, proxy error, or a response without an x-amz-request-id header — that block is permanent for the session, so switch paths instead of retrying or re-encoding smaller: the file parameter in ChatGPT for any file that exists in this conversation, content_base64 for files under 3 MB, request_user_upload for user-provided files, or a PUT from inside the project VM via run_code_in_vm (re-mint the URL first; it is short-lived). For AI imagery generated fresh, use generate_image. A single file can be at most 100 MB via the presigned mode (the inline content_base64 mode is capped at 3 MB).

ParametersJSON Schema
NameRequiredDescriptionDefault
fileNoChatGPT only: a file from this conversation (e.g. a generated image). The ChatGPT host fills download_url/file_id when you reference the file; the values are host-issued and cannot be constructed by hand — on clients without file-parameter support, leave this unset and use the other modes.
file_nameYes
projectIdYes
size_bytesNoRequired unless `file` is set. Exact byte count of the file, as measured from the file itself (e.g. stat/ls -l). With content_base64 it must equal the decoded length; in presigned mode the PUT must send exactly this many bytes.
content_typeNoRequired unless `file` is set (in that mode the type is derived from the downloaded bytes; pass this only as a hint).
content_base64NoThe file's bytes, base64-encoded (≤3 MB decoded). When set, the upload completes in this call.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=false, destructiveHint=false, openWorldHint=true. The description adds substantial behavior the annotations cannot convey: three distinct upload modes with different completion semantics (inline vs presigned), size caps (3 MB inline, 100 MB presigned), short-lived uploadUrl, and the S3 egress-block failure signature (missing x-amz-request-id header) plus the explicit 'do not retry, switch paths' guidance.

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 on the core verb and the critical disqualifier (chat attachments), then structured by mode. It is long, but given six parameters, three modes, and a hard failure mode, nearly every sentence carries operative information. A tighter edit could fold the failure-path list, but nothing is pure 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?

No output schema exists, and the description names the return values (publicUrl, uploadUrl) and the full call lifecycle for each mode. For a 6-parameter tool with nested objects and out-of-band PUT steps, all the information needed to invoke it correctly on the first attempt is present.

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 67% and the description compensates well, explaining that file_id/download_url are host-issued and cannot be hand-constructed, that size_bytes must equal the decoded length in base64 mode and the exact PUT byte count otherwise, and that content_type is a derived hint in file mode. It does not restate the file_name pattern, but the schema covers that.

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 ('Upload a binary asset ... to the project's hosted storage') and immediately delimits scope against siblings: request_user_upload for chat attachments, generate_image for fresh AI imagery. An agent can distinguish it from card_upload_asset, copy_file, and write_file 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?

Explicitly routes between four alternatives with the selecting condition for each: request_user_upload when the bytes are user-provided, generate_image when generating fresh imagery, the `file` param for ChatGPT conversation files, and run_code_in_vm PUT when sandbox egress is blocked. It also states the when-not case (chat attachments never reach MCP servers) with the reason.

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

view_annotationView AnnotationA
Read-only
Inspect

View a screenshot annotation the user drew on the app preview (annotationId comes from get_current_context). Returns the annotated image — the user's drawings/text point at what they mean. Annotations expire after ~1 day.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYes
annotationIdYes

TDQS

A3.7/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 value by noting that annotations expire after ~1 day and that the tool returns an image. It does not mention error cases (e.g., expired annotation), but the extra context is useful beyond what annotations provide.

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 with no fluff. The most important info (what it does and where the id comes from) is front-loaded, and the expiration note is placed at the end. Every sentence earns its place.

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?

For a simple read-only tool with two string parameters and no output schema, the description covers the main behavior and return value. However, it leaves projectId undefined and does not mention what happens when an annotation expires or if the id is invalid. These gaps reduce completeness for an agent trying to use it reliably.

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 0%, so the description must compensate. It gives meaning to annotationId by pointing to get_current_context, but projectId is left completely unexplained. This partial compensation is insufficient for a required parameter, but the one semantic clue is helpful.

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 clearly states the action ('View a screenshot annotation') and resource ('the user drew on the app preview'), and clarifies the return value (annotated image). It does not explicitly distinguish from siblings like get_current_context, but it implies a complementary relationship rather than a replacement, so it is clear 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?

The description gives a key usage hint: 'annotationId comes from get_current_context', which tells the agent to call that tool first. However, it does not explicitly state when to use this tool over alternatives, nor any exclusions or conditions. The guidance is implied rather than explicit.

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

write_fileWrite FileAInspect

Create or fully overwrite a file in a Floot project. Content is written literally. Paths must follow the item scheme (see read_file); invalid paths are rejected with the rule they broke. Pass expected_version (from list_files/read_file) to detect concurrent edits. Writing components/Name.module.css sets the css of components/Name — other properties of the item are preserved.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
contentYes
projectIdYes
expected_versionNo

TDQS

A4/5.0
Behavior4/5

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

Adds valuable detail beyond annotations: literal content writing, path validation rules, concurrency detection via expected_version, and the special module.css side effect. Annotations only say it's not read-only and not destructive, so the description carries extra behavioral information. No contradictions.

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 description is about five sentences, front-loaded with the core action and then adding necessary nuances. No filler, every sentence earns its place. It is well-structured and easily scannable.

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?

Covers purpose, path rules, concurrency, and a special behavior. It lacks an explicit return value description (no output schema) and some edge cases (e.g., if expected_version is omitted), but overall it is more complete than typical write tools. The pointers to read_file help fill gaps.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must explain each parameter. It explains path (item scheme) and expected_version (concurrency check), but projectId is not mentioned and content is only described as 'written literally', which is insufficient. Coverage is partial, leaving half the parameters unexplained.

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 explicitly states 'Create or fully overwrite a file' – a specific verb and resource. It distinguishes from siblings (edit_file, apply_patch) by saying 'fully overwrite' and also describes the special CSS behavior, making the purpose unambiguous.

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

Usage Guidelines4/5

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

It gives clear guidance on path scheme (see read_file) and concurrency (pass expected_version). The phrase 'fully overwrite' implicitly contrasts with partial edits, and the CSS example illustrates a specific use case. It doesn't explicitly list when not to use it, but the instructions are enough for an agent to decide.

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. 1 tool update
    • Changedget_live_payments1 field changed
      • addedInput schema / properties / mode
        Added value: +{
        +  "description": "\"live\" (default): the published app's real payments. \"test\": test payments made in the preview.",
        +  "enum": [
        +    "live",
        +    "test"
        +  ],
        +  "type": "string"
        +}
  2. 1 tool update
    • Changedgenerate_image1 field changed
      • addedInput schema / properties / images / items / properties / reference_images
        Added value: +{
        +  "description": "Up to 4 of this project's stored images (PNG/JPEG/WebP) to base the image on, by path: /_cdn/<name> or private/<name>, exactly as upload_asset, request_user_upload or generate_image returned it. Not outside URLs.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "maxItems": 4,
        +  "type": "array"
        +}
  3. 1 tool update
    • Changedupdate_project_metadata1 field changed
      • addedInput schema / properties / securityHeaders
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": false,
        +      "properties": {
        +        "csp": {
        +          "anyOf": [
        +            {
        +              "additionalProperties": {
        +                "anyOf": [
        +                  {
        +                    "items": {
        +                      "type": "string"
        +                    },
        +                    "type": "array"
        +                  },
        +                  {
        +                    "type": "null"
        +                  }
        +                ]
        +              },
        +              "type": "object"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "description": "Directive -> its COMPLETE source list, replacing the platform's for that directive, e.g. { \"form-action\": [\"'self'\"] }. A directive set to null goes back to the platform's; directives left out are kept."
        +        },
        +        "cspReportOnly": {
        +          "description": "true: send `csp` as Content-Security-Policy-Report-Only (nothing blocked) to try it on the published app first.",
        +          "type": [
        +            "boolean",
        +            "null"
        +          ]
        +        },
        +        "embedding": {
        +          "anyOf": [
        +            {
        +              "anyOf": [
        +                {
        +                  "enum": [
        +                    "anyone",
        +                    "self",
        +                    "none"
        +                  ],
        +                  "type": "string"
        +                },
        +                {
        +                  "items": {
        +                    "type": "string"
        +                  },
        +                  "type": "array"
        +                }
        +              ]
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "description": "'anyone' (default), 'self', 'none', or a list of https origins (own origin always included)."
        +        },
        +        "referrerPolicy": {
        +          "anyOf": [
        +            {
        +              "enum": [
        +                "no-referrer",
        +                "no-referrer-when-downgrade",
        +                "origin",
        +                "origin-when-cross-origin",
        +                "same-origin",
        +                "strict-origin",
        +                "strict-origin-when-cross-origin",
        +                "unsafe-url"
        +              ],
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        }
        +      },
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "The published app's own page headers. Omit to leave unchanged; null restores the platform defaults. Fields: embedding ('anyone' | 'self' | 'none' | list of https origins), csp ({ directive: [complete source list] } replacing the platform's for that directive; a directive set to null goes back to the platform's), cspReportOnly (boolean), referrerPolicy. A field passed as null is removed; a field left out is kept."
        +}
  4. 1 tool update
    • Changedprovision_resource4 fields changed
      • addedInput schema / properties / app_functions
        Added value: +{
        +  "description": "Only for resource \"app-connection\": the exact function names this project needs from the other app's helpers/flootAppExports.tsx.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / app_note
        Added value: +{
        +  "description": "Only for resource \"app-connection\": one sentence for the user on why this project needs these functions. Shown in the confirmation dialog.",
        +  "type": "string"
        +}
      • addedInput schema / properties / app_target
        Added value: +{
        +  "description": "Only for resource \"app-connection\": the OTHER Floot app — its project id, name.floot.app address or custom domain.",
        +  "type": "string"
        +}
      • changedInput schema / properties / resource / enum
        Previous value: -[
        -  "database",
        -  "auth",
        -  "oauth-login",
        -  "microsoft-login",
        -  "google-integration",
        -  "microsoft-integration",
        -  "push-notifications",
        -  "self-edit",
        -  "payments",
        -  "shipping"
        -]New value: +[
        +  "database",
        +  "auth",
        +  "oauth-login",
        +  "microsoft-login",
        +  "google-integration",
        +  "microsoft-integration",
        +  "push-notifications",
        +  "self-edit",
        +  "payments",
        +  "shipping",
        +  "app-connection"
        +]
  5. 1 tool update
    • Changedprovision_resource1 field changed
      • changedInput schema / properties / resource / enum
        Previous value: -[
        -  "database",
        -  "auth",
        -  "oauth-login",
        -  "microsoft-login",
        -  "google-integration",
        -  "microsoft-integration",
        -  "push-notifications",
        -  "self-edit",
        -  "payments"
        -]New value: +[
        +  "database",
        +  "auth",
        +  "oauth-login",
        +  "microsoft-login",
        +  "google-integration",
        +  "microsoft-integration",
        +  "push-notifications",
        +  "self-edit",
        +  "payments",
        +  "shipping"
        +]
  6. 1 tool update
    • Changedcreate_project1 field changed
      • changedInput schema / properties / initial_prompt / description
        Previous value: -"The user's request for this app, in their own words: the message that asked for it, not the conversation around it."New value: +"A description of the app to build, in the user's own wording where they gave one. Stored as the project's system prompt."
  7. 1 tool update
    • Removedget_guide
  8. 1 tool update
    • Changedcreate_project1 field changed
      • changedInput schema / properties / initial_prompt / description
        Previous value: -"The user's original request that started this project, verbatim."New value: +"The user's request for this app, in their own words: the message that asked for it, not the conversation around it."
  9. 1 tool update
    • Addedget_live_payments
  10. 2 tool updates
    • Changedread_file1 field changed
      • changedInput schema / properties / older_than / description
        Previous value: -"Read the file as it was BEFORE an earlier change instead of the current file. Pass \"current\" for the version just before the latest change to it, then the cursor each result gives you to step one change further back — until you find a good version, then write it back with write_file (or merge by hand). Not a version number: each step is one recorded change to the file. Type errors and references are skipped for past versions."New value: +"Omit (or leave empty) to read the current file. Set it only to read the file as it was BEFORE an earlier change. Pass \"current\" for the version just before the latest change to it, then the cursor each result gives you to step one change further back — until you find a good version, then write it back with write_file (or merge by hand). Not a version number: each step is one recorded change to the file. Type errors and references are skipped for past versions."
    • Changedread_files1 field changed
      • changedInput schema / properties / older_than / description
        Previous value: -"Read the file as it was BEFORE an earlier change instead of the current file. Pass \"current\" for the version just before the latest change to it, then the cursor each result gives you to step one change further back — until you find a good version, then write it back with write_file (or merge by hand). Not a version number: each step is one recorded change to the file. Type errors and references are skipped for past versions."New value: +"Omit (or leave empty) to read the current file. Set it only to read the file as it was BEFORE an earlier change. Pass \"current\" for the version just before the latest change to it, then the cursor each result gives you to step one change further back — until you find a good version, then write it back with write_file (or merge by hand). Not a version number: each step is one recorded change to the file. Type errors and references are skipped for past versions."

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Enables building a full backend directly from MCP clients using natural language, including projects, boards, typed columns, data, and REST endpoints with API keys. It also supports deploying frontends and provides a ready-made admin interface for end clients.
    48
    193 npm
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources