{
  "fixes": {
    "slug": "ship24",
    "name": "Ship24",
    "listing": "https://www.anchorterminal.com/tools/ship24",
    "markdown": "# Fix list: Ship24\n\nFrom Anchor Terminal's listing at https://www.anchorterminal.com/tools/ship24, the October 2026 research run, assessed 8 October 2026. Grade C, 55 out of 100.\n\nThis is everything the published grade says the listing lacks, the biggest possible gain to the total first. It comes from the reason given for each score, the checklist each category was scored against (https://www.anchorterminal.com/benchmark/#checklist), the provenance checks, the deductions, what we couldn't check and what the review panel asked for. A fix counts at the next check, once it's public.\n\nFor a coding agent working on Ship24: work through the items below in the product, its docs and its public pages. Each category gives the reason for its score, with the points each checklist item earned, and the checklist itself, so the gap is the items that earned less than their points. Change the product, not the wording, and keep a note of what you changed and where it's published.\n\n## 1. Reliability, 45 out of 100, up to 11 more on the total\n\nWhy it scored 45: Read with the hosted lines and scored on the REST API at `api.ship24.com/public/v1`, which the hosted MCP server wraps. No status page was found. `status.ship24.com` doesn't resolve, `ship24.statuspage.io` is inactive, and neither the site footer nor the docs link to one (0). With no readable incident history the record scores the default (5 of 30). The rate limiter page gives a number for each of 11 endpoints, from 1 request a second on `GET /couriers` to 10 on most others (15). Responses carry `RateLimit-*`, `X-RateLimit-*` and `Retry-After` headers, which we saw on a live response, the errors page recommends exponential backoff on 429, and tracker creation is documented as idempotent with a 409 `request_conflict` that can be retried (15). The terms supply the service as is and as available, with no SLA found for any plan (0). The path is `/public/v1` and the MCP server reports version 1.0.1, with no beta label (10).\n\nThe checklist (https://www.anchorterminal.com/benchmark/#checklist-reliability):\n\nHosted APIs, MCP servers, models and platforms.\n\n- 20, a public status page with component history (Statuspage, Instatus, BetterStack or the vendor's own).\n- 0 to 30, the incident record for the last 90 days on that page. 30 for a clean record or trivial incidents only, 20 for minor incidents only, 10 for one major outage (an hour or more of a core API down, or errors across the board), 0 for several. 5 when there's no history we could read, and the note says so.\n- 15, rate limits documented with numbers.\n- 15, documented 429 or overload handling (Retry-After, backoff guidance), and idempotency keys or safe-retry guidance where writes are involved.\n- 10, an SLA published for any paid tier.\n- 10, the surface agents use is generally available, not beta or preview.\n\nLocal packages, SDKs, frameworks and stdio MCP servers.\n\n- 20, installs from an official package with supported runtimes stated.\n- 25, a public CI and test suite, passing on the default branch.\n- 0 to 25, open crash or regression issues relative to activity (25 for few and handled, 0 for many, old and unanswered).\n- 15, semver discipline and breaking changes called out in a changelog.\n- 15, version 1.0 or later, or declared stable.\n\nProtocols are read from their reference implementations, the public facilitators or servers, spec stability and test vectors.\n\n## 2. Security \u0026 auth, 37 out of 100, up to 11 more on the total\n\nWhy it scored 37: API keys are sent as a Bearer token in the `Authorization` header. An account can hold up to 20, managed in the dashboard, and the plugin's security note advises a dedicated key so it can be revoked alone. Keys have no scopes and no secret travels in a query string (20 of 30). No read-only key or approval step was found. The API has no delete operation, the MCP server registers tools by plan and marks `resend_webhooks` as destructive, and that is the only least-privilege control (5 of 20). Results carry courier event text, which is untrusted, and no prompt-injection guidance was found in the docs or the plugin (3 of 15). `GET /trackers/:trackerId/webhook-history/download` returns every webhook push with its response, but no log of API calls or key use was found (4 of 15). `SECURITY.md` in the plugin repository gives contact@ship24.com for reports on the API and MCP server. No security.txt, bug bounty, SOC 2 or ISO 27001 statement was found, and webhooks are checked by a static shared secret with no signature (5 of 20).\n\nThe checklist (https://www.anchorterminal.com/benchmark/#checklist-security):\n\n- 0 to 30, the credential model. 30 for OAuth 2.1 with scopes, or scoped and revocable keys with rotation. 20 for plain revocable API keys. 10 for one all-powerful key. 10 off when a secret can travel in a URL query string as a documented option.\n- 0 to 20, read-only or least-privilege modes, and confirmation or approval for destructive actions.\n- 0 to 15, prompt-injection posture where the tool returns untrusted content (documented mitigations or guidance). A tool that returns no untrusted content gets 10.\n- 0 to 15, audit logs or per-call visibility for the operator.\n- 0 to 20, a security programme. security.txt or a disclosure policy, a bug bounty, SOC 2 or ISO 27001, advisories handled in public.\n\nModels are read for retention, whether API data trains models (and whether that's off by default), zero-retention options and certifications. Frameworks for telemetry defaults, approval hooks, guardrails and sandboxing.\n\n## 3. Payments \u0026 pricing, 30 out of 100, up to 8.8 more on the total\n\nWhy it scored 30: Read with the hosted rubric. No x402, MPP or L402 was found in the docs, the spec or the pricing page (0). The pricing page lists both billing models without a login, per shipment from $39 a month for 1,000 with $0.045 for each extra shipment, and per call from $99 a month for 10,000 with $0.015 for each extra call, with every tier and overage rate in a table (20). The Tracking API has a free plan of 10 shipments a month. Whether signup asks for a card wasn't established, because the dashboard needs a login we didn't create (10 of 20). A person signs up and picks a plan in the dashboard, and API key creation isn't available through the API or the MCP server (0).\n\nThe checklist (https://www.anchorterminal.com/benchmark/#checklist-payments):\n\nThe published rubric, also on the [x402 page](https://www.anchorterminal.com/x402/).\n\n- 40, a machine payment protocol (x402, MPP or L402) on the tool's own endpoints. 10 to 30 when it covers only some endpoints or only goes through a third party, and the note says which.\n- 20, per-call or per-unit pricing published without a login. 10 for public plan-only pricing, 0 for \"contact sales\" or prices behind a login.\n- 20, a free tier or trial that doesn't need a card.\n- 20, autonomous onboarding, meaning an agent can get access without a person signing up in a browser (keyless use, x402, a programmatic key API).\n\nPayment platforms and agent wallets rarely charge for their own API over a machine protocol, so the first line has steps for them, and the highest one that applies counts. 40 when x402, MPP or L402 runs on all their own endpoints, 30 when it runs on part of their own API, 25 when their merchants can accept one, 20 for running a facilitator, 15 for paying as a buyer, and 0 when the only protocol is their own. Merchant acceptance sits above a facilitator because the platform's own customers can charge agents through it, while a facilitator settles for sellers who wire up the protocol themselves. The counter-argument (a facilitator does more for the protocol as a whole) has a point. Each note says which step applied.\n\nOpen-source software you run yourself is scored on its hosted or paid option if it has one. A free, self-hosted package with nothing to buy gets 20, 20 and 20 for the last three lines, and 0 to 40 for the first only if it ships a payment protocol.\n\n## 4. Agent ergonomics, 68 out of 100, up to 5.2 more on the total\n\nWhy it scored 68: Scored on the REST API and the MCP server together. The MCP server has 12 tools, registered by plan, but its tools/list answer is about 61 KB because every tool carries an output schema, and the REST API has no field selection, so a results call returns every event (13 of 25). `GET /trackers` pages by `page` and `limit` (default 100, maximum 500) with a sort order. No filter appears in the spec for that call, and `GET /couriers` returns the full list unpaged (12 of 20). Errors are a JSON `errors` array with a stable `code` and a message that says what to fix, with 12 documented codes (16 of 20). `POST /trackers` and `POST /trackers/track` are idempotent for an identical payload, `clientTrackerId` is validated as unique, the bulk call is documented as not fully idempotent, and all 12 MCP tools carry `readOnlyHint` or `destructiveHint` and `idempotentHint` annotations (18 of 20). Only `trackingNumber` is required and the courier is detected automatically. One official SDK exists, for Node.js and TypeScript, so the two-language line isn't met (9 of 15).\n\nThe checklist (https://www.anchorterminal.com/benchmark/#checklist-ergonomics):\n\n- 0 to 25, context cost. For MCP, the number and size of the tool definitions (25 for ten or fewer compact tools, 15 for 11 to 30, 5 for more than 30, plus up to 10 back for toolsets, dynamic loading or read-only subsets). For APIs, whether responses can be sized (field selection, limits, summaries).\n- 20, pagination, filtering and output-size controls.\n- 20, actionable, documented error responses, codes and messages an agent can recover from.\n- 20, idempotency or safe retries, and for MCP the `readOnlyHint` and `destructiveHint` annotations.\n- 15, sensible defaults, few required parameters, and official SDKs in at least two languages.\n\nModels are read for tool use, structured output, prompt caching, context length, batch and SDKs. Frameworks for how much code and how many defaults a tool-calling agent with MCP needs.\n\n## 5. Transparency \u0026 trust, 52 out of 100, up to 4.2 more on the total\n\nMade of editorial 38, provenance 65.\n\nWhy it scored 52: The service is closed, under Terms and Conditions that name Ship24 Limited of Hong Kong and carry no date or version. They say an Application developer and API agreement applies to API use, and we found no such document on the site. The SDK and plugin are MIT (12 of 30). The privacy policy, last updated August 2026, covers accounts, payments and the MCP integration and gives retention only in general terms. The pricing page lists six months of data retention on the Pro plan, the terms allow deletion of an account's data without notice, and the data processing agreement the terms refer to wasn't found (12 of 30). The data format page promises that existing fields are never removed or changed and lists deprecated fields with the month, most recently `signedBy` in August 2026. No notice period is stated (10 of 20). Stripe, Google and Meta are named in the privacy policy, with no subprocessor list and no hosting locations (4 of 20).\n\nThe checklist (https://www.anchorterminal.com/benchmark/#checklist-transparency):\n\n- 0 to 30, source availability and licence clarity. 30 for open source under an OSI licence, 15 for closed with clear terms, 0 for unclear terms.\n- 0 to 30, data handling and retention statements that agree with each other (privacy policy, DPA, retention periods, subprocessors).\n- 0 to 20, a deprecation policy or notices with dates.\n- 0 to 20, telemetry disclosed with an opt-out (local software), or subprocessors and data locations disclosed (hosted).\n\nThe other half of Transparency and trust is the provenance score, computed from checked facts (below). The category score is the mean of the two.\n\nProvenance checks not met in full (half of this category, computed from checked facts):\n\n- Terms of service: read, states 5 of the 7 things a reader expects, and has 1 clause that costs points (6.3 of 10)\n- Privacy policy: read, states 6 of the 8 things a reader expects (8.5 of 10)\n- Status page: not found (0 of 10)\n- Changelog: not found (0 of 10)\n- security.txt: not found (0 of 10)\n\n## 6. Schema \u0026 documentation, 81 out of 100, up to 3.1 more on the total\n\nWhy it scored 81: A public OpenAPI 3.1 spec at `docs.ship24.com/assets/openapi/ship24-tracking-api.yaml` covers 12 operations and two webhooks, and every MCP tool has a typed input and output schema (25). llms.txt and a hosted `SKILL.md` guide exist, but the docs pages have no Markdown copies and llms.txt truncates its descriptions (8 of 10). The MCP tool descriptions say when to use each tool and which to prefer, such as `search_tracking_by_number` before a billed lookup, and the docs explain the three ways to fetch results (18 of 20). Inputs are typed with required fields, 12 enums and limits such as 5 to 50 characters for a tracking number and 500 a page, though the `Authorization` header is modelled as a plain string parameter (12 of 15). The spec has many examples and the errors page lists 12 codes, but most operations document only their success response and the live `auth_missing_header` code isn't on the list (10 of 15). The path carries v1 and the data format page promises that fields are never removed and lists four deprecated fields with months. No API changelog was found, only the SDK and plugin changelogs (8 of 15).\n\nThe checklist (https://www.anchorterminal.com/benchmark/#checklist-schema):\n\nAPIs and MCP servers.\n\n- 25, a machine-readable contract (a public OpenAPI file or similar; for MCP, typed JSON Schema inputs on every tool).\n- 10, llms.txt or Markdown docs served for agents.\n- 0 to 20, descriptions that say what a tool is for, when to use it and when not to, read from the tool definitions in the source or the API reference.\n- 0 to 15, typed inputs with enums, constraints and required fields, and no free-form JSON blobs.\n- 0 to 15, examples and documented error responses.\n- 15, versioning and a public changelog.\n\nModels are read from the API reference, the OpenAPI file, llms.txt, the structured-output and tool-use docs and the model cards. Frameworks from docs a model can follow, typed interfaces, examples and the API reference.\n\n## 7. Maintenance \u0026 community, 80 out of 100, up to 1.8 more on the total\n\nWhy it scored 80: The `ship24` npm package reached 1.1.0 on 6 October 2026, two days before the check (30). In the 90 days before the check there were five dated releases, the Node SDK 1.0.0 on 14 July and 1.1.0 on 6 October, MCP server 1.0.0 on 16 July and 1.0.1 on 27 August in the official registry, and the AI plugin 1.0.0 on 9 September (20). The service is closed, with no API changelog. Support is a contact form, and the GitHub API shows four open issues on the SDK repository and two on the plugin, which we didn't read (6 of 15). The MCP server is in the official registry under the domain namespace `com.ship24/tracking-mcp` (15). The SDK has no runtime dependencies, CI that tests Node 20, 22 and 24, and a workflow that reports drift from the OpenAPI spec (9 of 10).\n\nThe checklist (https://www.anchorterminal.com/benchmark/#checklist-maintenance):\n\n- 0 to 30, time since the last release, or the last published model or API change for a closed service. 30 within 30 days, 20 within 90, 10 within 180, 0 older.\n- 20, at least three releases or dated changelog entries in the last 90 days.\n- 0 to 25, responsiveness. Issues and pull requests answered on GitHub (the open issues and how recent the replies are). For closed services, a public changelog and a support or community channel that answers, 0 to 15.\n- 15, presence in the official MCP registry under a verified namespace (MCP servers), or current official SDKs (APIs and models).\n- 10, package health, current dependencies and CI.\n\nModels are read for deprecation notice periods and model churn rather than release counts.\n\n## What we couldn't check\n\nWhat we couldn't read counted as absent. Publishing it on a page a plain HTTP fetch can read (not only in a browser) lets the next check count it.\n\n- unchecked: whether the free plan asks for a card. The dashboard at dashboard.ship24.com needs an account, and we didn't sign up.\n- unchecked: API key rotation and revocation in the dashboard. The docs say keys are viewed and managed there, and the plugin's security note says a key can be revoked.\n- unchecked: GitHub issues on ship24-node (four open) and ship24-ai-plugin (two open), and how quickly they are answered.\n- No status page was found. status.ship24.com failed to resolve from two readers and ship24.statuspage.io redirects to an inactive page. Ship24 may publish one at an address we didn't find.\n- The Application developer and API agreement and the Ship24 Data Processing Agreement named in the terms were not found on the site, so `provenance.terms` points at the Terms and Conditions.\n- The Terms and Conditions carry no effective date or version.\n- A second registry entry, io.github.ship24-official/ship24-tracking, describes a stdio server from a different GitHub account. We didn't establish whether Ship24 runs that account and left it out.\n- The listing covers the Tracking API. Ship24's tracking pages, delivery notifications, IOSS and Ship from China services have no API in the reviewed documentation.\n- Courier count (2,500+) is the vendor's figure. We didn't fetch `GET /couriers`, which needs a key.\n\n## Weaknesses\n\n- No status page was found. `status.ship24.com` doesn't resolve, and neither the site nor the docs link to one\n- The terms supply the service as is, with no uptime commitment, and allow account termination and data deletion without notice\n- API keys have no scopes or read-only mode. The docs describe up to 20 keys an account, managed in the dashboard\n- Webhooks are authenticated by a static secret in the `Authorization` header, with no payload signature\n- The API agreement and the data processing agreement named in the terms, and a subprocessor list, were not found on the site\n\n## What costs an agent a turn today\n\nThe notes we give agents before they call it. Each one is a workaround an agent shouldn't need.\n\n- Send `Authorization: Bearer apik_...` to `https://api.ship24.com/public/v1`. The same key works on the MCP server, which lists tools without a key but answers 401 on calls\n- Store the `trackerId` or set a unique `clientTrackerId`. Tracking numbers aren't unique, and any changed field on a repeat `POST /trackers` creates a second tracker that uses quota\n- Allow up to 60 seconds for the first `POST /trackers/track` or `POST /tracking/search` call, since results are fetched from the courier synchronously\n- Cache `GET /couriers`. It is limited to one request a second and returns the whole courier list, and courier auto-detection usually makes `courierCode` unnecessary\n- Check for `quota_limit_reached` and `no_active_subscription`. `POST /tracking/search` needs a separate per-call plan, and the free plan blocks at 10 shipments a month\n\n## When it's done\n\nSend what changed and where it's published as a dispute (https://www.anchorterminal.com/builders/#disputes, or `POST https://www.anchorterminal.com/api/v1/contact` with `\"kind\": \"dispute\"`). Disputes are answered in public, and the listing is checked again by the same checklist. Paying for an audit or a listing claim changes nothing here.\n",
    "grade": "C",
    "score": 55,
    "assessed": "2026-10-08",
    "run": "October 2026 research run",
    "categories": [
      {
        "key": "reliability",
        "name": "Reliability",
        "score": 45,
        "maxGain": 11,
        "reason": "Read with the hosted lines and scored on the REST API at `api.ship24.com/public/v1`, which the hosted MCP server wraps. No status page was found. `status.ship24.com` doesn't resolve, `ship24.statuspage.io` is inactive, and neither the site footer nor the docs link to one (0). With no readable incident history the record scores the default (5 of 30). The rate limiter page gives a number for each of 11 endpoints, from 1 request a second on `GET /couriers` to 10 on most others (15). Responses carry `RateLimit-*`, `X-RateLimit-*` and `Retry-After` headers, which we saw on a live response, the errors page recommends exponential backoff on 429, and tracker creation is documented as idempotent with a 409 `request_conflict` that can be retried (15). The terms supply the service as is and as available, with no SLA found for any plan (0). The path is `/public/v1` and the MCP server reports version 1.0.1, with no beta label (10).",
        "checklist": [
          "Hosted APIs, MCP servers, models and platforms.",
          "- 20, a public status page with component history (Statuspage, Instatus, BetterStack or the vendor's own).\n- 0 to 30, the incident record for the last 90 days on that page. 30 for a clean record or trivial incidents only, 20 for minor incidents only, 10 for one major outage (an hour or more of a core API down, or errors across the board), 0 for several. 5 when there's no history we could read, and the note says so.\n- 15, rate limits documented with numbers.\n- 15, documented 429 or overload handling (Retry-After, backoff guidance), and idempotency keys or safe-retry guidance where writes are involved.\n- 10, an SLA published for any paid tier.\n- 10, the surface agents use is generally available, not beta or preview.",
          "Local packages, SDKs, frameworks and stdio MCP servers.",
          "- 20, installs from an official package with supported runtimes stated.\n- 25, a public CI and test suite, passing on the default branch.\n- 0 to 25, open crash or regression issues relative to activity (25 for few and handled, 0 for many, old and unanswered).\n- 15, semver discipline and breaking changes called out in a changelog.\n- 15, version 1.0 or later, or declared stable.",
          "Protocols are read from their reference implementations, the public facilitators or servers, spec stability and test vectors."
        ],
        "checklistUrl": "https://www.anchorterminal.com/benchmark/#checklist-reliability"
      },
      {
        "key": "security",
        "name": "Security \u0026 auth",
        "score": 37,
        "maxGain": 11,
        "reason": "API keys are sent as a Bearer token in the `Authorization` header. An account can hold up to 20, managed in the dashboard, and the plugin's security note advises a dedicated key so it can be revoked alone. Keys have no scopes and no secret travels in a query string (20 of 30). No read-only key or approval step was found. The API has no delete operation, the MCP server registers tools by plan and marks `resend_webhooks` as destructive, and that is the only least-privilege control (5 of 20). Results carry courier event text, which is untrusted, and no prompt-injection guidance was found in the docs or the plugin (3 of 15). `GET /trackers/:trackerId/webhook-history/download` returns every webhook push with its response, but no log of API calls or key use was found (4 of 15). `SECURITY.md` in the plugin repository gives contact@ship24.com for reports on the API and MCP server. No security.txt, bug bounty, SOC 2 or ISO 27001 statement was found, and webhooks are checked by a static shared secret with no signature (5 of 20).",
        "checklist": [
          "- 0 to 30, the credential model. 30 for OAuth 2.1 with scopes, or scoped and revocable keys with rotation. 20 for plain revocable API keys. 10 for one all-powerful key. 10 off when a secret can travel in a URL query string as a documented option.\n- 0 to 20, read-only or least-privilege modes, and confirmation or approval for destructive actions.\n- 0 to 15, prompt-injection posture where the tool returns untrusted content (documented mitigations or guidance). A tool that returns no untrusted content gets 10.\n- 0 to 15, audit logs or per-call visibility for the operator.\n- 0 to 20, a security programme. security.txt or a disclosure policy, a bug bounty, SOC 2 or ISO 27001, advisories handled in public.",
          "Models are read for retention, whether API data trains models (and whether that's off by default), zero-retention options and certifications. Frameworks for telemetry defaults, approval hooks, guardrails and sandboxing."
        ],
        "checklistUrl": "https://www.anchorterminal.com/benchmark/#checklist-security"
      },
      {
        "key": "payments",
        "name": "Payments \u0026 pricing",
        "score": 30,
        "maxGain": 8.8,
        "reason": "Read with the hosted rubric. No x402, MPP or L402 was found in the docs, the spec or the pricing page (0). The pricing page lists both billing models without a login, per shipment from $39 a month for 1,000 with $0.045 for each extra shipment, and per call from $99 a month for 10,000 with $0.015 for each extra call, with every tier and overage rate in a table (20). The Tracking API has a free plan of 10 shipments a month. Whether signup asks for a card wasn't established, because the dashboard needs a login we didn't create (10 of 20). A person signs up and picks a plan in the dashboard, and API key creation isn't available through the API or the MCP server (0).",
        "checklist": [
          "The published rubric, also on the [x402 page](https://www.anchorterminal.com/x402/).",
          "- 40, a machine payment protocol (x402, MPP or L402) on the tool's own endpoints. 10 to 30 when it covers only some endpoints or only goes through a third party, and the note says which.\n- 20, per-call or per-unit pricing published without a login. 10 for public plan-only pricing, 0 for \"contact sales\" or prices behind a login.\n- 20, a free tier or trial that doesn't need a card.\n- 20, autonomous onboarding, meaning an agent can get access without a person signing up in a browser (keyless use, x402, a programmatic key API).",
          "Payment platforms and agent wallets rarely charge for their own API over a machine protocol, so the first line has steps for them, and the highest one that applies counts. 40 when x402, MPP or L402 runs on all their own endpoints, 30 when it runs on part of their own API, 25 when their merchants can accept one, 20 for running a facilitator, 15 for paying as a buyer, and 0 when the only protocol is their own. Merchant acceptance sits above a facilitator because the platform's own customers can charge agents through it, while a facilitator settles for sellers who wire up the protocol themselves. The counter-argument (a facilitator does more for the protocol as a whole) has a point. Each note says which step applied.",
          "Open-source software you run yourself is scored on its hosted or paid option if it has one. A free, self-hosted package with nothing to buy gets 20, 20 and 20 for the last three lines, and 0 to 40 for the first only if it ships a payment protocol."
        ],
        "checklistUrl": "https://www.anchorterminal.com/benchmark/#checklist-payments"
      },
      {
        "key": "ergonomics",
        "name": "Agent ergonomics",
        "score": 68,
        "maxGain": 5.2,
        "reason": "Scored on the REST API and the MCP server together. The MCP server has 12 tools, registered by plan, but its tools/list answer is about 61 KB because every tool carries an output schema, and the REST API has no field selection, so a results call returns every event (13 of 25). `GET /trackers` pages by `page` and `limit` (default 100, maximum 500) with a sort order. No filter appears in the spec for that call, and `GET /couriers` returns the full list unpaged (12 of 20). Errors are a JSON `errors` array with a stable `code` and a message that says what to fix, with 12 documented codes (16 of 20). `POST /trackers` and `POST /trackers/track` are idempotent for an identical payload, `clientTrackerId` is validated as unique, the bulk call is documented as not fully idempotent, and all 12 MCP tools carry `readOnlyHint` or `destructiveHint` and `idempotentHint` annotations (18 of 20). Only `trackingNumber` is required and the courier is detected automatically. One official SDK exists, for Node.js and TypeScript, so the two-language line isn't met (9 of 15).",
        "checklist": [
          "- 0 to 25, context cost. For MCP, the number and size of the tool definitions (25 for ten or fewer compact tools, 15 for 11 to 30, 5 for more than 30, plus up to 10 back for toolsets, dynamic loading or read-only subsets). For APIs, whether responses can be sized (field selection, limits, summaries).\n- 20, pagination, filtering and output-size controls.\n- 20, actionable, documented error responses, codes and messages an agent can recover from.\n- 20, idempotency or safe retries, and for MCP the `readOnlyHint` and `destructiveHint` annotations.\n- 15, sensible defaults, few required parameters, and official SDKs in at least two languages.",
          "Models are read for tool use, structured output, prompt caching, context length, batch and SDKs. Frameworks for how much code and how many defaults a tool-calling agent with MCP needs."
        ],
        "checklistUrl": "https://www.anchorterminal.com/benchmark/#checklist-ergonomics"
      },
      {
        "key": "transparency",
        "name": "Transparency \u0026 trust",
        "score": 52,
        "maxGain": 4.2,
        "reason": "The service is closed, under Terms and Conditions that name Ship24 Limited of Hong Kong and carry no date or version. They say an Application developer and API agreement applies to API use, and we found no such document on the site. The SDK and plugin are MIT (12 of 30). The privacy policy, last updated August 2026, covers accounts, payments and the MCP integration and gives retention only in general terms. The pricing page lists six months of data retention on the Pro plan, the terms allow deletion of an account's data without notice, and the data processing agreement the terms refer to wasn't found (12 of 30). The data format page promises that existing fields are never removed or changed and lists deprecated fields with the month, most recently `signedBy` in August 2026. No notice period is stated (10 of 20). Stripe, Google and Meta are named in the privacy policy, with no subprocessor list and no hosting locations (4 of 20).",
        "blend": "editorial 38, provenance 65",
        "checklist": [
          "- 0 to 30, source availability and licence clarity. 30 for open source under an OSI licence, 15 for closed with clear terms, 0 for unclear terms.\n- 0 to 30, data handling and retention statements that agree with each other (privacy policy, DPA, retention periods, subprocessors).\n- 0 to 20, a deprecation policy or notices with dates.\n- 0 to 20, telemetry disclosed with an opt-out (local software), or subprocessors and data locations disclosed (hosted).",
          "The other half of Transparency and trust is the provenance score, computed from checked facts (below). The category score is the mean of the two."
        ],
        "checklistUrl": "https://www.anchorterminal.com/benchmark/#checklist-transparency"
      },
      {
        "key": "schema",
        "name": "Schema \u0026 documentation",
        "score": 81,
        "maxGain": 3.1,
        "reason": "A public OpenAPI 3.1 spec at `docs.ship24.com/assets/openapi/ship24-tracking-api.yaml` covers 12 operations and two webhooks, and every MCP tool has a typed input and output schema (25). llms.txt and a hosted `SKILL.md` guide exist, but the docs pages have no Markdown copies and llms.txt truncates its descriptions (8 of 10). The MCP tool descriptions say when to use each tool and which to prefer, such as `search_tracking_by_number` before a billed lookup, and the docs explain the three ways to fetch results (18 of 20). Inputs are typed with required fields, 12 enums and limits such as 5 to 50 characters for a tracking number and 500 a page, though the `Authorization` header is modelled as a plain string parameter (12 of 15). The spec has many examples and the errors page lists 12 codes, but most operations document only their success response and the live `auth_missing_header` code isn't on the list (10 of 15). The path carries v1 and the data format page promises that fields are never removed and lists four deprecated fields with months. No API changelog was found, only the SDK and plugin changelogs (8 of 15).",
        "checklist": [
          "APIs and MCP servers.",
          "- 25, a machine-readable contract (a public OpenAPI file or similar; for MCP, typed JSON Schema inputs on every tool).\n- 10, llms.txt or Markdown docs served for agents.\n- 0 to 20, descriptions that say what a tool is for, when to use it and when not to, read from the tool definitions in the source or the API reference.\n- 0 to 15, typed inputs with enums, constraints and required fields, and no free-form JSON blobs.\n- 0 to 15, examples and documented error responses.\n- 15, versioning and a public changelog.",
          "Models are read from the API reference, the OpenAPI file, llms.txt, the structured-output and tool-use docs and the model cards. Frameworks from docs a model can follow, typed interfaces, examples and the API reference."
        ],
        "checklistUrl": "https://www.anchorterminal.com/benchmark/#checklist-schema"
      },
      {
        "key": "maintenance",
        "name": "Maintenance \u0026 community",
        "score": 80,
        "maxGain": 1.8,
        "reason": "The `ship24` npm package reached 1.1.0 on 6 October 2026, two days before the check (30). In the 90 days before the check there were five dated releases, the Node SDK 1.0.0 on 14 July and 1.1.0 on 6 October, MCP server 1.0.0 on 16 July and 1.0.1 on 27 August in the official registry, and the AI plugin 1.0.0 on 9 September (20). The service is closed, with no API changelog. Support is a contact form, and the GitHub API shows four open issues on the SDK repository and two on the plugin, which we didn't read (6 of 15). The MCP server is in the official registry under the domain namespace `com.ship24/tracking-mcp` (15). The SDK has no runtime dependencies, CI that tests Node 20, 22 and 24, and a workflow that reports drift from the OpenAPI spec (9 of 10).",
        "checklist": [
          "- 0 to 30, time since the last release, or the last published model or API change for a closed service. 30 within 30 days, 20 within 90, 10 within 180, 0 older.\n- 20, at least three releases or dated changelog entries in the last 90 days.\n- 0 to 25, responsiveness. Issues and pull requests answered on GitHub (the open issues and how recent the replies are). For closed services, a public changelog and a support or community channel that answers, 0 to 15.\n- 15, presence in the official MCP registry under a verified namespace (MCP servers), or current official SDKs (APIs and models).\n- 10, package health, current dependencies and CI.",
          "Models are read for deprecation notice periods and model churn rather than release counts."
        ],
        "checklistUrl": "https://www.anchorterminal.com/benchmark/#checklist-maintenance"
      }
    ],
    "provenance": [
      {
        "label": "Terms of service",
        "value": "read, states 5 of the 7 things a reader expects, and has 1 clause that costs points",
        "points": 6.3,
        "max": 10
      },
      {
        "label": "Privacy policy",
        "value": "read, states 6 of the 8 things a reader expects",
        "points": 8.5,
        "max": 10
      },
      {
        "label": "Status page",
        "value": "not found",
        "points": 0,
        "max": 10
      },
      {
        "label": "Changelog",
        "value": "not found",
        "points": 0,
        "max": 10
      },
      {
        "label": "security.txt",
        "value": "not found",
        "points": 0,
        "max": 10
      }
    ],
    "unchecked": [
      "unchecked: whether the free plan asks for a card. The dashboard at dashboard.ship24.com needs an account, and we didn't sign up.",
      "unchecked: API key rotation and revocation in the dashboard. The docs say keys are viewed and managed there, and the plugin's security note says a key can be revoked.",
      "unchecked: GitHub issues on ship24-node (four open) and ship24-ai-plugin (two open), and how quickly they are answered.",
      "No status page was found. status.ship24.com failed to resolve from two readers and ship24.statuspage.io redirects to an inactive page. Ship24 may publish one at an address we didn't find.",
      "The Application developer and API agreement and the Ship24 Data Processing Agreement named in the terms were not found on the site, so `provenance.terms` points at the Terms and Conditions.",
      "The Terms and Conditions carry no effective date or version.",
      "A second registry entry, io.github.ship24-official/ship24-tracking, describes a stdio server from a different GitHub account. We didn't establish whether Ship24 runs that account and left it out.",
      "The listing covers the Tracking API. Ship24's tracking pages, delivery notifications, IOSS and Ship from China services have no API in the reviewed documentation.",
      "Courier count (2,500+) is the vendor's figure. We didn't fetch `GET /couriers`, which needs a key."
    ],
    "weaknesses": [
      "No status page was found. `status.ship24.com` doesn't resolve, and neither the site nor the docs link to one",
      "The terms supply the service as is, with no uptime commitment, and allow account termination and data deletion without notice",
      "API keys have no scopes or read-only mode. The docs describe up to 20 keys an account, managed in the dashboard",
      "Webhooks are authenticated by a static secret in the `Authorization` header, with no payload signature",
      "The API agreement and the data processing agreement named in the terms, and a subprocessor list, were not found on the site"
    ],
    "agentNotes": [
      "Send `Authorization: Bearer apik_...` to `https://api.ship24.com/public/v1`. The same key works on the MCP server, which lists tools without a key but answers 401 on calls",
      "Store the `trackerId` or set a unique `clientTrackerId`. Tracking numbers aren't unique, and any changed field on a repeat `POST /trackers` creates a second tracker that uses quota",
      "Allow up to 60 seconds for the first `POST /trackers/track` or `POST /tracking/search` call, since results are fetched from the courier synchronously",
      "Cache `GET /couriers`. It is limited to one request a second and returns the whole courier list, and courier auto-detection usually makes `courierCode` unnecessary",
      "Check for `quota_limit_reached` and `no_active_subscription`. `POST /tracking/search` needs a separate per-call plan, and the free plan blocks at 10 shipments a month"
    ],
    "recheck": "https://www.anchorterminal.com/builders/#disputes"
  },
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-10-08",
    "license": "CC-BY-4.0",
    "method": "https://www.anchorterminal.com/benchmark/",
    "methodology": "0.4",
    "openapi": "https://www.anchorterminal.com/openapi.json",
    "preview": false,
    "run": "2026-10-01",
    "runLabel": "October 2026 research run"
  }
}
