Hatchable
Server Details
Build, deploy, and host full-stack web apps from any MCP client. DB, auth, storage, cron included.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
Glama MCP Gateway
Connect through Glama MCP Gateway for full control over tool access and complete visibility into every call.
Full call logging
Every tool call is logged with complete inputs and outputs, so you can debug issues and audit what your agents are doing.
Tool access control
Enable or disable individual tools per connector, so you decide what your agents can and cannot do.
Managed credentials
Glama handles OAuth flows, token storage, and automatic rotation, so credentials never expire on your clients.
Usage analytics
See which tools your agents call, how often, and when, so you can understand usage patterns and catch anomalies.
Tool Definition Quality
Average 4.3/5 across 33 of 33 tools scored. Lowest: 3.2/5.
Most tools have distinct purposes: create_project, deploy, write_file, run_code, etc. However, there is slight overlap between write_file and write_files, and between upload_file and import_file_from_url, but descriptions clarify the differences.
Tool names predominantly use verb_noun pattern (e.g., create_project, list_files, set_env). A few tools like grep and deploy are less descriptive but still consistent. Overall pattern is clear and predictable.
33 tools is on the high side, covering a broad platform surface. While each tool serves a distinct purpose, the count feels heavy for a single server, potentially overwhelming agents.
The tool set comprehensively covers the Hatchable platform lifecycle: project creation, file management, deployment, database operations, code execution, logging, and configuration. No obvious gaps for typical workflows.
Available Tools
47 toolsadd_api_routeAIdempotentInspect
Scaffold a file-routed api/ endpoint with the canonical handler shape.
Produces api/.js with:
default async (req, res) export
lib/db.js + lib/auth.js imports (depth-correct relative path)
requireAuth pattern when requires_auth=true
method dispatch + 405 fallback
Example: add_api_route({ route: 'todos', methods: ['GET','POST'], requires_auth: true }) → POST/GET /api/todos
Dynamic segments use [param]: add_api_route({ route: 'todos/[id]', methods: ['GET','DELETE'] }) → GET/DELETE /api/todos/:id (req.params.id)
| Name | Required | Description | Default |
|---|---|---|---|
| route | Yes | Route path under api/. e.g. "todos", "todos/[id]", "users/[id]/posts". No leading slash, no trailing .js. The string "auth" and anything under "auth/" are reserved. | |
| methods | No | Allowed HTTP methods. Default ["GET"]. Common: ["GET"], ["POST"], ["GET","POST","DELETE"]. | |
| project_id | Yes | Project ID. | |
| handler_body | No | Optional handler body inserted into the single-method case. Inside the body, `user.id` is available when requires_auth=true. | |
| requires_auth | No | If true (default), the handler calls requireAuth(req, res) and 401s anonymous callers. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations include idempotentHint=true and destructiveHint=false, and the description aligns perfectly by detailing that it scaffolds a file, includes imports, method dispatch, and reserved 'auth' route. No contradiction; description adds useful behavioral context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is concise (~10 lines), with front-loaded purpose, bullet points for generated code, and clear examples. No unnecessary words; 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?
Despite no output schema, the description fully explains what is created (file with shape, imports, dispatch) and covers dynamic segments and reserved routes. Comprehensive for a scaffolding tool with straightforward behavior.
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%, but the description adds value: clarifies defaults (requires_auth default true), explains dynamic segments ([param]), and provides examples for handler_body context (user.id available). Enhances understanding beyond schema alone.
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 'Scaffold a file-routed api/ endpoint with the canonical handler shape', specifying a concrete verb and resource. It distinguishes itself from siblings like add_page (pages) and write_file (arbitrary files) by focusing specifically on API route scaffolding.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this tool is intended for creating API routes with boilerplate, but does not explicitly contrast with alternatives. The sibling context (e.g., add_page for pages) makes usage clear, but missing explicit when-not-to-use guidance or exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_background_taskAIdempotentInspect
Scaffold a background-task pair: api/jobs/<job_name>.js (the worker, runs async with platform-managed retries) + api/<enqueue_route>.js (the enqueuer, returns immediately with the task id).
Use this when the user shouldn't wait for the work — sending a batch of emails, processing an upload, fanning out webhooks. The platform handles backoff and dead-lettering.
Difference from add_scheduled_job: scheduled jobs fire on a recurring cron; background tasks are fire-and-forget triggered by a request.
Example: add_background_task({ job_name: 'send_welcome', enqueue_route: 'signup-complete', retries: 3 }) → POST /api/signup-complete enqueues; /api/jobs/send_welcome runs async
| Name | Required | Description | Default |
|---|---|---|---|
| retries | No | 0-10. Default 3. | |
| job_name | Yes | Worker name. Lowercase a-z0-9_, starting with a letter. | |
| project_id | Yes | ||
| enqueue_route | No | Route under api/ that triggers the job. Default "trigger-<job_name>". | |
| requires_auth | No | Default true (gates the enqueuer). |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes async execution, platform-managed retries, backoff, dead-lettering, and immediate return. Annotations already provide idempotentHint: true and non-destructive, but description adds rich behavioral context. Minor lack of overwrite behavior disclosure prevents a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Approximately 120 words, front-loaded with purpose, followed by usage, differentiation, and example. Every sentence adds value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and moderate complexity, description covers structure, behavior, guidance, and example. Adequately addresses all needed information for a developer to use 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?
Schema coverage is 80% (only project_id missing description). Description adds meaning: explains how job_name and enqueue_route map to files, gives defaults, and provides example. Sufficiently compensates for missing project_id description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states specific verb 'Scaffold a background-task pair' and resource 'api/jobs/<job_name>.js + api/<enqueue_route>.js'. Clearly distinguishes from sibling 'add_scheduled_job' with explicit comparison.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: 'when the user shouldn't wait for the work' and gives examples. Also contrasts with 'add_scheduled_job' by explaining difference between cron and fire-and-forget.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_browser_endpointAIdempotentInspect
Scaffold an api/.js that uses hatchable.browser to fetch a URL with managed Chromium.
Three modes:
mode='screenshot' — returns image/png bytes, accepts ?full=1 and ?format=jpeg
mode='html' — returns rendered DOM after JS executes (?waitFor=networkidle|domcontentloaded|load)
mode='pdf' — returns print-quality PDF bytes (?size=Letter|A4&landscape=1)
All three accept ?url= as the source. No per-project chromium pool to manage — the platform runs a shared Fly app with its own egress firewall.
Example: add_browser_endpoint({ route: 'snapshot', mode: 'screenshot', requires_auth: true }) → GET /api/snapshot?url=https://example.com → image/png bytes
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Operation mode. Default "screenshot". | |
| route | Yes | Route under api/. e.g. "snapshot", "scrape/[domain]". | |
| project_id | Yes | ||
| requires_auth | No | Default true. Set false for public OG-image-style endpoints. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description provides behavioral details beyond annotations: it creates a file, uses Chromium, has three modes, and mentions shared Fly app infrastructure. Annotations indicate idempotentHint=true and destructiveHint=false, and description does not contradict them. It adds context about query parameters and return types.
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?
Description is concise yet comprehensive, using bullet points for modes and an example. It is front-loaded with the core purpose and provides all necessary details without unnecessary text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (multiple modes, query params), the description covers most aspects. It lacks output schema but describes return types for each mode. Could mention error handling or rate limits, but overall sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 75% coverage; description adds meaning by explaining the three modes with their specific query parameters (?full, ?format, ?waitFor, ?size, ?landscape) and clarifies requires_auth default and usage. Route and project_id are sufficiently described in 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?
Description clearly states the tool scaffolds an api/<route>.js using hatchable.browser. It lists three distinct modes with specific behaviors, making the purpose unambiguous and distinguishing it from sibling tools like add_api_route or add_llm_endpoint.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives. The description explains what the tool does but does not specify use cases, prerequisites, or when not to use it. The example demonstrates usage but lacks comparative context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_durable_workflowAIdempotentInspect
Scaffold an api/.js that wraps multi-step work in run.do(name, async ctx => {…}). Each await ctx.step(name, fn) is memoized — if the process crashes mid-run, retry resumes from the last completed step.
Use this shape for operations where partial completion is dangerous: checkout (don't double-charge), onboarding (don't double-create), batch jobs (don't reprocess).
Example: add_durable_workflow({ route: 'checkout', workflow_name: 'process_order', steps: ['validate-cart', 'charge-card', 'create-shipment', 'send-confirmation'] })
| Name | Required | Description | Default |
|---|---|---|---|
| route | Yes | Route under api/. | |
| steps | No | Ordered step names. Each becomes an `await ctx.step("name", …)` block in the generated handler. Default ["fetch-data","process","persist"]. | |
| project_id | Yes | ||
| requires_auth | No | Default true. | |
| workflow_name | Yes | Name shown in the run dashboard. Lowercase a-z0-9_. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explains memoization via ctx.step, crash recovery resuming from the last completed step, and the scaffolded file structure. Annotations already indicate idempotency, but the description adds valuable context about the behavioral guarantees 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?
The description is concise, with a clear opening sentence, a context paragraph, and an example. Every sentence adds value 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?
The description covers the tool's purpose, use cases, and behavior. It does not explain the return value (no output schema) but that is acceptable for a scaffolding tool. The context is sufficient for an AI agent to decide when and how to use 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?
With 80% schema coverage, most parameters are already described. The description adds an example that uses route and workflow_name, but does not clarify project_id or requires_auth beyond defaults. Parameter semantics are adequate but not enriched significantly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description specifies that the tool scaffolds an api/<route>.js file using a durable workflow pattern with memoized steps. This clearly differentiates it from sibling tools like add_api_route or add_background_task by emphasizing crash recovery and multi-step orchestration.
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 states when to use this tool (operations where partial completion is dangerous) and provides examples like checkout and onboarding. It implicitly tells when not to use it (non-durable tasks) but does not name alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_email_endpointAIdempotentInspect
Scaffold an api/.js that sends transactional email via hatchable.email.
Body shape: { to, subject, html?, text? }. Bounces and complaints are tracked automatically; the platform suppression list filters out previously-bounced recipients.
Pass log_to_table=true to write a row per send (requires you to call add_table for an email_log table first).
Example: add_email_endpoint({ route: 'send-receipt', default_subject: 'Your receipt', requires_auth: true, log_to_table: true })
| Name | Required | Description | Default |
|---|---|---|---|
| route | Yes | Route under api/. e.g. "send-receipt". | |
| project_id | Yes | ||
| log_to_table | No | If true, INSERTs into an email_log table per send. Make sure that table exists (use add_table). | |
| requires_auth | No | Default true. | |
| default_subject | No | Optional default subject line if the caller doesn't pass one. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (idempotentHint=true), the description adds important behavioral details: automatic tracking of bounces/complaints, platform suppression list filtering, and the side effect of logging when log_to_table is true. It does not cover error cases or exact idempotency behavior, but the added context 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 concise: a short paragraph followed by a single example. Every sentence contributes meaningful information without redundancy. It front-loads the purpose and then provides key details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 5 parameters, no output schema, and the tool's scaffolding nature, the description covers essential aspects: purpose, body shape, automatic behavior, and a prerequisite condition. It is sufficiently complete for an agent to use the tool correctly, though it could mention idempotency behavior.
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 80% (4 of 5 parameters documented), so baseline is 3. The description adds value by providing an example call and clarifying that log_to_table requires a table and default_subject is optional, but it does not explain the undocumented project_id parameter, leaving a gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states it scaffolds an API endpoint for sending transactional email, with a clear verb (scaffold) and resource (api/<route>.js for email). This purpose is distinct from siblings like add_api_route, which create generic routes, making it easy for an agent to select the correct tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: when to use log_to_table (requires a pre-existing table) and the automatic bounce/complaint handling. It does not explicitly name alternative tools for non-email routes, but the sibling list includes add_api_route, so the guidance is implied and adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_file_upload_routeAIdempotentInspect
Scaffold an api/.js that accepts a base64-encoded file upload and stores it via hatchable.storage. Returns a signed URL.
The canonical Hatchable upload flow is base64-in-JSON for small files (V8 can't easily parse multipart). For larger files (>5 MB by default), use the platform's pre-signed PUT flow via the upload_file MCP tool instead.
Body: { filename, content_type, data_base64 } Returns: { url, key, bytes }
Example: add_file_upload_route({ route: 'avatars', max_bytes: 1000000, requires_auth: true }) → POST /api/avatars
| Name | Required | Description | Default |
|---|---|---|---|
| route | Yes | ||
| max_bytes | No | Max upload size in bytes. Default 5_000_000 (5 MB). | |
| project_id | Yes | ||
| requires_auth | No | Default true. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (which are minimal), the description explains the scaffold action, base64 input, storage via hatchable.storage, return of signed URL, and the parameter 'requires_auth'. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise: three sentences plus an example. It front-loads the core purpose and flows naturally. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, description adequately covers return values ('signed URL') and example return structure. It covers the tool's behavior and parameters well, though 'project_id' purpose is implicitly clear from context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema coverage at 50%, the description adds value by clarifying the 'route' parameter through the example and body format, and explains 'max_bytes' and 'requires_auth'. However, 'project_id' is not explained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool scaffolds an API route for base64 file upload. It uses a specific verb ('scaffold') and resource ('api/<route>.js'), and contrasts with the sibling 'upload_file' tool for large files.
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 when-to-use guidance: small files use this tool, large files (>5 MB) should use the 'upload_file' MCP tool instead. Also notes the canonical Hatchable upload flow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_image_transform_endpointAIdempotentInspect
Scaffold an api/.js that fetches an image (URL) and transforms via hatchable.images — resize, format conversion, quality. Returns the bytes with the right content-type, suitable for tags.
Query params: ?src=URL&w=400&format=webp|jpeg|png&q=80
Cache-Control is public, max-age=86400, immutable so CDNs / browsers cache aggressively.
Example: add_image_transform_endpoint({ route: 'thumbnail', default_format: 'webp', default_max_width: 400 }) → GET /api/thumbnail?src=https://example.com/photo.jpg&w=400
| Name | Required | Description | Default |
|---|---|---|---|
| route | Yes | ||
| project_id | Yes | ||
| default_format | No | Default output format. webp is the right choice 9 times out of 10. | |
| default_max_width | No | Default max width in pixels (caller can override via ?w=). Default 1200. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description focuses on the generated route's behavior (cache-control, query params) but does not disclose the tool's own behavior, such as whether it overwrites existing files, error handling, or idempotency implications. Annotations indicate idempotentHint=true, but the description does not clarify if re-run is safe.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with three sentences and an example. It is front-loaded with the verb 'Scaffold' and efficiently covers purpose, query parameters, caching, and usage. No unnecessary 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 covers the main functionality and generated route behavior, but lacks details on error handling, auth requirements, dependencies (hatchable.images), and edge cases like missing or invalid parameters. Given no output schema, return value expectations are unclear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only 50% schema coverage, the description compensates by explaining the 'route' parameter through an example and detailing defaults for 'default_format' and 'default_max_width'. It clarifies that 'route' becomes a path like '/api/thumbnail' and provides default values. However, 'project_id' is not covered.
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 specifies that the tool scaffolds an API route for image transformation (fetch, resize, format conversion, quality). It distinguishes itself from sibling tools like add_api_route and add_browser_endpoint by explicitly targeting image transform endpoints.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the use case (creating image transform endpoints) and provides an example, but it does not explicitly state when to use this tool versus alternatives or mention any prerequisites or constraints.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_llm_endpointAIdempotentInspect
Scaffold an api/.js that takes a prompt and returns the model's response, using lib/llm.js so every call lands in the llm_calls table for free observability.
Produces:
POST handler with requireAuth
body: { prompt, model? }
calls llm.run({ user_id, purpose, prompt, model, system })
returns { text, usage, llm_call_id }
Example: add_llm_endpoint({ route: 'summarize', purpose: 'summarize', system_prompt: 'Summarize the user's text in 2-3 sentences.' })
Note: The project must have lib/llm.js (it ships in tpl-prompt-playground; copy if needed).
| Name | Required | Description | Default |
|---|---|---|---|
| route | Yes | Path under api/. e.g. "summarize", "ai/translate". | |
| purpose | Yes | Free-form label written to llm_calls.purpose for the dashboard. e.g. "summarize", "translate", "draft_email". | |
| project_id | Yes | Project ID. | |
| default_model | No | Logical model name. Default "sonnet". Caller can override via body. | |
| system_prompt | No | Optional system prompt baked into the endpoint. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description details the generated files, request structure, required auth, and return format. Annotations indicate idempotentHint=true, but the description does not contradict this—scaffolding a file is idempotent if it overwrites consistently. Overall, the behavioral expectations are well communicated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: first sentence captures the action, followed by bullet-like list of outputs, then an example and note. Every sentence contributes 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?
The description covers the output format, required dependency, and example usage. Given the tool's scaffolding nature and no output schema, it provides sufficient context for an agent to understand the tool's purpose and results.
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?
Despite 100% schema coverage, the description adds context for parameters like purpose (label for dashboard) and provides an example usage, enriching the schema beyond field definitions. It does not fully explain all parameters' effects but adds meaningful value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it scaffolds an API endpoint that uses lib/llm.js for LLM calls with built-in observability. It distinguishes itself from generic route creation tools like add_api_route by specifying the LLM integration and generated file structure.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions a prerequisite (lib/llm.js must exist) and provides an example, offering clear guidance on when to use the tool. However, it doesn't explicitly contrast with alternatives like add_api_route, which could help agents choose correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_mcp_toolAIdempotentInspect
Register an MCP tool exposed by THIS PROJECT'S /mcp endpoint. External agents that connect to https://.hatchable.site/mcp can call it.
The project becomes a tool provider — a uniquely Hatchable-shaped capability. Forks of your project become tools that other agents can call as part of their own loops.
Writes tools/.js with mcp.tool(name, { description, input, run }).
Example: add_mcp_tool({ name: 'lookup_customer', description: 'Find a customer by email', input: { email: 'string' } })
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Tool name. Lowercase a-z0-9_, starting with a letter. | |
| input | No | Input schema as a flat object map: { fieldName: "type-string" or { type, description? } }. e.g. { email: "string", limit: "number" }. | |
| project_id | Yes | ||
| description | No | What the tool does. Shown to calling agents in tools/list. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral context beyond annotations by noting that it writes a file (tools/<name>.js) and transforms the project into a tool provider. Annotations provide idempotentHint=true and destructiveHint=false, but the description clarifies the side effect, which 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 structured with a clear opening sentence, followed by context and an example. While not extremely concise, each sentence adds value: core action, external access, forking implications, and file creation details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that the tool creates a new MCP tool and has annotations, the description provides adequate context about side effects and usage. However, it could be more complete by mentioning the return value or what happens on subsequent invocations (since idempotentHint=true).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description supplements the schema (75% coverage) by explaining the 'name' format, 'input' schema structure with examples, and the purpose of 'description'. It adds broader context about the file-writing effect and how parameters are used in the generated 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 clearly states the tool registers an MCP tool exposed by the project's /mcp endpoint, with a specific verb and resource. It distinguishes from sibling tools (e.g., add_api_route) by focusing on MCP tool registration, and includes an example for clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use the tool: to make the project a tool provider for external agents. It provides context about the project's /mcp endpoint and forking behavior, but does not explicitly state when not to use it or name alternative tools for different endpoint types.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_memory_endpointAIdempotentInspect
Scaffold a pair of routes that use hatchable.memory: //remember persists a fact for the signed-in user, //recall retrieves by semantic similarity.
Memory is scoped per-user via memory.for({ user: user.id }) — facts from one user are never returned to another.
Use this shape for chat/assistant apps that need long-term context: every conversation can remember notable facts; future conversations recall them.
Example: add_memory_endpoint({ namespace: 'notes' }) → POST /api/notes/remember + POST /api/notes/recall
| Name | Required | Description | Default |
|---|---|---|---|
| namespace | No | URL prefix for the two routes. e.g. "memory" → /api/memory/remember + /api/memory/recall. | |
| project_id | Yes |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral context beyond annotations: it details per-user scoping ('facts from one user are never returned to another') and the use case for long-term memory. Annotations provide idempotentHint=true, which is not contradicted.
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 well-structured with a clear flow: purpose, scoping, use case, example. It is informative but slightly verbose; could be trimmed without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the main purpose and scoping well, but lacks information about return values (no output schema) and does not explain the required 'project_id' parameter. Error conditions or permissions are not addressed.
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 50%; the description adds meaning for 'namespace' (URL prefix) but fails to explain 'project_id', which is required. It provides partial parameter enlightenment but misses a key parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states that the tool scaffolds two routes for remembering and recalling facts via hatchable.memory, with clear verb 'scaffold' and specific resource (memory endpoints). It distinguishes from siblings like add_api_route by focusing on memory storage.
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 recommends using the tool for chat/assistant apps needing long-term context and provides an example. However, it does not explicitly state when not to use it or compare with alternative tools like add_api_route.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_pageAIdempotentInspect
Scaffold a Tailwind+Alpine HTML page at public/.html.
Produces the canonical Hatchable page shape: Tailwind via CDN, Alpine for interactivity, /theme.css for shared design tokens, max-w-3xl content shell. No build step. No React. No TypeScript. For rich client state (multi-step forms, dashboards), use React-via-esm.sh — see public/playground.html in tpl-prompt-playground for the canonical pattern.
Example call: add_page({ slug: 'about', title: 'About', body_html: 'About...' })
Example with Alpine state: add_page({ slug: 'counter', title: 'Counter', body_html: '<button @click="n++" x-text="n">', alpine_data: { n: 0 } })
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | URL slug. Becomes public/<slug>.html → /<slug>. lowercase a-z0-9-. | |
| title | No | Page <title>. Defaults to capitalized slug. | |
| body_html | No | Inner HTML for the content shell. Use Tailwind classes. Don't include <html>/<head>/<body> — those are added. | |
| project_id | Yes | Project ID (e.g. proj_a8Kq7fR2xZ). | |
| alpine_data | No | Optional initial Alpine state. Becomes `pageData()` on `x-data`. Shape: { count: 0, name: "" }. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide basic safety traits (idempotent, non-destructive). The description adds value by detailing output structure ('max-w-3xl content shell'), tech stack constraints ('No build step. No React. No TypeScript.'), and file location. 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?
Description is moderately long but well-structured: purpose first, then details, then two examples. Could be slightly more concise, but the examples are valuable. Every sentence adds meaningful 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?
The description covers purpose, parameters, and usage. However, it lacks information about return value or error handling (e.g., what if slug is missing? or idempotency behavior). Annotations partially cover safety, but return type is absent. Still, for a scaffolding tool with good annotations and schema, it is largely adequate.
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 already has complete parameter descriptions (100% coverage). The description enriches this with usage guidance: e.g., for body_html it says 'Don't include <html>/<head>/<body> — those are added', and for alpine_data it explains 'Becomes pageData() on x-data'. Examples show parameter combinations.
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 scaffolds a Tailwind+Alpine HTML page at a specific path. It distinguishes itself from siblings like add_api_route or add_table by specifying the tech stack and file type. The mention of an alternative (React-via-esm.sh) further clarifies its niche.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: for Tailwind+Alpine pages. Directly tells when not to use: 'For rich client state (multi-step forms, dashboards), use React-via-esm.sh'. Examples illustrate typical use cases, providing clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_scheduled_jobAIdempotentInspect
Scaffold a cron-fired api/jobs/.cron.js. The deploy pipeline picks up export const schedule and registers a ScheduledTask.
The cron expression is validated upfront — bad expressions fail this call rather than at deploy.
Example: add_scheduled_job({ name: 'daily_digest', cron: '0 6 * * *', handler_body: "// build + send digest\nres.json({ ok: true });" }) → fires every day at 06:00 UTC
| Name | Required | Description | Default |
|---|---|---|---|
| cron | Yes | Standard 5-field cron expression (minute hour day-of-month month day-of-week). Examples: "0 6 * * *" daily 06:00, "*/15 * * * *" every 15 min, "0 0 * * 0" weekly Sun midnight. | |
| name | Yes | Job name. Lowercase a-z0-9_, starting with a letter. | |
| project_id | Yes | Project ID. | |
| handler_body | No | Body of the handler function. The cron caller has no user — do not call requireAuth. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide idempotentHint=true and destructiveHint=false. The description adds value by noting upfront cron validation, file scaffold creation, and the deploy pipeline registration. It does not mention overwrite behavior, but idempotent hint covers that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with two short paragraphs and an example. The first sentence immediately states the purpose. Every sentence contributes meaningful 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?
Given the tool has no output schema and moderate complexity, the description covers the main behavior (file creation, validation, registration). It lacks details on return values or error cases beyond cron validation, but annotations fill some gaps. Overall fairly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each parameter is already described in the schema. The description includes an example that demonstrates parameter usage, adding slight value beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool scaffolds a cron-fired job file, validates the cron expression, and registers it via the deploy pipeline. It distinguishes itself from siblings like add_api_route and add_llm_endpoint by focusing specifically on scheduled jobs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the tool does but does not explicitly state when to use it versus alternatives. It implies usage for creating cron jobs but lacks guidance on when not to use or which sibling tool to choose instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_tableAInspect
Append a migrations/000N_create_.sql file with a new Postgres table.
Defaults baked in (NEVER manually invent these):
id BIGSERIAL PRIMARY KEY
user_id TEXT NOT NULL (when per_user=true, default)
created_at + updated_at TIMESTAMPTZ
composite index on (user_id, created_at DESC)
Example: add_table({ name: 'todos', columns: [ { name: 'title', type: 'TEXT', nullable: false }, { name: 'done', type: 'BOOLEAN', nullable: false, default: false } ], per_user: true, })
Migration filename uses the next 4-digit sequence number. Migrations apply in lexical order on every deploy; only un-applied ones run.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Table name. Lowercase a-z0-9_, starting with a letter. | |
| columns | No | Extra columns beyond the defaults. Each: { name, type, nullable?, default? }. | |
| per_user | No | If true (default), include `user_id TEXT NOT NULL` and the per-user index. Set false for shared/system tables (e.g. lookup tables, llm_calls). | |
| project_id | Yes | Project ID. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes default columns and index, and how migration filename is generated. Annotations provide no behavioral details; description fills most gaps. Lacks prerequisites (e.g., database setup) or conflict handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise, well-structured with bullet points and example. Core action stated first, no redundant 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?
Covers purpose, defaults, example, and naming convention. Does not describe return value, which would help agent know success indicator.
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 covers all parameters with descriptions. Description adds value with defaults, per_user explanation, and a full example showing how columns, per_user, and name interplay.
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 clearly states it appends a migration SQL file with a new Postgres table, using specific verb and resource. Distinguishes from sibling tools that handle API routes, pages, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or when-not-to-use guidance. Implies use for new tables via migrations, but doesn't mention alternatives like execute_sql for ad-hoc changes or write_file for manual edits.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_projectADestructiveInspect
Create a new Hatchable project. This generates a URL slug, creates a dedicated PostgreSQL database, and returns the project ID and URLs. Call this first before writing files or creating tables.
Project structure
public/ static files, served at their file path
api/ backend functions — each file is one endpoint
hello.js → /api/hello
users/list.js → /api/users/list
users/[id].js → /api/users/:id (req.params.id — one segment)
docs/[...path].js → /api/docs/*path (req.params.path — string[], catches multi-segment)
_lib/ shared code, not routed
migrations/*.sql SQL files, run in filename order on every deploy
seed.sql optional — runs on first deploy / fork, once per project
hatchable.toml optional overrides (cron, auth, project name)
package.json dependencies (no build scripts yet — build locally, commit public/)Routing precedence
Most-specific wins. For a request to /api/users/42:
api/users/42.js(static) — beatsapi/users/[id].js(single-param,params.id = "42") — beatsapi/users/[...rest].js(catch-all,params.rest = ["42"])
Catch-all params arrive as string[], never slash-joined. Use req.params.path as an array:
const [first, ...rest] = req.params.path;
Static file resolution (public/)
A request to /foo/bar/baz tries, in order:
public/foo/bar/baz(exact file)public/foo/bar/baz.htmlpublic/foo/bar/baz/index.htmlAncestor
index.htmlfallback — walks up:public/foo/bar/index.html→public/foo/index.html→public/index.html
Step 4 means each folder with an index.html acts as its own mini-site. You can ship
an /admin/* React SPA alongside a static marketing page at / — unmatched paths
under /admin/ fall back to public/admin/index.html, not the root one.
Handler contract
Every file under api/ exports a default async function:
// api/users/list.js
import { db, auth } from "hatchable";
export default async function (req, res) {
const user = auth.getUser(req);
if (!user) return res.status(401).json({ error: "Not logged in" });
const { rows } = await db.query(
"SELECT id, name FROM users WHERE org_id = $1",
[user.id]
);
res.json(rows);
}
// Optional: restrict methods
export const methods = ["GET"];
// Optional: register this endpoint as a recurring scheduled task.
// Minimum interval is hourly. See also: scheduler.at() in the SDK
// for imperative / one-shot / per-firing-payload scheduling.
// export const schedule = "0 */6 * * *";req (Express-shaped)
method, url, path, headers, cookies, params, query
body — parsed by Content-Type: JSON → object, urlencoded → object, multipart/form-data → object of non-file fields
files — present for multipart uploads: [{ field, filename, contentType, buffer }]
res (Express-shaped)
res.json(data), res.status(code) (chainable), res.send(text|buffer)
res.redirect(url), res.cookie(name, value, opts), res.setHeader(name, value)
SDK — import from "hatchable"
Everything you need lives under one import. Do not reach for npm packages
that duplicate these — the deploy linter rejects puppeteer-core,
@anthropic-ai/sdk, pg, nodemailer, bullmq, ioredis,
@aws-sdk/client-s3, child_process, etc. and points you here.
// project storage / SQL
db.query(sql, params) → { rows, rowCount }
db.transaction([{sql, params}, ...]) → { results: [...] }
storage.put(key, buffer, contentType) → url
storage.get(key) → { buffer, contentType }
storage.del(key)
cache.get(key) / cache.set(key, value, { ttl }) → KV with TTL
cache.incr(key, by) / cache.del(key) / cache.expire(...)
// identity + comms
auth.getUser(req) → { id, email, name } | null
email.send({ to, subject, html })
// scheduling + background work
scheduler.at(when, route, opts?) → declared/armed cron
scheduler.cancel(taskId)
tasks.enqueue(route, payload, { delay, retries }) → durable one-shot
// browser, AI, vector — managed services, no npm install
browser.html(url) / browser.pdf(url) / browser.screenshot(url)
browser.session(async page => { ... }) → puppeteer-shaped
ai.complete({ model: 'sonnet', messages, system?, tools?, maxTokens? })
ai.embed(input) → { embedding } | { embeddings }
images.transform(buf, { resize, format, quality }) → Buffer
vector.collection(name, { dimensions }).upsert/search/searchText
// agent harness
agent.define({ name, model, systemPrompt, tools }).run({ input })
agent.tool({ name, description, input, run, requiresApproval? })
run.do(name, async ctx => { await ctx.step('foo', () => fn()) })
memory.for({ user }).remember(text) / .recall(query) / .episodes()
approval.request({ title, detail, approvers, timeout })
// MCP — expose project as an MCP server, or call external MCP
mcp.tool(name, { description, input, run }) → registered at deploy
mcp.client(url, { auth }).call(toolName, args) / .tools()External HTTP via global fetch (routed through Hatchable's egress
proxy automatically). Project secrets via process.env.KEY (set with
the set_env tool — including ANTHROPIC_API_KEY / OPENAI_API_KEY
which ai.complete reads from your project's env, not the platform's).
What you cannot do
Spawn binaries (no
child_process, no shell).Persist to local filesystem between requests (use
storageinstead).Open a long-lived TCP/WebSocket server.
Install npm packages with native bindings — Hatchable does not run
npm installat deploy. The SDK above replaces every common reason to reach for one.
Scheduling
Two ways to schedule a function — pick based on whether the "when" is known at deploy time or at runtime.
Declared (static, lives in source, reconciled on deploy):
// api/nightly-report.js
export const schedule = "0 9 * * *"; // 5-field cron, minimum hourly
export default async function (req, res) { /* ... */ }Armed (dynamic, from user code, preserved across deploys):
import { scheduler } from "hatchable";
// recurring — first arg is a 5-field cron string
await scheduler.at("0 * * * *", "/api/ping");
// one-shot at a specific moment, with per-firing payload
await scheduler.at("2026-05-01T07:00:00Z", "/api/book", {
payload: { missionId: 42 }
});
// idempotent named arm — repeated calls update the same task
await scheduler.at("0 9 * * *", "/api/digest", { name: "daily-digest" });
// cancel by id
await scheduler.cancel(taskId);Each firing invokes route with req.headers['x-hatchable-trigger'] === 'cron'
and req.body === payload. Use one-shot + payload instead of writing your
own "pending jobs" table with a polling cron — that's the pattern the
primitive replaces.
Database
Postgres. Write schema in migrations/*.sql. Files run in filename order, tracked in __hatchable_migrations so each runs once.
Always use RETURNING to get inserted ids in the same round trip:
INSERT INTO users (email) VALUES ($1) RETURNING idNever call lastval() or LAST_INSERT_ID() — each db.query is a fresh connection, so session-local state doesn't carry across calls.
Available APIs
Functions run in V8 isolates. You get:
The full Hatchable SDK (see above).
Plain JS / TypeScript (no transpile step needed for modern syntax).
fetchfor external HTTP (routed through Hatchable's egress proxy for quota + accounting; pass through transparently to the URL).Web Crypto and standard ECMAScript builtins.
Pure-JS npm packages — anything that doesn't need native bindings, filesystem persistence, child processes, or raw sockets. Common ones used regularly: csv-parse, xlsx, bcrypt, jsonwebtoken, uuid, date-fns, lodash, marked, sanitize-html, cheerio, xml2js, qrcode, stripe.
Project secrets via
process.env.KEY(set with the set_env tool).
What's NOT available — and the SDK alternative:
You wanted | Use this |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| not available — use |
The deploy linter rejects deploys that import the deny-listed packages and points you at the right SDK module by name. You'll see the redirect message before the deploy lands.
Visibility
Three tiers — each one a step up in who the software is for:
personal — free. You and anyone you invite. Login-gated via Hatchable accounts. Build anything including auth — test the full flow with your invitees before going live.
public — $12/mo. On the open web. Custom domains. No branding. No app-level auth (use Hatchable identity only).
app — $39/mo. On the open web + your app has its own users. Email/password signup, OAuth, password reset. If your project has [auth] enabled, this is the only live tier — you can't go Public with auth, you go straight to App.
Calling the API from public/
At deploy time, Hatchable injects a tiny bootstrap into every HTML file:
window.__HATCHABLE__ = { slug: "my-app", api: "/api" };Use it as the base URL:
const API = window.__HATCHABLE__.api;
fetch(API + "/users/list").then(r => r.json()).then(render);Auth (optional)
Enable auth in hatchable.toml to get a complete signup/login/session system with one config block. The platform auto-mounts /api/auth/* — do not write files under api/auth/ when auth is enabled.
[auth]
enabled = true
providers = ["email"] # or ["email", "google", "hatchable"]Auto-mounted endpoints:
POST /api/auth/sign-up/email — create account with email + password
POST /api/auth/sign-in/email — log in
POST /api/auth/sign-out — clear session
GET /api/auth/get-session — current session + user
POST /api/auth/forget-password — send password-reset email
POST /api/auth/reset-password — complete password reset
GET /api/auth/sign-in/social/:provider — OAuth flow (google, github)
GET /api/auth/hatchable/sso — one-click Hatchable SSO (when enabled)
Users live in these tables inside your project's own database: users, sessions, accounts, verifications
You can extend the users table with your own columns:
-- migrations/002_user_profile.sql
ALTER TABLE users ADD COLUMN phone text;
ALTER TABLE users ADD COLUMN tier text DEFAULT 'free';You CANNOT drop or rename users/sessions/accounts/verifications or create your own tables with those names — the deploy will fail with a clear error.
In your API functions, auth.getUser works the same whether auth is enabled or not:
import { auth, db } from "hatchable";
export default async function (req, res) {
const user = await auth.getUser(req); // NOTE: await when auth is enabled
if (!user) return res.status(401).json({ error: "Not logged in" });
const { rows } = await db.query(
"SELECT * FROM bookings WHERE user_id = $1",
[user.id]
);
res.json(rows);
}OAuth providers need credentials set via hatchable secret set:
GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET
GITHUB_CLIENT_ID, GITHUB_CLIENT_SECRET
Deploy
After writing files, call the deploy tool. It runs migrations, seeds
(first deploy only), copies public/ to the CDN, registers api/ routes,
and — if [auth] enabled — provisions the auth tables in your database.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Human-readable project name (e.g. "My Booking App") | |
| visibility | No | Project visibility: personal (default, login-gated, free) or public ($12/mo, open web) | |
| description | No | Short project description |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations include destructiveHint: true, which is consistent with creating a new project. The description adds detail about what is created (slug, database, project ID) but does not discuss side effects like potential resource costs or limits. There is no contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely long (over 2000 words) and includes extensive documentation about project structure, routing, SDK, auth, etc. Much of this content is relevant to the project platform but not specific to the create tool. This buries the key purpose and usage guidelines. A concise description (e.g., 5 sentences) would be far more helpful for an agent deciding when to call this 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?
Despite the large amount of text, the description lacks certain completeness for the tool itself. It does not specify the exact return value shape (e.g., JSON fields returned), error cases (e.g., name conflicts, invalid visibility), or whether the database is immediately accessible. The output schema is absent. The description over-delivers on platform concepts but under-delivers on tool-specific behavior.
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 the parameters. The description adds value by explaining the free/$12/$39 tiers and that 'personal' is default, but does not elaborate on 'description' beyond the schema. The visibility enum is well explained in the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool creates a new Hatchable project, generating a URL slug, database, and returning IDs/URLs. It also positions this as the first step before writing files or creating tables, distinguishing it from sibling tools like deploy or write_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?
The description explicitly says 'Call this first before writing files or creating tables,' providing clear sequencing. It also implicitly contrasts with update_project (for existing projects) and deploy (for deploying after creation). No explicit alternatives are named, but the context is very clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_envADestructiveIdempotentInspect
Delete one or more environment variables by key. Pass key for a single delete or keys for a batch. Missing keys are reported in skipped, not errored, so retries are idempotent. Takes effect on the next deploy.
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | Single key to delete | |
| keys | No | Array of keys to delete | |
| project_id | Yes | Project ID |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explains idempotent behavior with 'skipped' reporting missing keys, and notes that changes take effect on next deploy. Annotations already include idempotentHint and destructiveHint, but the description adds valuable detail beyond those.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, each providing unique information: action, different modes, idempotency, and timing. No redundancy or wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description sufficiently explains behavior (idempotent, skipped) and timing. Could mention that missing keys are not errors, which it does. No obvious gaps for a delete tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so schema already describes parameters. The description adds context that 'key' is for single and 'keys' for batch, but this is also implied by the schema. No additional semantic value beyond 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 clearly states the action ('delete'), the resource ('environment variables by key'), and differentiates between single and batch deletion using 'key' or 'keys'. It distinguishes from siblings like 'set_env' and 'list_env'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for use: delete by key or keys, and notes batch behavior. However, it does not explicitly mention when not to use this tool or compare with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_fileADestructiveIdempotentInspect
Delete a project file. Takes effect after the next deploy.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | File path to delete | |
| project_id | Yes | Project ID (e.g. proj_a8Kq7fR2xZ) |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide idempotentHint=true and destructiveHint=true, so the description doesn't need to repeat those. The description adds critical behavioral context: 'Takes effect after the next deploy' which is beyond annotations. This clarifies that deletion is not immediate, which is essential for agent understanding. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: two sentences, zero wasted words. It states the action and a crucial deferred effect. Perfectly 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 tool's simplicity (2 params, no output schema), the description is adequate but not complete. It misses mention of whether deletion is reversible, any prerequisites (e.g., file must exist), and the exact behavior after deploy (e.g., do you get a confirmation?). However, with good annotations and full schema coverage, it's minimally viable.
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 both parameters well. The description does not add any extra meaning beyond what the schema provides, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'delete' and resource 'project file', and adds the important qualifier 'Takes effect after the next deploy' which distinguishes it from immediate deletion. This is clear but doesn't explicitly contrast with sibling tools like write_file or patch_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?
The description implies usage for deleting a file, but provides no guidance on when not to use it or alternatives. For example, it doesn't mention that deleted files might be recoverable or that 'deploy' must be called for the deletion to take effect, nor does it contrast with tools like write_file that might overwrite or modify files.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deployDeploy projectADestructiveInspect
Deploy the project. Runs migrations/*.sql (tracked so each runs once), runs seed.sql on first deploy, copies public/ files to the CDN, and registers api/ files as live endpoints. Increments the project version. Call this after writing all your files. To verify your functions work after deploying, use run_function — it calls the function directly through your authenticated session and works for all project visibilities. The url field is the public URL for end users — personal projects require visitors to sign up before they can view the site.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project ID (e.g. proj_a8Kq7fR2xZ) |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark destructiveHint=true, so the mutation is known. The description adds details about what it does (migrations, seeds, CDN, endpoints, version increment) and mentions side effects like first-deploy seed and personal project restrictions. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with actions, but the last sentence about url field is somewhat tangential to the deploy action. Still efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description adequately explains what happens and when to use. It covers key behavioral aspects. Could mention that it's not idempotent (but annotations already provide destructiveHint). Overall sufficient for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a clear description of project_id. The description adds context about deployment behavior but no additional parameter semantics are needed.
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 verb 'Deploy' and the resource 'project', and lists specific actions: runs migrations, seeds, copies files, increments version. It also distinguishes from the sibling 'dry_run_deploy' by being the actual deploy.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Call this after writing all your files', and provides alternatives: 'To verify your functions work after deploying, use `run_function`'. Also distinguishes between public URL and personal project behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dry_run_deployARead-onlyInspect
Run every deploy-time validator against the project's current files without actually deploying. Returns errors (hard gates) and warnings (soft lints), plus a would_deploy summary of what would ship.
Errors catch: package.json build scripts, reserved table names in migrations, auth route collisions, usage cap breaches.
Warnings catch known runtime footguns that type-check but silently misbehave — most notably auth.getUser() / auth.getSession() / db.query() calls without await (returning a Promise is truthy, so if (!user) guards pass and downstream user.id is undefined). Safer than calling deploy blindly and finding out mid-flight.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project ID |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the description adds value by detailing specific error/warning checks and the 'would_deploy' summary. It mentions runtime footguns (e.g., missing await) but could further clarify side effects or scope of validation.
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 paragraphs: first states purpose and return values, second lists specific checks. Every sentence adds value without redundancy, and it is appropriately sized for the complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple input schema (one parameter) and clear annotations, the description is complete enough. It explains the output structure and examples of errors/warnings. No output schema exists, but the description compensates by listing return fields.
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 'project_id' parameter is fully described in the schema. The description does not add extra semantics for this parameter, earning a baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool runs validators without deploying, distinguishing it from the 'deploy' sibling. It lists specific checks (package.json, reserved table names, auth routes, usage caps) and return types (errors, warnings, would_deploy), making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use before deploying to avoid mid-flight failures, and contrasts with 'deploy' by mentioning safety. However, it does not explicitly state when not to use this tool (e.g., when no validators exist) or alternatives beyond deploying.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
execute_sqlADestructiveInspect
Run SQL against the project's dedicated PostgreSQL database.
Supports: CREATE TABLE, ALTER TABLE, DROP TABLE, INSERT, SELECT, UPDATE, DELETE.
Use parameterized queries for safety: pass values in the params array with $1, $2, etc. placeholders.
Return format:
SELECT: { rows: [...], count: N } — DECIMAL columns return as strings (e.g. "45.00")
INSERT/UPDATE/DELETE: { changes: N }
DDL: { changes: 0 }
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | SQL statement to execute | |
| params | No | Bind parameters (use $1, $2, etc. placeholders in SQL) | |
| project_id | Yes | Project ID (e.g. proj_a8Kq7fR2xZ) |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark the tool as destructiveHint=true, which is consistent with SQL mutations. The description adds behavioral details: return formats for different SQL types, and that DECIMAL columns return as strings. With no output schema, this is valuable transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with sections: supported statements, parameterized query guidance, and return format examples. It's concise and front-loaded with the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no output schema, the description compensates by detailing return formats. It explains supported SQL types and behavior for different statements. Missing information about error handling or permissions, but overall complete enough.
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%, but the description adds meaning by explaining the binding pattern ($1, $2) and encourages parameterized queries for safety, which is not in 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 clearly states it runs SQL against the project's PostgreSQL database, listing supported DML and DDL statements. It distinguishes itself from siblings like run_code or run_function which run code, not SQL.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides usage guidelines by encouraging parameterized queries and specifying placeholders ($1, $2). It also hints at proper usage by mentioning safety, but does not explicitly say when not to use this tool vs alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fork_projectAInspect
Fork a public project into your account. Copies all code and database schema (no data). The fork starts as a personal project you can modify freely.
This is the recommended way to start from an existing app: fork it, then modify the code.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional new name for the fork (defaults to source name) | |
| project_id | Yes | Project ID of the public project to fork |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations show destructiveHint=false, readOnlyHint=false. The description clarifies it copies code and schema but no data, and the fork becomes a personal project. This adds behavioral detail beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the primary action, and each sentence adds value without unnecessary verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple input schema, clear annotations, and no output schema needed, the description fully covers what an agent needs: action, scope, constraints, and recommendation.
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 both parameters. The description adds no additional meaning beyond the schema descriptions (overall purpose, defaults) for 'name' and 'project_id', 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 clearly states the action ('Fork a public project into your account') and what is copied ('code and database schema without data'). It distinguishes from siblings like 'create_project' by specifying it starts from an existing app, but does not explicitly differentiate from other 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 explicitly recommends when to use this tool: 'This is the recommended way to start from an existing app' and implies use before modification, providing clear guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_agents_mdARead-onlyInspect
Return the AGENTS.md manifest for a project — what the Hatchable platform supports, the SDK module list with status, file conventions, the deny-list of npm packages you should NOT import (with redirects to the right SDK), the project's current tables / env keys / scheduled tasks, and how to deploy.
Always-fresh — regenerated against live DB state, so newly-set env keys / created tables show up immediately. Works on day-zero projects with no files yet.
Call this FIRST when starting work on a Hatchable project. It is the single source of truth for what's available and what to avoid.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Public project id (proj_…) |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and non-destructive. Description adds 'Always-fresh — regenerated against live DB state' and 'Works on day-zero projects with no files yet', which are useful behavioral traits not covered by 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 concise sentences, each serving a distinct purpose: what it returns, freshness/capability, and usage directive. No wasted words; 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?
No output schema, but description exhaustively lists the manifest contents (platform support, SDK modules, file conventions, deny-list, tables, env keys, tasks, deploy info) plus freshness guarantee, providing full understanding of what the tool returns.
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 has 100% coverage, describing the single parameter as 'Public project id (proj_…)'. Description does not add additional meaning beyond what the schema provides, so 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?
Description clearly states 'Return the AGENTS.md manifest for a project' and enumerates specific contents. Positioned as the first call for a Hatchable project, distinguishing it from sibling action 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?
Explicitly instructs 'Call this FIRST when starting work on a Hatchable project' and labels it 'single source of truth'. Does not explicitly list when not to use or compare to other info tools, but the directive is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_deploymentARead-onlyInspect
Detail view of one deployment by version number — returns the full file manifest (paths, hashes, sizes) and function list captured when that version shipped. Use it with list_deployments to audit or compare what changed between versions.
| Name | Required | Description | Default |
|---|---|---|---|
| version | Yes | Deployment version number | |
| project_id | Yes | Project ID |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds value by detailing return contents (file manifest, function list) and hinting at historical capture behavior. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loads the purpose, and every sentence adds value. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity, schema coverage, and annotations, the description is largely complete. It could mention pagination or limits on file manifest size, but the current level is sufficient for an agent.
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 schema already describes both parameters. Description does not add extra meaning beyond the schema, earning a baseline of 3.
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 'Detail view of one deployment by version number' and specifies what it returns: 'full file manifest (paths, hashes, sizes) and function list'. It distinguishes from siblings like list_deployments by noting it gives detail for a specific 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 suggests using it with list_deployments to audit or compare versions, providing clear context. However, it does not explicitly state when not to use it or list alternatives beyond list_deployments.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_projectARead-onlyInspect
Get project details including slug, visibility, status, deployed functions, and the database schema (tables, columns, types).
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project ID (e.g. proj_a8Kq7fR2xZ) |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, confirming it's a safe read. The description adds value by specifying what information is returned (database schema, deployed functions), going beyond the annotation signal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that efficiently lists the key details returned, with no superfluous words. Perfectly sized for a focused retrieval 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?
Given the simple input (one string ID) and no output schema, the description adequately covers what is returned. The lack of output schema is acceptable as the description lists the types of data included.
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% (only one parameter), and its description in the schema is clear. The description adds no new parameter-level info beyond what the schema provides, earning the baseline 3.
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 specifically states 'Get project details' and lists exact fields (slug, visibility, status, deployed functions, database schema), clearly distinguishing it from siblings like 'list_projects' or 'get_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 implies it should be used when full project details are needed, but does not explicitly mention when not to use it or alternatives. For example, if only the schema is needed, 'get_schema' might be more appropriate, but this is not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_schemaARead-onlyInspect
Return the database schema for the project's PostgreSQL database: tables, columns (with types), and indexes.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project ID (e.g. proj_a8Kq7fR2xZ) |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the tool is known to be safe. The description adds context about the output content (tables, columns, indexes), which is helpful beyond annotations. No contradictions found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that efficiently conveys the purpose and output. No extraneous words, well 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?
The description is complete for a read-only retrieval tool with one parameter and no output schema. It covers the main output aspects (tables, columns, types, indexes). A minor gap is that it doesn't specify if the schema is for the entire project or specific parts, but the context (project_id) implies project-wide.
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 has 100% coverage with a single required parameter (project_id). The description does not elaborate on the parameter beyond what the schema provides, but the schema is already clear. Therefore, baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns database schema including tables, columns with types, and indexes. It specifies the resource (PostgreSQL database schema) and verb (return), and is distinct from siblings like execute_sql or run_function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for obtaining schema details but provides no guidance on when to use this versus alternative tools (e.g., execute_sql for running queries). No exclusions or special conditions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
grepARead-onlyInspect
Regex content search across a project's files. Postgres-backed, scoped to one project, with glob filtering.
Three output modes:
files_with_matches (default) — list paths containing a match
content — matching lines with optional context and line numbers
count — per-file match counts + total
Default head_limit is 250 to prevent context blowups on broad patterns. Use glob to narrow by path (e.g. 'api//*.js', 'public//.html'). Regex uses Postgres syntax (~ / ~). Invalid or catastrophic patterns error out via a 2s statement timeout — simplify the pattern if that happens.
| Name | Required | Description | Default |
|---|---|---|---|
| -i | No | Case-insensitive match | |
| -n | No | Show line numbers in content mode (default true) | |
| glob | No | Path filter glob (e.g. 'api/**/*.js', 'public/*.html') | |
| context | No | Lines of context before/after each match (content mode) | |
| pattern | Yes | Regex pattern to search for | |
| head_limit | No | Max results to return (default 250, max 1000) | |
| project_id | Yes | Project ID (e.g. proj_a8Kq7fR2xZ) | |
| output_mode | No | Output format |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description doesn't need to restate non-destructive behavior. It adds behavior details: Postgres backend, defaults (head_limit=250), error behavior (2s timeout), and glob support. Minus one point because it doesn't clarify whether result ordering is deterministic or mention any rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a summary sentence followed by bullet points (rendered as a list in plain text). It is front-loaded with the core purpose. Slightly long but each sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (8 parameters, 3 output modes) and no output schema, the description covers the major behavioral aspects and defaults. It could mention that output is not sorted or explain the Postgres regex syntax more, but it's sufficient for most use cases.
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 description can be brief on params. It adds value by explaining output modes and default head_limit, but doesn't elaborate beyond the schema for each parameter. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it performs regex content search across project files, with specific verb 'search' and resource 'project files'. It distinguishes itself from sibling tools like 'search_documentation' or 'search_projects' by focusing on file content and specifying the regex backend and scoping.
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 explicit guidance on when to use this tool, including the three output modes, head_limit for broad patterns, glob filtering for narrowing paths, and how to handle regex errors. It implies it's for file search vs. other search tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_file_from_urlADestructiveIdempotentInspect
Fetch a remote URL and save the response body as a project file — server-side, so the bytes never pass through your context window. Useful for seed data, vendor libs, and asset migration.
Capped at 10 MB and 10s timeout. Private/loopback addresses are rejected. Path must live under public/, api/, or migrations/, or be one of seed.sql / hatchable.toml / package.json.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Full http(s) URL to fetch | |
| path | Yes | Destination path in the project | |
| project_id | Yes | Project ID |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already include 'destructiveHint: true' and 'idempotentHint: true', but the description adds valuable behavioral details: the file is created server-side, bytes never pass through context, has size and timeout limits, and rejects private addresses. It also specifies allowed paths, which is critical for understanding side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (three sentences) and front-loaded with the primary action and benefit. Every sentence adds necessary information: purpose, use cases, and constraints. No fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (3 params, no output schema, but with constraints), the description fully covers what the tool does, its boundaries (size, timeout, network restrictions), and allowed paths. It is complete for an agent to decide and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers all three parameters with descriptions, but the description adds context that 'url' is a remote URL to fetch, 'path' is a destination path with constraints (must be under specific directories), and 'project_id' is for project identification. Since schema coverage is 100%, baseline is 3; the description adds extra value about path restrictions, raising the score to 4.
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 'Fetch a remote URL and save the response body as a project file' with the specific verb 'Fetch' and resource 'remote URL' and 'project file'. It distinguishes itself from siblings like 'upload_file' or 'write_file' by mentioning server-side fetching and avoiding the context window.
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 mentions use cases ('seed data, vendor libs, and asset migration') and constraints ('Capped at 10 MB and 10s timeout', 'Private/loopback addresses are rejected', 'Path must live under...'). However, it does not explicitly state when NOT to use this tool versus alternatives like 'write_file' or 'upload_file'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_cron_jobsARead-onlyInspect
List every scheduled task for a project. A task points at a function and carries a cron expression (recurring) or a one-shot fire_at, plus an optional payload delivered as the request body. Tasks are either 'declared' (written into source via export const schedule or hatchable.toml, reconciled on deploy) or 'armed' (inserted by the SDK scheduler.at() call, preserved across deploys). Response includes next_fire_at, last_fired_at, attempts, last_error, and 7-day run/error counts from FunctionLog. Diagnostic: if next_fire_at keeps moving forward but last_fired_at never advances, the scheduler isn't running.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project ID |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it as readOnlyHint=true and destructiveHint=false. The description adds value by specifying the data returned (7-day run count, error count, last_run_at) and the context (scheduled functions).
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: first states what it does, second gives a specific use case. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given simple input (single required param), no output schema, and good annotations, the description is complete. It explains the output fields and typical usage. Slight lack of detail on expected output format (e.g., is it a list? what if empty?).
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% with a single parameter project_id. The description doesn't elaborate on the parameter, but the schema is minimal and clear. The description adds value by explaining what the tool returns, which is not in 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 clearly states it lists cron jobs with specific fields (cron expression, run count, error count, timestamp), which is specific and differentiates from siblings like list_functions or list_deployments.
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 to verify cron jobs are firing without tailing logs, providing a clear use case. However, it doesn't mention when not to use it or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_deploymentsARead-onlyInspect
List deployments for a project in reverse-chronological order. Each entry includes version, status, deployed_at, description, and summary counts (files, functions).
Use this to understand recent deploy history, identify a known-good version for rollback, or debug a regression by comparing two versions.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max deployments to return (default 20, max 100) | |
| project_id | Yes | Project ID (e.g. proj_a8Kq7fR2xZ) |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, which covers non-destructive behavior. Description adds ordering and included summary counts, which are useful but not critical. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise paragraphs: first explains what and how, second explains why. No unnecessary words. Could be slightly tighter, but effective.
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 list tool with 2 parameters, the description covers purpose, output fields, ordering, and use cases. Lacks pagination behavior beyond limit, but sufficiently complete for agent decision-making.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for both parameters (limit, project_id). Description does not add parameter-specific meaning beyond 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?
Description states specific action (list deployments), resource (project), ordering (reverse-chronological), and included fields (version, status, etc.). Clearly distinguishes from sibling tools like get_deployment which retrieves a single deployment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly suggests use cases: understand deploy history, identify known-good version for rollback, debug regression. Lacks explicit when-not-to-use or alternatives for similar purposes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_envARead-onlyInspect
List environment variable keys for a project. Only key names and an is_secret flag are returned — values are never exposed through this tool. Use process.env.KEY inside a deployed function to read the actual value.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project ID |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds transparency by explicitly stating that values are never exposed, confirming that this is a read-only operation without side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the main action, no redundancy. Every sentence adds useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description adequately explains what is returned (key names and is_secret flag). It also tells the agent how to get actual values, which is valuable context. However, it doesn't mention any pagination or limits.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage with a single project_id parameter described as 'Project ID'. The description adds context about the tool's scope (listing keys for that project), which is helpful but not strictly necessary 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 clearly states the tool lists environment variable keys for a project, specifying what is returned (key names and is_secret flag) and what is not (values). This distinguishes it from siblings like set_env or delete_env.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use this tool (to list env var keys) and what not to expect (values), and provides an alternative method to read actual values (process.env.KEY). However, it does not explicitly contrast with siblings like get_project or other tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_filesBRead-onlyInspect
List all files in a project with their paths, sizes, and hashes.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project ID (e.g. proj_a8Kq7fR2xZ) |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, so the description adds little beyond confirming read-only. It does not mention performance or pagination, which might be relevant for large projects. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, concise and front-loaded. Could be slightly more structured (e.g., bullet points), but adequate for its length.
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 that there is no output schema and annotations are minimal, the description provides basic output info (paths, sizes, hashes) but misses return format details, pagination, and sorting behavior. Adequate for a simple list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (one parameter with description). The description does not add extra meaning beyond the schema's description of project_id. 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 clearly states it lists files in a project and mentions the output fields (paths, sizes, hashes). It distinguishes from siblings like get_project (project-level) and read_file (single file). However, it could be more specific about which files (e.g., all files recursively?).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives. For example, when to use list_files over grep or read_file. No explicit context about prerequisites (e.g., project must exist).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_functionsARead-onlyInspect
List every deployed API function for a project: route, method, runtime tier, type ('scheduled' if the function has at least one active scheduled task, else 'api'), and 24-hour invocation and error counts.
This is the 'what routes did I ship' introspection tool. Call it after a fork, after picking up an unfamiliar project, or to verify a deploy registered the endpoints you expected. Much cheaper than reading every api/ file with read_file. For scheduling details (cron, fire_at, payload, run history) use list_cron_jobs.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project ID (e.g. proj_a8Kq7fR2xZ) |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true and destructiveHint=false. The description adds that it is an 'introspection tool' and discloses the returned data cost (cheaper than reading files). No behavioral contradictions, but could mention if it requires specific 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?
Two sentences: first explains what it does and returns, second gives usage context. No fluff, front-loaded with key information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description helpfully lists returned fields (route, method, etc.) which is sufficient for an introspection tool. Could mention pagination or filtering, but the simplicity and annotations make it complete enough.
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 the single required parameter (project_id) with description. The description does not add extra parameter semantics beyond the schema, earning a baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists 'every deployed API function for a project' and enumerates specific fields returned (route, method, runtime tier, cron schedule, invocation/error counts). It differentiates from siblings like list_deployments and list_files by focusing on functions, and from read_file by being cheaper.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: 'after a fork, after picking up an unfamiliar project, or to verify a deploy registered the endpoints you expected.' It also contrasts with read_file as 'much cheaper,' guiding the agent to prefer this over alternatives for overview purposes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_pending_uploadsARead-onlyInspect
Show multipart uploads currently staged for this project that haven't yet been committed. Use this to recover from a disconnect — find the upload_id and resume from the next chunk_index. Uploads expire 10 minutes after the last chunk was added.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project ID |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the description adds value by disclosing an expiration behavior ('Uploads expire 10 minutes after the last chunk was added'), which is critical for understanding data staleness. Would be a 5 if it also explained pagination or maximum list size.
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: first states the purpose, second gives usage scenario, third conveys an important behavioral detail. Each sentence serves a distinct purpose 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?
Given the tool's simplicity (1 param, no output schema), the description covers the key aspects: what it does, when to use it, and a time-bound behavior. Minor omission: no mention of how to commit the upload (but that might be another tool's job).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage and only 1 parameter, the schema already documents 'project_id' as a string. The description does not add extra meaning or constraints for the parameter, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Show') and resource ('multipart uploads currently staged for this project that haven't yet been committed'). It clearly distinguishes from sibling operations like 'upload_file' by focusing on pending/uncommitted uploads rather than initiating new ones.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use ('recover from a disconnect') and how to proceed ('find the upload_id and resume from the next chunk_index'). This provides actionable guidance beyond the purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_projectsARead-onlyInspect
List all projects you own or collaborate on, with their visibility, tier, role, and current version.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the tool is safe. The description adds value by listing returned fields (visibility, tier, role, version), which goes beyond annotations, but does not disclose pagination or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, no waste, front-loaded with verb and resource. Every word adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 0 parameters, no output schema, and clear annotations, the description is nearly complete. It could mention that it returns a list, but that is implied by 'list'. The returned fields are specified, which suffices.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0 parameters, so description cannot add parameter meaning beyond what schema provides. Schema coverage is 100%, making a baseline score of 4 appropriate, but since there are no parameters to explain, a 3 is reasonable for neutral impact.
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 a specific verb ('list') and resource ('projects you own or collaborate on'), and distinguishes what properties are returned (visibility, tier, role, current version). This differentiates it from sibling tools like 'search_projects' which likely involve filters.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving all projects you are involved in, with no explicit when-not or alternatives. However, given the sibling 'search_projects', it contrasts by not offering search capabilities, which is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
patch_fileADestructiveInspect
Apply a targeted edit to an existing project file without rewriting the entire file. Finds the first occurrence of old_string and replaces it with new_string. Use this instead of write_file when modifying large files (e.g. HTML) — you only send the changed portion, not the whole file.
The old_string must match exactly (including whitespace). If it's not found, the tool returns an error. To insert at a specific position, use a nearby string as old_string and include it in new_string with your addition.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | File path relative to project root | |
| new_string | Yes | Replacement string | |
| old_string | Yes | Exact string to find and replace | |
| project_id | Yes | Project ID (e.g. proj_a8Kq7fR2xZ) |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that the tool is destructive (matches annotation `destructiveHint: true`) and explains the replacement logic and error condition. It adds context beyond annotations by specifying that only the first occurrence is replaced and that the old_string must match exactly. Slightly lower score because it does not mention whether the operation is idempotent (though annotation says false) or if there are side effects like file locking.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each adding essential value: purpose and comparison to write_file, usage guidelines with exact match requirement, and insertion technique. No fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple tool (4 parameters, no output schema), the description covers most necessary context: when to use, how it works, error condition, and insertion trick. Minor gap: no mention of encoding or file size limits, but that is acceptable for a straightforward edit 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% with descriptions for each parameter. The description adds context about exact match requirement and insertion technique but does not provide additional semantic 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 uses a specific verb ('Patch file') and resource ('existing project file'), and clearly states that it replaces the first occurrence of `old_string` with `new_string`. It distinguishes itself from the sibling `write_file` by noting it is intended for targeted edits without rewriting the entire 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?
The description explicitly states when to use this tool ('instead of write_file when modifying large files') and provides guidance on how to insert at a specific position. It also warns about the requirement for exact match and error behavior, giving clear context for appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_fileARead-onlyInspect
Read the content of a project file.
Pass offset/limit to read a range of lines — useful for large files where the whole file would blow the context window. When either is set, the response includes cat -n style line-numbered content so subsequent patch_file calls can reference exact line numbers.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | File path relative to project root | |
| limit | No | Max number of lines to return. Omit to read to end. | |
| offset | No | Starting line number (1-indexed). Omit to read from start. | |
| project_id | Yes | Project ID (e.g. proj_a8Kq7fR2xZ) |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint true, so no destructive behavior. Description adds that offset/limit return line-numbered content for patch_file, which is useful beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose, then usage. Could be slightly more concise, but no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given simple read operation and full schema coverage, description is complete. No output schema needed since return is just file content.
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 already describes all 4 parameters clearly (100% coverage). Description adds context about line numbers for offset/limit but doesn't add meaning beyond 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?
Clearly states it reads a project file, distinguishes from siblings like write_file, patch_file, and grep. Specific verb+resource.
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 when to use offset/limit (for large files), but doesn't explicitly mention when not to use this tool or alternatives like grep for content search.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_codeADestructiveInspect
Execute arbitrary JS in the project's isolate runtime. The SDK is pre-imported into local scope — db, auth, email, storage, ai, agent, cache, vector, memory, tasks, scheduler, browser, images, run, approval, mcp are ready to use without import. process.env and global fetch also work. return to produce the result field. Top-level import and dynamic import('hatchable') are NOT supported in this REPL — the bindings above are how you reach the SDK.
Use this as a REPL: probe the database, verify a computation, test an API shape before committing it to a file. Nothing is persisted — the snippet runs once and disappears.
Caps: 5s default timeout (max 30s), 256 KB max source length.
Example:
run_code({ project_id, code: const { rows } = await db.query("SELECT count(*) FROM users");
return rows[0];
})
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | JS snippet. Use `return` to produce a result. | |
| project_id | Yes | Project ID | |
| timeout_ms | No | Execution timeout in ms (default 5000, max 30000) |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description details runtime environment (same bindings, non-persistent), but the destructiveHint annotation already indicates potential side effects (e.g., database writes). The description adds value by clarifying scoping (isolate runtime), timeout, and source length caps, and that nothing is persisted. It does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with front-loaded purpose, clear guidelines, caps, and an example. Every sentence adds value, 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?
Given no output schema, the description explains return value ('result' field) and provides context about environment, caps, and example. It is complete for understanding the tool's behavior and constraints.
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 covers all 3 parameters with descriptions. The description adds context beyond schema: code snippet environment and return behavior, timeout range, and an example. However, the example is redundant with the param description for 'code'.
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 executes arbitrary JS in an isolate runtime with specific bindings, distinct from siblings like run_function or execute_sql. It uses a specific verb (Execute) and resource (JS in isolate runtime with bound APIs), leaving no ambiguity about what it does.
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 as a REPL for probing, verifying, testing, and notes that nothing is persisted. It implicitly differentiates from siblings like run_function (deployed functions) and write_file (persistence), and sets clear expectations for when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_functionADestructiveInspect
Execute a deployed function and return the real response. Use this to test your API endpoints.
Returns: { status, headers, body, logs, error, duration_ms }
Example: run_function({ project_id: 1, path: "/api/users", method: "GET" }) Example: run_function({ project_id: 1, path: "/api/users", method: "POST", body: { name: "Alice" } })
IMPORTANT: Always run_function on your API endpoints after writing them. Inspect the response body field names and types. Then write your frontend to match those exact names.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Request body (for POST/PUT) | |
| path | Yes | Function route path (e.g. "/api/services") | |
| query | No | URL query parameters | |
| method | No | HTTP method | |
| headers | No | Additional request headers | |
| project_id | Yes | Project ID (e.g. proj_a8Kq7fR2xZ) |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations include destructiveHint: true and openWorldHint: true, which are well-addressed by the description (executing a function). The description adds return structure and example usage, but does not elaborate beyond annotations. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is concise: three sections in two paragraphs. Front-loaded with purpose, then returns, then examples, then best-practice callout. Slightly verbose in the last sentence, but still efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Tool is medium complexity with 6 parameters. Without an output schema, the description does well to list the return object. However, it could mention error handling or rate limits, but the examples partially compensate.
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. The description does not add extra parameter-level details beyond examples; the schema already describes each parameter sufficiently.
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 executes a deployed function and returns the real response, with a clear verb ('Execute') and resource ('deployed function'). The sibling tools include 'list_functions' and 'deploy', so 'run_function' is unambiguously distinct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance: 'Use this to test your API endpoints' and 'Always run_function on your API endpoints after writing them.' No alternatives are needed among siblings; this is the unique tool for testing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_documentationARead-onlyInspect
Search Hatchable's own documentation for platform behavior — routing, the SDK surface, deploy semantics, auth config, runtime limits. Call this instead of guessing when you're unsure how a Hatchable feature works.
Ranks results by term frequency across headed sections. Returns source file, section heading, and a snippet around the hit.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 5, max 20) | |
| query | Yes | Search terms |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the tool's safety is clear. The description adds behavioral details beyond annotations: it explains how results are ranked ('by term frequency across headed sections') and what is returned ('source file, section heading, and a snippet'). This helps the agent understand the search mechanics and result format. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: two short paragraphs. The first paragraph states purpose and usage guidance. The second paragraph explains behavior. Every sentence adds value. No redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (simple search with two parameters), the description is complete. Annotations cover safety. The description covers purpose, when to use, ranking behavior, and return format. No output schema exists, but the description explains what is returned (source file, section heading, snippet), which is sufficient for an agent to understand and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does not directly describe parameters, but it adds value by explaining the ranking method and result structure, which helps the agent infer how 'query' will be interpreted. The 'limit' parameter is already described in the schema. The description compensates slightly by providing context on result format, but does not elaborate on parameters beyond what's in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Search') and resource ('Hatchable's own documentation'), and clearly distinguishes the tool's purpose from sibling tools by explaining what topics it covers (routing, SDK, deploy semantics, etc.). It explicitly contrasts with guessing, 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?
The description explicitly tells when to use the tool: 'Call this instead of guessing when you're unsure how a Hatchable feature works.' This provides clear guidance on when the tool is appropriate and implicitly when not (e.g., for non-Hatchable documentation). No alternative tools named, but the list of sibling tools includes general search (grep, search_projects) and the description positions this as the specific search for platform docs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_projectsARead-onlyInspect
Search the public Hatchable project directory — other people's projects that you can view or fork. Use this to find existing apps to fork-and-modify as a starting point.
Note: this searches the public marketplace. To search inside your own project's files, use the grep tool instead.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 20, max 50) | |
| query | No | Search query (matches name, tagline, description) | |
| category | No | Filter by category |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and destructiveHint=false, so description does not need to restate safety. Description adds value by clarifying the scope (public marketplace) and note about searching own files. No contradictions. A 4 reflects rich contextual addition beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is concise with two clear sentences, front-loading the main purpose. Could be slightly more compact but no redundant information. Loses a point for not being maximally dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple tool (3 optional parameters, no output schema), description fully covers purpose, scope, and usage boundaries. No additional information needed for an agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are well-documented. Description does not add extra meaning to parameters (e.g., format of query, allowed categories). Baseline 3 is appropriate since schema covers all details.
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 clearly states it searches the public Hatchable project directory for other people's projects, contrasting with internal project search using grep. The verb 'search' and resource 'public project directory' are specific and distinct from sibling tools like search_documentation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use (find existing apps to fork) and when not to use (for internal project files, use grep instead). Provides clear context for choosing this tool over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_envADestructiveIdempotentInspect
Set environment variables for a project. Available in functions via process.env.KEY. Keys containing SECRET, PASSWORD, TOKEN, API_KEY, or PRIVATE are automatically marked as secrets.
| Name | Required | Description | Default |
|---|---|---|---|
| vars | Yes | Key-value pairs of environment variables | |
| project_id | Yes | Project ID (e.g. proj_a8Kq7fR2xZ) |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description discloses key behavior: variables are available in functions, and automatic secret marking based on key naming conventions. This adds context beyond annotations, which only indicate destructiveHint=true and idempotentHint=true. The description explains the destructive aspect (secrets behavior) and idempotency implicitly.
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, efficiently conveying purpose, usage context, and important behavioral detail. No fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Tool is fairly simple (2 params, no output schema). Description adequately explains what the tool does and a key side effect (secret auto-marking). Could mention scope (project-level) and if it overwrites or appends, but schema clearly indicates overwrite (vars object). Lacks mention of no return value (implied).
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 description need not repeat. However, description adds no extra detail on parameters beyond schema. A slight bonus for linking to functions usage, but not necessary. Baseline 3 is appropriate; score 4 because description context justifies secret handling which parameter semantics benefit from.
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 clearly states 'Set environment variables for a project', which is a specific verb+resource combination. It distinguishes from sibling tools like list_env (which lists variables) and delete_env (which deletes variables).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description implies when to use: when you need to set environment variables. It lacks explicit guidance on when not to use or alternatives, but naming convenience (e.g., 'Available in functions via process.env.KEY') helps. No sibling comparison mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
setup_accountADestructiveInspect
Associate an email and handle with your account.
Step 1: Call with just email — sends a 6-digit verification code. Step 2: Call with email + code + handle — verifies and completes setup.
This lets you log in to the console and sets your permanent @handle.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Six-digit verification code from email (omit to request a code) | |
| Yes | Email address | ||
| handle | No | Desired @handle (3-30 chars, lowercase, starts with letter) |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate destructiveHint=true, which is consistent with account modification. The description adds behavioral context: sending verification code, two-step process, and permanent handle. However, it does not disclose if setup can be undone.
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?
Very concise: three sentences effectively convey purpose, usage steps, and outcome. No unnecessary information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, description explains what happens (code sent, verification completed, permanent handle set). Could mention that setup is irreversible or session-related 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?
Schema coverage is 100%, and description supplements it by explaining the role of each parameter in the multi-step flow (e.g., omitting code to request a code). The handle validation (3-30 chars, lowercase, starts with letter) is only in schema, but description adds context about completion.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: associate an email and handle with your account, with a step-by-step process for requesting and verifying a code. It distinguishes from sibling tools as no other tool relates to account setup.
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 outlines a two-step usage pattern: first call with only email, then second call with email, code, and handle. It also states the purpose of the setup (logging in, setting permanent handle). No alternatives needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_visibilityADestructiveIdempotentInspect
Change a project's visibility.
personal: you + invitees, login-gated, free
public: on the open web, requires Public plan ($12/mo). No app-level auth.
app: on the open web + user signups, requires App plan ($39/mo). Required if [auth] is enabled.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project ID (e.g. proj_a8Kq7fR2xZ) | |
| visibility | Yes | New visibility |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate destructiveHint=true and idempotentHint=true. The description adds context on plan requirements and auth implications, which are beyond annotations. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, uses bullet points for readability, and front-loads the purpose. Every line adds value without verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has only 2 parameters and no output schema, the description covers the key behavioral aspects. It could mention that the change is immediate or any side effects, but overall sufficient for agent selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, with clear descriptions for each parameter. The description adds value by explaining the meaning of each visibility value, going beyond the schema's enum listing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it changes a project's visibility and lists the three visibility options with their implications, distinguishing it from sibling tools like create_project or update_project.
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 explains the differences between personal, public, and app visibilities, including requirements like plans and auth. However, it doesn't explicitly state when not to use this tool or provide alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_projectADestructiveIdempotentInspect
Update project metadata: name, tagline, description, category, is_template. Only the fields you pass are touched. For visibility changes use set_visibility; slug and tier are immutable.
Setting is_template: true lists the project in the public Templates gallery so other users can fork it. Requires non-personal visibility — call set_visibility first if needed.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Project name (max 100 chars) | |
| tagline | No | Short tagline (max 200 chars) | |
| category | No | Category label (max 50 chars) | |
| project_id | Yes | Project ID | |
| description | No | Long description (max 2000 chars) | |
| is_template | No | List in the Templates gallery (true) or remove (false). Requires the project to be public/app visibility. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Disclosures beyond annotations: mentions that only passed fields are touched (partial update behavior) and that slug and tier are immutable. Annotations already indicate destructiveHint=true (mutation) and idempotentHint=true, which aligns with the 'only fields you pass are touched' behavior. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, efficient and front-loaded with the verb 'Update' and resource 'project metadata'. Every clause adds value: what can be updated, partial update behavior, which tool to use for visibility, and immutability of slug/tier. Could be slightly more concise but well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 5 parameters (all described in schema), annotations providing mutation and idempotency info, and no output schema, the description covers purpose, partial update behavior, and boundaries (visibility via set_visibility, immutable slug/tier). Missing details like required permissions or error conditions, but acceptable for a metadata update tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for each parameter. The description adds value by summarizing which fields can be updated (name, tagline, description, category) but doesn't add additional constraints like limits (max chars) already in schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it updates project metadata and enumerates specific fields (name, tagline, description, category). Distinguishes from sibling tool set_visibility by noting that visibility changes should use that tool instead. Also mentions immutability of slug and tier, adding further specificity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool (for updating metadata fields) and when not to use it (for visibility changes, use set_visibility; slug and tier are immutable). This provides clear guidance and directs the agent to alternative tools, making the decision straightforward.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_fileADestructiveIdempotentInspect
Multipart file upload for content that exceeds a single model response's output token cap (big SPA bundles, large seed data, inline vendor libs).
Flow: first call with chunk_index=0 and NO upload_id — response returns an upload_id. Subsequent calls pass that upload_id with chunk_index=1, 2, 3…. Last call sets final=true to atomically concatenate and commit as one ProjectFile.
Chunks are staged in Redis with a 10-minute TTL. chunk_index overwrites (safe to retry). Max chunk size: 64 KB. Max assembled file: 20 MB.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Destination path | |
| chunk | Yes | Chunk content (max 64 KB) | |
| final | No | Set true on the last chunk to commit | |
| upload_id | No | Returned from the first call. Omit for chunk 0. | |
| project_id | Yes | Project ID | |
| chunk_index | Yes | 0-based chunk ordinal |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate destructiveHint=true (file creation/modification) and idempotentHint=true (safe retries). The description adds details: chunk TTL (10 min), max chunk size (64 KB), max assembly (20 MB), and overwrite safety, which go beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is concise with three sentences: first states purpose, second details flow, third adds constraints. Every sentence is necessary and 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 no output schema, the description answers key questions: how to start, continue, finish, constraints (size, TTL), and retry safety. For a complex multipart tool, this is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear descriptions. The description adds nuance: upload_id omitted for chunk 0, chunk_index 0-based, and final=true role. However, the description does not add significant meaning beyond the schema for most parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: multipart file upload for large content exceeding token caps. It distinguishes from siblings like write_file and patch_file by specifying the multipart flow and chunk commitment mechanism.
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 explicit step-by-step flow: first call without upload_id, subsequent calls with it, and final=true to commit. It also mentions retry safety and TTL, guiding when to use this tool instead of alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
view_logsARead-onlyInspect
View function execution logs with rich filtering. Each entry includes status_code, duration_ms, log_output (captured console.log), error (if any), and a derived level field (error/warning/info).
Filter by any combination of function_name, route, method, status_code (exact or 4xx/5xx wildcards), level, time range (since/until — ISO or relative like '1h'/'30m'/'7d'), full-text query across log_output and error, or specific request_id.
Use this to debug production issues: e.g. level='error' + since='1h' finds everything that blew up in the last hour.
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | Filter by severity: 'error', 'warning', or 'info' | |
| limit | No | Max entries (default 50, max 1000) | |
| query | No | Full-text search across log_output and error | |
| route | No | Filter by exact request path (e.g. /api/users) | |
| since | No | Start time — ISO 8601 or relative ('1h', '30m', '7d') | |
| until | No | End time — ISO 8601 or relative | |
| method | No | Filter by HTTP method | |
| project_id | Yes | Project ID | |
| request_id | No | Filter to a single request | |
| status_code | No | Exact code ('500') or wildcard ('4xx', '5xx') | |
| function_name | No | Filter by function name |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the description adds value by detailing the log entry fields (status_code, duration_ms, etc.) and derived `level` field. It does not mention pagination or sorting behavior, which could be useful, but overall it provides sufficient behavioral context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections: a statement of what is returned, a list of filtering capabilities, and a usage example. It is concise (3 sentences) but front-loads key information. Minor improvement could be to break into bullet points for even easier scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (11 parameters, no output schema), the description covers the main aspects: what logs contain, how to filter, and a practical usage example. It lacks details on default sort order and potential performance implications, but is largely complete for a debugging tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds significant meaning by explaining the derived `level` field and providing examples of wildcards for status_code ('4xx', '5xx') and relative time formats ('1h', '30m', '7d'). It also describes full-text search across log_output and error, enriching the 'query' 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 uses the specific verb 'View' and the resource 'function execution logs', accurately reflecting the tool's purpose. It clearly distinguishes from sibling tools by focusing on log viewing, while siblings like 'run_function', 'get_deployment', and 'read_file' serve different purposes. The detailed filtering options further clarify what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use the tool, including a concrete example: 'Use this to debug production issues: e.g. level='error' + since='1h''. It also implicitly excludes other tools by describing rich filtering, which is unique among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_fileADestructiveIdempotentInspect
Write or overwrite a project file. Paths are relative to the project root.
Valid locations: public/** static files (HTML, CSS, JS, images, etc.) api/.js backend functions (each file is one endpoint) api/_lib/ shared helpers imported by api/ files, not routed migrations/*.sql database migrations, run in filename order seed.sql optional seed data, runs once on fresh installs hatchable.toml optional config overrides package.json dependencies (no build script yet)
Files are stored but not live until you call deploy.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | File path relative to project root. Must be under public/, api/, migrations/, or one of: seed.sql, hatchable.toml, package.json | |
| content | Yes | File content | |
| project_id | Yes | Project ID (e.g. proj_a8Kq7fR2xZ) |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true. Description adds key context: files are stored but not live until 'deploy' is called, and overwrites existing files. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is compact, front-loaded with purpose, and uses bullet points for valid locations. Could be slightly more concise by removing the 'each file is one endpoint' note in api/ line, as that's implementation detail.
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 no output schema, description covers input constraints (valid paths, relative root) and post-write behavior (deploy needed). Could mention character encoding or max file size, but not necessary for typical use.
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%; the description re-iterates valid paths but does not add new meaning beyond the schema's 'description' fields for parameters. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description starts with a clear verb-resource pair: 'Write or overwrite a project file'. It specifies scope ('relative to project root') and lists valid locations, distinguishing it from tools like patch_file (partially modify) or upload_file (likely binary).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly lists valid directories and file types, informing when to use this tool. However, no explicit when-not-to-use or alternatives mentioned among 30+ sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_filesADestructiveIdempotentInspect
Write multiple project files in a single call. Same rules as write_file but batched — faster for scaffolding a new project or updating several files at once.
Each entry in the files array has a path and content. All files are written atomically — if any path is invalid, none are written.
| Name | Required | Description | Default |
|---|---|---|---|
| files | Yes | Array of files to write | |
| project_id | Yes | Project ID (e.g. proj_a8Kq7fR2xZ) |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses atomicity (if any path invalid, none written) which adds value beyond annotations. The destructiveHint is true, and the description confirms it modifies files, consistent 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 short paragraphs, no fluff, front-loaded with key purpose. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, usage, and key behavior. Could optionally mention the number of files limit, but not necessary.
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. Description adds context about atomicity and the files array structure, but does not add new meaning beyond 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?
Clearly states the tool writes multiple project files in a single call, distinguishing itself from the sibling 'write_file' tool by highlighting batching and atomicity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states it is for scaffolding or updating multiple files at once, implicitly suggesting use over 'write_file' when batching is beneficial, but does not specify 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.
Claim this connector by publishing a /.well-known/glama.json file on your server's domain with the following structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"maintainers": [{ "email": "your-email@example.com" }]
}The email address must match the email associated with your Glama account. Once published, Glama will automatically detect and verify the file within a few minutes.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!