Connect DualEntry to Claude: Automate Revenue Rec & Fixed Assets
Learn how to connect DualEntry to Claude using a managed MCP server. Automate revenue recognition, fixed assets, and intercompany journal entries with AI agents.
If your team needs to connect DualEntry to Claude to automate revenue recognition schedules, execute intercompany journal entries, or manage multi-book fixed assets, you need a Model Context Protocol (MCP) server. This server acts as the translation layer between Claude's tool calls and DualEntry's accounting APIs. You can either build 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 ChatGPT, check out our guide on /connect-dualentry-to-chatgpt-manage-general-ledger-multi-entity/ or explore our broader architectural overview on /connect-dualentry-to-ai-agents-orchestrate-ap-ar-bank-matching/.
Giving a Large Language Model (LLM) read and write access to a general ledger and ERP system like DualEntry is a high-stakes engineering challenge. You must handle complex entity relationships, map deeply nested financial schemas to MCP tool definitions, and navigate strict accounting period constraints. Every time DualEntry introduces a new tax module or updates its revenue recognition logic, 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 DualEntry, connect it natively to Claude Desktop, and execute complex financial workflows using natural language.
The Engineering Reality of the DualEntry 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, the reality of implementing it against specialized financial APIs is painful. DualEntry is built to manage complex, multi-entity accounting, ASC 606 revenue recognition, and granular fixed asset depreciation. Its API heavily reflects that strict financial compliance.
If you decide to build a custom DualEntry MCP server, here are the specific integration challenges you will face:
The Revenue Recognition State Machine
Unlike a standard CRM API where you can simply update a record, DualEntry enforces a strict state machine for revenue recognition contracts. You cannot simply PATCH a contract to change its value if usage data has already been applied or if it has active milestones. Instead, you must issue a change_order, calculate cumulative catch-ups, and transition the order from draft to posted. An LLM cannot natively guess this sequence. You need an MCP server that explicitly exposes state-aware endpoints and strictly defines the JSON schemas for obligation modifications and additions.
Multi-Book Depreciation Schemas
Creating a fixed asset in DualEntry is not just a matter of logging a purchase price. Enterprise accounting requires assets to be tracked across multiple depreciation books (e.g., BOOK for the general ledger, FEDERAL and STATE for tax reporting). When hitting the DualEntry API, you must submit a massive, nested payload containing depreciation_schedules for each book, complete with specific asset and accumulation account numbers. Mapping this deeply nested array into a flat JSON Schema that Claude can understand without hallucinating required properties requires extensive mapping logic.
Strict Balancing and Period Locks
When creating intercompany journal entries, the DualEntry API will immediately reject any payload where total debits do not equal total credits across all specified company_id values. Furthermore, any attempt to modify records in a closed financial period will result in an HTTP 422 error. Your integration layer must be prepared to catch these domain-specific errors and pass them back to the LLM in a readable format so the model can self-correct, rather than silently failing or crashing the MCP server.
Generating the DualEntry MCP Server
To connect Claude to DualEntry, you need an MCP server that exposes DualEntry's API endpoints as JSON-RPC tools. Truto handles this dynamically by reading the connected DualEntry account's configuration and instantly generating an authenticated MCP server URL.
Method 1: Via the Truto UI
For teams who prefer a visual interface, you can generate the server directly from the dashboard:
- Log into your Truto account and navigate to your Integrated Accounts.
- Select the connected DualEntry account you want to expose to Claude.
- Click the MCP Servers tab in the top navigation.
- Click Create MCP Server.
- Select your desired configuration (e.g., restrict to
readmethods only, or filter by specific tags likeaccounting). - Copy the generated MCP server URL (it will look like
https://api.truto.one/mcp/abc123def456...).
Method 2: Via the Truto API
For platform engineering teams automating agent infrastructure, you can generate the MCP server programmatically. This is ideal when spinning up ephemeral agent sessions.
Make a POST request to /integrated-account/:id/mcp with your desired configuration:
curl -X POST https://api.truto.one/integrated-account/<dualentry_account_id>/mcp \
-H "Authorization: Bearer <YOUR_TRUTO_API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"name": "DualEntry RevRec Agent Server",
"config": {
"methods": ["read", "write", "custom"],
"tags": ["revenue_recognition", "fixed_assets", "journal_entries"]
},
"expires_at": "2026-12-31T23:59:59Z"
}'The API returns a secure token URL. Truto hashes the underlying token before storing it, ensuring that even if backend storage is compromised, your server URLs remain secure.
Connecting the MCP Server to Claude
Once you have your Truto MCP URL, connecting it to Claude takes less than a minute. You can do this visually through the UI or programmatically via configuration files.
Method 1: Via the Claude UI
If you are using a modern enterprise version of Claude with UI connector support:
- Open Claude and navigate to Settings.
- Go to the Integrations or Connectors section.
- Click Add MCP Server or Add custom connector.
- Paste the Truto MCP URL you generated in the previous step.
- Click Add. Claude will immediately perform a handshake with the Truto server, fetch the available tools, and make them available in your chat context.
Method 2: Via Manual Configuration File
For developers running Claude Desktop locally, you can manually configure the server using the claude_desktop_config.json file. Truto's MCP server uses Server-Sent Events (SSE) over HTTP, so you will use the official @modelcontextprotocol/server-sse package to proxy the connection.
Open your configuration file (located at ~/Library/Application Support/Claude/claude_desktop_config.json on macOS or %APPDATA%\Claude\claude_desktop_config.json on Windows) and add the following:
{
"mcpServers": {
"dualentry_agent": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-sse",
"https://api.truto.one/mcp/<YOUR_TRUTO_TOKEN>"
]
}
}
}Save the file and restart Claude Desktop. The dualentry_agent will now appear as an available tool provider.
DualEntry MCP Hero Tools
Truto automatically generates tools for every documented DualEntry endpoint, complete with rich descriptions and JSON Schema constraints. Here are six high-leverage hero tools your AI agents can use to automate accounting operations.
create_a_dual_entry_public_contract
Description: Creates a new revenue recognition contract in DualEntry, including its performance obligations and recognition schedule.
Usage Notes: Revenue recognition is complex. A contract defaults to a specific status based on your payload. To skip strict validation initially, you must pass a draft status; otherwise, DualEntry requires all line items, customer IDs, and term IDs to be perfectly formatted. This tool is critical for onboarding new sales deals into your ASC 606 workflow.
"Claude, create a new revenue recognition contract in DualEntry for customer ID 1099. The contract is for a 12-month software subscription starting today at $120,000 total. Save it in draft status so the revenue team can review the performance obligations before posting."
update_a_dual_entry_contract_change_order_by_id
Description: Updates an existing change order on a DualEntry contract. Completing required fields transitions the change order from draft and applies the modifications.
Usage Notes: You cannot directly edit a posted contract that has milestones. You must use this tool to apply a change order. If a customer upgrades their tier mid-cycle, you will use this tool to modify the obligation arrays and set apply_cumulative_catchup to ensure the ledger balances correctly in the current period.
"We just upsold the Acme Corp contract (CNTR-402). Update their draft change order (CO-881) to include the new 'Premium Support' obligation for $5,000. Apply cumulative catch-up for this month and mark the change order as complete."
create_a_dual_entry_public_fixed_asset
Description: Creates a new fixed asset in DualEntry with multi-book depreciation schedules.
Usage Notes: You must supply the depreciation_schedules array covering at least the primary posting book. You need to provide the asset_account_number, expense_account_number, and accumulation_account_number. This tool turns a messy procurement spreadsheet into perfectly structured ERP assets.
"Read this CSV of laptops we bought last week. For each one, create a fixed asset in DualEntry under company ID 2. Use our standard IT asset account 1500, expense account 6500, and accumulation account 1550. Set them up with a straight-line depreciation schedule over 36 months on the primary BOOK."
list_all_dual_entry_schedules
Description: Lists chronological depreciation, disposal, and revaluation events for a specific fixed asset and depreciation book.
Usage Notes: Essential for financial forecasting. You must provide the fixed_asset_number and the depreciation_book_id (e.g., 'BOOK' or 'FEDERAL'). AI agents can use this tool to project future depreciation expenses across the entire fiscal year for budgeting purposes.
"Pull the depreciation schedule for the new warehouse forklift (Asset FA-9011) for the FEDERAL tax book. Summarize the expected depreciation expense for Q3 and Q4 of this year."
create_a_dual_entry_public_journal_entry
Description: Creates a manual journal entry in DualEntry.
Usage Notes: This tool requires careful balancing of debits and credits. You must provide the currency_iso_4217_code, exchange_rate (even if it is 1.0 for base currency), and the line items. Set record_status to draft if you want a human to review the entry before it posts to the ledger.
"I need to record an accrual for our upcoming legal fees. Create a draft journal entry for $15,000 debiting Legal Expenses and crediting Accrued Liabilities. Use today's date and add a memo indicating it is for the pending trademark litigation."
create_a_dual_entry_public_intercompany_journal_entry
Description: Creates an intercompany journal entry in DualEntry, requiring lines to span at least two distinct companies with balancing debits and credits.
Usage Notes: Standard journal entries cannot cross entity boundaries. This specific tool handles multi-entity accounting. If the US parent company pays a vendor on behalf of the UK subsidiary, this tool automatically handles the due-to/due-from clearing accounts.
"The US entity (Company ID 1) just paid a $40,000 AWS bill that actually belongs to the UK entity (Company ID 2). Create an intercompany journal entry to expense the $40,000 to the UK entity's cloud infrastructure account, and credit the US entity's cash account. Handle the intercompany clearing automatically."
To view the complete schema for these tools, rate limits, and the remaining DualEntry tool inventory, visit the DualEntry integration page.
Workflows in Action
Exposing individual tools is helpful, but the real power of MCP is enabling Claude to orchestrate complex, multi-step financial workflows automatically. Here is how Claude chains DualEntry tools together in the real world.
Workflow 1: Multi-Entity Expense Reclassification
Finance teams waste hours moving expenses between subsidiaries. An AI agent can handle this instantly.
"Claude, check the latest bills for our US entity. I think the recent $12,000 marketing agency bill was coded entirely to the US, but it should be split 50/50 with the Canadian entity. If you find it, reclassify it using an intercompany journal entry."
Step-by-step execution:
- Claude calls
list_all_dual_entry_public_billswith a filter for the US company ID and recent dates to find the $12,000 marketing bill. - Claude extracts the exact expense account and vendor details from the bill response.
- Claude calls
create_a_dual_entry_public_intercompany_journal_entry. - It constructs a complex payload: crediting the US marketing expense account for $6,000, debiting the Canadian marketing expense account for $6,000, and ensuring the
company_idfields are distinct for both lines to trigger the automated intercompany clearing.
Result: The user gets a confirmation that the bill was identified and the corresponding intercompany entry (e.g., ICJE-409) has been successfully posted to balance the books.
Workflow 2: Month-End Revenue Catch-Up
Managing subscription upgrades mid-month requires exact proration and revenue catch-up calculations.
"Claude, our customer TechFlow just upgraded to the Enterprise tier mid-contract. Their contract ID is CNTR-118. Create a change order to add the new Enterprise license obligation, apply the cumulative catch-up to this month, and show me the updated revenue schedule."
Step-by-step execution:
- Claude calls
get_single_dual_entry_public_contract_by_idto inspect CNTR-118 and identify the active obligations. - Claude calls
create_a_dual_entry_contract_change_orderpassing thecontract_idand the new obligation details, settingapply_cumulative_catchuptotrue. - Claude receives the successfully created change order ID.
- Claude calls
list_all_dual_entry_contract_usages(or checks the change order summary) to pull the newly recalculated revenue recognition schedule.
sequenceDiagram
participant Claude as Claude Desktop
participant MCP as Truto MCP Server
participant DualEntry as DualEntry API
Claude->>MCP: Call get_single_dual_entry_public_contract_by_id
MCP->>DualEntry: GET /v1/contracts/CNTR-118
DualEntry-->>MCP: Return contract state & obligations
MCP-->>Claude: JSON response
Claude->>MCP: Call create_a_dual_entry_contract_change_order
MCP->>DualEntry: POST /v1/contracts/CNTR-118/change-orders
DualEntry-->>MCP: HTTP 201 (CO-992 Created)
MCP-->>Claude: Return Change Order JSONResult: Claude outputs a summary of the change order, confirms the catch-up amount that will hit the current period ledger, and presents a table of the revised future recognition dates.
Security and Access Control
Giving AI models access to your general ledger requires strict boundaries. Truto provides enterprise-grade access controls for your MCP servers:
- Method Filtering: You can restrict a server to read-only operations by passing
methods: ["read"]during creation. This ensures Claude can only query budgets and read schedules, absolutely preventing the model from posting journal entries or creating bills. - Tag Filtering: Limit the server's scope to specific domains. By passing
tags: ["fixed_assets"], the MCP server will hide all revenue recognition, banking, and payable tools, restricting the agent to depreciation tasks only. - API Token Authentication: By default, possessing the Truto MCP URL grants access. By enabling
require_api_token_auth: true, the MCP client must also pass a valid Truto API token in theAuthorizationheader, adding a strict secondary identity check. - Automatic Expiration: You can set an
expires_attimestamp when generating the server. Once the timestamp is reached, Truto automatically destroys the token and triggers a cleanup alarm, ensuring temporary auditing agents do not have perpetual ledger access. - Factual Note on Rate Limits: Truto does not retry, throttle, or apply backoff on rate limit errors. When the upstream DualEntry API returns an HTTP 429, Truto passes that error directly to the caller. Truto normalizes the upstream rate limit info into standardized headers (
ratelimit-limit,ratelimit-remaining,ratelimit-reset) per the IETF spec. Your MCP client or agent orchestrator is entirely responsible for implementing retry and backoff logic.
The Future of Agentic ERP Operations
The month-end close does not have to be a manual nightmare of spreadsheet reconciliations and data entry. By connecting Claude to DualEntry via a managed MCP server, you transform your ERP from a static database into an active participant in your finance operations.
Instead of asking financial controllers to manually calculate cumulative revenue catch-ups or book complex multi-entity journal entries, AI agents can execute these domain-specific operations safely, deterministically, and with full audit trails. Stop maintaining brittle integration scripts and start giving your AI the tools it needs to automate the back office.
FAQ
- What is a DualEntry MCP Server?
- An MCP server acts as a translation layer that allows AI models like Claude to interact securely with the DualEntry API, exposing financial operations as callable JSON-RPC tools.
- How are DualEntry API rate limits handled by the MCP server?
- Truto does not retry or apply backoff on rate limit errors. If DualEntry returns an HTTP 429, Truto passes that error directly to the caller and normalizes the headers (ratelimit-limit, ratelimit-reset). The calling agent is responsible for implementing retry logic.
- Can I restrict Claude to read-only access in DualEntry?
- Yes. When generating the MCP server in Truto, you can apply method filtering (e.g., setting methods to ['read']). This strictly prevents Claude from executing any write operations like posting journal entries.
- How do I securely share an MCP server with external auditors?
- You can generate an MCP server with an explicit 'expires_at' timestamp. Once the audit period ends, the server token is automatically destroyed by Truto's cleanup systems.