---
title: "Connect Acumatica to Claude: Run Reports and Execute Business Actions"
slug: connect-acumatica-to-claude-run-reports-and-execute-business-actions
date: 2026-10-04
author: Sidharth Verma
categories: ["AI & Agents"]
excerpt: "Learn how to build a secure, managed MCP server for Acumatica. Give Claude Desktop the ability to run ERP reports, execute business actions, and query OData records."
tldr: "Connect Acumatica to Claude using a managed MCP server. This guide covers the engineering realities of Acumatica's contract-based REST API, how to generate dynamic MCP tools, and real-world ERP automation workflows."
canonical: https://truto.one/blog/connect-acumatica-to-claude-run-reports-and-execute-business-actions/
---

# Connect Acumatica to Claude: Run Reports and Execute Business Actions

**Acumatica in Claude, in about a minute.** The best way to connect Acumatica to Claude is Elaichi: connect Acumatica to Elaichi once, then add Elaichi to Claude as a connector. Two steps, about a minute, with a 14-day free trial and no credit card required.

1. **Start your free trial.** Create your Elaichi account. 14 days free, no credit card required.
2. **Connect Acumatica.** Connect Acumatica once in Elaichi. Claude never gets more access than you have.
3. **Add Elaichi to Claude.** In Claude, open Customize, then Connectors, press Add and paste https://api.elaichi.ai/mcp. Sign in and approve.

[Start free on Elaichi, 14 days, no credit card required](https://app.elaichi.ai/signup?utm_source=truto.one&utm_medium=referral&utm_campaign=launchpad&utm_content=post_markdown&utm_term=acumatica) · [Acumatica on Elaichi](https://elaichi.ai/connectors/acumatica/?utm_source=truto.one&utm_medium=referral&utm_campaign=launchpad&utm_content=post_markdown&utm_term=acumatica)

*Building Acumatica into your own product? The guide below is for you.*

---

If your team needs to connect Acumatica to Claude to [[automate financial reporting](https://truto.one/connect-netsuite-to-claude-automate-erp-workflows-and-financials/), execute supply chain actions](/connect-netsuite-to-claude-automate-erp-workflows-and-financials/), or audit ERP records, you need a [Model Context Protocol (MCP) server](https://truto.one/what-is-mcp-and-mcp-servers-and-how-do-they-work/). This server acts as the translation layer between Claude's tool calls and Acumatica's contract-based REST API. You can either [[build and maintain this infrastructure yourself](https://truto.one/how-to-build-mcp-servers-for-ai-agents-2026-hands-on-architecture-guide/)](/how-to-build-mcp-servers-for-ai-agents-2026-hands-on-architecture-guide/), or use a managed integration platform like Truto to dynamically generate a [secure, authenticated MCP server URL](https://truto.one/managed-mcp-for-claude-full-saas-api-access-without-security-headaches/). 

If your team uses ChatGPT, check out our guide on [connecting Acumatica to ChatGPT](https://truto.one/connect-acumatica-to-chatgpt-manage-erp-records-and-attachments/) or explore our broader architectural overview on [connecting Acumatica to AI Agents](https://truto.one/connect-acumatica-to-ai-agents-sync-data-files-and-process-actions/).

Giving a Large Language Model (LLM) read and write access to a sprawling ERP like Acumatica is a serious engineering undertaking. You have to handle complex token lifecycles, map massive nested JSON schemas to MCP tool definitions, and deal with Acumatica's highly specific OData and action invocation patterns. Every time you upgrade your Acumatica instance or modify a custom field, you have to update your server code, redeploy, and test the integration.

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

> Want to give your AI agents secure, authenticated access to Acumatica and 100+ other SaaS APIs? Let's talk about [[managed MCP architecture](https://truto.one/managed-mcp-for-claude-full-saas-api-access-without-security-headaches/)](/managed-mcp-for-claude-full-saas-api-access-without-security-headaches/).
>
> [Talk to us](https://truto.one/book-a-demo/)

## The Engineering Reality of the Acumatica 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 over JSON-RPC 2.0, the reality of implementing it against a [heavyweight ERP API is painful](https://truto.one/the-final-boss-of-erps-architecting-a-reliable-netsuite-api-integration/). 

Acumatica does not use a typical REST design. It relies on a "Contract-Based REST API" that demands strict adherence to specific endpoint versions, unique payload structures, and OData querying patterns. If you decide to build a custom MCP server for Acumatica, here are the specific [integration challenges you will face](https://truto.one/the-final-boss-of-erps-architecting-a-reliable-netsuite-api-integration/):

**OData Syntax and Nested Queries**
Acumatica relies heavily on OData parameters (`$filter`, `$select`, `$expand`) to shape responses. An LLM attempting to query a list of records needs to understand exactly how to format these OData strings. If it attempts to filter an order by date, it cannot simply pass `?date=2024-01-01`. It must pass `?$filter=OrderDate eq datetime'2024-01-01'`. Your MCP tools must explicitly define these schema requirements so Claude constructs valid queries instead of hallucinating standard REST query params.

**Asynchronous Business Actions**
Acumatica exposes business logic (like releasing a purchase order or calculating tax) via "Actions". When you invoke an action on an entity, Acumatica rarely returns the result immediately. Instead, it returns an HTTP `202 Accepted` with a `Location` header. The client is expected to poll this location until the background job completes. An LLM does not inherently know how to poll headers. Your integration layer must abstract this complexity, explicitly instructing the model on how to handle async execution states.

**PUT vs POST for Record Creation**
Most modern APIs use `POST` to create records and `PUT` or `PATCH` to update them. Acumatica uses `PUT` to create new entity records. Furthermore, you cannot just send a flat JSON payload. Acumatica requires you to wrap field values in a specific structure, such as `{"value": "Sample Data"}`. If Claude sends a standard flat JSON object, Acumatica will reject the payload. 

**Binary File Attachments and Reports**
Acumatica handles reports and attachments as raw binary streams. When you request a generated PDF report, the API returns the raw binary content, not a JSON object. MCP handles text and JSON perfectly, but feeding raw binary data directly into an LLM context window will fail. Your MCP server must either handle the binary conversion (e.g., base64 encoding it for vision models) or provide the LLM with a signed, accessible URL to the file.

## How to Generate a Managed Acumatica MCP Server

Rather than hand-coding tool definitions and managing Acumatica's auth lifecycle, Truto dynamically derives MCP tools directly from the integration's documented schemas. The server is scoped to a single connected Acumatica instance, with authentication and routing handled entirely by Truto's proxy infrastructure.

You can generate an MCP server for Acumatica via the Truto UI or programmatically via the API.

### Method 1: Via the Truto UI

This is the fastest path for teams testing prompt engineering and workflow design in Claude Desktop.

1. Log into Truto and navigate to your connected Acumatica integrated account.
2. Click the **MCP Servers** tab.
3. Click **Create MCP Server**.
4. Define your configuration parameters. You can restrict the server to only expose `read` methods, or filter by specific tags (like `sales` or `inventory`).
5. Copy the generated MCP server URL (e.g., `https://api.truto.one/mcp/a1b2c3d4...`). This URL contains a cryptographic token that securely maps to your specific Acumatica tenant.

### Method 2: Via the Truto API

For production use cases where you need to spin up AI agents dynamically per customer, you can provision MCP servers over the API. 

Make a `POST` request to `/integrated-account/:id/mcp` with your desired configuration:

```bash
curl -X POST https://api.truto.one/integrated-account/<ACUMATICA_ACCOUNT_ID>/mcp \
  -H "Authorization: Bearer <YOUR_TRUTO_API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Acumatica Financials Agent",
    "config": {
      "methods": ["read", "custom"],
      "tags": ["financials", "reports"]
    }
  }'
```

Truto evaluates the requested configuration against Acumatica's AI-ready tool schemas. If successful, it returns a database record and a ready-to-use URL:

```json
{
  "id": "mcp-789-xyz",
  "name": "Acumatica Financials Agent",
  "config": {
    "methods": ["read", "custom"],
    "tags": ["financials", "reports"]
  },
  "expires_at": null,
  "url": "https://api.truto.one/mcp/a1b2c3d4e5f6..."
}
```

## Connecting the Acumatica MCP Server to Claude

Once you have your secure Truto MCP URL, you need to connect it to your LLM client. 

### Connecting via UI (Claude Desktop and ChatGPT)

Both Anthropic and OpenAI support remote MCP connections directly in their interface settings.

**For Claude Desktop:**
1. Open Claude Desktop and navigate to **Settings -> Integrations**.
2. Click **Add MCP Server**.
3. Paste the Truto MCP URL.
4. Claude will instantly ping the `/mcp/:token` endpoint, complete the handshake, and load the Acumatica capabilities.

**For ChatGPT:**
1. Navigate to **Settings -> Apps -> Advanced settings**.
2. Enable **Developer mode** (MCP is currently gated behind this flag).
3. Under Custom connectors, click **Add new server**.
4. Name the connection "Acumatica" and paste your Truto MCP URL. 

### Connecting via Manual Config File

If you are managing Claude Desktop environments for your team or running headless instances, you can connect the server by updating your `claude_desktop_config.json` file. 

Truto MCP servers communicate via Server-Sent Events (SSE). Use the official `@modelcontextprotocol/server-sse` package to handle the transport layer:

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

Save the file and restart Claude Desktop. The Acumatica tools will now be available in your context window.

## Hero Tools for Acumatica

When Claude connects to the Truto MCP server, it invokes the `tools/list` RPC method. Truto dynamically builds this list based on the exact resources and custom fields available in your specific Acumatica tenant. 

Here are the most powerful tools your AI agents can utilize for Acumatica.

### list_all_acumatica_records

Retrieves records for any Acumatica entity (e.g., Invoices, StockItems, PurchaseOrders). This tool automatically supports OData parameters like `$filter`, `$select`, and `$expand` to shape the data returned to the LLM context window.

**Usage note:** Instruct Claude to use `$select` heavily. Acumatica records can be massive. Returning every field for 50 invoices will immediately blow out Claude's context window. 

> "Fetch the latest 10 open Purchase Orders in Acumatica. Use the list_all_acumatica_records tool with the entity set to 'PurchaseOrder'. Ensure you pass a $select parameter to only return the OrderNbr, Status, and OrderTotal fields."

### create_a_acumatica_entity_record

Creates a new record for a specified Acumatica entity. The underlying proxy maps this to Acumatica's required `PUT` request and formats the payload appropriately.

**Usage note:** Acumatica requires endpoint names and versions for all contract-based REST operations. Claude will read these requirements directly from the dynamically generated JSON Schema provided by Truto.

> "Create a new Customer record in Acumatica. Set the CustomerClass to 'DEFAULT' and the CustomerName to 'Acme Corp'."

### update_a_acumatica_record_by_id

Modifies an existing Acumatica record. Because Acumatica is strict about state transitions, updates are usually limited to specific fields depending on the record's current status (e.g., you cannot update the amount on an Invoice that is already marked Closed).

> "Update the Acumatica SalesOrder with ID 'SO-00451'. Change the Description field to 'Updated via AI agent routing'."

### acumatica_actions_execute_action

Invokes a business action on a top-level entity. This is how you execute workflows rather than just manipulating data - such as releasing a document, generating a shipment, or calculating taxes.

**Usage note:** Because this endpoint returns a `202 Accepted` with a Location header for async polling, Claude must be aware of the state machine. The tool will return the polling URL to Claude.

> "Execute the 'Release' action on Acumatica Invoice 'INV-9921'. You will receive a polling URL in response. Check that URL until the job status indicates success."

### acumatica_report_get_report

Downloads a generated Acumatica report file based on a request ID. Reports can be requested in PDF, HTML, or XLSX formats.

**Usage note:** This endpoint returns raw binary data. If you request a PDF, the MCP result content will contain the binary stream. Ensure your agent workflow is equipped to handle or store this file rather than trying to read raw PDF bytes as text.

> "Download the generated AR Aging report using request ID 'req-1234'. Request the format as PDF and save the output to the local file system."

### get_single_acumatica_attachment_by_id

Fetches the binary content of a specific file attached to an Acumatica record. You must supply the data view, field, record ID, and filename.

> "Fetch the attached file 'vendor-quote.pdf' from PurchaseOrder 'PO-0099'. Provide the binary content to the OCR parsing tool to extract the total amount."

For a complete list of all available Acumatica tools and their exact JSON Schema definitions, view the [Acumatica integration page](https://truto.one/integrations/detail/acumatica).

## Workflows in Action

MCP servers transform LLMs from passive chatbots into active ERP operators. By combining Acumatica tools with natural language logic, you can [execute multi-step workflows](https://truto.one/connect-netsuite-to-claude-automate-erp-workflows-and-financials/) that normally require a human to navigate dozens of UI screens.

### Workflow 1: Supply Chain Auto-Replenishment

A Supply Chain Operations Manager needs to monitor inventory levels and quickly spin up Purchase Orders when stock items drop below safety thresholds.

> "Check the inventory level for StockItem 'WIDGET-A'. If the quantity on hand is below 50, create a new PurchaseOrder for 100 units from Vendor 'V-100'. Once created, execute the 'Release' action on the new PO to finalize it."

**Step-by-step Execution:**
1. Claude calls `list_all_acumatica_records` with the entity set to `StockItem` and applies an OData `$filter` for the ID 'WIDGET-A'.
2. Claude parses the JSON response, sees the quantity is 32, and determines a reorder is necessary.
3. Claude calls `create_a_acumatica_entity_record` targeting `PurchaseOrder`, building the nested payload with the Vendor ID and line item quantities.
4. Acumatica returns the newly created PO number (e.g., PO-5521).
5. Claude calls `acumatica_actions_execute_action` passing the PO-5521 ID and the `Release` action.
6. The tool returns a 202 Polling URL, which Claude can optionally check to confirm the release job finished successfully.

```mermaid
sequenceDiagram
    participant User as User Prompt
    participant Claude as Claude Desktop
    participant Truto as Truto MCP Server
    participant Acumatica as Acumatica API

    User->>Claude: "Check stock and reorder if low"
    Claude->>Truto: list_all_acumatica_records (entity: StockItem)
    Truto->>Acumatica: GET /entity/Default/22.200.001/StockItem
    Acumatica-->>Truto: JSON Array (Qty: 32)
    Truto-->>Claude: Stock levels
    Claude->>Truto: create_a_acumatica_entity_record (entity: PurchaseOrder)
    Truto->>Acumatica: PUT /entity/Default/22.200.001/PurchaseOrder
    Acumatica-->>Truto: PO Record (PO-5521)
    Truto-->>Claude: PO Created
    Claude->>Truto: acumatica_actions_execute_action (action: Release)
    Truto->>Acumatica: POST /entity/Default/22.200.001/PurchaseOrder/Release
    Acumatica-->>Truto: 202 Accepted (Location Header)
    Truto-->>Claude: Polling URL
```

### Workflow 2: Financial Audit and Attachment Extraction

A Financial Controller is reviewing aged receivables and needs to investigate a specific disputed invoice by reviewing the actual signed contract attached to the record.

> "Find the open AR Invoice 'INV-0882'. List all files attached to it. If there is a file named 'signed-contract.pdf', download it and summarize the payment terms."

**Step-by-step Execution:**
1. Claude calls `get_single_acumatica_record_by_id` for the entity `Invoice` to confirm the record exists and is in an Open state.
2. Claude calls `acumatica_attachments_list_files` passing the Invoice ID to retrieve the attachment metadata.
3. Claude parses the attachment list and locates the ID and view parameters for 'signed-contract.pdf'.
4. Claude calls `get_single_acumatica_attachment_by_id` to download the binary PDF.
5. Depending on the agent environment, Claude parses the PDF text and summarizes the Net 30 payment terms back to the user.

## Security and Access Control

Exposing an ERP like Acumatica to an LLM requires strict boundary setting. Truto's MCP architecture provides several layers of control directly on the server token:

*   **Method Filtering:** By defining `config.methods: ["read"]` during server creation, you completely disable `create`, `update`, `delete`, and `custom` actions. The tools simply will not generate, physically preventing the LLM from mutating Acumatica data.
*   **Tag Filtering:** Limit the surface area of the API. Setting `config.tags: ["financials"]` ensures Claude only sees tools related to GL, AP, and AR, keeping it completely sandboxed away from CRM or HR records.
*   **Expiration (`expires_at`):** You can bind a TTL (Time to Live) to an MCP server URL. If you are granting a temporary contractor AI access to run reports for a week, set an ISO datetime. Once expired, the server automatically self-destructs.
*   **Extra Authentication:** By default, possessing the MCP URL grants access. By enabling `require_api_token_auth: true`, the caller must also provide a valid Truto API token as a Bearer header. This secures the connection even if the URL leaks in application logs.
*   **Rate Limits:** Truto does *not* automatically retry, throttle, or absorb rate limit errors from Acumatica. When Acumatica returns an HTTP 429, Truto passes that error directly to Claude, mapped to standardized IETF headers (`ratelimit-limit`, `ratelimit-remaining`, `ratelimit-reset`). Your agent orchestration layer is responsible for respecting these headers and implementing backoff logic.

## Moving Past Manual ERP Operations

Building an MCP server for Acumatica from scratch is a massive distraction from actually solving business problems. Dealing with contract versions, polling async business actions, formatting PUT payloads, and managing OAuth lifecycles turns what should be a straightforward AI integration into a months-long maintenance nightmare.

By leveraging a dynamically generated, documentation-driven MCP server, your engineering team can focus entirely on prompt architecture and workflow logic. You get secure, deterministic, and tightly controlled AI access to your Acumatica tenant in seconds, not sprints.
