Connect AI assistants to Ringbook
Connect ChatGPT, Claude, Codex or Cursor to Ringbook, then ask about your books in plain language. You choose which organizations the assistant can see and what it may do there.
MCP (the Model Context Protocol) is an open standard that lets AI assistants call tools and read data. Ringbook runs a hosted MCP server, so there is nothing to install. You sign in, pick the organizations and an access level for each, and the assistant finds the available tools by itself.
Choose how to connect
There are two ways to connect. Both follow the same access rules, which are described in Security model.
| OAuth connector | Personal access token | |
|---|---|---|
| Best for | ChatGPT, claude.ai, Claude Desktop | Codex, Claude Code, Cursor, scripts, CI |
| How you connect | Add the server URL, sign in to Ringbook, choose Allow access on the consent screen | Create a token in Ringbook and give it to the client |
| Secret to store | None | The token, shown once. It starts with rb_mcp_ |
| Organizations and levels | Chosen on the consent screen | Chosen when you create the token |
| Expiry | Renewed automatically by the client; revoke any time in Ringbook | 90 days by default, 1 year at most |
| Revoke | Remove the connector or the connection in Ringbook | Delete the token in Ringbook |
The server URL for both is https://backend.ringbook.io/mcp.
What you can ask
Once connected, ask the questions you would otherwise dig for:
- "Summarize my P&L for last quarter."
- "Find all invoices from vendor X."
- "Which expense account grew the most this year?"
- "Show me anything that looks like an unpaid payable."
- "Which bank accounts still have unmatched statement lines?"
Answers come only from the organizations you granted: the ledger, the chart of accounts, reports, uploaded documents, open items and bank reconciliation status. Every figure is read live when you ask.
Ask Claude about your books
A connected assistant reads your real ledger through MCP. Press play and send the question yourself.
Sample data with English interface labels. Nothing here changes your books or spends credits.
The question is already written for you — press Send and ask it.
Connect Claude (claude.ai / Claude Desktop)
Claude connects with OAuth, so you do not copy any token. You sign in and allow access.
- Open Settings → Connectors and choose Add custom connector.
- Enter the server URL:
https://backend.ringbook.io/mcp - Sign in to Ringbook when prompted.
- On the consent screen, choose which organizations to share and the access level for each (Report, Read or Write), then choose Allow access.
You can open the consent screen again later to change the organizations or the levels.
Connect Claude with OAuth
The consent screen decides exactly which organizations an assistant such as Claude or ChatGPT can see — walk through it. Press the highlighted controls yourself.
Sample data with English interface labels. Nothing here changes your books or spends credits.
Connectors live in your assistant's settings. Ringbook isn't in the built-in list, so add it as a custom connector.
Connect ChatGPT
ChatGPT connects to Ringbook as a custom connector. Ringbook publishes standard OAuth discovery and supports dynamic client registration, so ChatGPT can register itself without a client ID or secret from you.
- In ChatGPT, open the settings where you manage connectors or apps and add a custom connector (a remote MCP server).
- Enter the server URL:
https://backend.ringbook.io/mcp - Choose OAuth as the sign-in method if ChatGPT asks.
- Sign in to Ringbook when prompted.
- On the consent screen, choose the organizations and the access level for each, then choose Allow access.
- Start a chat, enable the Ringbook connector for it, and ask for the organizations it can reach.
Start with Report or Read. Grant Write only when you want the assistant to stage drafts.
Connect developer tools (personal access token)
Codex, Claude Code, Cursor, scripts and any client that sends a bearer token use a personal access token. Codex needs no separate Ringbook integration and no Claude account.
- Go to the Connect to Ring page in Ringbook and open the AI agents tab.
- Create a token.
- Choose which organizations it can reach and the level for each.
- Choose an expiry (30 days, 90 days or 1 year; 90 days is the default).
- Copy the token, which starts with
rb_mcp_. It is shown only once.
Create a personal access token
For Claude Code, Cursor, and scripts — mint a scoped token in the app. Follow the prompts — press the highlighted controls yourself.
Sample data with English interface labels. Nothing here changes your books or spends credits.
Create a token to let an AI agent read Ringbook data and, with Write, use capability-gated creation tools.
https://backend.ringbook.io/mcpPersonal access tokens live in Ringbook under AI agents (MCP). Press Create token.
Then add it to your client:
https://backend.ringbook.io/mcpChatGPT and claude.ai use the OAuth connector described above, so they do not need a token or these snippets.
Codex CLI and IDE
Replace the placeholder with your Ringbook token, then run these commands in your terminal. The token stays in the environment; the configuration stores its variable name. Do not commit the token to your project.
export RINGBOOK_MCP_TOKEN='rb_mcp_...'
codex mcp add ringbook --url https://backend.ringbook.io/mcp --bearer-token-env-var RINGBOOK_MCP_TOKEN
codex mcp list
codexAlternatively, add this to ~/.codex/config.toml. Codex clients using this configuration need access to the same environment variable. Restart the IDE extension after changing its configuration.
[mcp_servers.ringbook]
url = "https://backend.ringbook.io/mcp"
bearer_token_env_var = "RINGBOOK_MCP_TOKEN"Claude Code
claude mcp add --transport http ringbook https://backend.ringbook.io/mcp \
--header "Authorization: Bearer rb_mcp_..."Other compatible MCP clients
For clients that accept a mcpServers configuration with remote URLs and headers, use the example below. Other clients may use a different settings format; use their remote HTTP server settings and the same URL and bearer token. Replace the placeholder with your own token:
{
"mcpServers": {
"ringbook": {
"url": "https://backend.ringbook.io/mcp",
"headers": {
"Authorization": "Bearer rb_mcp_..."
}
}
}
}curl (verify a token)
A raw JSON-RPC call that lists the tools available to your token. Streamable HTTP requires both content types in the Accept header:
curl -N https://backend.ringbook.io/mcp \
-H "Authorization: Bearer rb_mcp_..." \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Available tools
Your assistant sees only the tools your access level allows. Read tools answer straight from your books. Write tools create things for a person to review or use: journal entries and invoices are staged as drafts, while the other creation tools act immediately. Issuing or voiding an invoice posts to the ledger, so those two run only when the organization allows direct posting. Every tool also re-checks your own live access right on each call.
| Level | Tools | What they do |
|---|---|---|
| Report | list_organizations, get_organization_info, generate_report, export_report, export_report_pdf, get_job_status, get_my_access | Reports, exports, basic organization info and a self-description of what you can do here |
| Read | list_accounts, search_transactions, get_transaction, export_transactions, search_documents, get_document, get_credit_balance, list_open_items, get_reconciliation_summary, get_statement_lines, list_reconciliation_matches, list_discrepancies, list_unlinked_documents, list_segments, list_subledgers, list_invoices, get_invoice, get_invoice_pdf | Read transactions, accounts, documents, open items, reconciliation detail, segments, customers and vendors, and invoices |
| Write | create_transaction, sync_journals, create_account, create_ring, comment_on_ring, start_statement_extraction, start_reconciliation, upload_document, finalize_document_upload, generate_journal_from_document, create_segment, set_journal_segments, create_subledger, create_invoice_draft, update_invoice_draft, issue_invoice, void_invoice | Stage journal drafts, create accounts, Rings, segments, customers and vendors, reply under an existing Ring, tag posted journals with a segment, draft invoices (issue and void only when direct posting is on), upload documents, start background jobs |
Each tool, with what it does and its level, is listed here:
| Tool | What it does | Min level | Status |
|---|---|---|---|
| list_organizations | List the organizations this connection can reach, with your access level for each. | Report | Live |
| get_organization_info | Fetch an organization's profile: name, currency, fiscal settings. | Report | Live |
| generate_report | Balance sheet, profit & loss, or trial balance — with optional per-account detail (includeAccounts). | Report | Live |
| export_report | Download a balance sheet, profit & loss, or trial balance as a CSV or XLSX file — full per-account detail with category subtotals and the statement summary. Returned inline by default; delivery: download_url returns a short-lived signed link instead. | Report | Live |
| export_report_pdf | Render a balance sheet, profit & loss, or trial balance as a formatted PDF. The PDF itself is returned directly (inline) in the normal case; unusually large reports fall back to a short-lived (about 5 minutes) download link, and delivery: download_url always returns the link. The file is not saved to your shoebox. | Report | Live |
| get_job_status | Check the progress of a long-running background job. | Report | Live |
| get_my_access | Describe what this connection and you can actually do in an organization: your role, the access level granted here, the access rights you hold, how much report detail you can see, and for every tool whether it is callable — with the specific reason when it is not. | Report | Live |
| list_accounts | List the chart of accounts. Use it to find account ids before filtering transactions. | Read | Live |
| search_transactions | Search and filter journal transactions by date, account, amount, and text. | Read | Live |
| get_transaction | Read one transaction in full, including its lines and attachments. | Read | Live |
| export_transactions | Download transactions as a CSV or XLSX file — one row per journal line with account, debit/credit, currency, and creator (up to 5,000 rows). | Read | Live |
| search_documents | Search uploaded documents (invoices, receipts, statements) by their extracted contents. | Read | Live |
| get_document | Fetch a short-lived (about 5 minutes) download link for a document found via search_documents. | Read | Live |
| get_credit_balance | Check the organization's remaining credit balance before calling a billable tool. Free. | Read | Live |
| list_open_items | List open receivables or payables per counterparty — remaining amounts, due dates, and aging buckets. | Read | Live |
| get_reconciliation_summary | Bank-reconciliation status per account: book vs statement balance, matched and unmatched counts, last reconciled date. | Read | Live |
| get_statement_lines | Show the extracted statement table for a reconciliation session — the parsed bank rows, paginated — so a parse can be reviewed before reconciling. | Read | Live |
| list_reconciliation_matches | Drill into one reconciliation session: which journal entries were matched, and whether the AI or a person matched them. | Read | Live |
| list_discrepancies | Drill into one reconciliation run: the statement lines and ledger entries that could not be matched, each with its type and the AI's proposed account. Read-only — resolving an item stays in the app. | Read | Live |
| list_unlinked_documents | List documents not yet attached to anything (no transaction, journal entry, ring, or reconciliation), with stored candidate matches and confidence. | Read | Live |
| list_segments | List the organization's segments (id, code, name, description, active) so an assistant can find or check a segment before tagging journals. | Read | Live |
| list_subledgers | List the organization's customers and vendors, optionally filtered by type or name, with ids, display ids and emails. | Read | Live |
| list_invoices | List created documents (invoices, quotations, delivery notes, receipts) with status, customer, totals and unpaid amounts. Needs the invoice view right. | Read | Live |
| get_invoice | Read one created document with its lines, customer, payment status, linked documents and the revision token used to edit a draft. Needs the invoice view right. | Read | Live |
| get_invoice_pdf | Get a short-lived download link (it expires in minutes) for an issued document's frozen PDF. Needs the invoice view right. | Read | Live |
| create_transaction | Stage a journal entry as a DRAFT for a human to review. Organization admins can optionally enable automatic posting of balanced entries in organization settings; drafts are the default. Each entry can carry a segmentId. | Write | Live |
| sync_journals | Send up to 100 journals your own AI already prepared (for example one per bank line) in one call. Each carries your journal number, which Ringbook keeps as the voucher number, so re-sending skips journals already in Ringbook. Accounts can be named by code or exact name. Lands as drafts by default, like create_transaction; dryRun checks the batch without writing. | Write | Live |
| create_account | Create a new account in the chart of accounts (name, type, category, normal balance, optional grouping levels). The currency must be the organization's base currency or "ANY"; omit the code to auto-generate the next free one. | Write | Live |
| create_ring | Post a Ring (a short note or message) to the organization's feed immediately, optionally attaching documents already in the Shoebox. This creates a durable feed item, not a draft, and no journal entry. | Write | Live |
| comment_on_ring | Reply under an existing Ring in the organization's feed, immediately, and notify the Ring's author (unless that is you). ringId is the UUID in a /dashboard/feed/<uuid> link. Needs the Ring posting right. Pass an idempotencyKey to make a retry safe. Not for new posts: use create_ring for those. | Write | Live |
| start_statement_extraction | Kick off extraction of bank/credit-card statement rows into a reconciliation session for review. Extracting a PDF or image statement costs 50 credits; spreadsheet/CSV statements are usually free. | Write | Live |
| start_reconciliation | Kick off AI reconciliation of an already-extracted bank statement against the ledger for one account — matching statement lines to journal entries and flagging discrepancies for human review (150 credits, billed when the job runs). | Write | Live |
| upload_document | Mint a signed upload URL so a document (invoice, receipt, statement) can be added to the organization's shoebox. | Write | Live |
| finalize_document_upload | Register a document that was PUT to a signed upload URL, making it searchable. Completes the two-step upload. | Write | Live |
| generate_journal_from_document | Have Ringbook's own AI draft a journal entry from an uploaded document, for a human to review. Costs 50 credits. | Write | Live |
| create_segment | Create a segment from a name and code the user supplied (the assistant must ask, never invent), refusing duplicates. Returns a segment reference. | Write | Live |
| set_journal_segments | Set or clear the segment on the lines of up to 50 already-posted journals, with per-journal updated, unchanged and skipped results. Changes only the segment tag, never amounts or accounts, and is recorded in the entry's history. Journals still waiting as drafts are not posted yet and are skipped. | Write | Live |
| create_subledger | Create a customer or vendor, reusing an unambiguous existing record with the same name. Returns a subledger reference. | Write | Live |
| create_invoice_draft | Create a DRAFT invoice, quotation or delivery note for an existing customer. Nothing is posted to the ledger. Needs the invoice management right. | Write | Live |
| update_invoice_draft | Patch a draft document (when lines are sent they replace all lines), guarded by the revision token so it cannot overwrite a newer edit. Needs the invoice management right. | Write | Live |
| issue_invoice | Issue a draft document: assigns its number and, for invoices, posts the journal. Permanent. Only runs when the organization allows direct posting for connected AI apps; otherwise it refuses. Confirm with the user first. | Write | Live |
| void_invoice | Void an issued document by posting a reversal. Only runs when the organization allows direct posting for connected AI apps; otherwise it refuses. Confirm with the user first. | Write | Live |
A few tools consume organization credits (your personal balance is used only if the organization runs short and you turned on personal-credit fallback in your profile): search_documents costs 10, generate_journal_from_document costs 50, and start_statement_extraction costs 50 for a PDF or image statement (spreadsheet/CSV statements are usually free), and start_reconciliation costs 150 — the most expensive call on the surface, so check the balance before starting one. Most other tools are free — the remaining exception is that a confident background auto-match when a document is ingested (for example via finalize_document_upload) can incur an automatch charge of about 30 credits. Failures proven to happen before durable work, and worker jobs that roll back, are refunded. A keyed IDEMPOTENCY_OUTCOME_UNKNOWN is not automatically refunded because its write may have committed; reconcile the result before retrying. get_credit_balance lets an agent check affordability first.
Every Write tool needs its own access right in the organization, checked live on each call:
| Write tools | Access right needed |
|---|---|
create_transaction, sync_journals, generate_journal_from_document, create_segment, set_journal_segments, create_subledger | Journal posting (journal_ringbook:create) |
create_ring, comment_on_ring | Ring posting (ring_ringbook:create) |
create_account | Chart of accounts creation (chart_of_accounts:create) |
start_statement_extraction, start_reconciliation | Reconciliation (reconciliation:manage) |
upload_document, finalize_document_upload | Own-document upload (documents_own:create) |
create_invoice_draft, update_invoice_draft, issue_invoice, void_invoice | Invoice management (invoices:manage) |
The invoice read tools (list_invoices, get_invoice, get_invoice_pdf) need the invoice view right (invoices:view).
If a tool is blocked, ask the assistant to call get_my_access. It lists every tool and the specific reason each blocked one is blocked.
Export tools hand the file back directly in the normal case. Pass delivery: "download_url" to export_report or export_report_pdf to get a short-lived download link instead, for example when the file is too large to return inline.
Journal entries are draft-first; other writes create immediately
With write access, an assistant can propose an entry but cannot post it to your ledger. The entry is staged as a draft, and a person reviews and books it in Ringbook. This is the default for every organization.
Journal writes become drafts
Journal-writing tools are draft-first; a person reviews and posts. Try the whole loop.
Sample data with English interface labels. Nothing here changes your books or spends credits.
Ringbook is connected with a Write grant. Ask in plain language — the agent picks the tools itself.
This assistant holds a Write grant for your organization. The instruction is already typed — send it.
Journal-writing tools stage entries as drafts for a person to review and post by default — that is the loop the demo above walks through. Other Write tools perform their named creation action immediately: they can post a Ring or reply under one, add an account, segment, customer or vendor, upload a document, or start statement extraction and reconciliation.
An organization admin can opt in to automatic posting of balanced journal entries on the Connect to Ring page, in the AI agents tab, under Journal entries from connected AI apps. Even then, the entry passes the same validation as one a person types, and an agent can never delete an entry or change its amounts or accounts. The only edit to an existing journal is set_journal_segments, which changes just the segment tag of posted lines and is recorded in the entry's history.
Invoices are draft-first too. create_invoice_draft and update_invoice_draft only create or change a draft and post nothing to the ledger. issue_invoice (permanent: it assigns the number and posts the journal) and void_invoice (posts a reversal) run only when the organization allows direct posting for connected AI apps; otherwise they refuse and point you to the document in Ringbook. An assistant should confirm with you before issuing or voiding.
Security model
Whichever way you connect, the same rules apply.
Access levels are set per organization. Each level includes everything below it.
| Level | What it allows |
|---|---|
| Report | Financial reports only: balance sheet, P&L, trial balance, and basic organization info. Subject to your report visibility. |
| Read | Everything in Report, plus transactions, accounts and documents. Results stay filtered by your live access rights and data visibility. |
| Write | Everything in Read, plus creating records. Journal entries and invoices are staged as drafts for a person to review; other creation tools act immediately. You can grant Write in an organization if you hold at least one of the access rights the Write tools need there (journal posting, Ring posting, account creation, reconciliation, document upload or invoice management). You do not need the Edit company profile right. Each tool still requires its own right when it is called. |
Your live rights always win. The effective access is the lower of the level you granted and your current access rights in the app. If you leave an organization or an admin narrows your rights, the connection narrows or closes immediately. A token can never do more than you can do in the app right now.
How credentials are handled:
- Tokens are hashed at rest and shown in full once, at creation.
- Every token expires. The default is 90 days and the maximum is 1 year. The expiry is fixed at creation. To renew, revoke the token and create a new one.
- A token can carry a tool allowlist, so it can call only the tools it needs. You can edit a token's name, organizations, levels and allowlist, but not its secret or expiry.
- Organization admins have a kill switch: they can revoke any credential's access to their organization at any time.
Credits and rate limits
A few tools use organization credits. Your personal balance is touched only if the organization runs short and you have turned on personal-credit fallback in your profile.
| Tool | Cost |
|---|---|
search_documents | 10 credits |
generate_journal_from_document | 50 credits |
start_statement_extraction | 50 credits for a PDF or image statement. Spreadsheet and CSV statements are usually free. |
start_reconciliation | 150 credits, billed when the job runs |
Most other tools are free. One exception: when a document is ingested (for example through finalize_document_upload), a confident background auto-match can add a charge of about 30 credits. Failures proven to happen before any durable work, and background jobs that roll back, are refunded. A keyed IDEMPOTENCY_OUTCOME_UNKNOWN is not automatically refunded because its write may have committed, so check the result before retrying. get_credit_balance is free, so an assistant can check the balance before it spends anything.
Requests are rate-limited per token and per organization. Normal interactive use does not reach the limits.
FAQ
Can I use ChatGPT, Codex or another AI model? Yes. ChatGPT connects with OAuth as a custom connector, and Codex connects with a personal access token. Any other app works if it supports remote MCP over Streamable HTTP and either OAuth or an Authorization: Bearer header. The app sets up the connection, not the model, so available models and MCP features depend on the app. A client that supports only local STDIO servers cannot use the remote URL.
How do I check the connection? Ask the assistant to list the Ringbook organizations it can reach. In Codex, run codex mcp list first. If sign-in fails, check the token's expiry, its organization grants, and that the token's environment variable is visible to the Codex process.
Can one connection reach several organizations? Yes. A connection or token can have access to several organizations, each with its own level. The list_organizations tool shows which ones.
How do I revoke access? Delete the token or connection in your own settings. Organization admins can also revoke any credential's access to their organization. Because effective access is the lower of the grant and your live rights, removing someone's membership closes their access at once.
Will tool schemas change under my agent? Only by addition. New tools, optional parameters and response fields can appear. Existing ones are never renamed, removed or made stricter. If a breaking change is ever needed, a versioned replacement (for example search_transactions_v2) ships beside the old tool, and the old tool keeps working for at least 90 days.
What can agents not do?
- Delete anything.
- See or touch any organization or data beyond your own access rights.
- Post journal entries to the ledger by default. Journal tools stage drafts. If an admin enables automatic posting, entries still pass the same validation as a person's, and existing entries cannot be deleted or have their amounts or accounts changed (only the segment tag of posted lines can be set). Other Write tools create Rings, accounts, segments, customers, vendors and documents immediately, or start extraction and reconciliation jobs. Invoice drafts post nothing; issuing or voiding an invoice runs only when direct posting is on.
Connection management and a complete workflow
Everything about connections lives in one place: the Connect to Ring page, AI agents tab. Check it after you connect a new app and whenever something looks wrong. For credit prices and top-ups, see Credits. Company-wide settings are in Organization settings.
Tokens and connected apps
The tab has two lists you can manage yourself. Both only show what you created or connected.
| List | Columns and actions |
|---|---|
| Tokens (Connections (MCP API tokens)) | Name, Token, Access, Created, Expires, Last used, Status, Actions. Edit changes the name, organizations, levels and tool allowlist. Revoke stops a token at once. Delete removes a revoked token from the list |
| Connected apps | App, Connected, Last activity. Edit access changes the organizations and levels. Revoke removes the app's access to every organization you granted it |
A token's Status is Active, Revoked or Expired. A revoked or expired token never works again. Create a new one instead, because the secret and the expiry cannot be changed after creation.
Recent MCP calls
Organization admins also see All organization tokens (admin) below those lists. It shows every member's tokens and connected apps, with the Owner and the Last IP of each token, so you can revoke anything you do not recognise. Under it, Recent MCP calls lists the latest tool calls, newest first, with a Load more button.
| Column | What it shows |
|---|---|
| Time, Tool, Token | When the call happened, which tool and which token. The member's name appears under the token |
| Status | Running, Success, Error, Denied, Rate limited or Payment required |
| Credits, Duration | Credits charged and how long the call took |
| Result | The record the call produced. A Replay badge marks a repeat of an earlier identical request that was answered without doing the work again |
| If you see | It means |
|---|---|
| Denied | The token's level, tool allowlist or organization grant, or the member's current rights, do not allow that call |
| Rate limited | The token or organization sent too many requests. Wait and retry |
| Payment required | The organization, and any personal fallback, has too few credits for that tool |
Posting policy for drafts
An organization admin chooses what happens to entries that connected AI apps create. The setting is the card at the top of the AI agents tab, titled Journal entries from connected AI apps. It applies to the whole company and every app connected to it.
| Option | Result |
|---|---|
| Stage as drafts for review (default) | Entries wait as drafts until a person reviews and books them |
| Post automatically | Balanced entries go straight to the ledger, after the same validation as a typed entry |
The same setting decides whether issue_invoice and void_invoice may run: with Stage as drafts for review they refuse. This policy is separate from Companion's Ask first and Auto modes. Write tools may be unavailable if they are not enabled on the server.
Example: reconcile a statement
A statement workflow looks like this:
- Ask the assistant to check the credit balance and identify the organization, account and document.
- Start the extraction and follow the job status until it finishes.
- Review the extracted rows with the assistant (
get_statement_lines). - Start reconciliation (150 credits).
- Inspect the unmatched items and suggested journals.
- Review the drafts in Ringbook.
Starting a job does not confirm that it finished or that anything was posted.
For exports, state the report type, dates, currency and format, then check the download and the figures. When a request fails, read its error and status before retrying, so you do not start a running operation twice. Check the current tool list and the credit receipt instead of assuming every tool is free.