tracking-requests-mcp
Allows creating FedEx labels via a staged write path (dev sandbox or production), with preflight validation and idempotent label creation. Integrates with FedEx's API through an n8n webhook for label generation.
Triggers an n8n webhook workflow to process FedEx label requests, which then communicates with FedEx's API and writes results back to the database.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@tracking-requests-mcpcheck tracking request status for order ABC-123"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 |
| Raw read-only SQL escape hatch (SELECT/WITH/EXPLAIN/SHOW, single statement). |
| Commodities by |
| Shipping contacts warranting a system flag (No Phone / No Postal Code / Address Line 1|2 > 35) — read-only counterpart of the |
| Tracking requests with triage filters; |
| 360° rollup for ONE request by |
| Live DB vs the tool CONTRACT — missing tables/columns (breakage). |
| Live schema vs the committed baseline — additions = candidate tools, removals = breakage. |
| 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 |
| Create a FedEx label: per-box |
| 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_queryguard rejects non-read statements; every read pool connects withdefault_transaction_read_only=on. Writes run ONLY throughlib/writes.json 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 whenENABLE_WRITESis 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"requiresconfirm:trueand creates real, billable labels. Every mutating call requiresrequestedBy(stampedcreated_by = "mcp:<requestedBy>").Explicit
env(dev|prod), defaultdev. An env is usable only if itsDATABASE_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
idacross 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. SeeDEPLOY.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_cancelwrite tool (the undo path: FedEx cancel + soft delete) — spec'd as an open question inopenspec/changes/mcp-fedex-label-creation/design.md.FedEx
pickup_availabilityread tool (needsFEDEX_*creds).Once real sessions accumulate,
/mcp-evolvewill mine recurringdb_queryshapes into curated tools.
Available Tools
9 toolscommodity_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.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | Target database environment (wired now: dev). Defaults to dev (safe). | dev |
| sku | No | ||
| limit | No | ||
| title | No | Substring match on product_title / parent_name. | |
| source | No | ||
| htsCode | No | ||
| bpProductId | No | ||
| includeRemoved | No | ||
| shopifyProductId | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | Target database environment (wired now: dev). Defaults to dev (safe). | dev |
| limit | No | ||
| country | No | Filter by country_code (e.g. 'US'). |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | Target database environment (wired now: dev). Defaults to dev (safe). | dev |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | Target database environment (wired now: dev). Defaults to dev (safe). | dev |
| sql | Yes | A single read-only SQL statement. | |
| params | No | Bind values for $1,$2,… |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | Target database environment (wired now: dev). Defaults to dev (safe). | dev |
| shipmentType | Yes | Which sources to list: contacts (international) or stores (domestic). |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | Target database environment (wired now: dev). Defaults to dev (safe). | dev |
| lines | No | International only: commodity lines (catalog or custom/off-catalog). MCP cap: 50. Refused on a domestic shipment, which is weight-only. | |
| weight | No | Domestic only: package weight per box. | |
| numBoxes | Yes | Boxes in the multi-piece shipment (identical contents per box). MCP cap: 10. | |
| shipmentType | Yes | ||
| shipToStoreId | No | Domestic: destination store id (must differ from origin). | |
| shipFromStoreId | No | Domestic: origin store id (Store Locations API). | |
| shipToContactId | No | International: destination shipping_contacts id. | |
| importerContactId | No | International only: importer shipping_contacts id. | |
| shipFromContactId | No | International: origin shipping_contacts id. | |
| packageDescription | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | Target database environment (wired now: dev). Defaults to dev (safe). | dev |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| env | No | Target database environment (wired now: dev). Defaults to dev (safe). | dev |
| batchId | No | ||
| transactionId | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | Target database environment (wired now: dev). Defaults to dev (safe). | dev |
| limit | No | ||
| status | No | ||
| batchId | No | batch_id UUID that groups a create-label batch. | |
| shipmentType | No | ||
| includeDeleted | No | ||
| missingTrackingOnly | No |
TDQS
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.
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.
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.
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.
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.
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.
9 tool updates
v0.1.0- First observed
commodity_lookup - First observed
contacts_needing_fixes - First observed
coverage_report - First observed
db_query - First observed
label_options - First observed
label_preflight - First observed
schema_check - First observed
tracking_request_overview - First observed
tracking_requests_list
TDQS
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.
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.
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.
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
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
MCP server for EasyPost — rate shipments, buy & refund labels, track packages, verify addresses.
MCP server for ua_postal_tracking_mcp
MCP server for Modern Treasury — payment orders, transactions, counterparties and ledgers.
Read-only MCP server for ClassQuill, a tutoring-business-management platform.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceAn MCP server that enables interaction with ShipEngine's shipping API, allowing users to manage shipments, labels, carriers, and other shipping operations through natural language commands.-
- AlicenseNot gradedqualityDmaintenanceProvides a Model Context Protocol server for managing shipping orders and address book functionality with support for connecting to real shipping services via HTTP API.MIT
- FlicenseNot gradedqualityBmaintenanceA 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-
- AlicenseNot gradedqualityDmaintenanceA 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.1MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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