@yawlabs/lemonsqueezy-mcp
This server is an MCP interface to the LemonSqueezy API, letting AI assistants manage stores, products, customers, orders, subscriptions, discounts, license keys, checkouts, webhooks, and more via 64 tools.
Store & user management — get the authenticated user and list/get stores.
Customer management — create, update, archive, list, and fetch customers.
Catalog management — browse products, variants, files, and prices, with annotated effective per-unit pricing.
Orders — fetch and list orders, generate PDF invoices, and issue refunds (with optional refund caps).
Subscriptions — list/get, plan switch, pause/resume, change billing anchor, cancel, and manage subscription invoices and items.
Metered billing — create and list usage records and check current subscription-item usage.
Discounts — create, delete, list discounts and discount redemptions.
License keys — manage activation limits, expiry, and disabled status; list activations; activate, validate, and deactivate license keys without an API key.
Checkouts — create checkout URLs with custom pricing, prefilled customer data, and discount codes.
Webhooks — create, update, delete, and list webhooks.
Affiliates — list and fetch affiliate records across stores.
Webhook sink bridge — list received webhook events, mark events processed, and get sink stats.
Safety & observability — optional store allowlists, refund caps, destructive-call and per-class rate limits, class-based disabling, an audit-log MCP resource, retries with backoff, and structured logging.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@@yawlabs/lemonsqueezy-mcpHow many active subscriptions do I have?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@yawlabs/lemonsqueezy-mcp
MCP server for the LemonSqueezy API. Manage your store, products, customers, subscriptions, discounts, license keys, and more from any MCP-compatible AI assistant.
One click adds this to your local Yaw MCP config so it's available in every Yaw Terminal session. Or install manually below.
Quick start
npx -y @yawlabs/lemonsqueezy-mcp@latestRequires Node.js 22 or later (engines.node is >=22).
Or one-click install via Smithery:
npx -y @smithery/cli install @yawlabs/lemonsqueezy-mcp --client claudeSmithery prompts for your env vars (API key, optional guardrails) and writes the config into your client for you.
Related MCP server: mcp-server-woocommerce
What it looks like
Once configured, you can ask your AI assistant store-management questions in plain English and it routes them through the MCP tools:
You: How much did we make from the "Pro Annual" plan last month?
Claude: [calls ls_list_subscriptions, ls_get_variant, ls_list_subscription_invoices]
Pro Annual brought in $14,280 across 84 active subscriptions in April.
Three of those were upgrades from monthly; none churned.
You: Refund order #LS-1234 in full.
Claude: [calls ls_get_order to fetch the total, then ls_refund_order with amount = total]
Refunded $99.00 against order LS-1234. The customer's card will see the
credit in 5-10 business days.
You: Disable license key abc-123 for the customer who reported abuse.
Claude: [calls ls_list_license_keys to find the ID, then ls_update_license_key with disabled: true]
License key disabled. Their existing activations will fail validation
on the next check.Guardrails (refund cap, rate limit, store allowlist) catch the obvious mistakes before they reach LemonSqueezy. See Configuration for the env vars that turn them on.
Setup
Set your LemonSqueezy API key as an environment variable:
export LEMONSQUEEZY_API_KEY="your-api-key"Get your API key from your LemonSqueezy dashboard.
Docker
A multi-stage Dockerfile is included at the repo root. The runtime image is a single bundled file on node:22-alpine running as the non-root node user, with no port exposed (stdio transport).
docker build -t yawlabs/lemonsqueezy-mcp .
docker run --rm -i -e LEMONSQUEEZY_API_KEY="your-api-key" yawlabs/lemonsqueezy-mcpA matching Containerfile is provided for Podman users. It is generated from Dockerfile via npm run gen:containerfile. release.sh runs npm run check:containerfile in step 1, so a release fails if the two have drifted. This repo has no CI, so nothing checks a pull request for drift: run it yourself after editing Dockerfile.
Claude Code
Add to your MCP config:
{
"mcpServers": {
"lemonsqueezy": {
"command": "npx",
"args": ["-y", "@yawlabs/lemonsqueezy-mcp@latest"],
"env": {
"LEMONSQUEEZY_API_KEY": "your-api-key"
}
}
}
}Claude Desktop
Add to claude_desktop_config.json:
{
"mcpServers": {
"lemonsqueezy": {
"command": "npx",
"args": ["-y", "@yawlabs/lemonsqueezy-mcp@latest"],
"env": {
"LEMONSQUEEZY_API_KEY": "your-api-key"
}
}
}
}Tools (64)
Users
ls_get_user— Get the authenticated user
Stores
ls_get_store— Get a store by IDls_list_stores— List all stores (not gated byLEMONSQUEEZY_ALLOWED_STORE_IDS: returns every store the API key can see)
Customers
ls_get_customer— Get a customer by IDls_list_customers— List customers (filter by store, email)ls_create_customer— Create a customerls_update_customer— Update a customerls_archive_customer— Archive a customer
Products
ls_get_product— Get a product by IDls_list_products— List products (filter by store)
Variants
ls_get_variant— Get a variant by IDls_list_variants— List variants (filter by product)
Prices
ls_get_price— Get a price by IDls_list_prices— List prices (filter by variant)
Both annotate every price record with effective_unit_price, the cents actually charged per unit, and effective_unit_price_note, which says where that number came from; unit_price_is_not_charged or unit_price_is_per_package is added where it applies. Read effective_unit_price rather than unit_price, which is vestigial on tiered (volume / graduated) pricing, or a variant's price. The subscription-item reads apply the same annotation to prices embedded via include=price.
Files
ls_get_file— Get a file by IDls_list_files— List files (filter by variant)
Orders
ls_get_order— Get an order by IDls_list_orders— List orders (filter by store, email)ls_generate_order_invoice— Generate a PDF invoicels_refund_order— Issue a refund
Order Items
ls_get_order_item— Get an order item by IDls_list_order_items— List order items (filter by order, product, variant)
Subscriptions
ls_get_subscription— Get a subscription by IDls_list_subscriptions— List subscriptions (filter by store, status, product, etc.)ls_update_subscription— Update (plan switch, pause, billing anchor, trial)ls_cancel_subscription— Cancel a subscription
Subscription Invoices
ls_get_subscription_invoice— Get a subscription invoice by IDls_list_subscription_invoices— List subscription invoices (filter by store, subscription, status)ls_generate_subscription_invoice— Generate a PDF invoicels_refund_subscription_invoice— Issue a refund
Subscription Items
ls_get_subscription_item— Get a subscription item by IDls_list_subscription_items— List subscription items (filter by subscription, price)ls_update_subscription_item— Update quantityls_get_subscription_item_usage— Get current billing period usage
Usage Records
ls_get_usage_record— Get a usage record by IDls_list_usage_records— List usage records (filter by subscription item)ls_create_usage_record— Report metered usage (increment or set)
Discounts
ls_get_discount— Get a discount by IDls_list_discounts— List discounts (filter by store)ls_create_discount— Create a discount codels_delete_discount— Delete a discount
Discount Redemptions
ls_get_discount_redemption— Get a discount redemption by IDls_list_discount_redemptions— List redemptions (filter by discount, order)
License Keys
ls_get_license_key— Get a license key by IDls_list_license_keys— List license keys (filter by store, order, product)ls_update_license_key— Update activation limit, expiry, or disabled status
License Key Instances
ls_get_license_key_instance— Get a license key activation by IDls_list_license_key_instances— List activations (filter by license key)
Checkouts
ls_get_checkout— Get a checkout by IDls_list_checkouts— List checkouts (filter by store, variant)ls_create_checkout— Create a checkout URL (custom pricing, prefill, discounts)
Webhooks
ls_get_webhook— Get a webhook by IDls_list_webhooks— List webhooks (filter by store)ls_create_webhook— Create a webhookls_update_webhook— Update a webhookls_delete_webhook— Delete a webhook
License API
ls_activate_license— Activate a license key (no API key required)ls_validate_license— Validate a license key (no API key required)ls_deactivate_license— Deactivate a license key instance (no API key required). Destructive on every call: rate-limited and audited, with the license key masked in the audit entry
Affiliates
ls_get_affiliate— Get an affiliate by ID (commission rate, status, earnings)ls_list_affiliates— List affiliates (filter by user email). Not gated byLEMONSQUEEZY_ALLOWED_STORE_IDS: returns affiliates from every store the API key can see
Webhook sink (optional)
Bridge to a separate @yawlabs/lemonsqueezy-webhook-sink process so the agent can reconcile against webhooks that actually fired. Tools are always registered; if LEMONSQUEEZY_SINK_URL / LEMONSQUEEZY_SINK_ADMIN_TOKEN are unset, calls return a clear "not configured" error.
ls_sink_events_list— List webhook events the sink has received (filter bysince/type/limit)ls_sink_event_mark_processed— Mark a sink event as processed by your consumer (idempotent)ls_sink_stats— Get total events, unprocessed count, and last-received timestamp
Features
API coverage — 58 tools across 20 LemonSqueezy API resources, 3 License API tools, and 3 bridge tools to an optional @yawlabs/lemonsqueezy-webhook-sink for webhook reconciliation (64 in total)
JSON:API support — Pagination on every
ls_list_*tool, filters on every one butls_list_stores, and relationship inclusion (include) on everyls_get_*/ls_list_*tool exceptls_get_userandls_get_subscription_item_usageZero runtime dependencies — Single bundled file for instant
npxstartupLicense API — Activate, validate, and deactivate license keys without an API key
MCP annotations — Every tool declares read-only, destructive, and idempotent hints
Retry with backoff — for LemonSqueezy API calls (the
ls_sink_*tools make a single attempt): a 429 is retried for every method, including POSTs such as refunds and License API calls, after waiting for the server'sRetry-After(1s if it is missing or unparseable). This relies on a 429 meaning the request was rejected before LemonSqueezy acted on it. IfRetry-Afteris over 30s, or the wait would pass the overall deadline, the 429 is returned instead. 5xx responses, timeouts and network errors are retried only for idempotent methods (GET, DELETE), with exponential backoff and jitter; a POST or PATCH that hits one is not retried. Up to 4 attempts, 30s per attempt, and no new attempt or wait is started after 90sGuardrails — opt-in store allowlist, refund cap, destructive-call rate limit, authority-class disable (
LEMONSQUEEZY_DISABLE_CLASSES), and per-authority-class rate limits (LEMONSQUEEZY_RATE_LIMIT_PER_CLASS)Audit log MCP Resource —
lemonsqueezy://audit-logexposes the last 1000 destructive-call entries asapplication/x-ndjsonfor clients without stderr accessStructured logging — opt-in JSON logs to stderr with selectable levels (
error,audit,all)
Configuration
All configuration is via environment variables. The management-API tools need one of LEMONSQUEEZY_API_KEY_COMMAND, LEMONSQUEEZY_TEST_API_KEY or LEMONSQUEEZY_API_KEY (checked in that order); the three License API tools and the ls_sink_* tools need none of them. Everything else is opt-in.
Variable | Purpose |
| LemonSqueezy API token. |
| Command whose stdout (trimmed, must be non-empty) is the API key. Takes precedence over |
| Optional test-mode key. When set and non-empty, it takes precedence over |
| Comma-separated allowlist of store IDs. When set: (1) any tool whose input includes a |
| Non-negative number. Rejects |
| Non-negative number. Max destructive tool calls per 60-second rolling window (a fraction behaves as the next whole number: |
| Comma-separated list of authority classes to refuse outright. Any tool whose class is listed returns a |
| Per-class rolling rate limits, comma-separated. Each entry is |
| Structured-log verbosity to stderr. Set to |
| Base URL of an optional @yawlabs/lemonsqueezy-webhook-sink instance (e.g. |
| Bearer token for the sink's admin endpoints. Must match the sink's |
Logging format
Each line: {ts, event, tool?, method?, path?, status, latency_ms, request_id?, error?, audit?, inputs?}. Stdout is reserved for the MCP protocol — never log there.
Error decoration
HTTP errors include the upstream X-Request-Id when present, so support tickets to LemonSqueezy can reference the exact call. When an error body is JSON with no message the server recognizes, it is surfaced whole, in both the error text and the log line, after the same redaction as audited inputs (see Resources). A non-JSON error body is passed through as-is.
Authority classes
The strongest access control LemonSqueezy itself exposes is the API key boundary. A LemonSqueezy API key authorizes its full account — every store, and every tool except the three License API tools (see below) and the three ls_sink_* bridge tools, which do not use it — and the only way to deny a class of authority through LemonSqueezy is to not give the API key to the agent in the first place. LemonSqueezy's team-membership UI scopes which humans can do which actions in the dashboard, but the public API key inherits the full authority of the account it was issued under; there's no "this key can read but not refund" toggle. So the authoritative boundary, as far as the upstream API is concerned, is which API key the agent has.
That means the env vars below are the primary in-process control surface for anything LemonSqueezy can't gate by itself — per-class rate ceilings (RATE_LIMIT_PER_CLASS), deploy-time class disables (DISABLE_CLASSES), refund caps (MAX_REFUND_AMOUNT_CENTS), and the audit log. They are belt-and-braces in the sense that an operator who can change the server's env can remove them; they are load-bearing in the sense that LemonSqueezy has no equivalent. If you need an agent that genuinely cannot reach a store or a class of action, the durable answer is a separate LemonSqueezy account whose key is never handed to that agent. That answer does not cover the License API tools (see below).
Every tool is tagged with an authority class — a label for the kind of business authority a caller needs to invoke it. The class is separate from the binary destructive/read-only annotation: a customer-record read and a product list are both reads, but only one returns PII; a checkout creation and a refund are both writes, but only one moves money.
Class | What it covers | Tools |
| Safe reads (list/get) that don't return customer PII as the primary payload. | Every |
| The dedicated customer-record tools. This class does not keep customer data out of reach; see the note below. |
|
| Non-money mutations: checkouts, discounts, invoice generation, marking sink events processed. |
|
| Money movement. Irreversible at the payment layer. |
|
| Subscription state and metered billing: changes that affect recurring revenue. |
|
| License-key admin (activate, deactivate, disable, change activation limit or expiry). |
|
| Webhook configuration — affects the trust surface other systems rely on. |
|
That is every tool's class. src/tools/tools.test.ts pins the same map, and moving a tool to another class is a MAJOR change under SEMVER.md.
Note: pii gates only the five customer tools above. It does not keep customer data out of an agent's reach: read-class tools still return customer names and emails incidentally (orders, subscriptions and license keys carry them), ls_list_orders and ls_list_subscriptions accept a userEmail filter, and the order, subscription and license-key get/list tools accept include=customer, which side-loads the customer record. The class is reserved for tools whose primary purpose is the customer record, so LEMONSQUEEZY_DISABLE_CLASSES=pii blocks those tools, not customer data. To keep customer data away from an agent, issue its API key from a separate LemonSqueezy account that doesn't host customer records you care about.
The License API tools are outside the API-key boundary. ls_activate_license, ls_validate_license and ls_deactivate_license authenticate with the license key the caller passes, not the API key, so they work on any LemonSqueezy account's license keys, whichever API key the server holds. A separate LemonSqueezy account does not fence them off, and LEMONSQUEEZY_ALLOWED_STORE_IDS does not gate them. The controls that do reach them, per tool:
ls_deactivate_license(classkey):LEMONSQUEEZY_DISABLE_CLASSES=key,LEMONSQUEEZY_RATE_LIMIT_PER_CLASS=key:N, andLEMONSQUEEZY_DESTRUCTIVE_RATE_LIMIT, which treats every call as destructive. Every call is also audited, with the license key masked (see Resources).ls_activate_license(classkey): the same two class controls. Activation is additive, so it is not destructive, and the destructive rate limit and the audit log do not see it.ls_validate_license(classread): onlyLEMONSQUEEZY_DISABLE_CLASSES=readorLEMONSQUEEZY_RATE_LIMIT_PER_CLASS=read:N, and both of those also hit every other read. The read-only lock-down below leaves it reachable.
Both key controls also cover ls_update_license_key, the management-API tool in the same class.
The two opt-in env vars that consume this taxonomy:
LEMONSQUEEZY_RATE_LIMIT_PER_CLASS— caps the call rate per class. LemonSqueezy permissions cannot express "max 2 refunds per hour"; this is the only place that policy can live. This is the load-bearing one for runaway-agent prevention.LEMONSQUEEZY_DISABLE_CLASSES— blocks a class outright. Useful when fast deploy-time toggles matter — flippingDISABLE_CLASSES=pii,mutate,money,recurring,key,webhookto lock an analytics deployment into pure reads is a one-line config change (everyreadtool stays reachable,ls_validate_licenseincluded). An operator who can change the server's env can also remove this gate, so for an authoritative deny use a separate LemonSqueezy account whose API key the agent never sees; that does not bound the License API tools.
Both are opt-in; with neither set, every class is allowed and unlimited.
Resources
The server exposes one MCP Resource for clients that prefer structural retrieval over parsing stderr:
URI | MIME type | Contents |
|
| The most recent destructive tool calls and outcomes (rate-limit blocks, refund-cap blocks, exceptions, successes). Bounded ring buffer of the last 1000 entries, most-recent-first, resets on server restart. Inputs are redacted before they reach the buffer, and the stderr log gets the same redacted copy. (1) Any object key whose whole name matches a credential / PII pattern ( |
Operating the server unattended
For unattended/agentic use against a live store, we recommend:
Issue an API key under a LemonSqueezy account that hosts only the store(s) the agent is allowed to touch — LemonSqueezy doesn't expose per-store API-key scoping, so account separation is the durable store boundary. Set
LEMONSQUEEZY_ALLOWED_STORE_IDSto the same set as a belt-and-braces in-process gate on the tools that take astoreId. Account separation does not bound the three License API tools, which authenticate with a license key rather than the API key (see Authority classes).Set
LEMONSQUEEZY_MAX_REFUND_AMOUNT_CENTSto a per-call cap well below any single-refund expectation.Set
LEMONSQUEEZY_DESTRUCTIVE_RATE_LIMITto a small number (e.g. 5/min) as a runaway-agent circuit breaker. For finer control, addLEMONSQUEEZY_RATE_LIMIT_PER_CLASS=money:2/h,recurring:5/h,key:10/mso each authority class has its own ceiling. If the agent also reports metered usage, size therecurringfigure for that too: usage reports count against it.If a class shouldn't be reachable at all (e.g. an analytics agent that needs only
read), setLEMONSQUEEZY_DISABLE_CLASSESto the classes you want refused. The server rejects them before the API call is built. For an irrevocable deny, also issue the agent's API key from a separate LemonSqueezy account (the License API tools excepted).Set
LEMONSQUEEZY_LOG=auditand ship stderr to your log aggregator. Theauditlevel keeps every destructive-call entry plus errors but drops successful reads so log volume stays bounded over weeks of operation. Alert onstatus: "guardrail_block"or elevated error rates per tool. UseLEMONSQUEEZY_LOG=allwhile debugging.Run
LEMONSQUEEZY_API_KEY_COMMANDagainst a vault-backed secret so credentials can rotate without restarting the server process. The API client invalidates its in-process key cache automatically on a 401/403, so a rotated upstream key picks up on the next request rather than waiting on the 1h TTL.
What the server does not do and you must own at the caller level:
Idempotency / dedupe store — MCP servers are stateless subprocesses; cross-invocation dedupe belongs in your agent or orchestrator.
Webhook reconciliation — subscribe to LemonSqueezy webhooks in a separate long-running process to reconcile state when API writes succeed but the response is lost. See @yawlabs/lemonsqueezy-webhook-sink for a ready-made sink.
Metrics / dashboards — the server emits structured logs; derive metrics in your log pipeline.
See SEMVER.md for the versioning policy.
Development
npm install
npm run lint
npm test # full unit + handler suite (builds first)
npm run test:integration # live suite; exits 1 unless LEMONSQUEEZY_TEST_API_KEY + LEMONSQUEEZY_TEST_STORE_ID are setThis repo has no CI: nothing re-runs lint, types or tests on a pull request, so run them locally. npm run test:integration writes throwaway ci-test- resources to a real store.
Containerfile is generated from Dockerfile. After editing Dockerfile:
npm run gen:containerfile # regenerate Containerfile
npm run check:containerfile # release.sh step 1 runs this too; non-zero exit means the two have driftedRunning on oam.js (optional)
oam.js runs this server unmodified, and the launcher only runs the server on an oam that is 0.15.2 or newer. Verified against oam 0.9.0: full MCP handshake, all 64 tools, the lemonsqueezy://audit-log resource, working fetch, and guardrail rejections with error text identical to Node. On oam 0.15.2 the MCP handshake and all 64 tools have been re-verified through the launcher, with and without the sandbox below.
oam 0.15.2 is the minimum. The launcher picks the newest oam it can find at or above it, never serves on an older one, and falls back to Node when there is none (LEMONSQUEEZY_MCP_RUNTIME=oam turns that into a hard error). A floor matters here: releases before 0.9.0 ran child_process.execFile arguments through a shell, which was reachable whenever LEMONSQUEEZY_API_KEY_COMMAND is configured -- that feature runs the key command with execFile, deliberately without a shell, and on those releases its arguments were re-split by one anyway.
The published lemonsqueezy-mcp command (bin/lemonsqueezy-mcp.mjs, which is what npx runs) chooses its runtime from these variables:
Variable | Default | Purpose |
|
|
|
| unset | Path to an oam binary to use in preference to discovery, when it is 0.15.2 or newer. If it does not exist, is older, or will not run, the launcher says so on stderr and carries on with discovery. Discovery looks in the installed location ( |
| unset |
|
Sandboxing (opt-in)
Set LEMONSQUEEZY_MCP_SANDBOX=1 to run under oam's --permission model: network restricted to api.lemonsqueezy.com (plus the host of LEMONSQUEEZY_SINK_URL when set), filesystem denied outright, and child-process denied unless LEMONSQUEEZY_API_KEY_COMMAND is configured.
--permission is a process-level flag, so the launcher always starts a fresh oam for it -- even when a client already launches the command under oam 0.15.2+. That is a preference, not a guarantee: if no usable oam can be started, LEMONSQUEEZY_MCP_RUNTIME=auto still serves the server without --permission, and LEMONSQUEEZY_MCP_RUNTIME=oam exits with an error instead.
It is opt-in rather than default because a wrong grant does not fail loudly. oam denies a non-granted environment variable by making it absent from process.env rather than throwing, so an under-granted LEMONSQUEEZY_API_KEY reads as "unauthenticated" rather than "denied". The env allow-list in the launcher is derived from what the shipped bundle actually reads -- if you add a new process.env lookup, extend that list with it.
{
"mcpServers": {
"lemonsqueezy": {
"command": "oam",
"args": ["run", "/path/to/lemonsqueezy-mcp/dist/index.js"],
"env": { "LEMONSQUEEZY_API_KEY": "..." }
}
}
}Note the -- separator if you pass arguments to the server rather than to oam: oam run dist/index.js -- version.
The published command prefers oam; it does not require it. oam is not distributed on npm, so npx @yawlabs/lemonsqueezy-mcp has to keep working without it, and it does: discovery is file-existence checks only, never a subprocess, and the fallback runs the server inside the Node process npm already started. With oam installed, though, the command boots Node, runs --version on every oam binary it found to pick the newest, and only then boots oam, so it is always slower than pointing your client at oam directly with the config above. LEMONSQUEEZY_MCP_RUNTIME=node skips oam entirely. An MCP client cold-starts this server once per session, so startup is the cost that actually gets paid -- and it has not been measured for this repo on a current oam. Measure on your own hardware before concluding anything.
Two places oam does win for this repo, both opt-in and neither touching the npm package:
npm run check:oam— type-checks viaoam check(tsgo, TypeScript 7 native). Measured 2878ms against 4406ms fortsc --noEmit, same clean result.npx tsc --noEmitremains the portable default and is what the pre-commit checklist calls for.npm run build:binary:oam— builds the standalone binary viaoam compileinstead of the Node SEA path. Measured 57.14 MB. Writes to the samebin/<platform>-<arch>/path as the Node SEA build (node scripts/build-binary.mjs), soscripts/stage-release-asset.mjsconsumes either unchanged — run one or the other, not both. If you redistribute that binary it embeds oam's runtime, so ship oam'sLICENSE,NOTICEandTHIRD_PARTY_LICENSES.mdwith it.
The source stays runtime-agnostic on purpose: no oam: imports anywhere, and tests stay on node:test. That is what keeps the Node fallback real rather than nominal — an oam:test or oam:-prefixed import would make "falls back to Node" false the moment it landed. Any oam invocation writes a bytecode cache to oam/ in the working directory; that path is gitignored.
Releasing
Releases run locally, from a clean checkout of main, with release.sh. This repo has no GitHub Actions workflows (.github/ holds only CODEOWNERS), so pushing a tag by itself publishes nothing. release.sh keeps a CI mode for a tag-triggered release workflow, the intended end state, but nothing invokes it today.
Before cutting a release, write the ## [Unreleased] entry in CHANGELOG.md by hand, and run npm run test:integration against a test-mode store if src/api.ts or a tool handler changed (it needs LEMONSQUEEZY_TEST_API_KEY and LEMONSQUEEZY_TEST_STORE_ID, and exits 1 without them). The unit suite mocks fetch, so it cannot see changes in the upstream API. Then:
./release.sh X.Y.ZBefore step 1, release.sh checks that gh is installed and authenticated and that you are on main, and refuses a dirty working tree unless it is resuming a run whose version bump already landed. Unless X.Y.Z is already on npm, it also runs npm whoami and stops if that fails, so a dead or missing npm token ends the run before step 4 pushes the tag. npm whoami proves the token is live, not that it is an automation token: a web-login session passes it and then fails step 5 with EOTP.
It then runs eight steps on the workstation:
npm run lint, andnpm run check:containerfile(fails ifContainerfilehas drifted fromDockerfile)npm test(which builds first)Bump the version in
package.jsonandpackage-lock.json, and syncserver.jsonto itTurn
## [Unreleased]inCHANGELOG.mdinto## [X.Y.Z](when[Unreleased]is empty, write that section from the commit subjects since the previous tag instead, with a warning), commit, create the annotated tagvX.Y.Z, and pushmainwith the tagnpm publish --access publicCreate the GitHub release, with the notes taken from the
## [X.Y.Z]section ofCHANGELOG.mdWait for npm to serve the new version (up to 5 minutes, then carry on with a warning), smoke-test
npx -y @yawlabs/lemonsqueezy-mcp@X.Y.Z --version, then publishserver.jsonto the Official MCP Registry withmcp-publisherVerify the npm version,
package.jsonand the tag
Re-running after a partial failure is safe. ./release.sh X.Y.Z detects the version bump, commit, tag, npm publish and GitHub release that already landed and skips them; lint, test, the push and the npx smoke test run again. The MCP Registry publish in step 7 is not skipped, so a re-run after it has succeeded fails there on the duplicate version.
A workstation publish carries no npm provenance attestation: release.sh passes --provenance only in CI mode.
One-time setup on each machine:
An npm automation token for a publisher of
@yawlabs/lemonsqueezy-mcp, in~/.npmrc(npmjs.com -> Access Tokens -> Generate -> Automation):@yawlabs:registry=https://registry.npmjs.org/ //registry.npmjs.org/:_authToken=npm_YOURTOKENNever run
npm login --auth-type=web. It overwrites the automation token with a 2FA-bound web session, and the next publish fails withEOTP.gh auth login. The pre-flight requires it, and step 6 creates the release with it. Step 7 logsmcp-publisherin with its token (gh auth token) unlessMCP_REGISTRY_TOKENis set; either way the token needsread:orgaccess to YawLabs, which the registry checks for theio.github.YawLabs/*namespace.mcp-publisheris downloaded to~/.local/binon first use; setMCP_PUBLISHERto use another copy.jq,curlandtaronPATH. Step 3 editsserver.jsonwithjq. Step 7 downloadsmcp-publisherwithcurlandtaron first use, unlessMCP_PUBLISHERpoints at an existing copy. It also polls npm withcurl, and skips that wait with a warning ifcurlis missing.Rights to push to
mainand createv*tags. The repository rulesets require a pull request formainand restrictv*tag creation, only organization admins bypass them, and step 4 pushes both directly.
License
MIT
Available Tools
64 toolsls_activate_licenseA
Activate a license key for an instance. Does not require an API key — uses the license key itself for auth.
| Name | Required | Description | Default |
|---|---|---|---|
| licenseKey | Yes | The license key to activate | |
| instanceName | Yes | A name for this activation instance (e.g. machine name, user identifier) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate a write operation with potential side effects. The description adds the auth detail but does not explain activation effects (e.g., instance creation, idempotency).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no extraneous content. Front-loaded with the core action and auth note.
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 or return behavior described. For a mutation tool, more context on success/failure or side effects would improve completeness, but it's adequate for a simple activation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers both parameters with descriptions. The tool description adds no extra meaning beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (activate) and resource (license key for an instance). It distinguishes from siblings like 'deactivate' and 'validate'.
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?
States that no API key is needed, which clarifies a key usage context. Does not explicitly exclude alternatives but the sibling list provides implicit differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_archive_customerADestructiveIdempotent
Archive a customer. Sets their status to 'archived'. This is reversible by updating their status back.
| Name | Required | Description | Default |
|---|---|---|---|
| customerId | Yes | The customer ID to archive |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds that status is set to 'archived' and is reversible, providing some behavioral context beyond annotations. However, lacks details on side effects (e.g., on licenses, subscriptions) and permissions required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, front-loaded with the main action and effect. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a simple tool with one parameter and no output schema. Mentions reversibility, but could note typical response or related implications (e.g., if customer has active 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 already describes the single parameter with 100% coverage. Description adds no new 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?
Description clearly states the action (archive), resource (customer), and effect (sets status to archived). It distinguishes from siblings like ls_update_customer by specifying the specific operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage when customer should be archived, but no explicit alternatives or when-not-to-use guidance. Mentions reversibility but does not contrast with related tools like ls_deactivate_license.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_cancel_subscriptionADestructiveIdempotent
Cancel a subscription. The subscription remains active until the end of the current billing period, then expires.
| Name | Required | Description | Default |
|---|---|---|---|
| subscriptionId | Yes | The subscription ID to cancel |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide destructiveHint, idempotentHint, and openWorldHint. The description adds that the subscription remains active until period end, which is valuable behavioral context not in annotations. However, it does not disclose potential side effects (open-world) explicitly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the main purpose, and a complementary detail. 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 simple cancellation tool with one parameter, the description covers the key behavioral effect (deferred expiration). Although no output schema, the description is sufficient given annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a clear description for subscriptionId. The tool description adds no extra meaning beyond the schema, so 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?
The description clearly states the action (cancel) and the resource (subscription), and adds specific behavior (remains active until end of billing period then expires), distinguishing it from other subscription modification tools like ls_deactivate_license or ls_update_subscription.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for canceling a subscription with deferred expiration but does not explicitly state when to use this tool over siblings (e.g., for immediate cancellation vs. end-of-period). No exclusions or alternatives mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_create_checkoutA
Create a new checkout URL for a product variant. Returns a URL where the customer can complete their purchase. Supports custom pricing, prefilled customer data, and checkout customization.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Prefill customer name | |
| No | Prefill customer email | ||
| storeId | Yes | The store ID | |
| expiresAt | No | Checkout expiry date (ISO 8601 format) | |
| taxNumber | No | Prefill tax/VAT number | |
| variantId | Yes | The variant ID for the product being purchased | |
| customData | No | Custom data object to attach to the order | |
| customPrice | No | Custom price in cents (overrides the variant price) | |
| discountCode | No | Pre-apply a discount code | |
| enabledVariants | No | Array of variant IDs to show on the checkout (for products with multiple variants) | |
| billingAddressZip | No | Prefill billing ZIP/postal code | |
| billingAddressCountry | No | Prefill billing country (ISO 3166-1 alpha-2) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish this is a mutation (readOnlyHint=false) and not idempotent. The description adds that it returns a URL and that it supports custom pricing, prefill, and customization, but it does not disclose side effects, auth requirements, or behavior around expiry/payment. This is acceptable but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with the core action front-loaded. There is minor redundancy ('Create a new checkout URL' vs 'Returns a URL...') but no filler or irrelevant detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 12 parameters, a required storeId/variantId pair, and no output schema, the description gives a useful high-level summary but omits the exact response shape and any edge-case behavior. The schema covers parameter details, but the tool's output contract is only described as 'a URL'.
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 every parameter is individually documented. The description's mention of 'custom pricing, prefilled customer data, and checkout customization' only groups existing schema capabilities without adding new 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?
The description opens with a specific verb and resource: 'Create a new checkout URL for a product variant,' and immediately clarifies the output (the purchase URL). This clearly distinguishes the tool from sibling read tools like ls_get_checkout and ls_list_checkouts.
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 use case is clear: you use this when you need to generate a checkout URL for a variant. However, the description never explicitly names alternatives or states when not to use the tool; the distinction from siblings is implied by the create verb rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_create_customerA
Create a new customer in a store.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | Customer's city | |
| name | Yes | Customer's full name | |
| Yes | Customer's email address | ||
| region | No | Customer's region/state | |
| country | No | Customer's country (ISO 3166-1 alpha-2 code, e.g. 'US') | |
| storeId | Yes | The store ID to create the customer in |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds no behavioral detail beyond what the annotations already convey. Annotations indicate readOnlyHint=false (write), idempotentHint=false (non-idempotent), and destructiveHint=false, but the description does not mention side effects, failure conditions (e.g., duplicate email), or whether it returns the created object. It adds no additional transparency beyond the annotation profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that front-loads the core purpose. There is no redundant or filler content, and every word serves the clarity of the operation. It is appropriately minimal for a simple creation 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?
The tool has no output schema, and the description does not explain what the tool returns (e.g., the created customer object or an error). While the schema lists required parameters, the description does not mention them. For a straightforward creation action, the description is minimally adequate but lacks information about the response and potential failure modes, leaving the agent to infer behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all parameters already have descriptions. The tool description itself adds no parameter-specific context (e.g., why storeId is required or what values are valid). Since the schema fully documents parameters, the baseline of 3 is appropriate; the description does not compensate further.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Create'), the resource ('a new customer'), and the context ('in a store'), which unambiguously distinguishes it from sibling tools like ls_get_customer, ls_update_customer, and ls_archive_customer. The purpose is immediately clear and specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for adding new customers, but it does not explicitly state when to use it versus alternatives (e.g., 'use ls_update_customer for modifications'). No exclusions or alternative recommendations are provided, so the guidance is only implied by the tool's name and purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_create_discountB
Create a new discount code. Supports percentage or fixed amount discounts with optional duration and usage limits.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The discount code customers will enter (e.g. 'SAVE20') | |
| name | Yes | Internal name for the discount | |
| amount | Yes | Discount amount — in cents for 'fixed' type (e.g. 1000 = $10.00), or percentage for 'percent' type (e.g. 20 = 20%) | |
| storeId | Yes | The store ID to create the discount in | |
| duration | No | How long the discount applies: 'once' (first payment only), 'repeating' (for N months), or 'forever' (default) | |
| startsAt | No | When the discount becomes active (ISO 8601 format) | |
| expiresAt | No | When the discount expires (ISO 8601 format) | |
| amountType | Yes | Discount type: 'percent' or 'fixed' | |
| variantIds | No | Array of variant IDs this discount applies to (requires isLimitedToProducts: true) | |
| maxRedemptions | No | Maximum number of times this discount can be redeemed (0 = unlimited) | |
| durationInMonths | No | Number of months the discount applies (required when duration is 'repeating') | |
| isLimitedToProducts | No | If true, the discount only applies to specific variants (set via variantIds) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description matches annotations (non-readonly, non-destructive). No additional behavioral context beyond 'create' is provided, which is adequate but not enhanced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, no unnecessary words. Efficient and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 12 parameters and no output schema, the description lacks details on return values, error conditions, or constraints (e.g., uniqueness of code). Could be more complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the description adds no extra value beyond the schema. Parameters are well-documented in the schema itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the action (create) and resource (discount code), and mentions supported discount types. However, it does not distinguish from sibling tools like ls_delete_discount or ls_get_discount.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool vs alternatives. The sibling list includes many discount-related tools, but the description does not provide context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_create_usage_recordADestructive
Report usage for a metered subscription item. Use 'increment' action to add to the current usage, or 'set' to replace it.
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | How to apply the quantity: 'increment' (add to current, default) or 'set' (replace current) | |
| quantity | Yes | The usage quantity to report | |
| subscriptionItemId | Yes | The subscription item ID to report usage for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true, so the description adds minimal behavioral context beyond restating the action semantics already present in the input schema. It does not disclose side effects, error behavior, authorization requirements, or concurrency considerations. The description repeats what the schema enum descriptions already 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 description is two sentences long, front-loaded with the primary purpose, and wastes no words. Every sentence provides necessary context (the resource and the two modes of operation). It is concise yet complete for its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 3 parameters, no output schema, and annotations that mark it as destructive, the description adequately covers the primary purpose and action choices. However, it does not describe the response format or success behavior, which is important since there is no output schema to guide the agent. It also omits any mention of prerequisites like requiring a valid subscription item or authentication.
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%, meaning all parameters have descriptions in the schema. The description adds no additional meaning beyond restating the 'increment' and 'set' actions, which are already documented in the action parameter's description. Therefore, it meets the baseline for full schema coverage without extra semantic value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the purpose: 'Report usage for a metered subscription item,' which defines the verb (report/create) and resource (usage record). It distinguishes the two possible actions, 'increment' and 'set,' which aligns with the sibling tools like ls_get_usage_record and ls_list_usage_records that are read-only.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides implicit guidance on when to use the tool (for metered subscription usage reporting) and explains the two actions, but it does not explicitly state when to use this tool versus alternatives such as ls_get_usage_record or ls_list_usage_records. No exclusion criteria or prerequisites are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_create_webhookA
Create a new webhook to receive event notifications. The signing secret is returned only once — save it immediately.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The URL to send webhook events to (must be a valid http/https URL) | |
| events | Yes | Event types to subscribe to (e.g. ['order_created', 'subscription_created', 'subscription_updated', 'subscription_cancelled', 'subscription_payment_success', 'subscription_payment_failed', 'license_key_created']) | |
| secret | Yes | A signing secret for verifying webhook payloads | |
| storeId | Yes | The store ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (which indicate this is a write operation, not destructive, not idempotent), the description reveals a critical behavioral trait: 'The signing secret is returned only once — save it immediately.' This adds value by warning the agent about a one-time return, which is not evident from 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?
The description consists of two short sentences, each earning its place: the first states the purpose, the second adds the crucial warning. No unnecessary words 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?
Given the tool's simplicity (4 required params, no output schema), the description covers the core purpose and a key behavioral detail. However, it does not describe the response format or what happens after creation (e.g., webhook starts sending events). This slight gap prevents a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, so the schema already explains each parameter (storeId, url, events, secret). The description does not add additional meaning beyond what the schema provides, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Create a new webhook to receive event notifications,' which is a specific verb+resource combination. It distinguishes itself from sibling tools like ls_get_webhook, ls_update_webhook, and ls_delete_webhook by focusing on creation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not explicitly state when to use this tool versus alternatives like ls_get_webhook or ls_list_webhooks. However, the tool name and description imply it is for initial setup, and the warning about the signing secret provides usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_deactivate_licenseADestructiveIdempotent
Deactivate a license key instance, revoking that instance's access. Destructive: rate-limited and audited, with the license key masked in the audit entry. Does not require an API key — uses the license key itself for auth.
| Name | Required | Description | Default |
|---|---|---|---|
| instanceId | Yes | The instance ID to deactivate | |
| licenseKey | Yes | The license key |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark destructiveHint and readOnlyHint, but the description adds meaningful behavioral detail beyond them: the operation is rate-limited, audited, and masks the license key in audit entries. This is exactly the kind of contextual disclosure that helps an agent anticipate consequences.
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: action and effect, destructive consequences, and auth requirement. Every sentence adds non-redundant information, and the most important scoping facts are 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 two-parameter destructive action with annotations covering idempotency and destructiveness, this description is complete. It covers purpose, effect, consequences, rate-limiting, auditing, masking, and authentication. Nothing critical is missing for an agent to select and 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. The description adds extra semantic value by explaining that the licenseKey parameter is not just an identifier but also the authentication credential for this call. That is helpful detail beyond the schema's bare 'The license key'.
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 ('Deactivate') with a precise resource ('a license key instance') and states the observable effect ('revoking that instance's access'). This clearly distinguishes it from siblings like ls_activate_license and ls_validate_license without needing to open 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 description gives clear context for when the tool is appropriate: to revoke access for a specific license instance. It also adds a practical auth signal ('Does not require an API key — uses the license key itself for auth'). It stops short of explicitly naming alternatives or exclusions, so it misses the full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_delete_discountADestructiveIdempotent
Permanently delete a discount. This is irreversible.
| Name | Required | Description | Default |
|---|---|---|---|
| discountId | Yes | The discount ID to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true and idempotentHint=true. The description adds 'Permanently delete' and 'irreversible,' which reinforce the destructive nature but do not provide substantial new behavioral information 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 concise sentences with no filler. Every word adds value, stating action and irreversibility.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple one-parameter tool and rich annotations, the description is adequate. Could mention that the discount must exist or error handling, but not strictly necessary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage for the single parameter discountId, with a clear description. The tool description does not add any further semantic context for the parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'delete' and the resource 'discount', and explicitly notes it's permanent and irreversible. It distinguishes from sibling tools like ls_create_discount or ls_get_discount.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives (e.g., soft deletion or archiving). No mention of prerequisites or contextual triggers.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_delete_webhookADestructiveIdempotent
Permanently delete a webhook. This is irreversible.
| Name | Required | Description | Default |
|---|---|---|---|
| webhookId | Yes | The webhook ID to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true and idempotentHint=true. The description adds 'This is irreversible', reinforcing the destructive nature, but does not disclose potential side effects or prerequisites, such as whether the webhook must be inactive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with two sentences, directly stating the action and irreversibility. Every word is purposeful, and the critical information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple delete operation with one required parameter, the description is complete. It conveys the action, permanent nature, and no output schema is needed. The simplicity of the tool does not demand more 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?
The input schema provides 100% coverage with a clear description for the only parameter 'webhookId'. The tool's description adds no additional parameter information beyond what the schema already provides, resulting in a baseline score of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'delete' and the resource 'webhook', and emphasizes irreversibility. It effectively distinguishes from sibling tools like ls_create_webhook, ls_update_webhook, and ls_get_webhook by specifying a permanent deletion action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives. While the context of deleting is implied, the description does not provide conditions or contrast with other tools like ls_update_webhook for deactivating a webhook.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_generate_order_invoiceBIdempotent
Generate a PDF invoice for an order. Returns a download URL for the invoice.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | Customer city | |
| name | No | Customer name on the invoice | |
| notes | No | Additional notes to include on the invoice | |
| state | No | Customer state/region | |
| locale | No | Invoice language locale (e.g. 'en', 'fr', 'de') | |
| address | No | Customer address on the invoice | |
| country | No | Customer country | |
| orderId | Yes | The order ID | |
| zipCode | No | Customer ZIP/postal code |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The idempotentHint annotation already indicates safe repeated calls, but the description adds little beyond that. It does not disclose behavior on errors, existing invoices, or the download URL format. However, it does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that efficiently conveys the core function and output. Every word is necessary and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 9 optional parameters and no output schema, the description is too brief. It does not explain how the optional parameters affect the invoice or what the download URL looks like, leaving gaps for a complex 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 description coverage is 100% with basic descriptions for each parameter. The tool description does not add extra meaning or usage guidance beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Generate a PDF invoice') and the resource ('for an order'), and specifies the output ('Returns a download URL'). This distinguishes it from sibling tools like ls_generate_subscription_invoice.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives, such as ls_generate_subscription_invoice or other order-related tools. The description lacks context about prerequisites or typical scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_generate_subscription_invoiceAIdempotent
Generate a PDF invoice for a subscription invoice. Returns a download URL.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | Customer city | |
| name | No | Customer name on the invoice | |
| notes | No | Additional notes to include on the invoice | |
| state | No | Customer state/region | |
| locale | No | Invoice language locale (e.g. 'en', 'fr', 'de') | |
| address | No | Customer address on the invoice | |
| country | No | Customer country | |
| zipCode | No | Customer ZIP/postal code | |
| subscriptionInvoiceId | Yes | The subscription invoice ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate idempotentHint=true, so the tool is safe to retry. The description does not elaborate on side effects (e.g., whether it creates a record) or the nature of the download URL. It adds minimal 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?
The description is a single sentence that directly states the purpose and output. It is appropriately concise and front-loaded with essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 9 parameters and no output schema, the description is minimal. It covers the core functionality but omits details like prerequisites (e.g., invoice existence state), error handling, or URL expiration. This is adequate but not comprehensive.
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 descriptions cover all 9 parameters (100% coverage), so parameters are already well-documented. The description adds no additional meaning to parameters beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool generates a PDF invoice for a subscription invoice and returns a download URL. The verb 'generate' and resource 'subscription invoice' are specific, and the name distinguishes it from sibling tools like ls_generate_order_invoice.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives (e.g., ls_get_subscription_invoice for retrieving invoice data). There is no mention of prerequisites or cases where this tool is inappropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_get_affiliateARead-onlyIdempotent
Get a specific affiliate by ID, including commission rate, status, and earnings.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'store,user') | |
| affiliateId | Yes | The affiliate ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate read-only and idempotent behavior. The description adds minimal transparency beyond confirming it is a retrieval operation; it does not mention side effects, auth requirements, or rate limits, but the annotations already cover the safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that immediately states the action and resource, with no unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with high schema coverage, the description covers the key purpose and output fields. It could mention the return format or structure, but it is largely sufficient for selecting and invoking the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with clear parameter descriptions. The tool description does not add additional meaning beyond what is already in the schema, so it performs at the baseline for high 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?
The description clearly states 'Get a specific affiliate by ID, including commission rate, status, and earnings.' It provides a specific verb (get), resource (affiliate), and distinguishes itself from the sibling tool 'ls_list_affiliates' by focusing on a single affiliate retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when an affiliate ID is available, but it does not explicitly state when to use this tool versus alternatives like ls_list_affiliates, nor does it provide any usage exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_get_checkoutARead-onlyIdempotent
Get a specific checkout by ID, including URL, expiry, and custom data.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'store,variant') | |
| checkoutId | Yes | The checkout ID (a UUID, as returned by ls_list_checkouts / ls_create_checkout) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already communicate readOnly, idempotent, and non-destructive behavior. The description adds value by indicating the response will include URL, expiry, and custom data, but it does not discuss errors, authorization, or edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, compact sentence that front-loads the core behavior and then highlights the most useful returned fields. There is no filler or redundant restatement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read operation with one required parameter and strong annotations, this is nearly complete. It identifies the input, the core return contents, and the read-only nature, though it could briefly mention related-resource inclusion via the optional `include` parameter.
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 checkoutId and include are already documented in the schema. The description mentions payload fields but does not add meaningful parameter-level guidance beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('Get a specific checkout by ID') and names key returned content ('URL, expiry, and custom data'). It is clearly distinguished from listing checkouts by stressing 'specific' and 'by ID'.
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 intended use is implied: call this when you already have a checkout ID and need one checkout. However, it does not explicitly name ls_list_checkouts as the alternative for fetching multiple checkouts, nor does it state any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_get_customerARead-onlyIdempotent
Get a specific customer by ID, including name, email, city, country, MRR, total revenue, and customer portal URL.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'store,orders,subscriptions,license-keys') | |
| customerId | Yes | The customer ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, openWorldHint=true. Description adds the set of returned fields but no additional behavioral context (e.g., auth needs, rate limits, error scenarios).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, 19 words, front-loaded with the core action and resource. Every word is informative, no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 100% schema coverage, annotations, and no output schema, the description lists returned fields helpfully. Could mention error handling or response format, but adequate for a simple retrieval tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for both parameters. The description does not add extra meaning beyond the schema; it lists output fields, not parameter details. Baseline 3 as schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the verb 'Get' and resource 'specific customer by ID', listing specific fields returned. It distinguishes from siblings like ls_list_customers (list) and ls_create_customer (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?
Implied usage for retrieving a single customer by ID, but no explicit guidance on when to use vs alternatives like ls_list_customers or when not to use. No exclusions or prerequisites mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_get_discountARead-onlyIdempotent
Get a specific discount by ID, including code, amount, type, and usage limits.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'store,variants,discount-redemptions') | |
| discountId | Yes | The discount ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true. Description adds return fields but no further behavioral details (e.g., error handling). 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?
Single sentence, 15 words, directly states action and result. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers essential return fields for a single-ID retrieval. No output schema, but description compensates. Lacks response structure or error details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with good descriptions for both parameters. Description does not add extra meaning beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it gets a discount by ID and lists specific fields (code, amount, type, usage limits). Distinguishes from sibling tools like ls_list_discounts and ls_get_discount_redemption.
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 for retrieving a single discount, but no explicit when-to-use or alternatives. Missing guidance on the 'include' parameter context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_get_discount_redemptionARead-onlyIdempotent
Get a specific discount redemption by ID, showing when and where a discount was used.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'discount,order') | |
| discountRedemptionId | Yes | The discount redemption ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, safe operation. Description adds minimal context (showing when and where), but does not contradict annotations. No additional behavioral traits beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is a single, clear sentence that is front-loaded with the verb. It is concise but could be slightly more informative without adding verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Description is adequate for a simple get operation, but it does not differentiate from the sibling ls_list_discount_redemptions tool or describe the response structure (no output schema). Could be more complete with usage 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 already includes descriptions for both parameters. The description does not add any new semantic information beyond what the schema provides. Baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it retrieves a specific discount redemption by ID, which is a specific verb+resource. It distinguishes from sibling tools like ls_list_discount_redemptions (which returns a list) and other get_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not explicitly state when to use this tool versus alternatives. The name implies its use for a single redemption by ID, but no guidance on when to use ls_list_discount_redemptions or other related tools is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_get_fileARead-onlyIdempotent
Get a specific file by ID, including name, size, download URL, and associated variant.
| Name | Required | Description | Default |
|---|---|---|---|
| fileId | Yes | The file ID | |
| include | No | Comma-separated related resources to include (e.g. 'variant') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, non-destructive behavior. Description adds what data is returned (name, size, download URL, variant), providing useful behavioral context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, zero waste, front-loaded with verb and resource. Efficient and clear.
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 get operation with one required parameter and no output schema, the description fully explains what the tool does and what it returns, making it 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 covers both parameters with descriptions (100% coverage). Description mentions variant, which relates to the 'include' parameter, but adds minimal additional meaning beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Get a specific file by ID' and lists exact data returned (name, size, download URL, variant). Distinguishes from sibling 'ls_list_files' by focusing on a single file retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or when-not-to-use guidance. However, the description implies usage for fetching a specific file by ID, which is clear from context among many 'get_' siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_get_license_keyARead-onlyIdempotent
Get a specific license key by ID, including key value, status, activation limit, and expiry date.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'store,customer,order,order-item,product,license-key-instances') | |
| licenseKeyId | Yes | The license key ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, openWorldHint=true, covering safety and idempotency. The description adds the specific fields returned but no additional behavioral context beyond that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single focused sentence with no unnecessary words, directly stating the action and output scope.
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 absence of an output schema, the description helpfully lists included fields. However, it omits details on error handling or output format, but overall is sufficient for a simple retrieval tool with comprehensive annotations.
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?
Both parameters have schema descriptions (coverage 100%), and the description adds no extra semantic value beyond listing output fields, which does not enhance parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves a specific license key by ID and lists the fields returned (key value, status, activation limit, expiry date), differentiating it from sibling tools like ls_list_license_keys which list multiple keys.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for single license key retrieval but does not explicitly contrast it with alternatives like ls_validate_license or ls_list_license_keys, nor provides when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_get_license_key_instanceARead-onlyIdempotent
Get a specific license key instance (activation) by ID, including instance name and creation date.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'license-key') | |
| licenseKeyInstanceId | Yes | The license key instance ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=true. The description adds that it returns instance name and creation date, but does not disclose additional behavioral traits beyond what annotations provide. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that front-loads the main action. Every word adds value, with no redundancy or unnecessary information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple get by ID operation, the description is fairly complete. It specifies the return fields (instance name and creation date). Annotations cover safety aspects. It could mention that the response includes additional fields, but the phrase 'including' implies there is more.
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%, with clear descriptions for both parameters (licenseKeyInstanceId and include). The tool description does not add any meaning beyond the schema; it only mentions the ID implicitly. Baseline score 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (Get), the resource (specific license key instance), and what is returned (instance name and creation date). It distinguishes from sibling tools like ls_list_license_key_instances which lists all instances.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when you have a specific license key instance ID, but it does not explicitly guide when to use this tool over siblings like ls_list_license_key_instances or ls_get_license_key. No exclusions or alternatives mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_get_orderARead-onlyIdempotent
Get a specific order by ID, including status, total, currency, customer info, and payment details.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'store,customer,order-items,subscriptions,license-keys,discount-redemptions') | |
| orderId | Yes | The order ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it as read-only, idempotent, and non-destructive. The description adds value by specifying the returned fields (status, total, currency, customer info, payment details), which is not present in annotations or input 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?
The description is a single sentence that directly conveys the tool's purpose and return fields. It is concise and front-loaded with key information, with no superfluous content.
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 simplicity of a read operation and the presence of annotations, the description is fairly complete. It lists expected outputs, compensating for the lack of an output schema. Minor gaps exist regarding error handling and parameter usage details, but not critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for both parameters. The description does not add significant meaning beyond the schema, merely restating 'by ID' which aligns with the orderId parameter. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves a specific order by ID and lists the included information (status, total, currency, customer info, payment details). It is unambiguous and distinguishes from sibling tools like ls_list_orders.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies that this tool is for fetching a single order by ID, but it does not explicitly state when to use it over alternatives like ls_list_orders or other get tools. No exclusions or context are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_get_order_itemARead-onlyIdempotent
Get a specific order item by ID, including product name, variant, price, and quantity.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'order,product,variant') | |
| orderItemId | Yes | The order item ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only, non-destructive, idempotent, and open-world. The description adds no behavioral traits beyond those, but does not contradict 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?
Single sentence, 16 words, front-loaded with action verb and resource. 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 simple get operation, description covers purpose and core return fields. Lacks details on include parameter, error handling, or full return shape, but adequate given schema coverage and annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for both parameters. The description adds meaning by listing returned fields, but does not explain the optional 'include' parameter, so value is marginal.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves a specific order item by ID, listing included fields (product name, variant, price, quantity). It effectively distinguishes from sibling ls_list_order_items which returns multiple items.
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 does not explicitly state when to use or avoid this tool, nor mention alternatives. Usage is implied from the verb 'get' and context, but lacks explicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_get_priceARead-onlyIdempotent
Get a specific price by ID, including amount, currency, and billing interval. Every record is annotated with effective_unit_price (cents actually charged per unit) and effective_unit_price_note. READ THAT, not unit_price: on a tiered scheme (volume/graduated) unit_price is vestigial and is NOT the charged amount -- the real per-unit price lives in tiers[], and such records also carry unit_price_is_not_charged: true. On package pricing unit_price IS charged, but it buys a block of package_size units, so effective_unit_price reports the per-unit figure and the record carries unit_price_is_per_package: true.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'variant') | |
| priceId | Yes | The price ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already state read-only/idempotent/non-destructive, so the burden is lower, but the description adds a crucial behavioral disclosure: `unit_price` is misleading on tiered schemes and should be ignored, while `effective_unit_price` is the actual charged amount. It explicitly warns 'READ THAT, not `unit_price`' and separates behavior for tiered vs package pricing. This tells the agent how to correctly interpret the response data beyond what any annotation could 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 description is long but every sentence contributes: it states purpose, then gives a concrete reading directive with detailed rationale for two pricing schemes. It is front-loaded with the core purpose before the caveats, and the structure flows logically from general instruction to specific fallback cases.
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 get-by-ID tool with a complete schema and read-only annotations, the description fully covers the domain-specific hazards of tiered and package pricing. It does not discuss error responses or include parameter options, but those are either standard expectations or covered by the schema. The description is more than sufficient for correct invocation and interpretation.
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%, with both `priceId` and `include` already described in the schema. The description does not add parameter-level meaning (it does not explain include options or constraints), so it does not exceed the baseline set by the 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?
The description opens with a clear verb-resource statement: 'Get a specific price by ID, including amount, currency, and billing interval.' This distinguishes it from siblings like ls_list_prices (which lists) and ls_get_product (different resource). The mention of specific returned fields leaves no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states the tool fetches a single price 'by ID', making it obvious that this is the right choice when you already have a price ID and need full details. It does not explicitly name alternatives or exclusions, but the ID-based scope of the purpose is clear enough for an agent to choose it over list/scan tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_get_productARead-onlyIdempotent
Get a specific product by ID, including name, description, price, and status.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'store,variants') | |
| productId | Yes | The product ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=true, covering behavioral safety. The description adds the list of returned fields but does not provide additional behavioral context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence of 12 words with no wasted content. It is extremely concise and front-loaded with the essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (single resource retrieval, no output schema), the description provides sufficient context including the fields returned. Annotations cover safety and idempotency, making it complete for the agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for both parameters. The description does not add any additional meaning beyond what is already in the input schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Get' and the resource 'product by ID', and specifies returned fields (name, description, price, status). It distinguishes from sibling list tools by implying a single resource retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving a specific product's details but does not explicitly contrast with sibling list tools or provide when-not-to-use guidance. The context is clear but lacks exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_get_storeARead-onlyIdempotent
Get a specific store by ID, including name, slug, currency, and sales statistics.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'products,discounts,license-keys,subscriptions,webhooks') | |
| storeId | Yes | The store ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true. The description adds context about the returned fields (name, slug, currency, sales statistics), providing value beyond annotations. No behavioral contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that front-loads the action and resource, with no unnecessary words. Every part contributes to understanding.
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 get-by-id tool, the description is adequate. It covers the purpose and key output fields. No output schema exists, but the description compensates by listing returned data. The 'include' parameter is covered in the schema, so no major 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 coverage is 100% with descriptions for both parameters. The description does not add extra meaning beyond the schema, so a baseline score of 3 is appropriate. It mentions output fields but not parameter specifics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (Get), the resource (store), and specifies that it returns name, slug, currency, and sales statistics. It distinguishes from sibling tools like ls_list_stores by focusing on a single store retrieval via ID.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for fetching a single store by ID, which is distinct from listing all stores. However, it does not explicitly mention when not to use it or provide alternatives, but the context is clear given the tool's name and description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_get_subscriptionARead-onlyIdempotent
Get a specific subscription by ID, including status, billing interval, renewal date, and customer info.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'store,customer,order,order-item,product,variant,subscription-items,subscription-invoices') | |
| subscriptionId | Yes | The subscription ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, destructiveHint, idempotentHint, and openWorldHint. The description adds value by listing the specific data fields returned (status, billing interval, renewal date, customer info). No side effects or limitations are mentioned, but the annotations cover the safety profile adequately.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, well-structured sentence that immediately conveys the tool's purpose. Every word adds value, and there is no unnecessary information. The description is appropriately sized and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only retrieval tool, the description is largely complete. It lists the key fields returned. There is no output schema, so the description compensates reasonably. It could mention error handling or rate limits, but given the annotations, this is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does not add new information about the parameters beyond what the schema already provides. The mention of 'by ID' aligns with the subscriptionId parameter but does not enhance understanding of the 'include' parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get' and the resource 'subscription by ID', and includes the specific data fields returned. It distinguishes itself from sibling tools like 'ls_list_subscriptions' by specifying a single subscription retrieval via ID.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies that the tool is used when you have a subscription ID, but it does not explicitly provide when-to-use or when-not-to-use guidance compared to alternatives (e.g., using 'ls_list_subscriptions' for multiple subscriptions). No exclusions or alternatives are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_get_subscription_invoiceARead-onlyIdempotent
Get a specific subscription invoice by ID, including status, total, billing reason, and payment details.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'store,subscription') | |
| subscriptionInvoiceId | Yes | The subscription invoice ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive behavior. The description adds context on the specific fields returned, enhancing transparency without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence. It front-loads the verb and resource, then lists key fields. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity (2 params, no output schema), the description adequately indicates return contents. Missing error handling mention, but acceptable for a basic retrieval tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with parameter descriptions. The description does not add significant new meaning beyond what the schema provides; it mentions output fields but not parameter 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?
The description clearly states the verb 'Get', the resource 'specific subscription invoice', and enumerates included fields (status, total, billing reason, payment details). It effectively distinguishes from list and mutation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies retrieval of a single invoice by ID, which contrasts with list operations. However, it does not explicitly state when to use this vs. alternatives like ls_list_subscription_invoices or ls_refund_subscription_invoice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_get_subscription_itemARead-onlyIdempotent
Get a specific subscription item by ID, including quantity, pricing, and associated subscription. Pass include=price for the price record behind it; embedded price records are annotated with effective_unit_price (cents actually charged per unit) -- read that, not the record's unit_price, which is vestigial on tiered pricing and per-package on package pricing.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'subscription,price,usage-records') | |
| subscriptionItemId | Yes | The subscription item ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and non-destructive. The description adds critical behavioral context beyond annotations: the price record's effective_unit_price is the actual charge per unit, whereas unit_price is vestigial or per-package depending on pricing model. This insight directly affects how the agent interprets data, adding 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?
Two sentences with the main purpose first and the include caveat second. Though the second sentence is dense, every clause serves a distinct purpose (what include=price returns, the field to read, why unit_price is unreliable). No fluff; it could be slightly more organized but remains efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a get-by-id tool with no output schema, the description is thorough: it tells the agent what to expect (quantity, pricing, subscription), how to retrieve the price record, and what to trust in the response. Given only two parameters and no complex nested structures, it covers all essential calling knowledge. Error scenarios are not described, but that is acceptable for a simple read operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for both parameters, but the description adds semantic depth: it explains the special include=price value and its effect on the response. The subscriptionItemId is straightforward, but the description's treatment of include goes beyond the generic schema description ('Comma-separated related resources') by identifying a specific useful inclusion and its output nuance.
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?
Clear verb 'Get' with specific resource 'subscription item' and explicit scope ('by ID'). Distinct from ls_list_subscription_items by the singular 'specific' phrasing. Also specifies what is included (quantity, pricing, associated subscription) and the price-record behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete usage guidance for the include parameter ('pass include=price') and explains which field to read (effective_unit_price vs unit_price). While it doesn't explicitly say 'use this instead of ls_list_subscription_items', the 'specific... by ID' phrasing implies the singular use case. No exclusions are given, 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.
ls_get_subscription_item_usageARead-onlyIdempotent
Get the current usage for a metered subscription item within the current billing period.
| Name | Required | Description | Default |
|---|---|---|---|
| subscriptionItemId | Yes | The subscription item ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the description merely restates the read-only nature ('Get current usage'). No additional behavioral context (e.g., error handling, pagination, rate limits) is added 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?
The description is a single sentence that is concise and front-loaded with the key action and resource. No redundant information is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one read-only parameter), the description adequately covers purpose and scope. It does not document the return value, but the absence of an output schema is not critical for a straightforward usage check. Slightly more context (e.g., what the response contains) would improve 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?
There is only one parameter, subscriptionItemId, which is described in the schema as 'The subscription item ID'. The description does not add any extra meaning or context for the parameter. Since schema coverage is 100%, a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get', the resource 'current usage for a metered subscription item', and the scope 'within the current billing period'. This distinguishes it from sibling tools like ls_get_subscription_item (which likely retrieves item details) and ls_get_usage_record (which might fetch a specific usage record).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for checking current metered usage, but it does not explicitly state when to use this versus alternatives like ls_get_usage_record or ls_list_usage_records. No guidance on prerequisites or when not to use is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_get_usage_recordARead-onlyIdempotent
Get a specific usage record by ID, including quantity and action type.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'subscription-item') | |
| usageRecordId | Yes | The usage record ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, destructiveHint, and idempotentHint. The description adds 'including quantity and action type' but does not disclose error behavior, permissions, or rate limits. With annotations covering safety, this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, front-loaded with key information, no redundant words. Every element earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read operation with two parameters and no output schema, the description covers the essential purpose and scope. It could mention the 'include' parameter's effect, but schema already explains 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?
Schema coverage is 100% with both parameters described. The description adds no new parameter-level meaning beyond confirming 'by ID' for usageRecordId, which is already in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (get), resource (usage record), and scope (by ID), with specifics (including quantity and action type) that distinguish it from sibling tools like ls_list_usage_records.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving a single record by ID but provides no explicit guidance on when to use this tool versus alternatives like ls_list_usage_records or ls_create_usage_record.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_get_userARead-onlyIdempotent
Get the authenticated user's information including name, email, and avatar.
| 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, destructiveHint=false, and idempotentHint=true. The description adds that it returns user info including name, email, avatar, which is consistent. No additional behavioral traits beyond annotations are 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 description is a single clear sentence that is front-loaded and concise. Every word is meaningful with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description provides a decent overview of the return content. However, it lacks details on response format or edge cases. For a simple read operation, this is mostly 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?
There are no parameters, and the schema coverage is 100%. The description adds value by listing the returned fields, which helps the agent understand what to expect. Baseline for zero parameters 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 clearly states the action ('Get'), the resource ('the authenticated user's information'), and specifies example fields ('name, email, and avatar'). It distinguishes from sibling tools like ls_get_customer which retrieves a specific customer rather than 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?
The description implies use for getting the current user's information, but does not explicitly state when to use this tool versus alternatives such as ls_get_customer or ls_get_store. No exclusions or context for alternatives are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_get_variantARead-onlyIdempotent
Get a specific product variant by ID, including billing interval and trial settings. WARNING: do NOT read price as the amount charged. For usage-based, per-seat or otherwise tiered variants it is vestigial and commonly reads the same value across products that bill very differently. The authoritative per-unit price lives on the variant's PRICE resource -- call ls_list_prices with this variantId, take the newest record by created_at, and read its effective_unit_price.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'product,files') | |
| variantId | Yes | The variant ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool read-only, idempotent, and non-destructive, so the description's added warning about the vestigial `price` field is valuable behavioral disclosure beyond the structured data. It also reveals that the response includes billing interval and trial settings, and gives a step-by-step alternative for the true price. There is no contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences: one for purpose, two for the critical pricing warning. The warning is front-loaded and essential to safe use of the tool, and no sentence is filler. It is compact given the complexity of the caveat.
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 get-by-ID tool with no output schema, the description covers the most important trap (the misleading `price` field) and directs the agent to the correct price source. The `include` parameter is documented in the schema, and the read-only safety profile is in annotations, so an agent has everything needed to call 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?
The input schema already provides 100% parameter descriptions: variantId as 'The variant ID' and include as 'Comma-separated related resources.' The description doesn't add new parameter semantics beyond using variantId in its warning, so it stays at the baseline 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?
The description opens with 'Get a specific product variant by ID,' a specific verb and resource, and adds the detail that billing interval and trial settings are included. This clearly distinguishes it from listing tools like ls_list_variants and from product-level tools like ls_get_product. The purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not explicitly frame when to use this tool versus alternatives, but it provides a clear directive: do not trust the `price` field and instead call `ls_list_prices` with this variantId to retrieve the authoritative price. This is practical guidance for when the agent needs pricing information, though it doesn't spell out exclusions such as 'use ls_list_variants for a list.' Overall 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.
ls_get_webhookARead-onlyIdempotent
Get a specific webhook by ID, including URL, events, and last sent timestamp.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'store') | |
| webhookId | Yes | The webhook ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds value by detailing the output fields (URL, events, last sent timestamp), giving the agent concrete expectations of the response content.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence of 12 words, front-loaded with the action and key output details. No extraneous 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 simple getter with two parameters and no output schema, the description adequately covers purpose and output fields. It could mention that additional fields may exist, but given the simplicity, it is sufficiently 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% (both parameters documented). The tool description does not add extra meaning beyond the schema. Per guidelines, baseline is 3 when high 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?
The description clearly states 'Get a specific webhook by ID,' identifying the verb and resource. It also specifies the returned fields (URL, events, last sent timestamp), which distinguishes it from list or 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?
The description implicitly indicates use when a single webhook's details are needed. However, it does not explicitly specify when not to use or alternative tools like ls_list_webhooks for bulk retrieval. The context is clear but lacks direct exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_list_affiliatesARead-onlyIdempotent
List all affiliates for the authenticated user's stores, optionally filtered by user email. Results are paginated — check meta.page in the response for currentPage, lastPage, and total. Cross-store note: LEMONSQUEEZY_ALLOWED_STORE_IDS does NOT gate this tool -- it has no storeId field and no parent ID filter to scope by, so it returns affiliates tied to every store the API key can see, including non-allowed ones. Pair with a scoped LemonSqueezy API key for true cross-store enforcement -- the API key's visibility is the true boundary.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'store,user') | |
| pageSize | No | Results per page (1-100) | |
| userEmail | No | Filter by affiliate's user email | |
| pageNumber | No | Page number (1-indexed) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Exceeds annotations by disclosing pagination structure (meta.page currentPage, lastPage, total), the absence of storeId scoping, and that results are bound to API key visibility. These are critical behavioral traits not covered by readOnlyHint, openWorldHint, idempotentHint, or destructiveHint. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the core purpose, then pagination, then the critical cross-store caveat. Every sentence adds distinct value; the caveat is lengthy but essential due to the tool's non-obvious scoping behavior. 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 list tool with no output schema, the description covers essential invocation details: scope, optional email filter, pagination response format, and a significant behavioral gotcha. Nothing an agent needs to call the 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?
Schema already documents all four parameters with 100% coverage, so baseline is 3. The description only restates the userEmail filter and pagination behavior, adding no new parameter-level meaning beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List all affiliates') with clear scope ('for the authenticated user's stores') and optional filter ('by user email'). The description is clearly distinct from sibling ls_get_affiliate (singular vs. list) and other list tools, and the pagination note reinforces its list nature.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage context: when to use the tool (list all affiliates, optionally filtered by email) and a when-not warning that LEMONSQUEEZY_ALLOWED_STORE_IDS does not gate this tool, recommending a scoped API key for true store enforcement. This acts as a clear exclusion and guidance for correct usage, even without naming an alternative sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_list_checkoutsARead-onlyIdempotent
List all checkouts, optionally filtered by store or variant. Results are paginated — check meta.page in the response for currentPage, lastPage, and total.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'store,variant') | |
| storeId | No | Filter by store ID | |
| pageSize | No | Results per page (1-100) | |
| variantId | No | Filter by variant ID | |
| pageNumber | No | Page number (1-indexed) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description adds valuable behavioral context beyond annotations by explaining pagination behavior and response structure (meta.page), which aids in result handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, front-loaded with purpose and filters, immediately followed by pagination details. No redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Description adequately covers purpose, filters, and pagination for a list tool. Annotations handle safety/prerequisites, and schema documents parameters fully.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers all 5 parameters with full descriptions; description only mentions 'store or variant' filters, adding no additional 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?
Description clearly states 'List all checkouts' with a specific verb and resource, and mentions optional filters by store or variant, distinguishing it from sibling list 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?
Description implies usage when you need to retrieve multiple checkouts with optional filters, but no explicit guidance on when not to use or comparison with alternatives. Context is clear given sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_list_customersARead-onlyIdempotent
List all customers, optionally filtered by store or email. Results are paginated — check meta.page in the response for currentPage, lastPage, and total.
| Name | Required | Description | Default |
|---|---|---|---|
| No | Filter by customer email | ||
| include | No | Comma-separated related resources to include (e.g. 'store,orders,subscriptions,license-keys') | |
| storeId | No | Filter by store ID | |
| pageSize | No | Results per page (1-100) | |
| pageNumber | No | Page number (1-indexed) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds a valuable behavioral detail: 'Results are paginated — check meta.page in the response for currentPage, lastPage, and total.' This goes beyond the annotations and informs the agent about response navigation.
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 primary action is front-loaded, and the pagination note is succinct and relevant. Every word 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?
The definition is complete for a list tool: annotations cover safety, schema covers parameters, and the description covers pagination behavior. It doesn't mention default sorting or response fields beyond meta.page, but that's a minor gap given the simplicity of the operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for all five parameters. The description only reiterates the filters (store/email) and pagination, adding minimal new meaning beyond what the schema provides. The baseline of 3 is appropriate because the schema handles parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List'), a clear resource ('all customers'), and optional filters ('by store or email'), which distinguishes it from sibling tools like ls_get_customer (single retrieval) and ls_create_customer. It is unambiguous and not a tautology.
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 clearly conveys when to use it: to list all customers, optionally filtered. It implies a contrast with ls_get_customer for single-record retrieval, though it doesn't explicitly name alternatives. The context is clear enough for an agent to choose it for list operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_list_discount_redemptionsARead-onlyIdempotent
List all discount redemptions, optionally filtered by discount or order. Results are paginated — check meta.page in the response for currentPage, lastPage, and total. Cross-store note: when LEMONSQUEEZY_ALLOWED_STORE_IDS is set, this tool requires at least one of: discountId, orderId. Even with that set, Pair with a scoped LemonSqueezy API key for true cross-store enforcement -- the API key's visibility is the true boundary.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'discount,order') | |
| orderId | No | Filter by order ID | |
| pageSize | No | Results per page (1-100) | |
| discountId | No | Filter by discount ID | |
| pageNumber | No | Page number (1-indexed) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnly, idempotent, non-destructive), the description reveals pagination behavior ('check meta.page...') and the cross-store constraint with LEMONSQUEEZY_ALLOWED_STORE_IDS, explaining the API key as the true boundary. This adds substantial behavioral context not present 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?
Three sentences, front-loaded with purpose, followed by pagination and cross-store notes. Every sentence adds value; no filler or repetition of schema/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?
Given no output schema, the description covers the essential response element (meta.page with currentPage, lastPage, total). It includes optional filters, pagination, and the cross-store constraint, making it complete for this tool's 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 descriptions cover 100% of parameters, so the baseline is 3. The description adds minimal param semantics by mentioning 'optionally filtered by discount or order', which maps to discountId and orderId, but doesn't elaborate beyond 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?
The description starts with 'List all discount redemptions' — a specific verb and resource that clearly states the tool's function. It also mentions optional filters by discount or order, which distinguishes it from sibling tools like ls_get_discount_redemption.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: listing all redemptions with optional filters and pagination. It also includes a specific conditional guideline (when LEMONSQUEEZY_ALLOWED_STORE_IDS is set, at least one filter is required). It doesn't explicitly state when to use alternatives like ls_get_discount_redemption, but the listing scope is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_list_discountsARead-onlyIdempotent
List all discounts, optionally filtered by store. Results are paginated — check meta.page in the response for currentPage, lastPage, and total.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'store,variants,discount-redemptions') | |
| storeId | No | Filter by store ID | |
| pageSize | No | Results per page (1-100) | |
| pageNumber | No | Page number (1-indexed) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, destructiveHint, idempotentHint. The description adds pagination behavior (check meta.page) and optional store filtering, which enhances transparency. No contradictions. However, it does not disclose authentication or rate limit details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: first states purpose clearly, second adds crucial pagination detail. No unnecessary words, front-loaded, and concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description only mentions pagination in response (meta.page) and not the actual return structure of discount objects. For a list tool, this leaves agents guessing about the data returned, making it incomplete.
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 each parameter described in the schema. The description adds little beyond 'filtered by store' (already in schema) and pagination for the response, not parameters. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List all discounts, optionally filtered by store', which is a specific verb+resource pair. It distinguishes from siblings like create, delete, get discount tools, and other list tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for reading discounts with optional filtering, but does not explicitly state when not to use or mention alternatives. The pagination note provides context, but lacks exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_list_filesARead-onlyIdempotent
List all files, optionally filtered by variant. Results are paginated — check meta.page in the response for currentPage, lastPage, and total. Cross-store note: when LEMONSQUEEZY_ALLOWED_STORE_IDS is set, this tool requires at least one of: variantId. Even with that set, Pair with a scoped LemonSqueezy API key for true cross-store enforcement -- the API key's visibility is the true boundary.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'variant') | |
| pageSize | No | Results per page (1-100) | |
| variantId | No | Filter by variant ID | |
| pageNumber | No | Page number (1-indexed) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, so the safety profile is known. The description adds valuable behavioral details: pagination via `meta.page` and the cross-store requirement for `variantId`, plus the API key boundary note. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and remains short, but has some awkward phrasing (e.g., 'at least one of: variantId' and a mid-sentence capital 'Pair'). Overall, it is appropriately sized and readable, earning a 4 rather than a perfect 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 list tool with no output schema, the description covers the essential behavior: listing, optional filtering, pagination, and cross-store constraints. It does not explain the `include` parameter, but the schema already describes it, so this is sufficient for the tool's 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?
All parameters are documented in the schema (100% coverage), so baseline is 3. The description adds meaningful context by emphasizing the optional variant filter and the conditional requirement for `variantId` in cross-store scenarios, enhancing parameter understanding beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('List') and resource ('files'), with an optional filter by variant. This distinguishes it from the singular `ls_get_file` and other list tools by indicating the list operation and pagination behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear context for when to use this tool (listing files) and includes a specific conditional note about requiring `variantId` when `LEMONSQUEEZY_ALLOWED_STORE_IDS` is set. It does not explicitly mention alternatives, but the distinction from `ls_get_file` is implicit, and the cross-store guidance adds practical usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_list_license_key_instancesARead-onlyIdempotent
List all license key instances (activations), optionally filtered by license key. Results are paginated — check meta.page in the response for currentPage, lastPage, and total. Cross-store note: when LEMONSQUEEZY_ALLOWED_STORE_IDS is set, this tool requires at least one of: licenseKeyId. Even with that set, Pair with a scoped LemonSqueezy API key for true cross-store enforcement -- the API key's visibility is the true boundary.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'license-key') | |
| pageSize | No | Results per page (1-100) | |
| pageNumber | No | Page number (1-indexed) | |
| licenseKeyId | No | Filter by license key ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant behavioral context beyond the readOnlyHint/true and destructiveHint/false annotations. It discloses pagination behavior ('check meta.page...'), and importantly reveals an environment-dependent requirement (LEMONSQUEEZY_ALLOWED_STORE_IDS) and the true security boundary ('the API key's visibility is the true boundary'). This goes well 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?
The description is relatively concise and front-loaded with the main purpose. However, the cross-store note becomes run-on and grammatically awkward ('Even with that set, Pair with a scoped LemonSqueezy API key'), which slightly undermines structure. It still earns a 4 for packing useful info without excessive 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?
The description covers the core aspects of a list tool: resource, optional filters, pagination response, and a special environment condition. It lacks an explicit explanation of the 'instance' concept beyond 'activations' and doesn't describe the response shape (but no output schema exists, so the meta.page mention helps). For a list operation with schema-provided params, this is reasonably 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 baseline is 3. The description adds extra meaning to licenseKeyId by noting it becomes required under a specific configuration, which is not evident from the schema alone. It also implies that include/pageSize/pageNumber relate to list behavior, but doesn't detail them beyond schema descriptions. Overall, it adds non-schema context, justifying a 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 opens with a specific verb+resource: 'List all license key instances (activations), optionally filtered by license key.' This clearly distinguishes it from sibling tools like ls_list_license_keys (different resource) and ls_get_license_key_instance (single-instance fetch). The parenthetical 'activations' further disambiguates the domain concept.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: it's for listing instances with optional filtering and pagination. It includes a cross-store note explaining when licenseKeyId becomes required (when LEMONSQUEEZY_ALLOWED_STORE_IDS is set), which is useful usage guidance. However, it does not explicitly state when to prefer an alternative tool, though 'list' vs 'get' distinction is implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_list_license_keysARead-onlyIdempotent
List all license keys, optionally filtered by store, order, or product. Results are paginated — check meta.page in the response for currentPage, lastPage, and total.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'store,customer,order,order-item,product,license-key-instances') | |
| orderId | No | Filter by order ID | |
| storeId | No | Filter by store ID | |
| pageSize | No | Results per page (1-100) | |
| productId | No | Filter by product ID | |
| pageNumber | No | Page number (1-indexed) | |
| orderItemId | No | Filter by order item ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, non-destructive, idempotent behavior. The description adds valuable behavioral context: results are paginated and notes to check the 'meta.page' object for currentPage, lastPage, and total. This goes beyond the annotations. No additional info on rate limits or auth is needed for a read-only 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?
The description is extremely concise: two sentences covering purpose, filters, and pagination response hints. Every word adds value; no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 7 optional parameters, no output schema, and good annotations, the description covers filtering and pagination adequately. However, it does not mention that the response contains a list of license key objects (implied by name) or describe the 'include' parameter's effect on response shape. Still, the core usage is well-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 description coverage is 100%, so baseline is 3. The description summarizes filters ('optionally filtered by store, order, or product') and mentions pagination, but does not add new details about parameters like 'include' or pageNumber/pageSize beyond what the schema provides. The pagination note is helpful but not parameter-specific.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists all license keys with optional filters by store, order, or product. It distinguishes from sibling list tools (e.g., ls_list_customers, ls_list_orders) by specifying the resource (license keys). The verb 'List' and resource 'license keys' are precise.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when needing to list license keys with optional filters, but lacks explicit guidance on when not to use it or alternatives like ls_get_license_key for a single key. Given the sibling tools are all list tools for different entities, the agent can infer the correct tool, but no direct comparison is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_list_order_itemsARead-onlyIdempotent
List all order items, optionally filtered by order or product. Results are paginated — check meta.page in the response for currentPage, lastPage, and total. Cross-store note: when LEMONSQUEEZY_ALLOWED_STORE_IDS is set, this tool requires at least one of: orderId, productId, variantId. Even with that set, Pair with a scoped LemonSqueezy API key for true cross-store enforcement -- the API key's visibility is the true boundary.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'order,product,variant') | |
| orderId | No | Filter by order ID | |
| pageSize | No | Results per page (1-100) | |
| productId | No | Filter by product ID | |
| variantId | No | Filter by variant ID | |
| pageNumber | No | Page number (1-indexed) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent, but the description adds critical behavioral details: pagination response shape (meta.page with currentPage, lastPage, total) and the cross-store enforcement boundary with LEMONSQUEEZY_ALLOWED_STORE_IDS. It also notes the API key's visibility as the true boundary, which is valuable for security-aware invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact (three sentences) and front-loads the core purpose. The cross-store note is dense and slightly awkward ('Even with that set, Pair with...') but every sentence adds value. Minor typographical/case issues prevent a perfect score.
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 complete schema annotations and no output schema, the description does a good job by mentioning pagination meta fields. It does not describe the shape of an order item entry, but given the standard REST list pattern and sibling tools, this is 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% so parameters are documented, but the description adds conditional semantics: when LEMONSQUEEZY_ALLOWED_STORE_IDS is set, at least one of orderId, productId, or variantId is required. This is a nuanced constraint not evident from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's verb ('List') and resource ('order items') while noting optional filtering by order or product. This distinguishes it from sibling tools like ls_get_order_item (singular) and ls_list_orders (different resource). The 'all' scope emphasizes it's a collection operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides concrete usage context: optional filters and pagination behavior, plus a cross-store constraint requiring orderId/productId/variantId under certain settings. However, it does not explicitly contrast with alternatives like ls_list_orders or ls_get_order_item, so the when-to-use guidance is incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_list_ordersARead-onlyIdempotent
List all orders, optionally filtered by store or user email. Results are paginated — check meta.page in the response for currentPage, lastPage, and total.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'store,customer,order-items,subscriptions,license-keys,discount-redemptions') | |
| storeId | No | Filter by store ID | |
| pageSize | No | Results per page (1-100) | |
| userEmail | No | Filter by user email | |
| pageNumber | No | Page number (1-indexed) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds genuinely new behavioral disclosure by stating that results are paginated and pointing to meta.page for currentPage, lastPage, and total, which is outside the annotations. This is useful but does not cover rate limits or response ordering, 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?
Two sentences, front-loaded with purpose and then the essential pagination detail. Every sentence contributes; there is no filler or repetition of schema contents.
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 all parameters optional and a complete input schema, the description covers the main behavior, optional filters, and pagination response shape. It does not discuss the include parameter or default ordering, but those are documented in the schema and are not necessary for basic invocation. The absence of an output schema is partly mitigated by the pagination metadata note.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each parameter is already documented in the schema. The description summarizes the two filters (store/user email) and pagination, but does not add new semantics beyond what the property descriptions already state. Baseline 3 applies 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?
The description opens with the specific action 'List all orders' and scoping phrase 'optionally filtered by store or user email', making the resource and verb unambiguous. This sets it apart from single-order tools like ls_get_order and mutation tools like ls_generate_order_invoice/ls_refund_order. The scope ('all orders') is precise and leaves no room for confusion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes a clear use case: retrieving orders at scale with optional store/email filters. It does not, however, name sibling tools or state when not to use this tool, so agents must infer alternatives from naming. Clear context, but no explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_list_pricesARead-onlyIdempotent
List all prices, optionally filtered by variant. Results are paginated — check meta.page in the response for currentPage, lastPage, and total. Every record is annotated with effective_unit_price (cents actually charged per unit) and effective_unit_price_note. READ THAT, not unit_price: on a tiered scheme (volume/graduated) unit_price is vestigial and is NOT the charged amount -- the real per-unit price lives in tiers[], and such records also carry unit_price_is_not_charged: true. On package pricing unit_price IS charged, but it buys a block of package_size units, so effective_unit_price reports the per-unit figure and the record carries unit_price_is_per_package: true. NOTE that several price records can exist per variant; the CURRENT one is the newest by created_at (results are sorted newest-first). Cross-store note: when LEMONSQUEEZY_ALLOWED_STORE_IDS is set, this tool requires at least one of: variantId. Even with that set, Pair with a scoped LemonSqueezy API key for true cross-store enforcement -- the API key's visibility is the true boundary.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'variant') | |
| pageSize | No | Results per page (1-100) | |
| variantId | No | Filter by variant ID | |
| pageNumber | No | Page number (1-indexed) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though annotations declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, the description goes well beyond the structured metadata: it discloses pagination shape (meta.page), sorting order (newest-first by created_at), the trap of using unit_price instead of effective_unit_price, the tiered/package semantics, and cross-store enforcement conditions. This is exactly the kind of value the description should add beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The text is dense and front-loaded with the core function and filter, then the pagination note, then the pricing semantics, then the store note. It's long but every sentence earns its place given the complexity. A small deduction because the cross-store sentence is somewhat run-on and could be split for readability.
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 burden of explaining the response. It covers pagination fields, the key price-semantics fields (effective_unit_price, effective_unit_price_note, unit_price_is_not_charged, unit_price_is_per_package), and the newest-record rule. For a read-only, 4-param list tool, this is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each parameter (include, pageSize, variantId, pageNumber) already has schema-level descriptions. The description adds value beyond those: it explains how variantId interacts with store scoping, and it explains pagination-related fields that the schema doesn't fully connect (pageNumber/pageSize feed into meta.page). The description also clarifies the meaning of the variant filter with the 'newest by created_at' note.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('List all prices') and immediately states the only optional filter (by variant), which is enough to distinguish it from ls_get_price (single price) and other list tools. It does a lot more than name what it does, so the purpose dimension is fully satisfied.
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 tells the agent when the tool is appropriate (listing prices, optionally scoped by variant) and includes a cross-store note about constraints when LEMONSQUEEZY_ALLOWED_STORE_IDS is set. It does not explicitly name an alternative tool to prefer in a different situation, so it loses one point from a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_list_productsARead-onlyIdempotent
List all products, optionally filtered by store. Results are paginated — check meta.page in the response for currentPage, lastPage, and total.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'store,variants') | |
| storeId | No | Filter by store ID | |
| pageSize | No | Results per page (1-100) | |
| pageNumber | No | Page number (1-indexed) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, idempotentHint, and openWorldHint. The description adds value by explaining pagination behavior and where to find pagination metadata, which is 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 sentences: first states purpose and optional filter, second explains pagination. No redundant information, front-loaded with key details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the schema fully describes all 4 parameters, annotations cover safety and idempotency, and no output schema exists, the description is complete. It covers optional filtering, pagination, and what to expect in the response.
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. The description mentions the store filter and pagination, but does not add detailed semantics beyond what the schema provides for individual parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists products with an optional store filter and explains pagination. It distinguishes itself from sibling list tools targeting different resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for listing products, optionally filtered by store, but does not provide explicit when-to-use or when-not-to-use guidance relative to other list tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_list_storesARead-onlyIdempotent
List all stores for the authenticated user. Results are paginated — check meta.page in the response for currentPage, lastPage, and total. Cross-store note: LEMONSQUEEZY_ALLOWED_STORE_IDS does NOT gate this tool -- it has no storeId field and no parent ID filter to scope by, so it returns every store the API key can see, including stores outside the allowlist. Pair with a scoped LemonSqueezy API key for true cross-store enforcement -- the API key's visibility is the true boundary.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'products,discounts,license-keys,subscriptions,webhooks') | |
| pageSize | No | Results per page (1-100) | |
| pageNumber | No | Page number (1-indexed) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint, idempotentHint, openWorldHint), the description discloses the non-obvious behavior that the tool ignores the allowlist and returns every store visible to the API key, including those outside the allowlist. It also reveals pagination details (meta.page with currentPage, lastPage, total). This adds significant behavioral context beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences and front-loaded with the main purpose. The cross-store note is slightly long but packed with essential caveats. No fluff, but the third sentence could be tightened. Overall, efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no required parameters, no output schema) and rich annotations, the description covers the key aspects: purpose, pagination response, and a critical authorization boundary. It is sufficiently complete for an agent to correctly select and invoke the tool, though a brief note on the returned store object shape would be marginally helpful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% coverage for all three parameters (include, pageSize, pageNumber) with descriptions. The tool description adds some context about pagination in the response, but does not elaborate on parameter values or syntax. Given the complete schema coverage, a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List all stores') and the scope ('for the authenticated user'). It distinguishes itself from sibling tools like ls_get_store (single store retrieval) by emphasizing 'all stores.' The verb is specific and the resource is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context that the tool lists all stores for the authenticated user, and includes a crucial cross-store note explaining that LEMONSQUEEZY_ALLOWED_STORE_IDS does not gate this tool. It suggests pairing with a scoped API key for enforceability, which guides use. However, it does not explicitly name alternative tools (like ls_get_store) or state exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_list_subscription_invoicesARead-onlyIdempotent
List all subscription invoices, optionally filtered by store, subscription, or status. Results are paginated — check meta.page in the response for currentPage, lastPage, and total.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Filter by invoice status | |
| include | No | Comma-separated related resources to include (e.g. 'store,subscription') | |
| storeId | No | Filter by store ID | |
| pageSize | No | Results per page (1-100) | |
| refunded | No | Filter by refunded status | |
| pageNumber | No | Page number (1-indexed) | |
| subscriptionId | No | Filter by subscription ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, non-destructive behavior. The description adds valuable context about pagination (check meta.page), which goes beyond annotations. No behavioral contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded main purpose, no unnecessary information. Every sentence adds value: the first states the action and filters, the second explains pagination.
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?
Adequate for a list tool with high schema coverage, but lacks details on response format beyond pagination, ordering, or default behavior. No output schema, so more context could help.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each parameter is already documented. The description does not add new meaning beyond restating filter options. Baseline score of 3 is appropriate as per guidelines.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'List all subscription invoices' with optional filters, using a specific verb and resource. It distinguishes itself from sibling tools like ls_get_subscription_invoice and ls_refund_subscription_invoice.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for listing invoices with filters but does not explicitly state when not to use it or mention alternatives. No guidance on edge cases or when other tools are more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_list_subscription_itemsARead-onlyIdempotent
List all subscription items, optionally filtered by subscription or price. Results are paginated — check meta.page in the response for currentPage, lastPage, and total. Pass include=price for the price records behind them; embedded price records are annotated with effective_unit_price (cents actually charged per unit) -- read that, not a record's unit_price, which is vestigial on tiered pricing and per-package on package pricing. Cross-store note: when LEMONSQUEEZY_ALLOWED_STORE_IDS is set, this tool requires at least one of: subscriptionId, priceId. Even with that set, Pair with a scoped LemonSqueezy API key for true cross-store enforcement -- the API key's visibility is the true boundary.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'subscription,price,usage-records') | |
| priceId | No | Filter by price ID | |
| pageSize | No | Results per page (1-100) | |
| pageNumber | No | Page number (1-indexed) | |
| subscriptionId | No | Filter by subscription ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior. The description adds substantial behavioral context beyond that: the paginated response envelope, the authoritative effective_unit_price on embedded price records rather than unit_price, and the API-key-level cross-store boundary. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and every section carries useful information, but it is dense and the cross-store sentence is slightly verbose with an awkward 'Even with that set, Pair...' phrase. It earns its length overall, though not with maximum polish.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no output schema, the description fills the gap well by explaining the pagination metadata shape and the meaning of embedded price records. It also covers important cross-store constraints, making the tool callable correctly in both single-store and multi-store environments.
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?
Even though schema coverage is 100%, the description adds critical parameter meaning: include=price's effect, effective_unit_price semantics, and the conditional requirement on subscriptionId/priceId under cross-store configuration. This is exactly the kind of non-obvious semantic guidance agents need.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List all subscription items' and immediately clarifies the optional filters by subscription or price. This distinguishes it from sibling resources like subscriptions, subscription invoices, and subscription item usage records, even without naming an alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: pagination via meta.page, how to include price records, and the cross-store requirement that subscriptionId or priceId must be supplied when LEMONSQUEEZY_ALLOWED_STORE_IDS is set. It does not explicitly compare against alternative tools, but the guidance is strong enough to select and call confidently.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_list_subscriptionsARead-onlyIdempotent
List all subscriptions, optionally filtered by store, order, product, variant, or status. Results are paginated — check meta.page in the response for currentPage, lastPage, and total.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Filter by subscription status | |
| include | No | Comma-separated related resources to include (e.g. 'store,customer,order,order-item,product,variant') | |
| orderId | No | Filter by order ID | |
| storeId | No | Filter by store ID | |
| pageSize | No | Results per page (1-100) | |
| productId | No | Filter by product ID | |
| userEmail | No | Filter by user email | |
| variantId | No | Filter by variant ID | |
| pageNumber | No | Page number (1-indexed) | |
| orderItemId | No | Filter by order item ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior. The description adds useful behavioral information beyond those annotations by specifying that results are paginated and that meta.page contains currentPage, lastPage, and total.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The core purpose is front-loaded, optional filters are summarized compactly, and pagination behavior is stated in one clear sentence.
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 operation with fully documented parameters, the description is nearly complete. It covers the filtering scope and pagination response fields; only minor operational details like default page size or explicit response envelope shape are left implicit, but these are not critical.
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 fully documents all 10 parameters. The description adds a helpful summary of filter capabilities but does not materially extend the parameter semantics beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'List all subscriptions'. It enumerates the main optional filters (store, order, product, variant, status) and is clearly distinguished from singular get and item-level siblings by its listing and filtering scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for using the tool: listing subscriptions with optional filters and pagination. However, it does not explicitly state when to use this over alternatives like ls_get_subscription or ls_list_subscription_items, nor does it provide exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_list_usage_recordsARead-onlyIdempotent
List all usage records, optionally filtered by subscription item. Results are paginated — check meta.page in the response for currentPage, lastPage, and total. Cross-store note: when LEMONSQUEEZY_ALLOWED_STORE_IDS is set, this tool requires at least one of: subscriptionItemId. Even with that set, Pair with a scoped LemonSqueezy API key for true cross-store enforcement -- the API key's visibility is the true boundary.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'subscription-item') | |
| pageSize | No | Results per page (1-100) | |
| pageNumber | No | Page number (1-indexed) | |
| subscriptionItemId | No | Filter by subscription item ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, open-world, and idempotent hints, and the description adds valuable behavior beyond these: pagination details (check meta.page for currentPage, lastPage, total) and the cross-store enforcement requirement. This gives the agent insight into response structure and environment-specific constraints.
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 reasonably concise, front-loading the core purpose in the first sentence. However, the cross-store note has a slightly awkward comma splice ('Even with that set, Pair with a scoped...') and could be tightened, but it remains clear enough.
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 list operation, the description covers essential context: pagination behavior, optional filtering, and a cross-store requirement. While it doesn't detail the shape of individual usage records, the output schema is absent and the pagination note provides useful return structure. This 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%, with each parameter (include, pageSize, pageNumber, subscriptionItemId) having its own description. The tool description adds minimal extra parameter meaning beyond saying 'optionally filtered by subscription item' and mentioning pagination, so 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?
The description starts with 'List all usage records, optionally filtered by subscription item,' which is a specific verb and resource that clearly distinguishes this listing operation from sibling tools like ls_get_usage_record and ls_create_usage_record. The scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool: to list usage records, with optional filtering by subscription item. It also includes a cross-store note about a required filter condition, but it doesn't explicitly name alternatives or exclusion criteria. Since no direct alternative exists for listing usage records, the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_list_variantsARead-onlyIdempotent
List all variants, optionally filtered by product. Results are paginated — check meta.page in the response for currentPage, lastPage, and total. WARNING: do NOT read price as the amount charged -- for usage-based, per-seat or otherwise tiered variants it is vestigial and commonly reads the same value across products that bill very differently. The authoritative per-unit price lives on each variant's PRICE resource: call ls_list_prices with the variantId, take the newest record by created_at, and read its effective_unit_price. Cross-store note: when LEMONSQUEEZY_ALLOWED_STORE_IDS is set, this tool requires at least one of: productId. Even with that set, Pair with a scoped LemonSqueezy API key for true cross-store enforcement -- the API key's visibility is the true boundary.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'product,files') | |
| pageSize | No | Results per page (1-100) | |
| productId | No | Filter by product ID | |
| pageNumber | No | Page number (1-indexed) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds substantial behavioral context: pagination via meta.page, the vestigial nature of `price` for tiered variants, and the cross-store enforcement nuance. This goes well beyond annotations and directly prevents costly misinterpretations.
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 information-dense but verbose, containing multiple warnings and notes in a single block. While it is front-loaded with the core purpose and pagination, the pricing warning and cross-store note could be more concisely structured. The length is justified by importance but it lacks crispness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description covers the essential response structure (meta.page for pagination) and provides critical guidance on price accuracy. It also addresses cross-store authorization nuances. An agent has enough to call the tool correctly and interpret results, even without seeing the response 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% with each parameter described. The description enhances this by clarifying productId as an optional filter and implicitly connecting pageSize/pageNumber to pagination. It also highlights that productId becomes required when LEMONSQUEEZY_ALLOWED_STORE_IDS is set, adding semantic depth beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear, specific statement: 'List all variants, optionally filtered by product.' This names the verb, resource, and a filtering option, distinguishing it from single-variant retrieval (ls_get_variant) and price listing (ls_list_prices). No ambiguity about the tool's core function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides strong usage context: pagination behavior, a warning about the unreliable `price` field, and guidance to use ls_list_prices for authoritative pricing. It also notes the cross-store requirement for productId. However, it does not explicitly state when to avoid this tool in favor of ls_get_variant for a single variant, though that is implied by the listing nature.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_list_webhooksARead-onlyIdempotent
List all webhooks, optionally filtered by store. Results are paginated — check meta.page in the response for currentPage, lastPage, and total.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Comma-separated related resources to include (e.g. 'store') | |
| storeId | No | Filter by store ID | |
| pageSize | No | Results per page (1-100) | |
| pageNumber | No | Page number (1-indexed) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, non-destructive, idempotent, openWorld. Description adds pagination behavior ('check meta.page...'), which is valuable context beyond annotations. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, front-loaded sentences with no redundant information. Every phrase adds value: purpose, optional filter, pagination guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, description adequately covers filter and pagination response shape (meta.page). Could mention webhook fields returned, but not critical for a list tool. Annotations fill gaps on safety.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for all four parameters. Description adds no new parameter meaning beyond schema (storeId filter and pagination already described). Merely echoes schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it lists all webhooks with optional store filtering, using specific verb and resource. Distinguishes from sibling list tools (e.g., ls_list_customers, ls_list_orders) by specifying the resource 'webhooks'.
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 (to retrieve webhooks, optionally filtered), but no explicit guidance on when to use vs. alternatives like get_webhook (single) or delete_webhook. Pagination mention helps, but no exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_refund_orderADestructive
Issue a refund for an order. This is irreversible — the refund amount is in cents (e.g. 1000 = $10.00).
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | Refund amount in cents (e.g. 1000 = $10.00) | |
| orderId | Yes | The order ID to refund |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description notes irreversibility, which aligns with the destructiveHint annotation. However, it does not detail side effects such as whether refunds are partial or full, payment method handling, or further consequences. The annotation already indicates destructiveness, so the description adds modest 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?
The description is extremely concise: two sentences that state the purpose and a critical behavioral note. It is front-loaded with the primary action and wastes no 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 simple refund tool with two well-documented parameters and annotations, the description covers the essential behavioral trait (irreversibility). It does not explain return values, but no output schema exists. It might benefit from mentioning prerequisites (e.g., order status), but overall it is fairly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters (orderId, amount) have descriptions in the schema that fully explain their meaning. The description's example for amount ('e.g. 1000 = $10.00') merely reinforces the schema. With 100% schema coverage, the description adds no new parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Issue a refund for an order') and the resource (an order). The title 'Refund order' reinforces this. It distinguishes itself from siblings like ls_refund_subscription_invoice by focusing on orders.
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 includes the warning 'This is irreversible' which implies careful use, but it does not explicitly state when to use this tool versus alternatives like ls_refund_subscription_invoice or ls_cancel_subscription. No prerequisites or exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_refund_subscription_invoiceADestructive
Issue a refund for a subscription invoice. This is irreversible — the refund amount is in cents (e.g. 1000 = $10.00).
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | Refund amount in cents (e.g. 1000 = $10.00) | |
| subscriptionInvoiceId | Yes | The subscription invoice ID to refund |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true, but the description adds 'This is irreversible' reinforcing the destructive nature. It also mentions the refund amount is in cents, providing behavioral context beyond annotations. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, each serving a purpose: first states action and resource, second adds crucial caveat and unit. No unnecessary words, well front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (2 parameters, no output schema), the description covers the essential: purpose, irreversibility, and amount unit. It could mention prerequisites (e.g., invoice must be paid) or impact on invoice status, but overall adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for both parameters. The description adds a clarifying example for the amount parameter ('e.g. 1000 = $10.00'), which reinforces the schema but does not add substantially new meaning. Baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the verb 'Issue a refund' and the resource 'subscription invoice', distinguishing it from the sibling ls_refund_order which refunds orders. The purpose is specific and 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?
Description mentions irreversibility but does not provide explicit when-to-use or when-not-to-use guidance. While the tool name and sibling list imply usage for subscription invoices, no direct comparison to alternatives like ls_refund_order is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_sink_event_mark_processedAIdempotent
Mark a sink event as processed by your consumer. Idempotent.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The sink event ID (positive integer, as returned by ls_sink_events_list). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds 'Idempotent', which is already declared in annotations (idempotentHint=true). With annotations covering safety and idempotency, the description adds minimal behavioral context. It does not explain side effects or what happens if the event is already marked processed, but annotations are sufficient for basic transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences: the first states the core action, the second adds idempotency. It is front-loaded, concise, and contains no unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple one-parameter tool with good schema and annotations, the description adequately covers the action and its idempotency. It implicitly assumes the event exists (via parameter description linking to ls_sink_events_list). No output schema needed. Slightly incomplete regarding post-condition, but sufficient for typical use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%; the parameter 'id' is well-documented in the schema as 'The sink event ID (positive integer, as returned by ls_sink_events_list).' The description does not add any further parameter details, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Mark a sink event as processed' with a specific verb and resource. It is distinct from sibling tools like ls_sink_events_list (list events) and ls_sink_stats (stats). The idempotent hint is also included, further clarifying the purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. For example, it does not explain that it should be called after processing an event or how it differs from ls_sink_events_list or ls_sink_stats. The description only mentions 'by your consumer' as a vague usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_sink_events_listARead-onlyIdempotent
List webhook events the sink has received, optionally filtered. Use since (received_at timestamp, exclusive) to checkpoint. Requires the sink at LEMONSQUEEZY_SINK_URL with LEMONSQUEEZY_SINK_ADMIN_TOKEN.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter by event_name (e.g. 'order_created'). | |
| limit | No | Maximum number of events to return. | |
| since | No | Exclusive lower bound on received_at (Unix ms). Pass the highest received_at you have to checkpoint. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, so the description does not need to repeat these. The description adds value by disclosing the authentication requirement and the checkpointing mechanism (`since`), which are behavioral traits beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, consisting of three short sentences that convey the purpose, filtering and checkpointing usage, and authentication requirements. No extraneous information is present; every sentence serves a distinct purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that there is no output schema, the description should describe the return format or expected fields. It does not, which is a gap. The description covers parameters and authentication well but lacks information about the response structure. For a simple list tool, it is moderately 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%—all three parameters have detailed descriptions in the input schema. The tool description reiterates the use of `since` for checkpointing, which adds no new meaning beyond the schema. Therefore, the description does not enhance parameter semantics beyond the baseline score of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists webhook events the sink has received, with optional filtering. The verb 'list' and specific resource 'webhook events the sink has received' distinguish it from sibling tools like ls_list_webhooks (which lists webhook definitions) and ls_sink_event_mark_processed (which processes events).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: use `since` for checkpointing and optionally filter by type. It also mentions the authentication requirement (LEMONSQUEEZY_SINK_URL and LEMONSQUEEZY_SINK_ADMIN_TOKEN). However, it does not explicitly contrast with alternative tools or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_sink_statsARead-onlyIdempotent
Get sink totals: total events, unprocessed count, last-received timestamp.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the description's burden is lower. It adds that the tool returns aggregated counts and timestamps but does not disclose any additional behavioral traits (e.g., data scope or guarantees).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that immediately conveys the tool's function with front-loaded key information. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description provides sufficient information about the return values. However, it lacks details on data scope (e.g., all-time vs windowed) which could be helpful for an agent to interpret results 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?
There are no parameters (schema coverage 100%). The description is essential to convey the output meaning, listing three specific fields. It effectively compensates for the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with specific verb 'Get' and resource 'sink totals', listing the fields returned. It distinguishes from siblings like ls_sink_events_list (lists individual events) and ls_sink_event_mark_processed (mutates state).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool vs alternatives. The description only describes what it does; an agent would need to infer usage context (e.g., for overall health check vs detailed event inspection).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_update_customerADestructiveIdempotent
Update an existing customer's name, email, city, region, country, or status. The only supported status value is 'archived'; setting it here is the same operation as ls_archive_customer and is treated as destructive (rate-limited and audited). Other field edits are not.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | New city | |
| name | No | New name | |
| No | New email | ||
| region | No | New region/state | |
| status | No | Set to 'archived' to archive the customer. Equivalent to calling ls_archive_customer. | |
| country | No | New country (ISO 3166-1 alpha-2 code) | |
| customerId | Yes | The customer ID to update |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint and readOnlyHint, but the description adds valuable nuance: only the status='archived' path is destructive, and that path is rate-limited and audited. It also states that other field edits are not destructive, which goes beyond the tool-level annotation. This is good 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?
The description is three short sentences with the primary purpose front-loaded and the critical destructive-context caveat following immediately. There is no filler, repetition, or extraneous detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Together with the rich schema and annotations, the description covers what the tool updates, the special status behavior, and the destructive implications. It does not describe the return value or error behavior, and partial-update semantics are only implied by openWorldHint, but nothing essential for selecting and invoking 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%, so every parameter already has a meaningful description in the schema. The description repeats the status/archive equivalence but adds no new format, constraint, or behavior details beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Update an existing customer's name, email, city, region, country, or status.' Saying 'existing' distinguishes it from creation tools, and the status/archive mention explicitly relates it to ls_archive_customer. An agent can immediately tell what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description names ls_archive_customer as an equivalent for the status field and clarifies that other field edits are not destructive. This gives clear context for choosing between a normal update and an archive operation. It stops short of an explicit preference like 'use ls_archive_customer for archive-only requests,' but the guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_update_license_keyADestructiveIdempotent
Update a license key's activation limit, expiry date, or disabled status. Setting disabled: true, changing activationLimit, or changing expiresAt can revoke customer access and is treated as destructive (rate-limited and audited); disabled: false alone is not.
| Name | Required | Description | Default |
|---|---|---|---|
| disabled | No | Set to true to disable this license key | |
| expiresAt | No | Expiry date (ISO 8601 format). Set to null to remove expiry. | |
| licenseKeyId | Yes | The license key ID to update | |
| activationLimit | No | Maximum number of activations allowed. Pass null for unlimited. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint and readOnlyHint false, but the description adds substantial context beyond that: it identifies which specific field changes 'can revoke customer access', states that such changes are 'rate-limited and audited', and clarifies that 'disabled: false alone is not' destructive. This is exactly the kind of behavioral nuance an agent needs and goes well 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?
Two sentences with no filler. The first sentence front-loads the action and the affected fields; the second sentence adds the critical destructive-consequence nuance. 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?
For a four-parameter update tool with rich annotations and no output schema, the description covers the essential behavioral aspects: what can change, when it is destructive, rate limits and auditing. It does not describe the return value, but that is a minor gap given the tool's simplicity and the strong schema descriptions.
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 linking the three mutable parameters (disabled, activationLimit, expiresAt) to their real-world consequences and the non-destructive nature of disabled: false. This goes beyond the schema's field-level descriptions, earning a 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 uses a specific verb and resource: 'Update a license key's activation limit, expiry date, or disabled status.' This names the exact fields involved and clearly differentiates the update action from pure read or create tools. It does not explicitly distinguish itself from the closely related sibling ls_deactivate_license, 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?
The description implies when to use the tool (to change these three license attributes) and provides important cautions about destructive operations. However, it does not explicitly state when to prefer this tool over alternatives like ls_deactivate_license, nor does it give exclusion criteria. The guidance is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_update_subscriptionADestructiveIdempotent
Update a subscription. Can change the variant (plan switch), pause/unpause, set billing anchor, or update invoice details. Pausing (pause: 'void' or 'free'), switching plan (variantId), changing the billing anchor (billingAnchor), invoicing immediately (invoiceImmediately: true), or changing the trial end (trialEndsAt) changes what the customer pays or when, and is treated as destructive (rate-limited and audited); resuming (pause: 'resume'), un-cancelling (cancelled: false), invoiceImmediately: false and disableProrations are not. Use ls_cancel_subscription for cancellation.
| Name | Required | Description | Default |
|---|---|---|---|
| pause | No | Pause mode: 'void' (pause, skip billing), 'free' (pause, keep access free), or 'resume' to unpause | |
| cancelled | No | Set to false to un-cancel a subscription before it expires. To cancel, use ls_cancel_subscription instead. | |
| variantId | No | New variant ID for plan switching | |
| trialEndsAt | No | Set trial end date (ISO 8601 format). Set to null to end trial immediately. | |
| billingAnchor | No | Day of month (1-28) to anchor billing to | |
| subscriptionId | Yes | The subscription ID to update | |
| disableProrations | No | If true, disable prorations when changing plans | |
| invoiceImmediately | No | If true, invoice immediately when updating (default false for prorated changes) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral context beyond the annotations: it discloses that payment-affecting updates are 'treated as destructive (rate-limited and audited)' and identifies which operations are not destructive. This refines the broad destructiveHint=true annotation with operation-level nuance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose, and each clause earns its place by adding usable distinctions. It packs parameter groupings, destructive classification, and an explicit sibling alternative without unnecessary filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an 8-parameter update tool with no output schema and rich annotations, the description covers the key usage caveats and operation-level risks. Minor gaps remain, such as not explaining the interaction between disableProrations and variantId, but the combination of 100% schema coverage, annotations, and the description is largely sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds semantic value by grouping parameters according to their effect on payment: pause:'void'/'free' and variantId are destructive, while pause:'resume' and cancelled:false are not. It also maps high-level intent ('plan switch', 'pause/unpause') to the relevant parameter names, going beyond the schema's property descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the verb and resource ('Update a subscription') and enumerates the specific operations it supports: variant switch, pause/unpause, billing anchor, and invoice detail updates. It is clearly differentiated from the sibling ls_cancel_subscription, explicitly pointing cancellation to that tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage guidance by classifying operations into destructive versus non-destructive groups: pausing, switching plans, changing billing anchor, invoicing immediately, and changing trial end alter payment and are rate-limited/audited; resuming, un-cancelling, and proration disabling are not. It also explicitly routes cancellation to ls_cancel_subscription.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_update_subscription_itemADestructiveIdempotent
Update a subscription item's quantity. Used for seat-based or quantity-based billing.
| Name | Required | Description | Default |
|---|---|---|---|
| quantity | Yes | New quantity for the subscription item | |
| subscriptionItemId | Yes | The subscription item ID to update |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint:true, idempotentHint:true, and openWorldHint:true, which cover the main behavioral traits. The description adds no additional behavioral context beyond what the annotations provide, so it meets the baseline but does not exceed 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?
The description is two sentences that are front-loaded and efficient. Every word adds value, with no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity, schema coverage, and annotations, the description is nearly complete. However, it does not mention the return value or response format, which would be helpful for an update tool. Still, it is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with both parameters having clear descriptions. The description repeats the schema action without adding new meaning, so it scores the baseline for high 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?
The description clearly states the verb 'Update', the resource 'subscription item', and the specific attribute 'quantity'. It distinguishes from siblings by noting 'Used for seat-based or quantity-based billing', which differentiates it from other update tools like ls_update_customer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context for when to use the tool ('seat-based or quantity-based billing'), but does not explicitly state when not to use it or mention alternatives. This is sufficient but could be improved with exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_update_webhookADestructiveIdempotent
Update an existing webhook's URL, events, or secret. Setting secret rotates the signing secret and breaks signature verification on the receiver until they update their copy -- this is treated as destructive (rate-limited and audited).
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | New URL to send webhook events to (must be a valid http/https URL) | |
| events | No | Updated list of event types to subscribe to | |
| secret | No | New signing secret | |
| webhookId | Yes | The webhook ID to update |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already set destructiveHint=true, but the description adds concrete detail: setting secret rotates the signing secret, breaks signature verification on the receiver until updated, and is rate-limited and audited. This goes well beyond the boolean annotation and gives the agent actionable risk context, with no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler: the primary action is front-loaded, followed by a targeted caveat about secret rotation. 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 4-parameter tool with no output schema, the description covers purpose, destructive risk, and rate-limit/audit context. It does not mention what the API returns or the effect of updating url/events, but the schema and annotations fill most gaps, making this very close to 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%, but the description adds meaning beyond the schema: it clarifies that webhookId refers to an existing webhook and explains the behavioral consequence of setting secret. The url and events parameters are already well described in the schema, so the extra semantics are useful but not exhaustive.
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: 'Update an existing webhook's URL, events, or secret.' This clearly differentiates the tool from siblings like ls_get_webhook, ls_create_webhook, and ls_delete_webhook, and names the exact updatable fields.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this tool is for modifying an existing webhook, but it does not explicitly contrast with sibling tools or state when to choose this over create/delete/get. It provides some situational guidance by noting the destructive nature of setting secret, but no explicit alternatives or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ls_validate_licenseARead-onlyIdempotent
Validate a license key or specific instance. Does not require an API key — uses the license key itself for auth.
| Name | Required | Description | Default |
|---|---|---|---|
| instanceId | No | Optional instance ID to validate a specific activation | |
| licenseKey | Yes | The license key to validate |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, destructiveHint, idempotentHint, openWorldHint. Description adds that authentication uses the license key itself, a behavioral detail beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with front-loaded purpose. No superfluous 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 simple read-only validation tool with well-covered schema and annotations, description is complete. No output schema, but return value is implied.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so schema already documents both parameters clearly. Description adds no extra meaning beyond what schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states specific verb 'Validate' and resource 'license key or specific instance'. Distinct from sibling tools like activate, deactivate, 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?
Mentions that no API key is needed, giving context for when to use. Doesn't explicitly exclude alternatives, but sibling names imply different actions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v1.0.0- Changed
ls_get_checkout2 fields changed- changed
Input schema / properties / checkoutId / descriptionPrevious value: -"The checkout ID"New value: +"The checkout ID (a UUID, as returned by ls_list_checkouts / ls_create_checkout)" - changed
Input schema / properties / checkoutId / patternPrevious value: -"^[1-9]\\d*$"New value: +"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
- Changed
ls_update_license_key5 fields changed- added
Input schema / properties / activationLimit / anyOfAdded value: +[ + { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } +] - changed
Input schema / properties / activationLimit / descriptionPrevious value: -"Maximum number of activations allowed (0 = unlimited)"New value: +"Maximum number of activations allowed. Pass null for unlimited." - removed
Input schema / properties / activationLimit / maximumRemoved value: -9007199254740991 - removed
Input schema / properties / activationLimit / minimumRemoved value: -0 - removed
Input schema / properties / activationLimit / typeRemoved value: -"integer"
7 tool updates
v0.14.2- Changed
ls_create_checkout1 field changed- changed
Input schema / properties / email / patternPrevious value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"New value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
- Changed
ls_create_customer1 field changed- changed
Input schema / properties / email / patternPrevious value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"New value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
- Changed
ls_list_affiliates1 field changed- changed
Input schema / properties / userEmail / patternPrevious value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"New value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
- Changed
ls_list_customers1 field changed- changed
Input schema / properties / email / patternPrevious value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"New value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
- Changed
ls_list_orders1 field changed- changed
Input schema / properties / userEmail / patternPrevious value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"New value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
- Changed
ls_list_subscriptions1 field changed- changed
Input schema / properties / userEmail / patternPrevious value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"New value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
- Changed
ls_update_customer1 field changed- changed
Input schema / properties / email / patternPrevious value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"New value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
64 tool updates
v0.10.10- First observed
ls_activate_license - First observed
ls_archive_customer - First observed
ls_cancel_subscription - First observed
ls_create_checkout - First observed
ls_create_customer - First observed
ls_create_discount - First observed
ls_create_usage_record - First observed
ls_create_webhook - First observed
ls_deactivate_license - First observed
ls_delete_discount - First observed
ls_delete_webhook - First observed
ls_generate_order_invoice - First observed
ls_generate_subscription_invoice - First observed
ls_get_affiliate - First observed
ls_get_checkout - First observed
ls_get_customer - First observed
ls_get_discount - First observed
ls_get_discount_redemption - First observed
ls_get_file - First observed
ls_get_license_key - First observed
ls_get_license_key_instance - First observed
ls_get_order - First observed
ls_get_order_item - First observed
ls_get_price - First observed
ls_get_product - First observed
ls_get_store - First observed
ls_get_subscription - First observed
ls_get_subscription_invoice - First observed
ls_get_subscription_item - First observed
ls_get_subscription_item_usage - First observed
ls_get_usage_record - First observed
ls_get_user - First observed
ls_get_variant - First observed
ls_get_webhook - First observed
ls_list_affiliates - First observed
ls_list_checkouts - First observed
ls_list_customers - First observed
ls_list_discount_redemptions - First observed
ls_list_discounts - First observed
ls_list_files - First observed
ls_list_license_key_instances - First observed
ls_list_license_keys - First observed
ls_list_order_items - First observed
ls_list_orders - First observed
ls_list_prices - First observed
ls_list_products - First observed
ls_list_stores - First observed
ls_list_subscription_invoices - First observed
ls_list_subscription_items - First observed
ls_list_subscriptions - First observed
ls_list_usage_records - First observed
ls_list_variants - First observed
ls_list_webhooks - First observed
ls_refund_order - First observed
ls_refund_subscription_invoice - First observed
ls_sink_event_mark_processed - First observed
ls_sink_events_list - First observed
ls_sink_stats - First observed
ls_update_customer - First observed
ls_update_license_key - First observed
ls_update_subscription - First observed
ls_update_subscription_item - First observed
ls_update_webhook - First observed
ls_validate_license
TDQS
Scored across 64 tools
Most tools target distinct resources with clear get/list/create/update/delete boundaries. The only notable overlap is ls_archive_customer vs. ls_update_customer's status field, but the descriptions explicitly call this out home. Sink and license tools are clearly separated.
All tools follow the pattern ls_verb_noun consistently, using standard verbs like get_, list_, create_, update_, delete_. The only slight deviations are the two sink tools (ls_sink_events_list, ls_sink_event_mark_processed), but they still retain the prefix and a clear verb-noun structure.
With 64 tools, this server is far beyond the recommended 3-15 range and crosses the 50+ threshold for extreme mismatch. While the scope justifies many resources, the sheer volume imposes significant cognitive load on agents and makes tool selection error-prone.
The surface covers most lifecycle operations for orders, subscriptions, customers, discounts, license keys, and webhooksherches, but product and variant creation/update are missing, forcing agents to rely on external means for catalog management. This is a notable gap for a full commerce server.
Maintenance
Related MCP Connectors
MCP server for Lemon Squeezy — stores, products, orders, subscriptions, license keys.
- ZapierOAuthcom.zapier
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
MCP server that lets AI assistants use all OneSchema features exposed via the public API.
Hosted MCP for e-commerce: live product catalog, stock, and pricing for AI agents.
Related MCP Servers
- AlicenseBqualityDmaintenanceUniversal Semantic Bridge for Lemon Squeezy: A high-performance Model Context Protocol (MCP) server that empowers AI assistants (Cursor, Claude, VS Code) to query payments, manage subscriptions, and sync customers to Salesforce directly from your editor. 🍋✨5336 npm3MIT
- AlicenseBqualityCmaintenanceMCP server for managing WooCommerce stores through AI assistants like Claude. Provides 101 tools covering products, orders, customers, coupons, shipping, taxes, webhooks, settings, reports, and more.10065 npm2MIT
- AlicenseNot gradedqualityDmaintenanceA comprehensive Model Context Protocol (MCP) server that provides complete access to the Recharge Storefront API endpoints. Enables AI assistants to manage subscriptions, customers, orders, and billing through a standardized interface.2MIT
- AlicenseBqualityBmaintenanceMCP server for the Revolut Merchant API, enabling AI assistants to read and manage customers, orders, subscriptions, and plans. Supports sandbox and production with safe defaults.8MIT