Skip to main content
Glama
YawLabs

@yawlabs/lemonsqueezy-mcp

by YawLabs

@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.

Add to Yaw MCP

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@latest

Or one-click install via Smithery:

npx -y @smithery/cli install @yawlabs/lemonsqueezy-mcp --client claude

Smithery 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:20-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-mcp

A matching Containerfile is provided for Podman users. It is generated from Dockerfile via npm run gen:containerfile; CI calls npm run check:containerfile so a divergent edit fails review rather than drifting silently.

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 ID

  • ls_list_stores — List all stores

Customers

  • ls_get_customer — Get a customer by ID

  • ls_list_customers — List customers (filter by store, email)

  • ls_create_customer — Create a customer

  • ls_update_customer — Update a customer

  • ls_archive_customer — Archive a customer

Products

  • ls_get_product — Get a product by ID

  • ls_list_products — List products (filter by store)

Variants

  • ls_get_variant — Get a variant by ID

  • ls_list_variants — List variants (filter by product)

Prices

  • ls_get_price — Get a price by ID

  • ls_list_prices — List prices (filter by variant)

Files

  • ls_get_file — Get a file by ID

  • ls_list_files — List files (filter by variant)

Orders

  • ls_get_order — Get an order by ID

  • ls_list_orders — List orders (filter by store, email)

  • ls_generate_order_invoice — Generate a PDF invoice

  • ls_refund_order — Issue a refund

Order Items

  • ls_get_order_item — Get an order item by ID

  • ls_list_order_items — List order items (filter by order, product, variant)

Subscriptions

  • ls_get_subscription — Get a subscription by ID

  • ls_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 ID

  • ls_list_subscription_invoices — List subscription invoices (filter by store, subscription, status)

  • ls_generate_subscription_invoice — Generate a PDF invoice

  • ls_refund_subscription_invoice — Issue a refund

Subscription Items

  • ls_get_subscription_item — Get a subscription item by ID

  • ls_list_subscription_items — List subscription items (filter by subscription, price)

  • ls_update_subscription_item — Update quantity

  • ls_get_subscription_item_usage — Get current billing period usage

Usage Records

  • ls_get_usage_record — Get a usage record by ID

  • ls_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 ID

  • ls_list_discounts — List discounts (filter by store)

  • ls_create_discount — Create a discount code

  • ls_delete_discount — Delete a discount

Discount Redemptions

  • ls_get_discount_redemption — Get a discount redemption by ID

  • ls_list_discount_redemptions — List redemptions (filter by discount, order)

License Keys

  • ls_get_license_key — Get a license key by ID

  • ls_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 ID

  • ls_list_license_key_instances — List activations (filter by license key)

Checkouts

  • ls_get_checkout — Get a checkout by ID

  • ls_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 ID

  • ls_list_webhooks — List webhooks (filter by store)

  • ls_create_webhook — Create a webhook

  • ls_update_webhook — Update a webhook

  • ls_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)

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 by since / 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

  • Full API coverage — All 17 LemonSqueezy API resources with 61 tools, plus 3 bridge tools to an optional @yawlabs/lemonsqueezy-webhook-sink for webhook reconciliation

  • JSON:API support — Filtering, pagination, and relationship inclusion on all list/get operations

  • Zero runtime dependencies — Single bundled file for instant npx startup

  • License 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 — 429 and 5xx retries (idempotent methods only) with exponential backoff, jitter, and a 90s overall-deadline ceiling

  • Guardrails — 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 Resourcelemonsqueezy://audit-log exposes the last 1000 destructive-call entries as application/x-ndjson for clients without stderr access

  • Structured logging — opt-in JSON logs to stderr with selectable levels (error, audit, all)

Configuration

All configuration is via environment variables. Only LEMONSQUEEZY_API_KEY (or LEMONSQUEEZY_API_KEY_COMMAND) is required; everything else is opt-in.

Variable

Purpose

LEMONSQUEEZY_API_KEY

LemonSqueezy API token.

LEMONSQUEEZY_API_KEY_COMMAND

Command whose stdout produces the API key. Overrides LEMONSQUEEZY_API_KEY. Output is cached for 1 hour. Use this to pull short-lived credentials from a vault (op read, gcloud secrets versions access, etc.) without writing them to env vars. The cache is keyed by the command string, so changing it mid-process refreshes on the next request; it is also invalidated automatically on a 401/403 from the API, so a key rotated upstream takes effect on the next call without waiting for the TTL.

LEMONSQUEEZY_TEST_API_KEY

Optional test-mode key. When set and non-empty, it takes precedence over LEMONSQUEEZY_API_KEY (but not over LEMONSQUEEZY_API_KEY_COMMAND). On first activation per process, the server prints a one-line JSON test_mode notice to stderr so you can confirm test mode is engaged. Use this to point the server at a sandbox/test store without unsetting your production key.

LEMONSQUEEZY_ALLOWED_STORE_IDS

Comma-separated allowlist of store IDs. When set: (1) any tool whose input includes a storeId rejects calls to a non-allowed store; (2) tools that accept a storeId filter (e.g. ls_list_orders, ls_list_subscriptions) require it — calls without one are blocked so a missing filter cannot return data from every store the API key can see. Tools with no storeId field at all are not gated by this allowlist, in two distinct shapes: (a) ID-targeted tools (ls_refund_order, ls_cancel_subscription, ls_archive_customer, ls_delete_webhook, ls_delete_discount, ls_update_license_key) route by their own resource ID, so the caller must already know the ID; (b) ls_list_stores and ls_list_affiliates take no scoping ID at all and return rows from every store the API key can seels_list_stores will enumerate stores outside the allowlist. Both say so in their own tool descriptions. Other list-by-parent tools (ls_list_prices, ls_list_files, ls_list_variants, ls_list_order_items, ls_list_discount_redemptions, ls_list_license_key_instances, ls_list_subscription_items, ls_list_usage_records) require a parent-ID filter when the allowlist is set — a partial mitigation, since that parent can itself belong to a non-allowed store. LemonSqueezy API keys are issued at the account level and authorize access to every store in that account, so this allowlist is the only in-process store boundary the server can enforce. Pair it with LEMONSQUEEZY_MAX_REFUND_AMOUNT_CENTS / LEMONSQUEEZY_DESTRUCTIVE_RATE_LIMIT / LEMONSQUEEZY_RATE_LIMIT_PER_CLASS for defense in depth, and — if your account hosts multiple stores you don't want exposed to the same agent — keep those stores under a separate LemonSqueezy account whose API key isn't reachable from this server.

LEMONSQUEEZY_MAX_REFUND_AMOUNT_CENTS

Non-negative integer. Rejects ls_refund_order and ls_refund_subscription_invoice calls above this amount. Unset or empty means no cap; 0 is a valid value and blocks every refund (the schemas require amount >= 1), so use it as a kill switch. The check runs before the rate limiters, so a rejected over-cap refund does not consume your destructive or money-class budget.

LEMONSQUEEZY_DESTRUCTIVE_RATE_LIMIT

Non-negative integer. Max destructive tool calls per 60-second rolling window. Unset or empty means no limit; 0 blocks every destructive call. In-process limit — per MCP server instance, not global; each npx cold start resets the window. Counts include every refund, cancellation, archive, and delete tool, plus the input-dependent destructive paths: ls_update_license_key calls that set disabled: true or change activationLimit, ls_update_subscription calls that pause or switch plan, and ls_update_customer calls with status: "archived".

LEMONSQUEEZY_DISABLE_CLASSES

Comma-separated list of authority classes to refuse outright. Any tool whose class is listed returns a guardrail_block before the API call is attempted. Example: LEMONSQUEEZY_DISABLE_CLASSES=money,recurring,pii lets an agent run reads but blocks refunds, subscription changes, and customer-record access. Unknown class names throw at server startup.

LEMONSQUEEZY_RATE_LIMIT_PER_CLASS

Per-class rolling rate limits, comma-separated. Each entry is class:N, class:N/m, or class:N/h (bare numbers default to per-minute). Example: money:2/h,recurring:5/h,key:10/m. Composes with LEMONSQUEEZY_DESTRUCTIVE_RATE_LIMIT — both must pass. A limit of 0 blocks every call in that class; classes you don't list are unlimited. Malformed entries throw at server startup. In-process per server instance.

LEMONSQUEEZY_LOG

Structured-log verbosity to stderr. Set to all (or legacy json) to log every tool and HTTP call, audit to log only destructive-call audit entries plus errors (recommended for production), error to log only failures. Unset: no logs. Destructive calls are tagged audit: true and include their inputs. Failure entries carry a status that identifies the cause: guardrail_block (operator policy refused the call), validation_error (the client sent a malformed request, e.g. an update with no fields to change), exception (something faulted), plus timeout / network_error and raw HTTP status codes.

LEMONSQUEEZY_SINK_URL

Base URL of an optional @yawlabs/lemonsqueezy-webhook-sink instance (e.g. https://webhooks.example.com). Trailing slashes are stripped. Enables the ls_sink_* reconciliation tools below. Unset: the tools are still registered but return a "not configured" error when called.

LEMONSQUEEZY_SINK_ADMIN_TOKEN

Bearer token for the sink's admin endpoints. Must match the sink's WEBHOOK_SINK_ADMIN_TOKEN. Required when LEMONSQUEEZY_SINK_URL is set; if the sink itself was started without an admin token, its admin endpoints return 404 and ls_sink_* calls surface that diagnostically.

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.

Authority classes

The strongest access control LemonSqueezy itself exposes is the API key boundary. A LemonSqueezy API key authorizes its full account — every store, every tool — 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.

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

Example tools

read

Safe reads (list/get) that don't return customer PII as the primary payload.

ls_list_orders, ls_get_product, ls_validate_license

pii

Reads or writes whose primary payload is a customer record.

ls_list_customers, ls_create_customer, ls_archive_customer

mutate

Safe mutations: checkouts, discounts, invoice generation, usage records.

ls_create_checkout, ls_create_discount, ls_generate_order_invoice

money

Money movement. Irreversible at the payment layer.

ls_refund_order, ls_refund_subscription_invoice

recurring

Subscription state changes that affect recurring revenue.

ls_update_subscription, ls_cancel_subscription, ls_update_subscription_item

key

License-key admin (activate, deactivate, disable, change activation limit).

ls_update_license_key, ls_activate_license, ls_deactivate_license

webhook

Webhook configuration — affects the trust surface other systems rely on.

ls_create_webhook, ls_update_webhook, ls_delete_webhook

Note: ls_get_order returns customer fields incidentally, but its primary payload is the order — it stays in read, not pii. The class is reserved for tools whose primary purpose is the customer record. If you need to deny all access to customer-shaped data, set LEMONSQUEEZY_DISABLE_CLASSES=pii and — if the agent must never under any circumstances touch that data — also issue its API key from a separate LemonSqueezy account that doesn't host customer records you care about.

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 — flipping DISABLE_CLASSES=pii,mutate,money,recurring,key,webhook to lock an analytics deployment into pure reads is a one-line config change. 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.

Both are opt-in; with neither set, behavior is unchanged from prior versions.

Resources

The server exposes one MCP Resource for clients that prefer structural retrieval over parsing stderr:

URI

MIME type

Contents

lemonsqueezy://audit-log

application/x-ndjson

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. Redaction runs on the input payload before it reaches the buffer: any object key whose name matches a credential / PII pattern (secret, password, token, api_key, bearer, authorization, signing_secret, private_key, pin, ssn, social_security_number, credit_card, card_number, cvv, cvc — case-insensitive, whole-word) AND any string value matching the JWT bearer-token shape (eyJ…-prefixed, three base64url segments) is replaced with [REDACTED]. Ordinary identifiers (licenseKey, instanceId, storeId, orderId, webhookId) and UUID-shaped values are preserved.

Operating the server unattended

For unattended/agentic use against a live store, we recommend:

  1. 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_IDS to the same set as a belt-and-braces in-process gate on the tools that take a storeId.

  2. Set LEMONSQUEEZY_MAX_REFUND_AMOUNT_CENTS to a per-call cap well below any single-refund expectation.

  3. Set LEMONSQUEEZY_DESTRUCTIVE_RATE_LIMIT to a small number (e.g. 5/min) as a runaway-agent circuit breaker. For finer control, add LEMONSQUEEZY_RATE_LIMIT_PER_CLASS=money:2/h,recurring:5/h,key:10/m so each authority class has its own ceiling.

  4. If a class shouldn't be reachable at all (e.g. an analytics agent that needs only read), set LEMONSQUEEZY_DISABLE_CLASSES to 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.

  5. Set LEMONSQUEEZY_LOG=audit and ship stderr to your log aggregator. The audit level keeps every destructive-call entry plus errors but drops successful reads so log volume stays bounded over weeks of operation. Alert on status: "guardrail_block" or elevated error rates per tool. Use LEMONSQUEEZY_LOG=all while debugging.

  6. Run LEMONSQUEEZY_API_KEY_COMMAND against 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
npm run test:integration  # requires LEMONSQUEEZY_TEST_API_KEY + LEMONSQUEEZY_TEST_STORE_ID

Containerfile is generated from Dockerfile. After editing Dockerfile:

npm run gen:containerfile    # regenerate Containerfile
npm run check:containerfile  # CI runs this; non-zero exit means the two have drifted

Running on oam.js (optional)

oam.js runs this server unmodified. 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.

oam 0.9.0 is the minimum. Older releases ran child_process.execFile arguments through a shell, which was reachable here whenever LEMONSQUEEZY_API_KEY_COMMAND is configured -- that feature shells out to fetch the key, and its arguments were re-split by a shell. The launcher enforces the floor: given an older oam it falls back to Node and says so on stderr, and LEMONSQUEEZY_MCP_RUNTIME=oam turns that into a hard error.

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.

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.

Node stays the default, deliberately. An MCP client cold-starts this server once per session, so startup is the cost that actually gets paid — and on the machine this was measured on, Node won: 196ms median against 424ms for oam run (8 runs each, version subcommand, which exercises full boot plus tool registration). Making oam the default would mean either a launcher that probes for it on every start — a cost paid by everyone, including the majority who do not have oam installed — or making oam a hard requirement, which would break npx @yawlabs/lemonsqueezy-mcp for every user without it, since oam is not distributed on npm. Neither is worth it to reach a runtime that is slower here. Measure on your own hardware before concluding anything; if oam wins on yours, the config above is all you need.

Two places oam does win for this repo, both opt-in and neither touching the npm package:

  • npm run check:oam — type-checks via oam check (tsgo, TypeScript 7 native). Measured 2878ms against 4406ms for tsc --noEmit, same clean result. npx tsc --noEmit remains the portable default and is what the pre-commit checklist calls for.

  • npm run build:binary:oam — builds the standalone binary via oam compile instead of the Node SEA path. Measured 57.14 MB. Writes to the same bin/<platform>-<arch>/ path as npm run build:binary, so the release staging script consumes either unchanged — run one or the other, not both. If you redistribute that binary it embeds oam's runtime, so ship oam's LICENSE, NOTICE and THIRD_PARTY_LICENSES.md with 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

Two paths from a clean checkout of main. Both produce the same artifact (npm publish with provenance + GitHub release).

1. Tag-and-let-CI (preferred)

# 1. Bump version
npm version X.Y.Z --no-git-tag-version

# 2. Commit
git add package.json && git commit -m "vX.Y.Z"

# 3. Annotated tag (lightweight tags are silently skipped by --follow-tags)
git tag -a vX.Y.Z -m "vX.Y.Z"

# 4. Push commit + tag
git push origin main --follow-tags

# 5. Confirm the Release workflow fired (not just CI on the bump commit)
gh run list --limit 2

The tag push triggers .github/workflows/release.yml, which runs release.sh in CI mode: lint, test, build, npm publish (with --provenance) using the org-level NPM_TOKEN secret, then GitHub release creation, then a smoke test against the published tarball, then a publish to the Official MCP Registry via GitHub OIDC (no MCP_* secret needed; the namespace io.github.YawLabs/* is authorized purely from the OIDC repository_owner claim). No local npm login needed.

2. Local end-to-end

./release.sh X.Y.Z

Does the same steps 1–7 on the workstation: lint, test, build, bump, commit, annotated tag, push, npm publish, GitHub release, verify. Idempotent — safe to re-run with the same version after a partial failure. Requires one-time setup:

npm login --auth-type=web   # publisher of @yawlabs/lemonsqueezy-mcp
gh auth login               # GitHub CLI for the release-creation step

The local path does not publish to the Official MCP Registry — that step lives only in CI and depends on a GitHub Actions OIDC token. To push a locally-released version to the registry, install mcp-publisher, run mcp-publisher login github (interactive OAuth), then mcp-publisher publish from the repo root.

License

MIT

Available Tools

64 tools
ls_activate_licenseA

Activate a license key for an instance. Does not require an API key — uses the license key itself for auth.

ParametersJSON Schema
NameRequiredDescriptionDefault
licenseKeyYesThe license key to activate
instanceNameYesA name for this activation instance (e.g. machine name, user identifier)

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_customerA
DestructiveIdempotent

Archive a customer. Sets their status to 'archived'. This is reversible by updating their status back.

ParametersJSON Schema
NameRequiredDescriptionDefault
customerIdYesThe customer ID to archive

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_subscriptionA
DestructiveIdempotent

Cancel a subscription. The subscription remains active until the end of the current billing period, then expires.

ParametersJSON Schema
NameRequiredDescriptionDefault
subscriptionIdYesThe subscription ID to cancel

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoPrefill customer name
emailNoPrefill customer email
storeIdYesThe store ID
expiresAtNoCheckout expiry date (ISO 8601 format)
taxNumberNoPrefill tax/VAT number
variantIdYesThe variant ID for the product being purchased
customDataNoCustom data object to attach to the order
customPriceNoCustom price in cents (overrides the variant price)
discountCodeNoPre-apply a discount code
enabledVariantsNoArray of variant IDs to show on the checkout (for products with multiple variants)
billingAddressZipNoPrefill billing ZIP/postal code
billingAddressCountryNoPrefill billing country (ISO 3166-1 alpha-2)

TDQS

A3.6/5.0
Behavior3/5

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

Annotations provide readOnlyHint=false and destructiveHint=false, so the description's 'Create' aligns. It adds that a URL is returned, but doesn't disclose side effects, authentication needs, or idempotency. With no output schema, the description carries the burden but is only moderately transparent.

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

Conciseness5/5

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

Two sentences, front-loaded with the core action, no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 12 parameters and no output schema, the description covers the main purpose, return value, and key features. It could mention prerequisites like storeId and variantId existence, but is largely complete for a creation tool.

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

Parameters3/5

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

Schema coverage is 100%, so parameter descriptions in the schema already document each field. The description's mention of 'custom pricing, prefilled customer data, and checkout customization' is a high-level summary that does not add new details beyond the schema.

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

Purpose5/5

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

The description 'Create a new checkout URL for a product variant' clearly states the verb (create) and resource (checkout URL), and distinguishes it from siblings 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.

Usage Guidelines2/5

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. It does not mention when not to use it or provide context for choosing between create and other operations.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCustomer's city
nameYesCustomer's full name
emailYesCustomer's email address
regionNoCustomer's region/state
countryNoCustomer's country (ISO 3166-1 alpha-2 code, e.g. 'US')
storeIdYesThe store ID to create the customer in

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already indicate readOnlyHint=false, destructiveHint=false, and openWorldHint=true. The description does not add any behavioral context beyond that, but 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.

Conciseness5/5

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

The description is a single, front-loaded sentence with no unnecessary words or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description does not mention return values or expected output, which is missing since there is no output schema. Annotations and schema cover safety and parameters, but result information would improve completeness.

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

Parameters3/5

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

Schema description coverage is 100%, so parameters are well-documented in the schema. The description adds no extra meaning to parameters beyond what is already provided.

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

Purpose5/5

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

The description clearly states 'Create a new customer in a store,' using a specific verb and resource. The sibling tool 'ls_update_customer' exists, so the purpose is distinct.

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

Usage Guidelines3/5

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

The description provides no guidance on when to use this tool versus alternatives or any prerequisites. It is clear but lacks explicit contextual usage advice.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesThe discount code customers will enter (e.g. 'SAVE20')
nameYesInternal name for the discount
amountYesDiscount amount — in cents for 'fixed' type (e.g. 1000 = $10.00), or percentage for 'percent' type (e.g. 20 = 20%)
storeIdYesThe store ID to create the discount in
durationNoHow long the discount applies: 'once' (first payment only), 'repeating' (for N months), or 'forever' (default)
startsAtNoWhen the discount becomes active (ISO 8601 format)
expiresAtNoWhen the discount expires (ISO 8601 format)
amountTypeYesDiscount type: 'percent' or 'fixed'
variantIdsNoArray of variant IDs this discount applies to (requires isLimitedToProducts: true)
maxRedemptionsNoMaximum number of times this discount can be redeemed (0 = unlimited)
durationInMonthsNoNumber of months the discount applies (required when duration is 'repeating')
isLimitedToProductsNoIf true, the discount only applies to specific variants (set via variantIds)

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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_recordA
Destructive

Report usage for a metered subscription item. Use 'increment' action to add to the current usage, or 'set' to replace it.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionNoHow to apply the quantity: 'increment' (add to current, default) or 'set' (replace current)
quantityYesThe usage quantity to report
subscriptionItemIdYesThe subscription item ID to report usage for

TDQS

A3.5/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesThe URL to send webhook events to (must be a valid http/https URL)
eventsYesEvent types to subscribe to (e.g. ['order_created', 'subscription_created', 'subscription_updated', 'subscription_cancelled', 'subscription_payment_success', 'subscription_payment_failed', 'license_key_created'])
secretYesA signing secret for verifying webhook payloads
storeIdYesThe store ID

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_licenseA
Idempotent

Deactivate a license key instance. Does not require an API key — uses the license key itself for auth.

ParametersJSON Schema
NameRequiredDescriptionDefault
instanceIdYesThe instance ID to deactivate
licenseKeyYesThe license key

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already indicate non-read-only, non-destructive, idempotent, and open-world. The description adds the authentication behavior, but does not elaborate on other behavioral traits like reversibility or return format.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the action, and includes a key additional detail without any fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a straightforward deactivation tool with no output schema, the description is adequate. It covers the action and a notable auth trait, but lacks details on success/failure responses.

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

Parameters3/5

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

Schema coverage is 100%, and the description does not add meaning beyond what the schema already provides for the parameters.

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

Purpose5/5

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

The description clearly states the action ('Deactivate a license key instance') with a specific verb and resource. It distinguishes from sibling tools like ls_activate_license and ls_validate_license.

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

Usage Guidelines3/5

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

The description provides a hint about authentication (no API key needed) but does not explicitly state when to use this tool versus alternatives or when not to use it.

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

ls_delete_discountA
DestructiveIdempotent

Permanently delete a discount. This is irreversible.

ParametersJSON Schema
NameRequiredDescriptionDefault
discountIdYesThe discount ID to delete

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives (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_webhookA
DestructiveIdempotent

Permanently delete a webhook. This is irreversible.

ParametersJSON Schema
NameRequiredDescriptionDefault
webhookIdYesThe webhook ID to delete

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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_invoiceB
Idempotent

Generate a PDF invoice for an order. Returns a download URL for the invoice.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCustomer city
nameNoCustomer name on the invoice
notesNoAdditional notes to include on the invoice
stateNoCustomer state/region
localeNoInvoice language locale (e.g. 'en', 'fr', 'de')
addressNoCustomer address on the invoice
countryNoCustomer country
orderIdYesThe order ID
zipCodeNoCustomer ZIP/postal code

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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_invoiceA
Idempotent

Generate a PDF invoice for a subscription invoice. Returns a download URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCustomer city
nameNoCustomer name on the invoice
notesNoAdditional notes to include on the invoice
stateNoCustomer state/region
localeNoInvoice language locale (e.g. 'en', 'fr', 'de')
addressNoCustomer address on the invoice
countryNoCustomer country
zipCodeNoCustomer ZIP/postal code
subscriptionInvoiceIdYesThe subscription invoice ID

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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_affiliateA
Read-onlyIdempotent

Get a specific affiliate by ID, including commission rate, status, and earnings.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'store,user')
affiliateIdYesThe affiliate ID

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_checkoutA
Read-onlyIdempotent

Get a specific checkout by ID, including URL, expiry, and custom data.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'store,variant')
checkoutIdYesThe checkout ID

TDQS

A4/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint, idempotentHint, and non-destructive nature. The description adds that the response includes URL, expiry, and custom data, providing useful context beyond the 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.

Conciseness5/5

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

The description is a single sentence that is front-loaded and contains no extraneous words. Every word adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple get operation with 2 parameters, the description is reasonably complete. It states the core functionality and returned fields. Could mention the 'include' parameter for expanding related resources, but that is covered in the schema.

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

Parameters3/5

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

The input schema covers both parameters (checkoutId, include) with descriptions. The description does not add new information beyond what the schema provides. With 100% schema description coverage, baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states the action ('Get'), the resource ('checkout by ID'), and includes what is returned ('URL, expiry, and custom data'). This distinguishes it from sibling tools like ls_list_checkouts (list all) and ls_create_checkout (create).

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

Usage Guidelines3/5

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

The description implies usage when a specific checkout ID is known, but does not explicitly state when to use this tool versus alternatives like ls_list_checkouts. No guidance on when not to use or prerequisites 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_customerA
Read-onlyIdempotent

Get a specific customer by ID, including name, email, city, country, MRR, total revenue, and customer portal URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'store,orders,subscriptions,license-keys')
customerIdYesThe customer ID

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_discountA
Read-onlyIdempotent

Get a specific discount by ID, including code, amount, type, and usage limits.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'store,variants,discount-redemptions')
discountIdYesThe discount ID

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_redemptionA
Read-onlyIdempotent

Get a specific discount redemption by ID, showing when and where a discount was used.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'discount,order')
discountRedemptionIdYesThe discount redemption ID

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_fileA
Read-onlyIdempotent

Get a specific file by ID, including name, size, download URL, and associated variant.

ParametersJSON Schema
NameRequiredDescriptionDefault
fileIdYesThe file ID
includeNoComma-separated related resources to include (e.g. 'variant')

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_keyA
Read-onlyIdempotent

Get a specific license key by ID, including key value, status, activation limit, and expiry date.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'store,customer,order,order-item,product,license-key-instances')
licenseKeyIdYesThe license key ID

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_instanceA
Read-onlyIdempotent

Get a specific license key instance (activation) by ID, including instance name and creation date.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'license-key')
licenseKeyInstanceIdYesThe license key instance ID

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_orderA
Read-onlyIdempotent

Get a specific order by ID, including status, total, currency, customer info, and payment details.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'store,customer,order-items,subscriptions,license-keys,discount-redemptions')
orderIdYesThe order ID

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_itemA
Read-onlyIdempotent

Get a specific order item by ID, including product name, variant, price, and quantity.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'order,product,variant')
orderItemIdYesThe order item ID

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_priceA
Read-onlyIdempotent

Get a specific price by ID, including amount, currency, and billing interval.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'variant')
priceIdYesThe price ID

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds context about returned fields (amount, currency, billing interval), which is helpful. No contradiction. Could mention authentication or error handling, but not necessary given annotations.

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

Conciseness5/5

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

Single sentence, front-loaded with purpose, no fluff. Efficiently communicates key information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read tool with two parameters and good annotations, the description is mostly complete. It lists the fields returned, which is helpful given no output schema. Could mention that it requires a valid price ID, but overall adequate.

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

Parameters3/5

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

Schema coverage is 100% with descriptions for both parameters. The description does not add significant meaning 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.

Purpose5/5

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 price by ID', and what is returned ('amount, currency, billing interval'). This distinguishes it from the sibling `ls_list_prices` which returns multiple prices.

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

Usage Guidelines3/5

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

The description implies usage by ID, but does not explicitly state when to use this tool versus alternatives like `ls_list_prices`. No 'when not to use' or alternative references 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_productA
Read-onlyIdempotent

Get a specific product by ID, including name, description, price, and status.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'store,variants')
productIdYesThe product ID

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_storeA
Read-onlyIdempotent

Get a specific store by ID, including name, slug, currency, and sales statistics.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'products,discounts,license-keys,subscriptions,webhooks')
storeIdYesThe store ID

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_subscriptionA
Read-onlyIdempotent

Get a specific subscription by ID, including status, billing interval, renewal date, and customer info.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'store,customer,order,order-item,product,variant,subscription-items,subscription-invoices')
subscriptionIdYesThe subscription ID

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only 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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_invoiceA
Read-onlyIdempotent

Get a specific subscription invoice by ID, including status, total, billing reason, and payment details.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'store,subscription')
subscriptionInvoiceIdYesThe subscription invoice ID

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_itemA
Read-onlyIdempotent

Get a specific subscription item by ID, including quantity, pricing, and associated subscription.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'subscription,price,usage-records')
subscriptionItemIdYesThe subscription item ID

TDQS

A3.8/5.0
Behavior3/5

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 that it returns quantity, pricing, and associated subscription, but no 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.

Conciseness5/5

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

Single sentence, front-loaded with the action and resource, no unnecessary words. Highly efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, but the description hints at returned fields (quantity, pricing, subscription). Could be more complete about other possible fields, but acceptable for a get tool with good annotations.

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

Parameters3/5

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

Schema coverage is 100% with descriptions for both parameters. The description does not add new meaning beyond what the schema provides. Baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states the verb 'Get', the resource 'subscription item', and specifies including quantity, pricing, and associated subscription. It distinguishes from sibling tools like ls_get_subscription or ls_list_subscription_items.

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

Usage Guidelines3/5

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

The description implies usage when needing details of a specific subscription item by ID, but lacks explicit guidance on when not to use it or mention of alternatives like ls_list_subscription_items for listing. Adequate but no exclusions.

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_usageA
Read-onlyIdempotent

Get the current usage for a metered subscription item within the current billing period.

ParametersJSON Schema
NameRequiredDescriptionDefault
subscriptionItemIdYesThe subscription item ID

TDQS

A3.6/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the description 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_recordA
Read-onlyIdempotent

Get a specific usage record by ID, including quantity and action type.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'subscription-item')
usageRecordIdYesThe usage record ID

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_userA
Read-onlyIdempotent

Get the authenticated user's information including name, email, and avatar.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_variantA
Read-onlyIdempotent

Get a specific product variant by ID, including price, billing interval, and trial settings.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'product,files')
variantIdYesThe variant ID

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, indicating a safe read. The description confirms this but adds no extra behavioral context (e.g., error cases, authentication). With annotations present, a score of 3 is appropriate.

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

Conciseness5/5

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

Single clear sentence, front-loaded with key information. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Tool is simple with good schema and annotations. Description covers purpose but omits return structure or error handling. Adequate but not fully comprehensive.

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

Parameters3/5

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

Schema coverage is 100%, with clear descriptions for both parameters. The description adds high-level context about returned fields but does not enhance parameter meaning beyond the schema. Baseline 3 is correct.

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

Purpose5/5

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

Description clearly states the action ('Get a specific product variant by ID') and the resource, distinguishing it from list or other getters. Mentions key fields (price, billing interval, trial settings) that make the purpose unambiguous.

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

Usage Guidelines3/5

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 like ls_list_variants or other getters. Usage is implied from the description but not clarified.

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

ls_get_webhookA
Read-onlyIdempotent

Get a specific webhook by ID, including URL, events, and last sent timestamp.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'store')
webhookIdYesThe webhook ID

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_affiliatesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'store,user')
pageSizeNoResults per page (1-100)
userEmailNoFilter by affiliate's user email
pageNumberNoPage number (1-indexed)

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare readOnly, idempotent, and non-destructive, but the description goes beyond by revealing key behavioral quirks: it is NOT gated by LEMONSQUEEZY_ALLOWED_STORE_IDS and returns affiliates for every store the API key can see, including non-allowed ones. It also explains pagination mechanics via 'meta.page' (currentPage, lastPage, total). This is exactly the kind of context that annotations cannot convey.

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

Conciseness5/5

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

The description is front-loaded with the primary purpose, followed by a compact pagination note, then a detailed cross-store caveat. Every sentence earns its place; the caveat is lengthy but crucial for correct usage. It is structured logically and avoids redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description provides essential information for a list tool: what it lists, pagination behavior, and a critical gotcha about store scoping. There is no output schema, but the description explains the pagination envelope (meta.page) sufficiently. Given the tool's complexity and the absence of an output schema, this description is highly complete.

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

Parameters3/5

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

Schema description coverage is 100%, so each parameter already has a clear description. The tool description adds context about pagination ('check meta.page...') and mentions the userEmail filter, but does not add significant meaning beyond what the schema provides. The baseline of 3 is appropriate since the schema does the heavy lifting.

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

Purpose5/5

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

The description clearly states the tool's function: 'List all affiliates for the authenticated user's stores, optionally filtered by user email.' It uses a specific verb ('List') and resource ('affiliates'), and adds scope ('authenticated user's stores') and a filter. This distinguishes it from siblings like ls_get_affiliate (single retrieval) 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.

Usage Guidelines4/5

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

The description explains when to use the tool by highlighting its cross-store behavior, and gives a practical recommendation: 'Pair with a scoped LemonSqueezy API key for true cross-store enforcement.' It implies that if store-scoped results are needed, one must use a scoped API key. However, it does not explicitly contrast with alternative tools (e.g., ls_get_affiliate) or state when not to use it, so it falls short of a 5.

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

ls_list_checkoutsA
Read-onlyIdempotent

List all checkouts, optionally filtered by store or variant. Results are paginated — check meta.page in the response for currentPage, lastPage, and total.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'store,variant')
storeIdNoFilter by store ID
pageSizeNoResults per page (1-100)
variantIdNoFilter by variant ID
pageNumberNoPage number (1-indexed)

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_customersA
Read-onlyIdempotent

List all customers, optionally filtered by store or email. Results are paginated — check meta.page in the response for currentPage, lastPage, and total.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailNoFilter by customer email
includeNoComma-separated related resources to include (e.g. 'store,orders,subscriptions,license-keys')
storeIdNoFilter by store ID
pageSizeNoResults per page (1-100)
pageNumberNoPage number (1-indexed)

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare read-only and idempotent behavior. The description adds value by explaining pagination and filter options without contradicting annotations.

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

Conciseness5/5

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

Two concise sentences, front-loaded with the main action and immediate pagination detail, with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the essential aspects: listing, filtering, pagination. Lacks mention of authorization scope or why you'd choose this over other list tools, but adequate for a read-only list with good schema coverage.

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

Parameters3/5

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

Schema coverage is 100%, so the description adds minimal extra meaning beyond what the schema already provides, only reiterating filter options briefly.

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

Purpose5/5

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

The description clearly states the tool lists customers with optional filters and pagination, distinguishing it from `ls_get_customer` (single) and other list tools by specifying the resource.

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

Usage Guidelines4/5

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

It indicates when to use (listing customers with optional filters) and mentions pagination handling, but does not explicitly state when not to use or compare with 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_discount_redemptionsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'discount,order')
orderIdNoFilter by order ID
pageSizeNoResults per page (1-100)
discountIdNoFilter by discount ID
pageNumberNoPage number (1-indexed)

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_discountsA
Read-onlyIdempotent

List all discounts, optionally filtered by store. Results are paginated — check meta.page in the response for currentPage, lastPage, and total.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'store,variants,discount-redemptions')
storeIdNoFilter by store ID
pageSizeNoResults per page (1-100)
pageNumberNoPage number (1-indexed)

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_filesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'variant')
pageSizeNoResults per page (1-100)
variantIdNoFilter by variant ID
pageNumberNoPage number (1-indexed)

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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

The description clearly states the verb ('List') and 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.

Usage Guidelines4/5

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_instancesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'license-key')
pageSizeNoResults per page (1-100)
pageNumberNoPage number (1-indexed)
licenseKeyIdNoFilter by license key ID

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

The description provides clear context: it'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_keysA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'store,customer,order,order-item,product,license-key-instances')
orderIdNoFilter by order ID
storeIdNoFilter by store ID
pageSizeNoResults per page (1-100)
productIdNoFilter by product ID
pageNumberNoPage number (1-indexed)
orderItemIdNoFilter by order item ID

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_itemsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'order,product,variant')
orderIdNoFilter by order ID
pageSizeNoResults per page (1-100)
productIdNoFilter by product ID
variantIdNoFilter by variant ID
pageNumberNoPage number (1-indexed)

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_ordersA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'store,customer,order-items,subscriptions,license-keys,discount-redemptions')
storeIdNoFilter by store ID
pageSizeNoResults per page (1-100)
userEmailNoFilter by user email
pageNumberNoPage number (1-indexed)

TDQS

A4.2/5.0
Behavior4/5

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

The description adds value beyond annotations by disclosing pagination behavior and the response structure (meta.page with currentPage, lastPage, total). Annotations already declare readOnlyHint true, ensuring the agent knows it's safe.

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

Conciseness5/5

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

Two sentences, no wasted words. The first sentence states the core purpose and filters, the second explains pagination. Perfectly front-loaded and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers purpose, filters, and pagination. While no output schema exists, it hints at the response structure. It does not explicitly state that the response contains order objects, but 'list orders' implies it. For a simple listing tool, this is mostly complete.

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

Parameters3/5

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

The input schema has 100% description coverage with detailed field descriptions (e.g., storeId, userEmail, include, pageNumber, pageSize). The description adds no extra semantics beyond mentioning the filters, so it meets the baseline for well-documented params.

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

Purpose5/5

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

The description explicitly states 'List all orders' with optional filters by store or user email, clearly identifying the verb and resource. It differentiates from sibling tools like ls_get_order (single order) and ls_list_order_items by its scope.

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

Usage Guidelines4/5

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

The description clearly indicates when to use this tool (listing orders) and mentions optional filters, but it does not explicitly state when not to use it or name specific alternatives like ls_get_order for a single order. The guidance is implicit rather than explicit.

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

ls_list_pricesA
Read-onlyIdempotent

List all prices, 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'variant')
pageSizeNoResults per page (1-100)
variantIdNoFilter by variant ID
pageNumberNoPage number (1-indexed)

TDQS

A4.5/5.0
Behavior5/5

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

The description adds significant behavioral context beyond annotations: pagination via meta.page (currentPage, lastPage, total), the cross-store note requiring variantId when an environment variable is set, and the caveat that API key visibility is the real cross-store enforcement boundary. These are not in the annotations and provide actionable behavioral details.

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

Conciseness4/5

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

The description is three sentences, front-loaded with the core purpose. Each sentence contributes meaning, though the last sentence is somewhat wordy and grammatically awkward ('Even with that set, Pair with...'). Still, it avoids fluff and gets to the point quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with no output schema, the description covers the main aspects: enumeration, filtering, pagination format, and a cross-store conditional. It does not elaborate on return fields beyond meta.page, but given the annotations and sibling tool patterns, the context is reasonably complete.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds value by explicitly linking variantId to filtering, mentioning pagination parameters implicitly, and explaining a conditional requirement for variantId that is not apparent from the schema. This goes slightly beyond the schema descriptions.

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

Purpose5/5

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

The description begins with 'List all prices, optionally filtered by variant' — a specific verb and resource that clearly distinguishes this tool from siblings like ls_get_price (single price) or ls_list_products. The optional variant filtering is noted, 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.

Usage Guidelines4/5

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

The description implies use for fetching multiple prices with optional variant filtering and provides pagination context. It also gives a conditional usage rule (when LEMONSQUEEZY_ALLOWED_STORE_IDS is set, variantId is required). However, it does not explicitly compare to alternatives 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_list_productsA
Read-onlyIdempotent

List all products, optionally filtered by store. Results are paginated — check meta.page in the response for currentPage, lastPage, and total.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'store,variants')
storeIdNoFilter by store ID
pageSizeNoResults per page (1-100)
pageNumberNoPage number (1-indexed)

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_storesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'products,discounts,license-keys,subscriptions,webhooks')
pageSizeNoResults per page (1-100)
pageNumberNoPage number (1-indexed)

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_invoicesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoFilter by invoice status
includeNoComma-separated related resources to include (e.g. 'store,subscription')
storeIdNoFilter by store ID
pageSizeNoResults per page (1-100)
refundedNoFilter by refunded status
pageNumberNoPage number (1-indexed)
subscriptionIdNoFilter by subscription ID

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_itemsA
Read-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. 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'subscription,price,usage-records')
priceIdNoFilter by price ID
pageSizeNoResults per page (1-100)
pageNumberNoPage number (1-indexed)
subscriptionIdNoFilter by subscription ID

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and destructiveHint, so the description adds value by disclosing pagination behavior and the cross-store constraint. The explanation of meta.page and the environmental variable requirement goes beyond what annotations convey, earning a 4.

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

Conciseness4/5

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

The description is front-loaded with the main purpose and then adds pagination and cross-store context. The final sentence about the scoped API key is a bit awkward and verbose, but overall the description is efficiently structured and not excessive.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no output schema, the description compensates by mentioning pagination response fields. It covers the main purpose, optional filters, cross-store restrictions, and security boundary, which is sufficient for an agent to invoke the tool correctly. Minor gap: no mention of the array of items itself, but that is implied.

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

Parameters3/5

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

The input schema has 100% description coverage for all five parameters, so the description doesn't need to add much. It restates that filters apply to subscription or price, which aligns with subscriptionId and priceId, but adds no new parameter-level detail. Baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool lists subscription items, optionally filtered by subscription or price. This is a specific verb+resource that distinguishes it from singular getter tools like ls_get_subscription_item and other list tools for different resources.

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

Usage Guidelines4/5

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

The description provides clear context for the tool's use case (listing subscription items with optional filters) and includes a significant cross-store configuration note about required parameters. It does not explicitly name alternative tools, but the sibling set and name make the distinction obvious, so it earns a 4.

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

ls_list_subscriptionsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoFilter by subscription status
includeNoComma-separated related resources to include (e.g. 'store,customer,order,order-item,product,variant')
orderIdNoFilter by order ID
storeIdNoFilter by store ID
pageSizeNoResults per page (1-100)
productIdNoFilter by product ID
userEmailNoFilter by user email
variantIdNoFilter by variant ID
pageNumberNoPage number (1-indexed)
orderItemIdNoFilter by order item ID

TDQS

A4/5.0
Behavior4/5

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

Annotations already indicate read-only and idempotent behavior. The description adds behavioral context by mentioning pagination ('check meta.page') and optional filters, which goes 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.

Conciseness5/5

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

The description is two sentences, front-loaded with the core purpose, and contains no redundant or extra information. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description mentions pagination metadata (currentPage, lastPage, total), which is helpful. However, it does not describe the shape of the subscription objects returned, but this might be inferred from other tools. Overall, it is fairly complete for a list operation.

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

Parameters3/5

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

Schema descriptions cover all parameters (100% coverage), so the description adds minimal value beyond listing some filter fields. It does not mention all parameters (e.g., userEmail, include, pageNumber, pageSize) but the pagination hint is a small addition.

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

Purpose5/5

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

The description clearly states the tool lists subscriptions with optional filters. It includes pagination details, effectively distinguishing it from other list tools by its specific resource (subscriptions) and filtering capabilities.

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

Usage Guidelines3/5

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

The description implies usage (when you need to list subscriptions) but does not explicitly state when to use this tool vs alternatives like ls_get_subscription or other list tools. No when-not or alternative guidance 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_usage_recordsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'subscription-item')
pageSizeNoResults per page (1-100)
pageNumberNoPage number (1-indexed)
subscriptionItemIdNoFilter by subscription item ID

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_variantsA
Read-onlyIdempotent

List all variants, optionally filtered by 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: 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'product,files')
pageSizeNoResults per page (1-100)
productIdNoFilter by product ID
pageNumberNoPage number (1-indexed)

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, but the description adds valuable context: pagination format (meta.page with currentPage, lastPage, total) and a conditional cross-store behavior requiring productId when LEMONSQUEEZY_ALLOWED_STORE_IDS is set. It also clarifies that API key scoping is the true enforcement boundary, which is non-obvious and useful.

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

Conciseness4/5

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

The description is front-loaded with the core purpose, followed by pagination details and a cross-store note. Each sentence adds unique information, but the cross-store sentence is slightly convoluted with awkward capitalization ('Even with that set, Pair with...') and could be tightened. Still, no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a list tool with pagination and an optional filter, the description is fairly complete: it covers the result shape (meta.page fields) and a conditional requirement. No output schema exists, so the pagination mention partially compensates. It does not specify which variant fields are returned, but that is common for list endpoints and not critical.

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

Parameters3/5

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

Schema coverage is 100% with all four parameters well-described. The description ties productId to the 'optionally filtered by product' phrase and explains its necessity in cross-store mode, but it does not add new syntax or format 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.

Purpose5/5

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 a specific verb and resource: "List all variants, optionally filtered by product." This distinguishes it from sibling tools like ls_get_variant (single variant) and ls_list_products (products). The scope (all variants, optional product filter) is unambiguous.

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

Usage Guidelines3/5

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

The description implies usage context by mentioning optional product filtering and the cross-store requirement for productId, but it does not explicitly contrast with alternatives or state when not to use it. No exclusions or alternative tool references are provided, though the 'optionally filtered by product' hints at a common use case.

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

ls_list_webhooksA
Read-onlyIdempotent

List all webhooks, optionally filtered by store. Results are paginated — check meta.page in the response for currentPage, lastPage, and total.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoComma-separated related resources to include (e.g. 'store')
storeIdNoFilter by store ID
pageSizeNoResults per page (1-100)
pageNumberNoPage number (1-indexed)

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_orderA
Destructive

Issue a refund for an order. This is irreversible — the refund amount is in cents (e.g. 1000 = $10.00).

ParametersJSON Schema
NameRequiredDescriptionDefault
amountYesRefund amount in cents (e.g. 1000 = $10.00)
orderIdYesThe order ID to refund

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_invoiceA
Destructive

Issue a refund for a subscription invoice. This is irreversible — the refund amount is in cents (e.g. 1000 = $10.00).

ParametersJSON Schema
NameRequiredDescriptionDefault
amountYesRefund amount in cents (e.g. 1000 = $10.00)
subscriptionInvoiceIdYesThe subscription invoice ID to refund

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_processedA
Idempotent

Mark a sink event as processed by your consumer. Idempotent.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe sink event ID (positive integer, as returned by ls_sink_events_list).

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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_listA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoFilter by event_name (e.g. 'order_created').
limitNoMaximum number of events to return.
sinceNoExclusive lower bound on received_at (Unix ms). Pass the highest received_at you have to checkpoint.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, 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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_statsA
Read-onlyIdempotent

Get sink totals: total events, unprocessed count, last-received timestamp.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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_customerA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoNew city
nameNoNew name
emailNoNew email
regionNoNew region/state
statusNoSet to 'archived' to archive the customer. Equivalent to calling ls_archive_customer.
countryNoNew country (ISO 3166-1 alpha-2 code)
customerIdYesThe customer ID to update

TDQS

A4.6/5.0
Behavior5/5

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

The description discloses a crucial behavioral nuance: setting status to 'archived' is treated as destructive and is rate-limited and audited, which the annotations' destructiveHint=false does not convey. It also clarifies that other field edits are not destructive, adding context beyond the structured annotations.

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

Conciseness5/5

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

Two concise sentences: the first states the action and target fields, the second covers the status special case. Every sentence earns its place with no redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the core purpose, the key destructive edge case, and differentiates from a relevant sibling. With no output schema, it doesn't describe return values, but for an update tool with strong parameter schema coverage, this is a minor gap and the overall context is sufficient.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds meaningful semantics beyond the schema by explaining the status parameter's constraint ('only supported value is archived') and its equivalence to the archive operation. This elevates the score.

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

Purpose5/5

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

The description uses the verb 'Update' with a specific resource 'existing customer' and lists the exact updatable fields, making its purpose unambiguous. It also distinguishes itself from sibling tools like ls_create_customer and ls_archive_customer by noting the equivalence for status changes.

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

Usage Guidelines4/5

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

It clearly indicates when to use the tool (updating customer fields) and explicitly points out that setting status to 'archived' is the same operation as ls_archive_customer, which serves as an alternative. It doesn't explicitly say 'use ls_archive_customer if you only need to archive,' but the equivalence provides strong guidance.

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

ls_update_license_keyB
Idempotent

Update a license key's activation limit, expiry date, or disabled status. Setting disabled: true revokes customer access and is treated as destructive (rate-limited and audited).

ParametersJSON Schema
NameRequiredDescriptionDefault
disabledNoSet to true to disable this license key
expiresAtNoExpiry date (ISO 8601 format). Set to null to remove expiry.
licenseKeyIdYesThe license key ID to update
activationLimitNoMaximum number of activations allowed (0 = unlimited)

TDQS

B3.4/5.0
Behavior1/5

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

The description states that setting disabled: true is 'treated as destructive (rate-limited and audited)', but the annotations set destructiveHint to false. This is a direct contradiction, severely misleading the agent about the tool's 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.

Conciseness5/5

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

The description is two sentences: the first states the purpose, the second adds critical behavioral context. Both sentences earn their place with no fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple update tool with no output schema and 4 well-described parameters, the description covers the main purpose and highlights the destructive nuance. It could mention idempotency (already in annotations) but is otherwise adequate.

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

Parameters3/5

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

Schema coverage is 100% and each parameter already has a description. The description merely reiterates the parameter names without adding new semantic information, so it provides no extra value beyond the schema.

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

Purpose5/5

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

The description clearly states the action (update) and the specific resource (license key) and fields (activation limit, expiry, disabled status). It distinguishes the tool from siblings like ls_deactivate_license by implying that disabling is just one aspect of updating.

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

Usage Guidelines3/5

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

The description provides some guidance about disabling being destructive and rate-limited, but it does not explicitly compare with alternatives like ls_deactivate_license or explain when to use this tool versus other related tools. The usage context is partially implied.

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

ls_update_subscriptionA
Idempotent

Update a subscription. Can change the variant (plan switch), pause/unpause, set billing anchor, or update invoice details. Pausing (pause: 'void' or 'free') or switching plan (variantId) is customer-impacting and is treated as destructive (rate-limited and audited); resuming and the billing-neutral edits are not. Use ls_cancel_subscription for cancellation.

ParametersJSON Schema
NameRequiredDescriptionDefault
pauseNoPause mode: 'void' (pause, skip billing), 'free' (pause, keep access free), or 'resume' to unpause
cancelledNoSet to false to un-cancel a subscription before it expires. To cancel, use ls_cancel_subscription instead.
variantIdNoNew variant ID for plan switching
trialEndsAtNoSet trial end date (ISO 8601 format). Set to null to end trial immediately.
billingAnchorNoDay of month (1-28) to anchor billing to
subscriptionIdYesThe subscription ID to update
disableProrationsNoIf true, disable prorations when changing plans
invoiceImmediatelyNoIf true, invoice immediately when updating (default false for prorated changes)

TDQS

A5/5.0
Behavior5/5

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

Annotations declare readOnlyHint=false, destructiveHint=false, but the description adds crucial nuance: certain parameters (pause, variantId) are destructive and rate-limited/audited, while others are not. This goes beyond the annotations and helps the agent understand behavioral impact and side effects.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the verb and resource, then packing significant detail without fluff. Every sentence adds critical selection and usage information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex 8-parameter mutation tool with no output schema, the description covers the main capabilities, destructive implications, and boundary with sibling tools. It provides sufficient context for an agent to select and invoke the tool correctly, with parameter details delegated to the schema.

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

Parameters5/5

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

Schema coverage is 100% with detailed descriptions for each parameter. The description enhances this by grouping parameters into impactful vs. neutral categories, explaining the consequence of pause/variantId, and clarifying the cancellation exclusion. This adds strategic meaning beyond raw schema definitions.

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

Purpose5/5

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

The description clearly states the tool updates a subscription and enumerates specific actions (variant change, pause/unpause, billing anchor, invoice details). It differentiates from the sibling ls_cancel_subscription by explicitly directing cancellations 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.

Usage Guidelines5/5

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

Provides explicit guidance on when to use this tool versus alternatives: distinguishes customer-impacting destructive operations (pause, plan switch) from non-destructive ones, and explicitly states to use ls_cancel_subscription for cancellation. This gives clear decision criteria for an agent.

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

ls_update_subscription_itemA
DestructiveIdempotent

Update a subscription item's quantity. Used for seat-based or quantity-based billing.

ParametersJSON Schema
NameRequiredDescriptionDefault
quantityYesNew quantity for the subscription item
subscriptionItemIdYesThe subscription item ID to update

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_webhookA
Idempotent

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoNew URL to send webhook events to (must be a valid http/https URL)
eventsNoUpdated list of event types to subscribe to
secretNoNew signing secret
webhookIdYesThe webhook ID to update

TDQS

A4.1/5.0
Behavior4/5

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

Description adds important context beyond annotations: warns that setting secret rotates signing secret, breaks signature verification, and is treated as destructive (rate-limited, audited). Annotations have destructiveHint=false, contradicting the description's explicit statement.

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

Conciseness5/5

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

Two concise sentences: first states purpose, second explains critical behavioral nuance. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose and main behavioral nuance, but lacks mention of return value or success response. Given no output schema, description could be more complete (e.g., 'returns the updated webhook object'). Also, idempotentHint=true is present in annotations, but description doesn't reinforce that.

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

Parameters4/5

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

Schema coverage is 100% with descriptions for all parameters. Description adds extra meaning for the 'secret' parameter by explaining its side effects, which is valuable beyond schema.

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

Purpose5/5

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

Clear verb 'update' and resource 'webhook', with specific fields listed (URL, events, secret). Distinguishes from sibling tools like create_webhook and delete_webhook.

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

Usage Guidelines3/5

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

Implies usage for modifying existing webhooks, but no explicit guidance on when to use this vs other webhook tools or alternatives. The note about destructive behavior when setting secret provides some context but not direct guidance.

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

ls_validate_licenseA
Read-onlyIdempotent

Validate a license key or specific instance. Does not require an API key — uses the license key itself for auth.

ParametersJSON Schema
NameRequiredDescriptionDefault
instanceIdNoOptional instance ID to validate a specific activation
licenseKeyYesThe license key to validate

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 64 tool updatesv0.10.10
    • First observedls_activate_license
    • First observedls_archive_customer
    • First observedls_cancel_subscription
    • First observedls_create_checkout
    • First observedls_create_customer
    • First observedls_create_discount
    • First observedls_create_usage_record
    • First observedls_create_webhook
    • First observedls_deactivate_license
    • First observedls_delete_discount
    • First observedls_delete_webhook
    • First observedls_generate_order_invoice
    • First observedls_generate_subscription_invoice
    • First observedls_get_affiliate
    • First observedls_get_checkout
    • First observedls_get_customer
    • First observedls_get_discount
    • First observedls_get_discount_redemption
    • First observedls_get_file
    • First observedls_get_license_key
    • First observedls_get_license_key_instance
    • First observedls_get_order
    • First observedls_get_order_item
    • First observedls_get_price
    • First observedls_get_product
    • First observedls_get_store
    • First observedls_get_subscription
    • First observedls_get_subscription_invoice
    • First observedls_get_subscription_item
    • First observedls_get_subscription_item_usage
    • First observedls_get_usage_record
    • First observedls_get_user
    • First observedls_get_variant
    • First observedls_get_webhook
    • First observedls_list_affiliates
    • First observedls_list_checkouts
    • First observedls_list_customers
    • First observedls_list_discount_redemptions
    • First observedls_list_discounts
    • First observedls_list_files
    • First observedls_list_license_key_instances
    • First observedls_list_license_keys
    • First observedls_list_order_items
    • First observedls_list_orders
    • First observedls_list_prices
    • First observedls_list_products
    • First observedls_list_stores
    • First observedls_list_subscription_invoices
    • First observedls_list_subscription_items
    • First observedls_list_subscriptions
    • First observedls_list_usage_records
    • First observedls_list_variants
    • First observedls_list_webhooks
    • First observedls_refund_order
    • First observedls_refund_subscription_invoice
    • First observedls_sink_event_mark_processed
    • First observedls_sink_events_list
    • First observedls_sink_stats
    • First observedls_update_customer
    • First observedls_update_license_key
    • First observedls_update_subscription
    • First observedls_update_subscription_item
    • First observedls_update_webhook
    • First observedls_validate_license

TDQS

A3.6/5.0

Scored across 64 tools

Disambiguation4/5

Most tools are clearly distinct get/list/create/update/delete pairs, but ls_archive_customer and ls_update_customer overlap since updating status to 'archived' is the same operation, creating potential confusion.

Naming Consistency4/5

The vast majority follow ls_verb_noun pattern (e.g., ls_get_store, ls_list_orders), but the sink tools (ls_sink_events_list, ls_sink_event_mark_processed, ls_sink_stats) break the pattern with inconsistent structure.

Tool Count1/5

With 64 tools, this far exceeds the 25+ threshold for 'too many.' While the Lemon Squeezy API is broad, the sheer number of tools makes it difficult for agents to select the right one, and many could be consolidated or organized hierarchically.

Completeness4/5

The tool surface covers nearly all major Lemon Squeezy entities and workflows, including orders, subscriptions, licenses, checkouts, and webhooks. However, some resources like discounts and products lack update operations, which may require workarounds.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers