reachpad-mcp
Server Details
Coding agents build full-stack apps in persistent workspaces and share them by link.
- Status
- Healthy
- Uptime
- 88.7% over 36 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-06-18
- URL
- Repository
- Reachpad/reachpad-mcp
- GitHub Stars
- 3
- Server Listing
- @reachpad/mcp
TDQS
Scored across 25 tools
Most tools target a distinct resource and action, with thorough cross-referenced descriptions (e.g., read_app explicitly points to read_app_file for omitted files). Some overlap exists among the read tools — read_app, read_app_version, and read_app_file all return version file contents — and between ls and tree, but the descriptions clarify the differences well enough that an agent can select correctly.
The large majority follow a consistent verb_noun snake_case pattern: create_app, read_app, update_app, set_secret, remove_secret, share_app, revoke_app_share. The deviation is a cluster of five Unix-style commands — ls, mkdir, mv, rmdir, tree — which is a recognizable convention but still breaks the dominant pattern.
At 25 tools, the server sits right at the upper boundary of what feels reasonable. The broad domain — app lifecycle, versioning, folders, sharing, secrets, database queries, logs, previews — justifies most tools, but the count is heavy for a single MCP server and could have been consolidated (e.g., folder operations as a smaller set).
The surface covers the core workflows well: app create/read/update/trash, version listing and publishing, folder management, sharing/access control, and secret lifecycle. Minor gaps exist — an app cannot be restored from trash via a tool (the website handles it), there is no explicit list-all-apps tool (though ls/tree/search cover it indirectly), and function logs are not yet captured.
Available Tools
25 toolscreate_appPublish a new appAInspect
Publish new files as an app and get its URL back. Version 1 goes live at once, so show the person the content and the destination before calling this. Access defaults to org_link, which lets anyone signed in to the same organization open the link.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | What the app is called. Shown in listings. | |
| slug | No | The readable part of the subdomain to publish at, 3 to 34 characters of a-z, 0-9 and single hyphens. Derived from the name when omitted. A random 5-character tag is always appended, so a name is never taken and two apps may share one. | |
| type | No | The badge on the row. Defaults to app. | |
| files | Yes | Files to publish as plain text, not base64: HTML, Markdown or JavaScript exporting default { fetch }. A page serves index.html at its URL. Functions declaring db include schema changes as migrations/NNNN_name.sql, run in order when the version goes live. | |
| access | No | Who may open the link. Defaults to org_link. | |
| message | No | What version 1 contains. | |
| manifest | No | Omit on create_app for a static page; omit on update_app to keep the previous version's manifest. If supplied, replaces the entire manifest: include every field still needed. services, secrets and env apply only to functions. Runtime details and limits: https://reachpad.dev/SKILL.md | |
| validate | No | Check without writing. Validates and returns the resulting file set, total bytes, entry and kind. create_app also validates the slug and returns it with the URL; <tag> stands for five random characters assigned on publish. Does not check the org app limit; publishing can still fail for that. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations only say the tool is not read-only, not idempotent, and not destructive, so the description carries most of the side-effect burden. It discloses the important live-at-once behavior, the default org_link access, and the need to pre-confirm content and destination with the user, which goes beyond the annotations. It does not detail reversibility or failure limits, but the schema covers other conditional behaviors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning inclusion: immediate action, pre-confirmation caution, and access default. The most critical operatonal fact — that version 1 goes live and is not pending — is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complex schema, the description does enough to call safely for a first publish: states the outcome, the immediate visibility, and access default. The validate parameter has a different return shape but that is fully documented in its own property description, so the header note is a reasonable omission and not a fatal gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100%, so the baseline is 3. The description adds some semantic context about access ('lets anyone signed in to the same organization open the link') but does not meaningfully expand on the remaining parameters beyond the already rich schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Publish new files as an app and get its URL back.' The phrase 'Version 1 goes live at once' distinguishes this creation flow from version updates, matching the title and separating it from sibling tools like update_app and publish_app_version.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear precondition — 'show the person the content and destination before calling this' — which implies the user-facing review needed before an immediate public/org-visible publish. However, it does not explicitly say when to prefer update_app or publish_app_version over create_app, so the alternatives are only implied by context and the title.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_app_logsRead app logsARead-onlyIdempotentInspect
Read recent log lines from the live version of a function app. An app that serves files has no process and answers that it has no logs. Function logs are not captured yet either, and the answer says so: until they are, have the function catch its own errors and return them in the response.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many rows to return. Defaults to 50. | |
| since | No | RFC 3339 timestamp to read from. | |
| app_id | Yes | The app id, as returned by search_apps or create_app. Starts with app_. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds valuable behavioral context: unexpected responses for file-serving apps and function apps, plus a recommended fallback behavior, which goes beyond what annotations state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the first sentence states the core action clearly, and the next two sentences add necessary caveats and a workaround. Every sentence carries useful information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only log tool with no output schema, the description covers the main operation, edge cases, and fallback guidance. It omits details about the exact return shape, but that is less critical given the annotations and the clarity of the core use case.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers 100% of parameters with clear descriptions, including defaults and constraints. The tool description does not add significant parameter-level meaning beyond the schema, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Read recent log lines from the live version of a function app.' This clearly differentiates it from sibling tools like read_app_file or read_app_version, which handle files or version metadata rather than logs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides practical guidance about when logs will or will not be available: apps serving files have no process, and function logs are not captured yet. It also gives an actionable workaround (have the function catch its own errors), though it does not name alternative tools because none exist for logs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_app_versionsList versionsARead-onlyIdempotentInspect
List an app's versions, newest first. Versions are immutable and numbered from 1. Earlier versions open for the app's editors; the live link follows the app's access setting. Pass the next_cursor from a previous call to get the next page.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many rows to return. Defaults to 50. | |
| app_id | Yes | The app id, as returned by search_apps or create_app. Starts with app_. | |
| cursor | No | next_cursor from a previous call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent/non-destructive annotations, the description adds meaningful behavioral context: versions are immutable, numbered from 1, earlier versions are editor-only, and the live link follows the app's access setting. This helps the agent understand what the operation exposes without claiming any mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, all earning their place: core purpose, ordering, visibility/access context, and pagination. No filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete enough for selecting and invoking the tool safely: it covers ordering, immutability, access behavior, and pagination. The only minor gap is that there is no explicit description of the return shape, but no output schema exists and 'List versions' makes the expected return type reasonably inferable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents app_id, limit, and cursor. The description mentions the next_cursor pagination pattern, but this largely duplicates the cursor field's schema description rather than adding new parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'List an app's versions, newest first.' The collection scope clearly distinguishes it from sibling read_app_version (single version fetch) and publish_app_version (creation).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for pagination with next_cursor, but it does not explicitly say when to prefer this tool over read_app_version or publish_app_version. Usage is implied rather than directly stated, so it earns the minimum viable score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_secretsList secretsARead-onlyIdempotentInspect
List the organization's secrets: each name, who set it, when, and the apps whose versions bind it. Names only. No tool anywhere returns a secret value.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, and non-destructive behavior. The description adds meaningful behavioral context beyond annotations: the returned metadata includes names, setters, timestamps, and bound app versions, and that even the full tool ecosystem will never expose secret values. This direct disclosure of the tool's security boundary is valuable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two tight sentences with no wasted words. The core action and scope are front-loaded, the output composition is stated compactly, and the important 'no secret values' limitation earns its place. Every sentence adds information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless listing tool with annotations covering read-only/idempotent behavior, the description covers everything an agent needs: what is listed, the organizational scope, the fields returned, and the all-important fact that secret values are unreachable. With no output schema present, this description adequately replaces it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the schema leaves nothing for the description to compensate for. The description still helps by defining the scope ('organization's secrets') and the output fields, which is more than the empty schema provides. A score of 4 is appropriate for a parameterless tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and a clear resource ('the organization's secrets'), and precisely enumerates what is returned: each name, who set it, when, and the bound app versions. It also clarifies the scope boundary with 'Names only' and the security guarantee that no tool returns secret values. This unambiguously distinguishes list_secrets from mutation siblings like set_secret and remove_secret.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes clear this tool is for obtaining a read-only inventory of secrets, including who set them and which app versions bind them. It also tells the agent that no tool anywhere returns secret values, which prevents futile attempts to retrieve actual secret content. It does not explicitly name sibling alternatives, but the listing purpose is not easily confused with create/update/delete operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lsList a folderARead-onlyIdempotentInspect
List what is directly inside one folder: its subfolders and the apps filed in it. Omit folder_id for the top level. Each folder carries the updated_at that mv needs.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many rows to return. Defaults to 50. | |
| folder_id | No | The folder to look inside. Omit for the top level. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds non-redundant behavioral context: it clarifies the non-recursive scope ('directly inside'), names the returned item types (subfolders and apps), and reveals a useful output field ('updated_at') relevant to the sibling 'mv'. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler: the first states the core action and scope, the second gives usage and cross-tool context. Every sentence earns its place and the most critical behavioral detail is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with two optional, fully documented parameters and safety annotations, the description covers the essential behavior, top-level invocation, and a relevant return field. It does not enumerate the full return format, but that gap is minor given the tool's simplicity and the existing schema documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: both 'limit' and 'folder_id' are documented with defaults and usage. The description only restates the folder_id omission guidance already in the schema, adding no new parameter-level meaning. Baseline 3 is appropriate because the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List') and resource ('what is directly inside one folder'), and clarifies the content ('subfolders and the apps filed in it'). The phrase 'directly inside one folder' implicitly distinguishes it from the recursive sibling 'tree', making the tool's scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear usage context: how to list the top level ('Omit folder_id for the top level') and why this tool matters for a downstream workflow ('Each folder carries the updated_at that mv needs'). It does not explicitly name alternatives or when-not-to-use scenarios, so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mkdirCreate a folderAInspect
Create a folder, at the top level or inside another one.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The folder name. | |
| parent_id | No | The folder to create it inside. Omit for the top level. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide only readOnlyHint=false, idempotentHint=false, and destructiveHint=false, which carry limited behavioral weight. The description adds the key nested-folder behavior, but does not mention failure modes such as duplicate folder names, missing parent folders, or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler: verb, resource, and scope are front-loaded. Every part earns its place for this simple tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with one required parameter and full schema coverage, the description plus schema provide enough to invoke it correctly. It could optionally mention return values or duplicate-name behavior, but those are minor omissions for such a straightforward operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: both 'name' and 'parent_id' already have clear descriptions. The tool description adds only a plain-language restatement of nesting behavior without new constraints or syntax, so it falls at the baseline for fully covered schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Create') and resource ('folder'), and adds useful scope: 'at the top level or inside another one.' This clearly separates mkdir from filesystem siblings like rmdir, ls, and mv, and from unrelated app-level tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the primary use case clear—creating a folder, either at the top level or nested—and implicitly explains when parent_id should be provided versus omitted. It does not explicitly name alternatives or when not to use the tool, but no sibling tool directly competes with this action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mvMove an app or folderAIdempotentInspect
Move an app into a folder, or move a folder under another folder. Name exactly one of app_id or folder_id as the thing being moved, and to_folder_id as the destination, or null for the top level. Moving a folder also needs base_updated_at, the value read from ls or tree, so a move made against a stale reading is refused instead of undoing someone else's.
| Name | Required | Description | Default |
|---|---|---|---|
| app_id | No | The app to move. Name this or folder_id, not both. | |
| folder_id | No | The folder to move. Name this or app_id, not both. | |
| to_folder_id | Yes | The destination folder id, or null to move to the top level. | |
| base_updated_at | No | The moved folder's updated_at, from ls or tree. Required when folder_id is given. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint false, idempotentHint true, destructiveHint false), the description reveals an important behavioral guard: stale reads are refused rather than silently overwriting another user's move. It also discloses the exactly-one-of-two-identifiers rule, adding meaningful behavioral context 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no wasted words. The main action is front-loaded, followed by the exclusivity rule, destination semantics, and the stale-move guard. Every sentence contributes essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating tool with four parameters and no output schema, the description covers the core operational requirements: what can be moved, exclusivity, destination behavior, and the conditional base_updated_at requirement. It does not describe the return value, but this is a minor omission for a move operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents each parameter. The description adds value by explaining the relationship between parameters: exactly one of app_id/folder_id, top-level use of null to_folder_id, and the necessity of base_updated_at for folder moves. This goes beyond the field-level schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: move an app or folder. It precisely distinguishes the two use cases (app into folder, folder under folder) and differentiates itself from read-only siblings like ls and tree by describing a mutation operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage constraints: name exactly one of app_id or folder_id, use to_folder_id as destination or null for top level, and provide base_updated_at when moving a folder. It mentions that base_updated_at comes from ls or tree, giving practical guidance, though it does not explicitly list alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publish_app_versionMake a version liveAIdempotentInspect
Make one version of an app live by its number. This is how a version staged with publish false goes on the link, and how an app is rolled back: name an older number and that version is what the link serves again. Nothing is rebuilt, the pointer moves.
| Name | Required | Description | Default |
|---|---|---|---|
| app_id | Yes | The app id, as returned by search_apps or create_app. Starts with app_. | |
| number | Yes | The version number to make live. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the call as non-read-only, idempotent, and non-destructive; the description adds useful context by stating 'Nothing is rebuilt, the pointer moves,' explaining that rollback is a pointer change rather than a rebuild or destructive operation. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action, followed by the workflow context and a compact explanation of the underlying mechanism. Every sentence earns its place and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter operation with no output schema, the description covers what the tool does, when it is used, and what happens to the app link. It lacks explicit error/precondition notes such as whether the named version must already exist, but this is minor for an idempotent pointer-move operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema fully documents app_id and number. The description reinforces that number is the version to make live and that older numbers trigger rollback, but it does not add significant new parameter meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair: 'Make one version of an app live by its number.' It also clarifies the semantics in terms of the existing staged/publish-false workflow and rollback, so an agent can distinguish it from version-reading tools like list_app_versions and read_app_version.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear conditions for use: it is how a staged version goes live and how an older version is rolled back. It does not explicitly name sibling alternatives or list when-not-to-use cases, but the use scenarios are unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_app_dbRun one SQL statementAInspect
Run one SQL statement against a function app's own database, to read rows and to fix data. Not for schema: a table or a column belongs in the version's migrations/NNNN_name.sql, and a statement that changes the schema is refused. Owners and editors only. Answers rows and rowCount for a select, and changes with lastInsertRowid for a write.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | One statement, with ? placeholders for every value that comes from somewhere else. A second statement in the same string is refused. | |
| app_id | Yes | The app id, as returned by search_apps or create_app. Starts with app_. | |
| params | No | The values for the ? placeholders, in order. Strings, numbers, booleans and null. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations carry almost no signal (three false hints), and there is no output schema, so the description does the full disclosure burden: it reveals that schema-changing statements are enforced/refused, that only owners and editors may invoke it, and exactly what comes back ('rows and rowCount for a select', 'changes with lastInsertRowid for a write'). This return-format disclosure is essential and well handled. Nothing contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each carrying distinct value: purpose, schema exclusion, permission, and return shape. The core purpose and scope are front-loaded in the first sentence, and there is no redundant or filler wording — every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter tool with no output schema, everything needed for correct invocation is present: which app and SQL to pass (via schema), what the tool does, what it refuses, who may run it, and what it returns for both read and write statements. Error-case behavior is not described but is not required for correct selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents sql, app_id, and params including the single-statement rule. The description reinforces the one-statement constraint and the select-vs-write distinction, but adds no per-parameter meaning beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+goal: 'Run one SQL statement against a function app's own database, to read rows and to fix data.' The scope is pinned down by 'one statement' and the refusal of schema changes, and no sibling tool handles SQL against the app DB, so an agent can distinguish it without opening any other schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states when to use the tool (read rows, fix data) and gives an explicit when-not: 'a table or a column belongs in the version's migrations/NNNN_name.sql, and a statement that changes the schema is refused.' It routes schema work to the migration workflow rather than to any sibling tool by name, and adds an owner/editor prerequisite. Naming a direct sibling alternative would have made it a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_appRead an appARead-onlyIdempotentInspect
Read one app before update_app: its name, type, access level and publishing mode, plus base_version_id and its files, which both describe the version the next edit builds on. Each text file carries its content, so this is how you see what an app already contains before changing it. A file marked content_omitted answer budget did not fit in this answer and read_app_file fetches it; one marked too large is past what any tool answer carries. Pass that base_version_id to update_app. version is what the link serves now, and head_version is the version base_version_id names on the apps where that is not the live one, which is every app with a version staged by publish false. pending_version is the number of that staged version, and publish_app_version is what makes it live.
| Name | Required | Description | Default |
|---|---|---|---|
| app_id | Yes | The app id, as returned by search_apps or create_app. Starts with app_. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already set readOnlyHint/idempotentHint/destructureHint, and the description adds real behavioral facts: files carry contents, content_omitted/too_large markers, and the meaning of version, head_version, and pending_version. The disclosure is comprehensive, though the wording is occasionally garbled ('content_omitted answer budget did not fit').
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph with run-on sentences and unclear pronoun references ('that staged version', 'where that is not the live one'). It front-loads the purpose but sacrifices readability and structure, making it harder to parse than necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description does attempt to cover the important return fields and file-content handling. However, the confusing syntax and ambiguous references leave gaps that an agent must resolve through trial or other tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, app_id, is already fully documented in the schema (100% coverage). The description doesn't add parameter-level semantics; it focuses on output fields, which is appropriate, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Read one app before update_app', specifying the verb, resource, and the workflow slot. It distinguishes the tool from read_app_file and publish_app_version by naming those siblings for file content and publishing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage guidance: call before update_app, pass base_version_id to update_app, use read_app_file for files whose content is omitted or too large, and rely on publish_app_version to make a staged version live. This fully routes an agent between alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_app_fileRead one fileARead-onlyIdempotentInspect
Read one file out of an app as text, at most 256 KB. Use it for a file that read_app left out with content_omitted: "answer budget", or to fetch a single file without the rest of the app. A file that is not text, and a text file over that size, are refused rather than truncated. Reads the newest version unless you name one, which is the same version read_app lists.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | The path inside the app, as it appears in read_app's files, for example index.html. | |
| app_id | Yes | The app id, as returned by search_apps or create_app. Starts with app_. | |
| number | No | The version number to read from. Defaults to the newest version. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a safe read-only, idempotent operation. The description adds meaningful behavioral details: the 256 KB limit, refusal rather than truncation for non-text or oversized files, and the default-to-newest-version behavior with consistency to read_app's version listing. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four compact sentences, each earning its place: main purpose, usage trigger, size/type constraint, and version behavior. The most important scoping information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-one-file tool with no output schema, the description is complete: it specifies the return type (text), size cap, refusal behavior, and version selection. The agent has enough information to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents app_id, path, and number. The description adds useful cross-tool meaning for the number parameter: the version is the same one read_app lists, which helps the agent pick the correct version identifier.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the operation: read one file out of an app as text, at most 256 KB. It also distinguishes itself from read_app by specifically targeting files omitted with content_omitted and by fetching a single file without the rest of the app.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells when to use the tool: for files that read_app left out due to the answer budget, or to fetch a single file. It also warns that non-text and oversized files are refused, giving the agent clear criteria for avoiding misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_app_previewSee an appARead-onlyIdempotentInspect
Look at the picture of what an app's link serves right now, as an image. Use it for an app whose files you cannot read: a function app's module stays with the people who develop it, so this is how you see what the app actually shows. It is the live version only, and an app published before its picture was taken, or one whose capture has not run yet, answers that there is no picture rather than an error.
| Name | Required | Description | Default |
|---|---|---|---|
| app_id | Yes | The app id, as returned by search_apps or create_app. Starts with app_. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly and idempotent annotations, the description clarifies important behavior: it shows the live preview and returns 'no picture' rather than an error if a capture has not been generated yet. This helps set expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is informative but somewhat wordy and awkwardly phrased, with repetitive references to 'picture' and 'app's link serves.' It could be more direct while retaining the key usage and edge-case guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description compensates by indicating the result is an image and by explaining the no-preview behavior. It covers the main contexts an agent needs, though it could be slightly clearer about output format.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single app_id parameter, so the baseline is 3. The description does not add extra meaning about app_id beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool provides a picture/screenshot of an app's current live rendered state, which is a clear resource and action. It also differentiates from file-reading tools by noting it is for apps whose files you cannot read.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use this tool when you cannot read an app's files, such as a function app whose module remains with developers. It also notes it returns the live version only, giving practical selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_app_versionRead a versionARead-onlyIdempotentInspect
Read one version by its number, with its files and each text file's content. Use it to see what an earlier publish contained, and to copy a file back out of a version you want to return to. Earlier versions open for the app's editors; the live link follows the app's access setting.
| Name | Required | Description | Default |
|---|---|---|---|
| app_id | Yes | The app id, as returned by search_apps or create_app. Starts with app_. | |
| number | Yes | The version number. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint, idempotentHint, and destructiveHint annotations, the description adds useful behavioral context: earlier versions are open to the app's editors, while the live link follows the app's access setting. This helps the agent reason about visibility and permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three purposeful sentences with no filler. The core action is front-loaded, followed by use cases and an important access nuance. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with no output schema, the description adequately explains that the result includes files and each text file's content, plus access-relevant behavior. It does not detail the exact response structure, but that is not essential for this level of complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already well documented. The description adds no additional parameter-level meaning beyond saying 'by its number,' which is sufficient given the schema's clarity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Read one version by its number, with its files and each text file's content.' This clearly distinguishes it from siblings like list_app_versions (which lists versions) and read_app_file (which reads a single file).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear use cases: inspect what an earlier publish contained and copy a file back out of a version. It provides clear context for when to use the tool, though it does not explicitly name alternatives or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_secretRemove a secretADestructiveIdempotentInspect
Remove one organization secret and delete it from every published version that binds it. A version the deletion did not reach keeps the name in the list with that version in failed, and running this again retries exactly those.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The secret name, from list_secrets. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses what gets destroyed (the secret and its binding in every published version), how failures are surfaced (version kept in the list with status failed), and the retry behavior. This is exactly the context annotations alone would not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the core operation, and every sentence contributes meaningful behavior or failure semantics. There is no redundance or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool, the description explains the scope, failure state, and retry behavior, making it largely complete. It does not describe authorization requirements or the exact return format, but these are not critical for invoking the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers 100% of parameters and describes name as 'The secret name, from list_secrets.' The description adds no additional parameter semantic detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: remove one organization secret and delete it from every published version that binds it. This is a specific verb-resource pair that distinguishes it from sibling tools like set_secret and list_secrets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for use: it removes an organization secret and handles partial failures by allowing the operation to be retried. It does not explicitly contrast with alternatives, but the intended usage is well implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rmdirDelete an empty folderADestructiveIdempotentInspect
Delete an empty folder. This refuses while the folder still holds apps or subfolders, and it never deletes an app. Move the contents out first.
| Name | Required | Description | Default |
|---|---|---|---|
| folder_id | Yes | The folder to delete. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true and readOnlyHint=false, so the mutation is known. The description adds useful behavior beyond that: it refuses on non-empty folders and guarantees it never deletes an app, giving the agent a precise safety boundary. No contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no filler. The first sentence states the core operation, and the following sentences add necessary constraints and usage guidance. Information is front-loaded and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with no output schema and destructive/idempotent annotations, the description is complete: it defines the operation, the precondition, the refusal condition, and the safe next step. An agent has enough context to call it correctly without needing additional details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers folder_id fully with a description, so the baseline is 3. The tool description adds no direct parameter-level detail, but its constraints about empty folders and not deleting apps indirectly help an agent choose the correct folder.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the operation as deleting a folder, with the critical precondition that it must be empty. It also distinguishes itself from app-related tools by stating that it never deletes an app, which prevents confusion with sibling tools like trash_app.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit usage condition: the folder must be empty, and it refuses if apps or subfolders remain. It also recommends moving contents out first. It does not name an alternative sibling tool such as mv, but the workflow implication is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_appsSearch appsARead-onlyIdempotentInspect
Find apps in the caller's organization by text. This matches substrings of the name and the slug, and whole words on the live version's page, not meaning: search for a word that appears in the title or on the page rather than describing the app. Returns ids and live URLs.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Text to match against the name, the slug and the words on the live page. | |
| type | No | Keep only apps carrying this badge. | |
| limit | No | How many rows to return. Defaults to 50. | |
| created_by | No | Keep only apps owned by this user id or email address. | |
| updated_by | No | Keep only apps owned by this user id or email address. Version authors are not indexed in v1, so this filters on the owner. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation already marks the operation as read-only and idempotent. The description adds useful behavioral detail about search semantics and states that the result includes ids and live URLs, going beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence is concise, but the second sentence contains the confusing 'not meaning: search for a word...' clause, which muddies the structure and could be clearer.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description states scope (caller's organization), matching behavior, and return contents (ids and live URLs). With no output schema, it could be more explicit about result shape, but it provides enough context for a search operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% description coverage for all five parameters, so the baseline is 3. The description does not add significant extra meaning beyond repeating the general search behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb and resource: 'Find apps in the caller's organization by text.' It also specifies matching behavior (substrings of name/slug, whole words on the live page) and return type (ids and live URLs), but the awkward phrase 'not meaning...' introduces some confusion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: it is a text search over apps in the caller's organization, so an agent would use it when searching by text rather than known app IDs. However, it does not explicitly name alternatives or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_app_accessSet who can open an appAIdempotentInspect
Change who can open an app: restricted (only the owner and named people), org_link (anyone signed in to the organization), or public_link (anyone with the URL). A password and an expiry apply to a public link only. Owner only.
| Name | Required | Description | Default |
|---|---|---|---|
| level | Yes | ||
| app_id | Yes | The app id, as returned by search_apps or create_app. Starts with app_. | |
| password | No | Set a password on a public link. | |
| expires_at | No | RFC 3339 timestamp after which a public link stops working. | |
| clear_expiry | No | Remove the expiry. | |
| clear_password | No | Remove the password. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a write operation (readOnlyHint false) that is idempotent and non-destructive. The description adds meaningful behavioral context beyond annotations by clarifying the owner-only restriction and the public-link-only scope for password and expiry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three concise sentences with no filler. The primary action and access levels are front-loaded, and the remaining sentences add only necessary constraints ('Owner only' and public-link-specific behavior).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter tool with no output schema, the description covers the essential call-time facts: available levels, level semantics, the owner-only permission, and the conditions under which password/expiry apply. It is slightly thin on how 'named people' are managed, but this is partially covered by the sibling tool share_app.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high at 83%, with most parameters already described in the schema. The description adds value by explaining that password and expiry parameters only apply to public_link, which clarifies the relationship between level and the optional clear_password/clear_expiry fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Change') and a clear resource ('who can open an app'), then enumerates the three exact levels: restricted, org_link, and public_link. It does not explicitly differentiate itself from sibling tools like share_app, but the access-level framing makes the tool's purpose easy to identify.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides useful context such as 'Owner only' and 'password and an expiry apply to a public link only,' which guide when the tool is applicable. However, it does not explicitly state when to prefer set_app_access over alternatives like share_app or update_app, leaving some routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_secretSet a secretADestructiveIdempotentInspect
Set one organization secret, so a function can bind it by name in its manifest secrets list. Any member of the organization. Setting a name that already exists replaces the value and rotates it onto every published version that binds it. Answers the name, how many versions took the new value, and the ids of any that did not.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The environment variable name the function reads, for example STRIPE_SECRET_KEY. Letters, digits and underscores. | |
| value | Yes | The value. It is sealed on write: no tool returns it, this one included, and it is never written to a log or to this app's database. Ask the person to paste it themselves rather than repeating a key from earlier in the conversation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint=false, destructiveHint=true, idempotentHint=true), the description discloses key behaviors: replacing existing values, rotating to every published version binding the secret, and reporting affected version counts and failing IDs. It also notes organization-wide member access, adding real context beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with no filler. The core action is front-loaded, followed by update/rotation semantics and the response shape, so every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the schema covers parameters and the description covers permissions, upsert behavior, version rotation impact, and return value, nothing essential is missing for an agent to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both name and value are already fully documented in the schema. The tool description reinforces that the name is what functions bind, but does not add new parameter-level meaning; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a specific verb and resource: 'Set one organization secret.' It clearly distinguishes from siblings like remove_secret and list_secrets by describing the manifest-binding purpose and the replace-on-existing-name behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: secrets are set so functions can bind them by name in manifests, and re-setting an existing name replaces/rotates it. It does not explicitly contrast with remove_secret or list_secrets, but the intended use is strongly implied and unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trash_appMove an app to the trashADestructiveIdempotentInspect
Move an app to the trash. Its link stops opening at once. Owner only. The app and its versions are kept and can be restored from Trash at reachpad.dev/apps/trash, which is also the only place an app is deleted for good.
| Name | Required | Description | Default |
|---|---|---|---|
| app_id | Yes | The app id, as returned by search_apps or create_app. Starts with app_. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it as destructive/not read-only, but the description adds crucial behavior beyond that: the app link stops immediately, the app and versions are retained, restoration is possible, and permanent deletion only occurs at the Trash URL. This is exactly the kind of context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences front-load the action and effect, then pack ownership, retention, restoration, and permanent-deletion distinction into the closing sentence. Every clause earns its place; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter mutation tool, the description covers what happens on invocation, who can invoke it, that data is recoverable, and where permanent deletion occurs. The absence of an output schema is not a gap because no return value is needed 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema fully documents the only parameter, app_id, including its origin and prefix convention, so the description need not add parameter-level detail. The description adds no parameter semantics, but schema coverage is 100%, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Move') and resource ('an app') with target 'trash', and immediately clarifies the practical effect ('Its link stops opening at once'). The description also distinguishes from permanent deletion by noting the trash is the only place an app is deleted for good, which separates it from any destructive deletion intent among siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context and constraints: owner-only access, immediate effect, and restorability. It stops short of naming a sibling alternative or an explicit 'when not to use' statement, though the permanent-deletion note implies the trash interface is the alternative for full deletion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
treeRead the folder treeARead-onlyIdempotentInspect
The whole folder tree for the organization, nested, with the number of apps filed in each folder and the count sitting at the top level. Each node carries the updated_at that mv needs.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint true, idempotentHint true, and destructiveHint false, covering the safety profile. The description adds meaningful behavioral detail about the output: the whole tree is returned, nested, with per-folder app counts and top-level count, and each node carries updated_at. This goes beyond the annotations and gives the agent a concrete picture of what the call returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. The core purpose is front-loaded, and the additional detail about counts and updated_at adds value without bloating the definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only tool with no output schema, the description covers the essential return elements: hierarchical structure, app counts per folder, top-level count, and updated_at. It could be more explicit about the exact data shape or output format, but there is no missing information an agent would need to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. There is no schema burden for the description to compensate for. The description's focus on output content rather than any input shape is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as returning the organization's entire folder tree in nested form, with counts of apps per folder and at the top level. It is distinguishable from the sibling 'ls' tool, which likely lists a single folder's contents, though it does not explicitly name that alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use cases by mentioning the nested tree and the updated_at needed by 'mv', but it does not explicitly state when to use this tool versus siblings like 'ls' or 'mkdir'. There is no exclusionary guidance or alternative routing, leaving the agent to infer placement from the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_appPublish a new versionAInspect
Publish a new version of an existing app. Read the app first and pass the base_version_id read_app returns: it names the version this edit builds on, and a base that has moved is refused rather than overwritten. By default the new version replaces the whole file set and goes live immediately unless the app is set to review before publishing. Send mode merge to publish only the files that changed and keep the rest of that version's files, with remove for paths to drop. Two merges in a row build on each other, staged versions included. Send validate true to check the call without publishing, or publish false to stage the version and make it live later with publish_app_version.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | replace, the default, publishes files as the whole file set: anything left out is gone. merge sends only the files that changed and carries every other file of the base version into the new version. | |
| files | Yes | Files to publish as plain text, not base64: HTML, Markdown or JavaScript exporting default { fetch }. A page serves index.html at its URL. Functions declaring db include schema changes as migrations/NNNN_name.sql, run in order when the version goes live. | |
| app_id | Yes | The app id, as returned by search_apps or create_app. Starts with app_. | |
| remove | No | Paths from the base version to leave out of the new one. Merge only, and a path that is not in the base version is refused rather than ignored. A call that only removes files sends an empty files array. | |
| message | No | What changed in this version. | |
| publish | No | false stages the version instead of putting it on the link. It is built and readable at its own version URL, and publish_app_version makes it live. Defaults to true. | |
| manifest | No | Omit on create_app for a static page; omit on update_app to keep the previous version's manifest. If supplied, replaces the entire manifest: include every field still needed. services, secrets and env apply only to functions. Runtime details and limits: https://reachpad.dev/SKILL.md | |
| validate | No | Check without writing. Validates and returns the resulting file set, total bytes, entry and kind. create_app also validates the slug and returns it with the URL; <tag> stands for five random characters assigned on publish. Does not check the org app limit; publishing can still fail for that. | |
| base_version_id | Yes | The base_version_id read_app returned, which is the version this edit was made against. Starts with ver_. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide readOnlyHint=false, idempotentHint=false, destructiveHint=false, leaving behavioral burden to the description. The description thoroughly discloses side effects: 'replace publishes files as the whole file set: anything left out is gone,' merge semantics, that base-a-move is refused rather than overwritten, that it goes live immediately unless review/publish=false, and that two merges build on each other. It also notes validation side-effects (returns file set, bytes, entry, kind) and the org limit failure case. No annotation contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but dense, covering many behaviors without fluff. It is front-loaded with the core action and prerequisite, then explains modes, validation, and staging. Despite being a single paragraph, each sentence earns its place. Minor improvement could be bullet points, but the structure is logical and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is complex (9 params, nested objects, no output schema), and the description covers almost everything an agent needs: prerequisites, mode semantics, validation return info, staging, merge accumulation, manifest replacement rules, and failure modes. It omits a general description of the return value for the normal publish call (unlike the validate case), but references SKILL.md for runtime details. This is near-complete for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds substantial meaning beyond the schema. For example, it explains merge mode in the narrative, clarifies that files are plain text not base64, describes how functions with db include migrations, and links to SKILL.md for runtime details. It also clarifies base_version_id semantics ('the version this edit builds on') and the behavior of validate and publish flags. This goes well beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear specific verb and resource: 'Publish a new version of an existing app.' It distinguishes itself from create_app (new app) and publish_app_version (making a staged version live) by explicitly naming the latter and explaining the staging flow. 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit workflow guidance: read the app first, pass base_version_id, and mentions alternatives like publish_app_version for later publication. It explains when to use merge vs replace, when to use validate=true, and when to use publish=false for staging. It also warns about refusal conditions (base moved, path not in base). This is comprehensive usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoamiWho am IARead-onlyIdempotentInspect
Report the account and the organization this connection is signed in as: user id, email and name, plus org id and name, and orgs, every organization the account is in with the current one marked. Takes no arguments. Every app is created in the current organization and nowhere else, so call this before publishing when the person named an organization to publish into, and stop if the org id is not the one they named: switching is done at reachpad.dev/apps, from the organization name at the top of the sidebar, and this connection follows it.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint, idempotentHint, and non-destructive behavior. The description goes beyond this by detailing the output fields, the fact that the current org is marked within the orgs list, and the connection-follows-org-switching behavior, which adds meaningful behavioral context without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences: the first states the tool's output and the second provides essential usage logic. It is front-loaded and every sentence earns its place, with no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-argument, read-only tool, the description is complete: it enumerates the expected output fields and gives a concrete workflow directive (check before publishing, compare org id). No output schema exists, but the description sufficiently covers what the agent needs to call and interpret the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema is empty, so the baseline is 4. The description confirms 'Takes no arguments,' which adds no new semantics but also requires no parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reports the account and organization the connection is signed in as, listing specific fields (user id, email, name, org id/name, and orgs). This distinguishes it from the sibling app-management tools, which all target app operations rather than identity/connection context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides concrete usage guidance: call before publishing when the person named an organization to publish into, and stop if the org id doesn't match, with switching done at reachpad.dev/apps. It lacks explicit alternatives or when-not-to-use guidance, but the context is clear enough to direct an agent.
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.
2 tool updates
- Changed
create_app8 fields changed- changed
Input schema / properties / files / descriptionPrevious value: -"The files to publish. Content is plain text written here in the chat, not base64: an HTML page, a Markdown document, or a JavaScript module that exports default { fetch }. A page app serves index.html at the app URL. A function that declares the db service carries its schema changes here too, as migrations/NNNN_name.sql, which run in order when the version goes live."New value: +"Files to publish as plain text, not base64: HTML, Markdown or JavaScript exporting default { fetch }. A page serves index.html at its URL. Functions declaring db include schema changes as migrations/NNNN_name.sql, run in order when the version goes live." - changed
Input schema / properties / manifest / descriptionPrevious value: -"How the version runs. Omit it on create_app for a static page, and omit it on update_app to keep the previous version's manifest. A manifest that is sent replaces the whole of it, so send every field the app still needs. services, secrets and env are read by a function only. The data plane in full, with its limits: https://reachpad.dev/SKILL.md"New value: +"Omit on create_app for a static page; omit on update_app to keep the previous version's manifest. If supplied, replaces the entire manifest: include every field still needed. services, secrets and env apply only to functions. Runtime details and limits: https://reachpad.dev/SKILL.md" - changed
Input schema / properties / manifest / properties / entry / descriptionPrevious value: -"For a page, the file served at the root of the link, usually index.html. For a function, the module that exports default { fetch }. It has to be one of the files the version ends up with, which on a merge includes the ones carried over from the base."New value: +"Root file for a page, usually index.html; module exporting default { fetch } for a function. Must exist in the resulting files, including files retained by merge." - changed
Input schema / properties / manifest / properties / env / descriptionPrevious value: -"Plain string values a function reads as env.NAME. Stored as written and readable by anyone who can read the version, so put a key in secrets instead. A name that is also in secrets fails the publish."New value: +"Plain strings bound as env.NAME, visible to anyone who can read the version. Put keys in secrets instead. Names shared with secrets fail publication." - changed
Input schema / properties / manifest / properties / kind / descriptionPrevious value: -"page serves the files as they are. function runs one JavaScript module for every request to the link."New value: +"page serves files unchanged; function runs a JavaScript module for every request." - changed
Input schema / properties / manifest / properties / secrets / descriptionPrevious value: -"Names of secrets the organization has already set, each bound as env.NAME. A function only. Set the value first, in Settings at reachpad.dev/apps/settings/secrets or with reachpad secrets set NAME: a name the organization has not set fails the publish with NAME is not set."New value: +"Organization secret names bound as env.NAME for functions. Set values first at reachpad.dev/apps/settings/secrets or with reachpad secrets set NAME. An unset name fails publication with NAME is not set." - changed
Input schema / properties / manifest / properties / services / descriptionPrevious value: -"What the function may use, on env.reachpad: db is the app's own SQLite database, through env.reachpad.db.query(sql, params) and env.reachpad.db.batch(statements); files is its file store, through env.reachpad.files.put/get/head/delete. A function only, and any other name is refused when you publish. Declaring db also lets the version carry migrations/NNNN_name.sql, which run when it goes live."New value: +"Function services: db binds the app's SQLite database at env.reachpad.db.query(sql, params) and env.reachpad.db.batch(statements); files binds its file store at env.reachpad.files.put/get/head/delete. Other names are refused. db permits migrations/NNNN_name.sql, run when the version goes live." - changed
Input schema / properties / validate / descriptionPrevious value: -"Check the call and write nothing. Answers with the file set the publish would contain, its total bytes, the entry and the kind, and on create_app the slug and the URL the app would take, where <tag> stands for the five random characters drawn when it is published. It checks the file set, its total size, that the entry file is one of the files, and on create_app that the slug is a usable link name. It does not check the org's app limit, so a create that would be refused for that is still refused when it is published."New value: +"Check without writing. Validates and returns the resulting file set, total bytes, entry and kind. create_app also validates the slug and returns it with the URL; <tag> stands for five random characters assigned on publish. Does not check the org app limit; publishing can still fail for that."
- Changed
update_app8 fields changed- changed
Input schema / properties / files / descriptionPrevious value: -"The files to publish. Content is plain text written here in the chat, not base64: an HTML page, a Markdown document, or a JavaScript module that exports default { fetch }. A page app serves index.html at the app URL. A function that declares the db service carries its schema changes here too, as migrations/NNNN_name.sql, which run in order when the version goes live."New value: +"Files to publish as plain text, not base64: HTML, Markdown or JavaScript exporting default { fetch }. A page serves index.html at its URL. Functions declaring db include schema changes as migrations/NNNN_name.sql, run in order when the version goes live." - changed
Input schema / properties / manifest / descriptionPrevious value: -"How the version runs. Omit it on create_app for a static page, and omit it on update_app to keep the previous version's manifest. A manifest that is sent replaces the whole of it, so send every field the app still needs. services, secrets and env are read by a function only. The data plane in full, with its limits: https://reachpad.dev/SKILL.md"New value: +"Omit on create_app for a static page; omit on update_app to keep the previous version's manifest. If supplied, replaces the entire manifest: include every field still needed. services, secrets and env apply only to functions. Runtime details and limits: https://reachpad.dev/SKILL.md" - changed
Input schema / properties / manifest / properties / entry / descriptionPrevious value: -"For a page, the file served at the root of the link, usually index.html. For a function, the module that exports default { fetch }. It has to be one of the files the version ends up with, which on a merge includes the ones carried over from the base."New value: +"Root file for a page, usually index.html; module exporting default { fetch } for a function. Must exist in the resulting files, including files retained by merge." - changed
Input schema / properties / manifest / properties / env / descriptionPrevious value: -"Plain string values a function reads as env.NAME. Stored as written and readable by anyone who can read the version, so put a key in secrets instead. A name that is also in secrets fails the publish."New value: +"Plain strings bound as env.NAME, visible to anyone who can read the version. Put keys in secrets instead. Names shared with secrets fail publication." - changed
Input schema / properties / manifest / properties / kind / descriptionPrevious value: -"page serves the files as they are. function runs one JavaScript module for every request to the link."New value: +"page serves files unchanged; function runs a JavaScript module for every request." - changed
Input schema / properties / manifest / properties / secrets / descriptionPrevious value: -"Names of secrets the organization has already set, each bound as env.NAME. A function only. Set the value first, in Settings at reachpad.dev/apps/settings/secrets or with reachpad secrets set NAME: a name the organization has not set fails the publish with NAME is not set."New value: +"Organization secret names bound as env.NAME for functions. Set values first at reachpad.dev/apps/settings/secrets or with reachpad secrets set NAME. An unset name fails publication with NAME is not set." - changed
Input schema / properties / manifest / properties / services / descriptionPrevious value: -"What the function may use, on env.reachpad: db is the app's own SQLite database, through env.reachpad.db.query(sql, params) and env.reachpad.db.batch(statements); files is its file store, through env.reachpad.files.put/get/head/delete. A function only, and any other name is refused when you publish. Declaring db also lets the version carry migrations/NNNN_name.sql, which run when it goes live."New value: +"Function services: db binds the app's SQLite database at env.reachpad.db.query(sql, params) and env.reachpad.db.batch(statements); files binds its file store at env.reachpad.files.put/get/head/delete. Other names are refused. db permits migrations/NNNN_name.sql, run when the version goes live." - changed
Input schema / properties / validate / descriptionPrevious value: -"Check the call and write nothing. Answers with the file set the publish would contain, its total bytes, the entry and the kind, and on create_app the slug and the URL the app would take, where <tag> stands for the five random characters drawn when it is published. It checks the file set, its total size, that the entry file is one of the files, and on create_app that the slug is a usable link name. It does not check the org's app limit, so a create that would be refused for that is still refused when it is published."New value: +"Check without writing. Validates and returns the resulting file set, total bytes, entry and kind. create_app also validates the slug and returns it with the URL; <tag> stands for five random characters assigned on publish. Does not check the org app limit; publishing can still fail for that."
2 tool updates
- Changed
create_app1 field changed- changed
Input schema / properties / manifest / properties / secrets / descriptionPrevious value: -"Names of secrets the organization has already set, each bound as env.NAME. A function only. Set the value first, in Settings at reachpad.dev/apps/settings or with reachpad secrets set NAME: a name the organization has not set fails the publish with NAME is not set."New value: +"Names of secrets the organization has already set, each bound as env.NAME. A function only. Set the value first, in Settings at reachpad.dev/apps/settings/secrets or with reachpad secrets set NAME: a name the organization has not set fails the publish with NAME is not set."
- Changed
update_app1 field changed- changed
Input schema / properties / manifest / properties / secrets / descriptionPrevious value: -"Names of secrets the organization has already set, each bound as env.NAME. A function only. Set the value first, in Settings at reachpad.dev/apps/settings or with reachpad secrets set NAME: a name the organization has not set fails the publish with NAME is not set."New value: +"Names of secrets the organization has already set, each bound as env.NAME. A function only. Set the value first, in Settings at reachpad.dev/apps/settings/secrets or with reachpad secrets set NAME: a name the organization has not set fails the publish with NAME is not set."
1 tool update
- Changed
search_apps1 field changed- changed
Input schema / properties / q / descriptionPrevious value: -"Text to match against the name and the slug."New value: +"Text to match against the name, the slug and the words on the live page."
1 tool update
- Added
read_app_preview
1 tool update
- Changed
get_app_logs1 field changed- changed
Input schema / properties / since / descriptionPrevious value: -"The next_since cursor from a previous answer, such as c:412, or an RFC 3339 timestamp. A bare number is neither and is refused."New value: +"RFC 3339 timestamp to read from."
1 tool update
- Changed
get_app_logs1 field changed- changed
Input schema / properties / since / descriptionPrevious value: -"RFC 3339 timestamp to read from."New value: +"The next_since cursor from a previous answer, such as c:412, or an RFC 3339 timestamp. A bare number is neither and is refused."
8 tool updates
- Changed
create_app1 field changed- changed
Input schema / properties / validate / descriptionPrevious value: -"Check the call and write nothing. Answers with the file set the publish would contain, its total bytes, the entry and the kind. It checks the file set, its total size, and that the entry file is one of the files. It does not check the org's app limit or whether the slug is free, so a create that would be refused for one of those is still refused when it is published."New value: +"Check the call and write nothing. Answers with the file set the publish would contain, its total bytes, the entry and the kind, and on create_app the slug and the URL the app would take, where <tag> stands for the five random characters drawn when it is published. It checks the file set, its total size, that the entry file is one of the files, and on create_app that the slug is a usable link name. It does not check the org's app limit, so a create that would be refused for that is still refused when it is published."
- Added
list_secrets - Added
query_app_db - Added
read_app_file - Added
remove_secret - Added
set_secret - Added
trash_app - Changed
update_app1 field changed- changed
Input schema / properties / validate / descriptionPrevious value: -"Check the call and write nothing. Answers with the file set the publish would contain, its total bytes, the entry and the kind. It checks the file set, its total size, and that the entry file is one of the files. It does not check the org's app limit or whether the slug is free, so a create that would be refused for one of those is still refused when it is published."New value: +"Check the call and write nothing. Answers with the file set the publish would contain, its total bytes, the entry and the kind, and on create_app the slug and the URL the app would take, where <tag> stands for the five random characters drawn when it is published. It checks the file set, its total size, that the entry file is one of the files, and on create_app that the slug is a usable link name. It does not check the org's app limit, so a create that would be refused for that is still refused when it is published."
2 tool updates
- Changed
create_app8 fields changed- changed
Input schema / properties / files / descriptionPrevious value: -"The files to publish. Content is plain text written here in the chat, not base64: an HTML page, a Markdown document, or a JavaScript module that exports default { fetch }. A page app serves index.html at the app URL."New value: +"The files to publish. Content is plain text written here in the chat, not base64: an HTML page, a Markdown document, or a JavaScript module that exports default { fetch }. A page app serves index.html at the app URL. A function that declares the db service carries its schema changes here too, as migrations/NNNN_name.sql, which run in order when the version goes live." - changed
Input schema / properties / manifest / descriptionPrevious value: -"How the version runs. Omit it for a static page. kind is page or function, entry is the file served at / for a page or the module for a function."New value: +"How the version runs. Omit it on create_app for a static page, and omit it on update_app to keep the previous version's manifest. A manifest that is sent replaces the whole of it, so send every field the app still needs. services, secrets and env are read by a function only. The data plane in full, with its limits: https://reachpad.dev/SKILL.md" - added
Input schema / properties / manifest / properties / entry / descriptionAdded value: +"For a page, the file served at the root of the link, usually index.html. For a function, the module that exports default { fetch }. It has to be one of the files the version ends up with, which on a merge includes the ones carried over from the base." - changed
Input schema / properties / manifest / properties / env / descriptionPrevious value: -"Plain string values readable by a function."New value: +"Plain string values a function reads as env.NAME. Stored as written and readable by anyone who can read the version, so put a key in secrets instead. A name that is also in secrets fails the publish." - added
Input schema / properties / manifest / properties / kind / descriptionAdded value: +"page serves the files as they are. function runs one JavaScript module for every request to the link." - added
Input schema / properties / manifest / properties / secrets / descriptionAdded value: +"Names of secrets the organization has already set, each bound as env.NAME. A function only. Set the value first, in Settings at reachpad.dev/apps/settings or with reachpad secrets set NAME: a name the organization has not set fails the publish with NAME is not set." - added
Input schema / properties / manifest / properties / services / descriptionAdded value: +"What the function may use, on env.reachpad: db is the app's own SQLite database, through env.reachpad.db.query(sql, params) and env.reachpad.db.batch(statements); files is its file store, through env.reachpad.files.put/get/head/delete. A function only, and any other name is refused when you publish. Declaring db also lets the version carry migrations/NNNN_name.sql, which run when it goes live." - added
Input schema / properties / manifest / properties / services / items / enumAdded value: +[ + "db", + "files" +]
- Changed
update_app8 fields changed- changed
Input schema / properties / files / descriptionPrevious value: -"The files to publish. Content is plain text written here in the chat, not base64: an HTML page, a Markdown document, or a JavaScript module that exports default { fetch }. A page app serves index.html at the app URL."New value: +"The files to publish. Content is plain text written here in the chat, not base64: an HTML page, a Markdown document, or a JavaScript module that exports default { fetch }. A page app serves index.html at the app URL. A function that declares the db service carries its schema changes here too, as migrations/NNNN_name.sql, which run in order when the version goes live." - changed
Input schema / properties / manifest / descriptionPrevious value: -"How the version runs. Omit it for a static page. kind is page or function, entry is the file served at / for a page or the module for a function."New value: +"How the version runs. Omit it on create_app for a static page, and omit it on update_app to keep the previous version's manifest. A manifest that is sent replaces the whole of it, so send every field the app still needs. services, secrets and env are read by a function only. The data plane in full, with its limits: https://reachpad.dev/SKILL.md" - added
Input schema / properties / manifest / properties / entry / descriptionAdded value: +"For a page, the file served at the root of the link, usually index.html. For a function, the module that exports default { fetch }. It has to be one of the files the version ends up with, which on a merge includes the ones carried over from the base." - changed
Input schema / properties / manifest / properties / env / descriptionPrevious value: -"Plain string values readable by a function."New value: +"Plain string values a function reads as env.NAME. Stored as written and readable by anyone who can read the version, so put a key in secrets instead. A name that is also in secrets fails the publish." - added
Input schema / properties / manifest / properties / kind / descriptionAdded value: +"page serves the files as they are. function runs one JavaScript module for every request to the link." - added
Input schema / properties / manifest / properties / secrets / descriptionAdded value: +"Names of secrets the organization has already set, each bound as env.NAME. A function only. Set the value first, in Settings at reachpad.dev/apps/settings or with reachpad secrets set NAME: a name the organization has not set fails the publish with NAME is not set." - added
Input schema / properties / manifest / properties / services / descriptionAdded value: +"What the function may use, on env.reachpad: db is the app's own SQLite database, through env.reachpad.db.query(sql, params) and env.reachpad.db.batch(statements); files is its file store, through env.reachpad.files.put/get/head/delete. A function only, and any other name is refused when you publish. Declaring db also lets the version carry migrations/NNNN_name.sql, which run when it goes live." - added
Input schema / properties / manifest / properties / services / items / enumAdded value: +[ + "db", + "files" +]
1 tool update
- Changed
update_app3 fields changed- changed
Input schema / properties / base_version_id / descriptionPrevious value: -"The id of the version this edit was made against, from read_app. Starts with ver_."New value: +"The base_version_id read_app returned, which is the version this edit was made against. Starts with ver_." - changed
Input schema / properties / mode / descriptionPrevious value: -"replace, the default, publishes files as the whole file set: anything left out is gone. merge sends only the files that changed and carries every other file of the live version into the new version."New value: +"replace, the default, publishes files as the whole file set: anything left out is gone. merge sends only the files that changed and carries every other file of the base version into the new version." - changed
Input schema / properties / remove / descriptionPrevious value: -"Paths from the live version to leave out of the new one. Merge only, and a path that is not in the live version is refused rather than ignored. A call that only removes files sends an empty files array."New value: +"Paths from the base version to leave out of the new one. Merge only, and a path that is not in the base version is refused rather than ignored. A call that only removes files sends an empty files array."
2 tool updates
- Changed
create_app1 field changed- changed
Input schema / properties / validate / descriptionPrevious value: -"Check the call and write nothing. Answers with the file set the publish would contain, its total bytes, the entry and the kind. Nothing is published, so a version that would be refused is refused before it reaches the link."New value: +"Check the call and write nothing. Answers with the file set the publish would contain, its total bytes, the entry and the kind. It checks the file set, its total size, and that the entry file is one of the files. It does not check the org's app limit or whether the slug is free, so a create that would be refused for one of those is still refused when it is published."
- Changed
update_app1 field changed- changed
Input schema / properties / validate / descriptionPrevious value: -"Check the call and write nothing. Answers with the file set the publish would contain, its total bytes, the entry and the kind. Nothing is published, so a version that would be refused is refused before it reaches the link."New value: +"Check the call and write nothing. Answers with the file set the publish would contain, its total bytes, the entry and the kind. It checks the file set, its total size, and that the entry file is one of the files. It does not check the org's app limit or whether the slug is free, so a create that would be refused for one of those is still refused when it is published."
3 tool updates
- Changed
create_app1 field changed- added
Input schema / properties / validateAdded value: +{ + "description": "Check the call and write nothing. Answers with the file set the publish would contain, its total bytes, the entry and the kind. Nothing is published, so a version that would be refused is refused before it reaches the link.", + "type": "boolean" +}
- Added
publish_app_version - Changed
update_app4 fields changed- added
Input schema / properties / modeAdded value: +{ + "description": "replace, the default, publishes files as the whole file set: anything left out is gone. merge sends only the files that changed and carries every other file of the live version into the new version.", + "enum": [ + "replace", + "merge" + ], + "type": "string" +} - added
Input schema / properties / publishAdded value: +{ + "description": "false stages the version instead of putting it on the link. It is built and readable at its own version URL, and publish_app_version makes it live. Defaults to true.", + "type": "boolean" +} - added
Input schema / properties / removeAdded value: +{ + "description": "Paths from the live version to leave out of the new one. Merge only, and a path that is not in the live version is refused rather than ignored. A call that only removes files sends an empty files array.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / validateAdded value: +{ + "description": "Check the call and write nothing. Answers with the file set the publish would contain, its total bytes, the entry and the kind. Nothing is published, so a version that would be refused is refused before it reaches the link.", + "type": "boolean" +}
13 tool updates
- Removed
checkpoint_workspace - Changed
create_app1 field changed- changed
Input schema / properties / slug / descriptionPrevious value: -"The subdomain to publish at, 3 to 40 characters of a-z, 0-9 and single hyphens. Derived from the name when omitted; a taken slug gets a numeric suffix."New value: +"The readable part of the subdomain to publish at, 3 to 34 characters of a-z, 0-9 and single hyphens. Derived from the name when omitted. A random 5-character tag is always appended, so a name is never taken and two apps may share one."
- Removed
create_workspace - Removed
delete_workspace - Removed
expose_port - Removed
get_credit_balance - Removed
get_workspace - Removed
list_ports - Removed
list_workspaces - Removed
pause_workspace - Removed
revoke_port - Removed
run_command - Added
whoami
16 tool updates
- Added
create_app - Added
get_app_logs - Added
list_app_shares - Added
list_app_versions - Added
ls - Added
mkdir - Added
mv - Added
read_app - Added
read_app_version - Added
revoke_app_share - Added
rmdir - Added
search_apps - Added
set_app_access - Added
share_app - Added
tree - Added
update_app
11 tool updates
- First observed
checkpoint_workspace - First observed
create_workspace - First observed
delete_workspace - First observed
expose_port - First observed
get_credit_balance - First observed
get_workspace - First observed
list_ports - First observed
list_workspaces - First observed
pause_workspace - First observed
revoke_port - First observed
run_command
Related MCP Connectors
Build and host full-stack apps from a prompt, with agents that reach you on WhatsApp and email.
Build and publish full-stack apps from your coding agent: models, rules, pages, auth, per-app MCP.
- mcp-serverOAuthai.cdbx
Build Apps and run code in 30 languages — sandboxed, with persistent sessions for agent loops.
- TakoCodeOAuthcom.takocode
Build, preview and publish full-stack web apps with TakoCode's hosted coding agent.
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceBuild, ship and think in one living agentic workspace10-
- AlicenseAqualityCmaintenancePublish live web pages from AI coding agents. Instant shareable URLs for dashboards, landing pages, and reports with password protection.41MIT
- AlicenseNot gradedqualityAmaintenanceInstant secure Full Stack Apps and AI Agents1,193MIT
- FlicenseNot gradedqualityBmaintenanceEnables AI agents to turn local projects into persistent workspaces, providing file editing, command execution, Git integration, and cross-session history management.-
Glama MCP Gateway
Add one secure layer between your agents and this server.