Skip to main content
Glama
aarondotdev

tracking-requests-mcp

by aarondotdev

tracking-requests-mcp

An app MCP for the tracking-requests shipping-label app: a broad read-only surface plus one tightly-staged write path (FedEx label creation) — over stdio (local), against the dev or prod Cloud SQL database via an env/stage param.

New here? Read GUIDE.md — setup for every Claude surface (Claude Code, Claude Desktop, claude.ai connector) plus everyday usage, the label workflow, and troubleshooting. This README covers the architecture/invariants; DEPLOY.md covers hosting.

Built with the MCP Playbook shape: one createServer() factory (register.js), thin server.js, one lib/ module per domain, a read-only guard, graceful degradation, a 360° rollup + a raw-query escape hatch.

Tools (8 read, + 2 write when ENABLE_WRITES is set)

Read (8) — always available

Tool

What it does

db_query

Raw read-only SQL escape hatch (SELECT/WITH/EXPLAIN/SHOW, single statement).

commodity_lookup

Commodities by sku / htsCode / shopifyProductId / bpProductId / title; honors removed_at; attaches app-owned manual prices; source = erp|manual.

contacts_needing_fixes

Shipping contacts warranting a system flag (No Phone / No Postal Code / Address Line 1|2 > 35) — read-only counterpart of the backfill-contact-status script.

tracking_requests_list

Tracking requests with triage filters; missingTrackingOnly surfaces stuck (no tracking number) requests.

tracking_request_overview

360° rollup for ONE request by id / transactionId / batchId: request + content lines + resolved commodities + party JSON + derived flags.

schema_check

Live DB vs the tool CONTRACT — missing tables/columns (breakage).

coverage_report

Live schema vs the committed baseline — additions = candidate tools, removals = breakage.

label_preflight

Validate a proposed shipment with ZERO side effects: parties + flags, per-line commodity/HTS checks, unit-value suggestions, env wiring.

Write (2) — opt-in via ENABLE_WRITES; staged, dev-first, prod gated

Tool

What it does

label_create

Create a FedEx label: per-box tracking_requests + snapshot tracking_contents rows in one transaction, then fire the n8n FedEx webhook. stage:"dev" default (sandbox); stage:"prod" needs confirm:true and is billable. Idempotent via batchId; dryRun previews.

label_webhook_retry

Re-fire the label webhook for a stranded batch (rows without tracking numbers). No DB write.

Plus one resource: snl-fedex-mcp://reference (resources/reference.md) — data model, integrations, canonical keys, footguns, and the write-surface contract.

Related MCP server: Shipping Service MCP Server

Layout

tracking-requests-mcp/
  register.js            createServer() — all tools + the reference resource
  server.js              stdio entry (thin); runs schema_check on boot (logs to stderr)
  httpServer.js          remote entry: stateless Streamable HTTP + bearer auth (Cloud Run)
  deploy.sh / DEPLOY.md  idempotent Cloud Run deploy + claude.ai connector steps
  lib/
    env.js               one-.env loader + per-env read-only pg Pool factory (dev|prod)
    db.js                read-only guard + generic query + table/column probes + SELECT *
    commodities.js       commodity_lookup
    contacts.js          contacts_needing_fixes (mirrors src/lib/contact-status.ts rules)
    tracking.js          tracking_requests_list + tracking_request_overview (rollup)
    writes.js            staged write harness (dev-first, prod confirm gate, ensure-in-dev)
    labels.js            label_preflight / label_create / label_webhook_retry (mirrors createLabel)
    schema.js            CONTRACT + schema_check + coverage_report + snapshot
  resources/
    reference.md         tribal knowledge (MCP resource)
    evolution-ledger.json  /mcp-evolve dedupe ledger
    schema-baseline.json   coverage_report baseline (created by `npm run snapshot`)
  scripts/
    verify.mjs           end-to-end protocol verification (npm run verify)
    snapshot.mjs         record schema baseline (npm run snapshot [env])

The Phase 7 self-evolution scripts (detect-signals.mjs, mcp-evolve-tick.ps1) are local-only and not committed — they hardcode one machine's paths and drive an autonomous agent. See Self-evolution.

Invariants

  • Readers are read-only, two layers. The db_query guard rejects non-read statements; every read pool connects with default_transaction_read_only=on. Writes run ONLY through lib/writes.js on a separate writable pool (getWritePool), single-transaction, rollback on error.

  • Writes are opt-in (ENABLE_WRITES). The two mutating tools (label_create, label_webhook_retry) are registered only when ENABLE_WRITES is set — one gate on the shared factory covers every transport. Unset → a read-only 8-tool server (the default for the hosted multi-user connector); set (local .env, CI) → the full 10-tool surface.

  • Staged writes. stage:"dev" (default) is a full isolated environment (dev DB + dev n8n + FedEx sandbox); stage:"prod" requires confirm:true and creates real, billable labels. Every mutating call requires requestedBy (stamped created_by = "mcp:<requestedBy>").

  • Explicit env (dev|prod), default dev. An env is usable only if its DATABASE_URL_<ENV> is set; an unwired env returns a clean structured error naming the variable, never a driver crash. Write tools additionally refuse when their stage's webhook/API config is missing (names only).

  • Canonical business keys, never serial id across envs: sku/shopify_product_id (commodities), transaction_id/batch_id (tracking requests), code (contacts).

  • Graceful degradation: tables are probed before use; SELECT * so added columns never break a reader; missing pieces return null/empty.

Setup

cd tracking-requests-mcp
npm install
cp .env.example .env            # fill in DATABASE_URL_DEV (and _PROD); for label_create also
                                # N8N_FEDEX_TRACKING_REQUEST_WEBHOOK_URL_<ENV> + snapshot/config vars
npm run verify                  # end-to-end over the MCP protocol
npm run snapshot dev            # record the coverage baseline (needs a wired env)

The DBs are Cloud SQL — for local access run the Cloud SQL Auth Proxy and point DATABASE_URL_DEV at it (see .env.example). Already wired into the repo's .mcp.json as snl-fedex-mcp (stdio).

Verification status

npm run verify: 16/16 against the live dev database (readers return real data; write gates refuse structurally; no secret values in any output). Live dev-stage label creation verified end-to-end on 2026-07-22: preflight → dryRun → label_create → n8n → FedEx sandbox → tracking number + label/invoice PDFs written back → tracking_request_overview confirms → idempotent re-call returns created:false. The dev n8n workflow demonstrably writes back to the dev DB. Prod stage remains untouched (DATABASE_URL_PROD deliberately unwired locally).

Self-evolution (Phase 7)

Both scripts below are gitignored — they are not in this repo. They hardcode absolute paths for a single developer's machine and launch an autonomous agent, so they're kept local rather than published. Ask if you want a copy to adapt.

scripts/detect-signals.mjs cheaply detects coverage/schema/repo/usage drift and prints TRIGGER only on a change. scripts/mcp-evolve-tick.ps1 runs it hourly and launches /mcp-evolve headless on a delta. It is not registered as a scheduled task by the build, and it deliberately does not push — because this MCP lives inside the app repo whose pushes auto-deploy the app. Register the task yourself (command at the bottom of the .ps1) once you want the loop live; consider moving the MCP to its own repo first if you want auto-push/redeploy.

Not built (by design)

  • Other writes — label creation is the only mutation. label_cancel (FedEx cancel + soft delete), pickup scheduling, contact/commodity edits: all still require explicit requests on the staged harness.

  • Hosting — now built: httpServer.js + Cloud Run + claude.ai custom connector, dev-wired only. See DEPLOY.md.

  • FedEx pickup-availability read tool — genuinely read-only but needs FedEx OAuth creds and is really an app action; deferred to the roadmap to keep the surface DB-scoped and verifiable.

Roadmap / candidates

  • label_cancel write tool (the undo path: FedEx cancel + soft delete) — spec'd as an open question in openspec/changes/mcp-fedex-label-creation/design.md.

  • FedEx pickup_availability read tool (needs FEDEX_* creds).

  • Once real sessions accumulate, /mcp-evolve will mine recurring db_query shapes into curated tools.

Available Tools

9 tools
commodity_lookupA

Look up commodities by any business identifier (sku, htsCode, shopifyProductId, bpProductId, or a title/parent-name substring). ERP-synced rows are source='erp'; app-created rows are source='manual' (no shopify_product_id). Soft-deleted rows (removed_at) are excluded unless includeRemoved. Attaches app-owned manual prices.

ParametersJSON Schema
NameRequiredDescriptionDefault
envNoTarget database environment (wired now: dev). Defaults to dev (safe).dev
skuNo
limitNo
titleNoSubstring match on product_title / parent_name.
sourceNo
htsCodeNo
bpProductIdNo
includeRemovedNo
shopifyProductIdNo

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations, the description carries full burden. It reveals key behaviors: source distinction, soft-delete exclusion, and price attachment. However, it does not clarify whether multiple identifiers can be combined, ordering of results, or other side effects.

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

Conciseness5/5

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

The description is three sentences long, front-loaded with the main purpose, and provides essential contextual information without extraneous details. Every sentence adds value.

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

Completeness3/5

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

Given 9 parameters, no annotations, and no output schema, the description covers primary lookup behavior and key filters but omits details on limit, env, result format, and error handling. Adequate but has clear 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 low (22%); the description adds meaning for sku, htsCode, shopifyProductId, bpProductId, title, source, and includeRemoved. However, it omits limit and env, and does not explain each parameter's constraints beyond the schema defaults.

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

Purpose5/5

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

The description clearly states 'Look up commodities' with a specific action and resource. It lists exact identifiers (sku, htsCode, etc.) and distinguishes from sibling tools, which are all different operations (e.g., coverage_report, db_query).

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

Usage Guidelines4/5

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

The description explains the context of ERP vs. manual rows and soft-deletion, but does not explicitly state when to use this tool versus alternatives or provide exclusion criteria. Since no sibling is a lookup tool, the guidance is sufficient but not explicit.

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

contacts_needing_fixesA

List shipping contacts that currently warrant a system status flag (No Phone, No Postal Code, Address Line 1 > 35, Address Line 2 > 35) — i.e. contacts whose details will break FedEx label/invoice creation. Read-only counterpart of the backfill-contact-status script; flags are recomputed live.

ParametersJSON Schema
NameRequiredDescriptionDefault
envNoTarget database environment (wired now: dev). Defaults to dev (safe).dev
limitNo
countryNoFilter by country_code (e.g. 'US').

TDQS

A3.9/5.0
Behavior4/5

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

The description explicitly states it is 'Read-only' and 'flags are recomputed live', providing key behavioral traits. With no annotations provided, this is valuable. It does not cover rate limits or pagination, but the mutation safety is well conveyed.

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 three sentences with no fluff. It front-loads the core purpose and includes essential context (read-only, live recompute, defaults). Every sentence earns its place.

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

Completeness2/5

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

Given no output schema, the description does not explain the return format (e.g., fields, count, pagination). It also lacks details on ordering or behavior with zero results. While the purpose is clear, the lack of output structure hinders full comprehension.

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 67% (env and country have descriptions, limit does not). The tool's description adds no parameter information beyond the schema. The undocumented 'limit' parameter leaves a gap for the agent, as its purpose and constraints are not explained.

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

Purpose5/5

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

The description clearly states the verb 'List' and the resource 'shipping contacts that currently warrant a system status flag', specifying exact conditions. It distinguishes this tool as a read-only counterpart of a backfill script, which differentiates it from sibling tools like db_query or coverage_report.

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

Usage Guidelines4/5

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

The description implies usage for checking contacts that will break FedEx label creation, and notes it is read-only and live-recomputed. However, it does not explicitly state when to use vs. alternatives or provide exclusion criteria, but the context is clear enough for an agent.

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

coverage_reportA

Diff the live schema against the committed baseline snapshot. ADDED tables/columns = candidate tools/params; REMOVED = breakage. Run npm run snapshot to acknowledge.

ParametersJSON Schema
NameRequiredDescriptionDefault
envNoTarget database environment (wired now: dev). Defaults to dev (safe).dev

TDQS

A3.5/5.0
Behavior2/5

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

No annotations provided, so description must fully explain behavior. It omits side effects (e.g., destructive?) and doesn't clarify 'acknowledge' meaning. Lacks safety or side-effect details.

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

Conciseness5/5

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

Three sentences, front-loaded with core purpose, no waste. Efficient and to the point.

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?

Describes return concept (ADDED/REMOVED) but lacks specifics on format, pagination, or examples. Adequate for a simple tool but missing details for full completeness.

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

Parameters3/5

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

Schema already covers the single param 'env' with description. The tool description does not add further meaning beyond schema, so baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states it diffs live schema against baseline snapshot, explaining ADDED/REMOVED items. It uniquely identifies the tool's purpose among 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?

Mentions running 'npm run snapshot' to acknowledge, but doesn't explicitly compare to siblings like schema_check or state when not to use. Usage context is implied, not clear.

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

db_queryA

Run a READ-ONLY SQL query (SELECT/WITH/EXPLAIN/SHOW only; single statement) against the tracking-requests DB. Escape hatch for anything the curated tools don't cover. Params are passed as $1,$2,… bind values.

ParametersJSON Schema
NameRequiredDescriptionDefault
envNoTarget database environment (wired now: dev). Defaults to dev (safe).dev
sqlYesA single read-only SQL statement.
paramsNoBind values for $1,$2,…

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden. It clearly states the tool is read-only, allows only specific SQL statement types, and is single-statement. It also hints at the binding syntax. It does not specify error handling or permissions, but the core behavioral trait (read-only) is well communicated.

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

Conciseness5/5

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

Two sentences, front-loaded with the core action and constraints. Every sentence is informative and earns its place. No wasted words.

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

Completeness4/5

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

Given the tool's complexity (direct SQL execution), the description covers the query types allowed, database target, parameter binding, and the escape hatch role. It does not describe the return format (e.g., rows as JSON), which might be assumed. Overall, it is largely complete for the usage context.

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% (3 parameters described), so baseline 3. The description adds value by explaining that parameters are passed as $1,$2,… bind values, which clarifies usage beyond the schema's type definitions. This is a meaningful addition for an AI agent.

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

Purpose5/5

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

The description clearly states the tool runs read-only SQL queries (SELECT/WITH/EXPLAIN/SHOW only) against a specific database. It uses a specific verb ('Run') and resource term ('SQL query'), and distinguishes itself from sibling tools by being an 'escape hatch' for queries not covered by curated tools.

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

Usage Guidelines4/5

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

The description explicitly positions the tool as an 'escape hatch' for cases not covered by other tools, providing good context. It also restricts usage to read-only queries. However, it does not explicitly list when not to use it or name specific alternatives, though the sibling list implies the alternatives.

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

label_optionsA

List the ship-from / ship-to / (importer, international only) parties the user can pick, BY NAME, from the same sources as the app form — so nobody needs to know IDs. Returns each option's id, display name, disambiguating context (country for contacts, city/state for stores), any contact flags, and sole when it's the only choice. Show the names to the user, then pass the chosen option's id to label_preflight / label_create. Call this before creating a label when you don't already have the party IDs.

ParametersJSON Schema
NameRequiredDescriptionDefault
envNoTarget database environment (wired now: dev). Defaults to dev (safe).dev
shipmentTypeYesWhich sources to list: contacts (international) or stores (domestic).

TDQS

A4.5/5.0
Behavior4/5

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

No annotations provided, so description carries full burden. It explains return fields (id, display name, disambiguating context, contact flags, sole) and data source (same as app form). While it doesn't explicitly state read-only or auth requirements, the nature as a list tool is clear and no contradictions.

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

Conciseness4/5

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

Description is a single paragraph that front-loads the main purpose, then details return structure and usage. It is fairly concise given the information needed, with no wasted words.

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

Completeness4/5

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

Given no output schema, description compensates by listing return fields. It explains relationship to sibling tools and env parameter default. Lacks pagination or error handling info, but is reasonably complete for a 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?

Schema coverage is 100%, but description adds context: env defaults to dev (safe), shipmentType determines sources (contacts for international, stores for domestic). This adds meaning beyond the enum values.

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

Purpose5/5

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

The description clearly states it lists ship-from/ship-to/importer parties by name, returning IDs and display info. It distinguishes itself from siblings by specifying it should be called before label_preflight/label_create when party IDs are unknown.

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 says when to use: 'Call this before creating a label when you don't already have the party IDs.' It also instructs to show names to user and pass the chosen ID to label_preflight/label_create, and indirectly implies not needed if IDs are already known.

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

label_preflightA

Validate a proposed FedEx shipment with ZERO side effects: party resolution + contact system flags (these break FedEx invoices), per-line commodity checks (exists, not soft-deleted, valid 10-digit HTS, required construction/type/fabric), unit-value suggestions (manual price, then commodity_prices), the international declared-value limit (CN $680 / else 5000 RMB live) with a projected total, and env wiring. Custom (off-catalog) lines are checked for their own required fields and get no unit-value suggestion (there is no catalog key to look up). Run this first.

ParametersJSON Schema
NameRequiredDescriptionDefault
envNoTarget database environment (wired now: dev). Defaults to dev (safe).dev
linesNoInternational only: commodity lines (catalog or custom/off-catalog). MCP cap: 50. Refused on a domestic shipment, which is weight-only.
weightNoDomestic only: package weight per box.
numBoxesYesBoxes in the multi-piece shipment (identical contents per box). MCP cap: 10.
shipmentTypeYes
shipToStoreIdNoDomestic: destination store id (must differ from origin).
shipFromStoreIdNoDomestic: origin store id (Store Locations API).
shipToContactIdNoInternational: destination shipping_contacts id.
importerContactIdNoInternational only: importer shipping_contacts id.
shipFromContactIdNoInternational: origin shipping_contacts id.
packageDescriptionYes

TDQS

A4.4/5.0
Behavior5/5

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

The description explicitly declares zero side effects, which is critical for a validation tool. It enumerates all behavioral aspects: party resolution, contact system flags, commodity checks, unit-value suggestions, declared-value limit, and env wiring. No annotations are provided, so the description carries the full burden, and it does so thoroughly.

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 a single, dense sentence that front-loads the key purpose ('Validate... with ZERO side effects') and then lists checks. While it conveys all information, the structure is somewhat run-on and could benefit from bullet points for readability. Still, it is appropriately sized and contains no fluff.

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

Completeness3/5

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

The description thoroughly covers what the tool does but omits any mention of output or return value. Since there is no output schema, the description should indicate what the tool returns (e.g., validation errors, summary). This gap reduces completeness given the tool's complexity (11 parameters, detailed checks).

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 high (82%), but the description adds meaningful context beyond schema definitions. It explains preflight's role in suggesting values (e.g., unitValue, commodity fields) and clarifies behavior for custom lines (no unit-value suggestion). This enhances understanding of parameter semantics during validation.

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

Purpose5/5

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

The description clearly states the tool validates a FedEx shipment with zero side effects, listing specific checks (party resolution, commodity validation, unit-value suggestions, declared-value limit). It positions itself as a pre-validation step ('Run this first'), distinguishing it from any creation tool. The purpose is unambiguous and specific.

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 explicitly recommends using this tool first ('Run this first'), implying it should precede label creation. It also notes that custom lines have different handling (no unit-value suggestion). However, it does not explicitly state when not to use it or contrast with siblings like label_options, leaving some ambiguity about alternatives.

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

schema_checkB

Introspect the live DB and report any tables/columns the tools DEPEND ON that are missing (the breakage side of drift). ok:true means the contract holds.

ParametersJSON Schema
NameRequiredDescriptionDefault
envNoTarget database environment (wired now: dev). Defaults to dev (safe).dev

TDQS

B3.4/5.0
Behavior3/5

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

No annotations exist, so the description bears full burden. It discloses it reports missing dependencies and uses 'ok:true' for contract check, but does not reveal if the operation is read-only or has side effects, nor any auth or rate limit info.

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

Conciseness4/5

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

Description is two sentences with no waste, clearly stating purpose and output meaning. Could be slightly more structured for readability, but overall concise and front-loaded.

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

Completeness3/5

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

The description is adequate for a tool with one simple parameter, but lacks details on output format (no output schema). It mentions 'ok:true' but not the structure of the report, which is a gap for the agent.

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

Parameters3/5

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

Schema coverage is 100% with one parameter fully described in the schema (env with enum and default). The tool description adds no further meaning beyond what the schema provides, so baseline score 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool introspects the live DB to report missing tables/columns that tools depend on, which is a specific verb+resource purpose. It distinguishes from siblings like 'db_query' or 'coverage_report' by focusing on contract drift breakage.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives. No explicit context for usage, such as prerequisites, when to check drift, or when to prefer other tools like 'db_query'.

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

tracking_request_overviewA

360° rollup for ONE tracking request by id, transactionId (FedEx), or batchId (uuid). Returns a plain summary (tracking number, ready flag, from/to, contents, boxes) and a files list (shipping label PDF, and commercial invoice PDF for international) with open links, plus the raw request, content lines with resolved commodity, party JSON snapshots, and derived flags. allReady is true once every box has its tracking number and PDFs. A batchId that matches several requests returns them all — use this after creating a label to show the summary and files.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNo
envNoTarget database environment (wired now: dev). Defaults to dev (safe).dev
batchIdNo
transactionIdNo

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the full burden. It discloses what the tool returns (summary, files, raw request, etc.) and explains the 'allReady' flag and batchId behavior. However, it does not explicitly state whether the tool is read-only or has side effects.

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

Conciseness5/5

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

The description is three sentences, front-loading the purpose and efficiently covering key points without wasted words.

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

Completeness5/5

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

Given 4 parameters, no output schema, and no annotations, the description thoroughly explains the tool's return structure and behavior, including the summary fields, files list, raw request, and 'allReady' flag, providing sufficient context for an agent.

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 only 25%, but the description adds meaning by specifying that 'transactionId' is FedEx-specific and 'batchId' is a uuid. It does not mention the 'env' parameter, but overall it compensates for the schema's lack of detail.

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

Purpose5/5

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

The description clearly states it provides a '360° rollup for ONE tracking request' by specific identifiers, distinguishing it from listing tools like 'tracking_requests_list'. It specifies the verb 'rollup' and resource 'tracking request'.

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 includes a usage hint: 'use this after creating a label to show the summary and files.' It implies when to use but does not explicitly state when not to or name alternatives, though the context of sibling tools makes the distinction clear.

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

tracking_requests_listA

List tracking requests with triage filters. missingTrackingOnly:true surfaces requests with no tracking_number yet (the n8n label webhook is fire-and-forget, so a stuck request shows here). Soft-deleted rows excluded unless includeDeleted.

ParametersJSON Schema
NameRequiredDescriptionDefault
envNoTarget database environment (wired now: dev). Defaults to dev (safe).dev
limitNo
statusNo
batchIdNobatch_id UUID that groups a create-label batch.
shipmentTypeNo
includeDeletedNo
missingTrackingOnlyNo

TDQS

A3.5/5.0
Behavior3/5

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

No annotations exist, so the description carries full burden. It discloses that missingTrackingOnly surfaces requests without tracking_number due to a fire-and-forget webhook, and that soft-deleted rows are excluded by default. It does not discuss mutation safety, rate limits, or other behavioral traits, leaving gaps.

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 plus a short note, all front-loaded with key information. Every sentence earns its place with no fluff. Very concise yet informative.

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

Completeness3/5

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

Given 7 parameters, no output schema, and no annotations, the description covers key filtering intentions but omits details on sorting, pagination (limit), and other filters. It is adequate for basic use but not fully complete for a parameter-heavy tool.

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

Parameters3/5

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

Schema description coverage is low (29%), so the description should compensate. It explains the purpose of missingTrackingOnly and imply includeDeleted behavior. However, other parameters (env, limit, status, batchId, shipmentType) are not addressed, leaving them underspecified. The description adds value for two params but not enough to fully compensate.

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 clearly states the tool lists tracking requests with triage filters, specifying the resource and action. It provides specific details about missingTrackingOnly and includeDeleted, making the purpose clear. However, it does not explicitly distinguish from siblings like tracking_request_overview, so loses some points.

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 gives context on when to use missingTrackingOnly (for stuck requests) and mentions soft-deleted exclusion. However, no guidance on when to use this tool versus siblings (e.g., tracking_request_overview, db_query) or alternatives. It provides some usage hints but lacks comparative guidance.

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. Dates show when Glama detected each change.

  1. 9 tool updatesv0.1.0
    • First observedcommodity_lookup
    • First observedcontacts_needing_fixes
    • First observedcoverage_report
    • First observeddb_query
    • First observedlabel_options
    • First observedlabel_preflight
    • First observedschema_check
    • First observedtracking_request_overview
    • First observedtracking_requests_list

TDQS

A3.6/5.0
Disambiguation4/5

Most tools serve distinct purposes: schema checks, commodity lookup, contacts, tracking requests, and label preflight. The only potential confusion is between coverage_report and schema_check, both dealing with schema drift, but their descriptions differentiate them clearly.

Naming Consistency3/5

Tool names use snake_case but follow inconsistent patterns: some are noun_verb (commodity_lookup, schema_check), others noun_noun (tracking_requests_list, label_options), and one uses an abbreviation (db_query). This mixed convention reduces predictability.

Tool Count4/5

With 9 tools, the server covers core domain operations (commodities, contacts, tracking requests, labels) plus schema introspection. The count is reasonable, though the inclusion of schema tools might be overkill for typical agent interactions.

Completeness2/5

The server lacks a label_create tool despite references to it in descriptions, and there are no create/update/delete tools for tracking requests. These gaps will likely cause agent failures when attempting to complete workflows.

Maintenance

ActivitySlowing
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

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

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    B
    maintenance
    A standalone MCP server providing shipping tools like address validation and rate previews through a centralized HTTP interface. It serves as the single source of truth for shipping tool behavior across the ShipSmart platform.
    2
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    A horizontally scalable Model Context Protocol server for exposing shipment tracking (and other data sources) as authenticated MCP tools, starting with DB Schenker's public tracking endpoint.
    1
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/aarondotdev/fedex-label-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server