Skip to content

Connect Exact Online to ChatGPT: Manage Sales, CRM & Project Data

Learn how to connect Exact Online to ChatGPT using an auto-generated MCP server. Manage CRM data, projects, and sales invoices via natural language.

Nidhi KN Nidhi KN · · 9 min read
Connect Exact Online to ChatGPT: Manage Sales, CRM & Project Data

If you need to connect Exact Online to ChatGPT to automate ERP workflows, manage CRM accounts, or track project hours, you need a Model Context Protocol (MCP) server. This server acts as the translation layer between ChatGPT's tool calls and Exact Online's highly specific REST APIs. You can either build, host, and maintain this infrastructure yourself, or 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 Exact Online to Claude or explore our broader architectural overview on connecting Exact Online to AI Agents.

Giving a Large Language Model (LLM) read and write access to a comprehensive ERP like Exact Online is a massive engineering challenge. You have to handle division-scoped endpoint paths, strict pagination limits, and deeply nested relational data for financial transactions. Every time you need a new capability—like generating a sales invoice or logging a cost transaction—your custom server code must be updated, redeployed, and tested.

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

The Engineering Reality of the Exact Online 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, implementing it against Exact Online's legacy-influenced REST API is exceptionally painful.

If you decide to build a custom MCP server for Exact Online, you own the entire API lifecycle. Here are the specific integration challenges that break standard CRUD assumptions when working with Exact Online:

Division-Scoped Endpoint Paths

Unlike modern SaaS platforms where a Bearer token automatically routes to the correct tenant data, Exact Online requires a specific {division} code directly in the URL path for almost every endpoint (e.g., GET /api/v1/{division}/crm/Accounts). If you are building a multi-tenant AI agent, your MCP server must first resolve the division code for the authenticated user and dynamically inject it into the path. If an LLM hallucinates the division ID or drops it, the request fails with a 404 or 403.

Aggressive Pagination and $skiptoken constraints

Exact Online severely restricts payload sizes. Many endpoints cap responses at exactly 60 rows per page. The API enforces pagination via OData __next links or $skiptoken parameters. Exposing this directly to an LLM is a disaster—models struggle to construct valid OData pagination queries and often hallucinate page offsets. Your MCP server must abstract these cursors into a flat namespace, explicitly instructing the LLM to pass cursor strings back exactly as received.

Multi-Entity Write Dependencies

Writing data to Exact Online is rarely a single HTTP POST. To create a Sales Invoice, you cannot simply pass a customer name and an amount. The payload requires a valid Journal code, the OrderedBy account ID, and nested SalesInvoiceLines which individually require valid Item and GLAccount GUIDs. Your MCP server must expose tools that allow the LLM to recursively query these IDs before attempting the final write operation, otherwise Exact Online will reject the payload.

Step 1: Create the Exact Online MCP Server

Truto dynamically generates MCP tools from Exact Online's resource documentation, meaning you don't have to write JSON-RPC schemas by hand. Each MCP server is scoped to a single connected Exact Online account.

You can create this server in two ways: via the Truto dashboard or programmatically via the API.

Method A: Via the Truto UI

This is the fastest path for internal tooling or quick prototyping.

  1. Log into your Truto account and navigate to the Integrated Accounts page.
  2. Select your connected Exact Online account.
  3. Click the MCP Servers tab.
  4. Click Create MCP Server.
  5. Select your desired configuration (e.g., restrict to read methods only, or filter by crm tags).
  6. Copy the generated MCP server URL. It will look like https://api.truto.one/mcp/a1b2c3d4e5f6....

Method B: Via the API

For production workflows where your application deploys AI agents programmatically, you should generate the MCP server via the Truto API. This allows you to dynamically scope the server's permissions per user session.

To generate the server, make a POST request to /integrated-account/:id/mcp:

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": "Exact Online Project Agent",
    "config": {
      "methods": ["read", "write"],
      "tags": ["projects", "crm", "sales_invoices"]
    }
  }'

The response returns the server URL. This single URL carries the cryptographic token that securely routes requests to the correct Exact Online tenant. Treat this URL like a secret.

{
  "id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
  "name": "Exact Online Project Agent",
  "url": "https://api.truto.one/mcp/f8e9d0c1b2a3...",
  "expires_at": null
}

Step 2: Connect the MCP Server to ChatGPT

Once you have your Truto MCP URL, you need to register it as a tool provider for ChatGPT.

Method A: Via the ChatGPT UI (Custom Connectors)

If you are using ChatGPT Pro, Plus, Enterprise, or Education, you can add the server directly via the interface:

  1. Open ChatGPT and navigate to Settings -> Apps -> Advanced settings.
  2. Ensure Developer mode is enabled.
  3. Under MCP servers / Custom connectors, click Add new server.
  4. Provide a recognizable name (e.g., "Exact Online ERP").
  5. Paste the Truto MCP URL you generated in Step 1 into the Server URL field.
  6. Click Save.

ChatGPT will immediately ping the endpoint, perform the JSON-RPC initialization handshake, and load the Exact Online tool definitions into its context.

Method B: Via Manual SSE Configuration File

If you are running a custom headless agent, using the ChatGPT desktop app, or managing configurations via code, you can use the @modelcontextprotocol/server-sse transport.

Create or update your mcp.json configuration file:

{
  "mcpServers": {
    "exact-online-erp": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-sse",
        "--url",
        "https://api.truto.one/mcp/f8e9d0c1b2a3..."
      ]
    }
  }
}

Exact Online Hero Tools for AI Agents

Truto automatically maps Exact Online's endpoints to standardized MCP tools with JSON Schema validations attached. Instead of generic CRUD, here are high-leverage operations that allow ChatGPT to act as a financial and project management operator.

Read Accounts (CRM)

Before executing transactions, the AI agent often needs to locate a customer's internal Exact Online ID. This tool searches the CRM accounts ledger.

Tool name: list_all_exact_online_accounts

"Find the Account ID for the customer named 'Acme Corp' in our Exact Online CRM."

Retrieve General Ledger (GL) Accounts

Financial transactions require strict GL coding. This tool allows the agent to fetch the available chart of accounts to determine the correct target for revenue or expenses.

Tool name: list_all_exact_online_gl_accounts

"List our active GL accounts and find the ID for the 'Software Subscriptions' revenue account."

Search Active Projects

For agencies and professional services, fetching active projects is the first step in logging time and materials.

Tool name: list_all_exact_online_projects

"Get all active projects associated with the account ID we just found for Acme Corp."

Log Project Time Transactions

Allows the LLM to query existing timesheets or, when combined with write permissions, submit new time entries against a specific WBS activity.

Tool name: list_all_exact_online_time_transactions

"Retrieve all time transactions logged against the Acme Website Redesign project for this week."

Log Project Cost Transactions

Submit expenses, contractor fees, or material costs directly against a project ledger. The AI must resolve the Project ID, Item ID, and Quantity first.

Tool name: create_a_exact_online_cost_transaction

"Log a cost transaction of 5 units of 'Server Hosting' to the Acme Web Project using yesterday's date."

Generate Sales Invoices

Creates a draft or final sales invoice. This requires the LLM to assemble a complex nested payload containing the Journal code, Customer ID, and Invoice lines.

Tool name: create_a_exact_online_sales_invoice

"Generate a sales invoice for Acme Corp using Journal code 10. Add one line item for 'Consulting Hours' with a quantity of 10 at the standard rate."

(Note: This is a curated selection of high-impact tools. Truto exposes dozens of endpoints for Exact Online covering inventory, HRM, payroll, and more. View the full Exact Online integration inventory here.)

Workflows in Action

Exposing individual endpoints is useful, but the real power of MCP is chaining tools together to solve multi-step problems. Here is how ChatGPT orchestrates Exact Online APIs to complete end-to-end tasks.

Scenario 1: Invoice Generation for a New Client

When a sales rep asks the agent to invoice a client, the LLM must independently resolve relational data before executing the write.

"Please generate a new sales invoice for Stark Industries for 5 Enterprise Licenses. Use our standard sales journal."

  1. list_all_exact_online_accounts: The agent queries the CRM for Stark Industries to retrieve the accountId.
  2. list_all_exact_online_items: The agent searches the item catalog to find the exact internal ID for Enterprise License.
  3. list_all_exact_online_journals: The agent fetches available financial journals to confirm the code for the standard sales ledger.
  4. create_a_exact_online_sales_invoice: Having collected all required GUIDs, the agent constructs the nested JSON payload and posts the invoice to Exact Online.
sequenceDiagram
    participant User
    participant ChatGPT
    participant MCP as Truto MCP Server
    participant Exact as Exact Online API

    User->>ChatGPT: "Invoice Stark Industries for 5 Enterprise Licenses"
    ChatGPT->>MCP: Call list_all_exact_online_accounts (Search: Stark)
    MCP->>Exact: GET /api/v1/{div}/crm/Accounts
    Exact-->>MCP: Returns Account ID (1234)
    MCP-->>ChatGPT: Account ID: 1234
    
    ChatGPT->>MCP: Call list_all_exact_online_items (Search: Enterprise)
    MCP->>Exact: GET /api/v1/{div}/logistics/Items
    Exact-->>MCP: Returns Item ID (5678)
    MCP-->>ChatGPT: Item ID: 5678

    ChatGPT->>MCP: Call create_a_exact_online_sales_invoice
    MCP->>Exact: POST /api/v1/{div}/salesinvoice/SalesInvoices
    Exact-->>MCP: 201 Created (Invoice #9921)
    MCP-->>ChatGPT: Invoice #9921 Created
    ChatGPT->>User: "Invoice #9921 has been drafted for Stark Industries."

Scenario 2: Project Auditing & Cost Correction

A project manager needs to investigate cost overruns and log a missing expense.

"Pull the recent costs for the 'Project Phoenix' engagement. If the AWS hosting bill from yesterday isn't there, log a cost transaction for it."

  1. list_all_exact_online_projects: The agent fetches the active project list and extracts the ID for Project Phoenix.
  2. list_all_exact_online_cost_transactions: The agent retrieves recent costs for that specific Project ID and reviews the ledger.
  3. Analysis: The agent observes that the AWS bill is missing from the returned array.
  4. create_a_exact_online_cost_transaction: The agent formulates the payload using the Project ID, the relevant GL Account/Item ID for hosting, and submits the missing expense.

Rate Limits and Error Handling

Exact Online enforces rate limits on API consumption. It is critical to understand that Truto does not absorb, throttle, or automatically retry requests that hit HTTP 429 Rate Limit errors.

If the LLM issues too many rapid requests and triggers a rate limit from Exact Online, Truto passes that 429 error directly back to the caller.

To help your agents handle this gracefully, Truto normalizes Exact Online's rate limit headers into the IETF standard format:

  • ratelimit-limit: The maximum number of requests allowed in the current window.
  • ratelimit-remaining: The number of requests left.
  • ratelimit-reset: The time at which the limit window resets.

Your AI agent client must monitor these headers and implement its own backoff and retry logic when a tool call fails with a 429.

Security and Access Control

Giving an AI agent access to an ERP requires strict governance. Truto's MCP servers support multiple layers of configuration to limit blast radius.

  • methods filter: Restrict the server to safe operations. Setting methods: ["read"] ensures the agent can query accounts and invoices but cannot create or delete data.
  • tags filter: Scope the server to specific functional areas. Setting tags: ["crm", "projects"] hides the logistics, HR, and payroll tools entirely.
  • require_api_token_auth: When set to true, possessing the MCP URL is not enough. The client must also pass a valid Truto API token in the Authorization header, enforcing secondary authentication.
  • expires_at: Set an ISO datetime to create temporary MCP servers. Ideal for granting an AI agent time-bound access to audit a ledger before the URL automatically revokes itself.

Stop Writing ERP Integration Code

Connecting Exact Online to ChatGPT manually means writing OAuth refresh workers, mapping OData queries to JSON-RPC tools, and maintaining a massive surface area of API changes.

Truto abstracts this away. We provide the unified infrastructure to connect, manage, and expose B2B SaaS APIs to AI agents instantly.

Get out of the business of maintaining custom integration code. Let your AI agents do the heavy lifting.

FAQ

How does Truto handle Exact Online rate limits?
Truto passes HTTP 429 rate limit errors directly to the caller. We normalize Exact Online's rate limit information into standardized IETF headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset). The caller is responsible for implementing retry and backoff logic.
Can I restrict what Exact Online data ChatGPT can access?
Yes. When generating the MCP server URL via Truto, you can use method filtering (e.g., read-only) and tag filtering to restrict exactly which endpoints and operations the AI agent is allowed to execute.
Does Truto cache my Exact Online ERP data?
No. Truto operates as a real-time pass-through proxy. Tool calls from ChatGPT are translated into Exact Online API requests on the fly, ensuring zero data retention.

More from our Blog