Connect Acumatica to ChatGPT: Manage ERP Records and Attachments
from the team behind Truto
Acumatica in ChatGPT, in about a minute.
The best way to connect Acumatica to ChatGPT is Elaichi: connect Acumatica 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
-
Start your free trial
14 days free, no credit card required.
-
Connect Acumatica
Once, in Elaichi. ChatGPT never gets more access than you have.
-
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
Building Acumatica into your own product? This guide is for you.
Connect Acumatica to ChatGPT using Truto's auto-generated MCP server. Skip writing custom integration code and enable AI agents to securely manage ERP records, execute async actions, and handle attachments using natural language.
The developer guide
Learn how to generate a secure MCP server for Acumatica using Truto, connect it to ChatGPT, and automate ERP records, business actions, and file attachments.
If you need to connect Acumatica to ChatGPT to automate complex ERP workflows, manage financial records, execute business actions, or handle file attachments, you need a Model Context Protocol (MCP) server. This server acts as the translation layer between ChatGPT's JSON-RPC tool calls and Acumatica's highly specific Contract-Based REST API.
If your team uses Claude, check out our guide on connecting Acumatica to Claude or explore our broader architectural overview on connecting Acumatica to AI Agents.
Giving a Large Language Model (LLM) read and write access to a modern Cloud ERP like Acumatica is an immense engineering challenge. You have to navigate dynamic endpoint versions, construct exact JSON payloads for complex nested entities, handle asynchronous polling for business actions, and securely proxy binary file streams for attachments. You can either spend weeks building, hosting, and maintaining this custom integration infrastructure, or you can use a managed platform to dynamically generate a secure, authenticated MCP server URL.
This guide breaks down exactly how to use Truto to generate a managed MCP server for Acumatica, connect it natively to ChatGPT, and execute complex ERP workflows using natural language.
The Engineering Reality of the Acumatica API
A custom MCP server is essentially a self-hosted integration middleware layer. While the open MCP standard provides a predictable way for LLMs to discover tools, implementing it against Acumatica's specific architecture is exceptionally painful.
If you decide to build a custom MCP server for Acumatica, you own the entire API lifecycle. Here are the specific integration challenges that break standard CRUD assumptions when working with Acumatica:
Contract-Based REST APIs and Endpoint Versioning
Acumatica does not expose a static set of REST endpoints (like /api/v1/users). Instead, it uses a "Contract-Based" API where endpoints are defined by custom system configurations. Every API call requires an endpoint_name, endpoint_version, and the entity name. For example, to query Sales Orders, your proxy must dynamically construct paths like /entity/Default/22.200.001/SalesOrder. Your MCP server must inject these routing variables securely while exposing a flat tool interface to the LLM. If the ERP administrator updates the endpoint version in Acumatica, static tool schemas will instantly break.
The "PUT for Create" Quirk
Unlike 99% of modern REST APIs that use POST to create records, Acumatica uses PUT to create new entity records by sending a JSON representation to the entity's collection path. If your LLM framework or standard HTTP client defaults to standard REST conventions, requests will fail. Furthermore, fields in the JSON body must be nested inside { "value": ... } structures for specific data types, requiring strict JSON schema validation before the payload ever reaches the ERP.
Asynchronous Business Actions
Acumatica allows clients to invoke business logic (actions) on top-level entities—such as releasing a document or confirming a shipment. However, these endpoints do not return immediate results. They return a 202 Accepted status code with a Location header. The client must then poll this location URL to determine if the async job succeeded or failed. Exposing this to an LLM means either teaching the LLM to write a polling loop, or building a stateful polling mechanism directly into your MCP server.
Attachment Streaming Complexity
Handling file attachments in Acumatica requires targeting the specific view and field associated with the record. Fetching an attachment returns raw binary content, not a JSON object. Large Language Models communicate purely in text. Your MCP server must safely proxy this binary data, handle the multi-part form uploads for creating new attachments, and translate file boundaries back into a structure the LLM can acknowledge.
Step 1: Generating the Acumatica MCP Server
Truto abstracts away the complexity of the Acumatica API by dynamically generating an MCP server based on the ERP's documented resources and your specific configuration.
Every Acumatica integration in Truto is scoped to an Integrated Account (the authenticated connection to the customer's Acumatica instance). The generated MCP server URL contains a cryptographic token that securely maps to this specific connection.
There are two ways to generate this server.
Method A: Via the Truto UI
For quick prototyping or manual setup:
- Log into your Truto dashboard and navigate to the Integrated Accounts section.
- Select your connected Acumatica account.
- Click the MCP Servers tab.
- Click Create MCP Server.
- Configure the server. You can name it (e.g., "ChatGPT Acumatica Server") and apply filters. For example, select the
methodsdropdown to restrict the server toreadoperations only if you want a read-only agent. - Click Create and copy the generated MCP server URL (it will look like
https://api.truto.one/mcp/a1b2c3d4e5f6...). Treat this URL as a secure credential.
Method B: Via the API
For production use cases where you need to programmatically provision AI agents for your customers, you can generate the MCP server via Truto's REST API.
Make a POST request to /integrated-account/:id/mcp, passing in the configuration payload to scope the tools.
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": "Acumatica ERP Operations Agent",
"config": {
"methods": ["read", "write", "custom"],
"tags": ["erp", "sales", "inventory"]
}
}'The API responds with the tokenized endpoint. This URL handles protocol wrapping, token resolution, and dynamic tool generation on the fly.
{
"id": "mcp_abc123",
"name": "Acumatica ERP Operations Agent",
"expires_at": null,
"url": "https://api.truto.one/mcp/a1b2c3d4e5f67890"
}Step 2: Connecting the MCP Server to ChatGPT
Once you have the Truto MCP URL, connecting it to ChatGPT requires zero additional code.
Method A: Via the ChatGPT UI (Developer Mode)
If you are using ChatGPT Pro, Plus, Business, Enterprise, or Education accounts, you can add the server natively:
- Open ChatGPT and navigate to Settings → Apps → Advanced settings.
- Toggle Developer mode to ON.
- Under the MCP servers / Custom connectors section, click Add new server.
- Name: Enter a descriptive name (e.g., "Acumatica ERP").
- Server URL: Paste the Truto MCP URL (
https://api.truto.one/mcp/...). - Click Save.
ChatGPT will immediately perform a handshake with the Truto server, execute the tools/list JSON-RPC method, and load the Acumatica tools into its context window.
Method B: Via Manual Config File (SSE Transport)
If you are running a local agent, using an alternative client, or leveraging the official @modelcontextprotocol/server-sse package, you can define the server in your MCP configuration file (mcp.json or claude_desktop_config.json equivalent):
{
"mcpServers": {
"acumatica-erp": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-sse",
"--url",
"https://api.truto.one/mcp/a1b2c3d4e5f67890"
]
}
}
}Hero Tools for Acumatica
Truto automatically maps Acumatica's endpoints into descriptive, snake_case tools that ChatGPT understands. Because LLMs struggle with complex object nesting, Truto flattens the query arguments while securely mapping them to the expected API parameters at runtime.
Here are the highest-leverage tools available for Acumatica operations. For the complete list of tools and JSON schemas, view the Acumatica integration page.
list_all_acumatica_records
Lists records for any specified Acumatica entity (e.g., SalesOrder, Customer, InventoryItem). Supports $filter, $select, and $expand to precisely shape the data retrieved and avoid bloating the LLM's context window.
"Fetch the last 5 SalesOrders created this month using endpoint version 22.200.001. Expand the Details property so I can see the line items."
create_a_acumatica_entity_record
Creates a new record for an entity. Truto abstracts the underlying Acumatica PUT quirk, allowing the LLM to simply pass the JSON structure for the entity. System fields like id and rowNumber are automatically handled in the response.
"Create a new Customer record in Acumatica for 'Acme Corp'. Ensure the CustomerClass is set to 'DEFAULT' and format the data using the endpoint version 22.200.001."
update_a_acumatica_record_by_id
Updates an existing record. Acumatica relies heavily on specific ID fields and keys. The tool schema strictly enforces the required identifiers, reducing hallucinated update requests.
"Update the SalesOrder with ID 'SO-000142'. Change the Status to 'On Hold' and add a note explaining that the customer requested a delay."
acumatica_actions_execute_action
Invokes an action on a top-level entity, such as releasing an invoice or confirming a shipment. Because this triggers Acumatica's async processor, it returns a 202 Accepted status. The LLM must be instructed to monitor or note the resulting polling URL.
"Execute the 'Release' action on Invoice ID 'INV-9923'. Pass the necessary parameters for the action payload using endpoint Default version 22.200.001."
list_all_acumatica_attachments
Lists all files attached to a specific Acumatica record, addressed by its data view and field. Crucial for auditing or verifying documentation linked to ERP entities.
"List all the files attached to the ExpenseReceipt record 'ER-505'. I need to see the filenames and href links to verify the physical receipts were uploaded."
create_a_acumatica_attachment
Uploads binary file content and attaches it to an Acumatica record via the specified view and field. The tool handles the file boundaries and multipart structure.
"Attach the provided vendor contract PDF to Vendor record 'V-0112'. Add the comment 'Signed SLA 2026' to the attachment metadata."
For the full list of available operations, required parameters, and JSON schemas, visit the Acumatica integration page.
Workflows in Action
Connecting an LLM to an ERP isn't just about reading data; it's about executing multi-step business logic safely. Here are two real-world scenarios showing how ChatGPT orchestrates these tools.
Scenario 1: Releasing a Sales Order (Sales Operations)
A sales representative wants to finalize a stalled order and push it through the ERP state machine using natural language.
"Check the status of Sales Order 'SO-54321'. If the status is 'Open' and the hold flag is removed, execute the action to 'Release' the order."
sequenceDiagram
participant User
participant Agent as ChatGPT
participant Truto as Truto MCP Server
participant API as Acumatica API
User->>Agent: "Check SO-54321, if Open, Release it."
Agent->>Truto: Call `get_single_acumatica_record_by_id` (SO-54321)
Truto->>API: GET /entity/Default/22.200.001/SalesOrder/SO-54321
API-->>Truto: JSON (Status: Open, Hold: False)
Truto-->>Agent: Returns flattened order details
Agent->>Truto: Call `acumatica_actions_execute_action` (Action: Release)
Truto->>API: POST /entity/Default/22.200.001/SalesOrder/Release
API-->>Truto: 202 Accepted (Location: /status/job-123)
Truto-->>Agent: Returns async job status
Agent-->>User: "The order is Open and off hold. I have triggered the Release action. The job is currently processing."What happens: ChatGPT first retrieves the record to verify the business logic rules (status and hold flag). Confirming the order is ready, it automatically formats the payload for the acumatica_actions_execute_action tool. It understands the 202 response and correctly informs the user that the background job has been triggered.
Scenario 2: Auditing Expense Attachments (Accounting)
An accountant needs to verify that physical receipts are attached to high-value expense claims.
"Find all Expense Receipts created today over $500. For each one, check if there are any attachments. If an attachment is missing, flag the receipt ID for review."
sequenceDiagram
participant User
participant Agent as ChatGPT
participant Truto as Truto MCP Server
participant API as Acumatica API
User->>Agent: "Find expenses >$500 today, verify attachments."
Agent->>Truto: Call `list_all_acumatica_records` ($filter: Amount gt 500, Date eq Today)
Truto->>API: GET /entity/Default/22.200.001/ExpenseReceipt?$filter=...
API-->>Truto: JSON (Receipt array: ER-101, ER-102)
Truto-->>Agent: Returns receipt list
Agent->>Truto: Call `list_all_acumatica_attachments` (Record: ER-101)
Truto->>API: GET /entity/Default/22.200.001/ExpenseReceipt/ER-101/files
API-->>Truto: JSON (1 attachment)
Truto-->>Agent: Returns file metadata
Agent->>Truto: Call `list_all_acumatica_attachments` (Record: ER-102)
Truto->>API: GET /entity/Default/22.200.001/ExpenseReceipt/ER-102/files
API-->>Truto: JSON (0 attachments)
Truto-->>Agent: Returns empty list
Agent-->>User: "ER-102 is missing an attachment and has been flagged. ER-101 is compliant."What happens: The LLM leverages OData filtering on the list_all_acumatica_records tool to pull a targeted dataset. It then iterates through the returned IDs, invoking the attachment list tool for each. It acts as an autonomous auditor, parsing the JSON arrays and summarizing the compliance gaps perfectly.
Security and Access Control
Exposing an ERP like Acumatica to an AI agent demands strict security controls. The Truto MCP server allows you to tightly scope what ChatGPT can do:
- Method Filtering: Configure
config.methods: ["read"]to ensure the MCP server only exposesGETandLISTtools. This creates a completely safe, read-only agent that cannot alter financial records. - Tag Filtering: Use
config.tags: ["sales", "inventory"]to restrict the server tools to specific domain areas, ensuring an inventory management agent cannot access HR or payroll endpoints. - API Token Authentication: For enterprise deployments, enable
require_api_token_auth: true. This forces the client to pass a valid Truto API token in addition to possessing the MCP URL, securing the endpoint against URL leakage. - Time-to-Live (TTL): Set an
expires_attimestamp when creating the server. Truto will automatically destroy the server and its underlying KV records at the specified time, perfect for temporary audit access.
Handling Rate Limits and API Errors
AI agents can generate requests much faster than humans, making rate limiting a critical concern.
Truto does not absorb, retry, or apply backoff to rate limit errors. If the underlying Acumatica instance triggers a rate limit (HTTP 429), Truto passes that error directly back to the caller.
However, Truto normalizes the upstream rate limit information into standard IETF HTTP headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset). This allows the LLM client (or your orchestration layer) to read the exact timestamp of when the limit resets and implement intelligent backoff strategies without having to parse Acumatica-specific error payloads.
Stop Building Integration Boilerplate
Building a custom integration layer between an LLM and a complex ERP like Acumatica requires weeks of writing API wrappers, managing authentication flows, mapping JSON schemas, and fighting with undocumented edge cases.
By leveraging Truto, you bypass the infrastructure overhead. The dynamic documentation-driven architecture ensures that as the Acumatica API evolves, your MCP tools adapt automatically. You get secure, scoped, and managed toolsets that connect natively to ChatGPT, allowing your engineering team to focus on AI orchestration instead of API maintenance.
FAQ
- What is the easiest way to connect Acumatica to ChatGPT?
- The best way to connect Acumatica to ChatGPT is Elaichi: connect Acumatica 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.
- How does ChatGPT authenticate with Acumatica?
- ChatGPT connects to a Truto-hosted MCP server via a secure, cryptographic URL. Truto acts as the proxy, securely managing the underlying Acumatica OAuth tokens or credentials and injecting them into the API requests at runtime.
- Does Truto automatically retry failed Acumatica API requests?
- No. Truto does not retry, throttle, or apply backoff on rate limit errors. When Acumatica returns an HTTP 429, Truto passes that error directly to ChatGPT, normalizing the rate limit info into standardized IETF headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset). The caller is responsible for implementing retry logic.
- How do I filter which Acumatica endpoints ChatGPT can access?
- When creating the MCP server in Truto, you can pass a configuration object that filters tools by method (e.g., 'read', 'write') or by specific resource tags. This ensures the LLM only has access to the exact endpoints you explicitly allow.
- Can ChatGPT handle Acumatica's custom fields?
- Yes. Because Truto's proxy API passes the raw JSON structures from Acumatica's Contract-Based REST API, custom fields defined on the Acumatica instance are exposed to the LLM, allowing it to read and write custom data dynamically.