Skip to content

Connect EasyPost to ChatGPT: Automate Shipping Labels & Tracking

Sidharth Verma Sidharth Verma 11 min read AI & Agents
Elaichi from the team behind Truto

EasyPost in ChatGPT, in about a minute.

The best way to connect EasyPost to ChatGPT is Elaichi: connect EasyPost to Elaichi once, then add Elaichi to ChatGPT as a connector. Two steps, about a minute, with a 14‑day free trial and no credit card required.

  • No credit card required
  • 500+ connectors
  • Credentials vaulted, never read back
  1. Start your free trial

    14 days free, no credit card required.

  2. Connect EasyPost

    Once, in Elaichi. ChatGPT never gets more access than you have.

  3. Add Elaichi to ChatGPT

    In ChatGPT, open Plugins, press +, and paste the URL into Server URL. Sign in and approve.

    https://api.elaichi.ai/mcp
TrutoFor product teams

Building EasyPost into your own product? This guide is for you.

Connect EasyPost to ChatGPT to automate shipping labels, address verification, and tracking using Truto's managed MCP server. Learn how to configure tools, manage rate limits, and secure agent workflows.

The developer guide

Learn how to connect EasyPost to ChatGPT using a managed MCP server. This step-by-step architecture guide covers shipping label automation, tool configuration, and security.

If you need to connect EasyPost to ChatGPT to automate shipping labels, track packages across multiple carriers, or manage logistics workflows via natural language, you need a Model Context Protocol (MCP) server. This infrastructure layer acts as the translation engine between ChatGPT's tool calling capabilities and EasyPost's REST APIs. You can either spend weeks building, securing, and maintaining this server in-house, or use a managed integration platform like Truto to dynamically generate a secure, authenticated MCP server URL in seconds.

If your team uses Claude, check out our guide on connecting EasyPost to Claude or explore our broader architectural overview on connecting EasyPost to AI Agents.

Giving a Large Language Model (LLM) read and write access to a core logistics platform like EasyPost is a serious engineering challenge. You have to handle immutable data objects, multi-step purchasing flows, asynchronous batch processing, and complex rate limit behaviors. Every time your logistics team needs to expose a new carrier or customs capability to your AI agent, your custom server code must be updated, redeployed, and rigorously tested.

This guide breaks down exactly how to use Truto to generate a secure, managed MCP server for EasyPost, connect it natively to ChatGPT, and execute complex fulfillment workflows using natural language.

EasyPost to ChatGPT Quickstart Guide

If you want the fastest path from a fresh Truto account to ChatGPT successfully executing EasyPost API calls, follow these specific steps. We will cover both the UI-driven and API-driven approaches.

What you need:

  • A Truto account with API access.
  • An EasyPost account (test or production API keys).
  • A ChatGPT Pro, Plus, Business, Enterprise, or Education seat with Developer mode enabled (or a local MCP client).

Step 1: Connect EasyPost as an Integrated Account

First, you need to establish the baseline connection between Truto and EasyPost.

  1. In the Truto dashboard, navigate to Integrated Accounts -> New Integrated Account.
  2. Select EasyPost from the catalog.
  3. Provide your EasyPost API key. Truto securely stores this credential and will proxy all future requests through it.

Step 2: Generate an EasyPost MCP Server

Once the account is connected, you need to generate the MCP server endpoint. Truto scopes an MCP server to a single integrated account and applies dynamic tool generation.

Method A: Via the Truto UI

  1. Navigate to the integrated account page for your EasyPost connection.
  2. Click the MCP Servers tab.
  3. Click Create MCP Server.
  4. Select your desired configuration (e.g., naming the server, applying method or tag filters to restrict access to specific EasyPost operations).
  5. Copy the generated MCP server URL (it will look like https://api.truto.one/mcp/<token>). Treat this URL as a sensitive credential.

Method B: Via the API You can generate the MCP server programmatically by making a POST request to the Truto API. This is ideal for provisioning agent access dynamically.

curl -X POST https://api.truto.one/integrated-account/$INTEGRATED_ACCOUNT_ID/mcp \
  -H "Authorization: Bearer $TRUTO_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "ChatGPT Logistics Agent",
    "config": {
      "methods": ["read", "write", "custom"],
      "tags": ["shipments", "trackers", "addresses"]
    }
  }'

The response will return a JSON object containing the url field.

Step 3: Connect the MCP Server to ChatGPT

Now you must point ChatGPT to the Truto MCP URL so it can discover and call the EasyPost tools.

Method A: Via the ChatGPT UI

  1. Open ChatGPT and navigate to Settings -> Apps -> Advanced settings.
  2. Ensure Developer mode is enabled.
  3. Under the Custom Connectors or MCP servers section, click to add a new server.
  4. Give it a recognizable name like "EasyPost Logistics".
  5. Paste the Truto MCP URL into the Server URL field and save.

Method B: Via Manual Config File (SSE) If you are using the Claude Desktop app, cursor, or a custom ChatGPT client that reads standard MCP configuration files, you can use the @modelcontextprotocol/server-sse package to connect to Truto's Server-Sent Events endpoint.

Update your mcp_servers.json (or equivalent config file) with the following structure:

{
  "mcpServers": {
    "easypost-truto": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-sse",
        "https://api.truto.one/mcp/YOUR_TOKEN_HERE"
      ]
    }
  }
}

Once connected, the LLM will perform the MCP handshake, request tools/list, and dynamically ingest the EasyPost proxy capabilities.

The Engineering Reality of the EasyPost API

Integrating an LLM with a shipping API is significantly different than integrating with a standard CRM or helpdesk. EasyPost operates under strict physical-world constraints, which translates into specific API quirks that your integration architecture must handle.

Immutability of Core Objects

In a standard REST API, you can usually PATCH an object to update it. In EasyPost, core objects like Address, Parcel, and Shipment are entirely immutable once created. If an LLM drafts a shipment and realizes the weight was wrong, it cannot simply update the existing parcel. It must generate an entirely new Shipment object. The MCP tool descriptions generated by Truto explicitly handle these schemas, ensuring the LLM understands it must recreate, rather than update, fulfillment data.

The Two-Step Purchasing Flow

Generating a shipping label in EasyPost is rarely a single API call. First, you create a Shipment object (providing origin, destination, and parcel data). EasyPost responds with an array of available rates across different carriers. Second, you must extract a specific rate_id from that array and pass it to the buy endpoint. When building a custom MCP server, you have to write custom orchestration logic to handle this state. Truto exposes these as discrete tools (create_a_easy_post_shipment and easy_post_shipments_buy), allowing the LLM's natural reasoning capabilities to execute the multi-step flow seamlessly.

Asynchronous Batch Processing

When dealing with high-volume logistics (e.g., printing 500 labels at once), EasyPost utilizes asynchronous Batch objects. You create a batch, add shipments to it, and initiate a buy operation. The actual label generation happens in the background, eventually firing a webhook. If you build this in-house, your MCP server has to implement polling mechanisms or complex webhook catchers to return the final state to the LLM.

Strict Rate Limits and Error Handling

EasyPost enforces strict rate limits to protect its infrastructure. A critical architectural note: Truto does not retry, throttle, or apply backoff on rate limit errors. When the EasyPost upstream API returns an HTTP 429 Too Many Requests, Truto passes that exact error back to the caller. Truto normalizes the upstream rate limit information into standardized headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset) per the IETF specification. The AI agent framework (or ChatGPT client) is entirely responsible for detecting the 429 and applying its own retry or backoff logic.

Hero Tools for EasyPost Automations

Truto automatically derives MCP tools from the EasyPost OpenAPI definitions and documentation. Instead of maintaining boilerplate code for every endpoint, Truto dynamically generates the JSON-RPC tool schemas. Here are the most powerful "hero" tools available to your ChatGPT agents.

Create a Shipment

Tool name: create_a_easy_post_shipment

This is the foundational tool for logistics workflows. It accepts an origin address, a destination address, and a parcel definition. EasyPost uses this data to automatically fetch real-time shipping rates from all configured carriers. The LLM must use this tool first to see pricing before committing to a purchase.

"I need to ship a 15-ounce package measuring 10x8x4 inches from our main warehouse to 123 Main St, Austin TX. Create the shipment and tell me what rate options we have."

Buy a Shipment Label

Tool name: easy_post_shipments_buy

Once a shipment is created and rates are returned, this tool executes the financial transaction. It requires the shipment_id and the selected rate_id. The response includes the actual postage label (usually a URL to a PNG or PDF) and the finalized tracking code.

"Buy the shipment shp_987654321 using the cheapest available USPS Ground Advantage rate. Give me the tracking number and the label URL."

Create and Verify an Address

Tool name: easy_post_addresses_create_and_verify

Shipping to an invalid address results in costly return-to-sender fees. This tool creates an address object and synchronously verifies its deliverability against global postal databases, correcting minor formatting issues (like missing ZIP+4 codes) and determining if the address is residential or commercial.

"We received a new order for John Doe at 456 Elm Street, Apt 2, Seattle WA. Create and verify this address in EasyPost, and warn me if there are any deliverability issues."

Refund a Shipment

Tool name: easy_post_shipments_refund

If a customer cancels an order before it ships, or an agent spots an error, labels can often be refunded. This tool requests a refund for a specific shipment ID. Note that USPS labels must be refunded within 30 days, while UPS/FedEx generally allow 90 days. The LLM can use this to automate cancellation workflows.

"The customer for order #5555 canceled. Find the tracking number, pull up the shipment ID, and process a refund for the label."

Track an External Package

Tool name: create_a_easy_post_tracker

If a package was shipped outside of your primary EasyPost account (e.g., dropshipped by a vendor), you can still track it in EasyPost using Bring-Your-Own-Tracking (BYOT). This tool accepts a tracking code and a carrier name, establishing a webhook subscription that monitors the package's journey.

"Our vendor shipped the replacement parts via FedEx. The tracking number is 771234567890. Create a tracker in EasyPost so we can monitor its delivery status."

List SmartRates for Precision Delivery

Tool name: easy_post_shipments_list_smartrates

For US domestic shipments, SmartRates provides statistical time-in-transit predictions for every rate associated with a shipment. Instead of guessing when a package will arrive based on service level, the LLM can use this tool to pick the most cost-effective rate that statistically guarantees delivery by a specific date.

"We need this package to arrive by Friday. Look at the SmartRates for shipment shp_112233 and find the cheapest carrier option that has a 95% or higher probability of delivering within 3 transit days."

To view the complete schema definitions and the full list of available EasyPost tools, visit the EasyPost integration page.

Workflows in Action

Connecting EasyPost to ChatGPT transforms static logistics operations into dynamic, conversational workflows. Here are two concrete examples of how personas leverage these tools in the real world.

Scenario 1: Customer Support Handling an Address Error

A customer support agent receives a ticket: the customer accidentally entered the wrong shipping address on a recent order, and the label has already been generated but not yet shipped.

User Prompt:

"The customer for order #9988 reached out. They gave us the wrong address. The old shipment ID is shp_abc123. Please refund that label. Then, verify their new address: 789 Oak Lane, Denver CO 80204. If it's valid, create a new shipment using our standard 2lb box from the Denver warehouse, and buy the cheapest USPS rate."

Step-by-step Execution:

  1. Call easy_post_shipments_refund: The agent passes shp_abc123 to initiate the refund process on the incorrect label.
  2. Call easy_post_addresses_create_and_verify: The agent passes the new 789 Oak Lane address. The tool returns the verified address object, confirming deliverability and returning a new address_id.
  3. Call create_a_easy_post_shipment: The agent constructs the new shipment using the origin warehouse address ID, the new verified destination address ID, and the predefined 2lb parcel payload. The tool returns the shipment object containing an array of available rates.
  4. Call easy_post_shipments_buy: The agent identifies the cheapest USPS rate ID from the previous step and executes the purchase.
  5. Output: ChatGPT replies with a summary: "I have successfully submitted a refund for the old label. The new address was verified successfully. I created a new shipment and purchased the USPS Ground Advantage rate for $5.45. The new tracking number is 9400123456789, and the label URL is ready for printing."
sequenceDiagram
    participant User as Support Agent
    participant AI as ChatGPT
    participant Truto as Truto MCP
    participant EP as EasyPost API

    User->>AI: "Refund shp_abc123 and ship to new address..."
    AI->>Truto: Call easy_post_shipments_refund(shp_abc123)
    Truto->>EP: POST /v2/shipments/shp_abc123/refund
    EP-->>Truto: Status: submitted
    Truto-->>AI: Refund confirmation
    
    AI->>Truto: Call easy_post_addresses_create_and_verify(789 Oak Lane)
    Truto->>EP: POST /v2/addresses/create_and_verify
    EP-->>Truto: Address ID: adr_789
    Truto-->>AI: Verified Address Object
    
    AI->>Truto: Call create_a_easy_post_shipment(adr_789, warehouse, parcel)
    Truto->>EP: POST /v2/shipments
    EP-->>Truto: Shipment ID + Rates Array
    Truto-->>AI: Available Rates
    
    AI->>Truto: Call easy_post_shipments_buy(rate_id)
    Truto->>EP: POST /v2/shipments/shp_new/buy
    EP-->>Truto: Tracking Number + Label URL
    Truto-->>AI: Purchase complete
    AI-->>User: "Refund processed, new tracking is 9400123..."

Scenario 2: Operations Manager Auditing Delayed Shipments

An e-commerce operations manager wants to quickly investigate a batch of dropshipped orders that customers claim are delayed.

User Prompt:

"I have three external tracking numbers from our supplier that customers are complaining about: 1Z9999999999999999, 1Z8888888888888888, and 1Z7777777777777777. Create trackers for all of them under carrier UPS. Summarize their current status and tell me if there are any documented exceptions."

Step-by-step Execution:

  1. Call create_a_easy_post_tracker (Loop): The AI agent calls this tool three consecutive times, passing each tracking number and "carrier": "UPS".
  2. Evaluate Results: EasyPost returns the full tracker object for each, including the status, status_detail, and the deep array of tracking_details representing every scan event.
  3. Output: ChatGPT synthesizes the complex JSON responses: "Tracker 1 (1Z999...) is marked as 'out_for_delivery' today. Tracker 2 (1Z888...) encountered an 'exception' due to severe weather in Chicago and is delayed by 2 days. Tracker 3 (1Z777...) was successfully 'delivered' yesterday at the front porch."

Security and Access Control

Exposing an enterprise logistics account to an LLM requires rigorous governance. You do not want a rogue prompt generating thousands of dollars in fraudulent shipping labels. Truto's MCP architecture provides native security controls configured at the token level during server creation:

  • Method Filtering: You can strictly limit the MCP server to specific HTTP verbs. For example, setting methods: ["read"] ensures the LLM can only track packages (list_all_easy_post_trackers) or view addresses, outright preventing the agent from buying postage.
  • Tag Filtering: You can scope the server to specific functional domains. Setting tags: ["trackers"] ensures the LLM never even sees the schemas for shipments, batches, or carrier accounts, narrowing its context window and blast radius.
  • Require API Token Auth: By setting require_api_token_auth: true, possession of the MCP URL is no longer enough to execute a tool. The client must also pass a valid Truto API user token, ensuring only authenticated human operators within your organization can trigger the agent.
  • Ephemeral Servers: You can pass an expires_at timestamp when creating the server. Truto will automatically destroy the MCP token and its associated KV storage when the time expires, perfect for granting temporary access to contractors or isolated automation scripts.

Moving Forward with Logistics Automation

Connecting EasyPost to ChatGPT transforms how your team interacts with the physical supply chain. By utilizing Truto's dynamically generated MCP servers, you eliminate the need to write and maintain complex REST wrappers, handle dynamic endpoint schemas, or write custom authentication middleware.

Your AI agents get instant, heavily governed access to EasyPost's full suite of tools - from address verification to batch label generation - allowing your engineering team to focus on building core product value instead of wrangling shipping integrations.

Two ways to put EasyPost to work

Elaichifrom the team behind Truto

For you and your team

Use EasyPost in ChatGPT yourself

Connect EasyPost once, add Elaichi to ChatGPT, and ask. Every call is checked against your own permissions and logged.

Start free, 14 days No credit card required
Truto

For product teams

Ship EasyPost to your customers

Your customers connect their own EasyPost accounts. Your product gets one API and MCP tools for EasyPost, through Truto.

FAQ

What is the easiest way to connect EasyPost to ChatGPT?
The best way to connect EasyPost to ChatGPT is Elaichi: connect EasyPost to Elaichi once, then add Elaichi to ChatGPT as a connector. Two steps, about a minute, with a 14-day free trial and no credit card required.
Does Truto automatically retry failed EasyPost API calls due to rate limits?
No. Truto passes upstream HTTP 429 errors directly to the client and normalizes the rate limit info into standardized headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset). The caller is responsible for retry and backoff logic.
Can I prevent ChatGPT from accidentally purchasing shipping labels?
Yes. When generating the MCP server in Truto, you can use Method Filtering (e.g., methods: ["read"]) to ensure the AI agent only has access to read-only tools like package tracking and address listing, blocking any purchase operations.
How do I connect the Truto MCP URL to ChatGPT?
In ChatGPT, go to Settings -> Apps -> Advanced settings, enable Developer mode, and add a new Custom Connector by pasting the generated Truto MCP URL.
How does ChatGPT handle EasyPost's multi-step label purchasing flow?
Truto exposes discrete MCP tools for each step. ChatGPT will first call `create_a_easy_post_shipment` to fetch available carrier rates, then use the selected rate ID to call `easy_post_shipments_buy` and generate the final postage label.
EasyPost EasyPost in ChatGPT14 days free Start free

More from our Blog