Connect Fulfil to ChatGPT: Manage Orders, Products, and Shipments
A complete engineering guide to connecting Fulfil to ChatGPT using a managed MCP server. Automate sales orders, shipments, and inventory with AI agents.
If you need to connect Fulfil to ChatGPT to automate ERP workflows, manage e-commerce orders, or track multi-warehouse inventory, you need a Model Context Protocol (MCP) server. This server acts as the translation layer between ChatGPT's tool calls and Fulfil's highly structured, model-driven REST APIs. You can either spend weeks writing custom boilerplate to handle Fulfil's unique state-change workflows, or you can use a managed integration platform like Truto to dynamically generate a secure, authenticated MCP server URL.
If your team uses Claude, check out our guide on connecting Fulfil to Claude or explore our broader architectural overview on connecting Fulfil to AI Agents.
Giving a Large Language Model (LLM) read and write access to an enterprise resource planning (ERP) system like Fulfil is a massive engineering challenge. Fulfil does not behave like a standard CRUD application. It relies on complex data models, RPC-style state changes, and deeply nested relational fields. Every time you expose an endpoint to an LLM, you have to guarantee the schema is perfectly typed, or the model will hallucinate parameters and corrupt financial data.
This guide breaks down exactly how to use Truto to generate a secure, managed MCP server for Fulfil, connect it natively to ChatGPT, and execute complex supply chain and order workflows using natural language.
The Engineering Reality of the Fulfil API
A custom MCP server is a self-hosted integration layer. While the open MCP standard provides a predictable way for models to discover tools via JSON-RPC, implementing it against Fulfil's API surface is exceptionally painful.
If you decide to build a custom MCP server for Fulfil, you own the entire API lifecycle. Here are the specific integration challenges that break standard assumptions when working with Fulfil:
The "Execute" Pattern for State Changes
Most modern SaaS APIs allow you to update the state of a record (e.g., moving an order from draft to confirmed) by sending a PATCH request with {"state": "confirmed"}. Fulfil strictly prohibits this. In Fulfil, you must never change state by writing to the state field directly. Instead, you have to invoke workflow methods via an execute endpoint. For example, to confirm a sales order, you must call a specific method (like method=confirm or process) and pass the relevant IDs. Your MCP tool schemas must instruct the LLM on this exact paradigm, otherwise, ChatGPT will attempt standard PATCH updates that fail validation.
Dynamic Model Architectures
Fulfil is built on a dynamic model framework (similar to Tryton/Odoo). Data is not just housed in static endpoints like /products; it is accessed via models like sales_order or product.product. Retrieving specific fields requires interacting with Fulfil's find method, which utilizes a complex JSON-based where filter syntax, field picking, and sorting arrays. Passing this complexity directly to an LLM usually results in invalid JSON syntax. A robust MCP server must wrap these calls in strict JSON Schemas so the LLM understands exactly how to format a where clause.
Rate Limiting and Pagination Realities
When dealing with large ERP datasets, you will hit rate limits and pagination boundaries.
Factual note on rate limits: Truto does not retry, throttle, or apply backoff on rate limit errors. When an upstream API returns HTTP 429, Truto passes that error to the caller. Truto normalizes upstream rate limit info into standardized headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset) per the IETF spec. The caller is responsible for retry/backoff. Do not expect the MCP server to magically absorb rate limit errors - your agent framework must handle the 429 response gracefully.
Fulfil to ChatGPT Quickstart Guide
If you just want the fastest path from a fresh Truto account to ChatGPT calling the Fulfil API, follow these steps.
What you need:
- A Truto account with API access.
- Fulfil API credentials (subdomain and API key).
- A ChatGPT Pro, Plus, Business, Enterprise, or Education seat with Developer mode available.
Step 1: Connect Fulfil as an Integrated Account
First, you need to establish the baseline authentication with Fulfil.
In the Truto dashboard, navigate to Integrated Accounts -> New Integrated Account, select Fulfil, and enter the required API key and workspace subdomain. Truto securely stores these credentials. The resulting connection is assigned an integrated_account_id.
Step 2: Generate the Fulfil MCP Server
Truto dynamically generates MCP tools based on Fulfil's available resources and documented schemas. You can create the MCP server URL in two ways:
Method 1: Via the Truto UI
- Navigate to the Integrated Account page for your Fulfil connection in the Truto dashboard.
- Click the MCP Servers tab.
- Click Create MCP Server.
- Select your desired configuration (e.g., name, allowed methods like
readorwrite, and specific tool tags). - Click create and copy the generated MCP server URL.
Method 2: Via the API You can programmatically scope an MCP endpoint to the account using a simple POST request. This is ideal if you are generating servers on the fly for different tenants.
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": "Fulfil ERP for ChatGPT",
"config": {
"methods": ["read", "write", "custom"],
"tags": ["sales_orders", "products", "inventory"]
}
}'The response will contain a url field (e.g., https://api.truto.one/mcp/<token>). This URL is fully self-contained - it handles routing and authentication back to your specific Fulfil instance.
Step 3: Connect the MCP Server to ChatGPT
Now you must point ChatGPT to your new MCP server. You can do this via the ChatGPT interface or via a local configuration file for programmatic agents.
Method A: Via the ChatGPT UI
- Open ChatGPT and navigate to Settings -> Apps -> Advanced settings.
- Enable Developer mode (MCP support is gated behind this flag).
- Under MCP servers / Custom connectors, click to add a new server.
- Enter a name (e.g., "Fulfil ERP").
- Paste the Truto MCP URL into the Server URL field and save. ChatGPT will immediately connect, perform the JSON-RPC initialization handshake, and discover the Fulfil tools.
Method B: Via Manual Config File
If you are running a local agent setup, the Claude Desktop app, or a custom LangChain implementation, you can configure the MCP connection using the Server-Sent Events (SSE) transport. Create an mcp_config.json file:
{
"mcpServers": {
"fulfil_erp": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-sse",
"--url",
"https://api.truto.one/mcp/<YOUR_TOKEN>"
]
}
}
}Fulfil MCP Tool Inventory (Hero Tools)
Truto automatically maps Fulfil's extensive data models into standardized MCP tools, injecting strict query and body schemas so the LLM knows exactly how to formulate requests. Here are the highest-leverage tools available for Fulfil.
List All Fulfil Sales Orders
list_all_fulfil_sales_orders
This tool allows the agent to query sales orders using Fulfil's specific find methodology. The LLM can pass a where filter to narrow down orders by customer, date, or status. Truto automatically handles the cursor-based pagination under the hood.
"Find all sales orders created in the last 7 days that are currently in a 'processing' state. Return the order numbers and total amounts."
Create a Fulfil Sales Order
create_a_fulfil_sales_order
Creates one or more sales orders in a single call. Fulfil requires the records to be sent as an array in params.vlist, even if you are only creating a single order. The tool schema strictly enforces this array requirement to prevent API rejections.
"Draft a new sales order for contact ID 5021. Include two line items for product ID 991 and set the expected shipment date to next Friday."
Execute Workflows on Sales Orders
fulfil_sales_orders_execute
Because you cannot directly write to a state field in Fulfil, this tool is mandatory for progressing an order through its lifecycle. You pass the target IDs and the specific method (e.g., confirm, process, cancel).
"Take sales order ID 10455 and execute the 'confirm' workflow to lock the order for fulfillment."
List All Fulfil Products
list_all_fulfil_products
Queries the product catalog. This is essential for agents that need to verify inventory levels, check SKUs, or validate pricing before drafting a sales order.
"Search the product catalog for any SKUs containing 'Heavy Duty Widget' and tell me the current stock levels and unit prices."
Update a Fulfil Product by ID
update_a_fulfil_product_by_id
Allows the agent to modify standard data fields on a specific product record, such as updating a description, adjusting a price tier, or changing a category assignment.
"Update the description for product ID 882 to include the phrase 'Now featuring reinforced steel construction.'"
List All Fulfil Customer Shipments
list_all_fulfil_customer_shipments
Retrieves logistics and fulfillment records. Agents can use this to track package statuses, retrieve carrier tracking numbers, and report back to customers on where their orders are.
"Look up all customer shipments associated with sales order #4402 and give me the tracking numbers and current shipping statuses."
Note: This is just a curated list of high-leverage operations. For the complete tool inventory, detailed JSON schemas, and supported properties, view the full Fulfil integration page.
Workflows in Action
Exposing individual endpoints is useful, but the real power of connecting Fulfil to ChatGPT lies in multi-step agentic workflows. By giving the LLM a goal, it can chain these tools together autonomously.
Workflow 1: B2B Order Processing and Confirmation
In B2B wholesale, orders often arrive via email. A sales rep can instruct ChatGPT to handle the entire data entry and confirmation process natively within the chat interface.
"Check if we have enough 'Titanium Bracket' in stock. If we have at least 50 units, create a sales order for 50 units for Contact ID 9081, and then immediately confirm the order so the warehouse can begin packing."
Step-by-step execution:
list_all_fulfil_products: The agent searches for the 'Titanium Bracket' and checks the returned schema for the available inventory count.create_a_fulfil_sales_order: Recognizing sufficient stock, the agent constructs theparams.vlistJSON payload to draft the order for Contact ID 9081.fulfil_sales_orders_execute: The agent extracts the new order ID from the creation response and executes theconfirmmethod to finalize the state change.
Result: The sales rep gets a plain-text confirmation in ChatGPT with the new confirmed order number, and the warehouse gets the signal to ship, all without anyone logging into the ERP.
sequenceDiagram
participant User as User
participant ChatGPT as ChatGPT
participant MCP as Truto MCP Server
participant Fulfil as Fulfil API
User->>ChatGPT: Check stock, create order, confirm it.
ChatGPT->>MCP: Call list_all_fulfil_products (Name: Titanium Bracket)
MCP->>Fulfil: GET /api/v2/model/product.product
Fulfil-->>MCP: Stock: 120 units
MCP-->>ChatGPT: Return product data
ChatGPT->>MCP: Call create_a_fulfil_sales_order (Contact 9081)
MCP->>Fulfil: POST /api/v2/model/sales.order
Fulfil-->>MCP: Order ID: 10442
MCP-->>ChatGPT: Return new Order ID
ChatGPT->>MCP: Call fulfil_sales_orders_execute (Method: confirm, ID: 10442)
MCP->>Fulfil: POST /api/v2/model/sales.order/confirm
Fulfil-->>MCP: Success
MCP-->>ChatGPT: Workflow complete
ChatGPT-->>User: "Order #10442 created and confirmed successfully."Workflow 2: Automated Support Triage and Shipment Tracking
Customer support teams spend hours cross-referencing support tickets with ERP shipping data. ChatGPT can automate this lookup and context-gathering phase.
"Find the customer record for 'Acme Corp'. Look up their most recent customer shipment. If it hasn't shipped yet, update the contact record notes to flag that they requested an expedited update."
Step-by-step execution:
list_all_fulfil_contacts: The agent searches for the exact contact ID associated with "Acme Corp".list_all_fulfil_customer_shipments: The agent passes awherefilter using the found contact ID, sorted by date descending, to get the latest shipment.update_a_fulfil_contact_by_id: If the shipment status indicates a delay or pending state, the agent updates the contact's internal note field to warn the account manager.
Result: The agent autonomously navigates the relational architecture of the ERP, linking a company name to an ID, checking a secondary table (shipments), and executing a targeted update, saving a human from clicking through 5 different screens.
Security and Access Control
Handing an LLM the keys to your ERP is dangerous if not properly scoped. Truto provides several mechanisms to lock down the generated MCP server so the agent can only touch exactly what it needs.
- Method Filtering: During creation, use the
config.methodsarray to restrict the server. Passing["read"]ensures the LLM can only executegetandlistoperations. It will physically lack the tools tocreate,update, orexecuteworkflows, preventing accidental data deletion. - Tag Filtering: Use the
config.tagsarray to isolate domains. If an agent is built for logistics, you can restrict it to["shipments", "inventory"], completely hiding sensitive financial or HR records from the LLM's context. - Extra Authentication (
require_api_token_auth): By default, the MCP URL acts as a bearer token. If you toggle this flag totrue, the MCP client (or the engineer running the local agent) must also pass a valid Truto API token in theAuthorizationheader, adding a strict secondary layer of access control. - Ephemeral Servers (
expires_at): You can pass an ISO datetime to automatically destroy the MCP server at a specific time. This is perfect for granting temporary ERP access to an AI auditor or a short-lived analytics script.
The Smart Way to Connect AI to ERPs
Connecting ChatGPT to Fulfil is not just about translating JSON - it is about navigating the strict, model-driven realities of an enterprise ERP. Building a custom MCP server means constantly updating schema parsers, fighting with cursor pagination, and manually writing tool descriptions for complex where filters and execute methods.
Using a managed integration platform allows you to treat AI tool calling as configuration rather than code. You authenticate the account, apply your security filters, and immediately hand the LLM a secure, perfectly documented interface to your ERP data.
FAQ
- What is the Model Context Protocol (MCP)?
- MCP is an open standard that standardizes how AI agents and large language models discover, access, and execute tools against external APIs. It acts as a universal translation layer between LLMs like ChatGPT and SaaS platforms.
- How does Truto handle Fulfil API rate limits?
- Truto does not retry, throttle, or apply backoff on rate limit errors. When the Fulfil API returns an HTTP 429, Truto passes that error directly to the caller and normalizes upstream rate limit info into standardized headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset) per the IETF spec. The caller is responsible for retry and backoff logic.
- Can I restrict which Fulfil models ChatGPT can modify?
- Yes. When generating the MCP server in Truto, you can apply method filtering (e.g., allowing only 'read' operations) and tag filtering to scope exactly which tools and resources the AI agent can access.