Skip to main content
Glama
cotletdev

Pirate Ship MCP Server

Pirate Ship API and MCP server, self-hosted

A Pirate Ship API and a Pirate Ship MCP server you run on your own computer, in Python, on the session of your own Google Chrome. 51 of the 57 Pirate Ship tools we run in production at Cotlet: USPS and UPS rates, draft labels and batches, label downloads, SCAN Forms, shipments and tracking, reports, store order import, Ship From Addresses, Saved Packages, tracking emails and label settings. The six tools that spend or refund money are not in this version.

Pirate Ship has no public API and no official MCP server. This repo gives you both:

  • MCP server for Claude Code, Claude Desktop, Cursor, Codex and any MCP client, over stdio or HTTP. Setup

  • REST API on http://127.0.0.1:8787/api/v1/pirate-ship, with OpenAPI docs at /docs. Setup

  • Python: call("get_rates", to_zip="10001", weight_oz=16), plus 11 ready scripts in examples/.

It is for technical people who want to run it themselves, for noncommercial use only (license). If you want it running 24/7 on a server, kept working when Pirate Ship changes its app, for a team or a business, use the hosted version at cotlet.dev.

Pirate Ship MCP server Python 3.11+ License: PolyForm Noncommercial 1.0.0

git clone https://github.com/cotletdev/pirate-ship-api-mcp-server.git && cd pirate-ship-api-mcp-server
python3 -m venv .venv && . .venv/bin/activate && pip install -e .
pirate-ship-mcp connect                            # reads your Pirate Ship session from Chrome
pirate-ship-mcp call get_rates to_zip=10001 weight_oz=16
claude mcp add pirate-ship -- "$PWD/.venv/bin/pirate-ship-mcp" mcp

Contents

Related MCP server: AKIMCP

How it works

AI agent (MCP) / script (REST, Python) ──▶ pirate-ship-mcp on your computer ──your cookies──▶ ship.pirateship.com
                                                     ▲
                       pirate-ship-mcp connect ──────┘ reads them once from your Chrome (DevTools Protocol)
  1. You sign in to Pirate Ship in your own Chrome, the way you always do.

  2. pirate-ship-mcp connect attaches to that Chrome through the Chrome DevTools Protocol, reads the pirateship.com cookies and Chrome's time zone, and saves them to ~/.config/pirate-ship-api-mcp/session.json, readable by your user only. It never sees or stores your password.

  3. Every tool call is one of the GraphQL operations Pirate Ship's own web app sends to ship.pirateship.com/api/graphql, with those cookies, sent with curl_cffi, which copies Chrome's TLS fingerprint. No headless browser runs.

Pirate Ship's web app sends each operation as a persisted query: its name and the sha256 of the query text. The tools may send only the operations listed in operations.py, and account, password, payment method and identity operations are not on that list. When Pirate Ship changes one of the listed queries, the tool answers "Pirate Ship changed its app" until we record the new hash.

Pirate Ship's session cookie lives about a day and is renewed by use. When Pirate Ship signs you out, the server reads the cookies from Chrome again, if Chrome is open with remote debugging on. Tick "Stay signed in" when you sign in, so Chrome keeps you signed in between visits.

Requirements

  • Python 3.11 or newer.

  • Google Chrome 144 or newer, signed in to Pirate Ship. Any Chrome or Chromium works with a debugging port.

  • macOS, Linux or Windows.

  • A Pirate Ship account with a Ship From Address. Rates, drafts, reports and settings need nothing else. Buying labels needs Account Balance or a payment method, and you buy in Pirate Ship itself.

Install

git clone https://github.com/cotletdev/pirate-ship-api-mcp-server.git
cd pirate-ship-api-mcp-server
python3 -m venv .venv
. .venv/bin/activate              # Windows: .venv\Scripts\activate
pip install -e .
pirate-ship-mcp --version

With uv: uv venv && uv pip install -e ., then uv run pirate-ship-mcp ....

Setting it up with an AI agent (Claude Code, Codex, Cursor)? Open it in this folder and ask it to set up the repo: AGENTS.md tells it every step, and it asks you only for the steps in Chrome.

To update: git pull && pip install -e .. We copy every change of the hosted Pirate Ship tools into this repo.

Connect your Chrome

  1. Open chrome://inspect/#remote-debugging in Chrome and switch remote debugging on. Chrome then accepts DevTools connections from programs on this computer, and asks you before each one.

  2. Make sure you are signed in at ship.pirateship.com.

  3. Run:

    pirate-ship-mcp connect
  4. Chrome asks whether to allow the connection. Click Allow.

Saved 32 Pirate Ship cookies to /Users/you/.config/pirate-ship-api-mcp/session.json
Signed in to Pirate Ship as Linda Morales (linda@example.com)

Leave remote debugging on if you want the server to pick up a new session by itself after Pirate Ship signs you out. With a one-day cookie, that happens more often than with most apps.

connect looks for Chrome's DevToolsActivePort file in the default profile folder. For Chrome Beta, Canary or a custom profile folder, pass --profile-dir "<folder>".

Option B: a Chrome with a debugging port

Chrome does not open a debugging port on your default profile, so start a separate one, sign in to Pirate Ship there once, and connect to it:

# macOS
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --remote-debugging-port=9222 --user-data-dir="$HOME/.chrome-pirate-ship"
# Linux
google-chrome --remote-debugging-port=9222 --user-data-dir="$HOME/.chrome-pirate-ship"
# Windows
"C:\Program Files\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9222 --user-data-dir="%USERPROFILE%\.chrome-pirate-ship"

pirate-ship-mcp connect --cdp http://127.0.0.1:9222

--cdp also takes a ws:// DevTools URL, for example of a Chrome on another machine reached over an SSH tunnel.

For a server with no Chrome: in Chrome open DevTools on ship.pirateship.com, Application > Cookies > https://ship.pirateship.com, copy the value of pirate_id_f0fecf84, then:

pirate-ship-mcp connect --token          # paste it, input is hidden
# or, without a session file:
export PIRATE_SHIP_AUTH_TOKEN=...

A pasted cookie is not refreshed on its own, and this one lasts about a day without use. Paste a new one when Pirate Ship signs you out.

Check the session at any time:

pirate-ship-mcp status

MCP server

The MCP server lists every tool with its input schema, a description written for agents, and hints: read tools are marked read-only, and tools that delete something or change what your recipients get are marked so your client asks before running them.

Claude Code

claude mcp add pirate-ship -- /path/to/pirate-ship-api-mcp-server/.venv/bin/pirate-ship-mcp mcp
# read only:
claude mcp add pirate-ship -- /path/to/pirate-ship-api-mcp-server/.venv/bin/pirate-ship-mcp mcp --read-only

Claude Desktop

~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "pirate-ship": {
      "command": "/path/to/pirate-ship-api-mcp-server/.venv/bin/pirate-ship-mcp",
      "args": ["mcp"]
    }
  }
}

Cursor

~/.cursor/mcp.json, the same block as Claude Desktop. A ready copy is in mcp.json.

Codex

~/.codex/config.toml:

[mcp_servers.pirate-ship]
command = "/path/to/pirate-ship-api-mcp-server/.venv/bin/pirate-ship-mcp"
args = ["mcp"]

Over HTTP

pirate-ship-mcp serve also serves MCP over streamable HTTP at http://127.0.0.1:8787/mcp, for clients that take a URL:

pirate-ship-mcp serve
claude mcp add --transport http pirate-ship http://127.0.0.1:8787/mcp

Then ask your agent things like:

What does a 2 lb box, 12x10x6, cost to ZIP 94103 with USPS and UPS? Cheapest first.

Make a draft batch from orders.csv with my "Small box" Saved Package and show me the rates per group.

Which labels from the last 10 days still have no carrier scan?

How much did I spend on labels in October, and what were the carrier adjustments?

REST API

pirate-ship-mcp serve              # http://127.0.0.1:8787, MCP at /mcp, docs at /docs

Each tool has its own route under /api/v1/pirate-ship, the same paths as the hosted API at cotlet.dev, so code written against one works with the other. Path parts and the query string are arguments, and a JSON body adds the rest.

curl 'http://127.0.0.1:8787/api/v1/pirate-ship/balance'
curl 'http://127.0.0.1:8787/api/v1/pirate-ship/rates?to_zip=10001&weight_oz=16&length_in=10&width_in=8&height_in=4'
curl 'http://127.0.0.1:8787/api/v1/pirate-ship/shipments?from_date=2026-10-01&limit=50'
curl -X POST http://127.0.0.1:8787/api/v1/pirate-ship/shipments \
  -H 'Content-Type: application/json' \
  -d '{"full_name": "Linda Morales", "address1": "350 5th Ave", "city": "New York", "state": "NY", "zip": "10118", "weight_oz": 20}'

Any tool by name, body as its arguments:

curl -X POST http://127.0.0.1:8787/api/v1/pirate-ship/tools/list_shipments -d '{"carrier": ["UPS"]}'
  • GET /api/v1/pirate-ship/tools: every tool with its route, input schema and an example answer.

  • GET /docs: interactive OpenAPI docs, GET /openapi.json the schema, for n8n, Postman or a generated client.

  • Answers are JSON. Report lists take limit and offset and answer with total.

The server listens on 127.0.0.1 only. To reach it from another device of yours, set a token, and every request then needs Authorization: Bearer <token>:

PIRATE_SHIP_MCP_TOKEN=$(openssl rand -hex 24) pirate-ship-mcp serve --host 0.0.0.0

Python and the example scripts

Straight from Python, no server needed:

from pirate_ship_api_mcp import call
from pirate_ship_api_mcp.scripting import paginate_offset, write_rows

rates = call("get_rates", to_zip="10001", weight_oz=16, length_in=10, width_in=8, height_in=4)["rates"]
shipments = list(paginate_offset("list_shipments", {"from_date": "2026-10-01"}, "shipments"))
write_rows(shipments, "october.csv")
call("create_shipment", full_name="Linda Morales", address1="350 5th Ave", city="New York", zip="10118", weight_oz=20)

Or one tool from the shell: pirate-ship-mcp call list_shipments limit=10, or with a JSON object.

Ready scripts in examples/. Each prints JSON or a short report, takes --out file.csv or --out file.json where it makes sense, and --help:

Script

What it does

compare_rates.py

USPS and UPS rates for one package, cheapest first. --size 10x8x4, --country.

draft_batch_from_csv.py

A CSV of recipients becomes one unpaid draft batch with a Saved Package; prints the rate of each group. Rows without an address are listed, not guessed.

store_orders.py

Refreshes your connected stores and lists the orders waiting to ship.

export_shipments.py

Bought labels to CSV or JSON: recipient, tracking number, service, cost, status. --since, --carrier.

tracking_report.py

Labels of the last N days that are not delivered, with the last event and a stuck flag.

refund_candidates.py

Duplicate labels and labels with no carrier scan in the 28-day refund window. Lists them; you refund in Pirate Ship.

scan_form.py

The USPS SCAN Form for today's labels, as a PDF link.

pickup_quote.py

Today's packages and weight per carrier, with the pickup price. Books nothing.

carrier_adjustments.py

Carrier adjustments with the weight and size you entered next to what the carrier measured.

spend_report.py

Labels, spend, savings, carrier split, top states and balance for a date range. --transactions saves every charge.

ship_from_addresses.py

Your Ship From Addresses and Saved Packages with the ids other tools take.

python examples/compare_rates.py --to-zip 94103 --weight-oz 32 --size 12x10x6
python examples/draft_batch_from_csv.py orders.csv --title "Wholesale 19 Oct" --package "Small box"

On a schedule, cron on your own computer works while it is on: 0 18 * * 1-5 cd ~/pirate-ship-api-mcp-server && .venv/bin/python examples/tracking_report.py --days 10 --out late.csv.

All 51 tools

Money is in US dollars, weights in ounces, sizes in inches, dates in Chrome's time zone. pirate-ship-mcp tools prints this list, pirate-ship-mcp tools --json adds the input schemas.

Rates and addresses

Tool

Access

REST route

What it does

get_rates

read

GET /rates

USPS and UPS services with price for one package, cheapest first.

parse_address

read

GET /addresses/parse

Splits a pasted address into name, street, city, state, ZIP and country.

search_recipients

read

GET /recipients/search

Past recipients' addresses matching a name, email or phone.

list_package_types

read

GET /package-types

Packaging types per carrier (box, envelope, flat rate) and the size and weight limits.

Draft labels and batches

Tool

Access

REST route

What it does

create_shipment

write

POST /shipments

Unpaid draft label for one package with every rate; buy it in Pirate Ship.

create_batch

write

POST /batches

Unpaid draft batch for many packages with the rates of each rate group; buy it in Pirate Ship.

create_batch_from_orders

write

POST /batches/from-orders

Turns store orders into a batch of shipments with one saved package; nothing is bought.

get_batch

read

GET /batches/{batch_id}

A draft or bought batch: shipments, tracking, rates to buy, what can be refunded.

list_batches

read

GET /batches

Latest batches and single labels, newest first, with status and tracking counts.

change_ship_date

write

PUT /batches/{batch_id}/ship-date

Moves a draft batch to another ship date and returns its new rates.

rename_batch

write

PATCH /batches/{batch_id}

Changes a batch's title.

delete_batch

write

DELETE /batches/{batch_id}

Deletes an unpaid draft batch or single shipment.

Printing and SCAN Forms

Tool

Access

REST route

What it does

download_labels

read

GET /labels

A download link for the printable labels of a batch or of chosen shipments.

create_scan_form

write

POST /scan-forms

USPS End of Day SCAN Form for the labels of one Ship Date, as a PDF link.

list_scan_forms

read

GET /scan-forms

USPS SCAN Forms per Ship From Address, with their PDF links and labels still without one.

Shipments and tracking

Tool

Access

REST route

What it does

list_shipments

read

GET /shipments

Labels bought in Pirate Ship with recipient, tracking, cost and status, newest first.

get_shipment

read

GET /shipments/{shipment_id}

One shipment with tracking, service, cost, recipient and carrier adjustments.

export_shipments

read

GET /shipments/export

A CSV of the shipments report with every column, as a download link.

Reports, balance and refunds

Tool

Access

REST route

What it does

get_account_balance

read

GET /balance

Account Balance, Pending Refunds and Pending Returns from the Reports page.

get_shipping_stats

read

GET /stats

Labels, spend, savings, tracking and where packages went for a date range, as on Reports.

list_transactions

read

GET /transactions

Every charge, payment and refund on the Pirate Ship balance, newest first.

list_receipts

read

GET /receipts

Payments made to Pirate Ship, newest first; get_receipt shows one.

get_receipt

read

GET /receipts/{receipt_id}

One payment to Pirate Ship with its billing address and the labels it paid for.

list_refunds

read

GET /refunds

Label refunds with their status and amount, newest request first.

list_return_labels

read

GET /return-labels

Pay-on-use return labels and whether a customer used them.

list_carrier_adjustments

read

GET /carrier-adjustments

Extra charges or credits the carrier made after a label was used, with old and actual package.

export_report

read

GET /reports/{report}/export

A CSV of the transactions, refunds, receipts, return labels or carrier adjustments report.

Pickups

Tool

Access

REST route

What it does

get_pickup_quote

read

GET /pickups/quote

What a USPS or UPS pickup would cost; USPS pickups are free. Nothing is booked.

list_pickups

read

GET /pickups

Your scheduled and past USPS and UPS pickups with confirmation numbers.

Store orders

Tool

Access

REST route

What it does

list_store_connections

read

GET /store-connections

Stores and marketplaces connected to Pirate Ship for order import, with their status.

sync_store_orders

write

POST /import-orders/sync

Pulls new orders from every connected store into Pirate Ship's Import list.

list_import_orders

read

GET /import-orders

Unshipped orders from your connected store integrations, as in the Import grid.

ignore_orders

write

POST /import-orders/ignore

Hides store orders from the Import list without shipping them.

unignore_orders

write

DELETE /import-orders/ignore

Puts ignored store orders back on the Import list.

Ship From Addresses

Tool

Access

REST route

What it does

list_ship_from_addresses

read

GET /ship-from-addresses

Your Ship From Addresses with their return addresses; one is the default.

create_ship_from_address

write

POST /ship-from-addresses

Adds a US Ship From Address, optionally with a separate return address.

update_ship_from_address

write

PATCH /ship-from-addresses/{address_id}

Changes a Ship From Address: its name, origin or return address.

set_default_ship_from_address

write

PUT /ship-from-addresses/{address_id}/default

Makes one Ship From Address the default for new shipments and rate quotes.

delete_ship_from_address

write

DELETE /ship-from-addresses/{address_id}

Removes a saved Ship From Address. The default address cannot be removed.

Saved Packages

Tool

Access

REST route

What it does

list_saved_packages

read

GET /saved-packages

Your Saved Packages from Settings: size, weight and the extra services stored with each.

create_saved_package

write

POST /saved-packages

Saves a package (type, size, weight, extra services) for reuse on labels.

update_saved_package

write

PATCH /saved-packages/{package_id}

Changes a Saved Package; fields you leave out keep their values.

delete_saved_package

write

DELETE /saved-packages/{package_id}

Removes a Saved Package. Labels made with it are not affected.

Tracking emails

Tool

Access

REST route

What it does

get_tracking_email_settings

read

GET /tracking-email-settings

Whether recipients get tracking emails by default, how long after purchase, and the template.

update_tracking_email_settings

write

PATCH /tracking-email-settings

Turns default tracking emails on or off and sets their delay after purchase.

list_email_templates

read

GET /email-templates

Tracking email templates: subject, sender, HTML body; one is the default.

create_email_template

write

POST /email-templates

Adds a tracking email template for the emails recipients get with their tracking link.

update_email_template

write

PATCH /email-templates/{template_id}

Changes a tracking email template; fields you leave out keep their values.

delete_email_template

write

DELETE /email-templates/{template_id}

Removes a tracking email template.

Label settings

Tool

Access

REST route

What it does

get_label_settings

read

GET /label-settings

Label size and file format, packing list, logo, QR codes, address correction, export format.

update_label_settings

write

PATCH /label-settings

Changes label size, file format, packing list, logo, QR codes, address correction or export format.

Not in this version

Tool

Why

buy_label

Spends your Account Balance or charges your card. Buy in Pirate Ship.

refund_label, refund_batch

Refund requests are final and move money. Request them in Pirate Ship.

schedule_pickup, cancel_pickup

A UPS pickup is charged and its cancellation refunded. get_pickup_quote and list_pickups are here.

dispute_adjustment

A dispute is about a charge on your balance. list_carrier_adjustments is here.

In tool descriptions "buy it with buy_label" means: buy the draft in Pirate Ship's web app. Never built, on purpose: your Pirate Ship sign-in, email, password, security settings, payment methods, billing and identity checks.

Configuration

Variable

Default

What it does

PIRATE_SHIP_MCP_HOME

~/.config/pirate-ship-api-mcp

Folder of session.json.

PIRATE_SHIP_AUTH_TOKEN

The pirate_id_f0fecf84 cookie, instead of pirate-ship-mcp connect.

PIRATE_SHIP_PROXY

Proxy for every request to Pirate Ship, e.g. http://user:pass@host:port.

PIRATE_SHIP_MCP_READ_ONLY

1 hides and refuses every tool that changes Pirate Ship (same as --read-only).

PIRATE_SHIP_MCP_TOKEN

Bearer token required by serve; needed to listen beyond 127.0.0.1.

PIRATE_SHIP_MCP_HOST, PIRATE_SHIP_MCP_PORT

127.0.0.1, 8787

Address of serve.

TZ

Chrome's zone

Time zone for "today" and date ranges when connect could not read Chrome's.

Security and your Pirate Ship account

  • Your password never reaches this code. Only cookies are read, and only those of pirateship.com.

  • The session file is yours. session.json is created with mode 0600. Anyone who has it can act as you on Pirate Ship, so keep it out of git and shared folders.

  • Local by default. serve binds to 127.0.0.1 and refuses another address without PIRATE_SHIP_MCP_TOKEN.

  • pirateship.com only. Requests and redirects outside pirateship.com are refused.

  • No tool moves money. None buys a label, requests a refund, books a paid pickup or touches your payment methods.

  • Read-only mode. --read-only or PIRATE_SHIP_MCP_READ_ONLY=1 exposes the 29 read tools only.

  • Some changes reach your recipients. Tracking email settings and templates change the emails your customers get. MCP clients ask before those tools run; a script does not.

Errors

The REST API answers {"error": "<code>", "message": "..."}. The MCP server returns the same code and message as a tool error.

Status

Code

What to do

401

auth_required, auth_expired

No session, or Pirate Ship signed you out. Sign in to Pirate Ship in Chrome and run pirate-ship-mcp connect.

403

scope_denied

The server runs read-only.

403

target_blocked

Pirate Ship refused the request or showed a bot check. Open ship.pirateship.com in Chrome once, then retry.

409

captcha_required

Pirate Ship asks for a CAPTCHA. Solve it in Chrome.

422

invalid_input

An argument is missing or wrong; the message names it.

429

rate_limited

Pirate Ship is limiting the account. Wait a few minutes.

502

target_error

Pirate Ship answered with an error (an unknown id, an address it cannot rate), or changed its app. git pull for the latest tools, or open an issue.

Self-hosted or hosted

This repo

Cotlet, hosted

Tools

51

all 57, with buying, refunds, pickups and disputes

Runs

on your computer, while it is on

in the cloud, 24/7

Pirate Ship session

your Chrome, cookies in a local file

your own Cloud Browser in the EU, profile encrypted with AES-256-GCM, kept signed in

When Pirate Ship changes its app

git pull once we have fixed it

fixed for you, every tool tested daily

Approvals

your MCP client asks per call

purchases and refunds wait for your OK, switchable per tool

Works with

MCP clients on your machine, local scripts

Claude.ai and ChatGPT connectors, n8n, Make, Zapier, any HTTP client

Who may use it

you, for noncommercial use

teams, businesses, agencies

Price

free

free 7-day trial with 2,000 credits, no card; then one-time packs from $29 for 5,000 credits

On the hosted version a successful call uses 20 to 30 credits (25 for most tools), failed calls are free, and the Cloud Browser uses 50 credits a day while it has an app enabled for agents. Full pricing.

FAQ

Does Pirate Ship have an official API? No. Pirate Ship has no API, no webhooks and no official MCP server (checked 11 Oct 2026). Its help center says so and points to the built-in store integrations and spreadsheet uploads instead. Details: cotlet.dev/integrations/pirate-ship-api-mcp-server.

Is there a Pirate Ship MCP server for Claude, ChatGPT or Cursor? Yes, this one runs on your machine: pirate-ship-mcp mcp for Claude Code, Claude Desktop, Cursor and Codex. ChatGPT and Claude.ai connectors need a public HTTPS URL, which the hosted Pirate Ship MCP server gives you.

Can I get USPS and UPS rates from a script? Yes. get_rates returns every service with Pirate Ship's price, the retail price, zone and delivery estimate, cheapest first, and saves nothing: python examples/compare_rates.py --to-zip 10001 --weight-oz 16 --size 10x8x4.

Can it buy labels? Not this repo. It builds the draft (create_shipment, create_batch, create_batch_from_orders) with the rates of each group, and you click Buy in Pirate Ship. The hosted version has buy_label with a price cap per purchase.

Can I create a batch from a spreadsheet or from my store orders? Yes. create_batch takes up to 500 recipients per call, create_batch_from_orders takes orders from your connected stores. examples/draft_batch_from_csv.py reads a CSV.

Can I export shipments and tracking to CSV? Yes: python examples/export_shipments.py --since 2026-10-01 --out october.csv, or export_shipments for Pirate Ship's own spreadsheet with every column.

Why does it need my Chrome? To read your Pirate Ship session without your password. Pirate Ship's sign-in sits behind a Cloudflare check, so you sign in in the browser and plain requests do the rest. Chrome is used once per sign-in, not for each call.

What happens when Pirate Ship signs me out? Calls fail with auth_expired. With Chrome remote debugging on, the server reads the new cookies on the next call (click Allow when Chrome asks); otherwise run pirate-ship-mcp connect again.

Can it run on a VPS or in Docker? Technically yes, with PIRATE_SHIP_AUTH_TOKEN. The cookie lasts about a day without use, Pirate Ship then sees your session from a datacenter IP. For an always-on setup the hosted version keeps your session in your own Cloud Browser.

Will my Pirate Ship account get blocked? Requests carry Chrome's fingerprint and go out one at a time, as you would click. Nobody can promise a platform never acts. Keep to your normal use.

Can I use it at work or for my clients? No, the license allows noncommercial use only. For a team, a company or client work, use Cotlet or write to contact@cotlet.dev.

Is it open source? The source is public, the license is not an open source license: noncommercial use only, no business use.

A tool broke or I need another one. Open an issue with the tool name and the error message.

License

PolyForm Noncommercial License 1.0.0. In short:

  • Allowed: noncommercial use: you, for your own personal purposes with your own Pirate Ship account, or a charity, school, public research or government body. Changing the code, and sharing it under the same license.

  • Not allowed: any commercial use, your own business included; client work; selling or offering it, or a service built on it.


Maintained by Cotlet (@cotletdev). Pirate Ship is a trademark of its owner. This project is unofficial and not affiliated with, endorsed or sponsored by Pirate Ship.

Available Tools

51 tools
change_ship_dateChange ship dateA
Idempotent
Inspect

Moves a draft batch to another ship date and returns its new rates.

The ship date on Pirate Ship's buy page: rates are fetched again for that day, so prices and estimated delivery can change. Pick a date from a rate's ship_dates. Works on drafts only.

NameRequiredDescriptionDefault
batch_idYes
ship_dateYesOne of the rate's ship_dates (YYYY-MM-DD).

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, so safety is covered elsewhere; the description adds the non-obvious consequence that rates are refetched and prices/estimated delivery can change. It does not mention whether labels are repriced or re-bought, which is the one remaining behavioral gap.

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?

Front-loaded with the operation and effect, then constraints; three short sentences with essentially no filler. The 'ship date on Pirate Ship's buy page' framing is slightly indirect but still earns its place as domain context.

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 exists, and the description covers the return ('new rates'), the mutation's side effects, and the draft-only precondition. What is missing is minor: behavior on failure or on a batch that has already purchased labels.

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?

With 50% schema description coverage, the schema documents ship_date but not batch_id; the description compensates partly by implying batch_id must be a draft batch and by restating the ship_dates constraint. It adds marginal meaning beyond the schema rather than full compensation for the undocumented 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?

States a specific verb+resource ('Moves a draft batch to another ship date') plus the side effect ('returns its new rates'), and constrains scope to drafts. An agent can distinguish this from create_batch, get_batch, or rename_batch without opening a schema.

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

Usage Guidelines4/5

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

'Works on drafts only' gives an explicit precondition, and 'Pick a date from a rate's ship_dates' tells the agent where valid values come from. It stops short of naming alternatives (e.g. re-creating a batch for non-draft changes), so it is clear context rather than full when/when-not routing.

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

create_batchCreate batchAInspect

Unpaid draft batch for many packages with the rates of each rate group; buy it with buy_label.

Pirate Ship's spreadsheet upload: one batch for up to 500 recipients from your ship-from address, rated by Pirate Ship. The package (packaging, weight_oz and size, or package_preset_id) applies to every shipment; a recipient's own weight_oz or size overrides it. Pirate Ship splits the batch into rate groups (domestic small, big or heavy, international): buy_label needs one rate_id per group. errors counts rows Pirate Ship could not rate (an address it cannot find); get_batch shows them. Nothing is charged; delete_batch drops the draft.

NameRequiredDescriptionDefault
titleYesBatch name.
width_inNo
height_inNo
length_inNo
packagingNoParcel
shipmentsYes
signatureNonone
weight_ozNoWeight in ounces.
ship_from_idNoShip-from address id; default: the account's default.
insured_value_usdNo
package_preset_idNoA saved package: its type, size and weight replace the fields above.

TDQS

A4/5.0
Behavior4/5

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

Adds real behavior beyond annotations: nothing is charged, the batch is a draft, Pirate Ship splits it into rate groups (domestic small/big/heavy/international), and unratable rows are counted in errors rather than failing the call. Annotations already cover the safety profile (destructiveHint=false, openWorldHint=true), so this is strong supplementary context; omitted are duplicate-handling/concurrency and the response shape.

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?

Three dense sentences, front-loaded with the core purpose and the follow-up call, then the inheritance/override rule, then caveats. Every clause carries information, though the third sentence packs errors/get_batch/delete_batch tightly enough to read as a run-on.

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 an 11-parameter creation tool with no output schema and 36% coverage, the description supplies the missing workflow context (create → buy_label → get_batch/delete_batch) and implies the return contains rate groups and an errors count. It does not state what identifier comes back to use with get_batch/buy_label, which is the one remaining gap an agent must guess at.

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?

With only 36% schema coverage, the description carries the load and does so for the hardest part: the package (packaging, weight_oz, size, or package_preset_id) applies to every shipment while a recipient's own weight_oz or size overrides it, and the 500-recipient cap. It says nothing about signature, insured_value_usd, or the per-row extras like rubber_stamp_1, leaving several parameters documented only by their bare types.

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?

The opening sentence states a specific verb and resource ('Unpaid draft batch for many packages') plus the creating-mechanism ('Pirate Ship's spreadsheet upload'), which lets an agent separate it from the order-driven sibling create_batch_from_orders without opening the schema. It stops short of naming that sibling explicitly, so differentiation is inferred rather than stated.

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?

Gives a clear lifecycle: create the draft, buy it with buy_label (one rate_id per rate group), inspect failures with get_batch, discard with delete_batch. It communicates the context (many packages from your ship-from address) but offers no explicit 'use this instead of create_batch_from_orders when...' exclusion.

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

create_batch_from_ordersCreate batch from ordersAInspect

Turns store orders into a batch of shipments with one saved package; nothing is bought.

Creates a Pirate Ship batch from imported orders: recipients come from the orders, size and weight from the saved package. The batch is rated, not paid: no label is bought. Large batches are built in the background (progress in the answer).

NameRequiredDescriptionDefault
titleNoBatch name. Default: today's date.
order_idsYesOrder ids from list_import_orders.
package_idYesSaved package id from list_saved_packages.
ship_from_idNoFrom list_ship_from_addresses. Default: the default one.
override_multipleNoUse the saved package also for orders with several items.

TDQS

A3.9/5.0
Behavior4/5

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

Adds real context beyond the annotations: the batch is rated but not paid, no label is purchased, and large batches are built asynchronously with progress reported in the answer. That async behavior is not derivable from readOnlyHint=false / idempotentHint=false, and it materially affects how the agent should interpret the response. It stops short of saying what happens to unratable orders or how repeated calls behave.

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 core fact is front-loaded in one line, and the second paragraph elaborates usefully. Slight redundancy — 'nothing is bought' and 'no label is bought' say the same thing twice — but nothing is padding.

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 five-parameter creation tool with full schema coverage and no output schema, the description covers the essentials: what feeds the batch, that it is rated only, that nothing is charged, and that large batches return before completion with progress in the answer. An agent can call this correctly without further reading.

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 genuine meaning: recipient data comes from the orders while size and weight come from the saved package — the coupling between order_ids and package_id that the schema does not state. It leaves ship_from_id, title and override_multiple entirely to the schema, which is acceptable given full coverage.

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?

The first sentence names a specific verb and resource — turning store orders into a batch of shipments — plus the key constraint of a single saved package, so the agent knows exactly what is produced. It implicitly separates itself from create_batch and create_shipment by 'from imported orders' and 'batch of shipments', but never names those siblings explicitly.

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?

Usage is implied: it is the tool for orders already imported (schema even points to list_import_orders). 'Nothing is bought / no label is bought' steers the agent away from expecting labels, but there is no explicit when-to-use versus create_batch or when-to-ship versus create_shipment guidance.

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

create_email_templateCreate email templateAInspect

Adds a tracking email template for the emails recipients get with their tracking link.

Saves a new tracking email template. Nothing is sent now: Pirate Ship uses the template when a label is bought with tracking emails on. html takes the placeholders [Recipient First Name], [Ship Date], [Shipping Service], [Recipient Address] and [Tracking #].

NameRequiredDescriptionDefault
htmlYesBody as HTML. Placeholders: [Recipient First Name], [Ship Date], [Shipping Service], [Recipient Address], [Tracking #].
nameYesTemplate name in Settings.
defaultNoUse it for new labels.
subjectYes
bcc_emailNoA copy of every email goes here. Empty for none.
sender_nameYes
sender_emailYesReply-to address recipients see.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare non-read-only, non-idempotent, non-destructive, open-world behavior, so the bar is lower. The description adds non-obvious value by explaining the deferred effect ('Nothing is sent now: Pirate Ship uses the template when a label is bought with tracking emails on'), which clarifies the side-effect timing. Duplicate-name handling and permission requirements remain unstated.

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?

Front-loaded with the core action, and every sentence carries real information about behavior. It is slightly redundant – 'Adds a tracking email template' and 'Saves a new tracking email template' restate each other, and the placeholder list repeats the schema verbatim.

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?

With no output schema, the description must carry the return-value burden, and it never says what comes back (e.g., the created template's id) or how the call fails. The side-effect timing is well covered for a mutation tool, but duplicate-name behavior and the response shape are gaps an agent will notice.

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 71% and the description's placeholder list duplicates what html already documents in the schema, so most of the semantic load is already structural. Adding a 4 would overstate the contribution; a 3 understates it, because the placeholder enumeration does at least reinforce the one field an agent is most likely to get wrong. Score sits between, at 4 for reinforcing the highest-risk 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?

States a specific verb (adds/saves) and a precisely scoped resource (a tracking email template used for tracking-link emails), and even clarifies what it does not do (send anything now). An agent can distinguish it from update_email_template, delete_email_template, and list_email_templates without opening any schema.

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

Usage Guidelines3/5

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

Gives real usage context – the template is consumed when a label is purchased with tracking emails enabled, and nothing is sent at creation time. But it never says when to prefer this over update_email_template, what happens if a template with the same name exists, or whether prerequisites (e.g., tracking emails enabled) are required.

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

create_saved_packageCreate saved packageAInspect

Saves a package (type, size, weight, extra services) for reuse on labels.

Adds a Saved Package in Settings. Parcel, SoftEnvelope and Irregular need length_in and width_in, a box also height_in; flat rate packaging needs none. weight_oz 0 leaves the weight to each label. default true preselects it on new shipments.

NameRequiredDescriptionDefault
titleYesName shown in Saved Packages.
defaultNoPreselect it on new shipments.
width_inNo
height_inNo
irregularNo
length_inNo
packagingYesParcel
signatureNonone
weight_ozNo0 leaves the weight to each label.
media_mailNoQualifies for USPS Media Mail.
return_labelNoreturn: return labels only; standard_and_return: an extra return label.none
insured_value_usdNo
hazardous_materialsNo

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare mutation plus non-idempotent/openWorld, so the description adds real value on top: which packaging types require length_in/width_in/height_in, that flat-rate needs none, and that weight_oz 0 defers weight to each label. It does not say what happens on duplicate titles or whether the new package is returned.

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?

Three short sentences, front-loaded with the core action and followed by the constraints an agent actually trips over. The parenthetical field list is mildly redundant but nothing is wasted.

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 13-parameter mutation with no output schema, the description covers the highest-risk ambiguity (which dimensions each packaging type demands) and the weight_oz=0 escape hatch. Remaining gaps are secondary optional flags rather than call-blocking unknowns.

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 only 38% and several params (length_in, width_in, height_in, irregular, packaging, signature, insured_value_usd, hazardous_materials) carry no schema description. The text compensates well for the dimension and packaging params but leaves signature, insurance and hazardous-materials semantics entirely unexplained.

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?

States a specific verb+resource (creates a Saved Package) plus the payload it stores (type, size, weight, extra services) and where it appears in Settings. That distinguishes it from create_shipment and from the update/delete/list saved-package siblings, though no sibling is named explicitly.

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 conditional dimension rules imply when a given packaging choice is valid, and 'for reuse on labels' hints at the create-a-template-vs-one-off scenario. However it never says when to call this instead of update_saved_package or instead of passing dimensions directly to create_shipment, and no prerequisites are stated.

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

create_scan_formCreate SCAN FormAInspect

USPS End of Day SCAN Form for the labels of one Ship Date, as a PDF link.

Puts the USPS labels of one Ship Date and Ship From Address (or of one batch) that have no SCAN Form yet on a new SCAN Form and returns its PDF link. The carrier scans that one sheet instead of every package. No labels without a form: Pirate Ship answers with an error.

NameRequiredDescriptionDefault
batch_idNoOnly the labels of this batch (ignores ship_date).
ship_dateNoLabels of this Ship Date. Default: today.
from_address_idNoShip From Address, when you ship from more than one. Default: the default one.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations declare it is a non-read-only, non-idempotent, non-destructive write. The description adds real context beyond that: it consumes only labels that have no form yet (so repeat calls have less to work with), it returns a PDF link, and it errors when nothing is eligible. It stops short of saying whether an existing form can be regenerated or what the error payload looks like.

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?

Front-loaded: the first line gives the resource and the return value, then a sentence explains what gets put on the form and why the carrier benefits. The rationale sentence ('The carrier scans that one sheet instead of every package') is useful but slightly padded, so not a full 5.

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 three-optional-parameter creation tool with no output schema, the description covers the return value (PDF link), the selection semantics, and the error condition. Defaults and per-parameter meaning live in the schema, so nothing an agent needs in order to call it correctly is missing.

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

Parameters3/5

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

Schema coverage is 100%, so all three parameters (including defaults for ship_date and from_address_id) are already documented inline. The description only reinforces the either/or grouping of 'one Ship Date and Ship From Address (or of one batch)' without adding format or precedence detail beyond the schema's 'ignores ship_date' note, so baseline 3 applies.

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?

States a specific verb (create) and resource (USPS End of Day SCAN Form) and defines its scope: the labels of one Ship Date / Ship From Address, or of one batch. The output form (a PDF link) is named, so an agent can tell this apart from list_scan_forms or download_labels without opening the schema.

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

Usage Guidelines4/5

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

Explains the when: labels of one Ship Date plus Ship From Address, or one batch, that currently have no SCAN Form. It also names the prerequisite failure mode ('No labels without a form: Pirate Ship answers with an error'). It does not point at a sibling to use instead when no eligible labels exist, which keeps it 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.

create_ship_from_addressCreate ship-from addressAInspect

Adds a US Ship From Address, optionally with a separate return address.

Saves a new Ship From Address in Pirate Ship. Without return_address, returns go to the origin. Pirate Ship completes the ZIP+4. It does not become the default: call set_default_ship_from_address for that.

NameRequiredDescriptionDefault
titleYesName in the address list.
originYes
return_addressNoWhere returns go. Default: the origin.

TDQS

A4.1/5.0
Behavior4/5

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

Adds genuinely useful behavior beyond the annotations: US-only scope, that Pirate Ship normalizes and completes ZIP+4, that the new address is not made default, and that omitting return_address routes returns to the origin. It does not warn about duplicate creation, given idempotentHint=false, nor about the failure mode for invalid or non-US addresses, which leaves a gap for a mutation tool.

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?

Four short sentences, front-loaded with the action and followed by the two decision-relevant behaviors (return address fallback, ZIP+4 normalization) and the routing hint. Minor waste in the near-duplicate opening pair "Adds a US Ship From Address" and "Saves a new Ship From Address in Pirate Ship."

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?

With no output schema, an agent still learns the essential semantics of a create call: what entity is persisted, how the return address falls back, ZIP+4 normalization, and that defaults are untouched. Still missing is what the call returns (e.g., an identifier for later update/delete calls) and error behavior for non-US or invalid addresses.

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 67%, and the description's return_address default restates what the schema already documents ("Where returns go. Default: the origin."). Several nested origin fields (zip, city, phone, company, full_name) carry no description in either place, and the description adds no format or validation guidance beyond the schema's maxLength/minLength constraints, so it only marginally compensates.

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?

States a specific verb and resource ("Adds a US Ship From Address") plus scope (US-only, optional distinct return address), which clearly separates it from update_ship_from_address, list_ship_from_addresses, and set_default_ship_from_address among the siblings. An agent can identify the operation without opening the schema.

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

Usage Guidelines4/5

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

Explicitly routes the agent away from this tool for the default-address case: "It does not become the default: call set_default_ship_from_address for that." It also implies when to supply return_address. It stops short of naming exclusions against update_ship_from_address (editing an existing address) or what to do when the address already exists.

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

create_shipmentCreate shipmentAInspect

Unpaid draft label for one package with every rate; buy it with buy_label.

Pirate Ship's Single Shipment form up to Get Rates: makes a draft batch for one package from your ship-from address to the recipient and returns its rates (USPS and UPS services with your price, retail price, estimated delivery, possible ship dates). Nothing is charged; buy_label buys one of the rates, delete_batch drops the draft. Give the package as packaging, weight_oz and size, or package_preset_id of a saved package. When Pirate Ship suggests a corrected address and address_correction is ask, the answer is status address_correction with the suggestion and no draft: call again with accept or skip.

NameRequiredDescriptionDefault
toYes
width_inNo
height_inNo
length_inNo
packagingNoParcel
signatureNonone
weight_ozNoWeight in ounces.
ship_from_idNoShip-from address id; default: the account's default.
rubber_stamp_1NoExtra text printed on the label.
rubber_stamp_2No
insured_value_usdNo
package_preset_idNoA saved package: its type, size and weight replace the fields above.
address_correctionNoWhen Pirate Ship suggests a corrected address: ask returns the suggestion without a draft, accept ships to the suggestion, skip keeps the address as given.ask

TDQS

A4.2/5.0
Behavior4/5

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

Annotations only mark this as a non-read-only, non-destructive, open-world, non-idempotent call; the description adds the material economics ('Nothing is charged'), the draft-object lifecycle (buy_label / delete_batch), and a non-obvious edge case where the call returns status address_correction and no draft at all. It stops short of warning that each call produces a new draft batch, which matters for the declared idempotentHint=false.

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?

Front-loaded with the core identity ('Unpaid draft label... buy it with buy_label') and then fills in the rate payload, packaging alternatives and the correction branch. Dense but every sentence carries distinct information; the 'Pirate Ship's Single Shipment form up to Get Rates' framing is slightly wordy but earns its place by anchoring the workflow.

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 13-parameter mutation with a nested recipient object, no output schema and 38% schema coverage, the description covers the happy path and the address-correction detour well but says nothing about the shape of the returned rate list or how the remaining optional parameters (signature, insurance, rubber stamps) affect the draft. Adequate to call correctly, not 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 only 38% across 13 parameters, and the description compensates for some of it: it explains the packaging/weight_oz/size alternative to package_preset_id, the ship-from default, and the address_correction semantics. But signature, insured_value_usd, rubber_stamp_1/2, the length/width/height relationship, and the nested `to` fields are left entirely to an under-documented 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 first sentence gives a specific verb+resource+state ('Unpaid draft label for one package with every rate') and immediately names the follow-up tool (buy_label). The second sentence pins it to a concrete workflow ('Single Shipment form up to Get Rates') and states what comes back (USPS/UPS services with your price, retail price, delivery estimate, ship dates). An agent can separate this from get_rates, buy_label and delete_batch without opening any schema.

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

Usage Guidelines5/5

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

Explicitly states when this tool is the right one ('up to Get Rates'), what it does not do ('Nothing is charged'), and which siblings handle the next steps ('buy_label buys one of the rates, delete_batch drops the draft'). It also spells out the address-correction branch: call with ask to get a suggestion, then re-call with accept or skip. That is a full when/when-not/alternatives map.

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

delete_batchDelete batchA
Destructive
Inspect

Deletes an unpaid draft batch or single shipment.

Removes a draft from create_shipment (or any batch not yet bought) from Pirate Ship. Bought labels cannot be deleted: refund_label or refund_batch returns their cost.

NameRequiredDescriptionDefault
batch_idYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare destructive=true and idempotent=false, and the description adds genuinely new behavior: deletion is gated on the draft being unpaid, and bought labels will not be removed. It stops short of saying what the agent sees when the gate fails (error vs silent no-op) or that a batch delete removes multiple items at once.

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, the operation and its scope up front, the alternative path second. Nothing redundant and nothing buried.

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 destructive one-parameter mutation with no output schema, the description covers the safety constraint and the escape hatch, which is the core need. Minor gaps remain around failure behavior and batch-level scope, but nothing an agent needs before invoking it correctly is missing.

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 0% and the single required batch_id is undocumented, but the description partly compensates by attributing the batch to create_shipment/create_batch, implying where a valid identifier comes from. It gives no hint about identifier format or that list_batches/get_batch can supply one, so it adds only marginal meaning.

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?

States a specific verb and resource ("Deletes an unpaid draft batch") and ties the object back to its origin (create_shipment / create_batch), which separates it cleanly from refund_batch and the other siblings. The phrase "or single shipment" is a slight mismatch with a tool whose only parameter is batch_id, leaving a small ambiguity about whether shipment-level deletion is really supported by this call.

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?

Explicitly defines the usable domain (unpaid drafts, anything not yet bought) and the excluded domain (bought labels cannot be deleted), then routes the agent to refund_label or refund_batch for that case. Both the when and the when-not, with named alternatives, are present.

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

delete_email_templateDelete email templateC
Destructive
Inspect

Removes a tracking email template.

NameRequiredDescriptionDefault
template_idYesid from list_email_templates.

TDQS

C2.8/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true and idempotentHint=false, so the safety profile is carried by structured data. The description adds nothing beyond that: no statement that deletion is permanent, no indication of what happens to templates currently referenced by active tracking settings, and no error/permission behavior.

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

Conciseness3/5

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

One short, front-loaded sentence with no filler, but it is terse to the point of under-specification rather than genuinely efficient.

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?

For a destructive, non-idempotent mutation with no output schema, the description says nothing about consequences, irreversibility, or failure modes. An agent knows what the tool touches but not what it risks.

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 single parameter is documented in-schema with a useful provenance note ('id from list_email_templates'). The description contributes no additional parameter meaning, so the baseline 3 applies.

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?

States a specific verb ('Removes') and resource ('tracking email template'), which cleanly separates it from create_email_template, update_email_template, and list_email_templates. It does not explicitly name those siblings, but the verb alone makes the distinction unambiguous.

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 delete a template versus when to update it, and no mention of alternatives. The only hint at preconditions lives in the schema ('id from list_email_templates'), not the description.

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

delete_saved_packageDelete saved packageA
Destructive
Inspect

Removes a Saved Package. Labels made with it are not affected.

NameRequiredDescriptionDefault
package_idYesid from list_saved_packages.

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the safety profile is covered. The description adds one genuinely useful consequence — that existing labels made with the package survive — but says nothing about irreversibility, permissions, or what happens to shipments referencing the package.

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?

Two short sentences with no filler, and the primary action is front-loaded ahead of the side-effect caveat. It could name the alternative or prerequisite in the same space, but nothing is wasted.

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 one-parameter delete with full schema coverage, no output schema, and annotations covering the destructive/non-idempotent profile, this is nearly complete. The only real omission is confirmation or irreversibility guidance.

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% and the single parameter package_id is already documented as 'id from list_saved_packages.' The description adds no further meaning beyond the schema, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb (removes) and resource (Saved Package), which is unambiguous and distinct from siblings like create_saved_package, update_saved_package, and list_saved_packages. It does not explicitly name those siblings, but the verb makes the distinction obvious.

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

Usage Guidelines3/5

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

Deletion intent is implied by 'Removes', but there is no explicit when-to-use framing, no mention of when to use update_saved_package instead, and no prerequisites such as confirming the package is unused. Usage is inferable rather than stated.

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

delete_ship_from_addressDelete ship-from addressA
Destructive
Inspect

Removes a saved Ship From Address. The default address cannot be removed.

Deletes one Ship From Address from Settings. Labels already bought are not affected. Pirate Ship keeps at least one address and never deletes the default: make another one the default first.

NameRequiredDescriptionDefault
address_idYesid from list_ship_from_addresses.

TDQS

A4.3/5.0
Behavior5/5

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

Annotations already flag destructive=true, but the description adds genuinely new consequences: existing purchased labels are unaffected, at least one address is always retained, and the default is never deleted. These are exactly the side-effect and precondition details an agent needs beyond the hints.

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 prohibition on deleting the default is front-loaded correctly, and the four short sentences are easy to scan. There is mild redundancy, since 'the default address cannot be removed' is restated later as 'never deletes the default'.

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 one-parameter destructive tool with full annotation coverage and no output schema, the description covers the important constraints and the blast radius. It doesn't say what a failed delete returns (e.g., invalid or default id), which is a minor remaining gap.

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?

Only one parameter and the schema already documents it at 100% coverage, including the pointer to list_ship_from_addresses. The description adds no syntax or format detail beyond that, so the baseline of 3 applies.

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?

States a specific verb and resource ('Removes a saved Ship From Address') and scopes it to Settings, which cleanly separates it from create/update/list_ship_from_addresses and set_default_ship_from_address. An agent can identify the operation without opening the schema.

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

Usage Guidelines4/5

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

Gives an explicit precondition/exclusion: the default address cannot be removed and another address must be made default first, which implicitly routes to set_default_ship_from_address. It doesn't name that sibling tool explicitly, keeping it 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.

download_labelsDownload labelsA
Read-onlyIdempotent
Inspect

A download link for the printable labels of a batch or of chosen shipments.

Pirate Ship's Print Labels: builds one file with the bought, printable labels of batch_id or of shipment_ids, in the account's label size and format (Settings, Label Settings), and returns its link. Building takes a few seconds. Refunded labels and return labels that print later are left out.

NameRequiredDescriptionDefault
batch_idNoEvery printable label of this batch.
shipment_idsNo

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, so the safety profile is covered. The description adds genuinely useful context beyond that: building takes a few seconds, labels use the account's configured size/format, and refunded or later-printing return labels are excluded. That exclusion rule is information an agent could not infer from annotations.

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

Conciseness4/5

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

The lead sentence delivers the core purpose immediately, followed by two short supporting sentences on mechanics and exclusions. Slight redundancy in restating 'Pirate Ship's Print Labels' and the tool title, but no filler beyond that.

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?

With no output schema, the description properly explains what is returned (a link to a generated file), plus latency and exclusion rules. The remaining gap is the unaddressed empty-required-parameters situation: it never says at least one of batch_id or shipment_ids must be provided, nor how size limits affect behavior.

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 only 50% — shipment_ids has no inline description — so the description carries extra burden. It partially compensates by pairing batch_id with 'every printable label of this batch' and contrasting it against 'chosen shipments', but it does not clarify the either/or exclusivity, the 100-item cap, or what happens when no parameter is supplied.

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 first sentence gives a specific verb (download / build a file) and resource (printable labels), and scopes it to either a batch or chosen shipments. This clearly distinguishes it from sibling tools like get_batch, list_batches, and create_batch, which manage batch metadata rather than produce label files.

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 selection model (batch_id OR shipment_ids) but never states when to prefer one over the other, nor names any alternative tool for related tasks. Usage is hinted at ('of a batch or of chosen shipments') rather than prescribed.

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

export_reportExport reportA
Read-onlyIdempotent
Inspect

A CSV of the transactions, refunds, receipts, return labels or carrier adjustments report.

Builds the same spreadsheet as the Export button of the chosen Reports table, with every column of the matching list_ tool, for an optional date range and search. Returns a link to the CSV; no matching rows return empty true and no link. Shipments have their own tool, export_shipments.

NameRequiredDescriptionDefault
sortNonewest
reportYes
searchNoFree text, as in the report's search box.
to_dateNoLast day, YYYY-MM-DD, included.
from_dateNoFirst day, YYYY-MM-DD, in your timezone.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already carry readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds genuinely new behavior: it returns a link to a CSV, and when no rows match it returns empty=true with no link — a non-obvious outcome the agent would otherwise be surprised by.

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 no-results behavior and the sibling exclusion are front-loaded where an agent will read them. Slightly wasteful: the opening sentence is a sentence fragment and the 'every column of the matching list_ tool' clause is dense, but overall tight.

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?

With no output schema, the description does the work of explaining the return contract (a link, or empty=true and no link). That plus the date/search scoping makes it callable with confidence; only the sort param and column-set details are left implicit.

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 60%; search and both dates are documented in the schema, and the report enum is self-describing. The description adds framing (optional date range and search, columns mirror the list_ tool) but does not explain 'sort' or how report choice maps to available columns beyond a one-line mirror statement — baseline 3 for partially 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?

States a specific verb (export/builds a CSV) and the exact resources covered (transactions, refunds, receipts, return labels, carrier adjustments), and explicitly routes shipments to export_shipments. An agent can distinguish this from the list_* siblings and from export_shipments without opening the schema.

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

Usage Guidelines4/5

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

'Shipments have their own tool, export_shipments' names an explicit alternative and exclusion. It also positions itself against the matching list_ tool ('same spreadsheet as the Export button... every column of the matching list_ tool'), giving clear context, though it does not say when to prefer list_* over exporting.

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

export_shipmentsExport shipmentsA
Read-onlyIdempotent
Inspect

A CSV of the shipments report with every column, as a download link.

Builds the same spreadsheet as the Export button of Reports, Shipments: one row per label with every column (recipient and address, tracking, carrier and service, cost, package, batch, ship-from, order id, rubber stamps). Takes the filters of list_shipments. Returns a link to the CSV; a filter with no matching labels returns empty true and no link. Large exports can take up to a minute.

NameRequiredDescriptionDefault
sortNonewest
batchNoBatch titles.
searchNoFree text, as in the report's search box.
statusNoLabel status as the report shows it, e.g. Printed, Refunded.
carrierNoUSPS or UPS.
to_dateNoLast day, YYYY-MM-DD, included.
from_dateNoFirst day, YYYY-MM-DD, in your timezone.
tracking_statusNoTracking status as the report shows it, e.g. Delivered, In Transit.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already cover read-only/idempotent/non-destructive, and the description adds real behavioral value on top: the return contract (a link), the empty-result behavior (empty true and no link), and the latency warning that large exports can take up to a minute. Those are exactly the traits an agent needs before committing to the call.

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?

Front-loaded with the output artifact, then column composition, then filter semantics, then edge cases and latency. Every sentence carries information; nothing is restated from the schema or 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?

There is no output schema, and the description compensates fully by describing the return shape (link or empty), the failure/degenerate case, and the timeout expectation. Combined with 88% schema coverage for the 8 optional filters, an agent has everything needed to call this correctly.

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

Parameters4/5

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

Schema coverage is 88%, so the baseline is 3; the description earns an extra point by declaring that the entire filter set is inherited from list_shipments, which tells the agent the parameters behave identically to a sibling tool rather than being export-specific. It still does not add format hints for sort or date handling beyond what the schema 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?

States a specific verb (export), a specific artifact (CSV of the shipments report with every column) and the delivery form (download link). It anchors the tool to a known UI surface (Export button of Reports, Shipments) and enumerates the columns, so an agent can tell it apart from list_shipments and export_report without opening a schema.

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

Usage Guidelines4/5

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

"Takes the filters of list_shipments" gives clear context for when this is the right call (same filtering, file output instead of a JSON list). It does not explicitly say when to prefer list_shipments or export_report instead, so the exclusion side is left to inference.

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

get_account_balanceGet account balanceA
Read-onlyIdempotent
Inspect

Account Balance, Pending Refunds and Pending Returns from the Reports page.

The Pirate Ship account balance in US dollars (balance_settled_usd leaves out payments still settling), how many payment methods are saved, refunds and return labels still pending, and the last 30 days of labels as the Reports page shows them: label count, total, average and payments.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context beyond annotations: USD denomination, the meaning of balance_settled_usd excluding still-settling payments, pending counts, and the 30-day reporting window. It does not discuss auth or rate limits, but for a read-only aggregate with rich annotations this is solid.

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 appropriately sized for a zero-parameter report tool and front-loads the core scope. The first sentence is a fragment and 'Reports page' appears twice, but the second sentence efficiently enumerates the returned data without obvious filler.

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?

With no output schema, the description needs to explain what comes back, and it does: balance, saved payment method count, pending refunds/returns, and last-30-day label count/total/average/payments. It also clarifies the settling caveat on balance_settled_usd. It could be more precise about return field names and structure, but it is complete enough for an agent to understand the tool's output.

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?

The tool has zero parameters, so the baseline is 4. There are no parameter semantics to clarify, and the description appropriately does not invent any.

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?

The description identifies a specific aggregate read: account balance, pending refunds/returns, saved payment methods, and last-30-day label metrics from the Reports page. It is not a bare restatement of the name, though it is phrased as a noun list rather than a clear action. It broadly distinguishes itself from list-oriented siblings by describing a combined Reports-page summary, but does not explicitly name alternatives.

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?

Usage is implied by 'from the Reports page' and by the aggregate nature of the returned data. However, the description does not state when to use this tool instead of siblings such as list_refunds, list_return_labels, list_transactions, or get_shipping_stats. No explicit exclusions or routing guidance are provided.

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

get_batchGet batchA
Read-onlyIdempotent
Inspect

A draft or bought batch: shipments, tracking, rates to buy, what can be refunded.

One Pirate Ship batch: a single label from create_shipment is a batch of one. A draft (step Rated) lists every rate the packages qualify for, with rate_id for buy_label. A bought batch (Billed) shows each shipment's status, tracking number and link, whether its label can be printed or refunded, and what was paid per service.

NameRequiredDescriptionDefault
batch_idYesFrom create_shipment or list_batches.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already establish readOnly, idempotent, non-destructive. The description adds genuine state-dependent behavior beyond that: a Rated draft lists all qualifying rates with rate_id, while a Billed batch reports per-shipment status, tracking, print/refund eligibility and amount paid per service. It stops short of noting any auth or rate-limit considerations.

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?

Two sentences, front-loaded with the subject before the exposition. Dense but every clause carries information; the long second sentence is justified by the distinct draft vs bought payload differences.

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?

No output schema exists, so the description bears full responsibility for describing return values — and it does so thoroughly for both states, including the fields an agent would need to act on (rate_id, tracking, print/refund flags). Nothing essential to calling or interpreting the result is missing.

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?

Only one parameter with 100% schema description coverage, so the schema already carries batch_id's origin ('From create_shipment or list_batches'). The description adds no further semantics about the identifier, so baseline 3 applies.

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?

States a specific resource (a single Pirate Ship batch) and enumerates its contents, distinguishing draft (Rated) from bought (Billed) states. It does not name a sibling like list_batches as the contrasting alternative, which keeps it just short of a 5.

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

Usage Guidelines3/5

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

Usage is implied rather than stated: 'rates to buy' with rate_id points forward to buy_label, and the schema notes batch_id comes from create_shipment or list_batches. There is no explicit when-to-use-this-vs-list_batches guidance or exclusions.

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

get_label_settingsGet label settingsA
Read-onlyIdempotent
Inspect

Label size and file format, packing list, logo, QR codes, address correction, export format.

The account's Settings, General: the size and file format new labels are made in, whether a packing list prints with them, the logo on the label, USPS label-free QR codes, what happens when Pirate Ship finds a better address, and the spreadsheet format of report exports.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld, and non-destructive behavior, so the safety profile is covered. Beyond that, the description discloses the concrete data returned—the six setting categories—which is valuable because there is no output schema, though it does not describe response shape or auth requirements.

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

Conciseness3/5

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

The description is front-loaded, but the first line is a shorthand list that the second sentence repeats in expanded form: size/file format, packing list, logo, QR codes, address correction, and export format. It is not excessively long, but the duplication costs efficiency.

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 zero-parameter read-only settings getter with rich annotations, the description covers the settings returned and makes the tool callable. Only a formal response shape is absent, which is not critical without an output schema.

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 zero parameters, so there are no parameter semantics to explain. The schema already establishes this, and the description correctly does not invent parameters.

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

Purpose4/5

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

The description enumerates the exact settings returned (label size/file format, packing list, logo, QR codes, address correction, export format) and situates them under 'Settings, General', so the resource is unambiguous. It does not explicitly contrast with the sibling update_label_settings, so it stops short of 5.

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 sentence says when to call this instead of update_label_settings or any other sibling. The field list only implies it is a read of general settings, with no prerequisites, exclusions, or alternative guidance.

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

get_pickup_quoteGet pickup quoteA
Read-onlyIdempotent
Inspect

What a USPS or UPS pickup would cost; USPS pickups are free. Nothing is booked.

Prices one pickup without booking it. USPS collects for free on the next delivery day. UPS charges per pickup and needs a date and a ready and close time; surcharges are listed apart.

NameRequiredDescriptionDefault
dateNoUPS only: pickup day. USPS comes next delivery day.
carrierYes
locationNoFRONT_DOOR
close_timeNoUPS only.17:00
overweightNoUPS: a package over 70 lb.
ready_timeNoUPS only.09:00
instructionsNoWhere to find the packages, with OTHER.
ship_from_idNoFrom list_ship_from_addresses. Default: the default one.
package_countYes
total_weight_ozYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the description's job is to add context - and 'Nothing is booked' plus 'surcharges are listed apart' tell the agent what the call does and does not commit to, and that the response separates base price from surcharges. It stops short of saying how surcharges are returned or whether quotes expire.

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

Conciseness3/5

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

The lead sentence is front-loaded and the carrier conditions come after, which is the right order, but the second paragraph repeats the first almost verbatim ('Nothing is booked' / 'without booking it'; 'USPS pickups are free' / 'USPS collects for free'). Roughly a third of the text is redundant.

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 10-parameter, read-only, no-output-schema tool the description covers the decisions that matter: no booking occurs, USPS is free and next-day, UPS requires a date and a pickup window, and surcharges are reported separately. The main residual gap is the shape of the returned price/surcharge data, which the description only gestures at.

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?

At 60% schema description coverage the schema already explains the carrier-conditional fields (date, ready_time, close_time, overweight all marked 'UPS only'), and the description largely restates that dependency. It adds genuine meaning for carrier choice - USPS is free and arrives next delivery day, so those parameters go unused - but package_count, total_weight_oz, location and instructions get no description-level treatment 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 opening sentence names a specific resource (a USPS or UPS pickup) and a specific operation (what it would cost), and immediately rules out the adjacent action with 'Nothing is booked.' That scope plus the free-USPS vs. paid-UPS split lets an agent separate it from list_pickups and from any booking flow without opening the schema.

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

Usage Guidelines4/5

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

'Prices one pickup without booking it' and 'Nothing is booked' clearly establish this as a quoting step, and the UPS prerequisites (date, ready and close time) tell the agent what must be supplied to get a valid quote. It never names a sibling as the alternative for the booking step, so the when-not-to-use half is only implied.

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

get_ratesGet ratesA
Read-onlyIdempotent
Inspect

USPS and UPS services with price for one package, cheapest first.

Pirate Ship's Quick Rate Quote: every USPS and UPS service that can carry one package from your default ship-from address to to_zip, with your price and the retail price, the zone and the estimated delivery. Weight in ounces (2 lb = 32). Parcel, SoftEnvelope and Irregular need length_in and width_in, a box also height_in: size changes the price (cubic and dimensional pricing). Flat rate envelopes and boxes need only the weight. Services that cannot carry the package are left out. Nothing is bought.

NameRequiredDescriptionDefault
to_zipYesDestination ZIP or postcode.
width_inNo
height_inNo
length_inNo
packagingNoParcel
weight_ozYesWeight in ounces.
to_countryNoDestination country, ISO 3166-1 alpha-2.US
residentialNoThe destination is a home.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and openWorld, so the safety profile is covered. The description adds real behavioral context beyond that: which fields come back (your price, retail price, zone, estimated delivery), the cheapest-first ordering, that services unable to carry the package are excluded, and that no purchase occurs. It doesn't mention rate staleness, caching, or error conditions when no ship-from exists.

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?

Front-loaded with the one-line essence before the detail paragraph, and every sentence conveys a distinct fact (units, dimension rules, filtering, no purchase). A few clauses are packed together densely, but there is no filler.

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?

With no output schema, the description steps in to describe the returned fields and their ordering, and it covers the conditional parameter requirements and unit conventions for an 8-parameter tool. An agent has enough to call it correctly and interpret the results without further documentation.

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 description coverage is only 50%, so the description carries useful weight: it ties packaging values to their required dimensions ('Parcel, SoftEnvelope and Irregular need length_in and width_in, a box also height_in'), notes flat-rate packaging needs only weight, and clarifies the ounce unit with a conversion example. It doesn't explain residential or to_country behavior, so it stops short of full compensation.

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?

Names a specific action and resource: a rate quote ('Pirate Ship's Quick Rate Quote') for USPS and UPS services for one package, sorted cheapest first, and closes with 'Nothing is bought' to separate it from the shipment-creation siblings. It's clearly distinguishable from create_shipment and get_pickup_quote without opening the schema, though it never names an alternative tool.

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?

Usage is implied: rate quoting is the pre-purchase step, and 'Nothing is bought' signals it's safe to call repeatedly. But there is no explicit when-to-use or when-not, no mention of prerequisites like a configured default ship-from address, and no pointer to a sibling such as get_pickup_quote or create_shipment.

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

get_receiptGet receiptA
Read-onlyIdempotent
Inspect

One payment to Pirate Ship with its billing address and the labels it paid for.

The receipt page of one payment from list_receipts: title, status, total and refunded amount in US dollars, the billing address, the balance before and after, every transaction it covered (labels, refunds, adjustments, with batch_id and shipment_id) and reversals such as chargebacks.

NameRequiredDescriptionDefault
receipt_idYesreceipt_id from list_receipts.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnly, idempotent, non-destructive), and the description goes well beyond them by enumerating the returned payload: title, status, USD totals and refunded amount, billing address, before/after balance, every covered transaction with batch_id and shipment_id, and reversals such as chargebacks.

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?

Two sentences, front-loaded with the resource definition, and the second sentence is a dense but purposeful enumeration of the receipt's fields. Slightly long but nearly every clause carries information the agent needs.

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?

There is no output schema, so the description must carry the return-value burden, and it does: an agent knows precisely which fields come back for a receipt and how transactions relate to batches and shipments. Nothing needed to call or interpret the result is missing.

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 single parameter is documented in-schema as coming from list_receipts, so the description's repetition of that origin adds nothing new. Baseline 3 applies when the schema does all the work.

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?

States a specific verb+resource ('one payment to Pirate Ship') and defines exactly what a receipt contains, then explicitly positions it as 'the receipt page of one payment from list_receipts', which separates it from the list sibling without requiring schema inspection.

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 phrase 'of one payment from list_receipts' tells the agent this is the detail view and where the identifier originates, giving clear usage context. It stops short of explicit when-not guidance or naming alternatives for related data like list_transactions or list_refunds.

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

get_shipmentGet shipmentA
Read-onlyIdempotent
Inspect

One shipment with tracking, service, cost, recipient and carrier adjustments.

The shipment page of a Pirate Ship label: status, carrier and service, zone, tracking number and link, recipient, package, base and total cost with surcharges and insurance in US dollars, estimated delivery, the store order it came from, whether it can be printed or refunded, and carrier adjustments (weight or size the carrier corrected, with the price change and dispute state).

NameRequiredDescriptionDefault
batch_idNoSaves one request when known.
shipment_idYesFrom get_batch or list_shipments.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the bar is lower, and the description still adds real value: costs are in US dollars, adjustments include the carrier-corrected weight/size with price delta and dispute state, and it discloses print/refund eligibility flags. It does not cover pagination or partial-failure behavior, but for a read-only fetch that is minor.

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

Conciseness4/5

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

A one-line summary is front-loaded ahead of the field inventory, which is appropriate given there is no output schema. The second sentence is long but each listed field earns its place as the only documentation of the return payload; no filler.

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?

With no output schema, the description carries the return-value burden and does so thoroughly: status, carrier/service/zone, tracking, recipient, package, cost breakdown with surcharges and insurance, estimated delivery, originating order, print/refund capability, and carrier adjustments. An agent knows what it will get without opening anything else.

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 both shipment_id and the optional batch_id are already documented in the schema (including batch_id's 'saves one request when known' purpose). The description adds no parameter syntax or constraints beyond that, so the baseline 3 applies.

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

Purpose4/5

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

Opens with a specific verb-and-resource statement (one shipment with tracking, service, cost, recipient, carrier adjustments) and the second sentence enumerates exactly what the single record contains. It implicitly contrasts with list_shipments by saying 'One shipment', though it never names the sibling explicitly.

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?

Usage is only implied: fetch a single shipment by id. There is no statement of when to prefer this over list_shipments or get_batch, and no prerequisites; the only routing hint lives in the shipment_id schema text ('From get_batch or list_shipments'), not the description.

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

get_shipping_statsGet shipping statsA
Read-onlyIdempotent
Inspect

Labels, spend, savings, tracking and where packages went for a date range, as on Reports.

Everything the Reports page charts for a date range (default the last 30 days, at most a year): label count, total and average cost (domestic and international), payments, carrier adjustments, savings against retail, pending refunds and returns, tracking states, labels and average cost per day, the carrier split, labels per zone and per US state and country. Money is in US dollars.

NameRequiredDescriptionDefault
to_dateNoLast day, YYYY-MM-DD, included. Default today.
from_dateNoFirst day, YYYY-MM-DD. Default 30 days ago.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and open-world, so the safety profile is covered. The description still adds real behavioral context: the 30-day default, the one-year ceiling, and the USD denomination of all money values. It does not describe response shape or size, which keeps it at 4 rather than 5.

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

Conciseness4/5

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

The opening clause front-loads what the tool returns and the date-range scope before the metric enumeration. The long list of charts is dense but each item earns its place as return-value specification given there is no output schema; only the 'as on Reports' phrasing is slightly redundant with the second sentence.

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?

With no output schema, the description carries the burden of describing returns and does so thoroughly: metric families, currency, default window, and maximum span. What is missing is the response structure and whether the data is grouped or flat, a moderate gap for a report-style tool.

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% and both date parameters are documented with format and defaults, so baseline would be 3. The description adds the one-year maximum span, a constraint absent from the schema, plus the default window, which is meaningful guidance for setting the range.

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?

The description names the resource (a Reports-style aggregate over labels, spend, savings, tracking and destinations) and scopes it to a date range, which is materially different from the list_* siblings that return individual records. It never names an alternative explicitly, but the enumerated metric set makes the aggregate nature unmistakable.

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?

It gives the operating envelope (default last 30 days, at most a year) and anchors the tool to 'as on Reports', which implies when it is appropriate. It does not say when to prefer this over export_report, list_transactions or list_carrier_adjustments, leaving the routing decision to inference.

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

get_tracking_email_settingsGet tracking email settingsB
Read-onlyIdempotent
Inspect

Whether recipients get tracking emails by default, how long after purchase, and the template.

enabled: new labels send a tracking email to the recipient by default. delay: when it goes out after the label is bought (delay_label as Pirate Ship shows it). branding: Pirate Ship's branding in the email. default_template_id: the template from list_email_templates used.

NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is fully covered by structured data. The description adds semantic meaning for each returned field (e.g. 'delay: when it goes out after the label is bought'), which is genuinely useful context. It says nothing about scope (account-wide vs. per-store) or error behavior, so it stops short of rich behavioral disclosure.

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

Conciseness3/5

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

It is short and has no filler, but it is not front-loaded: the opening sentence is a fragment that reads like a continuation, and the reader must reach the field list to understand this is a settings read. 'delay_label as Pirate Ship shows it' is internal jargon that costs a sentence without adding much precision.

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?

There is no output schema, so documenting the four returned fields (enabled, delay, branding, default_template_id) is exactly the right compensation and is largely present. Missing only the shape (a single settings object) and the scope of the settings (account-level?). Given zero parameters and full annotation coverage, this is close to 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?

The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline is 4. The field explanations it does provide describe return values rather than inputs, which is appropriate for a no-arg getter.

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

Purpose3/5

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

The description never states a verb or framing like 'Returns the account's default tracking-email settings'; it opens with a sentence fragment describing the subject matter. The field list (enabled, delay, branding, default_template_id) does imply a read of tracking-email configuration, so purpose is inferable but not stated. It is distinguishable from update_tracking_email_settings only by the tool name, not the text.

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?

There is no guidance on when to call this versus update_tracking_email_settings (the obvious mutation counterpart) or list_email_templates, even though the description mentions templates. The only routing hint is that default_template_id comes 'from list_email_templates', which is a reference, not a usage rule. No preconditions or exclusions are given.

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

ignore_ordersIgnore ordersAInspect

Hides store orders from the Import list without shipping them.

They move to the ignored list (list_import_orders with ignored true); unignore_orders brings them back.

NameRequiredDescriptionDefault
order_idsYesOrder ids from list_import_orders.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare non-read-only, non-destructive, non-idempotent; the description adds the essential behavioral facts: orders are moved rather than deleted, no shipment is created, and the action is reversible via unignore_orders. It doesn't cover edge behavior such as already-ignored or invalid ids, which matters given idempotentHint=false.

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 tight sentences with the core action front-loaded and the follow-up routing appended. Every clause carries information; nothing is padding.

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 single-parameter reversible mutation with no output schema, the definition covers what it does, where orders go, and how to reverse it. The remaining gap is response/error behavior — whether a confirmation or count is returned and how invalid ids are handled — which an agent would otherwise have to discover by calling.

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 order_ids property already explains its source (list_import_orders). The description adds nothing about batch semantics — the 500-item cap, partial-failure behavior, or what happens with ids already ignored — so it sits at the baseline.

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?

States a specific verb and resource with scope: "Hides store orders from the Import list without shipping them." It also distinguishes itself from the two most confusable siblings by naming list_import_orders (for viewing) and unignore_orders (for reversal).

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?

Gives clear operating context — use this to remove orders from the Import list without creating shipments — and names the sibling used to view the result and the sibling used to undo. It stops short of explicit when-not guidance (e.g. when to delete vs ignore), so not a 5.

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

list_batchesList batchesA
Read-onlyIdempotent
Inspect

Latest batches and single labels, newest first, with status and tracking counts.

The batches on Pirate Ship's Ship page, newest first: drafts (RATED), bought (BILLED) and refunded, each with its shipment count, status text, the first shipment's tracking number and how many shipments are delivered, in transit, ready to print, refunded or failed. page 0 is the newest; an empty list means no more pages. get_batch gives one in full.

NameRequiredDescriptionDefault
pageNo0 is the newest page.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the description's job is lighter; it adds real behavioral detail such as pagination termination semantics and the exact per-item fields returned (status text, first shipment's tracking number, per-status counts). One blemish: the opening 'and single labels' is never explained and slightly conflicts with the body, which describes only batches.

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?

Front-loaded with purpose and ordering, then details, then the sibling pointer — a sensible order. There is mild redundancy: 'newest first' appears in both the first clause and again in 'The batches on Pirate Ship's Ship page, newest first'.

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?

With no output schema, the description carries the burden of explaining return shape and does so thoroughly (counts, statuses, tracking number, per-status tallies). The only incompleteness is the unexplained 'single labels' phrase, which leaves ambiguity about whether non-batch labels can appear.

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% and already says '0 is the newest page', but the description adds the meaning that an empty list signals exhaustion, which the schema cannot express. Only one parameter exists, so there is little more to say.

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?

States a specific verb+resource (list batches) plus scope and ordering (newest first, status and tracking counts). It also names get_batch as the single-item counterpart, so an agent can distinguish it from the sibling without opening a schema.

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

Usage Guidelines4/5

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

The final sentence routes detailed single-batch lookups to get_batch, and the 'empty list means no more pages' note tells the agent when to stop paging. It lacks an explicit 'use this when you need an overview rather than counts/stats' exclusion, but the context is clear.

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

list_carrier_adjustmentsList carrier adjustmentsA
Read-onlyIdempotent
Inspect

Extra charges or credits the carrier made after a label was used, with old and actual package.

The Reports, Carrier Adjustments table: when USPS or UPS measured a package differently from the label (weight, size, package type, zone, ZIP), the old and actual values, the old and new cost and the adjustment in US dollars, and whether it was disputed. dispute_adjustment disputes one by shipment_id.

NameRequiredDescriptionDefault
sortNonewest
limitNo
offsetNo
searchNoFree text, as in the report's search box.
statusNoAdjustment status as the table shows it.
carrierNoUSPS or UPS.
to_dateNoLast day, YYYY-MM-DD, included.
from_dateNoFirst day, YYYY-MM-DD, in your timezone.

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds genuine value by disclosing what each record contains (old vs actual measurement, old vs new cost, USD adjustment, dispute status) and by pointing to the dispute path, though it says nothing about result volume or ordering behavior.

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

Conciseness3/5

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

The lead sentence is a fragment ('with old and actual package') and the second is a dense run-on that restates the old/actual idea twice (values and costs). The content is mostly substantive, but the phrasing costs readability without adding precision.

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?

With no output schema, the description does the work of explaining what a returned adjustment looks like, which is the most important gap it could fill for a read-only list tool. What remains missing is pagination/return-shape behavior and filter semantics, both of which an agent must open the schema to learn.

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?

Eight parameters and only 63% schema description coverage, yet the description explains none of them — no mention of sort, limit, offset, status, carrier arrays, or the from_date/to_date semantics. The field list (weight, size, package type, zone, ZIP, costs, dispute flag) describes record contents, not filter inputs, so it does not compensate for the schema gap.

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?

The description defines the resource concretely: extra charges or credits a carrier applied after a label was used, arising from measurement discrepancies. That is far more than a restatement of the name and lets an agent distinguish it from list_refunds or list_transactions, though it never explicitly names those siblings.

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?

It implies the use case (carrier re-measured weight/size/package type/zone/ZIP versus the label) but never states when to call this versus other listing tools or report exports. The one routing cue is a follow-up action: 'dispute_adjustment disputes one by shipment_id,' which tells the agent where to go after listing, not whether to list now.

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

list_email_templatesList email templatesA
Read-onlyIdempotent
Inspect

Tracking email templates: subject, sender, HTML body; one is the default.

The templates Pirate Ship uses for the tracking emails it sends to recipients of your labels: name, subject, sender name and reply-to email, BCC address and the HTML body with placeholders such as [Tracking #]. default marks the one used for new labels.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds real semantic context beyond that: the field inventory, the [Tracking #] placeholder convention in the HTML body, and the meaning of the 'default' marker as the template applied to new labels. It says nothing about ordering or pagination, but with a zero-parameter collection endpoint that is a minor omission.

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

Conciseness3/5

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

The first line ('subject, sender, HTML body; one is the default') is essentially restated by the second line's fuller field list, so roughly a sentence of the two is redundant. The content is front-loaded and bounded, but the duplication costs it.

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?

With no output schema, the description carries the burden of describing return values, and it does so by enumerating name, subject, sender name, reply-to email, BCC address, HTML body and the default flag. For a no-parameter list tool with full annotation coverage this is close to complete; only ordering/paging behavior is unaddressed.

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?

The tool takes no parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. The description instead spends its words on the returned shape, which is the right allocation here.

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?

The description names the resource precisely (the tracking email templates Pirate Ship sends to label recipients) and enumerates the fields each record carries, so the agent knows exactly what it gets back. It never states the verb 'list' outright — that comes only from the title — and it doesn't distinguish itself from siblings like get_tracking_email_settings or create_email_template, so it is clear but not sibling-differentiating.

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?

Usage is implied by the framing ('templates ... used for new labels'), which tells the agent these are the records backing tracking-email configuration. There is no explicit when-to-use statement, no exclusion, and no pointer to create_email_template / update_email_template / delete_email_template as alternatives for the mutation paths.

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

list_import_ordersList import ordersA
Read-onlyIdempotent
Inspect

Unshipped orders from your connected store integrations, as in the Import grid.

Orders imported from connected stores that still need a label: one row per order with the grid's columns (order number, recipient, items, store). ignored true lists the orders you hid with ignore_orders. Run sync_store_orders first for the newest. Use order ids in create_batch_from_orders.

NameRequiredDescriptionDefault
limitNo
offsetNo
searchNoFree text, as in the report's search box.
ignoredNoShow the ignored orders instead.

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=false, so the safety profile is covered; the description adds real value beyond that by disclosing freshness dependency on sync_store_orders and the shape of each returned row. It does not describe pagination behavior or how much data a page holds, leaving one gap.

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?

Front-loaded with the core definition and dense with useful detail; every sentence carries information. It slips into sentence fragments ('ignored true lists the orders you hid...') that read slightly clipped, but nothing is filler.

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?

With no output schema, the description correctly takes on return-shape duty by naming the grid columns. It omits default page size and total-count behavior, which matters for a paginated list, so it is strong but not fully 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?

At 50% schema coverage, limit and offset are undocumented in both the schema and the description. The text does add meaning for ignored ('lists the orders you hid with ignore_orders'), clarifying beyond the schema's 'Show the ignored orders instead,' but nothing explains search or paging semantics, so compensation is partial.

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?

States a specific verb and resource with tight scope: unshipped orders from connected store integrations, 'one row per order with the grid's columns (order number, recipient, items, store).' That distinguishes it from list_shipments and list_batches by domain, though it never names a sibling it is not, so it stops short of a 5.

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

Usage Guidelines4/5

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

Gives explicit workflow context: 'Run sync_store_orders first for the newest' and 'Use order ids in create_batch_from_orders,' plus the condition that ignored=true surfaces orders hidden by ignore_orders. It offers no exclusion ('don't use this when...'), so it reads as clear context without alternatives rather than full when/when-not guidance.

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

list_package_typesList package typesA
Read-onlyIdempotent
Inspect

Packaging types per carrier (box, envelope, flat rate) and the size and weight limits.

The packaging keys get_rates and saved packages take, per carrier, with which measurements each needs, plus Pirate Ship's limits: maximum weight in ounces and side lengths in inches.

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=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is fully covered. The description adds substantive content context — the output is grouped per carrier and includes measurement requirements and Pirate Ship's maximum weight in ounces and side lengths in inches. It does not describe the return shape (flat list vs. carrier-keyed map), leaving a modest gap.

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?

Two sentences, front-loaded with the core resource statement, and no filler. The second sentence is grammatically dense ('the packaging keys get_rates and saved packages take, per carrier, with which measurements each needs') and takes a second read, but every clause carries 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?

With no output schema and no parameters, the description must carry the return-content burden, and it does: it names the fields (packaging type, size/weight limits, required measurements) and the units (ounces, inches). Only the concrete structure of the returned collection is unspecified, which is a minor omission for a reference-list tool.

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?

The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. Repeating the 'per carrier' scoping is consistent with the parameterless signature.

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?

States a specific resource — packaging types per carrier (box, envelope, flat rate) plus their size/weight limits — so the agent knows exactly what reference data it returns. It also ties the output to the siblings that consume it (get_rates, saved packages), which helps separate it from list_saved_packages, though it never explicitly says 'this is not 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 Guidelines4/5

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

The description establishes clear context by naming what the keys feed into ('the packaging keys get_rates and saved packages take'), implying an agent should consult this before calling get_rates or create_saved_package. It stops short of an explicit when-to-use/when-not-to-use instruction, but the consumer linkage is strong enough to guide selection.

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

list_pickupsList pickupsA
Read-onlyIdempotent
Inspect

Your scheduled and past USPS and UPS pickups with confirmation numbers.

Every carrier pickup on the account: carrier, day and time window, status, confirmation number, package count and weight in ounces, where the driver finds them, the price (USPS is free) and whether it can still be cancelled with cancel_pickup.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and open-world, so the safety profile is covered; the description adds real signal beyond that by enumerating what comes back, noting USPS pickups are free, and flagging per-row cancellability. It stops short of saying how far back 'past' pickups extend, whether there is pagination or ordering, or auth/account scoping.

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?

Front-loaded lead sentence names the resource and scope immediately, and the second sentence is a dense but justified field inventory given the absence of an output schema. It reads as a long run-on list and could be punctuated as bullets, but no sentence is filler.

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?

With no output schema and no parameters, the description carries the return-value burden and does it well: carrier, time window, status, confirmation number, package count/weight, location, price and cancellability. Missing only history window, result ordering and any pagination/limit behavior.

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?

The tool takes zero parameters, so there is nothing for the description to clarify and the baseline applies. The field list it does provide documents the response, not inputs, and is not wasted, but it cannot raise the parameter dimension further.

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?

States a specific resource (scheduled and past USPS and UPS pickups on the account) with concrete attributes (confirmation numbers, day/time window, status). The reference to cancel_pickup signals it is the read/list counterpart to a mutation, so an agent can distinguish it from the other pickup-related sibling, get_pickup_quote.

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?

Usage is implied rather than stated: 'Every carrier pickup on the account' plus 'whether it can still be cancelled with cancel_pickup' tells the agent this is the discovery step before cancelling. But there is no explicit when-to-use or when-not, and the sibling get_pickup_quote (for pricing a new pickup) is never mentioned, leaving that boundary to inference.

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

list_receiptsList receiptsA
Read-onlyIdempotent
Inspect

Payments made to Pirate Ship, newest first; get_receipt shows one.

The Reports, Receipts table: each payment the account made (card, PayPal, bank) with its status, description and total in US dollars. Pass receipt_id to get_receipt for the labels it paid for.

NameRequiredDescriptionDefault
sortNonewest
limitNo
offsetNo
searchNoFree text, as in the report's search box.
statusNoPayment status as the table shows it.
to_dateNoLast day, YYYY-MM-DD, included.
from_dateNoFirst day, YYYY-MM-DD, in your timezone.

TDQS

A4.1/5.0
Behavior4/5

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

The annotations already establish that this is a safe, idempotent read operation. The description adds useful behavioral context by stating that results are newest first, that payments may come from card, PayPal, or bank, and that each row includes status, description, and total in US dollars. It does not discuss pagination limits or rate limits, but with annotations covering the safety profile this is a solid addition.

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 short and front-loaded: the purpose and sibling distinction come first, followed by the table context and the downstream get_receipt use. Every sentence provides useful information without 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?

For a filterable list tool with no required parameters and no output schema, the description supplies enough context to understand what records are returned and how this differs from get_receipt. It leaves pagination and most filter semantics to the input schema, but the overall definition remains usable.

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

Parameters2/5

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

The description only indirectly covers one parameter by saying results are 'newest first,' which aligns with the sort default. It does not explain limit, offset, or the filtering behavior for search, status, from_date, or to_date, and with only 57% schema description coverage it does not compensate for the parameters whose schemas lack 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 identifies the resource as payments made to Pirate Ship and states the default ordering. It also explicitly distinguishes the single-record sibling tool by saying 'get_receipt shows one,' so an agent can tell list_receipts apart from get_receipt without opening either schema.

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

Usage Guidelines4/5

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

The description gives clear context for using this tool: it lists account payments, while get_receipt shows a single receipt. It routes the agent to get_receipt when a receipt_id is available, but it does not explicitly exclude related listing tools such as list_transactions or list_refunds.

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

list_refundsList refundsB
Read-onlyIdempotent
Inspect

Label refunds with their status and amount, newest request first.

The Reports, Refunds table: every label refund the account asked for (or Pirate Ship made automatically for an unused label), when it was requested, approved, declined or reversed, the tracking number, recipient and amount in US dollars. from_date and to_date narrow by the request day.

NameRequiredDescriptionDefault
sortNonewest
limitNo
offsetNo
searchNoFree text, as in the report's search box.
statusNoRefund status as the table shows it, e.g. Pending, Approved, Declined.
to_dateNoLast day, YYYY-MM-DD, included.
from_dateNoFirst day, YYYY-MM-DD, in your timezone.

TDQS

B3.2/5.0
Behavior4/5

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

Annotations already establish read-only, idempotent, non-destructive behavior, and the description adds useful context about what the table contains, including automatic refunds and the fields returned. It does not discuss pagination behavior or any rate-limit considerations, but the annotation coverage lowers that burden.

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 short and front-loads the resource and ordering behavior. The second sentence is dense but useful; there is minor redundancy between the first and second sentences.

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?

There is no output schema, so the description does a fair job naming the returned refund fields and date-filtering behavior. However, for a 7-parameter list tool it leaves pagination, search, status filtering, and sort semantics under-explained.

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

Parameters2/5

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

Schema description coverage is 57%, so the description should compensate for undocumented parameters. It explains only that from_date and to_date narrow by request day and implies newest-first ordering, but does not add meaning for limit, offset, search, status, or the oldest sort option.

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?

The title and description make clear this returns label refund data, including status, amount, timing, tracking number, and recipient. The resource is specific, but the description does not explicitly distinguish it from nearby list/export/report siblings such as list_transactions or export_report.

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?

The description frames the tool as the Reports > Refunds table but gives no explicit when-to-use guidance, prerequisites, exclusions, or alternatives. An agent can infer it is for viewing refunds, but must guess when to choose it over export_report or other list tools.

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

list_return_labelsList return labelsB
Read-onlyIdempotent
Inspect

Pay-on-use return labels and whether a customer used them.

The Reports, Return Labels table: every return label made with a shipment, its status (unused labels cost nothing), the address it goes back to and what was charged in US dollars when it was used.

NameRequiredDescriptionDefault
sortNonewest
limitNo
offsetNo
searchNoFree text, as in the report's search box.
statusNoReturn label status as the table shows it.
to_dateNoLast day, YYYY-MM-DD, included.
from_dateNoFirst day, YYYY-MM-DD, in your timezone.

TDQS

B3/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, non-destructive and open-world, so the safety profile is covered. The description adds genuinely useful domain behavior: unused labels cost nothing, so the result set includes zero-cost rows, plus what each row carries (status, return address, USD charge). It says nothing about ordering defaults, page size limits, or result size, which matters for a list endpoint.

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?

Short and front-loaded: the first sentence states the resource and the key fact (whether the customer used the label), the second enumerates the columns. Minor redundancy between 'Return Labels table' and 'every return label made with a shipment', but no wasted sentences.

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?

With seven optional parameters and no output schema, the description usefully enumerates what comes back (status, return address, USD charge), which is a real contribution. It is still incomplete on filter semantics, pagination defaults and ordering, leaving the agent to read the schema for anything beyond row content.

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

Parameters2/5

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

Schema description coverage is only 57% — search, status and the two date fields are documented, but sort, limit and offset have no schema description. The description compensates for none of this: it never mentions filtering by status, date-range scoping, pagination, or sort order, despite 'newest' being the default sort.

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?

The description identifies the resource precisely — pay-on-use return labels, their usage status, return address and USD charge — and frames it as the 'Reports, Return Labels table'. That is enough to distinguish it from shipment, refund and receipt listings. It never states a verb ('list') and doesn't name a sibling it displaces, so it stops short of 5.

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?

There is no explicit when-to-use, when-not-to-use, or alternative (e.g., export_report) guidance. Usage is only inferable from the 'Reports, Return Labels table' framing. An agent must guess whether to call this or export the same report when it wants bulk data.

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

list_saved_packagesList saved packagesA
Read-onlyIdempotent
Inspect

Your Saved Packages from Settings: size, weight and the extra services stored with each.

Every Saved Package: packaging type, size in inches, weight in ounces (0 when each label sets its own), signature, insured value, return label setting and flags. default marks the one preselected on new shipments. Use an id in update_saved_package or delete_saved_package.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower, and the description still adds real semantic content: weight is 0 'when each label sets its own,' and `default` marks the one preselected on new shipments. Those two disclosures are non-obvious and prevent misreading the data. It does not mention ordering, pagination, or whether the list is account-scoped.

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?

Two short blocks, front-loaded with the resource and scope, then the per-record field list, then the follow-up hint. Nothing is filler, though the second sentence is a dense run-on enumeration of fields that could be more scannable.

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?

With no output schema and no parameters, the description correctly assumes responsibility for describing return values and does so field by field, including the edge case for weight and the meaning of `default`. What is missing is scale/ordering information for a list endpoint and any tie-break against `list_package_types`.

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?

The tool takes zero parameters, so the baseline of 4 applies. The description instead spends its space explaining the shape of each returned record, which is the only parameter-adjacent semantics available here.

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?

The resource is named precisely ('Your Saved Packages from Settings') and the description enumerates exactly what each record holds: packaging type, size in inches, weight in ounces, signature, insured value, return label setting, flags, and the `default` marker. The read verb is only implied rather than stated, and the boundary with the sibling `list_package_types` is never drawn, so it stops short of a 5.

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

Usage Guidelines3/5

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

It gives a concrete downstream usage rule: 'Use an id in update_saved_package or delete_saved_package,' which tells the agent where the returned ids belong. However it offers no when-not guidance and never distinguishes this from `list_package_types`, `create_saved_package`, or `get_label_settings`, which an agent could plausibly confuse it with. Usage is implied rather than scoped.

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

list_scan_formsList SCAN formsA
Read-onlyIdempotent
Inspect

USPS SCAN Forms per Ship From Address, with their PDF links and labels still without one.

For every Ship From Address with USPS labels: how many labels can still go on a SCAN Form (labels_available) and the SCAN Forms already made, each with ship date, label count and PDF link. A SCAN Form lets the carrier scan all packages at once. Make one with create_scan_form.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds genuine context beyond that: it explains what a SCAN Form is (carrier scans all packages at once) and enumerates what is returned per address — labels_available, ship date, label count, PDF link. It omits pagination/result-size behavior, which matters given openWorldHint.

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?

Front-loaded with the core purpose, then supporting detail, then the sibling pointer. Every sentence carries information, though the 'A SCAN Form lets the carrier scan all packages at once' explainer is domain background rather than invocation guidance and slightly dilutes the front-loading.

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?

With no parameters and no output schema, the description must convey the return shape, and it does: per-address counts plus a list of forms with ship date, label count and PDF link. The main remaining gap is volume/pagination behavior for an open-world read, which an agent cannot infer.

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?

The tool takes zero parameters, so the baseline of 4 applies. The description correctly implies no filtering input is required — it returns a breakdown across all Ship From Addresses.

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?

States a specific verb and resource ('List ... USPS SCAN Forms') and scopes it clearly: forms are grouped per Ship From Address, each with PDF links, plus a count of labels that still lack a form. This is distinguishable from the sibling create_scan_form and from list_ship_from_addresses/list_return_labels at a glance.

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?

Explicitly routes the agent to the alternative: 'Make one with create_scan_form.' That names the sibling and the condition that selects it. It stops short of stating when-not-to-use (e.g., no labels available, or when you only need shipments), so it is clear but not fully exclusive.

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

list_ship_from_addressesList ship-from addressesA
Read-onlyIdempotent
Inspect

Your Ship From Addresses with their return addresses; one is the default.

Every saved Ship From Address in Pirate Ship: where labels ship from and the return address printed on them (origin_is_return when they are the same). default marks the one new shipments and rate quotes start from. Use an id in update_ship_from_address, delete_ship_from_address or set_default_ship_from_address.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

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

The annotations already declare this as read-only, idempotent, open-world, and non-destructive. The description adds meaningful behavioral context beyond that by explaining the returned address semantics: ship-from location, return address, origin_is_return when they match, and the default marker. It does not cover pagination or ordering, but with annotations carrying the safety profile this is a solid disclosure.

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 compact and front-loads the resource plus default-address information. The opening sentence is somewhat redundant with the following explanation, but the content is dense and useful rather than bloated.

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?

With no output schema, the description does a good job explaining the important returned fields and default semantics. It is nearly complete for a zero-parameter list tool, though it could mention whether all addresses are returned or whether pagination/order applies.

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?

The tool has zero parameters, so there are no parameter semantics to document and the baseline is 4. The description correctly does not invent 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 identifies the resource as saved Ship From Addresses and explains that it includes return-address information and marks the default. It also distinguishes this read/list operation from related mutation tools by telling the agent to use an id in update_ship_from_address, delete_ship_from_address, or set_default_ship_from_address.

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 gives useful usage context by explaining that returned ids feed into update, delete, and set-default operations. It does not explicitly state when not to use this tool or contrast it with a competing list alternative, but no obvious list alternative exists for this resource.

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

list_shipmentsList shipmentsA
Read-onlyIdempotent
Inspect

Labels bought in Pirate Ship with recipient, tracking, cost and status, newest first.

The Reports, Shipments table: every label the account bought, with the recipient's address, carrier and service, tracking number and status, cost in US dollars, package size and weight, batch and ship-from address. search works like the table's search box (name, email, tracking number, order id). from_date and to_date narrow by the day the label was created; status, tracking_status, carrier and batch take the values the table shows. total counts every match, limit and offset page through them.

NameRequiredDescriptionDefault
sortNonewest
batchNoBatch titles.
limitNo
offsetNo
searchNoFree text, as in the report's search box.
statusNoLabel status as the report shows it, e.g. Printed, Refunded.
carrierNoUSPS or UPS.
to_dateNoLast day, YYYY-MM-DD, included.
from_dateNoFirst day, YYYY-MM-DD, in your timezone.
tracking_statusNoTracking status as the report shows it, e.g. Delivered, In Transit.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/openWorld, so the bar is lower, and the description still adds real behavior: results are ordered newest-first, every label the account bought is included unless filtered, and total/limit/offset define the paging envelope. It doesn't mention limits on result volume or rate constraints, keeping it from a 5.

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

Conciseness4/5

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

Content is front-loaded with the resource and default ordering before the table/filter detail. The second block is dense and clause-heavy, but nearly every clause carries information an agent needs to build correct filters.

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 10-parameter read tool with no output schema, the description compensates by enumerating the returned fields and explaining the paging envelope (total/limit/offset). Only minor gaps remain, such as the semantics of the sort enum values, which the schema's defaults largely cover.

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?

With 70% schema coverage the description goes well beyond the schema: it specifies what search actually matches (name, email, tracking number, order id), that dates filter on the label creation day in the caller's timezone with an inclusive end day, that status/tracking_status/carrier/batch accept the display values shown in the table, and how total/limit/offset interact.

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 opening sentence names the resource (labels bought in Pirate Ship) and the exact fields returned — recipient, tracking, cost, status — plus the default ordering, 'newest first'. A second sentence anchors it to the Reports > Shipments table, which tells an agent precisely what dataset this represents, distinguishing it from siblings like export_shipments or get_shipment.

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?

Usage is implied through the table analogy ('works like the table's search box') and the parameter walkthrough, but there is no explicit when-to-use/when-not guidance and no named alternative — an agent is left to infer that export_shipments covers CSV export and get_shipment covers a single label.

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

list_store_connectionsList store connectionsA
Read-onlyIdempotent
Inspect

Stores and marketplaces connected to Pirate Ship for order import, with their status.

Every connected store (Shopify, Etsy, eBay, WooCommerce, Squarespace and others): its name, platform, whether it is active and still authorised (valid false means reconnect it in Pirate Ship) and whether orders sync on their own. Connecting a store happens in Pirate Ship, not here.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the description's added value is the domain semantics: 'valid false means reconnect it in Pirate Ship' and the presence of an auto-sync flag. That tells the agent how to interpret the payload rather than just that the call is safe — a genuine addition beyond structured fields.

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

Conciseness4/5

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

Front-loaded summary sentence followed by the field-level detail, with no filler or restatement of the title. The platform enumeration ('Shopify, Etsy, eBay, WooCommerce, Squarespace and others') is mildly expendable but serves to set the open-world expectation.

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 exists, so the description usefully covers the returned fields and the one non-obvious value ('valid false'). Pagination, ordering, and behaviour with zero connected stores are unaddressed, but for a simple no-arg list this is close to 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?

Zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. The description spends its words on the result shape instead, which is the right allocation for a no-argument tool.

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?

States a specific verb and resource ('Stores and marketplaces connected to Pirate Ship for order import') and immediately characterizes the returned entity set (name, platform, active/authorised, auto-sync). An agent can distinguish this read-only enumeration from mutation siblings like sync_store_orders or create_batch without opening a schema.

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

Usage Guidelines4/5

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

Explicitly bounds scope with 'Connecting a store happens in Pirate Ship, not here', which pre-empts an agent trying to add a connection through this tool. It does not name the natural follow-up sibling (sync_store_orders) for triggering an import, so the when-to-use guidance is clear but not fully routed.

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

list_transactionsList transactionsA
Read-onlyIdempotent
Inspect

Every charge, payment and refund on the Pirate Ship balance, newest first.

The Reports, Transaction History table: each label purchase, payment, refund and carrier adjustment with its amount in US dollars (negative takes from the balance) and the balance after it. from_date and to_date narrow by day, type by the table's transaction types, search works like its search box.

NameRequiredDescriptionDefault
sortNonewest
typeNoTransaction types as the table shows them, e.g. Label, Payment, Refund.
limitNo
offsetNo
searchNoFree text, as in the report's search box.
to_dateNoLast day, YYYY-MM-DD, included.
from_dateNoFirst day, YYYY-MM-DD, in your timezone.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the safety bar is low, and the description adds real context beyond them: default ordering ('newest first'), USD amounts with sign semantics ('negative takes from the balance'), and the post-transaction balance. It omits pagination behavior (limit/offset interaction), which is the main remaining gap.

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?

Two sentences, front-loaded with the resource and scope, then the field-level detail. The second sentence is dense but every clause (amount sign, balance-after, filter mapping) carries information; a small amount of trimming is possible but nothing is padding.

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?

No output schema exists, and the description compensates by describing the returned record shape and the meaning of its numeric fields. For a read-only, zero-required-parameter list tool, that plus the schema on filters is sufficient for correct invocation.

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?

With 57% schema coverage, the description usefully explains what the documented params mean in domain terms — 'narrow by day' for the date pair, 'the table's transaction types' for type, and 'works like its search box' for search. sort, limit and offset get no prose, but their enums, defaults and bounds are self-explanatory 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?

States a specific verb and resource ('Every charge, payment and refund on the Pirate Ship balance') and anchors it to a known surface ('The Reports, Transaction History table'). The enumerated record kinds (label purchase, payment, refund, carrier adjustment) distinguish it from narrower siblings like list_refunds or list_receipts without needing the schema.

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?

Usage is implied by the content description — an agent can infer this is the general ledger view rather than the typed lists (list_refunds, list_carrier_adjustments) — but no sibling is named and no when-not condition is given. Adequate but leaves the routing decision to inference.

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

parse_addressParse addressA
Read-onlyIdempotent
Inspect

Splits a pasted address into name, street, city, state, ZIP and country.

Pirate Ship's Paste Address: free text such as a line copied from an email or an order becomes the fields create_shipment takes. It only parses; the address is checked when the shipment is created.

NameRequiredDescriptionDefault
textYesAn address as written, lines separated by newlines or commas.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description still adds real value by disclosing that no validation occurs here and where validation actually happens. It stops short of saying what happens on an unparseable or partially parsed input.

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 with zero filler: the transformation is stated first, then the context and the parse-only caveat. Nothing is repeated between sentences.

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?

There is no output schema, and the description compensates by enumerating the returned fields, which is exactly what an agent needs. The only gap is failure behavior on malformed input, which is not addressed.

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?

With one parameter at 100% schema coverage, the schema already documents the newline/comma-delimited free text and the 5–500 character bounds. The description adds only the informal framing ('a line copied from an email or an order'), which is marginal 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?

States a specific verb ('Splits') plus the exact output fields (name, street, city, state, ZIP, country), so the transformation is unambiguous. The second paragraph ties it to create_shipment and clarifies it is parse-only, which separates it from the shipment/address-creation siblings.

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?

Gives a concrete trigger ('free text such as a line copied from an email or an order') and a boundary ('It only parses; the address is checked when the shipment is created'). It implicitly routes the agent to create_shipment for validation, though it never names an explicit when-not-to-use case or a sibling that also parses text.

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

rename_batchRename batchBInspect

Changes a batch's title.

Sets the title Pirate Ship shows for a batch or single label on the Ship page and in reports.

NameRequiredDescriptionDefault
titleYes
batch_idYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, openWorldHint=true, and idempotentHint=false, so the safety profile is covered. The description adds useful context that the title appears on the Ship page and in reports, but omits auth requirements, reversibility, and failure behavior.

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 the second sentence adds useful display context without waste.

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 simple two-parameter mutation with rich annotations and no output schema, the description states purpose and visible effect. However, it remains incomplete about how to use `batch_id` and what happens on invalid input, so an agent must rely on the schema and sibling tools.

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

Parameters2/5

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

Schema description coverage is 0% for both required parameters. The description gives display meaning for `title`, but says nothing about `batch_id` such as where to obtain it or its expected format, leaving a material gap.

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 names a specific verb ('Changes') and resource ('a batch's title'), and scopes the effect to the title shown on the Ship page and in reports. This clearly separates it from sibling tools such as create_batch, delete_batch, get_batch, and list_batches.

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?

The description gives no when-to-use guidance, prerequisites, or alternatives. It does not explain when renaming is appropriate versus using related tools like update_label_settings, nor does it indicate what batch_id must reference.

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

search_recipientsSearch recipientsA
Read-onlyIdempotent
Inspect

Past recipients' addresses matching a name, email or phone.

The suggestions Pirate Ship's Ship To form shows while typing: addresses of people this account shipped to before, matched by the start of their name (or email or phone). Use one as create_shipment's to.

NameRequiredDescriptionDefault
fieldNoname
queryYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already establish read-only, idempotent, non-destructive behavior, and the description adds useful scope details: it searches people this account shipped to before and matches by prefix rather than arbitrary substring. It still does not specify result limits or the shape of returned addresses.

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 short and front-loads the core purpose. There is slight redundancy between 'matching a name, email or phone' and 'matched by the start of their name (or email or phone)', but the UI context and usage hint earn their 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 two-parameter lookup tool with no output schema, the description provides enough context to call it correctly: historical recipient scope, prefix matching, and intended downstream use. Return cardinality and exact address fields remain unspecified but are minor 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 description coverage is 0%, so the description must carry the parameter burden. It does explain that matching applies to name, email, or phone and is prefix-based, but it does not clearly document the `field` selector's default or the `query` length constraints.

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 a specific resource and matching behavior: past recipients' addresses matched by name, email, or phone. It also distinguishes the tool from broader address tools by tying it to the Ship To autocomplete and to create_shipment's `to` field.

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 gives a clear positive use case: select one of these suggestions as create_shipment's `to`. However, it does not explicitly say when not to use it or name alternatives such as list_ship_from_addresses or parse_address.

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

set_default_ship_from_addressSet default ship-from addressA
Idempotent
Inspect

Makes one Ship From Address the default for new shipments and rate quotes.

New shipments, get_rates and pickups start from the default Ship From Address.

NameRequiredDescriptionDefault
address_idYesid from list_ship_from_addresses.

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds real value by naming what the setting affects downstream, but omits the key behavioral question for a 'set default' operation: what happens to the previously default address.

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?

Two short sentences, front-loaded with the action and followed by the consequence. The second sentence partly restates the first, but the added 'get_rates and pickups' detail 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 one-parameter mutation with annotations and no output schema, this is nearly sufficient: purpose, scope and downstream effects are covered. The gap is the unstated effect on the existing default address and whether any confirmation is returned.

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 single parameter is documented with a clear provenance pointer ('id from list_ship_from_addresses'). The description adds nothing about the parameter, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource: makes one Ship From Address the default, which is clearly distinct from create/update/delete_ship_from_address siblings in the list. It does not explicitly name those siblings or state the single-default constraint, but the purpose is unambiguous.

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

Usage Guidelines3/5

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

The second sentence describes downstream impact (new shipments, get_rates, pickups), which implies why an agent would call this, but there is no explicit when-to-use/when-not guidance and no named alternative (e.g. update_ship_from_address vs. this) for comparison.

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

sync_store_ordersSync store ordersAInspect

Pulls new orders from every connected store into Pirate Ship's Import list.

Starts Refresh Data for all connected stores and waits up to wait_seconds for it to finish; running true means it continues in the background. Then list_import_orders shows the orders. With no store connected nothing is imported.

NameRequiredDescriptionDefault
wait_secondsNoHow long to wait for the sync to finish; 0 only starts it.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations cover the safety profile (readOnlyHint=false, idempotentHint=false, openWorldHint=true), and the description adds real behavior beyond them: it starts Refresh Data for all stores, blocks up to wait_seconds, and can continue in the background. The 'running true' reference is unexplained (there is no `running` input and no output schema), which slightly muddies the disclosure but does not contradict any annotation.

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?

Three short sentences, front-loaded with the action and scope, then sequencing and the edge case. 'Then list_import_orders shows the orders' is slightly awkward but still earns its place as 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?

For a zero-required-parameter action tool with no output schema, it explains what happens, how long it blocks, that it can continue in the background, and the empty-store outcome. Remaining gaps (what the response actually contains, whether previously imported orders are re-pulled) are minor given annotation 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 description coverage is 100% and the single parameter already documents range, default, and the '0 only starts it' behavior. The description restates the wait semantics ('waits up to wait_seconds') without adding format or interaction detail, so the baseline 3 applies.

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?

States a specific verb and resource ('Pulls new orders') plus the scope ('from every connected store into ... Import list'), which is precise enough to distinguish it from list_import_orders and list_store_connections in the sibling set.

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?

Gives clear operational context: it triggers a refresh and the follow-up read is list_import_orders, plus the no-store case ('nothing is imported'). It stops short of explicit when-not-to-use or alternative routing (e.g. versus list_import_orders alone), so it is a strong 4 rather than a 5.

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

unignore_ordersUnignore ordersC
Destructive
Inspect

Puts ignored store orders back on the Import list.

NameRequiredDescriptionDefault
order_idsYesOrder ids from list_import_orders.

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true, but the description adds nothing about what is mutated or the consequence — e.g. whether orders re-enter store sync, trigger re-import, or whether the prior ignore state can be recovered. For a destructive-labelled mutation this leaves the agent without the context it needs.

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?

One tight sentence with the effect front-loaded and zero padding. It's efficient, though the brevity comes at the cost of the behavioral detail captured elsewhere.

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?

For a destructive, non-idempotent, open-world mutation with no output schema, the description should say what happens to the restored orders and any limits or failure modes. It supplies only the state transition sentence.

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?

Single parameter with 100% schema description coverage ('Order ids from list_import_orders'), so the schema carries parameter meaning. The description adds nothing about the 500-id cap, array semantics, or partial-failure behavior, so the baseline 3 applies.

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?

States a concrete verb+resource pair ('Puts ignored store orders back on the Import list'), which is far more specific than the title. An agent can infer it reverses ignore_orders and interacts with the import queue, though it doesn't name the sibling explicitly.

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 when-to-use, prerequisites, or alternative named. The inverse relationship to ignore_orders and list_import_orders is only inferable from the tool name; nothing states when an agent should restore orders versus leaving them ignored.

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

update_email_templateUpdate email templateAInspect

Changes a tracking email template; fields you leave out keep their values.

Edits the name, subject, sender, BCC address, HTML body or default flag of one template.

NameRequiredDescriptionDefault
htmlNoBody as HTML. Placeholders: [Recipient First Name], [Ship Date], [Shipping Service], [Recipient Address], [Tracking #].
nameNoTemplate name in Settings.
defaultNoUse it for new labels.
subjectNo
bcc_emailNoA copy of every email goes here. Empty for none.
sender_nameNo
template_idYesid from list_email_templates.
sender_emailNoReply-to address recipients see.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds genuinely new behavioral context: omitted fields retain their values, i.e. this is a merge/patch rather than an overwrite. It does not explain what setting 'default' true does to other templates, nor the non-idempotent flag's implications.

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?

Two short sentences, front-loaded with the mutation-and-merge behavior. The second sentence largely re-names parameters already visible in the schema, so it is slightly redundant, but it costs little and reinforces 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?

For an 8-parameter mutation with annotations covering safety and no output schema, the description supplies the missing merge semantics and field scope. Gaps remain around the 'default' flag's side effects on other templates and error/validation behavior, but nothing critical to invoking it correctly is absent.

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 75%, so the schema carries most parameter meaning (e.g. html placeholders, bcc_email, sender_email). The description's field list roughly maps onto the optional parameters and adds the 'omitted = unchanged' semantics, but it introduces no format or constraint detail beyond the schema.

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?

States a specific verb and resource ('Changes a tracking email template') and enumerates the editable fields, which separates it from sibling mutations like create_email_template and delete_email_template. It does not explicitly name those siblings, so differentiation is by implication rather than routing.

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?

'fields you leave out keep their values' implies this is partial-update-only for an existing template (template_id required, sourced from list_email_templates per the schema). But there is no explicit when-to-use versus create_email_template or delete_email_template, and no stated prerequisites or permissions.

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

update_label_settingsUpdate label settingsAInspect

Changes label size, file format, packing list, logo, QR codes, address correction or export format.

Saves Settings, General for the whole account. Fields you leave out keep their values. Applies to labels made from now on; get_label_settings shows the current values.

NameRequiredDescriptionDefault
label_sizeNoLabel size in inches.
label_formatNoPDF, or ZPLII for thermal printers.
mobile_codesNoOffer USPS label-free QR codes.
packing_listNo
logo_on_labelNo
report_formatNoSpreadsheet format of exports.
address_correctionNoWhat Pirate Ship does when it finds a better address: nothing, ask, or correct it.

TDQS

A4.6/5.0
Behavior5/5

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

Goes well past the annotations by disclosing blast radius ('for the whole account'), partial-update semantics, and non-retroactivity ('applies to labels made from now on'), plus a read-back path. Nothing here contradicts readOnlyHint=false, destructiveHint=false, or idempotentHint=false.

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 short sentences: what changes, the scope and merge behavior, then the non-retroactivity caveat with the read-back pointer. Front-loaded and every sentence carries new 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 mutation tool with no output schema and 7 optional parameters, the description covers scope, merge semantics, and timing of effect. Minor gaps remain around permissions and whether in-flight batches are affected, but nothing blocking for correct invocation.

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?

The description names all seven settings in domain language, which usefully maps to schema keys such as mobile_codes (QR codes) and report_format (export format). With schema coverage at 71% and five enums documented inline, the description adds orientation rather than full value-level detail, so a 4 rather than a 5.

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?

States a specific verb (changes) and resource (label settings) and enumerates the exact knobs affected: label size, file format, packing list, logo, QR codes, address correction, export format. It also explicitly separates itself from the sibling get_label_settings, which shows current values.

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?

Clear guidance on the two things an agent most needs: partial updates ('fields you leave out keep their values') and when to read instead (get_label_settings for current values). It stops short of describing prerequisites such as plan or role requirements, so it is clear context without full exclusions.

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

update_saved_packageUpdate saved packageAInspect

Changes a Saved Package; fields you leave out keep their values.

Edits one Saved Package: name, packaging, size, weight, signature, insurance, return label and flags. Pirate Ship saves an edit as a new version: the answer carries the new id, use it from then on. default true makes it the preselected package.

NameRequiredDescriptionDefault
titleNoName shown in Saved Packages.
defaultNoPreselect it on new shipments.
width_inNo
height_inNo
irregularNo
length_inNo
packagingNoParcel
signatureNonone
weight_ozNo0 leaves the weight to each label.
media_mailNoQualifies for USPS Media Mail.
package_idYesid from list_saved_packages.
return_labelNoreturn: return labels only; standard_and_return: an extra return label.none
insured_value_usdNo
hazardous_materialsNo

TDQS

A3.7/5.0
Behavior5/5

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

Beyond the annotations, the description discloses important behavior: partial-update semantics, version creation on each edit, a new returned id that must be used subsequently, and default=true preselection. These are significant operational details an agent needs before calling the tool.

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 front-loads the core edit and partial-update rule, then adds versioning and default semantics in minimal space. Every sentence contributes useful information and there is no filler.

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 14-parameter mutation with no output schema, the description covers the critical behaviors: partial update, versioned result with a new id, and default preselection. Remaining gaps are limited because the schema supplies enums and constraints, though a fuller explanation of flags and return values would 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?

With schema description coverage at 43%, the description must compensate, and it does group most fields: name, packaging, size, weight, signature, insurance, return label, and flags. However, 'flags' is vague and several parameters, including package_id and dimension/insurance details, are left mostly to the schema.

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?

The description uses specific verbs ('Changes', 'Edits') with a specific resource ('Saved Package') and enumerates the editable fields, so the purpose is clear. It implicitly distinguishes updating from creating/deleting/listing, but does not name sibling tools like create_saved_package or delete_saved_package.

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?

It establishes that this tool edits an existing package and that omitted fields retain their values, but gives no explicit guidance on when to use it versus create_saved_package, delete_saved_package, or list_saved_packages. No prerequisites or exclusions are stated.

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

update_ship_from_addressUpdate ship-from addressAInspect

Changes a Ship From Address: its name, origin or return address.

Edits one saved Ship From Address; fields you leave out keep their values. origin_is_return true sends returns to the origin, return_address sets a separate one. Pirate Ship saves an edit as a new version: the answer carries the new id, use it from then on. Labels already bought keep their address.

NameRequiredDescriptionDefault
titleNo
originNo
address_idYesid from list_ship_from_addresses.
return_addressNoA separate return address.
origin_is_returnNotrue sends returns to the origin.

TDQS

A4/5.0
Behavior5/5

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

It discloses behavior the annotations cannot: an edit is persisted as a new version, the response carries a new id that must be used going forward, and already-purchased labels retain their old address. This also explains why idempotentHint is false, so the description and annotations reinforce rather than duplicate each other.

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 opening sentence states the action and mutable fields up front, and each subsequent sentence carries a distinct fact (partial update, the origin_is_return toggle, versioning, label immutability). The second sentence ('Edits one saved Ship From Address') restates the first slightly, which is the only waste.

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 non-idempotent mutation with no output schema, the description covers the crucial return-value detail (a new id) and the side effect on existing labels. It omits anything about permissions or error conditions, but nothing an agent needs to call it correctly is missing.

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

Parameters4/5

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

With 60% schema coverage, the description adds real meaning: it maps 'name' to the title field, explains that origin_is_return=true routes returns to the origin, and that return_address sets a separate one. Nested origin/return_address sub-fields are left to the schema, which already documents them individually.

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?

The description gives a specific verb ('Changes'/'Edits') and resource ('a Ship From Address') plus the scope of mutable fields (name, origin, return address), which separates it from create_ship_from_address and delete_ship_from_address. It never names a sibling explicitly, so the differentiation is implied rather than stated.

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?

'Edits one saved Ship From Address' establishes the precondition that the record must already exist, and 'fields you leave out keep their values' clarifies partial-update usage. There is no explicit statement of when to prefer this over create_ship_from_address or set_default_ship_from_address, so an agent must infer the routing.

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

update_tracking_email_settingsUpdate tracking email settingsAInspect

Turns default tracking emails on or off and sets their delay after purchase.

Changes only what you pass and returns the settings as get_tracking_email_settings does.

NameRequiredDescriptionDefault
delayNoWhen the email goes out after purchase; +24 hours is next day 9:00 AM.
enabledNoSend tracking emails on new labels by default.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare the mutation profile (readOnlyHint=false, destructiveHint=false, openWorldHint=true), so the description's job is to add what those don't say. It does: partial-update semantics and the fact that the response mirrors get_tracking_email_settings. It doesn't address the non-idempotent hint or confirm what happens if no parameters are passed.

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 filler. The behavior statement is front-loaded and the return-value clarification follows immediately, so an agent gets the essentials in the first line.

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?

There is no output schema, and the description compensates by saying the result matches get_tracking_email_settings. Combined with the partial-update rule and the annotated safety profile, an agent has enough to invoke it correctly. A note on the no-argument case is the only real omission.

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%, and the enum plus the '+24 hours is next day 9:00 AM' clarification already live in the schema. The description only restates the two concepts (on/off and delay after purchase) without adding format, defaults, or interaction detail. Baseline 3 is appropriate when the schema carries the parameter burden.

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?

States a specific verb and resource ('turns default tracking emails on or off and sets their delay after purchase'), which is more precise than the tool name alone. It also names the read counterpart get_tracking_email_settings, so an agent can distinguish the write tool from its sibling without opening either schema.

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

Usage Guidelines4/5

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

The sentence 'Changes only what you pass' tells the agent this is a partial update and that omitted fields are left alone, which is the key usage decision for this tool. It also points at get_tracking_email_settings as the read path. It stops short of explicit when-not-to-use guidance, which keeps it below a 5.

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. 51 tool updatesv0.1.0
    • First observedchange_ship_date
    • First observedcreate_batch
    • First observedcreate_batch_from_orders
    • First observedcreate_email_template
    • First observedcreate_saved_package
    • First observedcreate_scan_form
    • First observedcreate_ship_from_address
    • First observedcreate_shipment
    • First observeddelete_batch
    • First observeddelete_email_template
    • First observeddelete_saved_package
    • First observeddelete_ship_from_address
    • First observeddownload_labels
    • First observedexport_report
    • First observedexport_shipments
    • First observedget_account_balance
    • First observedget_batch
    • First observedget_label_settings
    • First observedget_pickup_quote
    • First observedget_rates
    • First observedget_receipt
    • First observedget_shipment
    • First observedget_shipping_stats
    • First observedget_tracking_email_settings
    • First observedignore_orders
    • First observedlist_batches
    • First observedlist_carrier_adjustments
    • First observedlist_email_templates
    • First observedlist_import_orders
    • First observedlist_package_types
    • First observedlist_pickups
    • First observedlist_receipts
    • First observedlist_refunds
    • First observedlist_return_labels
    • First observedlist_saved_packages
    • First observedlist_scan_forms
    • First observedlist_ship_from_addresses
    • First observedlist_shipments
    • First observedlist_store_connections
    • First observedlist_transactions
    • First observedparse_address
    • First observedrename_batch
    • First observedsearch_recipients
    • First observedset_default_ship_from_address
    • First observedsync_store_orders
    • First observedunignore_orders
    • First observedupdate_email_template
    • First observedupdate_label_settings
    • First observedupdate_saved_package
    • First observedupdate_ship_from_address
    • First observedupdate_tracking_email_settings

TDQS

B3.4/5.0

Scored across 51 tools

Disambiguation4/5

Most tools pair a distinct resource with an action, and the detailed descriptions clarify list/get/export boundaries. Some overlap remains among create_shipment, create_batch, and create_batch_from_orders, and between reporting list/export tools, but an agent can usually pick correctly.

Naming Consistency5/5

Tool names consistently use snake_case verb_noun patterns across the whole server, including long but predictable names like set_default_ship_from_address and update_tracking_email_settings. There is no mixed convention or vague naming.

Tool Count1/5

With 51 tools, the surface is far above the well-scoped 3-15 range and crosses the rubric's 50+ extreme-mismatch threshold. The domain is broad, but the server exposes many parallel list/get/export variants that make the toolset unwieldy.

Completeness2/5

The server covers many CRUD and reporting operations, but core lifecycle tools are missing: buy_label, refund_label/refund_batch, schedule/cancel_pickup, and dispute_adjustment are referenced in descriptions but not exposed. Agents can create drafts and inspect data, but cannot complete purchase or refund workflows.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    A
    maintenance
    Exposes an OAuth-gated suite of 38 tools that let web-based AI chat clients securely operate a local machine, covering files, shell, search, Git, SQLite, browser automation, DevTools, background tasks, localhost services, clipboard, notifications, ports, and Postman. A strict command whitelist and configurable folder allowlist keep that broad local access governed rather than unrestricted.
    -
  • F
    license
    Not graded
    quality
    A
    maintenance
    Exposes an OAuth-gated suite of 38 tools that lets web-based AI clients read and edit files, run whitelisted shell commands, search content, use Git and SQLite, drive browsers and DevTools, and reach localhost or LAN services, clipboard, notifications, ports, Postman, and long-running background tasks on your own machine. Everything runs locally with security controls such as folder scoping, command whitelisting, rate limits, and a call log.
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    Lets AI agents control the real, already-logged-in Chrome browser: reading pages, clicking, typing, navigating tabs, taking screenshots, and inspecting cookies, network traffic, console output, and storage. It connects as a local extension over Native Messaging, so no remote-debugging port or headless profile is needed.
    1 npm
    ISC
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI agents such as Antigravity, Claude, and Codex to drive the user's real Chrome in background tabs through a local bridge, exposing 47 tools for tab management, trusted input, element finding, network capture, downloads, output, and page access.
    4
    MIT