Anythink-MCP
OfficialManage Anythink accounts, projects, and project backends through MCP, with dedicated auth/config/project tools plus a generic CLI passthrough for all other commands.
Create/sign up/log in via email/password, Google, or direct org credentials, and log out/remove saved profiles.
Inspect, switch, and remove local CLI profiles/config.
List, create, and select billing accounts.
List, create, connect to, and delete projects.
Run any
anythinkCLI command through theclitool, covering entities, fields, data, search, workflows, users, files, roles, api-keys, menus, integrations, pay, oauth, migrate, plans, api/docs, and more.Use
--jsonwhere supported for machine-readable output and--yesfor destructive command confirmation.
Allows logging in via Google OAuth for authentication.
Anythink CLI
The official command-line interface for Anythink — the headless backend platform for developers and founders. Manage your projects, entities, data, workflows, users, files, and payments without leaving the terminal.
░███ ░██ ░██ ░██ ░██
░██░██ ░██ ░██ ░██
░██ ░██ ░████████ ░██ ░██ ░████████ ░████████ ░██░████████ ░██ ░██
░█████████ ░██ ░██ ░██ ░██ ░██ ░██ ░██ ░██░██ ░██ ░██ ░██
░██ ░██ ░██ ░██ ░██ ░██ ░██ ░██ ░██ ░██░██ ░██ ░███████
░██ ░██ ░██ ░██ ░██ ░███ ░██ ░██ ░██ ░██░██ ░██ ░██ ░██
░██ ░██ ░██ ░██ ░█████░██ ░████ ░██ ░██ ░██░██ ░██ ░██ ░██
░██
░███████Contents
Related MCP server: stripe
Installation
Both the anythink CLI and the anythink-mcp server are distributed together. The quickest way to get both is Homebrew.
Homebrew (macOS / Linux) — recommended
brew install anythink-cloud/tap/anythinkThis installs both commands onto your PATH:
anythink— the CLIanythink-mcp— the MCP server (see MCP server)
Or tap first, then install:
brew tap anythink-cloud/tap
brew install anythinkUpdate to the latest release:
brew upgrade anythinkUninstall:
brew uninstall anythinkmacOS / Linux — download binary
Grab the latest release for your platform from the Releases page:
Platform | Binary |
macOS (Apple Silicon) |
|
macOS (Intel) |
|
Linux (x86_64) |
|
Linux (ARM64) |
|
# Example — macOS Apple Silicon
curl -Lo anythink https://github.com/anythink-cloud/anythink-cli/releases/latest/download/anythink-osx-arm64
chmod +x anythink
sudo mv anythink /usr/local/bin/The MCP server ships as a matching anythink-mcp-<platform> binary on the same release — download and install it the same way (e.g. anythink-mcp-osx-arm64).
Verify the download against checksums.txt in the release assets:
sha256sum -c checksums.txt --ignore-missing.NET global tool
If you have the .NET 8 SDK installed:
dotnet tool install --global anythink-cliBuild from source
git clone https://github.com/anythink-cloud/anythink-cli
cd anythink-cli
dotnet build
dotnet run --project src/AnythinkCli.csproj -- --helpGetting started
# 1. Create an account (or log in if you already have one)
anythink signup
# 2. Create a billing account
anythink accounts create --name "My Company"
# 3. Create a project
anythink projects create "My App" --region lon1
# 4. Connect to the project
anythink projects use <project-id>
# 5. Start building
anythink entities list
anythink workflows listYour credentials and project profiles are stored in ~/.anythink/config.json. You can manage multiple projects by running projects use to switch between them.
Command reference
signup / login / logout
anythink signup Create a new Anythink account
anythink login Log in to the platform
anythink logout Remove saved credentials for a project profilesignup and login are interactive — they prompt for email and password and walk you through connecting to a billing account and project on first run.
accounts
Manage billing accounts. A billing account is the container for one or more projects and holds your subscription and payment details.
anythink accounts list List your billing accounts
anythink accounts create Create a new billing account
anythink accounts use <id> Set the active billing accountExamples
anythink accounts create --name "Acme Ltd" --email billing@acme.com
anythink accounts use a1b2c3d4projects
Create and manage Anythink projects. Each project is an isolated backend instance with its own database, auth, files, and workflows.
anythink projects list List projects in the active billing account
anythink projects create <name> Create a new project
anythink projects use <id> Connect to a project (sets it as the active profile)
anythink projects delete <id> Delete a projectOptions — projects create
Flag | Description |
| Deployment region (e.g. |
| Plan ID (see |
Examples
anythink projects create "My App" --region lon1
anythink projects use a1b2c3d4
anythink projects delete a1b2c3d4 --yesconfig
View and manage saved CLI profiles.
anythink config show List all profiles and platform settings
anythink config use <profile> Set the active project profile
anythink config remove <profile> Remove a profileProfiles are named by project alias or ID and stored in ~/.anythink/config.json.
entities
Manage entities (database tables) in the active project.
anythink entities list List all entities
anythink entities get <name> Get entity details and fields
anythink entities create <name> Create a new entity
anythink entities update <name> Update entity settings
anythink entities delete <name> Delete an entity and all its dataOptions — entities create
Flag | Description |
| Enable row-level security |
| Make the entity publicly readable |
| Lock new records (prevent direct creation) |
| Mark as a junction (many-to-many) table |
Examples
anythink entities create orders --rls
anythink entities get customers
anythink entities delete temp_data --yesfields
Manage fields on an entity. Fields map directly to database columns.
anythink fields list <entity> List fields on an entity
anythink fields add <entity> <name> Add a field
anythink fields delete <entity> <id> Delete a fieldOptions — fields add
Flag | Description |
| Field type: |
| Mark the field as required |
| Enforce a unique constraint |
| Add a database index |
| Default value |
Examples
anythink fields list customers
anythink fields add customers email --type varchar --unique --required
anythink fields add products price --type float --required
anythink fields delete customers 1234 --yesdata
CRUD operations on entity records.
anythink data list <entity> List records
anythink data get <entity> <id> Get a single record by ID
anythink data create <entity> Create a new record
anythink data update <entity> <id> Update a record
anythink data delete <entity> <id> Delete a record
anythink data export <entity> <file> Export records to CSV, JSON or JSONL
anythink data import <entity> <file> Create records from CSV, JSON or JSONLOptions — data list
Flag | Description |
| Records per page (default: 20) |
| Page number (default: 1) |
| Field filters — JSON ( |
| Output raw JSON instead of table |
| Stream all pages as sequential JSON objects (requires |
Filter operators (JSON form) — {"field": value} matches exactly, {"field": [a, b]} matches any, {"field": null} matches empty. For anything else use an operator object, e.g. {"price": {"gte": 10, "lt": 100}}:
Operator | Meaning |
|
| Equal / not equal |
|
| Comparisons |
|
| Case-insensitive substring |
|
| Case-insensitive prefix/suffix |
|
| Any of a list |
|
| Empty / not empty |
|
| Has / lacks related records |
|
Options — data create / data update
Flag | Description |
| JSON object of field values |
Examples
anythink data list blog_posts --limit 10
anythink data get blog_posts 42
anythink data create blog_posts --data '{"title":"Hello World","status":"draft"}'
anythink data update blog_posts 42 --data '{"status":"approved"}'
anythink data delete blog_posts 42 --yesExport and import — data export streams records page by page to a file; data import creates one record per row. Always run an import with --dry-run first: it validates every row and sends nothing.
anythink data export customers customers.csv
anythink data export orders orders.jsonl --filter 'status=paid' --fields id,total
anythink data import customers customers.csv --dry-run
anythink data import customers customers.csv --errors rejected.csv --yesFlag ( | Description |
|
|
| Same syntax as |
| Columns to export, in order. CSV defaults to the entity's fields |
| Records per request (default 200, max 1000) |
| Overwrite an existing file. Without it an existing file is never touched. The file is written to a temporary name and renamed on success, so a failed export never leaves a partial file |
| CSV only: see below |
Flag ( | Description |
|
|
| Validate and report; nothing is sent |
| Parallel creates (default 4, max 16) |
| Write skipped and failed rows, with an |
| Drop columns that aren't fields on the entity instead of rejecting the row |
| Skip the confirmation prompt. Required when not running interactively (CI, scripts, agents), otherwise the import refuses before writing anything |
How values are handled:
CSV is RFC 4180: cells containing a comma, quote or line break are quoted, quotes are doubled, and quoted cells can span lines. Objects, arrays, JSON fields and relations are written as compact JSON text.
Formula guard (export): CSV text starting with
=,+,-,@, tab or carriage return is prefixed with'so spreadsheets don't run it as a formula. Numbers are never changed. This includes phone numbers such as+44 20 7946 0000and any text with a leading+or-. The guard is one-way: importing the file keeps the'unless the file was exported with--no-formula-guard.Types follow the entity's fields. Text keeps its exact characters (
00123stays00123); integers and decimals are parsed with.as the decimal separator (1,5is rejected, never guessed); booleans accepttrue/false,1/0andyes/no; dates must be ISO 8601 (2025-03-31,2025-03-31T09:30:00Z; no offset means UTC); JSON fields must be valid JSON.An empty CSV cell is sent as
null. In JSON and JSONL input an empty string stays an empty string.Bad rows are skipped, never sent. They are reported with a row number (CSV: record number, so the header is row 1; JSONL: line number; JSON: position in the array) and counted as skipped. Rows the server rejects are counted as failed. The exit code is non-zero if any row was skipped or failed.
Retries:
400,409and422are never retried, so a create is not repeated. See Uncertain failures below for what is retried.System columns are ignored on import:
id,created_at,updated_at,tenant_idandlockedare never sent, and the import says which it ignored. Importing an export back into the same project therefore creates duplicates with new ids and timestamps; it does not update the originals.One-to-many collections and secret fields are skipped on import (the import lists them), and one-to-many columns are left out of an export unless you name them in
--fields. Many-to-many, file and user columns are copied as ids, which only mean something inside the same project; the import warns once per column.Empty boolean cells are sent as
nullrather thanfalse.Uncertain failures: only
429/503responses and requests that never reached the server (DNS, connection or TLS failures) are retried. If a request times out or the connection drops after sending, the row is reported asUNCERTAIN: may have been created, in the errors file too; check the project before re-importing it. Rate-limit waits pause every worker together and are retried for over a minute before giving up.Ctrl+C stops reading the file, finishes the rows already queued and prints a partial summary (exit code 1). An interrupted export removes its temporary file.
data importanddata exportread and write local files, so they are not available through the hosted (HTTP) MCP server.
Not supported yet: updating or upserting existing records by key, looking up relations by a natural key (use the related record's id), and file uploads.
search
Full-text search across your entities, plus index lifecycle management.
anythink search query <text> Run a search
anythink search similar <entity> <id> Find similar documents
anythink search rehydrate [<entity>] Rebuild the search index (admin)
anythink search purge [<entity>] Wipe the search index (admin)
anythink search audit <entity> Compare configured public-searchable fields
with what public search actually returnsOptions — search query
Flag | Description |
| Comma-separated entity names. Default: all indexed entities. |
| Filter expression, e.g. |
| Comma-separated sort fields, e.g. |
| Comma-separated fields to compute facet counts on. |
| Highlight matched terms in results. |
| Page number (default: 1). |
| Results per page (1-100, default: 20). |
| Use the unauthenticated |
| Print the raw response JSON. |
Index lifecycle
rehydrate and purge are admin operations on the search index:
search rehydrate— rebuilds the index from the database (no data loss; just resyncs)search purge— deletes the index (runrehydrateafter to repopulate)
Both confirm by default; pass -y / --yes to skip the prompt for automation.
search audit — public-search data leak check
Compares what the entity's schema says should be public-searchable (fields with publicly_searchable=true and the entity's own is_public=true) against what /search/public actually returns. Any field appearing in public results that isn't on the allowlist is reported as a leak.
Exits with code 1 if a leak is detected — useful for CI/CD.
Examples
# Browse everything
anythink search query "*"
# Filtered search with sorting
anythink search query "anythink" --filter "status=published" --sort "created_at:desc"
# Compare what public visitors see vs what's in the database
anythink search audit posts
anythink search audit users --query "alice" --sample 10
# Reindex after a schema change
anythink search rehydrate posts
anythink search rehydrate --yes # everything (admin)
# Geo search (radius in metres)
anythink search query "*" --filter "_geoRadius(51.5074,-0.1278,5000)"workflows
Manage automation workflows. A workflow can have several triggers: a cron schedule, an entity event, an API route, or a manual run.
anythink workflows list List all workflows (--json for a compact summary)
anythink workflows get <id> Get workflow details and steps (--json for the full definition)
anythink workflows create <name> Create a new workflow
anythink workflows update <id> Rename a workflow or change its description
anythink workflows enable <id> Enable a workflow
anythink workflows disable <id> Disable a workflow
anythink workflows trigger <id> Manually trigger a workflow
anythink workflows delete <id> Delete a workflowTrigger types — workflows create --trigger <type> (not case-sensitive; default Manual)
Type | Fires | Required flag | Other flags |
| When run by hand, on an entity |
| |
| When an event happens, such as a record being created |
|
|
| On a cron schedule |
| |
| When its API route is called |
|
--event (not case-sensitive) is EntityCreated (default), EntityUpdated, EntityDeleted, UserRegistered, UserInvited, SubscriptionCreated, SubscriptionActivated, SubscriptionExpired, PaymentCreated, PaymentSucceeded, PaymentFailed, PaymentMethodCaptured, PaymentMethodCaptureFailed, PaymentMethodRemoved or PushActionTaken; only the three Entity... events need --entity. A trigger missing its required flag is rejected before anything is sent, and a flag that doesn't apply to the chosen type is ignored with a warning.
Other options — workflows create
Flag | Description |
| Workflow description |
| Enable the workflow straight away |
| Read the |
Examples
anythink workflows create daily-sync --trigger Timed --cron "0 6 * * *"
anythink workflows create on-post --trigger Event --entity blog_posts --event EntityUpdated
anythink workflows create import-hook --trigger Api --api-route hooks/import
anythink workflows create review-posts --entity blog_posts
anythink workflows trigger 76
anythink workflows disable 83users
Manage users in the active project.
anythink users list List all users
anythink users me Show the currently authenticated user
anythink users get <id> Get a user by ID
anythink users invite <email> <first> <last> Create a user and send an invitation email
anythink users delete <id> Delete a userOptions — users invite
Flag | Description |
| Assign a role to the new user |
Examples
anythink users list
anythink users invite alice@example.com Alice Smith --role-id 3
anythink users delete 42 --yesfiles
Manage uploaded files in the active project.
anythink files list List uploaded files
anythink files get <id> Get file metadata by ID
anythink files upload <path> Upload a file
anythink files delete <id> Delete a fileOptions — files list
Flag | Description |
| Page number |
| Files per page (default: 25) |
Options — files upload
Flag | Description |
| Make the file publicly accessible |
Examples
anythink files list
anythink files upload logo.png --public
anythink files upload export.csv
anythink files delete 12 --yesView and edit the project's transactional email templates (confirmation, invite, recovery and so on) and the HTML shell that wraps every email's body. Email commands need the project's email permissions; the API enforces them for whoever is signed in.
anythink email templates list List the project's email templates
anythink email templates show <type> Show a template's subject and content
anythink email templates update <type> Change a template's subject and/or content
anythink email preview Render an unsaved draft and print the HTML
anythink email shell show Show the shell HTML (custom or platform default)
anythink email shell update Save new shell HTML, or reset itOptions — email templates show
Flag | Description |
| Print the rendered HTML (with sample data) instead of the source |
Options — email templates update
Flag | Description |
| New subject line |
| File with the new content (use |
| The new content, passed inline (use this or |
Pass at least one of the subject or the content. Whatever you leave out keeps its current value. Empty content is refused.
Options — email preview (renders on the server and saves nothing)
Flag | Description |
| Subject to render (default: |
| File with the content (use |
| The content, passed inline |
| Optional shell HTML to render against (use |
| Optional shell HTML, passed inline |
Options — email shell update (pass exactly one)
Flag | Description |
| File with the new shell HTML (use |
| The new shell HTML, passed inline |
| Go back to the platform default shell |
HTML is limited to 1,000,000 characters. The shell and template commands print raw HTML, so you can redirect it to a file. Through the MCP server the file options are not offered, so agents pass the HTML inline with content_text, wrapper_text and html_text.
Examples
anythink email templates list
anythink email templates show confirmation --rendered > confirmation.html
anythink email templates update confirmation --subject "Welcome aboard"
anythink email templates update confirmation --content ./confirmation.html
cat confirmation.html | anythink email templates update confirmation --content -
anythink email preview --subject "Hi" --content ./draft.html --wrapper ./shell.html
anythink email shell show > shell.html
anythink email shell update --html ./shell.html
anythink email shell update --resetroles
Manage roles in the active project. Roles control what authenticated users can access.
anythink roles list List all roles
anythink roles create <name> Create a new role
anythink roles delete <id> Delete a roleOptions — roles create
Flag | Description |
| Human-readable description of the role |
Examples
anythink roles list
anythink roles create editor --description "Can edit content"
anythink roles delete 5 --yesapi-keys
Issue and manage API keys for non-interactive access (CI pipelines, scripts, integrations). Each key is scoped to a permission set, has an expiry, and is tied to the user that created it.
The raw key is shown once on creation and never retrievable — save it immediately or use --save-as to write it directly into a CLI profile.
anythink api-keys list List your API keys
anythink api-keys create <name> --permissions ... Create a new key
anythink api-keys revoke <id> Revoke a keyOptions — api-keys create
Flag | Description |
| Required. Comma-separated permission names, e.g. |
| Days until expiry (default: 90, max: 365) |
| Allow |
| Save the new key directly to a CLI profile instead of printing it |
| Print the response as JSON to stdout (the key is in this output — handle carefully) |
| Skip the confirmation prompt |
Output behaviour
By default, the success message goes to stdout and the raw key goes to stderr on its own line. This makes it easy to capture only the key:
anythink api-keys create ci-deploy --permissions data:read --yes 2> key.txtIf the server drops any of the requested permissions because the current user does not hold them, the CLI surfaces a loud warning so you do not end up with a quietly under-scoped key.
Examples
# Create a 90-day key for CI
anythink api-keys create github-actions --permissions "data:read,data:create" --yes 2> key.txt
# Create a key and save it directly into a profile (key never echoes)
anythink api-keys create scraper --permissions data:read --save-as scraper-bot --yes
anythink --profile scraper-bot data list posts
# Revoke a key
anythink api-keys revoke 42 --yesmenus
Manage dashboard sidebar menus in the active project. Menus control what entities appear in the Anythink dashboard and how they are grouped.
anythink menus list List all menus with tree structure
anythink menus get <menu_id> [--json] Show one menu (and its role) with its items and child items
anythink menus create <name> <role_id> Create a menu shown to a role
anythink menus update <menu_id> [--name <text>] [--role <id>]
Rename a menu or change its role
anythink menus delete <menu_id> [--yes] Delete a menu and all of its items
anythink menus add-item <menu_id> <entity> Add an entity to a dashboard menu
anythink menus update-item <menu_id> <item_id> [options] Change an item's name, icon, link or parent
anythink menus remove-item <menu_id> <item_id> [--yes] Remove an item, along with its child items
anythink menus reorder-items <menu_id> <item_ids> Set the order of items that share a parent
anythink menus reorder <menu_ids> Set the order of menusOptions — menus add-item
Flag | Description |
| Lucide icon name (e.g. |
| Display name (defaults to entity name, title-cased) |
| Parent menu item ID for nesting under a group |
Options — menus update-item (only the fields you pass change)
Flag | Description |
| New display name |
| New Lucide icon name |
| Point the item at an entity's page (instead of |
| Point the item at any path (instead of |
| Parent item ID to nest under; |
reorder-items and reorder take comma-separated IDs in the order you want them (301,299,300). The items you name take the first places within their group; items you leave out follow in their current order, and reorder-items needs all the items to share one parent. Locked items (the built-in ones) can't be changed, removed or moved; they keep their place, and the items between them reuse their own position numbers (they are only renumbered when two of them tie).
add-item and update-item --entity look the entity up first (system entities count), and stop only if it doesn't exist; if the lookup itself fails (for example, no permission), the item is saved and a warning says the entity couldn't be checked. Moving an item to a new parent with update-item --parent puts it last among its new siblings.
Removing an item also removes its direct child items. The command says so, and refuses when those children are locked or have items of their own.
A role is shown only its first menu, so create (and update --role) warns when the role already has one. delete removes the menu's locked built-in items with it, and says when the role is left with no menu.
Examples
# List all menus and their items
anythink menus list
# Show menu 250 with the item IDs you need for the commands below
anythink menus get 250
# Add "Check-ins" under the Profiles group (parent 168) in admin menu (250)
anythink menus add-item 250 check_ins --icon MessageCircle --parent 168
# Add a top-level menu item
anythink menus add-item 250 badges --icon Award
# Rename an item and give it another icon
anythink menus update-item 250 299 --name "Achievements" --icon Trophy
# Remove an item
anythink menus remove-item 250 299 --yes
# Put items 301, 299 and 300 first, in that order
anythink menus reorder-items 250 301,299,300charts
Build and manage the charts shown on dashboards in the active project. Every command takes --json, which prints a compact result with the ids the next step needs. In the MCP server each command is a tool of the same name (charts_create, charts_preview and so on).
anythink charts list [--entity <name>] List charts, newest first
anythink charts get <id> Show a chart's configuration
anythink charts create <name> [options] Create a chart
anythink charts update <id> [options] Change a chart; options you leave out keep their value
anythink charts delete <id> [--yes] Delete a chart
anythink charts preview [options] Show the data a configuration would draw, without saving it
anythink charts platform-metrics List the usage metrics a platform chart can plotOptions — charts create, charts update and charts preview
Flag | Description |
| Entity whose records the chart plots |
|
|
| Field for the x axis, or the slices of a pie |
| Bucket a date |
| Numeric field to aggregate (needed unless |
|
|
| Field that splits each bar or point into a second breakdown |
| Filter such as |
|
|
| Row limit, sort order and running total |
| A goal or warning level on a stat or gauge |
| Compare with the previous period |
| Where the data comes from. Platform charts use |
| Anything else, as a JSON object, e.g. |
|
|
A missing or unknown value is refused before anything is sent, with a message naming it. Check a chart with charts preview before charts create: it takes the same options and shows what the chart would draw.
Examples
# What would a pie of orders by status show?
anythink charts preview --entity orders --type pie --group-by status
# Save it, then a revenue chart with a filter
anythink charts create "Orders by status" --entity orders --type pie --group-by status
anythink charts create "UK revenue per month" --entity orders --type column --group-by created_at \
--interval month --measure total --agg sum --filter region:eq:uk --timeframe 365d
# A usage chart from the platform metrics
anythink charts create "Workflow runs" --source platform --platform-metric workflow_runs --type line
# Change one thing
anythink charts update 12 --timeframe 30ddashboards
Build and manage dashboards. A dashboard is a set of widgets (charts, lists, notes and so on) laid out on a 12-column grid. Every command takes --json.
anythink dashboards list List the dashboards you can see
anythink dashboards get <id> Show a dashboard with its widgets and their positions
anythink dashboards mine Show your landing dashboard, or the project default
anythink dashboards create <name> [options] Create a dashboard
anythink dashboards update <id> [options] Rename it, change who can see it, or replace its widgets and layout
anythink dashboards delete <id> [--yes] Delete a dashboard and its widgets (the charts are kept)
anythink dashboards add-chart <dashboard-id> <chart-id> Add a chart as a new widget
anythink dashboards remove-widget <dashboard-id> <widget-id> Remove a widget
anythink dashboards data <id> [--widget <id>] Show the data behind the widgets
anythink dashboards widget-preview --type <type> Show the data a widget would draw, without saving it
anythink dashboards set-home <id> Make it your landing dashboard
anythink dashboards promote-to-default <id> [--yes] Copy it over the project default (administrators only)add-chart and remove-widget read the dashboard, change only that widget, and write the rest back as it was.
Options
Command / flag | Description |
| Put a chart on the new dashboard. Repeat for several |
| Description, who can see or edit it, and whether it is your landing or the project default dashboard |
| Other settings as a JSON object: |
| The fields to change; the rest are left alone |
| Widget title (defaults to the chart's name) |
| Position and size on the grid (default width 4, height 3, placed below the existing widgets). Leave them all out and the dashboard places the widget itself |
| Only these widgets; most rows to show per widget (default 20) |
| Widget type ( |
Examples
# A dashboard with two charts already on it
anythink dashboards create Sales --chart 12 --chart 14
# Add a third, half the width of the grid
anythink dashboards add-chart 3 15 --width 6
# See what is on it, then take a widget off
anythink dashboards get 3
anythink dashboards remove-widget 3 41
# The numbers behind it
anythink dashboards data 3 --jsonsettings
View and change project settings in the active project, including the allowed application URLs that browsers may call the API from (CORS).
anythink settings get [--json] Show all project settings
anythink settings set <key> <value> [--yes] Set a single project setting
anythink settings cors list List allowed application URLs
anythink settings cors add <url> [--yes] Add an allowed origin
anythink settings cors remove <url> Remove an allowed originKeys — settings set
Key | Value |
| Text |
|
|
|
|
| Role ID for newly registered users |
|
|
| URL |
|
|
| Number of days |
|
|
| Text |
| Text |
Origins must be http/https with a host and optional port, with no path, query or fragment; a trailing / is stripped. A wildcard such as https://*.example.com is only safe on a domain you control, so wildcards under shared hosting domains (vercel.app, github.io, …) or a bare TLD are refused unless you pass --yes.
Some changes widen who can sign up: default_role_id pointing at an administrator role is refused unless you pass --yes, and allow_registrations true and require_email_confirmation false ask for confirmation (pass --yes when running non-interactively).
cors add and cors remove clear the project's CORS cache, so the change applies straight away. Matching is case-insensitive and adding a URL that is already present does nothing. Anythink's own domains and localhost are always allowed and don't need adding.
Examples
# Allow a deployed front end to call the API
anythink settings cors add https://my-app.vercel.app
# Allow every subdomain of a domain you own
anythink settings cors add "https://*.example.com"
# Remove an origin
anythink settings cors remove https://my-app.vercel.app
# Let users sign up on their own
anythink settings set allow_registrations trueintegrations
Manage integrations — both the catalog of available providers (Claude, OpenAI, Slack, Google, etc.) and the active connections that hold credentials for them.
anythink integrations list List available providers
anythink integrations get <provider> Show details and operations for one provider
anythink integrations connections list [--provider <p>] List your active connections
anythink integrations connect <provider> Create an API-key connection (Claude, OpenAI, etc.)
anythink integrations oauth status <provider> Show OAuth client setup status
anythink integrations oauth configure <provider> Set the OAuth client ID + secret
anythink integrations oauth connect <provider> Connect via the browser OAuth flow
anythink integrations test <connection-id> Test a connection
anythink integrations enable <connection-id> Enable a connection
anythink integrations disable <connection-id> Disable a connection
anythink integrations disconnect <connection-id> Delete a connection
anythink integrations execute <provider> <operation> Run an operation on a connected providerAPI-key providers — integrations connect
Flag | Description |
| API key for the provider. If omitted, you'll be prompted (input is hidden). |
| Friendly name for this connection (default: |
| Make this a user-scoped connection (only the current user sees it). Default: tenant-wide. |
OAuth providers — integrations oauth connect
The CLI starts a local HTTP listener on http://localhost:8745/callback, opens your browser to the provider's authorisation URL, and exchanges the returned code for a connection — no copy/paste of auth codes required.
Flag | Description |
| Friendly name for this connection |
| Make this a user-scoped connection |
| Local callback port (default: |
| Don't try to open the browser — just print the URL |
| How long to wait for the callback (default: |
OAuth credentials need to be set up once per provider before you can connect:
anythink integrations oauth configure slack # prompts for client_id + secret (hidden)
anythink integrations oauth connect slack --name mainRunning operations — integrations execute
Flag | Description |
| Input parameter as |
| All inputs as a JSON object. |
| Print the full JSON response (default: just the |
Examples
# Browse what's available
anythink integrations list
anythink integrations get claude
# API-key flow (Claude, OpenAI)
anythink integrations connect claude --name "main"
anythink integrations execute claude generate-text --input "prompt=Tell me a haiku"
# OAuth flow (Slack, Google, GitHub)
anythink integrations oauth configure slack
anythink integrations oauth connect slack --name main
# Manage connections
anythink integrations connections list
anythink integrations test <connection-id>
anythink integrations disable <connection-id>
anythink integrations disconnect <connection-id> --yespay
Manage AnythinkPay — Stripe Connect, Apple in-app purchases, payments, subscription plans, and live subscriptions.
anythink pay status Show Stripe Connect account status
anythink pay connect Set up a Stripe Connect account and start onboarding
anythink pay setup Guided setup: Stripe Connect, Apple IAP, and a first plan
anythink pay payments List recent payments
anythink pay methods List saved payment methods
anythink pay entitlement Show the current user's access / trial entitlement
anythink pay payment-options Show available payment providers for a platform/storefront
anythink pay trial status|enable|disable Manage the app engagement trial
anythink pay apple credentials set Set Apple IAP credentials (.p8 from a file)
anythink pay apple credentials show Show Apple IAP credentials (identifiers masked)
anythink pay apple credentials notification-url Print the URL to register in App Store Connect
anythink pay apple verify Verify an Apple transaction (testing)
anythink pay plans list|get|create|update|delete Manage subscription plans
anythink pay subscriptions list|get|events Inspect subscriptions and history
anythink pay subscriptions cancel|resume Standard lifecycle actions
anythink pay subscriptions delete|force-expire|relink|resync Admin recovery (project admin)
anythink pay offers list|get|create|update Manage promo and referral offers
anythink pay offers pause|activate Change an offer's status
anythink pay offers delete Permanently delete an offer, its codes and redemption records
anythink pay offers codes|add-code|redemptions Inspect and extend an offer
anythink pay offers user-code Look up a user's personal referral codeCommands that cancel, delete, expire, relink or pause (pay plans delete, pay subscriptions cancel|delete|force-expire|relink, pay offers pause|delete) ask for confirmation. Pass -y/--yes to skip the prompt; in a non-interactive shell they refuse to run without it.
pay plans update only changes the fields you pass: omitted flags keep the plan's current currency, interval, type and active state. Use --active or --inactive to change availability.
Options — pay payments
Flag | Description |
| Page number |
| Payments per page (default: 25) |
pay connect is interactive — it prompts for business type, country, and contact email, creates a Stripe Connect account, then opens the Stripe onboarding URL in your browser. pay setup chains Stripe Connect, Apple IAP credentials, and a first plan; each step is optional.
Subscription plans can carry an --apple-product-id (and optional --apple-subscription-group-id) so one plan covers both Stripe and Apple. pay apple credentials set reads the App Store Connect .p8 private key from a file and stores it encrypted — it is never printed or logged.
Required permissions
Command surface | Permission |
Plan / subscription reads, entitlement, payment-options |
|
Plan writes |
|
Payment reads/writes |
|
Apple credentials, admin recovery ( | project administrator |
Examples
anythink pay setup
anythink pay plans create --plan-name monthly --name Monthly --amount 9.99 --currency gbp --interval month --apple-product-id example_monthly
anythink pay apple credentials set --issuer-id <uuid> --key-id <id> --bundle-id com.example.app --private-key-file ./AuthKey.p8
anythink pay apple verify --signed-transaction <JWS>
anythink pay subscriptions events <subId>
anythink pay entitlementoauth
Configure OAuth social sign-in providers for the active project.
anythink oauth google status Show Google OAuth configuration status
anythink oauth google configure Set Google OAuth client ID and secretGoogle OAuth lets your project's users sign in with their Google account. You'll need a Google Cloud project with the OAuth 2.0 credentials created — see the Google Cloud Console.
Set the authorised redirect URI in your Google Cloud credentials to:
https://api.my.anythink.cloud/org/<your-org-id>/auth/v1/google/callbackExamples
anythink oauth google status
anythink oauth google configureapi
List all API endpoints available for the active project — both platform routes and the dynamically generated REST routes for your entities.
anythink api List all endpoints
anythink api --json Output as JSON (useful for AI tooling)docs
Print the full CLI reference.
anythink docs Print reference as markdown
anythink docs --json Print reference as JSON (for AI/tooling consumption)migrate
Copy the entity schema (entities + fields) from one project profile to another. Useful for promoting a schema from staging to production.
anythink migrate --from <profile> --to <profile>Options
Flag | Description |
| Source profile name (required) |
| Destination profile name (required) |
| Show what would be migrated without making changes |
Examples
anythink migrate --from my-app-staging --to my-app-prod
anythink migrate --from my-app-staging --to my-app-prod --dry-runplans
List available Anythink plans.
anythink plans List plans
anythink plans --json Output as JSONMCP server
The Anythink MCP server exposes the platform to AI assistants (Claude, Cursor, etc.) via the Model Context Protocol.
Install
No install needed — the recommended way is to run it on demand with npx:
npx -y @anythink-cloud/mcpPrefer a native binary on your PATH? Any of:
# Homebrew (bundled with the CLI — see Installation above)
brew install anythink-cloud/tap/anythink
# .NET global tool (requires the .NET 8 SDK)
dotnet tool install -g anythink-mcp
# Or download the anythink-mcp-<platform> binary from the Releases pageConfigure
For Claude Code, register it in one command:
claude mcp add anythink -- npx -y @anythink-cloud/mcpOr add it to your MCP client config manually (e.g. .mcp.json):
{
"mcpServers": {
"anythink": {
"command": "npx",
"args": ["-y", "@anythink-cloud/mcp"]
}
}
}To pin a profile, add it to args: ["-y", "@anythink-cloud/mcp", "--profile", "my-project"]
Works in any MCP client. Most use the same mcpServers JSON shown above — just add it to the client's config file:
Client | Config file |
Claude Code |
|
Claude Desktop |
|
Cursor |
|
VS Code |
|
Cline |
|
Windsurf |
|
A couple of clients use a different config shape:
mcpServers:
- name: anythink
command: npx
args:
- -y
- "@anythink-cloud/mcp"{
"context_servers": {
"anythink": {
"source": "custom",
"command": "npx",
"args": ["-y", "@anythink-cloud/mcp"]
}
}
}(Using a native binary instead of npx? Use "command": "anythink-mcp" with no args.)
Once connected, run the login tool, then accounts_use / projects_use to pick your working context.
Available tools
The MCP server provides dedicated tools for authentication, account/project management, and configuration — plus a generic cli tool that can run any CLI command:
Tool | Description |
| Create a new Anythink account |
| Log in with email and password |
| Store credentials directly (org ID + API key or JWT) |
| Remove a saved profile |
| List all profiles |
| Switch active profile |
| Remove a profile |
| List billing accounts |
| Create a billing account |
| Set the active billing account |
| List projects |
| Create a project |
| Connect to a project |
| Delete a project |
| Run any CLI command (entities, data, workflows, roles, etc.) |
The hosted MCP server (anythink-mcp --hosted) has no sign-in or profile tools. Its accounts_list, accounts_create, plans, projects_create and projects_delete tools run as the signed-in user and appear only when the user grants account access; see the MCP server docs.
Contributing
Prerequisites
An Anythink account (free tier works)
Setup
git clone https://github.com/anythink-cloud/anythink-cli
cd anythink-cli
dotnet buildRunning locally
dotnet run --project src/AnythinkCli.csproj -- --help
dotnet run --project src/AnythinkCli.csproj -- projects list
dotnet run --project src/AnythinkCli.csproj -- entities listReleases
Releases are automated via GitHub Actions. Push a version tag to trigger a build:
git tag v1.2.0
git push origin v1.2.0The workflow builds self-contained binaries for macOS (arm64, x64) and Linux (x64, arm64), computes SHA256 checksums, and publishes them as a GitHub release.
Project structure
anythink-cli/
├── src/ # CLI source
│ ├── Commands/ # Command implementations (signup, login, etc)
│ ├── Config/ # CliConfig.cs, Profile, ConfigService
│ ├── Models/ # ApiModels.cs, BillingModels.cs
│ ├── Client/ # HttpApiClient.cs, AnythinkClient.cs, BillingClient.cs
│ ├── Output/ # Renderer.cs (Spectre.Console helpers)
│ └── Program.cs # Application entry point & .env loader
├── mcp/ # MCP server source
│ ├── Tools/ # MCP tool implementations
│ ├── McpClientFactory.cs # Auth + client resolution
│ └── Program.cs # MCP server entry point
├── tests/ # CLI unit tests
├── mcp-tests/ # MCP unit tests
├── AnythinkCli.sln # Solution file
└── .gitignoreLicense
MIT — see LICENSE. This covers the Anythink CLI and MCP server source in this repository; it does not grant rights to the Anythink platform, APIs, or services, which are governed by separate terms at anythink.cloud.
Built with Spectre.Console · Powered by Anythink
Available Tools
175 toolsaccounts_createCreate a billing accountAInspect
Create a new billing account (organization) to hold projects and payment details. Requires a prior platform login (use the 'login' tool first). The new account is automatically set as the active account, so subsequent 'projects_create' / 'projects_list' calls target it without further setup. Returns the new account's id and name. Most users need only one account — call 'accounts_list' first to check whether a suitable one already exists.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Organization name, e.g. 'Acme Inc' — shown on invoices and in the dashboard | |
| Yes | Billing email address that receives invoices and receipts | ||
| currency | No | ISO currency for billing: 'gbp', 'usd', or 'eur'. Defaults to 'gbp'. Cannot be changed later. | gbp |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply destructiveHint=false and a title, so the description carries the real burden — and it does: it discloses the auth prerequisite, the non-obvious side effect that the new account becomes the active account (changing what projects_create/projects_list target), and the return payload. Creation is not idempotent-safe by implication, and the 'check first' warning covers the duplicate-account risk.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the action, followed by prerequisite, side effect, return value, and the routing hint. Every sentence carries information an agent needs and there is no filler or restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by stating what is returned (the new account's id and name). Combined with the login prerequisite and the active-account side effect, an agent has everything needed to call this correctly and sequence it properly.
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 name, email, and currency (including the immutable-after-creation constraint and default) are already fully documented. The description adds no parameter-level detail beyond that, which is the expected baseline when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new billing account (organization)') plus what the resource holds ('projects and payment details'). It is immediately distinguishable from siblings like accounts_list, accounts_use, and projects_create, which are all named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit preconditions ('Requires a prior platform login (use the login tool first)') and an explicit when-not/gate ('Most users need only one account — call accounts_list first to check whether a suitable one already exists'). Nothing about tool selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
accounts_listList billing accountsARead-onlyInspect
List the billing accounts (organizations) the logged-in user belongs to. Requires a prior platform login (use the 'login' tool first). Returns each account's id, organization name, billing email, currency, and status (Active/Suspended/Canceled), and flags which one is currently active. A billing account holds your projects and payment details — pick one with 'accounts_use' before creating or listing projects.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered, yet the description adds real value: an authentication prerequisite, the exact fields returned (id, organization name, billing email, currency, status), the Active/Suspended/Canceled enumeration, and which account is currently active. It stops short of stating side effects or pagination, but there are none expected for a zero-arg list tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with what is listed, then the auth prerequisite, then the downstream action. Every sentence carries distinct information with no restatement of the name or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by enumerating the returned fields and status values plus the 'currently active' flag. Combined with the auth prerequisite and sibling routing, nothing needed to call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so the baseline of 4 applies; the description correctly implies no filtering or input is required. There is no filter syntax or scoping option to explain.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (billing accounts/organizations), and disambiguates by clarifying parenthetically that accounts are organizations. It also situates itself among siblings by naming accounts_use as the follow-up action, so an agent can separate it from accounts_create without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit prerequisites ('Requires a prior platform login (use the login tool first)') and explicit next-step routing ('pick one with accounts_use before creating or listing projects'). Both when-to-use and the relevant alternative are stated, not implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
accounts_useSwitch the active billing accountAInspect
Set the active billing account that project commands operate on. Call this after 'login' when you belong to more than one account, before using 'projects_list', 'projects_create', or 'projects_use'. Accepts a full account UUID or a unique prefix; run 'accounts_list' to see valid ids. Returns the resolved account name and id, or an error if no account matches.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Billing account id — full UUID or a unique leading prefix. Get ids from 'accounts_list'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only destructiveHint=false in annotations, the description carries most of the load and does well: it discloses the accepted input forms, that it resolves to a name/id on success, and that a non-matching id yields an error. It stops short of stating auth requirements or whether the switch persists across sessions, so not a full 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?
Three tight sentences, front-loaded with the effect, followed by the sequencing guidance and the return behavior. No filler; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter switch tool with no output schema, the description covers effect, prerequisites, input forms, and success/failure outcomes. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single id parameter is fully documented in the schema, including the full-UUID-or-unique-prefix semantics and the accounts_list pointer. The description's mention of the same details adds little beyond what the schema already states, 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?
States a specific verb (Set) and resource (active billing account that project commands operate on), and positions itself clearly against siblings accounts_list and accounts_create. An agent can distinguish this from projects_use and config_use without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the precondition ('after login'), the condition ('when you belong to more than one account'), and the downstream tools that depend on it ('projects_list', 'projects_create', 'projects_use'). It also routes to accounts_list for id discovery, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apiApiARead-onlyInspect
List all API endpoints (platform + dynamically generated entity routes). Lists full URLs for a fixed set of core routes (auth, API keys, entities, fields, workflows), the five CRUD routes of every entity in the project plus public routes for public entities, and the route of each API-triggered workflow. Use it to give app developers endpoint URLs; to call one, use fetch. Returns JSON.
| Name | Required | Description | Default |
|---|---|---|---|
| base_url | No | Override base URL for this command |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=false), and the description adds meaningful context beyond them: the exact categories of routes returned and the return format ('Returns JSON'), which matters since no output schema exists. It does not mention auth needs, pagination, or ordering, but the annotated baseline keeps the bar reasonable.
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?
Purpose is front-loaded in the first sentence, followed by scope detail, usage, and return format. The middle enumeration is dense but each clause carries distinct scope information, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, read-only listing tool with a fully documented parameter and no output schema, the description covers what is listed, why to use it, the alternative for invocation, and the return format. Missing only minor operational details such as auth or pagination 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?
One parameter (`base_url`) with 100% schema description coverage, so the schema already documents it. The description adds no parameter-level information, which matches the baseline of 3 for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List all API endpoints') and elaborates its scope: platform core routes plus dynamically generated entity CRUD/public routes and workflow-triggered routes. It also distinguishes itself from the sibling `fetch`, so an agent can tell what this does versus calling an 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?
Gives a clear condition ('Use it to give app developers endpoint URLs') and names the alternative for a related need ('to call one, use `fetch`'). There is no explicit negative scope (e.g., when not to use it versus `docs`), so it stops short of the full when/when-not/alternatives bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
api_keys_createApi keys: createAInspect
Create an API key. The raw key is shown once and never retrievable. Creates a project API key with the named permissions (names from fetch on /permissions) that expires after 1 to 365 days, 90 by default. Permissions you don't hold yourself are dropped with a warning. The raw key appears only in this output, or goes straight into a CLI profile with save_as, so store it at once. Returns JSON.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name for the API key (e.g. "github-actions", "backup-script") | |
| save_as | No | Save the new key directly into a CLI profile instead of printing it | |
| expires_in | No | Days until the key expires (default: 90, max: 365 unless --no-expiry-cap) | |
| permissions | No | Comma-separated permission names, e.g. "data:read,data:create" | |
| no_expiry_cap | No | Allow --expires-in greater than 365 days (use sparingly) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Rich disclosure beyond the annotations: the raw key is shown once and never retrievable, expiry is 1–365 days (90 default), permissions the caller lacks are silently dropped with a warning, and the key lands only in the output or a CLI profile. These are the exact behavioral facts an agent needs and none are in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and generally tight. The 'shown once and never retrievable' / 'appears only in this output... store it at once' pairing is mildly redundant, and the trailing 'Returns JSON' adds little, but the paragraph earns its space overall.
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 carries return information and does so adequately, emphasizing that the raw key is delivered once in the output. Annotations cover the safety profile (non-readOnly, non-destructive). Minor gap: it doesn't describe the JSON shape returned, but the critical one-time-secret caveat is covered.
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% (baseline 3), and the description adds meaning on top: save_as diverts the raw key into a CLI profile, expires_in semantics/range, and that requested permissions fall back to what the caller actually holds. Slightly exceeds what the schema alone conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Create) and resource (API key / project API key) with concrete scope details: permissions, expiry, and where the raw key goes. An agent can distinguish this from api_keys_list and api_keys_revoke without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is largely implied by the create verb rather than stated. It hints at the save_as alternative ('goes straight into a CLI profile with save_as') and points to `fetch` on /permissions for valid names, but gives no explicit when-to-use/when-not guidance or comparison to sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
api_keys_listApi keys: listARead-onlyInspect
List API keys for the current user. Shows each key's id, name, number of permissions, expiry date and whether it is active, expired or revoked; key values are never returned. Use the id with api_keys_revoke.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is given. The description adds genuinely useful context beyond that: which fields are exposed, the status classification (active/expired/revoked), and the security-relevant guarantee that key values are never returned. Missing pagination/size behavior keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: purpose first, then the returned fields and the security note, then the cross-reference. Every clause earns its place 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?
With no parameters and no output schema, the description compensates by enumerating the returned fields and statuses, so an agent knows exactly what to expect from a call. Nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4 and there is nothing further the description could clarify about inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope ('List API keys for the current user'), clearly distinguishing it from siblings like api_keys_create and api_keys_revoke. An agent can identify it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent downstream: 'Use the id with `api_keys_revoke`', which names the consuming tool. It does not state when-not to use it or list other alternatives, so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
api_keys_revokeApi keys: revokeADestructiveInspect
Revoke an API key by ID. Revokes the key immediately and for good, so any script, CI job or CLI profile using it starts failing to authenticate. Create a replacement with api_keys_create first if something still needs access. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | API key ID to revoke. Find it with api_keys_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint annotation by spelling out irreversibility (immediately and for good), the concrete downstream consequence (scripts, CI jobs, CLI profiles failing to authenticate), and a user-confirmation requirement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the action and consequence, followed by the prerequisite and safety caution. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-param destructive mutation with a complete schema and annotations, the description covers safety, irreversibility, prerequisites, and consequences. No output schema needed and nothing an agent requires is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single param is fully documented there, including how to find the ID via api_keys_list. The description only restates 'by ID,' adding no meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (revoke) and resource (API key) with the identifying argument (by ID), and the `api_keys_revoke` name plus description clearly separate it from api_keys_create/list siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises creating a replacement with `api_keys_create` first if access is still needed and to check with the user before running. It provides strong preconditions and caution, though it does not enumerate when not to revoke (e.g., shared keys) beyond the general warning.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
charts_createCharts: createAInspect
Create a chart. Check it first with charts preview. Saves a chart that plots an entity's records, a platform usage metric (see charts_platform_metrics) or a plan quota. Settings are checked first and the call is refused with the problems listed. The new chart isn't shown anywhere until you put it on a dashboard with dashboards_add_chart or dashboards_create. Returns JSON.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End of a custom time window, e.g. 2026-03-31 | |
| agg | No | How to combine the --measure values: count (default), sum, avg, min or max | |
| from | No | Start of a custom time window, e.g. 2026-01-01 | |
| name | Yes | Chart name | |
| sort | No | Sort direction: asc or desc | |
| type | No | Chart type: column (bar chart), line, pie, area, stat, gauge or funnel | |
| limit | No | Most points or rows to plot | |
| config | No | Other chart settings as a JSON object, e.g. {"limit":10,"target":500} or funnelStages for a funnel. Typed options win over this. Setting names can be camelCase or snake_case | |
| entity | No | Entity whose records the chart plots (for an entity chart) | |
| filter | No | Filter as field:operator:value, e.g. status:eq:published. Operators: eq, ne, gt, gte, lt, lte, contains, in, exists, not_exists. Repeat for several fields. Replaces the chart's existing filters | |
| source | No | Where the data comes from: entity (default), platform (usage metrics) or quota (plan limits) | |
| target | No | Goal or warning level drawn on a stat or gauge | |
| compare | No | Compare with the previous period (true/false) | |
| measure | No | Numeric field to aggregate (needed unless --agg is count) | |
| group_by | No | Field for the x axis, or the slices of a pie. A date field is bucketed with --interval | |
| interval | No | Bucket size for a date --group-by: hour, day, week, month, quarter or year | |
| stack_by | No | Field that splits each bar or point into a second breakdown | |
| timeframe | No | Time window: all, 24h, 7d, 30d, 90d, 365d or custom | |
| cumulative | No | Plot a running total (true/false) | |
| target_mode | No | What --target means: goal or warning | |
| compare_days | No | How many days back the comparison period starts (defaults to the length of the time window) | |
| quota_metric | No | Plan limit for a quota chart: storage, files, users, workflows or emails | |
| compare_overlay | No | Draw the previous period over the current one (true/false) | |
| platform_metric | No | Usage metric for a platform chart. List them with: charts platform-metrics | |
| platform_period | No | Window for a platform metric: day, week, month, quarter or year |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation/read and safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false). The description adds valuable behavior beyond that: settings are validated and the call is refused with problems listed, and the chart stays invisible until attached to a dashboard. It doesn't detail permission requirements or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and then packs workflow, side-effect and return-format facts into a few tight sentences with no filler. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 25-parameter mutation tool with no output schema, the description covers the essential workflow, validation/refusal behavior, and the post-create visibility constraint. It notes 'Returns JSON' but the absence of an output schema leaves return shape largely unstated, a minor gap given the richness elsewhere.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the parameter docs are very detailed, so the schema carries the semantic load. The description adds no per-parameter meaning beyond what the schema already states, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create a chart') and immediately clarifies the three data sources it can plot (entity records, platform usage metric, plan quota), naming the relevant sibling charts_platform_metrics. An agent can distinguish it from charts_update/charts_preview without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit workflow guidance ('Check it first with charts preview') and names where the result must go next (dashboards_add_chart or dashboards_create). It stops short of stating when NOT to use it (e.g. editing an existing chart via charts_update), so it is strong but not fully exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
charts_deleteCharts: deleteADestructiveInspect
Delete a chart. Dashboards that show it keep an empty widget until you remove it. Permanently removes a saved chart from the project. To take a chart off one dashboard but keep it, use dashboards_remove_widget instead. After deleting, find the widgets that showed it with dashboards_get and clear them with dashboards_remove_widget. Returns JSON. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Chart ID. Find it with charts_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description adds concrete consequence detail beyond that: dangling empty widgets remain on dashboards, deletion is permanent, and it warns to check with the user first. It does not discuss auth requirements or reversibility beyond 'permanently,' which slightly caps the score.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, mostly informative, but the follow-up instruction ('find the widgets...clear them') is operational guidance rather than purpose-defining and somewhat pads the length. Front-loaded well with the core action first.
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, so the description notes it returns JSON, though not the shape. Covers the mutation, the side effect on dashboards, and the safety warning. Sufficient for an agent to call it correctly given annotations already flag destructiveness.
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%, giving a baseline of 3; the description adds the operational constraint that the chart ID is required but the schema already says that too. The description's 'find it with charts_list' is already in the schema's parameter description, so no extra value there, but the schema itself is complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Delete') and resource ('chart'), plus the permanent nature of the removal. Explicitly distinguishes itself from the more surgical dashboards_remove_widget by contrast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use and when-not-to-use: 'To take a chart off one dashboard but keep it, use dashboards_remove_widget instead.' Also prescribes a follow-up workflow (find dangling widgets via dashboards_get, clear with dashboards_remove_widget).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
charts_getCharts: getARead-onlyInspect
Get a chart's full configuration. Shows every setting of one saved chart: type, data source, entity or metric, grouping, measure and aggregation, filters, time window, target and comparison. Read it before charts_update; to see the data it draws, use dashboards_widget_preview with type chart and its id. Returns JSON.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Chart ID. Find it with charts_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, covering the safety profile. The description adds useful observability context by enumerating exactly which configuration fields are returned and noting the payload is JSON, which goes beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action, then the returned fields, then routing guidance. No filler; every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-param read tool with annotations covering safety and no output schema, the description compensates by listing the return contents and stating the format. Nothing an agent needs to call and interpret it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single `id` param is documented in the schema with a pointer to `charts_list`. The description adds no syntax, format, or constraint detail beyond what the schema already provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get a chart's full configuration') and enumerates the concrete settings returned (type, data source, entity/metric, grouping, measure/aggregation, filters, time window, target, comparison). It distinguishes itself from `charts_update` and `dashboards_widget_preview`, so an agent can route correctly without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('Read it before `charts_update`') and names the alternative for a different need ('to see the data it draws, use `dashboards_widget_preview` with type chart and its id'). Both the when and the alternative are stated outright.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
charts_listCharts: listARead-onlyInspect
List charts, newest first. Shows each saved chart's id, name, type, data source, the entity or metric it plots and when it last changed; pass entity to see only one entity's charts. A chart is saved on its own and appears on a dashboard only once added with dashboards_add_chart. Returns JSON.
| Name | Required | Description | Default |
|---|---|---|---|
| entity | No | Only charts that plot this entity |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful behavior: the newest-first sort order, the returned fields, and JSON output format.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then ordering, return shape, filter usage, and domain context. Well ordered; the trailing 'Returns JSON' is minor filler but not harmful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only list tool with no output schema, the description covers ordering, fields, filtering, and the chart/dashboard relationship. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the single `entity` parameter is already documented as 'Only charts that plot this entity'. The description's 'pass entity to see only one entity's charts' largely restates the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List charts') plus the ordering ('newest first') and enumerates the exact fields returned (id, name, type, data source, entity/metric, last changed). This clearly distinguishes it from siblings like charts_get, charts_create, and charts_delete.
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?
Explains that passing `entity` narrows results to one entity, and clarifies the chart/dashboard relationship ('appears on a dashboard only once added with dashboards_add_chart'). It stops short of explicitly contrasting this tool with charts_get, but the intended use is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
charts_platform_metricsCharts: platform metricsARead-onlyInspect
List the usage metrics a platform chart can plot. Shows each project usage metric a chart with source platform can plot: its id, label, shape, supported chart types and breakdowns. Pass a metric's id as platform_metric to charts_preview or charts_create, and one of its breakdowns as stack_by. Returns JSON.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=false), and the description adds useful context beyond them: it discloses the shape of each returned record and that the response is JSON. With no output schema present, describing return contents is genuinely valuable, though pagination/error behavior is not mentioned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core purpose and then the follow-up wiring. Slightly repetitive in restating 'usage metrics a platform chart can plot', but there is no filler and no buried information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, side-effect-free lookup with no output schema, the description covers what the agent needs: what is listed, what each entry contains, and how to consume the ids downstream. Annotations already carry the read-only safety story, so the remaining gap is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description still adds meaning by explaining how the returned ids map onto parameters of other tools (platform_metric for charts_preview/charts_create, stack_by for breakdowns), which helps the agent use the output correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (usage metrics a platform chart can plot), and enumerates exactly what each entry contains: id, label, shape, supported chart types and breakdowns. An agent can distinguish this discovery/lookup tool from siblings like charts_list, charts_get, charts_preview and charts_create without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description names the concrete alternatives and the workflow: 'Pass a metric's id as platform_metric to charts_preview or charts_create, and one of its breakdowns as stack_by.' That is strong context for when this tool is the right entry point. It stops short of an explicit when-not-to-use or ordering statement, so a 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
charts_previewCharts: previewARead-onlyInspect
Show the data a chart configuration would draw, without saving it. Runs a chart configuration against the project's current data and shows the points, totals or rows it would plot, trimmed to rows. Use it to settle entity, grouping, measure and filters before charts_create or charts_update; for a chart already saved, use dashboards_widget_preview. Returns JSON.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End of a custom time window, e.g. 2026-03-31 | |
| agg | No | How to combine the --measure values: count (default), sum, avg, min or max | |
| from | No | Start of a custom time window, e.g. 2026-01-01 | |
| rows | No | Most rows or points to show (default 50) | |
| sort | No | Sort direction: asc or desc | |
| type | No | Chart type: column (bar chart), line, pie, area, stat, gauge or funnel | |
| limit | No | Most points or rows to plot | |
| config | No | Other chart settings as a JSON object, e.g. {"limit":10,"target":500} or funnelStages for a funnel. Typed options win over this. Setting names can be camelCase or snake_case | |
| entity | No | Entity whose records the chart plots (for an entity chart) | |
| filter | No | Filter as field:operator:value, e.g. status:eq:published. Operators: eq, ne, gt, gte, lt, lte, contains, in, exists, not_exists. Repeat for several fields. Replaces the chart's existing filters | |
| source | No | Where the data comes from: entity (default), platform (usage metrics) or quota (plan limits) | |
| target | No | Goal or warning level drawn on a stat or gauge | |
| compare | No | Compare with the previous period (true/false) | |
| measure | No | Numeric field to aggregate (needed unless --agg is count) | |
| group_by | No | Field for the x axis, or the slices of a pie. A date field is bucketed with --interval | |
| interval | No | Bucket size for a date --group-by: hour, day, week, month, quarter or year | |
| stack_by | No | Field that splits each bar or point into a second breakdown | |
| timeframe | No | Time window: all, 24h, 7d, 30d, 90d, 365d or custom | |
| cumulative | No | Plot a running total (true/false) | |
| target_mode | No | What --target means: goal or warning | |
| compare_days | No | How many days back the comparison period starts (defaults to the length of the time window) | |
| quota_metric | No | Plan limit for a quota chart: storage, files, users, workflows or emails | |
| compare_overlay | No | Draw the previous period over the current one (true/false) | |
| platform_metric | No | Usage metric for a platform chart. List them with: charts platform-metrics | |
| platform_period | No | Window for a platform metric: day, week, month, quarter or year |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=false). The description adds real value beyond them: it clarifies that nothing is saved, that it runs against the project's current data, that output is trimmed to rows, and that it returns JSON. It does not mention auth/permission needs or rate limits, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core purpose, then usage, then return format. No filler; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 25-param, no-required preview tool with no output schema, the description covers purpose, when to use, and a rough return shape ('points, totals or rows', 'Returns JSON'). It is complete enough to call correctly, though it could say more about the returned structure since no output schema exists.
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% across all 25 parameters, so the schema already docs each option in detail. The description reinforces key concepts (entity, grouping, measure, filters, row trimming) but adds no syntax or format detail beyond the schema. Baseline 3 is correct when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: preview the data a chart configuration would draw without saving. It explicitly names what it produces (points, totals, rows) and distinguishes itself from `charts_create`, `charts_update`, and `dashboards_widget_preview`, so an agent can select it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use: settle entity, grouping, measure and filters before create/update. Also names the alternative for the already-saved case (`dashboards_widget_preview`). Both the positive condition and the routing alternative are spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
charts_updateCharts: updateADestructiveInspect
Change a chart. Only the settings you pass change; the rest stay as they were. Saves new settings on an existing chart; a filter replaces all of its existing filters. Dashboard widgets point at the chart rather than copying it, so every dashboard showing it draws the new version. Use charts_get first to see its current settings. Returns JSON. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Chart ID. Find it with charts_list. | |
| to | No | End of a custom time window, e.g. 2026-03-31 | |
| agg | No | How to combine the --measure values: count (default), sum, avg, min or max | |
| from | No | Start of a custom time window, e.g. 2026-01-01 | |
| name | No | New chart name | |
| sort | No | Sort direction: asc or desc | |
| type | No | Chart type: column (bar chart), line, pie, area, stat, gauge or funnel | |
| limit | No | Most points or rows to plot | |
| config | No | Other chart settings as a JSON object, e.g. {"limit":10,"target":500} or funnelStages for a funnel. Typed options win over this. Setting names can be camelCase or snake_case | |
| entity | No | Entity whose records the chart plots (for an entity chart) | |
| filter | No | Filter as field:operator:value, e.g. status:eq:published. Operators: eq, ne, gt, gte, lt, lte, contains, in, exists, not_exists. Repeat for several fields. Replaces the chart's existing filters | |
| source | No | Where the data comes from: entity (default), platform (usage metrics) or quota (plan limits) | |
| target | No | Goal or warning level drawn on a stat or gauge | |
| compare | No | Compare with the previous period (true/false) | |
| measure | No | Numeric field to aggregate (needed unless --agg is count) | |
| group_by | No | Field for the x axis, or the slices of a pie. A date field is bucketed with --interval | |
| interval | No | Bucket size for a date --group-by: hour, day, week, month, quarter or year | |
| stack_by | No | Field that splits each bar or point into a second breakdown | |
| timeframe | No | Time window: all, 24h, 7d, 30d, 90d, 365d or custom | |
| cumulative | No | Plot a running total (true/false) | |
| target_mode | No | What --target means: goal or warning | |
| compare_days | No | How many days back the comparison period starts (defaults to the length of the time window) | |
| quota_metric | No | Plan limit for a quota chart: storage, files, users, workflows or emails | |
| compare_overlay | No | Draw the previous period over the current one (true/false) | |
| platform_metric | No | Usage metric for a platform chart. List them with: charts platform-metrics | |
| platform_period | No | Window for a platform metric: day, week, month, quarter or year |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds behavioral detail well beyond the annotations: partial-update semantics (unpassed settings persist), the destructive-replace behavior of `filter`, and the non-obvious propagation that dashboard widgets reference the chart rather than copy it, so every dashboard redraws. It also reinforces the user-confirmation requirement consistent with destructiveHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose and keeps each sentence short and on-task, with the safety caution last where it belongs. Mild redundancy between 'Only the settings you pass change' and 'Saves new settings on an existing chart', plus a low-value 'Returns JSON.' line, keep it from a 5.
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 26-parameter mutation with no output schema, the description covers the essentials: partial-update behavior, filter replacement, propagation side effects, prerequisite read, and confirmation. The only weak spot is the vague 'Returns JSON.' in place of any return-shape hint, though the absence of an output schema makes this a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% across all 26 parameters, so the schema already carries the parameter documentation and the baseline is 3. The description adds only the filter-replacement rule, which is also stated in the schema, so there is no meaningful extra parameter insight.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Change a chart') and immediately qualifies it as a partial update against an existing chart, which separates it from charts_create. It also names charts_get as the read-side sibling to consult first, so an agent can route correctly without opening other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete pre-call guidance ('Use charts_get first to see its current settings') and a confirmation rule ('check with the user before running it'). It doesn't explicitly state when NOT to use it (e.g., to create a chart, use charts_create), but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cliRun an Anythink CLI commandADestructiveInspect
Run any Anythink CLI command and return its output. Prefer the dedicated tools; use this for anything they don't cover. Pass the command exactly as you would after 'anythink', e.g. 'entities list' or 'data list posts'. Destructive pay commands (delete, expire, relink, pause and similar) must be run by a person in a terminal; never add '--yes' on their behalf. 'data import' creates records (not destructive): run it with --dry-run first and only add '--yes' after the user approves the dry run. 'import directus' changes the project: run it with '--dry-run' first and only add '--yes' once the user has approved the plan. Add '--json' where supported for machine-readable output.
| Name | Required | Description | Default |
|---|---|---|---|
| command | Yes | CLI arguments after 'anythink', e.g. 'entities list', 'users me', 'data list blog_posts --json', 'migrate --from a --to b --dry-run', 'fetch /some/path'. Do NOT include 'anythink' itself or '--profile' (profile is injected automatically). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag openWorldHint and destructiveHint; the description goes far beyond that by naming the destructive command families (delete, expire, relink, pause), forbidding '--yes' on the user's behalf, mandating human execution of destructive pay commands, and prescribing dry-run-first workflows for import commands. No contradiction with the destructiveHint annotation—it explains it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose and the fallback routing before the command syntax and safety rules. Dense but every sentence carries a distinct constraint for a broad escape-hatch tool; minor redundancy with the schema's example list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an open-ended catch-all tool with no output schema, this covers what an agent must know: what it is, when to prefer siblings, exact argument format, and the safety/dry-run obligations for destructive and project-mutating subcommands.
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 the schema already documents the single command parameter, including the 'do not include anythink or --profile' rule. The description largely restates that with different examples, adding only the --json hint, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Run any Anythink CLI command and return its output') and immediately positions itself against the many dedicated siblings by declaring itself the fallback ('Prefer the dedicated tools; use this for anything they don't cover'). Concrete examples ('entities list', 'data list posts') make the intent 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?
Explicitly says when to use it (anything the dedicated tools don't cover) and when not to (prefer dedicated tools). Adds further conditional guidance: which destructive commands a human must run, and the --dry-run-then-approve protocol for 'data import' and 'import directus'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
config_removeRemove a saved project profileADestructiveInspect
Delete a saved project profile from the local CLI configuration. Removes only the locally stored credentials and settings — it does not delete the project or revoke tokens server-side (to remove the project itself, use 'projects_delete'). Run 'config_show' to see profile names. Returns confirmation, or a not-found message.
| Name | Required | Description | Default |
|---|---|---|---|
| profile | Yes | Name of the profile to remove from local config. See 'config_show' for valid names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply destructiveHint=true, but the description adds the crucial semantic that destruction is scoped to local credentials/settings and that no server-side revocation occurs — a distinction an agent could easily get wrong. It also discloses the outcome shape ('confirmation, or a not-found message').
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each doing distinct work: scope of deletion, boundary/exclusion with alternative, and return behavior plus name discovery. The core action is front-loaded with 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?
No output schema exists, yet the description covers the return contract ('confirmation, or a not-found message'), the local-vs-server scope, and how to find valid inputs. Nothing an agent needs to invoke this safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single 'profile' parameter, so the schema already documents name and source of valid values. The description's 'Run config_show to see profile names' reinforces this but adds nothing the schema doesn't already state; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: 'Delete a saved project profile from the local CLI configuration.' The qualifier 'from the local CLI configuration' immediately distinguishes it from the similarly named sibling 'projects_delete', which the description also explicitly names.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-not clause ('it does not delete the project or revoke tokens server-side') with the correct alternative named ('to remove the project itself, use projects_delete'). It also routes the agent to 'config_show' to discover valid profile names, covering the pre-call lookup step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
config_showShow saved profilesARead-onlyInspect
Show the local CLI configuration: all saved project profiles and platform logins, and which of each is active. For every profile it returns the name, org id, auth method (api-key or token), alias, and platform; for every platform it returns the URLs, billing account, and login status. Use this to discover profile names for 'config_use', 'config_remove', or 'logout', and to check which project the 'cli' tool currently targets. Reads local config only — makes no network calls.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations declare readOnlyHint=true, but the description adds the important behavioral fact that it 'Reads local config only — makes no network calls,' which is beyond what annotations provide. It doesn't cover error states or edge cases (e.g., no config file), keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the main purpose and then details the return payload; it is two dense sentences with no fluff, though the second sentence is long.
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 zero parameters, the description fully specifies what is returned (profile fields and platform details) and its side-effect-free local nature, leaving no gaps for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description correctly implies no input is needed, and the schema coverage is 100%.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Show the local CLI configuration: all saved project profiles and platform logins') and drills into exact returned fields, making its purpose unmistakable against siblings like config_use or config_remove.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly names the alternatives it feeds into ('discover profile names for config_use, config_remove, or logout') and its diagnostic use case ('check which project the cli tool currently targets'), providing clear when-to-use context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
config_useSwitch the active project profileAInspect
Switch the active project profile that the 'cli' tool's commands operate against. Use this to move between already-connected projects without re-authenticating. The profile must already exist (created by 'projects_use' or 'login_direct'); run 'config_show' to see available profile names. Returns confirmation, or an error if the profile does not exist.
| Name | Required | Description | Default |
|---|---|---|---|
| profile | Yes | Name of an existing profile to make active. See 'config_show' for valid names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=false, so the description carries most of the burden and does well: it discloses the state-mutating effect (which profile the cli operates against), the prerequisite that the profile pre-exist, and the error condition when it doesn't. It stops short of describing persistence or side effects on in-flight sessions, so not a full 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?
Three sentences, front-loaded with the action, then usage rationale, then prerequisites and return behavior. Every sentence earns its place with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, non-destructive mutation with no output schema, the description covers prerequisites, alternatives, and return behavior ('confirmation, or an error'). Complete enough for correct invocation; only marginal behavioral detail is absent.
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 the schema already documents the 'profile' parameter including the 'See config_show for valid names' pointer. The description restates the existence constraint without adding format or syntax detail, 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?
States a specific verb+resource ('Switch the active project profile') and goes further by naming the exact consumer ('the cli tool's commands operate against'). This distinguishes it from sibling config tools like config_show and config_remove without the agent needing to open any 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?
Explicitly states when to use it ('move between already-connected projects without re-authenticating'), states the prerequisite ('profile must already exist'), names the creating alternatives ('projects_use' or 'login_direct'), and routes to config_show for valid names. Both usage context and alternatives are fully covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dashboards_add_chartDashboards: add chartAInspect
Add a chart to a dashboard as a new widget. Everything else on the dashboard stays as it was. This is how a saved chart gets onto a dashboard. The widget takes the chart's name as its title unless title is given, and goes after the existing widgets unless column, row, width or height place it on the 12-column grid. Create the chart first with charts_create; avoid dashboards_update for this, as it replaces every widget. Returns JSON.
| Name | Required | Description | Default |
|---|---|---|---|
| row | No | Top edge, in grid rows from 0 (defaults to below the existing widgets) | |
| title | No | Widget title (defaults to the chart's name) | |
| width | No | Width in grid columns (default 4) | |
| column | No | Left edge, in grid columns from 0 (the grid is 12 columns wide) | |
| height | No | Height in grid rows (default 3) | |
| chart_id | Yes | Chart ID. Find it with charts_list. | |
| dashboard_id | Yes | Dashboard ID. Find it with dashboards_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the safety profile is covered. The description adds real behavioral context beyond them: non-destructive semantics ('Everything else on the dashboard stays as it was') and default behaviors for title and widget placement. Only the return value is thin ('Returns JSON'), which limits it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the core action, then defaults, then the routing guidance. No filler; each sentence adds a distinct, useful fact.
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 non-destructive additive mutation with full annotations and no output schema, the definition covers action, non-destructiveness, defaults, prerequisites, and the sibling to avoid. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds interpretation beyond the per-parameter schema: it explains that title defaults to the chart's name and that position/placement is governed collectively by column, row, width and height on a 12-column grid, and defaults to after existing widgets when none are given. This exceeds what each isolated schema entry conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add a chart to a dashboard as a new widget') and immediately distinguishes itself from siblings by naming `charts_create` (prerequisite) and `dashboards_update` (the wrong tool, since it replaces every widget). An agent can tell it apart from other dashboard tools without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('This is how a saved chart gets onto a dashboard'), an ordering prerequisite ('Create the chart first with `charts_create`'), and an explicit when-not-to-use with reason ('avoid `dashboards_update` for this, as it replaces every widget'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dashboards_createDashboards: createAInspect
Create a dashboard, optionally with charts already on it. Makes a new dashboard owned by you, visible only to you unless shared is set. Each chart id passed becomes a chart widget titled with the chart's name; add more later with dashboards_add_chart. Build the charts first with charts_create. Making it the project default needs an administrator. Returns JSON.
| Name | Required | Description | Default |
|---|---|---|---|
| home | No | Make it your landing dashboard | |
| name | Yes | Dashboard name | |
| chart | No | Chart to put on the dashboard. Repeat for several | |
| config | No | Other settings as a JSON object: widgets (each with type, title and config_json) and layout_json. Typed options win over this | |
| shared | No | Let everyone in the project see this dashboard | |
| default | No | Make it the project's default dashboard, the one new users start from (administrators only) | |
| description | No | What the dashboard is for | |
| allow_shared_edit | No | Let everyone who can see it edit it (needs --shared) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations' safety profile, it discloses the ownership model ('owned by you'), the visibility semantics ('visible only to you unless shared is set'), the auth gate on default ('administrators only'), the chart-id-to-widget mapping behavior, and that it returns JSON. This is substantive context annotations alone would not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Six short clauses, front-loaded with the core action, then ownership/visibility, then routing, then the admin caveat. Every sentence carries distinct information with no repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 8 params, full schema coverage and safety annotations, the description covers the meaningful gaps: prerequisites, ownership, sharing, and admin gating. The return value is only 'Returns JSON' with no output schema, a minor gap, but not one that would cause an incorrect call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds real meaning beyond the schema: it explains that each chart id becomes a widget titled with the chart's name, and clarifies the shared/default interplay. It stops short of detailing the config JSON structure, which the schema already summarizes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create a dashboard') and immediately adds scope ('optionally with charts already on it'), which distinguishes it from dashboards_update and dashboards_add_chart. An agent can tell what this does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Routes explicitly to alternatives with conditions: 'add more later with dashboards_add_chart' and 'Build the charts first with charts_create'. It also flags the prerequisite for the default flag ('needs an administrator'), leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dashboards_dataDashboards: dataARead-onlyInspect
Get the data behind a dashboard's widgets. Runs a saved dashboard's widgets, or only the widget ids passed, and shows each one's id, title, type and current data, trimmed to rows per widget. Use it to read what a dashboard shows now; use dashboards_widget_preview to try a widget that isn't on a dashboard yet. Returns JSON.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Dashboard ID. Find it with dashboards_list. | |
| rows | No | Most rows or points to show per widget (default 20) | |
| widget | No | Only this widget's data. Repeat for several; leave out for every widget |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuine behavioral context: it runs widgets, returns each widget's id/title/type/current data, and trims output to rows per widget. It could still note cost/latency of running all widgets, but this is solid added value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences with zero filler, moving from purpose to mechanism to routing to return format. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a read-only tool: all parameters are schema-documented, the alternative is named, and the return shape is described even though no output schema exists. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (id, rows, widget) are already documented in the schema. The description restates widget filtering and row trimming but adds no syntax or defaults beyond what the schema provides, 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?
States a specific verb and resource: gets the data behind a dashboard's widgets by running them and showing id, title, type and data. It clearly distinguishes itself from dashboards_widget_preview by scope (saved dashboard vs. unattached widget).
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 it ('read what a dashboard shows now') and names the alternative ('use dashboards_widget_preview to try a widget that isn't on a dashboard yet'). The selection condition is fully specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dashboards_deleteDashboards: deleteADestructiveInspect
Delete a dashboard and its widgets. The charts on it are kept. Removes the dashboard for everyone who can see it. To take one chart off a dashboard, use dashboards_remove_widget; to delete a chart itself, use charts_delete. If it was your home dashboard, dashboards_mine falls back to the project default. Returns JSON. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Dashboard ID. Find it with dashboards_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, and the description adds real behavioral context beyond that: widgets are destroyed but charts are preserved, the removal affects everyone who can see it, and a deleted home dashboard falls back to the project default. This is exactly the impact detail an agent needs before a destructive call.
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?
Impact and routing information is front-loaded in tight sentences, with the destructive warning last where it belongs. 'Returns JSON' is low-value filler that keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive tool with no output schema, the description covers blast radius, sibling routing, and the home-dashboard edge case. The only thin spot is the vague 'Returns JSON' in place of any return-value detail, which is minor given no output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single id parameter and schema coverage is 100%, with the schema itself pointing to dashboards_list for discovery. The description adds no syntax or format detail for id, so the baseline 3 for a fully documented schema 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?
States a specific verb and resource ('Delete a dashboard') and immediately clarifies scope with 'and its widgets. The charts on it are kept.' An agent can distinguish this from charts_delete and dashboards_remove_widget without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternatives and the conditions that select them: use dashboards_remove_widget to take one chart off, charts_delete to delete a chart itself. It also states the correct precondition ('check with the user before running it') for a destructive operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dashboards_getDashboards: getARead-onlyInspect
Get a dashboard with its widgets and their positions. Shows a dashboard's name, description, sharing settings, owner and each widget's id, type, title, the chart it shows and its grid position. Use it to find widget ids for dashboards_remove_widget and dashboards_data, and to see the current widgets before dashboards_update. Returns JSON.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Dashboard ID. Find it with dashboards_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuinely useful behavior beyond that — it enumerates the returned fields (name, description, sharing settings, owner, per-widget id/type/title/chart/grid position) and states the format is JSON, which matters given there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then return contents, then usage routing. Dense but every clause carries information; the field enumeration is slightly long but justified by the absence of an output schema.
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 tool with no output schema, the description compensates by describing the return payload in detail and routing to consuming siblings. Nothing an agent needs to call and interpret it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single `id` param already documents itself ('Find it with dashboards_list'). The description adds no syntax or format detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource (get a dashboard) with scope explicit — 'with its widgets and their positions' — which distinguishes it from dashboards_list and dashboards_mine without opening either schema. An agent can tell exactly what it retrieves.
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 names two downstream siblings that consume widget ids (`dashboards_remove_widget`, `dashboards_data`) and the pre-update read pattern for `dashboards_update`. This is textbook when-to-use guidance tied to concrete alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dashboards_listDashboards: listARead-onlyInspect
List the dashboards you can see. Shows each dashboard's id, name, owner and whether it is your home, the project default or shared. A dashboard is a grid of widgets, most of them showing a saved chart; open one with dashboards_get to see its widgets, or dashboards_mine for the one you land on. Returns JSON.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds useful context beyond that: the exact attribute set returned, the home/default/shared classification, and that the payload is JSON. It does not mention pagination or result-size behavior, which is the only notable gap for a list tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the action and return fields, with the routing guidance last. The middle sentence defining a dashboard as 'a grid of widgets' is mildly tangential but earns its place by making the relationship to dashboards_get concrete; overall tightly written with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only list tool with no output schema, the description covers the essentials: what is listed, what fields come back, and which sibling to use next. Minor omissions such as pagination or ordering prevent a 5, but an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4. There is no parameter syntax or format for the description to clarify, and the text correctly does not invent any.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the dashboards you can see') and immediately enumerates the returned attributes (id, name, owner, home/default/shared). It also names the sibling tools it is not (dashboards_get, dashboards_mine), so an agent can distinguish it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use dashboards_get to inspect a dashboard's widgets and dashboards_mine for the one you land on. The when-to-use-this vs. alternatives decision is fully spelled out rather than implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dashboards_mineDashboards: mineARead-onlyInspect
Get your landing dashboard, or the project default if you have none. Shows the same detail as dashboards_get for the dashboard you see first when you open the project. Use it when you don't have a dashboard id; change which dashboard you land on with dashboards_set_home. Returns JSON.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful behavior: the fallback to the project default when the user has no dashboard, and the return format ('Returns JSON'). It does not describe pagination or error cases, but for a parameterless read tool that is a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences, with the core purpose first and usage/return notes after. Slight redundancy between 'landing dashboard' and 'the dashboard you see first when you open the project,' but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only tool with no output schema, the description covers purpose, fallback behavior, usage condition, sibling relationship, and return format. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline of 4 applies. The description correctly implies a parameterless call by advising use 'when you don't have a dashboard id,' requiring no further argument documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get your landing dashboard, or the project default if you have none') and clarifies scope by likening the detail level to `dashboards_get`. An agent can distinguish this from dashboards_get and dashboards_list without opening another 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?
Provides an explicit selection condition ('Use it when you don't have a dashboard id') and names the sibling that governs the alternative behavior ('change which dashboard you land on with `dashboards_set_home`'). Nothing about when to pick this over its siblings is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dashboards_promote_to_defaultDashboards: promote to defaultADestructiveInspect
Copy a dashboard over the project default that new users start from (administrators only). Overwrites the project default dashboard with a copy of this one. The default is what new users start from and what anyone without a home dashboard lands on; the dashboard you copy from stays as it was. To change only your own landing dashboard, use dashboards_set_home. Returns JSON. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Dashboard ID. Find it with dashboards_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, and the description goes well beyond them: it explains exactly what is overwritten (the project default), what is preserved (the source dashboard), who is affected (new users and anyone without a home dashboard), the admin requirement, and that it needs user confirmation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and constraint, and every sentence carries operational weight. The clause explaining what the default is slightly restates the opening sentence, a minor redundancy in an otherwise tight four-sentence definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive admin tool with no output schema, the description covers everything an agent needs: effect, scope, side effects, permissions, confirmation guidance, and the sibling alternative. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already tells the agent the id is a dashboard ID discoverable via dashboards_list. The description only implicitly clarifies that the id refers to the source dashboard being copied rather than the target, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (copy a dashboard onto the project default) plus scope (new users' starting dashboard) and an access gate (administrators only). It is unmistakably distinct from siblings like dashboards_set_home, dashboards_update, and dashboards_create.
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 names the alternative for a closely related goal: 'To change only your own landing dashboard, use dashboards_set_home.' It also states the admin-only prerequisite and warns to confirm with the user before running, so both when-to-use and when-to-avoid are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dashboards_remove_widgetDashboards: remove widgetADestructiveInspect
Remove a widget from a dashboard. Everything else on the dashboard stays as it was. Takes the widget off the dashboard and out of its layout; the chart it showed is kept and can be added back with dashboards_add_chart. Get widget ids from dashboards_get. Use charts_delete only to remove the chart from the project entirely. Returns JSON. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| widget_id | Yes | Widget ID (from dashboards get) | |
| dashboard_id | Yes | Dashboard ID. Find it with dashboards_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag destructiveHint=true generically; the description sharpens the blast radius by stating that 'everything else on the dashboard stays as it was' and that the underlying chart 'is kept and can be added back'. That non-destructive-to-the-chart nuance is the exact behavioral detail an agent needs and cannot derive from the hints alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then scope, then alternatives, then the safety warning — a good ordering. 'Returns JSON' is low-value filler that repeats what is implied and slightly dilutes an otherwise tight passage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-required-parameter mutation with no output schema, the description covers action, preservation semantics, id sourcing, alternative tools, and a user-confirmation caveat. No output schema exists, so it needn't describe return values, and nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are already documented in-schema. The description's 'Get widget ids from `dashboards_get`' adds a mild pointer to where ids come from, but otherwise the schema carries the parameter semantics — 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 first sentence names a specific verb and resource ('Remove a widget from a dashboard'), and the body distinguishes this from adjacent operations by naming `dashboards_add_chart` (re-add) and `charts_delete` (delete the chart entirely). An agent can pick this tool over its siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit routing: use this to detach a widget, use `charts_delete` 'only to remove the chart from the project entirely', and use `dashboards_get` to source ids. It even states a prerequisite workflow (confirm with the user before running) — nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dashboards_set_homeDashboards: set homeADestructiveInspect
Make a dashboard of yours your landing dashboard. Changes only your own landing dashboard, replacing your previous home; other users are unaffected. Check the result with dashboards_mine. To change what new users start from, use dashboards_promote_to_default. Returns JSON. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Dashboard ID. Find it with dashboards_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag the destructive mutation. The description adds crucial context: it replaces your previous home, affects only your own landing dashboard, leaves other users unaffected, and recommends confirming with the user. This scope-of-effect detail goes beyond the annotations and is exactly the kind of behavioral context needed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose in the first sentence and follows with scoping, alternatives, and a safety note. The sentence 'Returns JSON' is minor filler, but overall structure is efficient with no major 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 is destructive (annotations cover this), takes one fully-described parameter, and has no output schema, the description supplies all additional information an agent needs: exact effect, user-scope, alternatives, and a confirmation warning.
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 the sole parameter 'id' fully documented in the schema, including where to find it. The description does not add anything beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: making one of your dashboards your landing dashboard. It explicitly distinguishes from siblings by naming dashboards_promote_to_default for changing the default new users start from.
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, including the alternative tool for a different use case (dashboards_promote_to_default) and a validation step via dashboards_mine. Also advises checking with the user before running due to its destructive nature.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dashboards_updateDashboards: updateADestructiveInspect
Rename a dashboard, change who can see it, or replace its widgets and layout. Changes a dashboard's name, description or sharing, or replaces its whole widget list and layout through config; widgets missing from a new list are removed. To add or remove one chart, use dashboards_add_chart or dashboards_remove_widget, which keep everything else. Only the owner can change sharing. Returns JSON. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Dashboard ID. Find it with dashboards_list. | |
| name | No | New dashboard name | |
| config | No | Other changes as a JSON object. widgets replaces the whole widget list, so include every widget to keep (with its id); layout is a list of {widget_id, x, y, w, h} | |
| shared | No | Let everyone in the project see it (true/false). Only its owner can change this | |
| description | No | New description | |
| allow_shared_edit | No | Let everyone who can see it edit it (true/false). Only its owner can change this |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, but the description adds non-obvious details beyond them: widgets absent from a new list are removed, only the owner can change sharing, and the response is JSON. It stops short of describing permissions needed for other fields or how partial updates interact with untouched fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded: the capability and the destructive consequence come first, then alternatives, then the confirmation warning. The first sentence and the following 'Changes a dashboard's name, description or sharing...' clause partially restate each other, a mild redundancy in an otherwise efficient block.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation tool with no output schema, the description supplies the safety-warning, ownership constraint, alternative routing, and the replace-vs-add semantics. With annotations and full schema coverage in place, nothing material for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents each parameter; baseline is 3. The description adds consequence-level meaning for `config` (whole-list replacement and silent removal of omitted widgets) and the owner-only restriction on sharing, which helps an agent reason about the call rather than just the syntax.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with specific verbs and resource: rename a dashboard, change its visibility, or replace its widgets and layout. It also explicitly distinguishes itself from dashboards_add_chart and dashboards_remove_widget by contrasting 'replace its whole widget list' with 'add or remove one chart'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative tools and the exact condition that selects them ('To add or remove one chart, use `dashboards_add_chart` or `dashboards_remove_widget`, which keep everything else'). It also adds a prerequisite/confirm step: check with the user before running it because it changes or deletes existing data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dashboards_widget_previewDashboards: widget previewARead-onlyInspect
Show the data a widget would draw, without saving it. Works for a saved chart, given its id, and for list, materialised view, markdown and other widgets, given their config. Use it to see what a saved chart shows now, or to try a widget before adding it with dashboards_add_chart or dashboards_update; use dashboards_data for widgets already on a dashboard. Returns JSON.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | No | Most rows or points to show (default 20) | |
| type | No | Widget type: chart, materialised_view, list, quick_action, markdown, media or getting_started | |
| chart | No | Chart to preview (for a chart widget) | |
| config | No | The widget's settings as JSON, e.g. {"entityName":"orders","limit":5} for a list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds useful context beyond that: it is a dry-run that does not save, and it returns JSON. It stops short of detailing response shape or any auth/limit behavior, but with annotations carrying the safety profile this is solidly above baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core action and scope. Every clause carries routing information or a behavioral constraint; nothing is redundant.
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 multi-mode preview tool with readOnly annotations and no output schema, the description covers the supported widget types, the two invocation modes, the routing to add/update/data siblings, and the return format. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes further by mapping the two usage modes to parameters: a saved chart is previewed by id ('chart'), while list, materialised view and markdown widgets are previewed via their config, which clarifies how 'chart' and 'config' relate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Show') and resource ('the data a widget would draw') and immediately clarifies the non-persistent preview scope. It names the sibling tools it is not (dashboards_data, dashboards_add_chart, dashboards_update), so an agent can disambiguate without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use: to see what a saved chart shows now, or to try a widget before persisting it. It names the alternative 'dashboards_data' for widgets already on a dashboard and ties add/update flows to dashboards_add_chart and dashboards_update. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
data_createData: createAInspect
Create a new record. Inserts one record from a JSON object of field names to values and returns the created record with its new id. Objects or arrays given for jsonb fields are sent as JSON strings automatically. Workflows with an EntityCreated trigger on this entity will run. To load many rows from a file, use data_import.
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | JSON object with field values, e.g. '{"name":"Alice","age":30}' | |
| entity | Yes | Entity name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly=false, destructive=false). The description adds genuine behavior beyond them: it returns the created record with its new id, auto-stringifies objects/arrays for jsonb fields, and discloses that EntityCreated workflows will fire — a meaningful side effect an agent should know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then consequences and the sibling route. No filler sentences — each one (id return, jsonb coercion, workflow trigger, bulk alternative) earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter create tool with no output schema, the description covers the payload format, return shape, side effects, and the bulk-load escalation path. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes beyond the schema by explaining the data payload is a JSON map of field names to values and that jsonb objects/arrays are auto-coerced to JSON strings, adding real semantic value for the 'data' 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?
States a specific verb (create) and resource (record), and clarifies it inserts exactly one record from a JSON object and returns it with a new id. It distinguishes itself from siblings like data_import, data_update, and data_delete without the agent needing to open any 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?
Explicitly routes bulk loading to the alternative: 'To load many rows from a file, use `data_import`.' This gives a clear condition for choosing a sibling, though it doesn't spell out other when-not cases (e.g. via API vs file).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
data_deleteData: deleteADestructiveInspect
Delete a record. Removes one record by its numeric id. Records in other entities that point to it through a relationship field follow that field's on-delete rule; with the default, CASCADE, they are deleted too. Workflows with an EntityDeleted trigger on this entity will run. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Record ID. Find it with data_list. | |
| entity | Yes | Entity name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though annotations already declare destructiveHint=true and openWorldHint=false, the description adds substantial context an agent could not infer: related records cascade via the relationship field's on-delete rule, and EntityDeleted-triggered workflows will fire. It also surfaces the confirm-with-user expectation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then layers cascade, workflow, and safety notes in tight sentences. Every sentence carries information, though the four-sentence block is slightly dense for a two-parameter deletion 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?
No output schema exists, but for a destructive delete the description covers the effects that matter: what is removed, what cascade consequences follow, what side effects (workflow triggers) occur, and the required user confirmation. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters (id even tells you to find it with data_list). The description reinforces that the id is numeric but adds little meaning beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete) and resource (one record, identified by numeric id, within an entity), and the cascade/workflow sentences make the scope concrete. An agent can tell this apart from sibling delete tools like entities_delete or files_delete without opening a schema, because the resource is a data record reached through an entity name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the family naming (data_list/data_create/data_update/data_delete) but never stated, and no alternative is named for the case where you actually want to remove a schema or a file. The only guidance is the caution to confirm with the user before running, which is a safety instruction rather than routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
data_exportData: exportAInspect
Export records to a CSV, JSON or JSONL file (streamed page by page). Writes every matching record to a file on the machine running the CLI, or to standard output when the file is -, fetching page by page. Uses the same filter syntax as data_list; one-to-many fields are left out unless named in the field list. It won't overwrite an existing file unless forced. For one page of records, use data_list.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | Output file, or - for stdout | |
| force | No | Overwrite FILE if it already exists | |
| entity | Yes | Entity name | |
| fields | No | Comma-separated fields to export (default: all) | |
| filter | No | Same filter syntax as 'data list --filter' | |
| format | No | csv, json or jsonl (default: from the file extension) | |
| page_size | No | Records fetched per request (default: 200, max: 1000) | |
| no_formula_guard | No | CSV: don't prefix text starting with = + - @ with a quote (exact values, but unsafe to open in a spreadsheet) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, openWorldHint=false, and the description adds real side-effect context: streamed page-by-page fetching, writing to a local file or stdout with '-', and the overwrite guard ('won't overwrite an existing file unless forced'). It omits any permission/auth requirements or practical limits, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the core action and formats, then the caveats. Slightly redundant phrasing of 'streamed page by page' / 'fetching page by page' in the first two sentences, but otherwise every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter export tool with no output schema, the description covers formats, filtering, field selection, overwrite behavior, and streaming. The only meaningful gap is the absence of auth/permission or throughput expectations; the destination and result (a file or stdout) are otherwise well explained.
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 baseline is 3, but the description adds meaning not in the schema: one-to-many fields are omitted unless explicitly named in the field list, and format defaults derive from the file extension. These are behavioral rules about the parameters rather than restatements.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (export records) plus the output formats (CSV, JSON, JSONL), and explicitly distinguishes itself from the sibling data_list. An agent can identify this as the bulk/paged export tool without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit routing rule: 'For one page of records, use data_list,' which is the exact counter-condition for this tool. It also tells the agent the filter syntax matches data_list, so filters can be reused without re-learning.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
data_getData: getARead-onlyInspect
Get a single record by ID. Returns all of one record's field values by its numeric id. Use data_list with a filter when you don't know the id, search_query to find it by text, and data_rls to see which users can access it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Record ID. Find it with data_list. | |
| entity | Yes | Entity name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered and the bar is lower. The description adds genuine value by disclosing the return shape ('all of one record's field values') in the absence of an output schema, and signals an access-control dimension by pointing to data_rls. It stops short of describing not-found/denied behavior, so it is not 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?
Two sentences, front-loaded with the core action, then a compact routing clause. Every clause earns its place and nothing is repeated padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists and the description compensates by stating what is returned; annotations cover the read-only safety profile and the required entity/id pair is documented in-schema. Minor gap: nothing about error behavior for a missing id or an RLS-denied record, which is relevant given the data_rls reference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are documented in-schema (including how to find the id), so the baseline is 3. The description only echoes the schema ('numeric id') and adds no format, range, or entity-name guidance beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get a single record by ID') and immediately clarifies the lookup key ('numeric id'), which separates it from the list/search siblings. It also names the sibling tools it is not, so an agent can route without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives the conditions for the alternatives: use data_list with a filter when the id is unknown, search_query for text lookup, and data_rls for access/permission questions. This is a complete when-to-use / when-not-to-use routing block rather than an implied hint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
data_importData: importAInspect
Create records from a CSV, JSON array or JSONL file. Always run with --dry-run first and only add --yes after the dry run is approved. Reads a file on the machine running the CLI and creates one new record per row, checking values against the entity's field types; rows with unknown columns are rejected unless told to ignore them. System columns such as id are ignored, so it never updates existing records. For a single record, use data_create.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | CSV, JSON array or JSONL file | |
| entity | Yes | Entity name | |
| errors | No | Write rows that were skipped or failed, with an _error column, so they can be fixed and re-imported | |
| format | No | csv, json or jsonl (default: from the file extension, else sniffed) | |
| dry_run | No | Validate every row and report what would be created; sends nothing | |
| concurrency | No | Parallel create requests (default: 4, max: 16) | |
| ignore_unknown | No | Drop columns that aren't fields on the entity instead of rejecting the row |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false), so the description carries the rest and does so well: it reads a local file, creates one record per row, validates against field types, rejects unknown columns unless ignore_unknown is set, ignores system columns, and never updates existing records. That is substantial behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tightly packed sentences with the safety protocol front-loaded and no filler. Minor friction: it references a '--yes' flag that has no corresponding schema parameter, which could momentarily confuse an agent mapping prose to inputs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter mutation tool with no output schema and only safety annotations, the description covers the important semantics: validation, row rejection, system-column handling, and the mandatory dry-run flow. The only gaps are the concurrency setting and the errors-file return behavior, which are minor for a create-only import.
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 add meaning for a few parameters (dry-run validation, dropping unknown columns, format inference), but it never mentions concurrency or the errors output-file behavior, so it does not meaningfully exceed what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a precise verb and resource ('Create records from a CSV, JSON array or JSONL file') and immediately scopes the operation as bulk/one-record-per-row. It also names the sibling it is not ('For a single record, use data_create'), so an agent can route between the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit procedural guidance ('Always run with --dry-run first and only add --yes after the dry run is approved') plus an explicit alternative for the single-record case (data_create). Both the when-to-use and the when-to-use-something-else cases are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
data_listData: listARead-onlyInspect
List records in an entity. Returns one page of records (rows), 20 by default. Filter by field values with JSON such as {"status":"draft","price":{"gte":10}} or pairs such as status=draft&price=GTE:10. Use data_get when you know the record id, or search_query to find records by text across entities. Returns JSON.
| Name | Required | Description | Default |
|---|---|---|---|
| all | No | Stream all pages to stdout as sequential JSON objects (requires --json). Each object contains one page of results. | |
| page | No | Page number (default: 1) | |
| limit | No | Records per page (default: 20) | |
| entity | Yes | Entity name | |
| filter | No | Field filters: JSON like {"status":"draft","price":{"gte":10}} or field=value pairs like 'status=draft&price=GTE:10' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description usefully adds pagination behavior (one page, 20 by default) and the filter syntax, though it does not explain how 'all' streaming interacts with 'limit' beyond what the schema states.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the core action and pagination, then filter syntax, then the sibling routing. Zero waste.
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, the description covers scope, return format ('Returns JSON'), pagination default, filter syntax, and alternative tools. With annotations carrying the safety profile and no output schema to explain, nothing an agent needs is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description's filter examples largely duplicate the schema's filter description, and the '20 by default' note repeats the limit parameter description, so it adds little semantic value beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List records in an entity') and explicitly differentiates itself from two siblings, data_get and search_query, with the conditions that select each. An agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names both alternatives and the exact condition for each: use data_get when the record id is known, use search_query for text search across entities. This leaves nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
data_rlsData: rlsADestructiveInspect
View or set RLS (row-level security) user access on a record. Without a user id, returns the users who have row-level security (RLS) access to the record, with their names and whether access is read-only. With a user id, grants that user access to the record, full by default or read-only when asked. It cannot remove access, and only matters on entities with RLS turned on. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Record ID. Find it with data_list. | |
| user | No | User ID to grant access to | |
| entity | Yes | Entity name | |
| readonly | No | Grant read-only access (default: full access) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds genuine context beyond them: the hard limitation that it cannot remove access, the RLS-enabled-entity precondition, and the instruction to confirm with the user first. The phrase 'changes or deletes existing data' is slightly loose given it cannot remove access, but it is not a contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and structured as view-then-set-then-caveats. It is five sentences and repeats the '(row-level security (RLS))' expansion twice, a minor redundancy, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description explains the return shape (users with names and read-only status). Combined with annotations covering the safety profile and 100% parameter coverage, an agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: the presence/absence of `user` toggles the tool between read and grant mode, and `readonly` is described as defaulting to full access. That enriches the schema's terse flag 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?
States a specific verb and resource ('View or set RLS user access on a record') and immediately clarifies the dual-mode behavior (view vs grant) based on whether a user id is supplied. This is clearly distinct from the surrounding data_create/data_update/data_delete CRUD siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly maps the two usage modes: without a user id it reads access, with a user id it grants access. It also gives a meaningful precondition ('only matters on entities with RLS turned on') and a caution ('check with the user before running it'). It stops short of naming an alternative tool, so it lands just below the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
data_updateData: updateADestructiveInspect
Update a record. Changes only the fields named in the JSON object and returns the updated record; other fields keep their values. Objects or arrays given for jsonb fields are sent as JSON strings automatically. Workflows with an EntityUpdated trigger on this entity will run. To create a record instead, use data_create. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Record ID. Find it with data_list. | |
| data | No | JSON object with fields to update | |
| entity | Yes | Entity name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, so the mutation risk is known; the description goes further by disclosing partial-update semantics (only named fields change), the return value (updated record), automatic JSON-string coercion for jsonb fields, and the side effect that EntityUpdated workflows fire. These are non-obvious behaviors an agent cannot infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then behavior, then the alternative in a compact sequence of short sentences. The trailing confirmation warning is mildly redundant with destructiveHint but still earns its place as actionable guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by stating what is returned, and it covers partial-update semantics, the jsonb coercion edge case, side effects, and the create alternative. Nothing needed to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds real meaning for `data`: it clarifies that only named fields are touched and that objects/arrays for jsonb fields are stringified automatically, which is not visible 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?
States a specific verb and resource ('Update a record') and immediately disambiguates from the sibling 'data_create' for the create case. An agent can distinguish this from data_create/data_delete without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the create case to `data_create` and adds a caution to confirm with the user before running, which is meaningful usage guidance for a destructive write. It stops short of contrasting with data_delete or data_get, which are the other obvious alternatives in this sibling set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
docsDocsARead-onlyInspect
Print the full CLI reference (markdown or --json for AI/tooling consumption). Prints a hand-written reference of CLI commands, options and examples without calling the API or needing a project. It omits some groups, such as integrations, secrets, API keys and settings, so treat the tool list as the authority on what exists. Returns JSON.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description adds genuinely useful context beyond them: no API call is made, no project is required, and the reference deliberately omits groups like integrations, secrets, API keys and settings. The caveat that the tool list is the authority on what exists is a meaningful disclosure of incompleteness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and three compact sentences with no filler. Minor redundancy: "Print the full CLI reference" and "Prints a hand-written reference" restate the same action, and "Returns JSON" overlaps with the earlier "--json for AI/tooling consumption".
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 and no parameters, so the description must stand on its own, and it does: it describes the content source, the cost profile (no API/project), and the known coverage gaps. The only gap is the unexplained markdown-vs-JSON selection given there is no input parameter for it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero input parameters, so the schema baseline is 4. The description mentions a markdown/--json output mode that is not represented in the schema, which is a minor mismatch but does not obscure 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?
States a specific verb and resource: printing the full CLI reference, with the markdown/--json variants named. It does not explicitly distinguish itself from the sibling `cli` tool, so an agent must infer the division of labor between them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the parenthetical "for AI/tooling consumption" hints at the audience, and "without calling the API or needing a project" implies a cheap, context-free lookup. There is no explicit when-to-use or when-not-to-use guidance relative to `cli`, `api`, or `fetch`.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
email_previewEmail: previewARead-onlyInspect
Render uncommitted subject + content + optional wrapper, print HTML. Renders a draft subject and body with sample data, inside a draft shell if given or the project's current one otherwise, and returns the HTML. Nothing is saved and no email is sent. Use it to check edits before email_templates_update or email_shell_update.
| Name | Required | Description | Default |
|---|---|---|---|
| content | No | Path to file containing content (or '-' for stdin) | |
| subject | No | Subject line to render (defaults to 'Preview') | |
| wrapper | No | Optional path to a wrapper HTML override (or '-' for stdin) | |
| content_text | No | The content to render, passed inline | |
| wrapper_text | No | Optional wrapper HTML override, passed inline |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and openWorldHint=false, and the description usefully reinforces this with 'Nothing is saved and no email is sent.' It also discloses behavior the annotations do not: sample data is injected, and the wrapper falls back to the project's current shell when none is supplied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, and the safety and usage notes come in logical order. The opening 'Render uncommitted subject + content + optional wrapper, print HTML' partially restates the following sentence, a minor 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?
With no output schema, the description correctly tells the agent the tool returns HTML. It covers what is rendered, the wrapper default, sample data, and the no-save/no-send guarantee, so an agent has enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents each parameter; baseline is 3. The description goes beyond it by explaining wrapper resolution (draft shell if given, otherwise the project's current one) and that content is rendered with sample data, which the schema does not state.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: render a draft email subject, content and optional wrapper to HTML. It also distinguishes itself from the commit-oriented siblings email_templates_update and email_shell_update, so an agent can place it precisely in the workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance: 'Use it to check edits before email_templates_update or email_shell_update.' It names the concrete alternatives and the condition that selects this tool over them, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
email_shell_showEmail: shell showARead-onlyInspect
Show the current shell HTML (custom or platform default). Returns the HTML layout that wraps the body of every email the project sends, and says whether it is customised or the platform default. The {{Content}} placeholder marks where each template's body goes. Read it before email_shell_update.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds real behavioral value beyond that: it discloses the return content (the HTML layout wrapping every email body), that it reports customised vs default state, and the {{Content}} placeholder semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with purpose, then return content and placeholder semantics, then the usage hint. Nothing is padding.
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 carries the burden of explaining what comes back, and it does so precisely (layout HTML plus custom/default flag). Nothing an agent needs to invoke and interpret the call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so the baseline is 4. The description's explanation of the {{Content}} placeholder is genuinely useful orientation for the returned HTML, even though there are no inputs to document.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (Show) plus resource (shell HTML), with immediate scope disambiguation of custom vs platform default. It also names the sibling email_shell_update, so an agent can distinguish it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states 'Read it before `email_shell_update`,' which routes the agent to the correct sequencing relative to the write twin. No when-not guidance is given, but the primary usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
email_shell_updateEmail: shell updateADestructiveInspect
Save new shell HTML, or pass --reset to revert to the platform default. Replaces the HTML layout around every email the project sends, or with reset returns to the platform default. Keep the {{Content}} placeholder where the body goes; the server sanitises the HTML. Check a draft with email_preview first. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| html | No | Path to file with the new shell HTML (or '-' for stdin) | |
| reset | No | Reset the shell to the platform default | |
| html_text | No | The new shell HTML, passed inline |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry destructiveHint=true and readOnlyHint=false, and the description reinforces with 'changes or deletes existing data, so check with the user.' It adds genuinely new behavioral context: the server sanitises the HTML and the {{Content}} placeholder must be preserved.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the primary action and appropriately sized, but the reset behavior is stated twice ('revert to the platform default' and 'returns to the platform default'), which is mild redundancy rather than wasted 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?
For a no-output-schema mutation tool, it covers both operating modes, the placeholder constraint, sanitisation behavior, the destructive warning, and the preview-first workflow. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 usable semantics beyond the schema: the reset flag's effect (returns to platform default) and the invariant that the {{Content}} placeholder must remain. Minor friction: it expresses reset as a CLI-style '--reset' flag while the schema exposes a boolean.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (save/replace the shell HTML layout around every project email) and covers both modes (save vs. reset to default). The scope 'around every email the project sends' cleanly separates it from siblings like email_templates_update and email_shell_show.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear workflow condition: 'Check a draft with email_preview first' and 'check with the user before running it.' It names one alternative (email_preview) explicitly, though it doesn't distinguish save-shell from email_templates_update or state when reset vs. save is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
email_templates_listEmail: templates listARead-onlyInspect
List all email templates for this project. Shows each template's type (such as confirmation, invite or recovery), subject, and whether it is locked or active. These are the account emails Anythink sends for the project; pass a type to email_templates_show to read one or email_templates_update to change it.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds real context beyond that: these are the account emails Anythink sends for the project, and each entry carries a type, subject, and locked/active state, which tells the agent what a mutation would affect. No pagination or rate-limit detail, hence not 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?
Two sentences, both front-loaded: the first states the action and returned fields, the second supplies the sibling routing. No filler or restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so by naming the fields returned. For a zero-parameter, read-only list tool with annotations covering safety, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is nothing to document and the baseline is 4. The description correctly does not invent parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('List all email templates for this project') and even enumerates the fields returned (type, subject, locked/active). It clearly distinguishes itself from the sibling read-one (email_templates_show) and write (email_templates_update) 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?
It routes the agent to the correct sibling with conditions: use email_templates_show to read one, email_templates_update to change one. That covers alternatives well, though it offers no explicit when-not-to-use guidance and the 'pass a type' phrasing sits oddly on a tool that itself takes no parameters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
email_templates_showEmail: templates showARead-onlyInspect
Show a template's subject + content, or the rendered HTML with --rendered. By default returns the stored subject and content with their {{ placeholders }} intact, which is what to edit; with rendered it returns the full email HTML inside the project's shell, filled with sample data. Read it before email_templates_update.
| Name | Required | Description | Default |
|---|---|---|---|
| rendered | No | Show the rendered HTML using sample data instead of the raw content | |
| template_type | Yes | The template type (e.g. confirmation, invite, recovery) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description goes beyond them by disclosing what each mode actually returns: raw content with placeholders preserved vs full email HTML wrapped in the project's shell filled with sample data. No auth/rate-limit notes, hence not 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?
Three sentences, front-loaded with the core action and then the mode distinction. Dense and largely waste-free, though the CLI-style flag reference is slightly off-register for an MCP parameter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A read-only, two-parameter tool with full schema coverage and no output schema; the description compensates by describing the return shape in both modes. Nothing critical for correct invocation is missing, though it could note the required template_type explicitly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description still adds meaning: it explains the consequence of the rendered flag (full HTML in the project shell with sample data) versus the default (editable placeholders). The '--rendered' notation is CLI-flavored and does not exactly match the boolean parameter name, which slightly muddies the mapping.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Show) and resource (a template's subject + content), and explicitly splits the two operating modes (raw content vs rendered HTML). It also names the sibling workflow target (email_templates_update), so an agent can place it without opening siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear mode selection guidance: the default output with intact {{ placeholders }} is 'what to edit', while rendered gives the full HTML with sample data. It also adds a workflow ordering hint ('Read it before email_templates_update'). No explicit exclusions against other siblings (e.g. email_templates_list, email_preview), so not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
email_templates_updateEmail: templates updateADestructiveInspect
Update a template's subject and/or content. Saves a new subject and/or body for one template type, keeping whichever you leave out; every email of that type the project sends from then on uses it. Pass the body inline in content_text. Check a draft first with email_preview, as the previous content isn't kept. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| content | No | Path to a file containing the new HTML/text content (use '-' for stdin) | |
| subject | No | New subject line | |
| content_text | No | The new HTML/text content, passed inline | |
| template_type | Yes | The template type to update |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint annotation by disclosing blast radius ('every email of that type the project sends from then on uses it'), the merge semantics ('keeping whichever you leave out'), and the irreversible loss of prior content ('the previous content isn't kept'). It also flags the confirmation requirement for a destructive write.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then layers merge semantics, the parameter hint, the draft-check, and the safety warning. Four sentences, all substantive, though the merge-semantics clause is slightly wordy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, no-output-schema update tool, the description covers scope, merge behavior, reversibility, parameter disambiguation, and the recommended verification path. An agent has everything needed to call it correctly and safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning by clarifying 'Pass the body inline in content_text', disambiguating it from the file/stdin 'content' parameter. It doesn't elaborate on template_type values or subject, but the schema carries those.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update a template's subject and/or content') and pins the scope to 'one template type'. This distinguishes it cleanly from email_templates_show, email_templates_list, and email_preview without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to the alternative ('Check a draft first with email_preview') and gives a precondition ('check with the user before running it') plus when-not guidance implied by the destructive nature. Nothing about when to use this vs. siblings is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
entities_createEntities: createAInspect
Create a new entity. Creates an empty entity, which is a new database table in the active project; add its columns afterwards with fields_add. Options make it public (queryable without signing in), turn on row-level security (RLS), block new records through the API, or mark it as a many-to-many junction table.
| Name | Required | Description | Default |
|---|---|---|---|
| rls | No | Enable row-level security | |
| name | Yes | Entity name (e.g. 'customers', 'orders') | |
| public | No | Make entity publicly queryable (no auth required) | |
| junction | No | Mark as a many-to-many junction table | |
| lock_records | No | Prevent creation of new records via API |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (not read-only, not destructive, closed-world). The description adds substantive behavior beyond that: creation produces a real table in the active project, and each option's effect is spelled out (public = queryable without signing in, lock_records = blocks API record creation). It stops short of stating permissions or whether creation is reversible, but the added context is real.
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 action and its next-step, with the option list trailing where it belongs. The final sentence is a long run-on enumerating four flags, but each clause carries distinct information, so there is little waste.
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 create tool with no output schema, it covers what an agent needs: the resource created, where it lives, the next step, and flag meanings. The minor gap is that it never says what is returned (e.g., an id) or how the new entity is referenced by the follow-up fields_add call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds interpretive gloss beyond the terse schema strings — e.g. 'public' is expanded to 'queryable without signing in' and 'lock_records' to blocking new records through the API. That meaningfully clarifies the four boolean flags for an agent deciding which to set.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Create a new entity') immediately followed by a functional definition ('a new database table in the active project'). It also disambiguates from the sibling that follows it in the workflow (fields_add) and from entities_update/entities_delete.
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 sequencing guidance: create the entity, then 'add its columns afterwards with `fields_add`'. This tells the agent both when to use it and which sibling handles the next step, which is exactly the alternative-routing the dimension asks for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
entities_deleteEntities: deleteADestructiveInspect
Delete an entity and all its data. Drops the entity's table, removing all of its fields and every record in it for good. To remove one column, use fields_delete; to remove one record, use data_delete. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Entity name to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description goes further by spelling out the concrete consequence (the table is dropped and data is gone 'for good'), i.e. irreversibility, and adds a user-confirmation caution. That is meaningful behavioral context beyond the structured hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the destructive scope, then the sibling routing, then the safety caution. No filler; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive tool with no output schema and full annotation coverage, the description covers scope, alternatives, and the safety prerequisite. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter and schema description coverage is 100% ('Entity name to delete'), so the schema already carries the parameter semantics. The description adds no extra meaning such as naming/casing rules, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (delete an entity) and immediately bounds the scope: the entity's table, all its fields, and every record. It also names the sibling tools that do the narrower operations, so an agent can distinguish it from fields_delete and data_delete without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use fields_delete to remove one column, data_delete to remove one record, otherwise this tool. It also adds a caution to confirm with the user before running it, which is exactly the when-to-use guidance needed for a destructive operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
entities_getEntities: getARead-onlyInspect
Get entity details and fields. Takes the entity name. Returns its table name, its public, RLS and lock-new-records flags, and each field's id, name, database type, display type and required, unique and indexed flags. For one field's full definition, including relationship and select options, use fields_get.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Entity name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint=false; the description goes beyond them by enumerating the returned flags (public, RLS, lock-new-records) and field properties, which is valuable since there is no output schema. It omits any mention of error/not-found behavior for an unknown entity name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the purpose, then the parameter, then the return shape, then the alternative. Every sentence carries distinct information with 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?
Because no output schema exists, the description usefully compensates by enumerating the returned entity and field attributes, and it points to the sibling for deeper field detail. It is broadly complete, though it does not cover failure modes or whether the response is paginated/nested.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter `name` is documented in the schema itself. The description's 'Takes the entity name' adds nothing beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get entity details and fields') and distinguishes itself from the sibling `fields_get` by scoping itself to the entity level. An agent can tell it apart from `entities_list` and `fields_get` without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to `fields_get` when a single field's full definition (relationships, select options) is needed, which is the key ambiguity for this tool family. It does not, however, state an explicit when-not rule or contrast against `entities_list`.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
entities_listEntities: listARead-onlyInspect
List all entities. Returns each entity (table) in the active project with its database table name, field count, and whether it is public or has row-level security (RLS) on. System entities are not included. To see one entity's settings and field definitions, use entities_get.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds meaningful context beyond that: which fields are returned, that system entities are excluded, and that RLS/public status is surfaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the action, then the return payload, then the routing hint. Every sentence earns its place with 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?
With no output schema, the description carries the burden of describing return values, and it does so (table name, field count, public/RLS status) plus the system-entity exclusion. Nothing needed to call this zero-arg list correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline is 4. The schema coverage is 100% (empty object), and the description correctly does not invent 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?
States a specific verb (list) and resource (entities/tables) scoped to the active project, and explicitly distinguishes itself from the singular `entities_get`. An agent can tell it apart from siblings like entities_create/entities_update without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Routes the agent to the correct alternative with an explicit condition: use `entities_get` for one entity's settings and field definitions. It gives clear context but does not mention other near alternatives (e.g., fields_list) or exclusions such as when not to list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
entities_updateEntities: updateADestructiveInspect
Update entity settings. Changes an entity's public, row-level security (RLS) and lock-new-records settings; any you leave out keep their current value. It cannot rename the entity or change its fields, so use fields_update for columns. Making an entity public lets anyone query its records without signing in. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| rls | No | Enable/disable row-level security (true/false) | |
| name | Yes | Entity name to update | |
| public | No | Set public access (true/false) | |
| lock_records | No | Enable/disable record locking (true/false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, yet the description adds real value beyond them: partial-update semantics (omitted settings retain current values), the security consequence of making an entity public (anyone can query without signing in), and a warning to confirm with the user. This is rich context layered on top of the safety hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then adds only sentences that carry unique information: partial-update behavior, the sibling alternative, the security implication, and the caution. No filler or redundancy with the structured fields.
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 mutation tool with no output schema, the description covers everything needed to call it responsibly: partial-update semantics, hard limits, security impact, and a user-confirmation nudge, all consistent with destructiveHint=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?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the terse schema labels: it explains that leaving a setting out preserves its current value and clarifies the real-world effect of the public flag. This goes past restating the schema without fully documenting every parameter's syntax.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (update) and resource (entity settings) and enumerates exactly which settings change (public, RLS, lock-new-records). It explicitly distinguishes itself from fields_update for column changes, so an agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear when-to-use context, names the alternative (fields_update) for the case this tool cannot handle, and states the exclusion explicitly (cannot rename or change fields). It also adds a pre-run caution to check with the user.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetchFetchADestructiveInspect
Make an authenticated API request to the active project. Sends a request to any project endpoint, with the path relative to /org/{project}, using the CLI's credentials, and prints the response body. Use it only where no dedicated tool exists, such as /permissions or integration field options; POST, PUT and DELETE change data. all follows every page of a GET. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| all | No | Follow every page of a paged GET response, printing each page as it arrives | |
| body | No | Request body (JSON string) | |
| path | Yes | API path (e.g. /integrations/definitions/slack) | |
| method | No | HTTP method (default: GET) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the 'changes or deletes existing data' line is partly redundant. The description still adds real value beyond the annotations: which HTTP methods mutate (POST/PUT/DELETE), that credentials come from the CLI, that `all` paginates a GET, and that it prints the response body.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and front-loaded: purpose first, then the fallback rule, then method semantics and the safety check. Most sentences earn their place; the mutation warning is slightly restated by the final sentence, but the length is justified for a catch-all tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a generic HTTP tool with no output schema, the description covers auth source, path resolution, method semantics, pagination behavior, and the return behavior (prints body). An agent has everything needed to invoke it correctly, and the absence of an output schema is compensated for.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description compensates with meaning the schema lacks: the path is resolved relative to /org/{project}, and `all` is scoped specifically to GET pagination. The method-mutation mapping adds cross-parameter semantics not stated per-field 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?
States a specific verb (make/send an authenticated API request) and resource (any project endpoint, path relative to /org/{project}), plus what it produces (prints the response body). It also distinguishes itself from the ~140 specific siblings by framing itself as the generic escape hatch used only when no dedicated tool exists.
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 'Use it only where no dedicated tool exists' and gives concrete examples (/permissions, integration field options), which is an unusually clear when-to-use-vs-alternatives rule against a large sibling set. It adds a confirmation prerequisite ('check with the user') for mutating methods.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fields_addFields: addAInspect
Add a field to an entity. Adds a column to an existing entity; always pass the database type. The display type defaults from it (varchar to input, boolean to checkbox, relationships to relationship). Relationship types need the target entity's name, and on-delete defaults to CASCADE; user and file fields link to users and files automatically. Returns the new field's id.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Field name (snake_case) | |
| type | No | Database type: varchar, varchar array, text, integer, integer array, bigint, bigint array, decimal, decimal array, boolean, date, timestamp, jsonb, geo, file, user, one-to-one, one-to-many, many-to-one, many-to-many, dynamic-reference | |
| label | No | Human-readable label | |
| entity | Yes | Entity name | |
| public | No | Mark field as public | |
| target | No | Target entity name for relationship fields (many-to-one, one-to-many, many-to-many) | |
| unique | No | Enforce unique constraint | |
| default | No | Default value | |
| display | No | Display type: input, textarea, rich-text, select, entity-select, radio, country-select, checkbox, short-date, long-date, timestamp, relationship, file, secret, user, jsonb, geo, dynamic-reference | |
| indexed | No | Add database index | |
| options | No | Comma-separated option list for select display, e.g. "Running,Cycling,Rugby". Use label=value to split, e.g. "Running=running,Cycling=cycling" | |
| multiple | No | Allow multiple values on a select field | |
| required | No | Mark field as required | |
| on_delete | No | Deletion behavior: CASCADE, SET NULL, SET DEFAULT, RESTRICT (default: CASCADE). Underscores are accepted (SET_NULL, SET_DEFAULT) and normalised. | |
| name_field | No | Set as name field | |
| searchable | No | Enable full-text search on this field | |
| description | No | Field description |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false), so the description's added value is its disclosure of defaults: display type inferred from database type, on-delete defaulting to CASCADE, and automatic user/file linking. It also states the return value (the new field's id), which matters since there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, each earning its place: purpose, the type requirement, the defaulting rules, and the return value. The most important constraint (always pass the database type) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 17-parameter mutation tool with no output schema, the description covers the highest-risk gaps: default behaviors, relationship requirements, and the return value. Remaining parameter detail is fully covered by the schema, so the definition is complete enough 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%, so the baseline is 3, but the description adds real semantics beyond the schema: how display defaults from type, that relationship types need target, and that on-delete defaults to CASCADE. It does not clarify the many boolean flags (unique, indexed, searchable, multiple), but it meaningfully enriches the relationship-related 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?
States a specific verb and resource ('Add a field to an entity') and immediately clarifies it as adding a column to an existing entity, which unambiguously distinguishes it from fields_update, fields_delete, and fields_list. An agent can select it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete conditional guidance: always pass the database type, relationship types require the target entity's name. It does not name alternatives (e.g. fields_update) or state when not to use it, so it stops short of the top band, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fields_deleteFields: deleteADestructiveInspect
Delete a field from an entity. Takes the field's name, not its id, and drops that column from the entity, so the value it held is lost from every record. To remove the whole entity and its records, use entities_delete. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| entity | Yes | Entity name | |
| field_name | Yes | Field name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds real value beyond them: it says the column is dropped and the value it held is lost from every record, and it recommends user confirmation. This explains what actually gets destroyed, which the annotations only flag categorically.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the core action, then name-vs-id, then the sibling routing, then the safety note. No filler; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter destructive tool with no output schema and annotations already covering the safety profile, the description covers action, input semantics, alternative routing, and irreversibility. Nothing an agent needs to call it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema handles the two params, but the description adds meaning the schema lacks: field_name is the field's name, not its id. That disambiguation is genuinely useful for correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (delete a field from an entity) and further specifies scope by noting it takes the field's name rather than id. It distinguishes itself from the closely related entities_delete, so an agent can route correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names an explicit alternative and the condition that selects it: to remove the whole entity and its records, use entities_delete. It also advises checking with the user before running. It does not cover the broader field-tool family (fields_update vs delete), but the key routing decision is stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fields_getFields: getARead-onlyInspect
Get the full definition of one field (including relationship config). Finds the field by name on the entity (not case-sensitive) and returns its full definition as a JSON object, including relationship settings, select options, default value and search flags. To see every field on an entity at once, use fields_list.
| Name | Required | Description | Default |
|---|---|---|---|
| entity | Yes | Entity name | |
| field_name | Yes | Field name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful context: case-insensitive name matching, and that the returned JSON includes relationship settings, select options, default value and search flags — important given there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and return scope, followed by the sibling routing hint. 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?
With no output schema, the description correctly compensates by enumerating what the returned JSON contains, and annotations carry the read-only safety profile. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds real meaning beyond the schema: the field lookup is not case-sensitive, which the schema (just 'Field name') does not convey. Slight value-add over the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('get the full definition of one field') and explicitly scopes it against the sibling `fields_list` ('every field on an entity at once'). An agent can distinguish it from fields_add/fields_update/fields_delete without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative tool (`fields_list`) and the condition that selects it. The single-field vs all-fields routing decision is fully resolved in the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fields_listFields: listARead-onlyInspect
List fields on an entity. Takes the entity name. Returns each field's id, name, label, database type, display type and its required, unique, indexed and locked flags. For one field's complete definition, including relationship target and select options, use fields_get; for the entity's own settings, use entities_get.
| Name | Required | Description | Default |
|---|---|---|---|
| entity | Yes | Entity name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuine value beyond that by disclosing the exact return payload, which matters because there is no output schema. It stops short of noting permissions or pagination behavior, but the return-shape disclosure is substantive context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, zero filler, and structurally front-loaded: what it does, how to invoke it, what comes back, then where to go instead. The return-field enumeration earns its space because no output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, no-output-schema read tool, the description supplies the purpose, the required input, the full return shape, and sibling routing. An agent has everything needed to call it correctly and to interpret the response without additional 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?
Schema coverage is 100% and the single parameter is already documented as 'Entity name'. The description's 'Takes the entity name' merely restates the schema without adding format, naming-convention, or resolution behavior for the entity identifier, so the baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List fields on an entity') and enumerates exactly what is returned (id, name, label, database type, display type, required/unique/indexed/locked flags). It explicitly distinguishes itself from the two nearest siblings, fields_get and entities_get, so an agent can select it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing rules: use `fields_get` when one field's complete definition is needed (relationship target, select options), and `entities_get` for the entity's own settings. This is a clear when-to-use-this vs when-to-use-alternatives statement, not an inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fields_updateFields: updateADestructiveInspect
Update properties of an existing field. Changes a field's label, description, display type, default value, select options and its required, searchable, public-search and indexed flags. Settings you don't pass keep their value, except the description, which is cleared unless passed again. It cannot rename a field or change its database type, and locked fields are refused. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | Human-readable label | |
| entity | Yes | Entity name | |
| public | No | Mark field as publicly searchable | |
| default | No | Default value | |
| display | No | Display type: input, textarea, rich-text, select, entity-select, radio, country-select, checkbox, short-date, long-date, timestamp, relationship, file, secret, user, jsonb, geo, dynamic-reference | |
| indexed | No | Add database index | |
| options | No | Comma-separated option list for select display, e.g. "Running,Cycling,Rugby". Use label=value to split, e.g. "Running=running,Cycling=cycling" | |
| multiple | No | Allow multiple values on a select field | |
| required | No | Mark field as required | |
| no_public | No | Remove public searchable flag | |
| field_name | Yes | Field name to update | |
| no_indexed | No | Remove database index | |
| searchable | No | Enable full-text search on this field | |
| description | No | Field description | |
| no_multiple | No | Restrict to a single value on a select field | |
| no_required | No | Remove required constraint | |
| no_searchable | No | Disable full-text search on this field |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds a genuinely non-obvious patch semantic beyond the annotations: unpassed settings retain their values EXCEPT description, which is cleared unless passed again. Combined with the locked-field refusal and the data-change warning, this is rich behavioral context the destructiveHint annotation alone does not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the core action and followed by patch semantics, hard limits, and a safety warning. No filler; every sentence carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive 17-parameter mutation with no output schema, the description covers the mutation surface, patch semantics, exclusions, and a confirmation guardrail, which is everything an agent needs to call it responsibly.
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, but the description adds meaning beyond the schema by grouping the mutable properties and disclosing the special clearing behavior of the description parameter. It doesn't detail the no_* negation flags, so it stays short of 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ("Update properties of an existing field") and enumerates exactly what properties can change, making it trivially distinguishable from siblings like fields_add, fields_delete, fields_get and fields_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly states when-not conditions: it cannot rename a field or change its database type, and locked fields are refused. It also advises checking with the user first. It stops short of naming the sibling tool to use for renaming/type changes, so routing is partly left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
files_deleteFiles: deleteADestructiveInspect
Delete a file by ID. Removes the file from the project's storage by its id. Records that reference it through a file field follow that field's on-delete rule; with the default, CASCADE, they are deleted too. To see what is stored first, use files_get. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | File ID to delete. Find it with files_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, but the description adds the decisive behavior the annotations cannot convey: references via a file field follow that field's on-delete rule and default to CASCADE, so related records are deleted too. It also advises user confirmation before running, which is meaningful risk context for a destructive operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences that lead with the core action, then consequence, then alternative, then caution — good front-loading. The second sentence ('Removes the file from the project's storage by its id') largely restates the first, a minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool with no output schema and destructiveHint already set, the description covers the action, the cascade side effect, the discovery path (files_get/files_list), and the confirmation expectation. Nothing an agent needs to call this safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single `id` parameter is already documented there, including how to find it via files_list. The description only restates 'by ID' and adds no format or syntax detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a file by ID') and immediately scopes it with the cascade consequence, distinguishing it from siblings like files_get and files_list. An agent knows exactly what this tool does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative for inspection ('To see what is stored first, use `files_get`') and gives a pre-execution guardrail ('check with the user before running it'). It does not spell out when deletion is inappropriate or name non-file deletion tools, so it stops just short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
files_getFiles: getARead-onlyInspect
Get file metadata by ID. Returns one file's original and stored names, type, size, whether it is public and when it was uploaded. It gives metadata only, not the file's contents or a download link. To browse all files, use files_list.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | File ID. Find it with files_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds real behavioral value beyond that by stating the response is metadata only and explicitly excludes contents and download links, which prevents misuse. It stops short of noting auth requirements or missing-ID behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, each earning its place: purpose, return fields, negative scope, and sibling routing. Front-loaded with the operation and zero 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?
No output schema exists, but the description enumerates the returned metadata fields, which functionally substitutes for one. For a one-parameter read tool with annotations covering the safety profile, nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Single required parameter with 100% schema description coverage; the schema already explains that the ID is a file ID obtainable via files_list. The description adds no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Get file metadata by ID') and enumerates exactly what comes back: original/stored names, type, size, public flag, upload time. It also explicitly disambiguates from files_list and from content retrieval, so an agent can pick it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative ('To browse all files, use `files_list`') and adds the negative condition: this tool does not return contents or a download link. The when-to-use and when-not-to-use cases are both covered explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
files_listFiles: listARead-onlyInspect
List uploaded files. Returns one page of the project's uploaded files, 25 by default, with each file's id, original name, type, size, whether it is public and when it was uploaded. Use files_get for one file's details, including its stored name.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default: 1) | |
| limit | No | Items per page (default: 25) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuinely useful behavior beyond that: default page size of 25, that only one page is returned, and which fields each record carries. It does not mention auth requirements or the ordering of results, but the added context is substantial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste, with the core action first, the return shape second, and the sibling routing last. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates the returned fields and pagination behavior, which an agent otherwise could not know. It omits result ordering and whether pagination is capped, minor gaps for a simple paged list.
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 both parameters already document their defaults, so the description's mention of '25 by default' and 'one page' largely repeats structured data. Baseline 3 is appropriate; it adds no syntax or interaction detail (e.g., how page interacts with limit).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List uploaded files') and immediately scopes it: one page of the project's uploaded files. It names the sibling it is not ('Use files_get for one file's details'), so an agent can distinguish list from get without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes single-file lookups to files_get, which is the main ambiguity for this tool. It does not state exclusions such as when to prefer search or filtering tools, but the context needed to choose correctly is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
files_uploadFiles: uploadAInspect
Upload a file. Uploads a file from a path on the machine running the CLI to the project's file storage and returns its new id and stored name. Files are private by default; a public file can be fetched without signing in. Use the returned id as the value of a file field with data_create or data_update.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the file to upload | |
| public | No | Make the file publicly accessible (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, destructiveHint=false, openWorldHint=false, but the description adds important behavioral context beyond that: files are private by default, public files can be fetched without signing in, and it returns id and stored name. It does not mention file size limits, allowed types, or error behavior, so not 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?
Three sentences, front-loaded with the action and outcome, then privacy behavior, then integration guidance. 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?
For a simple two-parameter upload tool with full schema coverage and no output schema, the description covers purpose, return values, privacy semantics, and downstream usage. Nothing critical is missing for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents path and public with descriptions. The description adds meaning by explaining that public files are fetchable without authentication, which goes beyond the schema's 'Make the file publicly accessible' text. Baseline 4 is appropriate given full schema coverage plus a useful clarification.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: uploads a file from a local path into project file storage and returns its new id and stored name. This is precise and distinctions from siblings like files_get or files_list are obvious.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context: use the returned id as the value of a file field with data_create or data_update. This links the tool to downstream usage. No explicit exclusions or alternatives are named (e.g., when not to upload), but the primary usage context is well defined.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_directusImport: directusADestructiveInspect
Import collections, fields, flows, and data from a Directus instance. Writes into the active project: run with --dry-run first and add --yes only once the user has approved the plan. Copies a Directus instance's collections and fields into the active project as entities and fields; flows, files, roles and records come across only with include_flows, include_files, include_roles and include_data. Call it with dry_run first and show the user the plan, because a call without dry_run applies the import straight away. Returns JSON. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Target Anythink project profile (defaults to the active profile) | |
| url | No | Directus instance base URL (e.g. https://cms.example.com) | |
| token | No | Directus static or admin token. Prefer the DIRECTUS_TOKEN environment variable: a flag lands in shell history and the process list | |
| dry_run | No | Preview what would be imported without making any changes | |
| include_data | No | Also import records from each collection (schema must already match) | |
| include_files | No | Also download files from Directus and re-upload to Anythink (runs before --include-data) | |
| include_flows | No | Also import Directus flows as Anythink workflows | |
| include_roles | No | Also import Directus roles + permissions, and promote collections to is_public when the Public policy can read them | |
| allow_insecure | No | Allow a plain http:// Directus URL (localhost is always allowed) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, readOnlyHint=false, and the description reinforces this by warning that a call without dry_run applies the import immediately and that it changes or deletes existing data. It adds context beyond annotations, though it does not detail auth requirements or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose and destructive warning, but the description is somewhat repetitive, restating the dry-run advice multiple times and using both --dry-run and dry_run terminology.
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, destructive nature, required safety workflow, and the meaning of the optional include_* parameters. With no output schema, it also notes the tool returns JSON. Complete for a 9-parameter destructive import 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, but the description adds semantic detail by explaining that flows/files/roles/records only come across with the corresponding include_* flags and that include_files runs before include_data, which is not captured 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?
States a specific verb (Import) and enumerated resources (collections, fields, flows, data) from a named source (Directus), and distinguishes itself from the sibling data_import by naming the source system.
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 to run with --dry-run first and add --yes only after user approval, and explains what is included only when include_flows/include_files/include_roles/include_data are set. This is exactly the when/when-not guidance an agent needs for a destructive tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
integrations_connectIntegrations: connectAInspect
Connect to a provider with an API key (prompts for the key if not given). Only for providers whose auth type is api_key (see integrations_get); OAuth providers fail here and need integrations_oauth_configure. Stores the key encrypted on the server and creates a project-wide connection, or a private one with user_connection, printing its id. Pass the key in api_key, then check the connection with integrations_test.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Friendly name for this connection (default: "<provider> connection") | |
| api_key | No | API key for the provider. If omitted, you'll be prompted (input is hidden). | |
| provider | Yes | Provider key (e.g. claude, openai) | |
| user_connection | No | Make this a user-scoped connection (only the current user sees it). Default: tenant-wide. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark it non-readOnly, non-destructive, and closed-world, so the safety bar is lower. The description still adds real behavior: it prompts for the key when missing, stores it encrypted server-side, creates either a project-wide or user-scoped connection, and prints its id. It does not say what happens if a connection already exists, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four densely packed sentences, front-loaded with the core action and the OAuth exclusion before moving to storage semantics and follow-up. Every sentence carries information, though the density borders on overload.
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 the preconditions (auth type lookup via integrations_get), the action, the side effects (encrypted storage, connection scope), the return (prints its id), and the next step (integrations_test). No output schema exists, and the description still explains what is produced.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (name, api_key, provider, user_connection) are already documented in the schema. The description reinforces api_key and user_connection usage but adds no syntax or default details beyond the structured fields, 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?
States a specific verb + resource (connect to a provider) and immediately scopes it to api_key providers, routing the agent away from OAuth. An agent can distinguish this from integrations_oauth_connect/configure and integrations_test without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-not guidance ('OAuth providers fail here and need integrations_oauth_configure') names the alternative tool. It also states the follow-up step ('check the connection with integrations_test') and points to integrations_get for determining auth type.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
integrations_connections_listIntegrations: connections listARead-onlyInspect
List your integration connections. Shows each connection's id, provider, name, scope (the whole project or one user) and whether it is enabled; stored credentials are never shown. Use the id with integrations_test, integrations_enable, integrations_disable and integrations_disconnect.
| Name | Required | Description | Default |
|---|---|---|---|
| provider | No | Filter to a specific provider |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful behavior beyond that: what each row exposes (scope = whole project or one user; enabled flag) and the security guarantee that stored credentials are never returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences. The core purpose and returned fields come first, then the id-routing hint. No filler, no restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by listing the fields returned, and it discloses the credential-hiding guarantee. Absent only pagination/ordering notes, which are minor for a typically small connection list.
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 single 'provider' parameter is already documented in the schema and the description need not repeat it. Baseline 3 is appropriate; the description adds no filter syntax or semantics 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?
States a specific verb and resource ('List your integration connections') and enumerates the returned fields (id, provider, name, scope, enabled), which is far more informative than the title. It does not explicitly distinguish itself from the sibling email_templates_list/integrations_list, so sibling differentiation is only partial.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear downstream context by naming the four tools that consume the returned id (integrations_test/enable/disable/disconnect), which tells the agent why to call this first. It stops short of stating when-not to use it versus integrations_list, so no explicit exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
integrations_disableIntegrations: disableAInspect
Disable a connection. Stops integrations_execute and workflow steps from using the connection but keeps its stored credentials, so integrations_enable can turn it back on. Prefer this to integrations_disconnect when the pause may be temporary.
| Name | Required | Description | Default |
|---|---|---|---|
| connection_id | Yes | Connection ID. Find it with integrations_connections_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: what actually stops (integrations_execute and workflow steps), and crucially that stored credentials survive, making the action reversible via integrations_enable. It does not mention permission requirements or error cases, so it falls just short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly-packed sentences with zero filler. The core action leads, the effect on dependent tools follows, and the disambiguation against the sibling comes last where an undecided agent will look.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description needn't explain return values for a state toggle, and annotations carry the safety hints. Between the reversibility note, the sibling disambiguation, and the schema's ID lookup pointer, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter, and the schema already documents it at 100% coverage, including how to find the ID via integrations_connections_list. The description adds no syntax, format, or edge-case detail about connection_id, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (disable) and resource (connection) and immediately differentiates itself from two closely-named siblings: integrations_enable (the reverse) and integrations_disconnect (the harder alternative). An agent can pick between the three without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative (integrations_disconnect) and the condition that selects this tool over it: 'Prefer this to integrations_disconnect when the pause may be temporary.' The when-to-use-vs-alternative decision is fully closed out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
integrations_disconnectIntegrations: disconnectADestructiveInspect
Delete a connection. Removes the connection and its stored credentials from the project; workflow steps that rely on it fail until the provider is connected again with integrations_connect or the OAuth flow. Use integrations_disable to pause it instead. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| connection_id | Yes | Connection ID to delete. Find it with integrations_connections_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, but the description goes beyond by disclosing the concrete fallout: stored credentials are removed and dependent workflow steps fail until reconnection. It also adds an authorization/etiquette constraint ('check with the user before running it') that no annotation conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the destructive action and its scope, followed by the alternative and the safety caveat. Every sentence carries distinct, load-bearing information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool with no output schema, the description supplies everything needed: what is destroyed, downstream impact, the safer alternative, and a user-confirmation rule. Nothing required to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single parameter already documents itself and its discovery path ('Find it with integrations_connections_list'). The description adds no format or constraint detail beyond the schema, so the baseline 3 for schema-documented params applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Delete a connection') and immediately scopes what is removed (the connection and its stored credentials from the project). An agent can distinguish this from siblings like integrations_disable or integrations_list without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative ('Use integrations_disable to pause it instead') and the remediation path ('connected again with integrations_connect or the OAuth flow'). It states both when to use this and when to prefer a sibling, and adds a pre-flight caution to confirm with the user.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
integrations_enableIntegrations: enableAInspect
Enable a connection. Turns a disabled connection back on so integrations_execute and workflow steps can use it again; its stored credentials are unchanged. Returns the connection's name and new state. The opposite is integrations_disable.
| Name | Required | Description | Default |
|---|---|---|---|
| connection_id | Yes | Connection ID. Find it with integrations_connections_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a non-destructive mutation (readOnlyHint=false, destructiveHint=false). The description adds value beyond them: it specifies that stored credentials are unchanged and that the tool returns the connection's name and new state, which an agent cannot infer from the annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action, then the effect, then the inverse. No filler and nothing repeated from the title that isn't also doing routing work.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter state toggle, the description covers the effect, side-effect profile, return value (substituting for the absent output schema), and the sibling relationship. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter's description already tells the agent to find the ID via integrations_connections_list. The tool description adds no further parameter meaning, so the 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?
States a specific verb ('Enable') and resource ('a connection'), then elaborates the exact effect: re-enabling a disabled connection for integrations_execute and workflow steps. It explicitly names its opposite, integrations_disable, so an agent can distinguish the pair without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when this applies ('a disabled connection') and names the inverse tool for the opposite situation. It stops short of stating preconditions or failure modes (e.g. what happens if the connection is already enabled), so it is strong but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
integrations_executeIntegrations: executeAInspect
Run an operation on a connected provider. Calls the provider live with the project's first enabled connection to it, using inputs given as key=value pairs or a JSON object, and may incur the provider's charges. The API currently runs only the claude provider (inputs prompt, system_prompt, model, max_tokens); other providers return an error, so use them in workflow steps via workflows_integration_add. Returns JSON.
| Name | Required | Description | Default |
|---|---|---|---|
| input | No | Input parameter as key=value. Repeatable. | |
| inputs | No | Inputs as a JSON object, e.g. '{"prompt":"hello"}' | |
| provider | Yes | Provider key | |
| operation | Yes | Operation key (see 'integrations get <provider>') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnlyHint=false, openWorldHint=true, destructiveHint=false): it warns the call is live, may incur the provider's charges, uses the project's first enabled connection, is limited to claude, and errors for other providers. The charge warning and first-connection behavior are exactly the kind of risk context annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the core action and ending with the return format. The provider-specific caveat is packed in but every clause carries information; only marginal tightening is possible.
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 live, charge-incurring, open-world call with no output schema, it covers the essentials: input formats, provider limitation, cost warning, connection selection, and return type. It lacks detail on error shapes other than the non-claude case and any timeout/rate-limit 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%, so the baseline is 3, but the description adds real meaning by explaining the two input styles (key=value pairs vs. a JSON object) and enumerating the claude operation's inputs (prompt, system_prompt, model, max_tokens). It does not document how to discover non-claude operation keys beyond pointing at 'integrations get'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Run an operation on a connected provider') and immediately scopes it to a live call against the first enabled connection. It distinguishes itself from siblings like integrations_test, integrations_get, and workflows_integration_add by naming the workflow route explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear when-not and alternative: only the claude provider runs here, and other providers 'return an error, so use them in workflow steps via workflows_integration_add.' It does not contrast with other integration siblings (integrations_test, integrations_get), but the primary routing decision is spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
integrations_getIntegrations: getARead-onlyInspect
Show details and operations for one provider. Shows the provider's description, auth type and each operation's key, name and description. Operation keys are what integrations_execute and workflow integration steps (workflows_integration_add) take. It does not say whether the project is connected; integrations_connections_list does.
| Name | Required | Description | Default |
|---|---|---|---|
| provider | Yes | Integration provider key (e.g. claude, slack, hubspot) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered; the description adds real value by disclosing the return payload shape (description, auth type, per-operation key/name/description) in the absence of an output schema. It also draws an explicit boundary around what the tool does NOT report (project connection state), which prevents a common misread.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with purpose, then return contents, then downstream consumers, then the exclusion. Every sentence carries distinct information with no repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, single-parameter tool with no output schema, the description covers purpose, return shape, downstream key usage, and scope boundaries. An agent has everything needed to call it correctly and interpret the result.
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 the single 'provider' parameter is fully documented with concrete examples (claude, slack, hubspot). The description only says 'one provider' without adding format or lookup rules beyond the schema, so the 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?
States a specific verb (Show) and resource (details and operations for one provider) and enumerates exactly what is returned: provider description, auth type, and each operation's key/name/description. It is clearly distinguishable from integrations_list (all providers) and integrations_connections_list (connection status).
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?
Explains the downstream use of the returned operation keys ('what integrations_execute and workflows_integration_add take') and explicitly rules out connection status, routing the agent to integrations_connections_list for that. It never states a plain 'use this when you need X' trigger, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
integrations_listIntegrations: listARead-onlyInspect
List available integration providers. Start here when connecting a third-party service. Shows each provider's key, category, auth type (api_key or oauth2) and operation count; providers turned off for this project are left out. Next, read a provider with integrations_get, then connect it with integrations_connect (API key) or integrations_oauth_configure (OAuth).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only safety (readOnlyHint=true, openWorldHint=false). The description adds genuinely non-obvious behavior: providers disabled for the project are omitted, and each result carries key, category, auth type (api_key vs oauth2) and operation count. This pre-empts confusion about missing providers and tells the agent what it can branch on. It stops short of full transparency only because it doesn't characterize ordering, completeness guarantees, or response envelope.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the purpose, then the entry-point instruction, then the field list and exclusions, then the next-step routing. Every clause carries information an agent needs; nothing is repeated from the title or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no input parameters and no output schema, the description takes on the job of explaining the return shape, which it does (key, category, auth type, operation count) along with the filtering caveat about disabled providers. Nothing required to call or interpret this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing to disambiguate and the baseline is 4. The description does not need to carry parameter meaning, and appropriately spends its words on the returned provider fields instead.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List available integration providers') and immediately scopes it in the ecosystem by naming the follow-on siblings integrations_get, integrations_connect and integrations_oauth_configure. An agent can distinguish this from integrations_connections_list or integrations_test without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit entry-point guidance ('Start here when connecting a third-party service') plus an ordered workflow: list, then read with integrations_get, then connect via integrations_connect or integrations_oauth_configure depending on auth type. The condition selecting each alternative is named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
integrations_oauth_callback_urlIntegrations: oauth callback urlARead-onlyInspect
Print the redirect URL to add to OAuth app configurations (same for every provider). Prints only the dashboard redirect URL for this project, worked out locally from the API address and project id without an API call. Give it to the user to add to their OAuth app at the provider before integrations_oauth_configure; integrations_oauth_status shows it with the provider's setup state.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description nonetheless adds real behavioral context: it is computed locally without an API call, scoped to this project's dashboard redirect, and identical across every provider. That is genuinely useful and non-redundant.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core output, then scoping/computation detail, then the workflow placement. No filler and nothing repeated from the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but the description states what is printed (the redirect URL) and that it is project-scoped and provider-independent. For a zero-arg, no-API read, this is complete enough to call 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?
Zero parameters, so the baseline is 4; there is no parameter surface for the description to explain. Nothing is missing here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('Print') plus resource ('the redirect URL to add to OAuth app configurations'), and it explicitly disambiguates from siblings by naming integrations_oauth_configure and integrations_oauth_status. An agent can tell exactly what this returns and how it differs from the other oauth tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit ordering guidance: give the URL to the user 'before integrations_oauth_configure'. It also names the alternative (integrations_oauth_status) and how it differs (shows the URL alongside provider setup state), so the when-to-use choice is fully resolved.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
integrations_oauth_configureIntegrations: oauth configureADestructiveInspect
Set the OAuth client ID + secret for a provider. Saves the client ID and secret of an OAuth app the user created at the provider and enables it for the project (disable saves it switched off). Each run replaces the previous settings, so social sign-in turns off unless use_social_sign_in is passed again. Afterwards users connect from the dashboard or with integrations_oauth_connect. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| disable | No | Save the credentials but mark the provider disabled | |
| provider | Yes | Provider key (e.g. slack, google, github) | |
| client_id | No | OAuth client ID for this tenant. Prompted if omitted. | |
| client_secret | No | OAuth client secret. Prompted (hidden) if omitted. | |
| use_social_sign_in | No | Also expose this provider as a social sign-in option for end users |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint=true annotation, it discloses a critical non-obvious trait: each run replaces prior settings, silently disabling social sign-in unless use_social_sign_in is re-passed. It also states the disable branch saves credentials but switches off, and advises user confirmation for a destructive write.
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?
Purpose is front-loaded in the first sentence, followed by scope, replacement semantics, next step, and caution. Every sentence is load-bearing, though the second sentence partially restates the first's scope without new 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?
There is no output schema, so the description carries the return/next-step burden and does so by naming integrations_oauth_connect and the dashboard as the connection path. For a destructive 5-param mutation, the coverage of replacement behavior and caution 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 already 100%, so the baseline is 3. The description adds meaning by explaining the two behavioral flags: 'disable saves it switched off' and social sign-in re-enables only when use_social_sign_in is passed, which goes slightly beyond the raw schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Set the OAuth client ID + secret for a provider') and clarifies exactly what is being saved and enabled. An agent can distinguish it from integrations_oauth_connect (which connects users) and oauth_google_configure without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context (the app must already exist at the provider) and names the follow-up tool integrations_oauth_connect plus the dashboard as the way users connect. It also says to check with the user before running. It stops just short of explicitly contrasting with the sibling oauth_google_configure path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
integrations_oauth_connectIntegrations: oauth connectAInspect
Connect via the browser OAuth flow (starts a local listener). Opens the provider's sign-in page in a browser on this machine and waits up to five minutes for the callback on localhost (port 8745 by default), then creates the connection. A person must complete the sign-in, and the provider must first be set up with integrations_oauth_configure; for API-key providers use integrations_connect.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Friendly name for this connection (default: "<provider> connection") | |
| port | No | Local port for the OAuth callback (default: 8745) | |
| no_open | No | Don't try to open the browser automatically — just print the URL | |
| timeout | No | Seconds to wait for the OAuth callback before giving up (default: 300) | |
| provider | Yes | Provider key (e.g. slack, google, github) | |
| user_connection | No | Make this a user-scoped connection (only the current user sees it). Default: tenant-wide. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false); the description adds substantial behavioral context beyond that: it starts a local listener, opens a browser, waits up to five minutes, and requires a human to complete the sign-in. The prerequisite and human-in-the-loop requirement are exactly the kind of context an agent needs and cannot get from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences that front-load the core action and mechanism, then append prerequisites and the sibling alternative. Every clause earns its place with no repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a human-in-the-loop OAuth flow with six documented parameters and no output schema, the description covers the flow, timing, defaults, prerequisite, and the correct alternative tool. Nothing an agent needs to select or invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters (including defaults for port 8745 and the 300s timeout) are already documented in the schema. The description echoes the port and timeout defaults but adds no syntax or format detail beyond what the schema provides, 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?
States a specific verb and mechanism ('Connect via the browser OAuth flow') and then explains exactly what happens: opens the provider's sign-in page, waits for the callback on localhost, and creates the connection. It is clearly distinguishable from the sibling `integrations_connect` (API-key providers) and `integrations_oauth_configure` (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?
Explicit when/when-not guidance: use this for browser OAuth, use `integrations_connect` for API-key providers, and the provider must first be configured with `integrations_oauth_configure`. The alternative tool is named directly with the condition that selects it, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
integrations_oauth_statusIntegrations: oauth statusARead-onlyInspect
Show OAuth client setup status for a provider. Shows whether a client ID is saved for the provider, whether it is enabled and also used for end-user social sign-in, and the redirect URL its OAuth app must allow. Check it before integrations_oauth_configure, or after to confirm the credentials were saved.
| Name | Required | Description | Default |
|---|---|---|---|
| provider | Yes | Provider key (e.g. slack, google, github) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds useful behavioral context by enumerating what the status reports: whether a client ID is saved, whether it is enabled and used for social sign-in, and the required redirect URL. It does not cover edge cases such as unknown providers, but that is a minor gap given the annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core purpose, followed by the specific fields returned and then the usage cue. No sentence is redundant and every part earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining return values and does so clearly: saved client ID, enabled state, social sign-in usage, and redirect URL. For a one-parameter, read-only status tool, this gives an agent everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single `provider` parameter is fully documented in the schema with examples (slack, google, github). The description implies the tool operates on a provider but adds no syntax or format detail beyond what the schema already provides, so the baseline of 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 states a specific verb and resource: 'Show OAuth client setup status for a provider.' It distinguishes this tool from the sibling `integrations_oauth_configure` by naming it as the write-side alternative, so an agent can tell the two apart without opening the schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit timing guidance: 'Check it before `integrations_oauth_configure`, or after to confirm the credentials were saved.' The alternative tool is named and the conditions for using this status check are clear, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
integrations_testIntegrations: testAInspect
Test a connection. Use after connecting, with an id from integrations_connections_list. The API currently only confirms the connection exists in this project and does not call the provider, so a pass does not prove the stored credentials work.
| Name | Required | Description | Default |
|---|---|---|---|
| connection_id | Yes | Connection ID. Find it with integrations_connections_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses a non-obvious and decision-critical behavioral limitation: the API only confirms project-level existence and never calls the provider, so a pass does not validate stored credentials. This is exactly the kind of caveat annotations cannot express, and it materially changes how an agent should interpret success.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the action and prerequisite come first, the caveat second. Nothing is redundant and no sentence is padding.
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 carries the burden of explaining what a successful result means — and it does so directly by warning that a pass proves only existence, not credential validity. Nothing needed to call or interpret the tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single parameter, so the schema already documents `connection_id` including where to find it. The description merely repeats that pointer, adding no new syntax or format detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Test a connection'), which cleanly separates it from siblings like integrations_connections_list (read) and integrations_execute (invoke). It doesn't explicitly contrast with those siblings, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear sequencing ('Use after connecting') and names the source of the required id (`integrations_connections_list`). It does not state when to prefer integrations_execute or integrations_get instead, so it lacks explicit alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
loginSign inAInspect
Log in to the Anythink platform with email and password. Returns a session token used for account and project management. For Google sign-in, use the 'login_google' tool.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | Email address | ||
| password | Yes | Password |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only carry destructiveHint=false, which says almost nothing for an auth tool. The description compensates by disclosing the return artifact ('Returns a session token used for account and project management'), which is essential since there is no output schema. It still omits failure behavior (invalid credentials), token lifetime/expiry, and whether logging in invalidates existing sessions.
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, no filler, and front-loaded: purpose first, then the return value, then the alternative-route caveat. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly supplies the return value and notes the token's downstream role. It stops short of documenting error/credential-failure behavior and token expiry, which an agent calling a login tool would benefit from.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both parameters are trivially self-documenting ('Email address', 'Password'), so the baseline 3 applies. The description adds no format, validation, or sourcing guidance 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?
States a specific verb (log in), the resource/credential mechanism (email and password), and the platform. It also names the sibling it is not (login_google), letting an agent distinguish it from login_google, login_direct, signup, and the oauth_* tools without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes Google sign-in to the 'login_google' tool, which is a clear when-to-use-elsewhere statement. However, other closely related siblings such as login_direct and oauth_google_configure are not addressed, so an agent in a Directus/SSO context still has to guess.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
login_directSign in to a project directlyAInspect
Store credentials directly for a project (bypasses billing login). Use this when you already have an org ID and API key or JWT token.
| Name | Required | Description | Default |
|---|---|---|---|
| orgId | Yes | Organization/tenant ID | |
| token | No | JWT access token | |
| apiKey | No | API key (ak_...) | |
| baseUrl | No | Override API base URL | |
| profile | No | Profile name to save as (defaults to org ID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=false, so the description must carry the behavioral load. It discloses that credentials are stored and billing login is bypassed, but says nothing about where credentials persist, whether an existing profile is overwritten, or what authentication/validation occurs.
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 sentences that are front-loaded with the core action and zero filler. Slightly terse for a credential-storing tool, 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?
For a tool that writes persistent credentials with no output schema, the description covers the basic purpose but omits operating details an agent would want: storage location, overwrite semantics, and success/failure behavior. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and all five parameters (orgId, token, apiKey, baseUrl, profile) are documented in the schema. The description only echoes org ID and API key/JWT, ignoring baseUrl and profile, so it adds no meaning beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: store credentials for a project. The parenthetical 'bypasses billing login' gestures at how it differs from the plain login path, but it never names a sibling tool (login, login_google, signup) outright, so differentiation is only partial.
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?
'Use this when you already have an org ID and API key or JWT token' gives a clear precondition for selecting this tool. It stops short of naming alternatives or when-not-to-use cases (e.g., use login_google for OAuth), so it is clear context without explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
login_googleSign in with GoogleAInspect
Sign in to the Anythink platform with Google. Opens the user's browser to Google's consent screen and waits for them to approve, then stores the session token. The browser step must be completed by the user; everything before and after is tool-driven. This does NOT pick a billing account or project — after it returns, call 'accounts_list' then 'accounts_use', and 'projects_list' then 'projects_use'. Needs a local browser, so it only works over stdio (not the hosted HTTP server).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give openWorldHint and destructiveHint; the description adds substantial context beyond them: the browser step requires human intervention, the tool blocks while waiting for approval, the session token is stored afterward, and it cannot run on the hosted HTTP server. These are real behavioral traits an agent must plan around.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with what the tool does, then the human-in-the-loop constraint, then the required follow-up sequence, then the environment restriction. Every sentence carries distinct, actionable information with no repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description covers the interaction flow, the user's required action, what is persisted, the post-call workflow, and the transport limitation. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description correctly implies a parameterless invocation and adds no misleading parameter claims.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Sign in to the Anythink platform with Google') and precisely describes the mechanism (opens browser to Google's consent screen, waits for approval, stores session token). It is clearly distinguishable from siblings like login_direct, signup, and oauth_google_configure.
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 what the tool does NOT do (pick a billing account or project) and names the exact follow-up calls in order: accounts_list then accounts_use, projects_list then projects_use. It also states the environment constraint (stdio only, not hosted HTTP). It does not contrast itself against login_direct/signup, so it stops short of full when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
logoutSign outAInspect
Remove the saved credentials for a project profile from local CLI config. Use this to disconnect from a project or clear a stale token; it deletes only the stored profile locally and does not revoke the token server-side or affect the project. Omit the profile to remove the currently active one. Run 'config_show' to see profile names.
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | Name of the profile to remove. Defaults to the active profile. See 'config_show' for names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=false; the description earns credit by explaining why — deletion is confined to local stored credentials, the server-side token is untouched, and the project is unaffected. It also discloses the default behavior when the profile is omitted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences; the destructive scope ('local only') is front-loaded ahead of the usage conditions and the sibling pointer. Zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-param, no-output-schema tool, this covers purpose, scope, default behavior, and where to find profile names. It does not mention success/failure feedback or what happens for a nonexistent profile, a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is fully documented, including its default and the 'config_show' lookup hint, which the description merely echoes. Baseline 3 applies because the description adds no syntax or format detail 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?
States a specific verb and resource ('remove the saved credentials for a project profile from local CLI config') with an explicit scope limiter ('locally'). An agent can distinguish this from config_show, config_remove, login, and projects_use without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear when-to-use conditions ('disconnect from a project or clear a stale token') and an explicit boundary ('does not revoke the token server-side or affect the project'), plus a pointer to 'config_show' for profile names. It stops short of naming a specific sibling as the alternative for related jobs (e.g. config_remove), so it is strong but not fully routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oauth_google_configureOauth: google configureADestructiveInspect
Set Google OAuth client ID and secret. Saves the Google Cloud OAuth client ID and secret that let the project's end users sign in with Google, and switches that sign-in on or off. It only works interactively, prompting for each value (blank keeps the current one), then prints the callback URL to add to the Google OAuth client. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the mutation risk is partly covered. The description adds non-obvious behavior beyond the annotations: interactive-only operation, per-value prompting with blank meaning 'keep current', and printing a callback URL to paste into the Google OAuth client. It confirms rather than merely repeats the destructive nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the core action, and each sentence carries distinct information (action, effect, interaction model, warning). Minor redundancy between 'Set Google OAuth client ID and secret' and 'Saves the Google Cloud OAuth client ID and secret' keeps it from a 5.
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 parameters, no output schema, and annotations covering the safety profile, the description fills the remaining gaps: it explains the interactive input flow, the callback URL it emits, and the destructive confirmation requirement. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has zero parameters, so the baseline is 4. The description still usefully explains how inputs are actually collected (interactive prompts, blank retains the current value), which compensates for the empty schema and tells the agent not to expect arguments.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Set Google OAuth client ID and secret') and adds the effect ('switches that sign-in on or off'), so the agent knows exactly what the tool does. It does not explicitly name a sibling such as oauth_google_status or integrations_oauth_configure to disambiguate, which keeps it just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives real usage context: the tool 'only works interactively, prompting for each value (blank keeps the current one)' and instructs the agent to 'check with the user before running it'. There is no explicit statement of when-not-to-use or which sibling to prefer instead, so it stops short of the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oauth_google_statusOauth: google statusARead-onlyInspect
Show Google OAuth configuration status. Reports whether Google sign-in for the project's end users is enabled and whether a client ID and secret are saved, without showing them. This covers user sign-in only; Google as an integration is handled by integrations_oauth_status and integrations_oauth_configure.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuinely useful behavior: that secret values are saved/checked but deliberately not returned ('without showing them'), which tells the agent not to expect credentials in the response. It stops short of describing pagination or exact return shape, but no output schema exists to carry 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?
Three short sentences, front-loaded with the purpose, then the reported fields, then the sibling boundary. Every sentence carries distinct information with no restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only status check with no output schema, the description supplies everything needed: what is inspected, that secrets are not exposed, and how it differs from the integration-level status tool. Nothing an agent needs to invoke it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, which is the baseline-4 case: there is nothing for the description to clarify, and it correctly signals a no-argument call. No parameter text is needed or missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Show Google OAuth configuration status') and immediately enumerates what it reports: sign-in enabled, client ID and secret saved. It also distinguishes itself from the similarly named sibling by scoping to end-user sign-in rather than integrations.
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 routes the agent by naming the alternatives, `integrations_oauth_status` and `integrations_oauth_configure`, and stating the condition that selects them ('Google as an integration'). The scope boundary is unambiguous, so an agent can pick between the two OAuth status tools without opening either schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_connectPay: connectAInspect
Set up a Stripe Connect account and start onboarding. Creates the project's Stripe Connect account and opens Stripe's hosted onboarding page in a browser, which must be finished before plans can take card payments. It prompts for business type, country and email, so it needs an interactive terminal. Check pay_status first.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only state readOnlyHint=false, destructiveHint=false, openWorldHint=false; the description adds substantial context beyond them — account creation, a browser-based hosted flow, mandatory completion before payments work, and interactive prompting for business type/country/email. It omits idempotency behavior (what happens on re-run if the account already exists) and failure/partial-completion handling, keeping it below 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?
Well front-loaded: the core action leads, then mechanics, then prerequisites. There is mild redundancy between the opening sentence ('Set up a Stripe Connect account and start onboarding') and the second ('Creates the project's Stripe Connect account...'), which could be merged without loss.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output-schema tool this is nearly complete: the agent knows the tool is interactive, browser-based, blocking, and must be preceded by pay_status. Only re-run/idempotency behavior is left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema declares zero parameters with additionalProperties=false, so the baseline is 4. The description slightly exceeds that by noting the tool interactively prompts for business type, country, and email, telling the agent that inputs are collected procedurally rather than passed as arguments.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Set up a Stripe Connect account and start onboarding', then details the concrete mechanism ('opens Stripe's hosted onboarding page in a browser'). This clearly separates it from siblings like pay_status, pay_plans_create, and pay_methods, which concern status/plans/payment methods rather than Connect account provisioning.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit sequencing rule ('Check `pay_status` first') and a precondition ('which must be finished before plans can take card payments'), plus the environmental requirement of an interactive terminal. It lacks an explicit when-not-to-use clause (e.g., what to do if an account already exists), so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_entitlementPay: entitlementARead-onlyInspect
Show the current user's access / trial entitlement. Reports whether the signed-in user (the one this tool runs as) has paid or trial access in the project's app: status, trial end and days left, subscription id, provider, product and expiry. Read-only. To look up another user, use pay_subscriptions_by_user.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered; the description reinforces "Read-only" and, with no output schema, usefully enumerates the returned fields (status, trial end/days left, subscription id, provider, product, expiry). It stops short of details like freshness or caching, but adds solid context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core purpose before the return payload and the alternative-tool pointer. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-param read tool with no output schema, the description supplies everything needed: identified subject, enumerated return fields, read-only nature, and a routing hint to the sibling for other users. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The scoping statement ("the one this tool runs as") correctly signals that no subject argument is accepted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action ("Show"/"Reports") on a precise resource (the signed-in user's paid or trial entitlement) and enumerates the reported fields. It is trivially distinguishable from the many pay_* siblings because it explicitly scopes to the current user.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit alternative and the condition that selects it: "To look up another user, use `pay_subscriptions_by_user`." The current-user scope is clearly implied, but it does not distinguish itself from close siblings like pay_status, pay_trial_status, or pay_subscriptions_check_access, so guidance is strong but not complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_methodsPay: methodsARead-onlyInspect
List saved payment methods. Lists the cards and other payment methods saved by the signed-in user as a customer of this project: type, brand, last four digits and expiry. It does not list your end users' cards or the card on your Anythink billing account. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnlyHint=true and openWorldHint=false, so the trailing 'Read-only' only confirms them. The description adds genuine value beyond annotations by disclosing the returned fields (type, brand, last four digits, expiry) and explicitly negating two likely confusions about whose cards are listed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action, then scope exclusions, then the safety note. The final 'Read-only' sentence is largely redundant with readOnlyHint, a minor redundancy rather than a structural flaw.
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 zero parameters, no output schema, and annotations covering safety and openness, the description supplies enough: what is listed, whose cards, which fields, and what is excluded. Slightly more detail on ordering or limits would round it out, but nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. It also implicitly confirms the tool is unfiltered and acts on the signed-in user's context rather than accepting an identity 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?
States a specific verb and resource ('List saved payment methods') and immediately narrows scope: cards saved by the signed-in user as a customer of this project, not end users' cards or the billing-account card. That scoping cleanly distinguishes it from siblings like pay_payment_options and pay_payments.
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 boundaries ('does not list your end users' cards or the card on your Anythink billing account') imply when this tool is the right one, but there is no explicit when-to-use instruction or named alternative for the cases it excludes. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_offers_activatePay: offers activateAInspect
Activate a paused offer. Sets an offer's status to active so its codes can be redeemed again, still subject to its validity dates and caps. Use it to undo pay_offers_pause or to reopen an expired offer.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Offer id (guid). Find it with pay_offers_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the write/safety profile (readOnlyHint=false, destructiveHint=false); the description adds substantive behavior beyond that, noting the activation is 'still subject to its validity dates and caps' and that it reverses a pause. It doesn't cover idempotency or authorization needs, but it adds real context over the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the action and effect, then the routing guidance. No filler or restated metadata.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter state-change tool with annotations covering the safety profile and no output schema, the description covers effect, constraints, and alternatives adequately. Auth requirements and failure modes are the only minor omissions.
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?
Only one parameter and schema description coverage is 100%, so the schema already documents 'id' including how to find it ('Find it with pay_offers_list'). The description adds nothing further about the parameter, which is the expected baseline when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Activate a paused offer') and immediately specifies the effect ('Sets an offer's status to active'). An agent can distinguish it from pay_offers_pause, pay_offers_update, and pay_offers_delete from the description alone.
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 names the sibling it reverses ('Use it to undo `pay_offers_pause`') and gives a second concrete use case ('reopen an expired offer'). The condition selecting this tool over its alternatives is stated rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_offers_add_codePay: offers add codeAInspect
Add a promo/referral code to an offer. Creates a code users enter to redeem the offer: a shared promo code, or with an owner user id, a personal referral code tied to that user. Returns the new code. There is no tool to remove a single code; codes go only when the offer is deleted with pay_offers_delete.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Offer id (guid). Find it with pay_offers_list. | |
| slug | No | Code slug (e.g. LAUNCH50); prompted for if omitted | |
| owner_user_id | No | Attach the code to a user (personal/referral code). Omit for a shared promo code. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnlyHint=false, destructiveHint=false, openWorldHint=false). The description adds genuinely non-derived behavior: the code is returned on success, and codes cannot be individually removed, only cascade-deleted with the offer. It stops short of describing error cases or whether adding a duplicate slug overwrites.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with no filler: purpose first, mode semantics second, lifecycle constraint last. Every sentence conveys information an agent would otherwise have to guess.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description usefully states the return ('the new code'), so return-value ambiguity is addressed. Combined with the lifecycle note and annotation-covered safety profile, the definition is nearly complete; only edge-case behavior on duplicate or invalid codes is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented, including the omit-for-shared rule on owner_user_id. The description restates that mode distinction but adds no new syntax, format, or constraint detail beyond what the schema carries, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add a promo/referral code to an offer') and immediately spells out the two creation modes: shared promo code vs. personal referral code tied to an owner user id. An agent can distinguish this from pay_offers_codes and pay_offers_user_code by the shared/personal framing alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear when-to-use context via the shared-vs-personal branching rule, and explicitly states the negative case: there is no removal tool, so codes only disappear when the offer is deleted with pay_offers_delete. It does not, however, explicitly contrast itself with the sibling pay_offers_user_code, which also deals with user codes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_offers_codesPay: offers codesARead-onlyInspect
List the promo/referral codes attached to an offer. Lists every code on one offer, both shared promo codes and per-user referral codes, with slug, owner (or shared), redemption count and created date. Read-only. To find a specific user's personal referral code, use pay_offers_user_code.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Offer id (guid). Find it with pay_offers_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered; the description reinforces 'Read-only' and, more usefully, discloses the returned fields (slug, owner/shared, redemption count, created date). It does not mention pagination or auth scope, keeping it just short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, zero waste, front-loaded with purpose and return shape before the disambiguation clause. 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?
There is no output schema, and the description compensates by enumerating the fields returned, which is exactly the right call for a list tool. Pagination/limit behavior is left unstated, a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the sole `id` parameter is already documented with a guid hint and a pointer to pay_offers_list. The description adds nothing about the parameter beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List the promo/referral codes attached to an offer') and immediately scopes it to one offer. It explicitly names the sibling it is not, pay_offers_user_code, so an agent can distinguish it without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit alternative and the condition that selects it: 'To find a specific user's personal referral code, use pay_offers_user_code.' This is a clear when-to-use-this-vs-that routing rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_offers_createPay: offers createAInspect
Create an offer (rewards via convenience flags or raw JSON). Creates an offer of kind discount, trial_extension or referral. A redeemer reward is required, as raw JSON or a shortcut such as trial days or discount percent; referrer reward, eligibility, caps and dates are optional. Discount offers also create a Stripe coupon. Add a code users can enter with pay_offers_add_code.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Offer kind: discount, trial_extension, or referral | |
| name | No | Offer display name | |
| status | No | Initial status: active (default), paused, or expired | |
| total_cap | No | Total redemption cap (omit for unlimited) | |
| valid_from | No | Offer valid-from (ISO date/time) | |
| description | No | Offer description | |
| eligibility | No | Eligibility rules as JSON, e.g. {"match":"all","rules":[{"type":"subscribed_to_plan","plan_ids":[1]}]} | |
| valid_until | No | Offer valid-until (ISO date/time) | |
| per_user_cap | No | Per-user redemption cap (default 1) | |
| redeemer_reward | No | Redeemer reward as JSON, e.g. {"type":"discount","percent_off":50,"duration":"once"} | |
| referrer_reward | No | Referrer reward as JSON (referral offers only) | |
| discount_percent | No | Shortcut: redeemer reward = N% discount (use --discount-duration for recurrence) | |
| discount_duration | No | Discount duration for --discount-percent: once, forever, repeating (default once) | |
| redeemer_trial_days | No | Shortcut: redeemer reward = trial extension of N days | |
| referrer_trial_days | No | Shortcut: referrer reward = trial extension of N days | |
| referrer_subscription_days | No | Shortcut: referrer reward = subscription extension of N days |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive write. The description adds genuinely useful behavior beyond that: discount offers also create a Stripe coupon (an external side effect), and it clarifies the required/optional structure of the payload. This is real added context, though it omits error conditions or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each carrying distinct payload: purpose, kinds, required/optional structure, and the Stripe-coupon plus next-step pointer. Front-loaded and free of filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 16-parameter mutation tool with no output schema, the description covers the required field, the shortcut-vs-JSON duality, the side effect of coupon creation, and the logical next step. Combined with full schema coverage and annotations, an agent has enough 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 description coverage is 100%, so the baseline is 3. The description adds conceptual meaning on top: it identifies redeemer_reward as required, explains that rewards can be given either as raw JSON or via shortcut flags (discount_percent, trial days), and notes referrer reward applies only to referral offers. Useful framing beyond the per-field schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Create) and resource (an offer), then enumerates the three offer kinds (discount, trial_extension, referral). This distinguishes it cleanly from siblings like pay_offers_update, pay_offers_add_code, and pay_offers_activate without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains what is required (a redeemer reward) versus optional (referrer reward, eligibility, caps, dates) and routes the agent to pay_offers_add_code for the follow-up step of attaching a code. It does not explicitly contrast when to reach for this versus update or activate, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_offers_deletePay: offers deleteADestructiveInspect
Permanently delete an offer and all its codes + redemptions (history is lost; trial bonuses already granted are preserved). Returns how many codes and redemptions were deleted and how many trial bonuses were kept. The offer's Stripe coupon is not removed. To stop redemptions while keeping the history, use pay_offers_pause instead. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Offer id (guid). Find it with pay_offers_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=true; the description goes far beyond by enumerating exactly what is destroyed (codes + redemptions, history lost), what survives (already-granted trial bonuses), and what is left untouched (the Stripe coupon). This is precisely the extra context the annotation bar asks for.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the destructive action and its consequences, and every sentence carries information (scope, return values, coupon caveat, alternative, safety directive). The final caution sentence lightly overlaps the destructiveHint annotation, keeping it just short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool with no output schema, the description covers blast radius, preserved data, side effects on Stripe, return shape, and the safer alternative. Nothing an agent needs before invoking it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single id parameter is fully documented in the schema ('Offer id (guid). Find it with pay_offers_list.'). The description adds nothing about the parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: 'Permanently delete an offer and all its codes + redemptions'. It also explicitly distinguishes itself from the sibling pay_offers_pause, so an agent can route correctly without opening other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives both the exclusion and the alternative: 'To stop redemptions while keeping the history, use pay_offers_pause instead.' It also adds a procedural guideline ('check with the user before running it'), leaving nothing to inference about when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_offers_getPay: offers getARead-onlyInspect
Show one offer by id (guid). Shows one offer in full: kind, description, status, primary code, redeemer and referrer rewards, eligibility rules, per-user and total caps, validity dates and linked Stripe coupon id. Read-only; its codes and redemptions come from pay_offers_codes and pay_offers_redemptions.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Offer id (guid). Find it with pay_offers_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered; the description adds real value by disclosing the full set of returned attributes and clarifying that codes/redemptions live in sibling tools rather than this response. No pagination or error behavior is mentioned, but for a single-record read that is minor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action; the long field enumeration is dense but each item is informative rather than filler. Slightly list-heavy but no wasted sentences.
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, enumerating the returned fields is the right compensation, and the cross-references to pay_offers_codes/pay_offers_redemptions prevent misuse. A brief note on not-found behavior or id format would make it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single id parameter is already documented as 'Offer id (guid). Find it with pay_offers_list.' The description restates the guid type but adds no format, validation, or sourcing detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope ('Show one offer by id (guid)') and then enumerates the exact fields returned (kind, status, caps, validity dates, Stripe coupon id). An agent can distinguish it from pay_offers_list without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies single-record retrieval by id and routes the agent elsewhere for related data ('its codes and redemptions come from pay_offers_codes and pay_offers_redemptions'), which is a useful when-not signal. It does not explicitly contrast against pay_offers_list in the description body, though the schema param description points there.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_offers_listPay: offers listARead-onlyInspect
List offers. Lists the project's offers (discounts, trial extensions and referral schemes that users redeem with a code): id, name, kind, primary code, redeemer and referrer rewards, and status. Read-only. Offers are separate from subscription plans (pay_plans_list).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description reinforces the safety profile ('Read-only') while adding real value: the exact fields returned (id, name, kind, primary code, rewards, status) and the scoping notion that these are project-level offers. No contradiction with the structured hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then a compact parenthetical that defines the domain, followed by two short clarifying sentences. 'List offers.' followed by 'Lists the project's offers' is mildly redundant, but the whole passage is tight and every other clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description's explicit enumeration of returned fields is exactly the information an agent would otherwise lack. Combined with the read-only note and sibling differentiation, nothing needed to call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4 and there is nothing for the description to disambiguate. The field enumeration it provides effectively compensates by describing what the (empty-input) call yields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list offers) and immediately defines the domain: discounts, trial extensions, and referral schemes redeemed with a code. It also names the neighbouring concept it is NOT (`pay_plans_list`), so an agent can distinguish it from that sibling without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes clear read-only list context and explicitly separates offers from subscription plans, pointing at the sibling that covers the adjacent concept. It stops short of stating when to prefer `pay_offers_get` (single offer) over this bulk listing, so the routing guidance is slightly incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_offers_pausePay: offers pauseADestructiveInspect
Pause an offer. Sets an offer's status to paused so none of its codes can be redeemed; past redemptions and rewards already granted stay. Reversible with pay_offers_activate. Prefer this to pay_offers_delete to stop an offer without losing its history. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Offer id (guid). Find it with pay_offers_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool destructive and non-read-only. The description adds concrete behavior: codes become unredeemable, past redemptions and rewards are preserved, the operation is reversible, and user confirmation is advised before mutating data.
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?
Five short sentences front-load purpose, effect, reversibility, the preferred alternative, and a safety caution. Each sentence carries distinct, useful information for invoking the tool correctly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with no output schema, the description covers effect, reversibility, alternatives, and caution. The annotations carry safety hints, so nothing material is missing for correct 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?
The schema has 100% description coverage for the single required `id` parameter, including guidance to find it with `pay_offers_list`. The description adds no further parameter meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Pause an offer') and explains the resulting status change and its effect on codes. It distinguishes the tool from siblings `pay_offers_activate` (reversal) and `pay_offers_delete` (alternative for stopping without history loss).
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 recommends preferring this over `pay_offers_delete` when stopping an offer without losing history, and names `pay_offers_activate` as the reversal tool. This gives the agent both the alternative and the condition that selects it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_offers_redemptionsPay: offers redemptionsARead-onlyInspect
List redemptions for an offer. Lists who redeemed one offer, paged: the redeemer, the status of their reward, the referrer if any and the referrer's reward status, and when it was redeemed. Read-only; use it to check whether referral rewards were granted.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Offer id (guid). Find it with pay_offers_list. | |
| page | No | Page number (default: 1) | |
| limit | No | Items per page (default: 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the 'Read-only' restatement is redundant, but the description adds real value by enumerating the payload fields (redeemer, reward status, referrer, redemption time) and noting results are paged. It omits auth requirements, ordering, and default page size behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded in the first sentence, followed by payload detail and a usage note. It is a touch wordy with the duplicated 'List redemptions'/'Lists who redeemed', but every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly compensates by describing the returned fields, and annotations cover the safety profile. It is nearly complete for a read-only paged list, missing only pagination/ordering expectations.
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 the schema already documents id, page, and limit with defaults. The description only implies paging ('paged') and adds no syntax or format detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('List redemptions for an offer') and details exactly what is returned (redeemer, reward status, referrer, referrer reward status, redemption time), which separates it from pay_offers_list/get. It never names or contrasts a sibling such as pay_offers_user_code, so it stops short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use it to check whether referral rewards were granted' gives a concrete use context, so an agent knows why it would call this. There is no explicit when-not guidance or named alternative for other offer-scoped lookups.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_offers_updatePay: offers updateADestructiveInspect
Update an offer (patch — only supplied fields change; kind is immutable). Changes an offer's name, description, rewards, eligibility, caps, dates or status; omitted fields are kept. Setting status to paused or expired stops its codes being redeemed. Changing a discount reward does not update the Stripe coupon made at creation. For status alone, pay_offers_pause and pay_offers_activate are simpler. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Offer id to update. Find it with pay_offers_list. | |
| name | No | Offer display name | |
| status | No | Set status: active, paused, or expired | |
| total_cap | No | Total redemption cap (omit for unlimited) | |
| valid_from | No | Offer valid-from (ISO date/time) | |
| description | No | Offer description | |
| eligibility | No | Eligibility rules as JSON, e.g. {"match":"all","rules":[{"type":"subscribed_to_plan","plan_ids":[1]}]} | |
| valid_until | No | Offer valid-until (ISO date/time) | |
| per_user_cap | No | Per-user redemption cap (default 1) | |
| redeemer_reward | No | Redeemer reward as JSON, e.g. {"type":"discount","percent_off":50,"duration":"once"} | |
| referrer_reward | No | Referrer reward as JSON (referral offers only) | |
| discount_percent | No | Shortcut: redeemer reward = N% discount (use --discount-duration for recurrence) | |
| discount_duration | No | Discount duration for --discount-percent: once, forever, repeating (default once) | |
| redeemer_trial_days | No | Shortcut: redeemer reward = trial extension of N days | |
| referrer_trial_days | No | Shortcut: referrer reward = trial extension of N days | |
| referrer_subscription_days | No | Shortcut: referrer reward = subscription extension of N days |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag destructive/not-read-only; the description goes well beyond them by disclosing patch semantics (omitted fields kept), the immutability of kind, the side effect that pausing/expiring halts code redemption, and the non-obvious caveat that changing a discount reward does not update the Stripe coupon created at creation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and constraint, then side effects, alternatives, and caution in a logical order. The clause enumerating updatable fields ('name, description, rewards, eligibility, caps, dates or status') partially restates the schema, which is the one bit of low-yield text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 16-parameter mutation with no output schema, it covers mutation semantics, side effects, and safety guidance well. It says nothing about what the call returns or error conditions, though with no output schema the return-value burden is lower.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 16 fields. The description reinforces the mutable field set and the immutability constraint on kind, but adds no syntax or format detail beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update an offer') and immediately scopes it with patch semantics ('only supplied fields change; kind is immutable'), which distinguishes it from pay_offers_create and from the narrower pay_offers_pause/activate siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the status-only case to the simpler siblings ('For status alone, pay_offers_pause and pay_offers_activate are simpler') and adds a precondition ('check with the user before running it'). Both when-to-use and when-to-use-something-else are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_offers_user_codePay: offers user codeAInspect
Look up a user's personal referral code. Returns one user's personal referral code (by numeric user id) with its slug, offer name and redemption count. If the user has no code yet the server generates one, so this call can create a code. To list all codes on one offer, use pay_offers_codes.
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | Yes | Numeric user id. Find it with users_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, and the description explains exactly why: if no code exists the server generates one, so the call can create a code. It also discloses the returned fields (slug, offer name, redemption count), which the absent output schema would otherwise leave unknown. This is meaningful disclosure beyond the annotations rather than a restatement of them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, each earning its place: purpose, return shape, side effect, and alternative. The purpose and the create-on-demand caveat are front-loaded where the agent will see them.
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 supplies the return fields and the write side effect, and it routes to the correct alternative. An agent has everything needed to call this correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter is documented there (including how to find it with users_list). The description only restates 'by numeric user id', adding no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (look up a user's personal referral code) with explicit scope (one user, by numeric user id). It also names the sibling it is not (pay_offers_codes), so an agent can distinguish the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the exact selection rule and names the alternative: use this to fetch one user's code, use `pay_offers_codes` to list all codes on an offer. No inference required to route correctly among the many pay_* siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_payment_optionsPay: payment optionsARead-onlyInspect
Show available payment providers for a platform/storefront. Shows which payment providers (such as Stripe or Apple in-app purchase) the project offers to an app on a platform (ios, android or web), optionally for an App Store storefront country code. Read-only; use it to see what a client app will be offered.
| Name | Required | Description | Default |
|---|---|---|---|
| platform | No | Client platform: ios, android, or web | |
| storefront | No | Storefront code (ISO 3166-1 alpha-3, e.g. GBR) — optional |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the 'Read-only' sentence largely repeats structured data. The description does add real context by framing the result as what a client app will be offered on a given platform/storefront, but says nothing about caching, freshness, or return shape.
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?
It is short enough, but the first two sentences are redundant ('Show available payment providers' immediately followed by 'Shows which payment providers...'). The redundant opening costs a point against otherwise efficient structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only lookup with no output schema, the description covers scope, inputs, and intent adequately. It could say more about the shape of the returned provider list, but nothing essential for invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both platform values (ios/android/web) and the storefront country code. The description restates the platform enum and the optional storefront without adding syntax or example beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (show) and resource (available payment providers) scoped to a platform/storefront, which is clearly distinct from pay_methods or pay_connect work. It never explicitly differentiates itself from the closest siblings (pay_methods, pay_plans_list), so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete use case: 'use it to see what a client app will be offered', which tells the agent the context (client-facing preview). There is no explicit when-not-to-use or named alternative tool, so it is clear context but not full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_paymentsPay: paymentsARead-onlyInspect
List recent payments. Lists card payments the project has taken from its end users through AnythinkPay (Stripe), with id, amount, currency, status, description and date, paged by page and limit. Read-only; there is no refund tool. For recurring billing records use pay_subscriptions_list.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default: 1) | |
| limit | No | Items per page (default: 25) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds real context beyond that: it enumerates the returned fields, states pagination via page/limit, and discloses the negative capability (no refunds). It stops short of noting rate limits or sort order, so it is not 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?
Three sentences, front-loaded with the action, then scope, then routing. Efficient overall, though the opening 'List recent payments. Lists card payments...' is a mild restatement that could be merged.
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?
There is no output schema, and the description compensates by naming the returned fields (id, amount, currency, status, description, date). With two optional, fully documented params and annotations covering safety, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are already documented with their defaults. The phrase 'paged by page and limit' restates what the schema says and adds no syntax, bounds, or edge-case detail. 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?
Specific verb+resource ('List recent payments') with the exact scope: card payments taken from end users via AnythinkPay (Stripe). It also names the sibling it is not, `pay_subscriptions_list`, so an agent can distinguish it without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: 'For recurring billing records use pay_subscriptions_list.' It also rules out a whole class of intent with 'there is no refund tool,' telling the agent not to search for one. When-to-use and when-not-to-use are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_plans_createPay: plans createAInspect
Create a subscription plan (prompts for missing fields). Creates a subscription plan (a recurring price end users can buy), defaulting to gbp, monthly, type web and active, and once Stripe Connect is onboarded syncs a matching Stripe product and price. Nobody is charged until a user subscribes. Set the Apple product id to map an in-app purchase to it.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Display name shown to subscribers | |
| type | No | Plan type (create default: web; update keeps the current value) | |
| amount | No | Recurring amount (decimal, in the plan's currency) | |
| currency | No | Currency code (create default: gbp; update keeps the current value) | |
| inactive | No | Mark the plan inactive (hidden from picker) | |
| interval | No | Billing interval: day, week, month, year (create default: month; update keeps the current value) | |
| plan_name | No | Internal plan identifier (e.g. "trial", "monthly", "annual") | |
| reference | No | Internal reference / external id (optional) | |
| tier_rank | No | Plan tier rank (update keeps the current value) | |
| trial_days | No | Trial period length in days (optional) | |
| description | No | Description | |
| product_name | No | Stripe product display name (optional, defaults to Name) | |
| interval_count | No | Number of intervals per billing cycle (create default: 1; update keeps the current value) | |
| apple_product_id | No | Apple App Store product id for this plan (optional) | |
| product_description | No | Stripe product description (optional) | |
| apple_subscription_group_id | No | Apple subscription group id (optional; auto-filled on first verify) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare this is a non-read-only, non-destructive, non-open-world write, so safety is partly covered. The description adds real value beyond that: interactive prompting for missing fields, the defaults applied (gbp, monthly, type web, active), the downstream Stripe product/price sync gated on Connect onboarding, and the reassurance that nobody is charged until a user subscribes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and the interactive behavior. The second sentence is a long multi-clause run-on packing defaults, Stripe sync, billing reassurance and Apple mapping, but every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 16-param, zero-required, no-output-schema tool, the description covers the key agent questions: defaults, interactive prompting, the Stripe side effect, and billing safety. It could say a bit more about what is returned or about the all-optional parameter set, but it is largely sufficient with annotations covering the write profile.
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 and the schema already documents every field including its create-defaults. The description only reinforces the same defaults and briefly explains apple_product_id's mapping purpose, adding little beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create a subscription plan') and even parenthesizes what a plan is ('a recurring price end users can buy'), so the agent knows the domain object. It does not explicitly contrast with sibling pay_plans_update or pay_plans_list, but the create verb makes the distinction obvious.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'create' and the note about setting the Apple product id to map an in-app purchase hints at a specific use case. However, there is no explicit when-to-use/when-not guidance or reference to the alternative tools (pay_plans_update, pay_plans_list) for evolving or inspecting existing plans.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_plans_deletePay: plans deleteADestructiveInspect
Delete a subscription plan. Removes a subscription plan so it can no longer be chosen. Existing subscriptions on it, and its Stripe product and price, are left in place and keep billing. To hide a plan reversibly, use pay_plans_update with inactive instead. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Plan id to delete. Find it with pay_plans_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as destructive, but the description adds critical side-effect context: existing subscriptions and the Stripe product/price are left in place and keep billing. It also warns that the tool changes or deletes existing data and should be confirmed with the user first. This goes well beyond the destructiveHint annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, then consequences, then the reversible alternative, then the safety warning. Every sentence earns its place and there is no redundant or vague filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive single-parameter tool with no output schema, the description covers what is deleted, what is left intact, the reversible alternative, and the user-confirmation requirement. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single `id` parameter is fully documented in the schema, including how to find it with pay_plans_list. The description does not add any parameter-level meaning beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a specific verb and resource: 'Delete a subscription plan.' It further clarifies the effect ('so it can no longer be chosen'), distinguishing it from pay_plans_update and sibling tools. An agent can identify exactly what this tool does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit alternative for a reversible hide: use `pay_plans_update` with inactive instead. It also adds a clear safety condition: 'check with the user before running it.' Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_plans_getPay: plans getARead-onlyInspect
Show one plan by id. Shows one of the project's subscription plans in full, including type, price and interval, trial, Stripe product name and description, reference, Apple product and subscription group ids, and whether it is active. Read-only; browse plans with pay_plans_list.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Plan id (integer). Find it with pay_plans_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so 'Read-only' merely repeats structured data. The real added value is the enumeration of exactly what the call returns, which substitutes for the missing output schema and tells the agent what data it will get back. It still omits error behavior for a non-existent or inaccessible plan id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action before the detail. The longer field enumeration in sentence two earns its place because no output schema exists to carry that information, and the alternative tool is named last.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool whose safety profile is fully covered by annotations, the description supplies the return contents, the discovery path for the id, and the sibling to use for browsing. Nothing essential to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single `id` parameter is already documented as an integer discoverable via pay_plans_list. The description's 'by id' adds nothing beyond the schema, so the baseline 3 for full schema coverage is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Show one plan by id') scoped to a single project subscription plan, and it enumerates the exact contents of the record (type, price/interval, trial, Stripe product name/description, reference, Apple product and subscription group ids, active flag). This clearly separates it from pay_plans_list without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly routes the agent to the alternative: 'browse plans with `pay_plans_list`', and the schema reinforces this with 'Find it with pay_plans_list.' It clearly establishes the single-item vs browse split, though it states no exclusions or preconditions (e.g., what happens if the id is unknown).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_plans_listPay: plans listARead-onlyInspect
List subscription plans. Lists the project's own subscription plans, the recurring prices its end users can subscribe to: id, internal plan name, display name, price per interval, trial days, Apple product id and whether active. Read-only. Not the same as plans, which lists Anythink's hosting plans for projects.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the description's 'Read-only' is confirmation rather than new information. It does add genuinely useful behavior context by enumerating the returned fields (id, names, price per interval, trial days, Apple product id, active flag), which matters since there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then the field inventory, then the exclusion. The opening two sentences slightly restate each other ('List subscription plans. Lists the project's own subscription plans...'), a minor redundancy in an otherwise tight definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no parameters, the description carries the return-shape information itself and does so thoroughly, plus a disambiguation from the similarly named `plans` tool. Nothing an agent needs to call this correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline is 4. No parameter guidance is needed or missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List subscription plans') and immediately defines the resource as the project's own recurring prices for end users. It explicitly separates itself from `plans`, so an agent can route correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear retrieval context (the project's own subscription plans, read-only) and an explicit negative exclusion against `plans`. It does not spell out when to prefer pay_plans_get for a single plan, so it stops short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_plans_updatePay: plans updateADestructiveInspect
Update a subscription plan (any --flag overrides; unset = keep). Changes a subscription plan; omitted fields keep their current values, and active or inactive shows or hides it from the plan picker. Changing the amount, currency or interval points the plan at a new Stripe price for new sign-ups; existing subscriptions keep their old price. Prefer inactive over pay_plans_delete. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Plan id to update. Find it with pay_plans_list. | |
| name | No | Display name shown to subscribers | |
| type | No | Plan type (create default: web; update keeps the current value) | |
| active | No | Mark the plan active | |
| amount | No | Recurring amount (decimal, in the plan's currency) | |
| currency | No | Currency code (create default: gbp; update keeps the current value) | |
| inactive | No | Mark the plan inactive (hidden from picker) | |
| interval | No | Billing interval: day, week, month, year (create default: month; update keeps the current value) | |
| plan_name | No | Internal plan identifier (e.g. "trial", "monthly", "annual") | |
| reference | No | Internal reference / external id (optional) | |
| tier_rank | No | Plan tier rank (update keeps the current value) | |
| trial_days | No | Trial period length in days (optional) | |
| description | No | Description | |
| product_name | No | Stripe product display name (optional, defaults to Name) | |
| interval_count | No | Number of intervals per billing cycle (create default: 1; update keeps the current value) | |
| apple_product_id | No | Apple App Store product id for this plan (optional) | |
| product_description | No | Stripe product description (optional) | |
| apple_subscription_group_id | No | Apple subscription group id (optional; auto-filled on first verify) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, and the description adds real substance on top: omitted fields keep current values, active/inactive controls plan-picker visibility, and changing amount/currency/interval repoints the plan to a new Stripe price for new sign-ups while existing subscriptions keep the old price. It does not say whether the change is reversible or what the response returns, but for an update tool the mutation consequences are well disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening two clauses are near-duplicates — 'any --flag overrides; unset = keep' and 'omitted fields keep their current values' say the same thing — which is wasted space in an otherwise dense paragraph. The destructive warning is correctly placed at the end where it is likely to be read.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 18-parameter destructive mutation with no output schema, the description covers the update-vs-create semantics, the picker visibility effect, the Stripe price side effect, and the delete alternative. Nothing an agent needs before calling it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% across 18 params, so the baseline is 3 and each field is already documented. The description still adds a cross-cutting rule the schema only states per-field ('any --flag overrides; unset = keep'), clarifying the patch semantics for all 18 parameters at once.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Update a subscription plan') and immediately scopes it to the update semantics (any --flag overrides; unset = keep), which cleanly separates it from pay_plans_create and pay_plans_delete in the sibling list. The Stripe-price side effect is also named, so the agent knows this is not a plain field patch.
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 routes the agent away from a sibling: 'Prefer inactive over `pay_plans_delete`.' It also states a precondition for invoking it at all ('check with the user before running it'), so both when-to-use and when-to-prefer-an-alternative are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_statusPay: statusARead-onlyInspect
Show Stripe Connect account status. Reads the project's Stripe Connect account, the account your end users' card payments are paid into: account id, whether onboarding is complete, and whether charges and payouts are enabled. Read-only. If there is no account or onboarding is unfinished, use pay_connect.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so 'Read-only' is partly redundant, but the description goes further by explaining that the account is the destination of end users' card payments and that status is expressed as discrete onboarding/charges/payouts flags. It does not discuss auth requirements or freshness of the status, so it is good rather than exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, none wasted: definition, field inventory, safety/behavior cue, and fallback routing. The most decision-relevant content (what it returns, when to go elsewhere) 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?
With no output schema, the description carries the return-value burden and does so adequately by naming the three status fields. For a zero-parameter read tool with annotations covering safety, nothing an agent needs to select or call it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. No misleading parameter claims are made.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Show Stripe Connect account status') and enumerates exactly what is surfaced: account id, onboarding completeness, charges/payouts enabled. It distinguishes itself from the sibling `pay_connect` by framing itself as the read side of the same domain.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit alternative and the condition that selects it: 'If there is no account or onboarding is unfinished, use `pay_connect`.' This is exactly the routing an agent needs and leaves nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_subscriptions_by_userPay: subscriptions by userARead-onlyInspect
List subscriptions accessible to a user. Lists the subscriptions one project user (by numeric user id) is linked to, with id, name, status, price and created date. Read-only. Use it to look up a customer's subscriptions; pay_entitlement and pay_subscriptions_check_access only report on the signed-in user.
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | Yes | Numeric user id. Find it with users_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so 'Read-only' is largely confirmatory; however the description adds real behavioral value by enumerating the returned fields (id, name, status, price, created date), which is not in the annotations or schema. It omits pagination/result-size limits, so not a full 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?
Three short sentences, front-loaded with the core action and scoped to user id early. Minor redundancy between 'List subscriptions accessible to a user' and 'Lists the subscriptions one project user is linked to', but nothing wasted.
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 usefully discloses the returned fields, and the disambiguation against sibling read tools is complete. It stops short of noting ordering, limits, or behavior when the user has no subscriptions.
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 the single parameter is fully documented including how to obtain it (users_list). The description only restates 'by numeric user id', adding no new syntax or constraint beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List subscriptions accessible to a user') and immediately narrows scope to one project user by numeric id. It also names the sibling tools it is not, so an agent can distinguish it from pay_entitlement and pay_subscriptions_check_access without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit use case ('look up a customer's subscriptions') and an explicit exclusion rule: pay_entitlement and pay_subscriptions_check_access only report on the signed-in user. This is exactly the when-to-use / when-not-to-use contrast the dimension asks for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_subscriptions_cancelPay: subscriptions cancelADestructiveInspect
Cancel a subscription. Schedules a Stripe subscription to cancel at the end of its current billing period: the customer keeps access until then and is not charged again. Reversible before the period ends with pay_subscriptions_resume. Apple subscriptions are cancelled by the customer in the App Store. To end access now, see pay_subscriptions_force_expire. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Subscription id (guid). Find it with pay_subscriptions_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, destructiveHint=true), but the description adds genuinely non-obvious behavior: the cancellation is scheduled rather than immediate, the customer retains access and is not recharged, and the action is reversible via pay_subscriptions_resume. It also flags the user-confirmation requirement. It does not mention auth scopes or rate limits, which keeps it short of perfect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then layered: timing semantics, reversibility, sibling alternatives, platform exception, and the destructive-action warning. Every sentence carries distinct information and none repeats the name or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with no output schema, everything an agent needs is present: what happens to the subscription, when, whether it can be undone, how to escalate to immediate termination, and when the tool doesn't apply (Apple). Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single `id` parameter is fully documented in the schema, including a pointer to pay_subscriptions_list for discovery. The description adds no parameter-level detail, so the baseline 3 for schema-covered parameters 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?
States a specific verb and resource ('Cancel a subscription') and immediately qualifies the semantics: the cancel is deferred to the end of the current billing period. It is clearly distinguishable from pay_subscriptions_force_expire and pay_subscriptions_delete, which are named in the description itself.
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 routing: use pay_subscriptions_resume to reverse before period end, pay_subscriptions_force_expire to end access now, and Apple subscriptions must be cancelled by the customer in the App Store. Both the alternative and the condition that selects each one are given, plus an out-of-band exception case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_subscriptions_check_accessPay: subscriptions check accessARead-onlyInspect
Check whether the current user has access to a subscription by name. Checks whether the signed-in user (the one this tool runs as) holds a subscription with the given name, optionally requiring a status, and returns whether they have access plus that subscription's id, name and status. Read-only. For another user use pay_subscriptions_by_user.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Subscription name to check | |
| status | No | Require a specific status (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so 'Read-only' is largely a restatement. However, the description adds genuinely useful behavior beyond them: it clarifies that the check runs as the calling user and specifies the return payload (access boolean plus id, name and status), which matters since there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and scope, and the routing hint is short and useful. The second sentence largely re-states the first ('Check whether the current user...' / 'Checks whether the signed-in user...'), which is minor redundancy rather than wasted space.
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 correctly compensates by describing the returned fields and the boolean result. Scope, required input, optional status filter, and the sibling alternative are all covered; the only meaningful omission is what a false/negative access result implies for follow-up actions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented. The description adds only a light gloss ('by name', 'optionally requiring a status'), which is roughly what the schema's 'Require a specific status (optional)' already conveys; 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?
States a specific verb (check access), resource (subscription), and the exact scope (the signed-in/current user) in the first sentence. It is clearly distinguishable from siblings like pay_subscriptions_get, pay_subscriptions_by_user, and pay_entitlement without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit routing rule: 'For another user use `pay_subscriptions_by_user`', which is the main selection decision for this tool. It does not address other plausible alternatives (e.g. pay_subscriptions_get for details, pay_entitlement for entitlements), so it stops short of full coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_subscriptions_deletePay: subscriptions deleteADestructiveInspect
Hard-delete a subscription (project admin). Project-admin recovery tool that permanently removes a stuck or duplicate subscription record and its user links from Anythink. It does not cancel at Stripe or Apple, so the customer can still be billed; use pay_subscriptions_cancel first if billing should stop. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Subscription id (guid). Find it with pay_subscriptions_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds substantive context beyond them: it deletes user links too, it does NOT cancel at Stripe/Apple so the customer can still be billed, and it is a recovery tool for stuck/duplicate records. This is exactly the extra behavioral detail annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and scope, and the consequences/alternatives follow in a logical order. The closing sentence ('It changes or deletes existing data, so check with the user') is mildly redundant with destructiveHint=true, keeping it just short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-param destructive mutation with annotations and no output schema, the definition covers purpose, prerequisites, billing side effects, and the correct alternative tool. An agent has everything needed to invoke it responsibly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema itself tells the agent the id is a guid discoverable via pay_subscriptions_list. The description adds no parameter-level detail, so the baseline of 3 is correct when the schema carries the full burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and scope: 'Hard-delete a subscription (project admin)' plus the exact purpose ('permanently removes a stuck or duplicate subscription record and its user links'). It is clearly distinguishable from the sibling pay_subscriptions_cancel, which it names explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives the when-to-use case (stuck or duplicate subscription record) and the when-not/alternative case ('use pay_subscriptions_cancel first if billing should stop'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_subscriptions_eventsPay: subscriptions eventsARead-onlyInspect
Show the lifecycle history of a subscription. Returns a subscription's lifecycle history, one row per event with time, event type, source, status change and summary. Read-only; check it to explain a subscription's state before using pay_subscriptions_cancel, pay_subscriptions_resync or pay_subscriptions_relink.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Subscription id (guid). Find it with pay_subscriptions_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description restates read-only (consistent with readOnlyHint=true) and, more usefully, discloses the return shape — time, event type, source, status change, summary — which no output schema provides. It stops short of stating ordering, volume, or retention limits for the event history, so it is not fully transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and short, with the purpose in the first clause and the routing advice last. The opening two sentences partially restate each other ('Show the lifecycle history' / 'Returns a subscription's lifecycle history'), a small redundancy that keeps it out of the top band.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with no output schema and annotations already covering safety, the description supplies everything missing: what an event row contains, that the call is non-mutating, and when to reach for it versus the mutation siblings.
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 the single 'id' parameter is already documented in the schema, including the hint to obtain it via pay_subscriptions_list. The description adds no extra meaning about the id beyond what the schema says, so the baseline of 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 gives a specific verb and resource ('Show the lifecycle history of a subscription') and then specifies the granularity of the result ('one row per event'), which separates it from the sibling pay_subscriptions_get / pay_subscriptions_list. An agent can tell what this tool returns without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states both a positive use case ('check it to explain a subscription's state') and a temporal condition relative to concretely named alternatives (use before pay_subscriptions_cancel, pay_subscriptions_resync, pay_subscriptions_relink). This is explicit when-to-use guidance with named siblings, which is exactly what routing requires.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_subscriptions_force_expirePay: subscriptions force expireADestructiveInspect
Force-expire a subscription immediately (project admin). Project-admin recovery tool that sets a subscription's status to expired and clears its current period, so the user loses access at once while the record is kept. It changes only Anythink's record, not Stripe or Apple, so it does not stop future charges; use pay_subscriptions_cancel for that. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Subscription id (guid). Find it with pay_subscriptions_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint/readOnlyHint annotations by disclosing that the record is kept, that access is lost at once, and critically that it only mutates Anythink's record and does NOT affect Stripe or Apple billing. That last point materially changes agent decision-making and is not inferable from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action and the admin requirement, then layers the recovery semantics, the billing-scope caveat, the alternative tool, and the confirmation warning. Every sentence carries distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive mutation with no output schema, the description covers actor permissions, exact state change, data retention, external-system caveats, and the safer alternative — everything an agent needs to invoke it correctly and safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single `id` parameter is fully documented in the schema, including a pointer to pay_subscriptions_list for discovery. The description adds no parameter-level meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('force-expire') and resource ('a subscription'), plus the immediate scope ('sets status to expired and clears its current period'). It is clearly distinguishable from the numerous pay_subscriptions_* siblings because it names exactly what state change occurs.
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 routes the agent: names the alternative tool (`pay_subscriptions_cancel`) for stopping future charges, and adds a precondition ('check with the user before running it'). Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_subscriptions_getPay: subscriptions getARead-onlyInspect
Show one subscription by id (guid). Shows one subscription in full: status, price, customer email and name, current billing period, trial end, cancellation and scheduled auto-cancel dates, reference and any checkout URL. Read-only; for how it got into this state use pay_subscriptions_events.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Subscription id (guid). Find it with pay_subscriptions_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description reinforces 'Read-only'. With no output schema, the description adds genuine value by disclosing the returned fields (status, price, customer email/name, billing period, trial end, cancellation dates, reference, checkout URL). It stops short of noting pagination or error behavior, but a single-id lookup has little to disclose there.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the core action and scope, then the field list, then the sibling routing note. No filler sentences; every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read tool with one fully-documented parameter and no output schema, the description covers the essentials and compensates for the missing return schema by listing the fields returned. It could be stronger by clarifying where the id comes from in-flow, but it is essentially 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% and the schema already documents the single `id` parameter as a guid found via pay_subscriptions_list. The description restates 'by id (guid)' without adding syntax or format detail, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Show one subscription by id (guid)') and then enumerates the exact fields returned, so an agent knows precisely what it gets. It also names the sibling `pay_subscriptions_events` as the contrasting tool, disambiguating it from the 'get' family.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for use (fetch a single subscription by guid) and an explicit alternative for a related need ('for how it got into this state use pay_subscriptions_events'). It does not, however, route to sibling reads like pay_subscriptions_list or pay_subscriptions_by_user, leaving some sibling selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_subscriptions_listPay: subscriptions listARead-onlyInspect
List subscriptions (paginated, optionally filtered by --status). Lists the project's subscriptions (end users' recurring Stripe or Apple purchases of a plan) with id, name, status, price, customer email and created date, paged, optionally filtered by status such as active, trialing or cancelled. Read-only. Non-admins see only subscriptions they are linked to.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default: 1) | |
| limit | No | Items per page (default: 25) | |
| status | No | Filter by status (e.g. active, trialing, cancelled) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only safety profile, but the description adds real behavioral context: the fields returned per subscription and the authorization scope ('Non-admins see only subscriptions they are linked to'). It does not mention pagination defaults or rate limits, but the added access-scoping detail exceeds what the 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 first parenthetical ('paginated, optionally filtered by --status') is immediately repeated in the body ('paged, optionally filtered by status such as...'), so the opening sentence is redundant. The access-scope note at the end is front-of-mind material and adds value, but the duplication costs efficiency.
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?
There is no output schema, and the description compensates by enumerating the returned fields, which is exactly what an agent needs. Combined with the read-only annotation and the non-admin scoping caveat, it covers the essentials for a paginated read tool, with only pagination behavior left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented. The description mentions status filtering and lists example values (active, trialing, cancelled), which duplicates the schema's own enum-less example rather than extending it; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (subscriptions), and enumerates the fields returned (id, name, status, price, customer email, created date), so an agent immediately understands the resource. It does not name the nearby siblings that also return subscription data (pay_subscriptions_get, pay_subscriptions_by_user), so differentiation is left partly to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implied usage is clear (enumerate a project's subscriptions, optionally filtered by status), and the access note about non-admins is useful. However, it never states when to reach for this versus pay_subscriptions_get or pay_subscriptions_by_user, so it falls short of explicit when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_subscriptions_relinkPay: subscriptions relinkADestructiveInspect
Move a subscription to another user (project admin). Project-admin tool that moves a subscription to another project user (numeric user id), replacing all its existing user links, to fix a purchase bound to the wrong account. The previous user loses access; billing at Stripe or Apple is unchanged. Undo by relinking it back. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Subscription id (guid). Find it with pay_subscriptions_list. | |
| to_user_id | No | User id to move the subscription to |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, but the description goes well beyond them: it says all existing user links are replaced, the previous user loses access, Stripe/Apple billing is unchanged, and it is reversible by relinking back. It also warns to confirm with the user before running.
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?
Purpose is front-loaded, but the first two sentences restate each other ('Move a subscription to another user (project admin). Project-admin tool that moves a subscription to another project user...'), which is redundant. The remainder is useful and earns its place, but the opening repeats.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, admin-only mutation with no output schema, the description covers effects, permissions, reversibility, and billing side effects well. It stops short of covering return values or error behavior, but the conceptual picture needed to invoke it safely is largely 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%, so both parameters are already documented ('Subscription id (guid)' and 'User id to move the subscription to'). The description adds 'numeric user id' and 'another project user', which slightly reinforces the target semantics but does not meaningfully extend the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (move/relink) and resource (subscription to another user), plus scope (project-admin tool). It also clarifies the mechanism ('replacing all its existing user links'), which separates it from siblings like pay_subscriptions_resync or pay_subscriptions_list without opening their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear use case ('to fix a purchase bound to the wrong account'), a prerequisite (project admin), and an undo path ('relinking it back'). It does not explicitly name or exclude alternatives such as resync, but the context for when to reach for it is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_subscriptions_resumePay: subscriptions resumeAInspect
Resume a cancelled subscription. Removes a scheduled cancellation from a Stripe subscription, so it renews and charges the customer again at the end of the current period. Use it to undo pay_subscriptions_cancel before the period ends.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Subscription id (guid). Find it with pay_subscriptions_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the real consequence: the subscription renews and the customer is charged again at period end. That financial side effect is the key thing an agent must know before invoking this non-read-only tool. It does not cover failure modes (e.g., behavior when no cancellation is scheduled), which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with what the tool does, then the side effect, then the routing guidance. Every sentence earns its place with no restatement of the name or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter state-change tool with no output schema, the description supplies purpose, mechanism, side effect, and the alternative tool — everything needed to call it correctly and safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single `id` parameter is already documented as a guid with a discovery path via pay_subscriptions_list. The description adds no further meaning about the identifier, so the baseline of 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?
Specific verb (resume) plus resource (cancelled subscription), with the underlying mechanism spelled out: it removes a scheduled cancellation on a Stripe subscription. It is unmistakably distinct from pay_subscriptions_cancel and pay_subscriptions_force_expire among the many pay_* siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the exact sibling it inverts ('undo `pay_subscriptions_cancel`') and states the timing constraint ('before the period ends'), so the agent knows both the alternative and the window in which this tool is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_subscriptions_resyncPay: subscriptions resyncADestructiveInspect
Re-sync a subscription from the provider (project admin). Project-admin tool that fetches a Stripe subscription's live state from Stripe and overwrites the stored record, returning the result. Use it when the status shown disagrees with Stripe. Apple subscriptions aren't supported yet and return an error. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Subscription id (guid). Find it with pay_subscriptions_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=false, so the safety profile is partly covered. The description adds genuinely new context: it overwrites the stored record, requires project-admin rights, errors on Apple subscriptions, and advises confirming with the user first. It stops short of detailing irreversibility or the returned payload shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the action and its mechanism, then the usage trigger, the Apple limitation, and the destructive warning. No filler, though the 'project admin' note is repeated in the first two sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with no output schema, the description covers purpose, prerequisites (project admin), usage trigger, unsupported provider, and a confirmation warning. The only real gap is that it does not describe the shape of the returned result beyond 'returning the result'.
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?
Only one parameter and schema description coverage is 100% — the schema already documents 'id' and even points to pay_subscriptions_list for discovery. The description adds no further semantics about the id format or lookup, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (re-sync a subscription) and explains the mechanism precisely: fetch the live Stripe state and overwrite the stored record. The 'project admin' qualifier and the Stripe-vs-Apple distinction clearly separate it from siblings like pay_subscriptions_relink or pay_subscriptions_get.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger condition ('use it when the status shown disagrees with Stripe') and a when-not ('Apple subscriptions aren't supported yet and return an error'). It does not name a sibling alternative for read-only inspection (e.g. pay_subscriptions_get), so it falls just short of the full when/when-not/alternatives bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_trial_disablePay: trial disableAInspect
Disable the app engagement trial. Turns off the project-wide app engagement trial, so users without a subscription no longer get free app access. Changes only this project setting and leaves the others as they were; undo with pay_trial_enable. Trial days granted by offers are separate and unaffected.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations give the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false), so the bar is lower. The description still adds genuine context: the blast radius (users without a subscription lose free app access), that only this project setting changes, and that the action is reversible via pay_trial_enable. It does not state whether the operation is idempotent or what the response contains, so it falls short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short clauses, front-loaded with the purpose before the scoping and reversibility details. Every sentence carries non-redundant information (effect, scope limit, rollback, offers exception) with 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?
With no parameters and no output schema, the description carries the full burden and does so: it covers the effect, the scope, the rollback path, and the boundary against offer-granted trials. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. The description correctly adds no misleading argument information.
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?
Names a specific verb+resource ('Disable the app engagement trial') and immediately narrows the scope to 'project-wide app engagement trial'. It also explicitly contrasts with the sibling pay_trial_enable and with offer-granted trial days, so an agent can separate it from the other pay_* tools without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Tells the agent when this applies (turning off project-wide trial so unsubscribed users lose free app access) and names the exact reversal path ('undo with pay_trial_enable'). It also pre-empts a likely confusion by stating offer-granted trial days are separate and unaffected.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_trial_enablePay: trial enableAInspect
Enable the app engagement trial. Turns on the project-wide app engagement trial, so users without a subscription get free app access for the longest trial length among active plans. Changes only this project setting and leaves the others as they were; undo with pay_trial_disable. Unrelated to offer trial rewards (pay_offers_create).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a mutation (readOnlyHint=false) that is non-destructive, but the description goes further by disclosing scope ('Changes only this project setting and leaves the others as they were') and the exact reversal path (undo with pay_trial_disable). It doesn't discuss permissions or propagation timing, but the added scoping and reversibility detail is meaningful beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action first, then the effect on end users, then the undo/disambiguation tail. Every sentence carries distinct information 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?
For a parameterless toggle with no output schema, the description covers the action, its user-visible consequence, its scope of change, and its reversal, plus sibling disambiguation. An agent has everything needed to call it correctly and safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, which is the baseline-4 case per the rubric, and there is no parameter syntax for the description to elaborate. Nothing is missing or misrepresented on this dimension.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Enable') and resource ('app engagement trial') and explains the effect precisely: project-wide trial so users without a subscription get free app access at the longest trial length among active plans. It also distinguishes itself from siblings by pointing to pay_trial_disable as the undo and explicitly separating itself from pay_offers_create.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context by naming the counterpart tool (`pay_trial_disable`) for reversal and flagging that this is unrelated to offer trial rewards (`pay_offers_create`), which steers the agent away from a plausible wrong sibling. It stops short of spelling out a full set of preconditions or an explicit 'use this when X' rule, so it isn't a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_trial_statusPay: trial statusARead-onlyInspect
Show whether the trial is enabled and its derived length. Reports whether the project-wide app engagement trial is on and how long it lasts. The length is not set directly: it is the longest trial among active subscription plans, and that plan is named. Read-only; change it with pay_trial_enable, pay_trial_disable or a plan's trial days in pay_plans_update.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful behavior by explaining that the trial length is not set directly but is derived as the longest trial among active subscription plans, and that the plan is named; it does not discuss auth or error behavior, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the purpose, then progressively explaining scope, derivation, and mutation alternatives. Each sentence earns its place with 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?
No output schema exists, so the description must convey what is returned; it does so by stating the enabled flag, the derived length, and the named source plan. For a simple zero-parameter read tool with read-only annotations, nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so there is nothing for the description to clarify beyond the schema. The baseline for a zero-parameter tool is 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 states a specific verb-and-resource ('Show whether the trial is enabled and its derived length') and explains exactly what is reported, including that the length comes from the longest active subscription plan. It distinguishes itself from the mutating siblings `pay_trial_enable`, `pay_trial_disable`, and `pay_plans_update`.
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 clearly frames this as the read-only inspection tool and names the alternative tools for changing trial state. It does not state a negative condition or when not to use it, but for an empty-schema read sibling the routing is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
projects_createCreate a projectAInspect
Provision a new project — a dedicated, isolated Anythink backend instance with its own database, API, auth, and storage. Requires platform login and an active billing account (set one with 'accounts_use'). Provisioning runs asynchronously: the project starts in a Provisioning state, so poll 'projects_list' until it is Active. Returns the new project's id, name, org id, and API URL. Connect to it with 'projects_use'.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Human-readable project name, e.g. 'production' or 'my-app' | |
| planId | Yes | Plan id (UUID) that sets the project's resource tier and pricing. Run the 'plans' CLI command (via the 'cli' tool) to list available plan ids. | |
| region | No | Deployment region slug, e.g. 'lon1'. Defaults to 'lon1'. Choose the region closest to your users. | lon1 |
| accountId | No | Billing account id to create the project in. Defaults to the active account set via 'accounts_use'. | |
| description | No | Optional free-text description shown in the dashboard |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=false, so the description carries the real behavioral load — and it does: asynchronous provisioning, a Provisioning intermediate state, auth and billing prerequisites, and the exact return fields. That is well beyond what the structured fields 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?
Four sentences, each front-loading the most consequential information in order: what it is, what it requires, how it behaves, what it returns and how to proceed. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return shape (id, name, org id, API URL), and its coverage of async state and prerequisites is complete enough for correct invocation. Nothing an agent needs before calling is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters including defaults like region='lon1' and accountId from accounts_use. The description adds no parameter syntax or format detail beyond that, 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?
States a specific verb+resource ('Provision a new project') and then defines what that resource actually is — an isolated backend instance with its own database, API, auth, and storage. An agent can immediately distinguish this from siblings like projects_list, projects_use, and projects_delete.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit prerequisites (platform login, active billing account, with the sibling 'accounts_use' named as the way to set one), the required follow-up ('poll projects_list until Active'), and the connection step ('projects_use'). This routes the agent through the whole lifecycle, not just the call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
projects_deleteDelete a projectADestructiveInspect
Permanently delete a project and tear down its backend instance, including its database and stored data. This is destructive and irreversible — always confirm with the user first, and prefer matching by a specific id over a short prefix to avoid removing the wrong project. Requires an active billing account (set one with 'accounts_use'). Returns the deleted project's name and id on success.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Project to delete — its UUID, name, or a unique prefix. Use a specific id to avoid accidental matches. Find ids via 'projects_list'. | |
| accountId | No | Billing account id the project belongs to. Defaults to the active account set via 'accounts_use'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only carry destructiveHint=true; the description adds that the effect is irreversible, what exactly gets destroyed (backend instance, database, stored data), the billing-account prerequisite, and the success return value. This is substantial context beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each carrying distinct information — effect, warning, prerequisite, return value — with the destructive/irreversible warning front-loaded. 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?
With no output schema, the description supplies the return value, plus prerequisites, irreversibility, and id-discovery guidance. An agent has everything needed to call this safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description ties parameter choice to consequence ('prefer matching by a specific id over a short prefix to avoid removing the wrong project'), giving the id semantics risk-relevant meaning. The accountId default behavior is left to 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?
States a specific verb and resource ('Permanently delete a project') plus the scope of the action ('tear down its backend instance, including its database and stored data'), which clearly separates it from projects_create, projects_list, and projects_use among the siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to confirm with the user first, to prefer a specific id over a short prefix, and that an active billing account is required (set via 'accounts_use'). It also points to 'projects_list' as the way to find ids, so prerequisites and alternatives are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
projects_listList projectsARead-onlyInspect
List the projects (provisioned backend instances) in a billing account. Requires platform login and an active billing account (set one with 'accounts_use'). Returns each project's id, name, description, region, org id, status (Initializing/Provisioning/Active/Suspended/Terminated/Error), API URL, and creation date. Use this to find a project's id before connecting with 'projects_use' or removing it with 'projects_delete'.
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | No | Billing account id to list projects for. Defaults to the active account set via 'accounts_use'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds valuable context beyond that: authentication requirements (platform login) and prerequisite state (active billing account). It also enumerates return fields including status values, which helps the agent understand the output. It does not mention pagination or rate limits, but that is a minor gap given the annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose, then follows with prerequisites, return values, and usage in a logical order. Every sentence earns its place: no repetition, no filler, and the long return list is informative rather than wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a list tool with one optional parameter and no output schema, the description is complete: it covers prerequisites, return fields (substituting for an absent output schema), and cross-references to sibling tools for next steps. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents the single optional accountId parameter including its default behavior. The description reinforces the 'active billing account' concept but does not add syntax, format, or edge-case details beyond what the schema provides. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('projects'), defines the domain term ('provisioned backend instances'), and distinguishes clearly from sibling tools like projects_create, projects_use, and projects_delete. An agent can tell exactly what this tool does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it ('to find a project's id before connecting with projects_use or removing it with projects_delete') and lists prerequisites (platform login, active billing account set via accounts_use). Covers both 'when' and 'what you need', leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
projects_useSwitch the active projectAInspect
Connect to a project and save it as the active profile so the 'cli' tool's data, entities, users, and other commands target it. Resolves the project, then either stores the API key you pass or exchanges a transfer token for project-scoped credentials automatically. Requires an active billing account (set one with 'accounts_use'); the project must be Active (see 'projects_list'). Returns the saved profile name, org id, API URL, and auth method.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Project to connect to — its name, org id, or UUID (a unique prefix is accepted). Find these via 'projects_list'. | |
| apiKey | No | Optional project API key (ak_...). If omitted, a project-scoped token is generated automatically via transfer-token exchange. | |
| accountId | No | Billing account id the project belongs to. Defaults to the active account set via 'accounts_use'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide only destructiveHint=false, so the description carries the full behavioral burden and does so: it discloses the state mutation (persisting an active profile that redirects later commands), the credential flow (stores passed API key vs. auto-exchanges a transfer token), auth prerequisites, and the return payload. This goes well beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the primary effect before prerequisites and return values. Dense but every sentence conveys distinct, non-redundant information; only marginal trimming is possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description enumerates the returned values (profile name, org id, API URL, auth method) and covers prerequisites, credential handling, and state impact. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning: it explains the interaction between params (if apiKey is omitted a project-scoped token is generated) and that accountId defaults to the active account. This clarifies the optional-parameter tradeoffs beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Connect to a project and save it as the active profile') and ties the effect to the 'cli' tool's downstream behavior, clearly differentiating it from projects_list/projects_create/projects_delete. An agent knows exactly what this does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names prerequisites (active billing account, set via 'accounts_use') and a precondition (project must be Active, see 'projects_list'), plus routes the agent to the sibling tools for both. When-to-use is fully inferable and alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
roles_createRoles: createAInspect
Create a new role. Adds a role with no entity permissions yet, so its users can't reach any data until you grant actions with roles_permissions_add. Then give it to people by passing its id as role_id to users_invite. Role names must be unique in the project.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Role name | |
| description | No | Optional description |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=false, so the mutation/safety profile is covered. The description adds non-obvious behavioral facts beyond that: a freshly created role has no entity permissions and its users cannot reach any data, and role names must be unique within the project. It stops short of saying what happens on a duplicate name or what the response contains, so it is not a full 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?
Four short sentences, zero filler, and the core action is front-loaded before the sequencing and constraint details. Every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description implies (but does not state) that the created role's id is what gets passed to `users_invite`. For a two-parameter create tool, purpose, prerequisites, follow-ups and the uniqueness constraint are all covered; only the return payload is left implicit.
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% (both `name` and `description` documented), so the baseline is 3. The description earns an extra point by adding a real constraint on `name` that the schema does not state: names must be unique in the project. It says nothing extra about `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?
Opens with a specific verb+resource ('Create a new role') and immediately differentiates itself from siblings by describing the state it produces (a role with no entity permissions), which separates it from roles_permissions_add and roles_delete. An agent can select it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit ordered workflow: create the role, then grant actions with `roles_permissions_add`, then assign it via `users_invite` with its id as role_id. Both the alternative and the downstream steps are named with the condition that selects them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
roles_deleteRoles: deleteADestructiveInspect
Delete a role by ID. Removes a role and the permissions it grants. The API refuses while any user still holds the role, and the built-in admin role can't be deleted, so check users_list for its holders first. To take away only some access, use roles_permissions_remove instead. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Role ID to delete. Find it with roles_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description adds real behavioral context beyond them: the deletion is blocked while any user holds the role, the built-in admin role is undeletable, and the cascade removes granted permissions. It also advises confirming with the user, which is actionable for an agent operating a destructive tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then constraints, then the alternative, then the safety prompt – a logical ordering with no filler. The final sentence partially restates the destructiveHint annotation, a minor redundancy, but the rest of the text is tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive tool with no output schema, the description covers everything an agent needs: the effect, the blocking conditions, the prerequisite lookup, and the safer alternative. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single `id` parameter is already documented in the schema ('Role ID to delete. Find it with roles_list.'). The description's 'by ID' phrasing adds nothing beyond the structured field, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Delete a role by ID') and immediately clarifies scope ('Removes a role and the permissions it grants'). It also explicitly distinguishes itself from the closest sibling by name (`roles_permissions_remove`), so an agent can route correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use and when-not-to-use guidance: use `roles_permissions_remove` to revoke only some access, and check `users_list` first because the API refuses deletion while a user holds the role. The alternative and the precondition that selects it are both named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
roles_listRoles: listARead-onlyInspect
List all roles. Lists the project's roles with id, name, description and whether each is active. Access works through roles: each user holds one role, and a role grants actions (read, create, update, delete) per entity. Use roles_permissions_list to see what one role grants.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description goes beyond them by disclosing the returned field set and the underlying access model (one role per user; roles grant read/create/update/delete per entity), which is genuine added context. It stops short of mentioning auth requirements or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with what is listed before the explanatory model and the sibling pointer. The middle sentence on the access model is slightly beyond the minimum needed to call the tool, but it earns its place by explaining what 'role' means.
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, describing the returned fields is necessary and it does so. No parameters exist to document and annotations cover safety, so the definition is nearly complete; only result-size/pagination behavior is left unstated, which is minor for a roles list.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4 and there is nothing for the description to disambiguate. It correctly adds no parameter prose and instead spends its words on scope and the domain model.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('List all roles') plus the exact returned fields (id, name, description, active flag), and it distinguishes itself from the sibling roles_permissions_list by naming what that tool covers instead. An agent can pick this tool without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It routes the agent explicitly to `roles_permissions_list` for per-role permission detail, which is clear alternative guidance. It does not state any when-not condition (e.g. prefer a filtered lookup for large sets), so it falls just short of the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
roles_permissions_addRoles: permissions addAInspect
Add entity permissions to a role. Grants a role one or more actions (read, create, update, delete; default read) on one entity, and every user holding the role gains them at once. Its other permissions are kept and actions it already has are skipped. An action with no matching permission for that entity is reported and skipped.
| Name | Required | Description | Default |
|---|---|---|---|
| entity | Yes | Entity name | |
| actions | No | Comma-separated actions: read,create,update,delete (default: read) | |
| role_id | Yes | Role ID. Find it with roles_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so safety is covered; the description then adds genuine behavioral context beyond them: other permissions are retained, already-held actions are skipped (idempotent-like), every user on the role is affected at once, and unmatched actions are reported and skipped. This is meaningful disclosure of side effects and edge-case behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by focused behavioral detail. Four sentences, all relevant, with no filler; slightly more verbose than strictly necessary but each sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema and full schema coverage, the description covers the important gaps: what changes, what is preserved, what is skipped, and the blast radius across users. An agent has enough to call it correctly, though it never addresses authentication/permission requirements.
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 the schema already enumerates the allowed actions and the default. The description largely restates this (read/create/update/delete, default read) with only marginal additions like 'on one entity', so it does not materially exceed the structured field documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (add) and resource (entity permissions to a role), and clarifies scope (one entity, one or more actions). It does not explicitly name the sibling it contrasts with (roles_permissions_remove / roles_permissions_list), so it stops short of full sibling differentiation, but the purpose is immediately clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: it describes what adding does but gives no explicit when-to-use/when-not guidance or direction to roles_permissions_remove for the inverse. An agent can infer intent from the name and description, but no conditions or exclusions are spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
roles_permissions_listRoles: permissions listARead-onlyInspect
List entity permissions for a role. Shows, entity by entity, which actions (read, create, update, delete) a role grants. Use it before roles_permissions_add or roles_permissions_remove, or to explain why users with that role can or can't reach some data.
| Name | Required | Description | Default |
|---|---|---|---|
| role_id | Yes | Role ID. Find it with roles_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds behavior beyond that: the output is an entity-by-entity matrix of granted actions, which tells the agent what it will actually receive and that the result is suitable for access diagnosis. It does not mention pagination or ordering for roles with many entities, a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste. The purpose and output shape are front-loaded, and the usage guidance follows. Nothing could be cut without losing 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?
No output schema exists, but the description informally describes the return content (entity-by-entity action list) and the role_id source is covered by the schema. An agent has enough to call it correctly; only edge cases like pagination for large roles are unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% – the single role_id parameter is documented in the schema with a pointer to roles_list. The description adds nothing about the parameter, so the baseline 3 applies; the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List entity permissions for a role') and immediately clarifies the granularity: 'Shows, entity by entity, which actions (read, create, update, delete) a role grants.' This distinguishes it from roles_list (role inventory) and roles_permissions_add/remove (mutations) without needing to open any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use conditions and names the sibling tools it precedes ('Use it before `roles_permissions_add` or `roles_permissions_remove`'), plus a second use case: diagnosing why a user can or cannot reach data. Alternatives are named rather than left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
roles_permissions_removeRoles: permissions removeADestructiveInspect
Remove entity permissions from a role. Takes one or more actions (default read) on one entity away from a role; every user holding the role loses them at once, and its other permissions are kept. Actions the role doesn't have are ignored. Use roles_permissions_list first to see what it grants. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| entity | Yes | Entity name | |
| actions | No | Comma-separated actions: read,create,update,delete (default: read) | |
| role_id | Yes | Role ID. Find it with roles_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered. The description adds real value beyond that: blast radius (every user holding the role loses the permission at once), preservation semantics (other permissions kept), and lenient partial-application behavior (actions the role lacks are ignored). It does not cover reversibility, auth requirements, or error behavior for an unknown entity, so a 4 rather than 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?
Front-loaded with the core action, then blast radius, then alternatives and caution - a sensible order. The clause 'Takes one or more actions (default read) on one entity away from a role' partially repeats the opening sentence, a minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with an output schema absent (so returns need not be explained), full parameter coverage, and annotations carrying the safety flags, the description closes the remaining gaps: what is destroyed, who is affected, and the recommended workflow.
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 all three parameters (role_id, entity, actions) are already documented, including the comma-separated action list and the 'read' default. The description restates the default and 'one entity' scoping but adds no syntax or format detail beyond the schema, matching 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?
States a specific verb (remove) and resource (entity permissions from a role), and implicitly scopes it against sibling roles_permissions_add. An agent can immediately tell this is the removal counterpart without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit instructions: use `roles_permissions_list` first to see current grants, and check with the user before running because it changes/deletes data. Names the alternative tool and the condition selecting it, plus a confirmation prerequisite.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_auditSearch: auditARead-onlyInspect
Compare configured public-searchable fields vs what public search actually returns. Flags any data leaks. Runs the same query (default *) through public and signed-in search for one entity, sampling 5 records by default, and reports any field public search returned that is not marked publicly searchable, plus marked fields that didn't appear. It ends with an error when a leak is found. Fix leaks with fields_update. Returns JSON.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Search query to use for the audit (default: '*' — wildcard across all records) | |
| entity | Yes | Entity to audit | |
| sample | No | How many records to inspect (default: 5) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true and openWorldHint=false already declaring the safety profile, the description adds meaningful non-annotation behavior: it runs two searches (public and signed-in), samples 5 by default, and deliberately ends with an error when a leak is found. The error-on-detection behavior is the kind of non-obvious trait annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and leak-flagging are front-loaded, then execution behavior, then the fix pointer. The long middle sentence listing what gets reported is dense but earns its place; the trailing 'Returns JSON' is terse rather than wasteful given no output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does double duty by summarizing what the report contains (leaked fields plus missing marked fields) and noting the error-on-leak exit. Defaults for query and sample are covered, leaving only the exact JSON shape unspecified.
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 all three parameters are already documented including the `*` and sample=5 defaults. The description largely restates those defaults, adding only the 'for one entity' scoping clarification, so it sits at the baseline where the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: compare configured public-searchable fields against what public search actually returns, and flags leaks. It clearly distinguishes itself from search_query/search_similar siblings by being a diagnostic leak audit rather than a data-retrieval search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for when to run the audit (verifying public search exposure) and routes remediation by naming `fields_update` as the fix tool. It doesn't explicitly state when NOT to use it or how it differs operationally from `search_query`, so it stops short of full alternative coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_purgeSearch: purgeADestructiveInspect
Purge the search index. Omit ENTITY to purge everything (admin only). Deletes the search index entries for the entity, or for every entity, so search_query and search_similar return nothing for them until search_rehydrate runs. The records in the database are not touched. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| entity | No | Entity name. Omit to operate on the entire index. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, so the safety flag is covered, but the description adds substantial context: what is actually destroyed (search index entries only, database records untouched), the admin requirement for a full purge, and that entries stay empty until search_rehydrate runs. That is real behavioral value beyond the structured hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then scope, then side effects, then the caution. Every sentence earns its place and nothing is redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation tool with no output schema, the description covers destruction scope, permission requirement, recovery path, and the fact that the underlying data survives. An agent has everything needed to call it responsibly.
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 entity parameter is already documented, but the description adds meaning the schema lacks: omitting ENTITY purges the entire index and is admin-only, which materially changes how the parameter is used. Marginal but genuine addition over 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?
States a specific verb+resource ('Purge the search index') and immediately distinguishes itself from the read-side siblings by naming search_query and search_similar and the recovery tool search_rehydrate. An agent can place it precisely without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the key usage condition for the omitted-parameter case ('purge everything (admin only)') and the recovery route via search_rehydrate, plus an explicit 'check with the user before running it' caution. It stops short of naming a when-not-to-use alternative in the sense of a different tool to pick instead, so it's clear context rather than full routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_querySearch: queryARead-onlyInspect
Run a search query. Searches the search index across all indexed entities or the ones listed, with optional filter (status=published AND category=news), sort, facets and highlighting; use * to browse. The public option searches as an anonymous visitor. To list one entity's records by exact field values, use data_list; if indexed records are missing, use search_rehydrate. Returns JSON.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default: 1) | |
| sort | No | Comma-separated sort fields, e.g. "created_at:desc,id:asc". | |
| text | Yes | Search text. Use '*' for wildcard / browse all. | |
| facet | No | Comma-separated fields to compute facet aggregations on. | |
| limit | No | Results per page (1-100, default: 20) | |
| filter | No | Filter expression, e.g. "status=published AND category=news". Supports _geoRadius and _geoBoundingBox. | |
| public | No | Use the unauthenticated /search/public endpoint (returns only public-marked fields) | |
| entities | No | Comma-separated entity names to search. Default: all indexed entities. | |
| highlight | No | Enable result highlighting on matched terms. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered; the description goes further by disclosing that `public` hits the unauthenticated endpoint returning only public-marked fields, and that filter expressions support operators. 'Returns JSON' is thin, and there is no mention of pagination limits or behavior when nothing matches.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose, then the capability list, then the sibling routing – every clause carries information and none is filler. The middle sentence is dense and semi-colon-stacked, which slightly hurts scanability, but nothing is wasted.
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 does say it returns JSON, and it covers filtering, sorting, facets, highlighting, entity scoping and the public/anonymous mode for a 9-parameter tool. It is close to complete, though return-shape and paging behavior are left to the schema 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 coverage is 100%, so the baseline is 3; the description still adds meaning with a concrete filter example ('status=published AND category=news'), the wildcard/browse convention for `text`, and the anonymous-visitor semantics of `public`. It does not, however, explain `facet` or `highlight` beyond what the schema already says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Run a search query ... searches the search index') and immediately scopes it to indexed entities or a named subset. It explicitly distinguishes itself from `data_list` (exact field-value lookups) and `search_rehydrate` (missing indexed records), so an agent can route without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete routing rules: use `data_list` to list one entity's records by exact field values, use `search_rehydrate` when indexed records are missing, and use `*` to browse instead of searching. It also explains the `public` option's semantics (searching as an anonymous visitor), which tells the agent when to prefer it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_rehydrateSearch: rehydrateAInspect
Rehydrate the search index. Omit ENTITY to rehydrate everything (admin only). Re-sends the entity's records, or every entity's, from the database to the search index, replacing existing entries; it runs in the background and can take a while on large entities. Use it when search_query misses records or after changing which fields are searchable. It changes no data; to clear the index instead, use search_purge.
| Name | Required | Description | Default |
|---|---|---|---|
| entity | No | Entity name. Omit to operate on the entire index. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations by explaining that records are re-sent from the database to the index, existing entries are replaced, the operation runs in the background, may take a while on large entities, changes no data, and that omitting ENTITY requires admin rights. This is rich operational context despite readOnlyHint=false and destructiveHint=false already being declared.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then scoping, behavior, use cases, and alternatives. Every sentence carries useful information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and only modest annotations, the description fully covers operational behavior, admin constraints, side effects, timing, and the sibling alternative needed to use or avoid 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 100% and the schema already describes ENTITY and its omission. The description adds admin-only semantics for the omitted case, which is meaningful beyond the schema, though it does not add syntax or format 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?
States a specific verb (rehydrate) and resource (search index), including scope behavior (entity vs all) and the direct sibling alternative (search_purge). An agent can distinguish it from search_query and search_purge without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use it: when search_query misses records or after changing which fields are searchable. It names the alternative tool for clearing the index instead (search_purge) and notes the admin-only condition for omitting ENTITY.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_similarSearch: similarARead-onlyInspect
Find documents similar to a given record (vector search). Takes an entity and a record id and returns the records closest in meaning to it, 10 by default, using vector embeddings in the search index. The public option searches as an anonymous visitor and returns only publicly searchable fields. To find records matching words you supply, use search_query. Returns JSON.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Source document ID — find documents similar to this one | |
| limit | No | Maximum results (default: 10) | |
| entity | Yes | Entity name | |
| public | No | Use the public endpoint (only public-marked fields returned) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnlyHint=true, openWorldHint=false), and the description adds meaningful behavior: vector embeddings in the search index, a default of 10 results, and that the public option acts as an anonymous visitor returning only public fields. It stops short of detailing ranking, score, or pagination behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four front-loaded sentences with no filler: purpose and mechanism first, then default, then the public caveat, then the sibling routing. Every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only vector search with no output schema, the description covers what it returns (records closest in meaning, JSON) and the key mode difference. The absence of any return-shape detail is acceptable given the readOnly annotations and simple result set.
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 id, entity, limit (default 10), and public. The description restates the default count and the public-field constraint but adds no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Find documents similar to a given record"), identifies the mechanism (vector search), and explicitly distinguishes itself from the sibling search_query. An agent can select this without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative tool (search_query) and the exact condition that routes to it ("To find records matching words you supply"), plus clarifies the public/anonymous mode. When-to-use is explicit rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secrets_createSecrets: createAInspect
Store a new secret value. Stores the value encrypted in the project under the key, for workflows to reference as {{ $anythink.secrets.KEY }}; it can never be read back. Pass it in value, as the hidden prompt can't be answered by a tool. To change an existing secret use secrets_update.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Secret key name (e.g. CLAUDE_API_KEY, STRIPE_SECRET_KEY) | |
| value | No | Secret value (use for non-interactive / scripted usage) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the non-destructive, non-open-world safety profile, and the description adds material context beyond them: the value is encrypted, scoped to the project, referenced as {{ $anythink.secrets.KEY }}, and can never be read back. That write-once permanence is exactly the kind of trait an agent needs before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action, then the storage/reference behavior, then the sibling routing. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with annotations present and no output schema, the description covers everything needed: durability, encryption, reference syntax, required inline value, and the correct alternative 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 the baseline is 3, but the description adds real meaning: it explains why `value` must be supplied inline (the hidden prompt cannot be answered by a tool) and shows how the `key` becomes the reference token in workflows.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Store a new secret value') and immediately scopes it against the sibling 'secrets_update'. An agent can distinguish create from update/list/delete without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use this to create, use `secrets_update` to change an existing secret, and pass the value in `value` rather than relying on a prompt. Both the when and the alternative are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secrets_deleteSecrets: deleteADestructiveInspect
Delete a secret. Removes the key and its encrypted value for good; workflows that reference it as {{ $anythink.secrets.KEY }} fail until it is created again. To change a value, use secrets_update instead. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Secret key name to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description goes further with the actual blast radius: the encrypted value is gone permanently and any workflow referencing {{ $anythink.secrets.KEY }} breaks until the secret is recreated. That downstream-failure disclosure plus the user-confirmation instruction is exactly the extra context annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the action, then impact, then the alternative, then the safety note. No filler and each sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive delete with no output schema, the definition covers action, irreversibility, downstream effect, the sibling alternative, and a confirmation requirement. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single `key` parameter, so the schema already documents it. The description only incidentally hints at key naming via the {{ $anythink.secrets.KEY }} template reference; it adds no format or constraint detail. Baseline 3 is appropriate when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Delete a secret") and immediately disambiguates from the sibling secrets_update, which also modifies the same resource. An agent can tell which secrets tool to pick without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative and the condition that selects it: "To change a value, use `secrets_update` instead." It also gives a precondition-style guideline — confirm with the user before running — so when-to-use and when-not-to-use are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secrets_listSecrets: listARead-onlyInspect
List all secret keys (metadata only, values never shown). Shows each secret's key, the users it is assigned to, and when it was created and updated; values are never returned. Use it to check a key exists before referencing it in a workflow as {{ $anythink.secrets.KEY }}, or before secrets_update or secrets_delete.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds the important behavioral fact that secret values are never returned (metadata only), which a caller could not infer from annotations. It doesn't cover pagination or permission requirements, keeping it just short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and the sentences are short and useful. Minor redundancy: 'values never shown' and 'values are never returned' convey the same point twice, which slightly dilutes the otherwise tight structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no parameters, the description carries the return-shape burden well: it names the fields returned (key, assigned users, created/updated timestamps) and emphasizes that values are excluded. An agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description correctly implies a no-argument full listing with no filtering, and there is nothing further to document.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (secret keys), and immediately scopes it as metadata only. It is clearly distinguishable from siblings secrets_create/update/delete as the read-only counterpart.
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 it: to verify a key exists before referencing it as {{ $anythink.secrets.KEY }} in a workflow, or before secrets_update/secrets_delete. It names the relevant alternatives and the conditions that select them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secrets_updateSecrets: updateADestructiveInspect
Rotate (overwrite) an existing secret value. Overwrites the stored value of an existing key, for example to rotate a credential; the old value is lost and workflows referencing the key use the new one from their next run. Pass the new value in value. Use secrets_create for a key that doesn't exist yet. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Secret key name | |
| value | No | Secret value (use for non-interactive / scripted usage) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, but the description goes further: it explains exactly what is destroyed (the old value is lost) and the runtime consequence (workflows referencing the key use the new value from their next run). That is real behavioral context beyond the safety flags.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences: what it does, what it destroys, and the alternative/caution, all front-loaded with no filler. Every sentence carries information the agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with no output schema, the description covers the action, the destructive side effect, the downstream workflow impact, the sibling alternative, and a user-confirmation caveat. Nothing required to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description nudges above it by clarifying the meaning of `value` in context ('Pass the new value in value'), i.e. it is the replacement credential, not an identifier. It does not, however, clarify the key must pre-exist here versus 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?
States a specific verb and resource ('Rotate (overwrite) an existing secret value') and immediately disambiguates from the closest sibling by naming `secrets_create` for the non-existent-key case. An agent can distinguish this from secrets_list/secrets_delete without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative ('Use `secrets_create` for a key that doesn't exist yet') with the condition that selects it, and adds a when-to-be-careful rule ('check with the user before running it'). Both routing decisions an agent faces are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settings_cors_addSettings: cors addAInspect
Add an allowed origin (clears the CORS cache). Adds a web app origin (scheme, host and optional port, no path) or a wildcard such as https://*.example.com, so browser apps there can call the project's API straight away. A wildcard over shared hosting such as vercel.app trusts other people's sites, so check with the user first. An origin already listed is left as it is.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Application origin, e.g. https://app.example.com or a wildcard like https://*.example.com |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, destructive=false, openWorld=false, but the description adds real behavioral traits beyond them: the CORS cache is cleared on add, the operation is idempotent, and wildcards over shared hosts carry a security implication. It does not mention permissions/auth needs, keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then layers format rules, the wildcard warning, and the idempotency caveat — each sentence earns its place. Slightly dense but no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter mutation with annotations and no output schema, the description is nearly complete: purpose, format, side effect, and safety caveat are all covered. Only permission/auth prerequisites are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds genuine meaning by specifying the expected shape ('scheme, host and optional port, no path') and the wildcard form, clarifying what a valid origin string looks like beyond the schema's examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add an allowed origin') with the concrete effect that browser apps can call the project's API. Easily distinguished from siblings settings_cors_list and settings_cors_remove without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when to use it (enabling a web app origin) and an explicit caution for the wildcard-over-shared-hosting case ('check with the user first'), plus the idempotency rule ('an origin already listed is left as it is'). It does not explicitly steer to settings_cors_remove/list, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settings_cors_listSettings: cors listARead-onlyInspect
List allowed application URLs. Shows the web app origins allowed to call this project's API from a browser. Anythink's own domains and localhost are always allowed and aren't listed. Change the list with settings_cors_add and settings_cors_remove.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=false), so the bar is lower; the description adds real value by disclosing that Anythink's own domains and localhost are always allowed and are deliberately omitted from the output. That implicit-entry behavior is not derivable from annotations or schema. It doesn't mention pagination or output format, which is why it isn't 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?
Three short sentences, front-loaded with what is listed, then the important omission caveat, then the routing to mutation siblings. 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?
With no output schema, the description carries the return-value burden and does so: it explains what the list contains, what is intentionally excluded, and where to change it. An agent has everything needed to call and interpret this 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?
Zero parameters, so the baseline is 4; there is nothing for the description to disambiguate beyond what the empty schema already establishes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (List) plus resource (allowed application URLs / web app origins allowed to call this project's API), immediately scoped to the project's API. It also names the two sibling tools that mutate the same list, so an agent can tell it apart from settings_cors_add/remove without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The sentence 'Change the list with `settings_cors_add` and `settings_cors_remove`' clearly routes mutations elsewhere, implying this tool is the read/inspection path. It stops short of an explicit 'use this when you need to audit or display allowed origins' statement, but the alternative is named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settings_cors_removeSettings: cors removeADestructiveInspect
Remove an allowed origin (clears the CORS cache). Removes an origin from the allow-list and clears the CORS cache, so browser apps on it are blocked straight away. Pass the origin as settings_cors_list shows it; a value not in the list is reported and nothing changes. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Application origin, e.g. https://app.example.com or a wildcard like https://*.example.com |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description discloses real behavioral traits: the CORS cache is cleared so blocked apps take effect immediately, and an unknown origin is reported as a no-op rather than silently failing. That consequence-level detail is exactly what annotations alone cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and its consequence, but there is mild redundancy: the parenthetical '(clears the CORS cache)' is restated in full in the following sentence, which costs a little space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool with full annotation coverage and no output schema, the description covers action, side effect, input sourcing, failure behavior, and user-confirmation guidance. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds meaning by specifying that the origin must be passed exactly as settings_cors_list shows it and that non-matching values are reported. This clarifies accepted values beyond the schema's format example.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (remove) and resource (an allowed origin / CORS allow-list entry), and it does so in a way that distinguishes it from siblings like settings_cors_add and settings_cors_list. An agent can tell immediately what this tool does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implicitly directs the agent to call settings_cors_list first to obtain the exact origin value and warns to confirm with the user before running a destructive operation. It lacks an explicit when-not framing, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settings_getSettings: getARead-onlyInspect
Show all project settings. Shows the project's name, description, email confirmation and sign-up rules, default role for new users, group RLS, AI mode and model, payment redirect URLs, trial settings and allowed CORS origins. Secret-like values such as google_maps_key show only as set. Its field names are the keys settings_set takes. Returns JSON.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely non-obvious behavior: secret-like values such as google_maps_key are redacted to show only as set, and the response format is JSON.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, followed by the field enumeration that earns its place by telling the agent what it will receive. The field list is long but informative rather than padded.
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 and no parameters, the description carries the return-value burden and does so adequately by listing the settings categories and noting redaction. A brief note on structure/nesting would make it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The mention of settings_set key names is a useful cross-tool hint but not a parameter concern.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Show all project settings') and enumerates exactly which settings are included, so an agent distinguishes it immediately from sibling writers like settings_set or settings_cors_add.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'Show all project settings' and the pointer that its field names are the keys settings_set takes, but there is no explicit when-to-use vs. when-not guidance or named alternative for reading subsets (e.g. settings_cors_list).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settings_setSettings: setADestructiveInspect
Set a single project setting. Changes one setting, named as in settings_get (for example allow_registrations, default_role_id, ai_mode or payment_success_url), and keeps the rest; booleans take true or false. Opening sign-ups, turning off email confirmation or giving new users an admin role goes through without a further prompt. For CORS origins use settings_cors_add. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Setting key (run 'anythink settings get' to see them). For CORS URLs use 'settings cors'. | |
| value | Yes | New value |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is known; the description still adds real value by disclosing the partial-update semantics ('keeps the rest'), the value format ('booleans take true or false'), and the fact that some changes (sign-ups, email confirmation, admin role) apply without a further prompt. It stops short of describing return values or reversibility, hence not 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?
Three tight sentences: purpose first, alternatives and value syntax next, destructive-confirmation caveat last. No filler and nothing buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter mutation with full schema coverage and annotations carrying the destructive/read-only profile, the description supplies everything missing: key examples, boolean formatting, the CORS sibling route, and a confirmation requirement. No output schema exists, so return values need not be explained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema does not: concrete example key names and the fact that booleans are passed as true/false even though 'value' is typed as a plain string. That clarifies the loose typing the schema leaves implicit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource pair ('Set a single project setting') and immediately scopes it against the sibling it is not: 'For CORS origins use settings_cors_add'. The examples of valid keys (allow_registrations, default_role_id, ai_mode, payment_success_url) and the reference back to settings_get make the target of the operation 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?
It names the discovery path ('named as in settings_get'), the sibling alternative for the CORS case ('For CORS origins use settings_cors_add'), and an explicit pre-condition to confirm with the user before running. An agent knows both when to pick this tool and when to route elsewhere.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
signupSign up for AnythinkAInspect
Register a brand-new Anythink platform account with email and password. Use this only when the user has no account yet; if they already have one, use 'login' instead. This creates the top-level user identity — it does not create a billing account or project (do that with 'accounts_create' and 'projects_create' after logging in). On success the user may need to click an email confirmation link before 'login' works; tell them to confirm, then call 'login'.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | Email address — becomes the login identifier and must be unique | ||
| lastName | Yes | User's last name | |
| password | Yes | Password for the new account; choose a strong value | |
| firstName | Yes | User's first name | |
| referralCode | No | Optional referral code, if the user was invited by another customer |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare openWorldHint and destructiveHint=false, so the description adds real value: the email-confirmation prerequisite before 'login' works, and the explicit statement that it creates only the top-level user identity and not a billing account or project. It stops short of describing the return payload or uniqueness failure behavior, so a 4 rather than 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?
Front-loads the core action, then immediately addresses the routing decision, the scope boundary, and the post-success step. Four sentences, each carrying distinct operational information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an unauthenticated, side-effecting call with no output schema, the description covers the critical success path (email confirmation) and the boundary with related tools. It does not describe what the call returns or error cases, which is a minor gap given the low overall complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters, including the referralCode default and the email uniqueness constraint, are already documented. The description mentions email and password but adds no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Register a brand-new Anythink platform account with email and password') and explicitly scopes it against the sibling 'login'. It also carves out what it is not, distinguishing it from 'accounts_create' and 'projects_create'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit condition for use ('only when the user has no account yet'), the negative condition with the alternative ('if they already have one, use login instead'), and names the follow-on tools for adjacent tasks. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
users_deleteUsers: deleteADestructiveInspect
Delete a user by ID. Removes the user from this project, so they can no longer sign in to it or use their role's access. The role and its permissions stay in place for everyone else. Make sure you have the right person with users_get first. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | User ID to delete. Find it with users_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, so the safety profile is covered. The description adds real context beyond that: the removal is scoped to this project, the user loses sign-in and role access, and the role/permissions remain intact for everyone else. Only irreversibility of the deletion itself is not stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the core action, followed by consequences, then prerequisites and a safety check. No filler; every sentence adds a distinct fact an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool with no output schema, the description covers action, scope of effect, what is preserved, prerequisite verification, and the confirmation requirement. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the `id` parameter is already fully documented in the schema (including where to find it via users_list). The description's 'by ID' adds nothing beyond what the schema provides; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Delete) and resource (user) with explicit scope: removal from this project. It clearly separates this from siblings like users_get, users_list, and users_invite, and the ID-based targeting makes the operation 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?
Names a concrete prerequisite ('Make sure you have the right person with `users_get` first') and instructs confirmation before running. It lacks an explicit when-not-to-use clause (e.g., pointing to roles_delete for permission changes), but the pre-step guidance is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
users_getUsers: getARead-onlyInspect
Get a user by ID. Shows one user's name, email, role, whether they have confirmed their invitation and when they were created. Use it to check one person's role; use users_list to scan everyone, and roles_permissions_list to see what their role allows.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | User ID. Find it with users_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuine value beyond that by disclosing the shape of the returned record (name, email, role, invitation status, creation date). It does not mention error behavior for an unknown ID, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no waste, with the core action front-loaded and the routing guidance immediately after. Every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description compensates by listing the fields returned. For a one-parameter read tool with a full annotation profile, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter with 100% schema description coverage, and the schema already tells the agent to find the ID via users_list. The description adds only 'by ID', so the baseline of 3 for schema-covered parameters 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?
States a specific verb and resource ('Get a user by ID') and enumerates the returned fields (name, email, role, invitation confirmation, creation date). It also names the siblings it is not, so an agent can distinguish it from users_list and roles_permissions_list without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use this to check one person's role, use `users_list` to scan everyone, and `roles_permissions_list` to see what a role allows. Both the when-to-use and the alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
users_inviteUsers: inviteAInspect
Create a user and send an invitation email. Adds the person to this project with the role given by role_id, then emails them an invitation to confirm their account. Always pass role_id from roles_list: the API rejects an invite without an existing role, and administrator roles can't be given this way. Check users_list first so nobody is invited twice.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | User email address | ||
| role_id | No | Role ID to assign. Find it with roles_list. | |
| last_name | Yes | Last name | |
| first_name | Yes | First name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=true, so the description is not needed for the safety profile. It still adds real behavioral context beyond them: the API rejects an invite lacking an existing role, administrator roles cannot be assigned through this path, and an email is dispatched. It does not cover failure modes or idempotency beyond the role constraint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the primary action, followed by side effects and then prerequisites in four tight sentences. Every clause carries a distinct instruction (role source, rejection condition, admin exclusion, dedup check) with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description covers what the call does and its preconditions adequately. One gap: role_id is not marked required in the schema yet the description says 'Always pass role_id', a tension an agent may have to resolve; it also says nothing about the returned user record or invitation state.
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 exceeds that by constraining role_id to values obtained from roles_list and by ruling out administrator roles, information the schema does not carry. It adds no format or constraint detail for email/first_name/last_name, which the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create a user and send an invitation email') and clarifies the side effects: the person is added to this project with role_id and then emailed to confirm. It is clear what the tool does, though it never distinguishes itself from near-name siblings like accounts_create or signup, which an agent could plausibly confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete preconditions rather than generic advice: always source role_id from roles_list, and check users_list first to avoid duplicate invites. That is actionable routing guidance, though it stops short of stating when to prefer this over alternatives such as accounts_create or signup.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
users_listUsers: listARead-onlyInspect
List all users. Shows each person who can sign in to this project with their id, name, email, role and whether they have confirmed their invitation. Use it to find a user's id, or to see who holds a role before changing it with roles_permissions_add or deleting it with roles_delete.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds value by disclosing the exact shape of returned data (id, name, email, role, invitation confirmation status), which is not derivable from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, with the core purpose front-loaded before the usage guidance. Every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description correctly compensates by enumerating returned fields; annotations cover the safety profile and there are no parameters to document. Nothing needed to invoke this read-only list tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric baseline is 4. The description's field listing describes output, not inputs, and no 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?
States a specific verb and resource ('List all users') and adds scope ('each person who can sign in to this project') plus the returned fields. The naming, juxtaposed with siblings users_get/users_me, makes the all-vs-single distinction clear, though the description never explicitly contrasts them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage contexts ('find a user's id', 'see who holds a role before changing it') and names the downstream tools roles_permissions_add and roles_delete. No explicit when-not guidance or alternative-tool routing (e.g. vs users_get) is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
users_meUsers: meARead-onlyInspect
Show the currently authenticated user. Shows the user you are signed in as in this project: id, name, email, role, whether confirmed and when created. Your role decides what every other tool may do, so check it when a call is refused; use users_get to look up someone else.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds real behavioral value beyond that: it enumerates the returned fields and explains that role determines what every other tool may do, which is the diagnostic context an agent needs. It stops short of stating auth prerequisites or error shapes, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the identity of the resource, then the return fields, then the routing rule to `users_get`. Every sentence carries distinct information and none is 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?
There is no output schema, so the description must carry the return shape, and it does (id, name, email, role, confirmed, created). Combined with the readOnly annotation and the role-based usage rationale, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so there is no parameter semantics to document and the baseline is 4. The description correctly spends no words on inputs and instead clarifies what the parameterless call returns.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Show the currently authenticated user') and immediately enumerates the returned fields. It explicitly distinguishes itself from `users_get` ('to look up someone else'), so an agent can separate it from the sibling without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use trigger ('check it when a call is refused' because role gates every other tool) and names the alternative for the other case (`users_get`). Both the use case and the exclusion are stated, not inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflows_createWorkflows: createAInspect
Create a new workflow. Creates the workflow with one trigger and no steps: Manual needs entity, Timed needs cron, Event needs entity plus an event (EntityCreated by default) and an optional filter, and Api needs api_route. It stays disabled unless enabled is set; add steps with workflows_step_add, then turn it on with workflows_enable.
| Name | Required | Description | Default |
|---|---|---|---|
| cron | No | Cron expression, required for a Timed trigger (e.g. '0 9 * * *') | |
| name | Yes | Workflow name | |
| event | No | Event for an Event trigger: EntityCreated (default), EntityUpdated, EntityDeleted, UserRegistered, PaymentSucceeded and others. Not case-sensitive | |
| entity | No | Entity name, required for an Event or Manual trigger | |
| filter | No | Filter expression JSON for Event trigger (fires only when predicate matches the row) | |
| enabled | No | Enable workflow immediately after creation | |
| trigger | No | Trigger type: Manual (default), Timed, Event, Api. Not case-sensitive | |
| api_route | No | API route, required for an Api trigger | |
| description | No | Workflow description | |
| filter_file | No | Path to a file containing the filter expression JSON |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-read-only, non-destructive write, but the description adds crucial behavioral context: the workflow stays disabled unless enabled is set, it is created with exactly one trigger and zero steps, and each trigger type has specific parameter requirements. This goes well beyond the annotation set.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and then packs trigger requirements, default state, and next steps into a single dense second sentence. It earns its length but the second sentence is run-on enough to benefit from slight restructuring.
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 the creation lifecycle well, including the disabled default and the follow-up steps. It does not explain how to reference the newly created workflow for subsequent steps (e.g., whether an ID is returned), a minor gap given there is no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter's schema description already documents its trigger-specific requirements and defaults. The description restates these conditions (e.g., 'Manual needs entity', 'Timed needs cron') but adds no new syntax or constraints 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?
States a specific verb and resource ('Create a new workflow') and immediately scopes it to a workflow with one trigger and no steps. It distinguishes itself from siblings by naming workflows_step_add and workflows_enable as the next steps in the lifecycle.
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 covers when to use this tool (initial creation of a trigger-only workflow), what it cannot do (no steps), and names the alternative tools for adding steps and enabling. The trigger-type requirements further specify invocation conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflows_deleteWorkflows: deleteADestructiveInspect
Delete a workflow. Removes the workflow with its triggers and steps, so it stops running and can't be restored. To stop it for a while use workflows_disable; to keep a copy first, use workflows_export. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Workflow ID to delete. Find it with workflows_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and readOnlyHint=false, so the safety class is already known; the description goes further by disclosing the cascade (triggers and steps are removed), that the workflow stops running, and that the operation is irreversible ("can't be restored"). That irreversibility and blast-radius detail is not recoverable from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, each carrying distinct payload: action, consequence, alternatives, and safety prompt. The destructive outcome is front-loaded rather than buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive tool with no output schema, everything an agent needs is present: what is deleted, what else is destroyed, that it is irreversible, safer alternatives, and a confirmation expectation. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single `id` parameter already documents both its meaning and how to find it (workflows_list). The description adds no format, type, or lookup nuance beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ("Delete a workflow") and immediately qualifies scope by stating the cascade: triggers and steps go with it. It is unmistakably distinct from siblings like workflows_disable, workflows_export, and workflows_update.
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 routes the agent to alternatives with their selecting conditions: `workflows_disable` for temporary stops and `workflows_export` when a copy is wanted first. It also adds a procedural precondition (confirm with the user), which is exactly the when-to-use guidance a destructive tool needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflows_disableWorkflows: disableAInspect
Disable a workflow. Stops the workflow running from its triggers but keeps its triggers, steps and job history, so workflows_enable turns it back on. Prefer this to workflows_delete when a workflow should only stop for a while.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Workflow ID. Find it with workflows_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-read-only, non-destructive mutation, and the description goes beyond that by disclosing exactly what is preserved (triggers, steps, job history) and that the change is reversible via workflows_enable. That is precisely the behavioral context structured fields cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action, then state effects, then the routing rule. No redundancy and every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter state-toggle with no output schema, the description covers purpose, reversibility, retained state, and sibling alternatives. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single `id` parameter already documents both its type and how to obtain it ('Find it with workflows_list'). The description adds nothing beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('Disable') plus resource ('a workflow'), with an explicit statement of what disabling does to the workflow's runtime state. It cleanly distinguishes itself from workflows_delete and workflows_enable, which are both present as siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Prefer this to `workflows_delete` when a workflow should only stop for a while,' and names `workflows_enable` as the reverse operation. Both the alternative and the selecting condition are stated outright.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflows_enableWorkflows: enableAInspect
Enable a workflow. An enabled workflow runs on its own from its triggers: Timed on its cron schedule, Event when the matching event happens, Api when its route is called. Use workflows_disable to pause it without losing its steps.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Workflow ID. Find it with workflows_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, openWorldHint=false, and destructiveHint=false, but the description adds real runtime behavior: an enabled workflow runs automatically from Timed, Event, or Api triggers, and disabling pauses it without losing steps. That is useful context beyond the structured fields and creates 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?
Three tight sentences with the action front-loaded, followed by the behavior change and then the alternative tool. Every sentence adds useful selection or behavior information without filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple toggle operation, the description covers purpose, runtime behavior, trigger modes, and the workaround for pausing. With an output schema absent, no return-value explanation is required, and the annotations already carry the safety profile.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single `id` parameter is already documented as 'Workflow ID. Find it with workflows_list.' The description adds no parameter details, so the schema carries the full burden. Baseline 3 is correct for a high-coverage single-parameter 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?
Specifically states the verb and resource: 'Enable a workflow.' It clearly distinguishes the action from the sibling `workflows_disable` and from adjacent workflow tools by explaining what enabling actually activates.
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 routing guidance by naming the alternative tool and the condition for choosing it: 'Use `workflows_disable` to pause it without losing its steps.' This tells the agent when to use enable and when to use its counterpart.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflows_exportWorkflows: exportADestructiveInspect
Export an existing workflow to JSON (round-trippable with seed). Gives the workflow's definition as JSON with no ids: its triggers, and its steps with their parameters, linked by step key through on_success/on_failure. Use it to back up or copy a workflow; for the ids the step tools need, use workflows_get. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Workflow ID to export. Find it with workflows_list. | |
| output | No | Write to FILE instead of stdout |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, and the description reinforces this with an explicit 'check with the user before running it' warning. Beyond annotations, it discloses the return shape (triggers, steps with parameters, linked via on_success/on_failure, no ids, round-trippable with seed), which is genuinely useful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with the core action and the routing alternative front-loaded, followed by the caution. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by describing the returned JSON structure and its linking model. Combined with the schema and annotations, an agent has everything needed to invoke the tool and interpret its result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both `id` and `output` are already documented in the schema. The description adds only a marginal note that the exported payload carries no ids; otherwise it does not extend parameter meaning, matching the baseline for full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (export) and resource (existing workflow) plus the output format (JSON). It explicitly distinguishes itself from the sibling `workflows_get` and by implication `workflows_seed`, so an agent can route correctly without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete use cases (back up or copy a workflow) and names the alternative (`workflows_get`) with the condition that selects it (need the ids the step tools require). It also adds a pre-run caution to check with the user.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflows_file_handler_addWorkflows: file handler addAInspect
Add a FileHandler step with named flags (no hand-written params JSON). The step attaches a file to a record's file field: fetch_and_link downloads source_url, link_existing attaches existing_file_id, and detach unlinks it; entity, record_id (usually {{ $anythink.trigger.id }}) and field are always needed. Unlike workflows_step_add it can set on_success/on_failure in the same call, and the step is created disabled unless enabled is set.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Step display name (defaults to the step key) | |
| field | No | Field name on the record to link the file to (required, snake_case) | |
| start | No | Set as start step | |
| entity | No | Target entity name (required) | |
| enabled | No | Enable step immediately | |
| step_key | Yes | Step key (unique identifier, snake_case) | |
| file_name | No | Filename to store the uploaded file as (templatable) | |
| folder_id | No | Folder ID to upload the file into (optional, templatable) | |
| is_public | No | Mark the uploaded file as public | |
| link_mode | No | How to link to the field: set (single value) or add (append to multi-value). Default: set | |
| operation | No | FileHandler operation: fetch_and_link, link_existing, detach | |
| record_id | No | Target record ID, typically '{{ $anythink.trigger.id }}' (required) | |
| on_failure | No | Step ID to execute on failure | |
| on_success | No | Step ID to execute on success | |
| source_url | No | URL to fetch the file from (required for fetch_and_link; supports templating) | |
| workflow_id | Yes | Workflow ID. Find it with workflows_list. | |
| existing_file_id | No | Existing file ID (required for link_existing operation; templatable) | |
| overwrite_if_present | No | Re-process even if the field already has a value (idempotency override) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the generic safety profile (readOnly=false, destructive=false, openWorld=false). The description adds a genuinely useful trait not in the annotations: the step is created disabled unless `enabled` is set. It does not cover auth/permission needs or any failure semantics, so it is strong but not complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with purpose and then operations, then the sibling comparison and default-disabled caveat. Every sentence carries information; only slight density cost from packing three operation definitions into one clause.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 18-parameter mutation with no output schema and no dedicated annotations, the description covers the operation modes, conditional required fields, and a default-value behavior, which is what an agent most needs. Remaining params (folder_id, is_public, file_name, link_mode, overwrite_if_present) are fully documented in the schema, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds conditional semantics the schema does not: entity, record_id and field are 'always needed' despite only workflow_id/step_key being in the required array, and it ties source_url/existing_file_id to specific operations. This meaningfully reduces the chance of a mis-invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Add a FileHandler step') and immediately enumerates the three operations (fetch_and_link, link_existing, detach) with what each does. It explicitly distinguishes itself from the sibling workflows_step_add, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative (`workflows_step_add`) and a concrete distinguishing capability (setting on_success/on_failure in the same call) plus the default-disabled behavior, which gives clear selection context. It stops short of a full when-to-use/when-not story or referencing the sibling workflows_file_handler_example as a template source.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflows_file_handler_exampleWorkflows: file handler exampleARead-onlyInspect
Print a copy-paste-ready FileHandler params JSON. The sample uses {{ $anythink... }} templates for the source URL, record id and folder, and changes nothing in the project. Adapt it as params for workflows_step_add or workflows_step_update; to add a FileHandler step directly, workflows_file_handler_add is simpler.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds real context beyond that: the output is a copy-paste-ready JSON, it uses {{ $anythink... }} template placeholders for source URL/record id/folder, and it explicitly 'changes nothing in the project'. It does not detail any size or format limits, but for a pure read/example tool this is strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, each earning its place: output description first, then the template detail, then the routing alternatives. Front-loaded with what the agent gets.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with no output schema, the description carries the whole burden and does so: it explains what is returned (a JSON sample with template placeholders) and what to do with it. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. There is nothing for the description to clarify in terms of argument semantics, and it correctly implies no inputs are required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Print a copy-paste-ready FileHandler params JSON'), and immediately differentiates itself from siblings by naming workflows_step_add, workflows_step_update, and workflows_file_handler_add. An agent can tell this is a sample/example generator rather than a mutating 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?
Explicitly states when to use it (to get params to adapt for workflows_step_add / workflows_step_update) and when a sibling is better (workflows_file_handler_add for directly adding a FileHandler step). The routing decision is fully specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflows_getWorkflows: getARead-onlyInspect
Get workflow details and steps. Includes each trigger with its last and next run, and every step with its id, key, action, parameters, start-step flag and on_success/on_failure step ids. Use those step ids with workflows_step_update, workflows_step_link and workflows_step_delete; for a copy without ids, use workflows_export. Returns JSON.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Workflow ID. Find it with workflows_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description's real contribution is disclosing the shape of the returned document (steps, triggers, run times, linkage ids), which matters since there is no output schema. Minor gap: no pagination or size caveats, though for a single-record get those are largely irrelevant.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with what is returned, then the chaining hint, then the alternative. No filler and nothing redundant except the trailing "Returns JSON", which is minor.
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 carries the burden of telling the agent what it gets back, and it does so field by field. Combined with schema-documented input and readOnly annotations, an agent has everything needed to call and consume this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single required integer id, and the schema itself already tells the agent to find it via workflows_list. The description adds nothing about the parameter, but with full schema coverage the baseline 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?
States a specific verb+resource (get workflow details and steps) and enumerates the returned payload: triggers with last/next run, and each step's id, key, action, parameters, start-step flag and on_success/on_failure ids. This clearly separates it from siblings like workflows_list (enumeration) and workflows_export (id-free copy).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing: returned step ids feed workflows_step_update, workflows_step_link and workflows_step_delete, while workflows_export is named as the alternative when an id-free copy is wanted. The agent knows both what to do next and which sibling to prefer for a different need.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflows_integration_addWorkflows: integration addAInspect
Add an Integration step (Claude, OpenAI, Slack…) with named flags (no hand-written params JSON). The step runs one provider operation, such as claude generate-text, with inputs given as key=value pairs that accept {{ $anythink... }} templates; find provider and operation keys with integrations_get. credential_source chooses the credentials (system, current_user, connection with connection_id, or entity_field), and the step is created disabled unless enabled is set.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Step display name (defaults to the step key) | |
| input | No | Operation input as key=value (repeatable; values support {{templating}}) | |
| model | No | Convenience shortcut for the 'model' input (AI providers) | |
| start | No | Set as start step | |
| inputs | No | Operation inputs as a JSON object (merged with --input flags) | |
| enabled | No | Enable step immediately | |
| provider | No | Integration provider key (e.g. claude, openai, slack). Required. | |
| step_key | Yes | Step key (unique identifier, snake_case) | |
| operation | No | Operation key (see 'integrations get <provider>'). Required. | |
| on_failure | No | Step ID to execute on failure | |
| on_success | No | Step ID to execute on success | |
| workflow_id | Yes | Workflow ID. Find it with workflows_list. | |
| connection_id | No | Connection ID (required when --credential-source is 'connection'; templatable) | |
| credential_field | No | Credential field path (required when --credential-source is 'entity_field') | |
| credential_source | No | system | current_user | connection | entity_field (default: system) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation safety profile (readOnly=false, destructive=false). The description adds genuinely new behavioral context beyond that: the step is created disabled unless `enabled` is set, and inputs accept {{ $anythink... }} templates. These are real traits not derivable from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and the 'no hand-written params JSON' framing before the credential detail. It is a dense single block but every clause carries information; only slight tightening is possible.
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 15-parameter creation tool with no output schema and full schema coverage, the description covers the essential unknowns: how inputs are expressed, where to find keys, credential sourcing, and the disabled-by-default behavior. Return-value explanation is unnecessary since no output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning on top: it explains credential_source semantics (system/current_user/connection/entity_field), ties connection_id to the 'connection' source, and clarifies the key=value templating format for inputs. This is value beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Add) and resource (an Integration step), and immediately disambiguates from the generic step-add sibling by naming the provider-operation model (claude generate-text). An agent can tell this apart from workflows_step_add without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to `integrations_get` to discover provider and operation keys, and enumerates the credential_source options with their conditions. It does not, however, state when to prefer this over workflows_step_add, leaving one sibling distinction implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflows_jobsWorkflows: jobsARead-onlyInspect
View job history for a workflow. Shows the 10 most recent runs, each with its status (Completed, Failed or Running), start time and error, plus every step's status, error and log. Use it after workflows_trigger, or when an event or schedule should have fired, to see whether a run worked and which step failed.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Workflow ID. Find it with workflows_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds useful behavioral context by disclosing that it returns the 10 most recent runs, their statuses, start time, errors, and per-step status/error/log. It omits pagination or permission details, but these are not essential here.
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 tightly written sentences. The first front-loads the purpose and return contents; the second front-loads the usage context. There is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description appropriately explains what the tool returns: job history, statuses, start times, errors, and step-level details. Combined with read-only annotations and a fully documented single parameter, it gives the agent everything needed to call 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 100% for the single required 'id' parameter, and the schema itself documents that the workflow ID can be found with workflows_list. The description adds no parameter-specific meaning, so the baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'View job history for a workflow.' It also specifies the returned scope (10 most recent runs, their statuses and steps), making it easy to distinguish from related workflow tools like workflows_trigger or workflows_get.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context: 'Use it after `workflows_trigger`, or when an event or schedule should have fired.' This tells the agent when the tool is appropriate and ties it to a sibling trigger tool, but it does not explicitly state when not to use it or name an alternative for other diagnostic needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflows_listWorkflows: listARead-onlyInspect
List all workflows. Each entry gives the workflow's id, name, description, enabled flag, step count and its triggers (Manual, Timed, Event or Api) with their config, but not the steps. Use workflows_get to see a workflow's steps and how they link. Returns JSON.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnlyHint=true, openWorldHint=false), so the bar is lower. The description still adds meaningful context by enumerating the exact per-entry payload and explicitly calling out that steps are omitted, plus 'Returns JSON.' It does not mention ordering or pagination, but the return-content disclosure is strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences with no waste: purpose, payload detail, and alternative routing in that order. Every sentence earns its place and nothing is repeated from the title or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-shape burden and delivers it fully — it enumerates the fields returned and explicitly states what is not included (steps), then routes to the sibling that provides them. Nothing an agent needs to call this no-param list tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero input parameters, so there is nothing for the description to compensate for; baseline 4 applies. The description correctly implies an unfiltered full listing, which matches the empty schema with additionalProperties=false.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (workflows), then enumerates the fields each entry contains (id, name, description, enabled flag, step count, triggers) and explicitly notes it excludes steps. This distinguishes it cleanly from the sibling workflows_get. An agent can identify the tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative sibling (workflows_get) and the condition that selects it ('to see a workflow's steps and how they link'). This is clear routing guidance, though it stops short of a full when/when-not split or noting the parameterless nature of this call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflows_seedWorkflows: seedAInspect
Create a workflow and its steps from a JSON file. Reads a JSON file on this machine in the workflows_export format (name, trigger or triggers, and steps with key, action, parameters and on_success/on_failure by step key), fills {{KEY}} placeholders from var, then creates the workflow, adds its steps and links them. It always creates a new workflow, so running it twice makes two copies.
| Name | Required | Description | Default |
|---|---|---|---|
| var | No | Substitute {{KEY}} placeholders in the JSON. Repeatable. | |
| file | Yes | Path to a workflow JSON file (use `workflows export` to produce one) | |
| enabled | No | Override the workflow's enabled flag to true |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which declare a non-read-only, non-destructive, closed-world mutation), the description discloses the multi-step side effects (creates the workflow, adds steps, links them) and, crucially, non-idempotency: "running it twice makes two copies." It does not cover required permissions or failure behavior, but the non-idempotency note is real value annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The primary action is front-loaded and the second sentence delivers the important non-idempotency caveat. The long parenthetical format breakdown is dense but every clause carries information; there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema and full annotation coverage, the description supplies the input file format, the placeholder mechanism, and the duplication caveat. It could still say more about required permissions or error handling, but nothing essential for invoking it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description goes further by outlining the file's internal structure (name, trigger/triggers, steps with key, action, parameters and on_success/on_failure) and reiterating how `var` fills {{KEY}} placeholders. This meaningfully clarifies what the `file` path must contain.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Create) plus resource (a workflow and its steps) and the input source (a JSON file in the `workflows_export` format). This clearly distinguishes it from siblings like workflows_create and workflows_export without needing their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied through the mechanism described and the reference to the `workflows_export` format; the description never states when to prefer this over workflows_create or names an exclusion. An agent can infer it is for seeding from an export file, but there is no explicit when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflows_step_addWorkflows: step addAInspect
Add a step to a workflow. Params are the action's settings as JSON, e.g. {"script":"return {}"} for RunScript or {"entity":"orders","data":{...}} for CreateData. The new step is unlinked: set start on the workflow's first step and chain the rest with workflows_step_link. For FileHandler or Integration steps, workflows_file_handler_add and workflows_integration_add build the params for you.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Step key (unique identifier) | |
| name | No | Step display name | |
| start | No | Set as start step | |
| action | No | Action type: ReadData, CreateData, UpdateData, UpsertData, DeleteData, CallAnApi, RunScript, Condition, SendAnEmail, SendACommand, SendPushNotification, FileHandler, Integration (for Integration, prefer 'integration-add') | |
| params | No | Step parameters as JSON | |
| enabled | No | Enable step immediately | |
| workflow_id | Yes | Workflow ID. Find it with workflows_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly=false, destructive=false, openWorld=false). The description adds genuine behavioral context beyond them: the new step is created unlinked and must be wired up separately via start/link. It does not mention auth requirements or error behavior, but the added lifecycle detail 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?
Three tight sentences, front-loaded with the core action, then params format, then the linking/alternatives note. Every sentence carries distinct, actionable information with no waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-param, fully-documented mutation tool with no output schema, the description covers the non-obvious parts an agent needs: params encoding, the unlinked lifecycle, and correct alternative tools. Nothing essential to a correct call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes further by giving concrete params JSON examples for RunScript and CreateData and pointing to helper tools for FileHandler/Integration params. This meaningfully clarifies the otherwise opaque 'params as JSON' field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add a step to a workflow') and immediately distinguishes itself from related siblings by naming workflows_step_link, workflows_file_handler_add, and workflows_integration_add. An agent can tell exactly what this does versus those tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use the file-handler and integration builders for FileHandler/Integration actions rather than this tool, and chain steps with workflows_step_link. It also clarifies the unlinked-start condition, which is the key usage nuance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflows_step_deleteWorkflows: step deleteADestructiveInspect
Delete a step from a workflow (warns if other steps link to it). The API refuses to delete a step that other steps still point to through on_success or on_failure, so re-point those with workflows_step_link first. Deleting the start step leaves the workflow with no entry point until a new step is added with start. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| step_id | Yes | Step ID to delete | |
| workflow_id | Yes | Workflow ID. Find it with workflows_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, but the description adds real behavioral detail beyond them: the referential-integrity refusal path, the consequence of deleting the start step (orphaned workflow entry point), and the required user confirmation. This is exactly the extra context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each earning its place: core action, linking constraint plus remedy, start-step caveat, and the user-confirmation instruction. The primary action is front-loaded and nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with no output schema, the description covers failure modes, prerequisites, downstream consequences, and the safety check. An agent has everything needed to invoke it correctly and safely.
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 both parameters are self-documented (workflow_id even points to workflows_list), so the schema does the heavy lifting. The description adds no format or syntax detail for the parameters themselves, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a step from a workflow') and immediately scopes it with the linking caveat. An agent can tell it apart from siblings like workflows_step_add, workflows_step_link, and workflows_step_update without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly describes when the call will be refused (steps still pointing via on_success/on_failure), names the prerequisite tool to resolve it (workflows_step_link), and instructs the agent to confirm with the user before running. Covers when-not and the alternative in one pass.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflows_step_getWorkflows: step getARead-onlyInspect
View step details including parameters. Shows one step's key, action, enabled and start-step flags, on_success/on_failure step ids and its full parameters. Read it before workflows_step_update, because params passed there replace the step's parameters as a whole.
| Name | Required | Description | Default |
|---|---|---|---|
| step_id | Yes | Step ID | |
| workflow_id | Yes | Workflow ID. Find it with workflows_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description goes further by detailing the exact fields returned and by disclosing the destructive-replace behavior of the downstream update tool, which is genuinely useful context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the first front-loads what the tool returns, the second delivers the usage advisory. No filler and every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description enumerates the returned fields, largely compensating for that gap and making the tool sufficient to call correctly. Minor omissions (permissions, error behavior) keep it just short of full completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (workflow_id, step_id) are already documented, including the pointer to workflows_list. The description's mention of 'its full parameters' refers to returned step config rather than input params, so it adds little 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 ('View') plus resource ('step details') and enumerates exactly what is returned: key, action, enabled and start-step flags, on_success/on_failure step ids, and full parameters. It also implicitly separates itself from the sibling workflows_step_update, making it distinguishable without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit sequencing guidance: 'Read it before workflows_step_update, because params passed there replace the step's parameters as a whole,' which is a concrete when-to-use directive with a stated reason. It does not, however, cover when-not-to-call or contrast with siblings like workflows_get.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflows_step_linkWorkflows: step linkADestructiveInspect
Link workflow steps together (set on-success/on-failure). Sets which step runs next when this one succeeds (on_success) or fails (on_failure), by step id from workflows_get; a link you leave out keeps its current value. Links can be changed but not cleared here, and the step's name, action and params stay as they are. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| step_id | Yes | Step ID to update | |
| on_failure | No | Step ID to execute on failure | |
| on_success | No | Step ID to execute on success | |
| workflow_id | Yes | Workflow ID. Find it with workflows_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, so the safety warning partly overlaps structured data. The description adds real value beyond them: omitted links retain their current value (partial-update semantics), links can be changed but not cleared, and name/action/params are preserved. It does not describe the response, though no output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the core action before the behavioral caveats. Each sentence carries information (what it does, params semantics, constraints, safety caution), though it is slightly longer than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with no output schema, the description covers the important ground: what changes, what is preserved, what cannot be done (clearing), and the confirmation requirement. The only gap is the absence of any note on the result or effect verification.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3 and the schema documents all four parameters. The description adds the provenance of the step ids (from workflows_get) and clarifies that omitting a link is a no-op rather than a reset, which is meaning beyond the schema's terse 'Step ID to execute on success'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (link workflow steps) and immediately names the two fields it governs, on_success and on_failure. This distinguishes it from siblings like workflows_step_update (name/action/params) and workflows_step_add, which the description explicitly carves out by noting those properties are untouched.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for use (set next-step routing by step id) and a caution to confirm with the user before running. It also flags a limitation — links cannot be cleared here — which implies when a different tool is needed, but it never names that alternative sibling explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflows_step_updateWorkflows: step updateADestructiveInspect
Update step parameters and properties. Changes a step's name, params or enabled flag and keeps its action, start flag and links; it can enable a step but not disable one. Params replace the step's parameters as a whole, so read them with workflows_step_get first; to change which step runs next, use workflows_step_link. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Step name | |
| params | No | Step parameters as JSON | |
| enabled | No | Enable this step | |
| step_id | Yes | Step ID | |
| workflow_id | Yes | Workflow ID. Find it with workflows_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, but the description adds substantial behavior beyond them: params are replaced wholesale rather than merged, the tool can enable but NOT disable a step, and it changes or deletes existing data so the user should be consulted. These are exactly the non-obvious traits an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then layers replacement semantics, sibling routing, and a safety warning, each in a distinct sentence. No filler or restatement of the name/title; every clause carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with no output schema, the description covers scope of change, field replacement behavior, enable-only asymmetry, prerequisite read, sibling alternative, and a caution to confirm with the user. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantics: `params` is a whole-value replacement (not a patch) and must be read first, and `enabled` is one-directional. It does not explain the JSON format of `params` beyond the schema, keeping it just short of 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update step parameters and properties') and immediately scopes the exact fields it touches (name, params, enabled) while naming what it preserves (action, start flag, links). This distinguishes it cleanly from siblings like workflows_step_add, workflows_step_link, and workflows_step_delete.
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 routes the agent: read params first with `workflows_step_get`, and use `workflows_step_link` to change which step runs next. It also names the condition (params replace as a whole) that forces the read-first pattern, so the when/when-not guidance is complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflows_triggerWorkflows: triggerAInspect
Manually trigger a workflow. Starts a run now and returns without the run's result; check the outcome with workflows_jobs. A Manual-trigger workflow needs entity (and entity_id for a specific record), and payload is a JSON object the steps read as $anythink.trigger.data.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Workflow ID. Find it with workflows_list. | |
| entity | No | Entity name for the trigger (required for Manual-trigger workflows) | |
| payload | No | Optional JSON record to pass to the workflow (available as $anythink.trigger.data) | |
| entity_id | No | Optional entity/record id to associate with the trigger |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the non-read-only, non-destructive, open-world profile, so the bar is lower. The description still adds important behavior beyond them: the call is asynchronous and returns without the run's result, which materially shapes how an agent sequences follow-up calls. It doesn't cover permissions 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?
Three short sentences, front-loaded with the action and effect, then the async caveat, then the input requirements. No filler or restated title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly explains what comes back (no run result) and where to get it, which is the main completeness risk for this tool. Minor gap: the schema types payload as a string while the description calls it 'a JSON object', which could confuse how the value is encoded.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes slightly beyond the per-property text by framing the conditional relationship between trigger type and the entity/entity_id pair, and reiterating that payload is read as $anythink.trigger.data.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Manually trigger a workflow') and immediately describes the effect ('Starts a run now'). It is clearly distinguishable from siblings like workflows_list, workflows_create, and workflows_jobs, and even names the sibling to use for results.
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?
Tells the agent what to do after triggering ('check the outcome with workflows_jobs') and states the prerequisite for Manual-trigger workflows (entity, plus entity_id for a specific record). It lacks an explicit when-not-to-use or trigger-type-exclusion statement, but the guidance is concrete and conditional.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflows_updateWorkflows: updateADestructiveInspect
Update a workflow's name or description. Only the name and description change; the triggers, steps, group and enabled state are sent back unchanged, and no tool here edits a trigger. It refuses to run while an existing trigger is incomplete (e.g. a Timed trigger with no cron), which must be fixed in the dashboard first. To change a step, use workflows_step_update. It changes or deletes existing data, so check with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Workflow ID. Find it with workflows_list. | |
| name | No | New workflow name | |
| description | No | New workflow description |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description adds substantive behavior the annotations cannot convey: only name/description mutate while other fields round-trip unchanged, the update refuses to run on an incomplete trigger, and user confirmation is required. This is rich, non-obvious operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action and its scope, then layers constraints and the alternative in a compact sequence. Slightly dense with four clauses, but every clause carries actionable information and nothing is 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?
With no output schema, the description covers everything an agent needs: mutation scope, side effects on untouched fields, the refusal precondition, the sibling tool for step edits, and the requirement to confirm with the user. Annotations cover the safety profile and the schema covers parameters.
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 id, name and description (including the pointer to workflows_list for the id). The description adds no format or syntax detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update a workflow's name or description') and immediately bounds the scope, noting that triggers, steps, group and enabled state are sent back unchanged. An agent can distinguish it from workflows_step_update and workflows_trigger without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes step edits to `workflows_step_update`, states the precondition failure case (incomplete trigger, e.g. Timed with no cron) and where it must be fixed (dashboard), and instructs the agent to confirm with the user before running. When-to-use, when-not-to-use, and alternatives are all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
109 tool updates
v0.2.37- Changed
api_keys_revoke1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"API key ID to revoke"New value: +"API key ID to revoke. Find it with api_keys_list."
- Added
charts_create - Added
charts_delete - Added
charts_get - Added
charts_list - Added
charts_platform_metrics - Added
charts_preview - Added
charts_update - Added
dashboards_add_chart - Added
dashboards_create - Added
dashboards_data - Added
dashboards_delete - Added
dashboards_get - Added
dashboards_list - Added
dashboards_mine - Added
dashboards_promote_to_default - Added
dashboards_remove_widget - Added
dashboards_set_home - Added
dashboards_update - Added
dashboards_widget_preview - Changed
data_delete1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Record ID"New value: +"Record ID. Find it with data_list."
- Added
data_export - Changed
data_get1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Record ID"New value: +"Record ID. Find it with data_list."
- Added
data_import - Changed
data_rls1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Record ID"New value: +"Record ID. Find it with data_list."
- Changed
data_update1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Record ID"New value: +"Record ID. Find it with data_list."
- Added
email_preview - Added
email_shell_show - Added
email_shell_update - Added
email_templates_list - Added
email_templates_show - Added
email_templates_update - Changed
fetch1 field changed- added
Input schema / properties / allAdded value: +{ + "description": "Follow every page of a paged GET response, printing each page as it arrives", + "type": "boolean" +}
- Changed
files_delete1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"File ID to delete"New value: +"File ID to delete. Find it with files_list."
- Changed
files_get1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"File ID"New value: +"File ID. Find it with files_list."
- Added
import_directus - Changed
integrations_disable1 field changed- changed
Input schema / properties / connection_id / descriptionPrevious value: -"Connection ID"New value: +"Connection ID. Find it with integrations_connections_list."
- Changed
integrations_disconnect1 field changed- changed
Input schema / properties / connection_id / descriptionPrevious value: -"Connection ID to delete"New value: +"Connection ID to delete. Find it with integrations_connections_list."
- Changed
integrations_enable1 field changed- changed
Input schema / properties / connection_id / descriptionPrevious value: -"Connection ID"New value: +"Connection ID. Find it with integrations_connections_list."
- Changed
integrations_test1 field changed- changed
Input schema / properties / connection_id / descriptionPrevious value: -"Connection ID"New value: +"Connection ID. Find it with integrations_connections_list."
- Changed
menus_add_item1 field changed- changed
Input schema / properties / menu_id / descriptionPrevious value: -"Menu ID to add the item to"New value: +"Menu ID to add the item to. Find it with menus_list."
- Added
menus_create - Added
menus_delete - Added
menus_get - Added
menus_remove_item - Added
menus_reorder - Added
menus_reorder_items - Added
menus_update - Added
menus_update_item - Added
pay_entitlement - Added
pay_offers_activate - Added
pay_offers_add_code - Added
pay_offers_codes - Added
pay_offers_create - Added
pay_offers_delete - Added
pay_offers_get - Added
pay_offers_list - Added
pay_offers_pause - Added
pay_offers_redemptions - Added
pay_offers_update - Added
pay_offers_user_code - Added
pay_payment_options - Added
pay_plans_create - Added
pay_plans_delete - Added
pay_plans_get - Added
pay_plans_list - Added
pay_plans_update - Added
pay_subscriptions_by_user - Added
pay_subscriptions_cancel - Added
pay_subscriptions_check_access - Added
pay_subscriptions_delete - Added
pay_subscriptions_events - Added
pay_subscriptions_force_expire - Added
pay_subscriptions_get - Added
pay_subscriptions_list - Added
pay_subscriptions_relink - Added
pay_subscriptions_resume - Added
pay_subscriptions_resync - Added
pay_trial_disable - Added
pay_trial_enable - Added
pay_trial_status - Changed
roles_delete1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Role ID to delete"New value: +"Role ID to delete. Find it with roles_list."
- Changed
roles_permissions_add1 field changed- changed
Input schema / properties / role_id / descriptionPrevious value: -"Role ID"New value: +"Role ID. Find it with roles_list."
- Changed
roles_permissions_list1 field changed- changed
Input schema / properties / role_id / descriptionPrevious value: -"Role ID"New value: +"Role ID. Find it with roles_list."
- Changed
roles_permissions_remove1 field changed- changed
Input schema / properties / role_id / descriptionPrevious value: -"Role ID"New value: +"Role ID. Find it with roles_list."
- Added
settings_cors_add - Added
settings_cors_list - Added
settings_cors_remove - Added
settings_get - Added
settings_set - Changed
users_delete1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"User ID to delete"New value: +"User ID to delete. Find it with users_list."
- Changed
users_get1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"User ID"New value: +"User ID. Find it with users_list."
- Changed
users_invite1 field changed- changed
Input schema / properties / role_id / descriptionPrevious value: -"Role ID to assign"New value: +"Role ID to assign. Find it with roles_list."
- Changed
workflows_create5 fields changed- changed
Input schema / properties / api_route / descriptionPrevious value: -"Custom API route (for Api trigger)"New value: +"API route, required for an Api trigger" - changed
Input schema / properties / cron / descriptionPrevious value: -"Cron expression (for Timed trigger, e.g. '0 9 * * *')"New value: +"Cron expression, required for a Timed trigger (e.g. '0 9 * * *')" - changed
Input schema / properties / entity / descriptionPrevious value: -"Entity name for Event trigger"New value: +"Entity name, required for an Event or Manual trigger" - changed
Input schema / properties / event / descriptionPrevious value: -"Event type: EntityCreated, EntityUpdated, EntityDeleted"New value: +"Event for an Event trigger: EntityCreated (default), EntityUpdated, EntityDeleted, UserRegistered, PaymentSucceeded and others. Not case-sensitive" - changed
Input schema / properties / trigger / descriptionPrevious value: -"Trigger type: Manual, Timed, Event, Api"New value: +"Trigger type: Manual (default), Timed, Event, Api. Not case-sensitive"
- Changed
workflows_delete1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Workflow ID to delete"New value: +"Workflow ID to delete. Find it with workflows_list."
- Changed
workflows_disable1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Workflow ID"New value: +"Workflow ID. Find it with workflows_list."
- Changed
workflows_enable1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Workflow ID"New value: +"Workflow ID. Find it with workflows_list."
- Changed
workflows_export1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Workflow ID to export"New value: +"Workflow ID to export. Find it with workflows_list."
- Changed
workflows_file_handler_add1 field changed- changed
Input schema / properties / workflow_id / descriptionPrevious value: -"Workflow ID"New value: +"Workflow ID. Find it with workflows_list."
- Changed
workflows_get1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Workflow ID"New value: +"Workflow ID. Find it with workflows_list."
- Changed
workflows_integration_add1 field changed- changed
Input schema / properties / workflow_id / descriptionPrevious value: -"Workflow ID"New value: +"Workflow ID. Find it with workflows_list."
- Changed
workflows_jobs1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Workflow ID"New value: +"Workflow ID. Find it with workflows_list."
- Changed
workflows_step_add1 field changed- changed
Input schema / properties / workflow_id / descriptionPrevious value: -"Workflow ID"New value: +"Workflow ID. Find it with workflows_list."
- Changed
workflows_step_delete1 field changed- changed
Input schema / properties / workflow_id / descriptionPrevious value: -"Workflow ID"New value: +"Workflow ID. Find it with workflows_list."
- Changed
workflows_step_get1 field changed- changed
Input schema / properties / workflow_id / descriptionPrevious value: -"Workflow ID"New value: +"Workflow ID. Find it with workflows_list."
- Changed
workflows_step_link1 field changed- changed
Input schema / properties / workflow_id / descriptionPrevious value: -"Workflow ID"New value: +"Workflow ID. Find it with workflows_list."
- Changed
workflows_step_update1 field changed- changed
Input schema / properties / workflow_id / descriptionPrevious value: -"Workflow ID"New value: +"Workflow ID. Find it with workflows_list."
- Changed
workflows_trigger1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Workflow ID"New value: +"Workflow ID. Find it with workflows_list."
- Changed
workflows_update1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Workflow ID"New value: +"Workflow ID. Find it with workflows_list."
102 tool updates
v0.2.27- Changed
accounts_create2 fields changed- removed
Input schema / descriptionRemoved value: -"Create a new billing account (organization) to hold projects and payment details. Requires a prior platform login (use the 'login' tool first). The new account is automatically set as the active account, so subsequent 'projects_create' / 'projects_list' calls target it without further setup. Returns the new account's id and name. Most users need only one account — call 'accounts_list' first to check whether a suitable one already exists." - removed
Input schema / titleRemoved value: -"accounts_create"
- Changed
accounts_list2 fields changed- removed
Input schema / descriptionRemoved value: -"List the billing accounts (organizations) the logged-in user belongs to. Requires a prior platform login (use the 'login' tool first). Returns each account's id, organization name, billing email, currency, and status (Active/Suspended/Canceled), and flags which one is currently active. A billing account holds your projects and payment details — pick one with 'accounts_use' before creating or listing projects." - removed
Input schema / titleRemoved value: -"accounts_list"
- Changed
accounts_use2 fields changed- removed
Input schema / descriptionRemoved value: -"Set the active billing account that project commands operate on. Call this after 'login' when you belong to more than one account, before using 'projects_list', 'projects_create', or 'projects_use'. Accepts a full account UUID or a unique prefix; run 'accounts_list' to see valid ids. Returns the resolved account name and id, or an error if no account matches." - removed
Input schema / titleRemoved value: -"accounts_use"
- Added
api - Added
api_keys_create - Added
api_keys_list - Added
api_keys_revoke - Changed
cli2 fields changed- removed
Input schema / descriptionRemoved value: -"Run any Anythink CLI command and return its output. Use this for commands not covered by dedicated tools (entities, fields, data, workflows, roles, menus, secrets, users, files, pay, oauth, migrate, fetch, api, docs, etc.). Pass the command exactly as you would after 'anythink', e.g. 'entities list' or 'data list posts'. Menu commands: 'menus list' shows dashboard menus with tree structure; 'menus add-item <menu_id> <entity> --icon <Icon> --parent <parent_id>' adds an entity to a dashboard menu. For destructive commands add '--yes' to skip confirmation prompts. Add '--json' where supported for machine-readable output." - removed
Input schema / titleRemoved value: -"cli"
- Changed
config_remove2 fields changed- removed
Input schema / descriptionRemoved value: -"Delete a saved project profile from the local CLI configuration. Removes only the locally stored credentials and settings — it does not delete the project or revoke tokens server-side (to remove the project itself, use 'projects_delete'). Run 'config_show' to see profile names. Returns confirmation, or a not-found message." - removed
Input schema / titleRemoved value: -"config_remove"
- Changed
config_show2 fields changed- removed
Input schema / descriptionRemoved value: -"Show the local CLI configuration: all saved project profiles and platform logins, and which of each is active. For every profile it returns the name, org id, auth method (api-key or token), alias, and platform; for every platform it returns the URLs, billing account, and login status. Use this to discover profile names for 'config_use', 'config_remove', or 'logout', and to check which project the 'cli' tool currently targets. Reads local config only — makes no network calls." - removed
Input schema / titleRemoved value: -"config_show"
- Changed
config_use2 fields changed- removed
Input schema / descriptionRemoved value: -"Switch the active project profile that the 'cli' tool's commands operate against. Use this to move between already-connected projects without re-authenticating. The profile must already exist (created by 'projects_use' or 'login_direct'); run 'config_show' to see available profile names. Returns confirmation, or an error if the profile does not exist." - removed
Input schema / titleRemoved value: -"config_use"
- Added
data_create - Added
data_delete - Added
data_get - Added
data_list - Added
data_rls - Added
data_update - Added
docs - Added
entities_create - Added
entities_delete - Added
entities_get - Added
entities_list - Added
entities_update - Added
fetch - Added
fields_add - Added
fields_delete - Added
fields_get - Added
fields_list - Added
fields_update - Added
files_delete - Added
files_get - Added
files_list - Added
files_upload - Added
integrations_connect - Added
integrations_connections_list - Added
integrations_disable - Added
integrations_disconnect - Added
integrations_enable - Added
integrations_execute - Added
integrations_get - Added
integrations_list - Added
integrations_oauth_callback_url - Added
integrations_oauth_configure - Added
integrations_oauth_connect - Added
integrations_oauth_status - Added
integrations_test - Changed
login2 fields changed- removed
Input schema / descriptionRemoved value: -"Log in to the Anythink platform with email and password. Returns a session token used for account and project management. For Google sign-in, use the 'login_google' tool." - removed
Input schema / titleRemoved value: -"login"
- Changed
login_direct6 fields changed- removed
Input schema / descriptionRemoved value: -"Store credentials directly for a project (bypasses billing login). Use this when you already have an org ID and API key or JWT token." - changed
Input schema / properties / apiKey / typePrevious value: -"string"New value: +[ + "string", + "null" +] - changed
Input schema / properties / baseUrl / typePrevious value: -"string"New value: +[ + "string", + "null" +] - changed
Input schema / properties / profile / typePrevious value: -"string"New value: +[ + "string", + "null" +] - changed
Input schema / properties / token / typePrevious value: -"string"New value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"login_direct"
- Changed
login_google2 fields changed- removed
Input schema / descriptionRemoved value: -"Sign in to the Anythink platform with Google. Opens the user's browser to Google's consent screen and waits for them to approve, then stores the session token. The browser step must be completed by the user; everything before and after is tool-driven. This does NOT pick a billing account or project — after it returns, call 'accounts_list' then 'accounts_use', and 'projects_list' then 'projects_use'. Needs a local browser, so it only works over stdio (not the hosted HTTP server)." - removed
Input schema / titleRemoved value: -"login_google"
- Changed
logout3 fields changed- removed
Input schema / descriptionRemoved value: -"Remove the saved credentials for a project profile from local CLI config. Use this to disconnect from a project or clear a stale token; it deletes only the stored profile locally and does not revoke the token server-side or affect the project. Omit the profile to remove the currently active one. Run 'config_show' to see profile names." - changed
Input schema / properties / profile / typePrevious value: -"string"New value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"logout"
- Added
menus_add_item - Added
menus_list - Added
oauth_google_configure - Added
oauth_google_status - Added
pay_connect - Added
pay_methods - Added
pay_payments - Added
pay_status - Changed
projects_create4 fields changed- removed
Input schema / descriptionRemoved value: -"Provision a new project — a dedicated, isolated Anythink backend instance with its own database, API, auth, and storage. Requires platform login and an active billing account (set one with 'accounts_use'). Provisioning runs asynchronously: the project starts in a Provisioning state, so poll 'projects_list' until it is Active. Returns the new project's id, name, org id, and API URL. Connect to it with 'projects_use'." - changed
Input schema / properties / accountId / typePrevious value: -"string"New value: +[ + "string", + "null" +] - changed
Input schema / properties / description / typePrevious value: -"string"New value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"projects_create"
- Changed
projects_delete3 fields changed- removed
Input schema / descriptionRemoved value: -"Permanently delete a project and tear down its backend instance, including its database and stored data. This is destructive and irreversible — always confirm with the user first, and prefer matching by a specific id over a short prefix to avoid removing the wrong project. Requires an active billing account (set one with 'accounts_use'). Returns the deleted project's name and id on success." - changed
Input schema / properties / accountId / typePrevious value: -"string"New value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"projects_delete"
- Changed
projects_list3 fields changed- removed
Input schema / descriptionRemoved value: -"List the projects (provisioned backend instances) in a billing account. Requires platform login and an active billing account (set one with 'accounts_use'). Returns each project's id, name, description, region, org id, status (Initializing/Provisioning/Active/Suspended/Terminated/Error), API URL, and creation date. Use this to find a project's id before connecting with 'projects_use' or removing it with 'projects_delete'." - changed
Input schema / properties / accountId / typePrevious value: -"string"New value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"projects_list"
- Changed
projects_use4 fields changed- removed
Input schema / descriptionRemoved value: -"Connect to a project and save it as the active profile so the 'cli' tool's data, entities, users, and other commands target it. Resolves the project, then either stores the API key you pass or exchanges a transfer token for project-scoped credentials automatically. Requires an active billing account (set one with 'accounts_use'); the project must be Active (see 'projects_list'). Returns the saved profile name, org id, API URL, and auth method." - changed
Input schema / properties / accountId / typePrevious value: -"string"New value: +[ + "string", + "null" +] - changed
Input schema / properties / apiKey / typePrevious value: -"string"New value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"projects_use"
- Added
roles_create - Added
roles_delete - Added
roles_list - Added
roles_permissions_add - Added
roles_permissions_list - Added
roles_permissions_remove - Added
search_audit - Added
search_purge - Added
search_query - Added
search_rehydrate - Added
search_similar - Added
secrets_create - Added
secrets_delete - Added
secrets_list - Added
secrets_update - Changed
signup3 fields changed- removed
Input schema / descriptionRemoved value: -"Register a brand-new Anythink platform account with email and password. Use this only when the user has no account yet; if they already have one, use 'login' instead. This creates the top-level user identity — it does not create a billing account or project (do that with 'accounts_create' and 'projects_create' after logging in). On success the user may need to click an email confirmation link before 'login' works; tell them to confirm, then call 'login'." - changed
Input schema / properties / referralCode / typePrevious value: -"string"New value: +[ + "string", + "null" +] - removed
Input schema / titleRemoved value: -"signup"
- Added
users_delete - Added
users_get - Added
users_invite - Added
users_list - Added
users_me - Added
workflows_create - Added
workflows_delete - Added
workflows_disable - Added
workflows_enable - Added
workflows_export - Added
workflows_file_handler_add - Added
workflows_file_handler_example - Added
workflows_get - Added
workflows_integration_add - Added
workflows_jobs - Added
workflows_list - Added
workflows_seed - Added
workflows_step_add - Added
workflows_step_delete - Added
workflows_step_get - Added
workflows_step_link - Added
workflows_step_update - Added
workflows_trigger - Added
workflows_update
14 tool updates
v0.2.21- Changed
accounts_create4 fields changed- changed
Input schema / descriptionPrevious value: -"Create a new billing account"New value: +"Create a new billing account (organization) to hold projects and payment details. Requires a prior platform login (use the 'login' tool first). The new account is automatically set as the active account, so subsequent 'projects_create' / 'projects_list' calls target it without further setup. Returns the new account's id and name. Most users need only one account — call 'accounts_list' first to check whether a suitable one already exists." - changed
Input schema / properties / currency / descriptionPrevious value: -"Currency: gbp, usd, or eur (default: gbp)"New value: +"ISO currency for billing: 'gbp', 'usd', or 'eur'. Defaults to 'gbp'. Cannot be changed later." - changed
Input schema / properties / email / descriptionPrevious value: -"Billing email address"New value: +"Billing email address that receives invoices and receipts" - changed
Input schema / properties / name / descriptionPrevious value: -"Organization name"New value: +"Organization name, e.g. 'Acme Inc' — shown on invoices and in the dashboard"
- Changed
accounts_list1 field changed- changed
Input schema / descriptionPrevious value: -"List all billing accounts for the logged-in user"New value: +"List the billing accounts (organizations) the logged-in user belongs to. Requires a prior platform login (use the 'login' tool first). Returns each account's id, organization name, billing email, currency, and status (Active/Suspended/Canceled), and flags which one is currently active. A billing account holds your projects and payment details — pick one with 'accounts_use' before creating or listing projects."
- Changed
accounts_use2 fields changed- changed
Input schema / descriptionPrevious value: -"Set the active billing account (used for project management)"New value: +"Set the active billing account that project commands operate on. Call this after 'login' when you belong to more than one account, before using 'projects_list', 'projects_create', or 'projects_use'. Accepts a full account UUID or a unique prefix; run 'accounts_list' to see valid ids. Returns the resolved account name and id, or an error if no account matches." - changed
Input schema / properties / id / descriptionPrevious value: -"Billing account ID (full UUID or prefix)"New value: +"Billing account id — full UUID or a unique leading prefix. Get ids from 'accounts_list'."
- Changed
config_remove2 fields changed- changed
Input schema / descriptionPrevious value: -"Remove a project profile from the CLI configuration"New value: +"Delete a saved project profile from the local CLI configuration. Removes only the locally stored credentials and settings — it does not delete the project or revoke tokens server-side (to remove the project itself, use 'projects_delete'). Run 'config_show' to see profile names. Returns confirmation, or a not-found message." - changed
Input schema / properties / profile / descriptionPrevious value: -"Profile name to remove"New value: +"Name of the profile to remove from local config. See 'config_show' for valid names."
- Changed
config_show1 field changed- changed
Input schema / descriptionPrevious value: -"List all configured profiles and show which is active"New value: +"Show the local CLI configuration: all saved project profiles and platform logins, and which of each is active. For every profile it returns the name, org id, auth method (api-key or token), alias, and platform; for every platform it returns the URLs, billing account, and login status. Use this to discover profile names for 'config_use', 'config_remove', or 'logout', and to check which project the 'cli' tool currently targets. Reads local config only — makes no network calls."
- Changed
config_use2 fields changed- changed
Input schema / descriptionPrevious value: -"Set the active project profile"New value: +"Switch the active project profile that the 'cli' tool's commands operate against. Use this to move between already-connected projects without re-authenticating. The profile must already exist (created by 'projects_use' or 'login_direct'); run 'config_show' to see available profile names. Returns confirmation, or an error if the profile does not exist." - changed
Input schema / properties / profile / descriptionPrevious value: -"Profile name to activate"New value: +"Name of an existing profile to make active. See 'config_show' for valid names."
- Changed
login1 field changed- changed
Input schema / descriptionPrevious value: -"Log in to the Anythink platform with email and password. Returns a session token used for account and project management. For Google OAuth, use the CLI instead ('anythink login --google')."New value: +"Log in to the Anythink platform with email and password. Returns a session token used for account and project management. For Google sign-in, use the 'login_google' tool."
- Added
login_google - Changed
logout2 fields changed- changed
Input schema / descriptionPrevious value: -"Remove saved credentials for a project profile"New value: +"Remove the saved credentials for a project profile from local CLI config. Use this to disconnect from a project or clear a stale token; it deletes only the stored profile locally and does not revoke the token server-side or affect the project. Omit the profile to remove the currently active one. Run 'config_show' to see profile names." - changed
Input schema / properties / profile / descriptionPrevious value: -"Profile name to remove (uses active profile if omitted)"New value: +"Name of the profile to remove. Defaults to the active profile. See 'config_show' for names."
- Changed
projects_create6 fields changed- changed
Input schema / descriptionPrevious value: -"Create a new project in the active billing account"New value: +"Provision a new project — a dedicated, isolated Anythink backend instance with its own database, API, auth, and storage. Requires platform login and an active billing account (set one with 'accounts_use'). Provisioning runs asynchronously: the project starts in a Provisioning state, so poll 'projects_list' until it is Active. Returns the new project's id, name, org id, and API URL. Connect to it with 'projects_use'." - changed
Input schema / properties / accountId / descriptionPrevious value: -"Billing account ID (uses active account if omitted)"New value: +"Billing account id to create the project in. Defaults to the active account set via 'accounts_use'." - changed
Input schema / properties / description / descriptionPrevious value: -"Project description (optional)"New value: +"Optional free-text description shown in the dashboard" - changed
Input schema / properties / name / descriptionPrevious value: -"Project name"New value: +"Human-readable project name, e.g. 'production' or 'my-app'" - changed
Input schema / properties / planId / descriptionPrevious value: -"Plan ID (UUID) — use 'plans' CLI command to list available plans"New value: +"Plan id (UUID) that sets the project's resource tier and pricing. Run the 'plans' CLI command (via the 'cli' tool) to list available plan ids." - changed
Input schema / properties / region / descriptionPrevious value: -"Deployment region (e.g. lon1)"New value: +"Deployment region slug, e.g. 'lon1'. Defaults to 'lon1'. Choose the region closest to your users."
- Changed
projects_delete3 fields changed- changed
Input schema / descriptionPrevious value: -"Delete a project from the billing account"New value: +"Permanently delete a project and tear down its backend instance, including its database and stored data. This is destructive and irreversible — always confirm with the user first, and prefer matching by a specific id over a short prefix to avoid removing the wrong project. Requires an active billing account (set one with 'accounts_use'). Returns the deleted project's name and id on success." - changed
Input schema / properties / accountId / descriptionPrevious value: -"Billing account ID (uses active account if omitted)"New value: +"Billing account id the project belongs to. Defaults to the active account set via 'accounts_use'." - changed
Input schema / properties / id / descriptionPrevious value: -"Project ID (UUID or prefix)"New value: +"Project to delete — its UUID, name, or a unique prefix. Use a specific id to avoid accidental matches. Find ids via 'projects_list'."
- Changed
projects_list2 fields changed- changed
Input schema / descriptionPrevious value: -"List all projects in the active billing account"New value: +"List the projects (provisioned backend instances) in a billing account. Requires platform login and an active billing account (set one with 'accounts_use'). Returns each project's id, name, description, region, org id, status (Initializing/Provisioning/Active/Suspended/Terminated/Error), API URL, and creation date. Use this to find a project's id before connecting with 'projects_use' or removing it with 'projects_delete'." - changed
Input schema / properties / accountId / descriptionPrevious value: -"Billing account ID (uses active account if omitted)"New value: +"Billing account id to list projects for. Defaults to the active account set via 'accounts_use'."
- Changed
projects_use4 fields changed- changed
Input schema / descriptionPrevious value: -"Connect to a project and save it as the active profile. Exchanges a transfer token for project-scoped credentials."New value: +"Connect to a project and save it as the active profile so the 'cli' tool's data, entities, users, and other commands target it. Resolves the project, then either stores the API key you pass or exchanges a transfer token for project-scoped credentials automatically. Requires an active billing account (set one with 'accounts_use'); the project must be Active (see 'projects_list'). Returns the saved profile name, org id, API URL, and auth method." - changed
Input schema / properties / accountId / descriptionPrevious value: -"Billing account ID (uses active account if omitted)"New value: +"Billing account id the project belongs to. Defaults to the active account set via 'accounts_use'." - changed
Input schema / properties / apiKey / descriptionPrevious value: -"API key for the project (generates token if omitted)"New value: +"Optional project API key (ak_...). If omitted, a project-scoped token is generated automatically via transfer-token exchange." - changed
Input schema / properties / id / descriptionPrevious value: -"Project name, org ID, or UUID (or prefix)"New value: +"Project to connect to — its name, org id, or UUID (a unique prefix is accepted). Find these via 'projects_list'."
- Changed
signup6 fields changed- changed
Input schema / descriptionPrevious value: -"Create a new Anythink account"New value: +"Register a brand-new Anythink platform account with email and password. Use this only when the user has no account yet; if they already have one, use 'login' instead. This creates the top-level user identity — it does not create a billing account or project (do that with 'accounts_create' and 'projects_create' after logging in). On success the user may need to click an email confirmation link before 'login' works; tell them to confirm, then call 'login'." - changed
Input schema / properties / email / descriptionPrevious value: -"Email address"New value: +"Email address — becomes the login identifier and must be unique" - changed
Input schema / properties / firstName / descriptionPrevious value: -"First name"New value: +"User's first name" - changed
Input schema / properties / lastName / descriptionPrevious value: -"Last name"New value: +"User's last name" - changed
Input schema / properties / password / descriptionPrevious value: -"Password"New value: +"Password for the new account; choose a strong value" - changed
Input schema / properties / referralCode / descriptionPrevious value: -"Referral code (optional)"New value: +"Optional referral code, if the user was invited by another customer"
15 tool updates
v0.2.6- First observed
accounts_create - First observed
accounts_list - First observed
accounts_use - First observed
cli - First observed
config_remove - First observed
config_show - First observed
config_use - First observed
login - First observed
login_direct - First observed
logout - First observed
projects_create - First observed
projects_delete - First observed
projects_list - First observed
projects_use - First observed
signup
TDQS
Scored across 175 tools
Descriptions are unusually thorough and cross-reference siblings explicitly ('use X instead of Y'), so most boundaries are clear. However, with 175 tools there are genuine overlaps: convenience wrappers (workflows_file_handler_add vs workflows_step_add), preview/get pairs (charts_preview vs dashboards_widget_preview vs dashboards_data), and catch-all escape hatches (cli, fetch, api) that duplicate the dedicated tools' scope. An agent must read carefully to pick correctly, so some overlap exists despite good prose.
Names overwhelmingly follow a snake_case prefix_noun_verb or prefix_verb convention (email_templates_update, menus_update_item, dashboards_add_chart, pay_subscriptions_cancel, workflows_step_add). Minor deviations exist: several unprefixed top-level tools (login, signup, logout, docs, cli, fetch, api) and shorthand pay_* names break the resource-prefix pattern. Still largely predictable.
175 tools is an extreme mismatch for a single MCP server, far past the 50+ threshold. Even granting that Anythink is a full backend platform, cramming project, entity, data, workflow, payment, email, auth, and search management into one surface is unwieldy and forces agents to select blind. This module should be decomposed into several scoped servers.
Coverage is remarkably broad: entities, fields, data, RLS, users, roles, menus, dashboards, charts, workflows, integrations, payments, email, search, secrets, files, API keys, projects and accounts all have full lifecycle tools. Only minor, explicitly acknowledged gaps exist (no refund tool, no way to remove a single offer code, no trigger-editing tool), which agents can work around.
Maintenance
Related MCP Connectors
Build and publish full-stack apps from your coding agent: models, rules, pages, auth, per-app MCP.
Build multi-tenant apps over MCP. Schemas, CRUD, deploys — access control enforced server-side.
Build, deploy, and host full-stack web apps from any MCP client. DB, auth, storage, cron included.
Backend platform for AI agents: one agentstack.execute tool runs batched steps over +700 actions (hosting, storage, auth, payments, CRM, app builder).
Related MCP Servers
- AlicenseNot gradedqualityNot gradedmaintenanceAn MCP server that provides tools for interacting with Supabase databases, storage, and edge functions.45MIT
- AlicenseNot gradedqualityCmaintenanceThe Stripe Model Context Protocol server allows you to integrate with Stripe APIs through function calling. This protocol supports various tools to interact with different Stripe services.18,973 npm1,953-
- AlicenseNot gradedqualityNot gradedmaintenanceA Model Context Protocol server that helps users migrate subscription businesses from RevenueCat to Adapty through natural language interactions with LLMs like Claude Desktop.MIT
- AlicenseAqualityCmaintenanceEnables comprehensive management of Directus instances through tools for schema manipulation, content CRUD operations, and dashboard management. It allows AI assistants to programmatically interact with collections, fields, relations, and workflow automation using the official Directus SDK.2014 npmMIT