Live · 34 tools and counting

Ask your AI assistant about your firm. Get real answers.

The Financial Cents MCP server lets Claude, Cursor, ChatGPT and other AI clients read and update your firm's data — scoped to one account, authorized by you, revocable anytime.

Server URL

https://app.financial-cents.com/mcp

Transport: Streamable HTTP · Auth: OAuth 2.1 with PKCE · No API keys

Both links only prefill the connection. You review the details and sign in before anything connects.

Connected to Financial Cents
tools/call

Calling…

Hover to pause
34
Tools

Every one listed below, straight from the server.

21
Read tools

Lists, lookups and detail reads.

13
Write tools

Create and update. Never delete.

0
API keys to paste

OAuth sign-in on our domain instead.

Before you start

Three things need to be true before a client can connect.

1

A Financial Cents login

You sign in with your existing account. The AI client never sees your password — only a token you approve.

2

MCP enabled for your firm

MCP is included on the Scale plan. On other plans, ask our support team and we will switch it on for your firm.

3

A client that supports remote MCP

Claude is the shortest path — nothing to install and no command line. Claude Code, Cursor, VS Code, ChatGPT and many others work too.

Connect your client

Every client uses the same server URL and the same OAuth consent screen. Pick yours.

Claude

Web · Desktop · Mobile · Cowork

The quick way

The button below opens Claude's Add custom connector dialog with the name and URL already filled in. Claude asks you to check the details, then you sign in to Financial Cents and approve access.

Connect to Claude

Running a firm on Team or Enterprise? An owner has to add the connector once for the whole organisation before anyone can connect to it.

Add for my organisation

Or do it by hand

  1. 1. Open Customize → Connectors in Claude. Owners on Team and Enterprise use Organization settings → Connectors instead.
  2. 2. Click +, then Add custom connector.
  3. 3. Name it Financial Cents and paste the server URL below. Leave Advanced settings empty — you do not need a client ID or secret.
  4. 4. Click Add, then Connect and approve the consent screen.
  5. 5. In a chat, click + → Connectors and switch Financial Cents on.
https://app.financial-cents.com/mcp

Works on Free, Pro, Max, Team and Enterprise plans, though Free is limited to one custom connector. Claude connects from Anthropic's cloud rather than your laptop, so the server has to be reachable on the public internet. Adding a connector has to be done on the web or desktop app — mobile can use one once it exists, but cannot create it.

What happens when you connect

You stay in control the whole way through. No API keys are copied or pasted.

  1. 1

    The client registers itself

    Your AI client registers automatically with our authorization server. Nothing to configure.

  2. 2

    You sign in to Financial Cents

    Authentication happens on our domain. The AI client never receives your credentials.

  3. 3

    You pick one account

    If you belong to multiple firms, you choose exactly one on the consent screen. The connection is permanently bound to it.

  4. 4

    You approve access

    A token is issued to that client for that account. Every request is checked against your own permissions.

  5. 5

    You can revoke anytime

    Removing the token from your settings cuts the connection immediately.

What MCP can do

Every tool the server exposes, read straight from the code. View and update clients, projects, team tasks, and time; view invoices, payments, credit memos, proposals, and files; upload files to projects, clients, and client requests; read and send client chat. Look up team members and tags; create and update service items. Nothing here can delete.

Showing 34 of 34

Account & lookup

2 tools
Read

Who Am I

whoami

Returns the authenticated user and the profile of the firm (company) their access token is scoped to.

Returns the authenticated user and the profile of the firm (company) their access token is scoped to. Call this first to ground firm-level questions and any date arithmetic: resolve relative dates such as "today" or "this week" against `user.timezone`, which is the same timezone the other tools resolve their own date filters and overdue flags against. `company.timezone` is the firm's configured timezone for scheduled reminders and may differ — do not compute date windows from it. For the firm's team members and assignable users, call `lookup` with resource=users — this tool returns the firm, not its roster.

Read

Lookup

lookup

Look up firm reference data by name: resource is required and must be service_items, tags, users, discounts, or tax_codes (users also match email); the filter argument is search, not query.

Look up firm reference data by name: resource is required and must be service_items, tags, users, discounts, or tax_codes (users also match email); the filter argument is search, not query. lookup does not find clients or projects, so use list_clients(search) or list_projects(search) for those. A user row carries hourly_rate (what the member bills) and labor_rate (what the member costs the firm) only for callers holding 'manage billing rate'. Both are dollars per hour, not cents; 0 means no rate is set. Discounts need 'manage invoices' and exclude archived ones; amount is integer cents when type is amount, percentage is 0–100 when type is percentage. Tax codes also need 'manage invoices', list only active codes with the firm default first (is_default), and search also matches a component rate name; each tax_rates rate is a percent (8.25 means 8.25%) and tax_order is the order the components apply in.

Projects & tasks

8 tools
Read

List Projects

list_projects

List company projects with client, assignees, reviewers, sections, due dates, close date, accounting period, and task counts.

List company projects with client, assignees, reviewers, sections, due dates, close date, accounting period, and task counts. tasks_count/done_tasks_count = firm work; client_tasks_count/done_client_tasks_count = client-portal work. Filter via schema args (status, client_id, assignees, tags, service_item, is_template, accounting_period, due_date). due_date=week is the calendar week in user.timezone from whoami (Monday through Sunday), including overdue dates inside that week — not a rolling 7 days. meta.totals counts open, closed, snoozed, and overdue across the whole filtered set, and group_by=assignee|client|service_item|accounting_period|tag adds the same counts per bucket in meta.groups. open does not include currently snoozed projects. Use get_project for one project's full detail, and get_client(include=[projects,client_tasks]) for one client's projects and portal tasks in a single call. billing_rate is dollars per hour, not cents, and appears only for callers holding 'manage billing rate'.

Read

Get Project

get_project

Read one project by id (find ids with list_projects).

Read one project by id (find ids with list_projects). Returns dates, accounting period, recurrence, service item, client, tags, and team/client task counts. For a custom-recurrence project, recurrence.rule carries the stored schedule in the same shape manage_project accepts, so it can be read and sent back; it is null for the fixed cadences, which frequency alone describes. Optional include: sections|tasks (same nested outline — no flat task list), assignees, reviewers. Nested team tasks emit `assignees` from the task pivot (same as list_tasks); nested client tasks emit `created_by` from user_id, the user who created the task. Request only needed includes. billing_rate is dollars per hour, not cents, and appears only for callers holding 'manage billing rate'.

Read

List Project Attachments

list_project_attachments

List files attached to one project.

List files attached to one project. Rows cover both firm uploads and files the client sent through the client portal — filter with uploaded_by, and read is_client_upload to tell them apart; type is the file extension (pdf, xlsx), not a MIME type. Call get_project_attachment only when you need metadata plus a short-lived signed download URL. Attachments are project-scoped: when the user names a project instead of giving an id, resolve it with list_projects search, and ask which project they mean only when that search returns no match or several — never call this tool for every project.

Read

Get Project Attachment

get_project_attachment

Read metadata for one attachment linked to a project — type is the file extension (pdf, xlsx), not a MIME type.

Read metadata for one attachment linked to a project — type is the file extension (pdf, xlsx), not a MIME type. For an eligible file, this call also creates a signed download URL that expires after 10 minutes; call it only immediately before downloading. Known virus-positive and otherwise unavailable files return safe metadata without a URL. Use list_project_attachments first to find an attachment id.

Write

Manage Project

manage_project

Create a project, or update an existing one named by project_id.

Create a project, or update an existing one named by project_id. Create a blank project (default Team Tasks section) or clone a company template with template_id. Update follows the product project editor: omitted arguments leave stored values unchanged. Assignees and reviewers (not managers) replace the full set when supplied. Tags is a list of tag ids that is synced onto the project (lookup resource=tags): the project keeps exactly those tags. Omit tags to leave them unchanged; send [] to clear every tag. The write response data is id and title; call get_project for the full project. Foreign client, assignee, reviewer, tag, and service_item ids are rejected rather than silently dropped. Recurrence: set recurring to a fixed cadence on its own, or to "custom" together with a recurrence rule — see the recurrence argument.

Write

Manage Section

manage_section

Create a section on a project, or rename an existing one named by section_id.

Create a section on a project, or rename an existing one named by section_id. Create requires project_id and type (project_tasks, client_tasks, or month_end_close). project_tasks and client_tasks also require name. month_end_close creates the four product Month End Close sections and rejects name — rename with update. Update requires section_id and name. The write response data is id, name, and type; call get_project with include ["sections"] for the rest. Discover project ids with list_projects.

Read

List Tasks

list_tasks

List company tasks firm-wide: project_id is optional, so filter across every project with assignees, status, board, client_id, tags, groups, or due_date instead of calling once per project.

List company tasks firm-wide: project_id is optional, so filter across every project with assignees, status, board, client_id, tags, groups, or due_date instead of calling once per project. Rows carry project, client, assignees, status, board, due date, and completed_at. status pending covers to_do and in_progress; pass board to separate them (to_do, in_progress, done). The due_date window applies to due_date_field: due_date by default, or completed_at for tasks completed in a range. Pass project_id only to scope one project (resolve it with list_projects); get_project(include=[tasks]) returns one project's detail with its tasks. meta.totals counts done, not_done, and overdue across the whole filtered set; group_by=project|client|assignee adds the same counts per bucket in meta.groups.

Write

Manage Project Task

manage_project_task

Create a team task on a project_tasks section, or update an existing one named by task_id.

Create a team task on a project_tasks section, or update an existing one named by task_id. Create requires project_id, section_id, title, and board. Update omits unchanged fields. Both operations only accept tasks on a project_tasks section — client-task and Month End Close sections are rejected. Complete or reopen with board done or to_do. Assignees replace the full set when supplied. The write response data is id, title, and board; call list_tasks for the rest. Discover projects with list_projects, sections with get_project include ["sections"], and users with lookup resource=users. Client tasks are a separate resource this tool never touches.

Clients

11 tools
Read

List Clients

list_clients

List company clients with up to 25 contacts, visible open/closed project counts, pending/completed client-portal task counts for open projects, archive state, and linked-provider state.

List company clients with up to 25 contacts, visible open/closed project counts, pending/completed client-portal task counts for open projects, archive state, and linked-provider state. Use this tool as the canonical client name-to-id resolver: pass search for one name, search_terms for several names in one call, or client_ids for a known set of ids. include=[about] adds each client's filled About fields to the rows. For a general client overview, call once without filters; apply status, assignee, group, or integration filters only when explicitly requested. meta.totals counts active and archived for the same filters except status, so an active-only call still reports how many clients are archived.

Read

Get Client

get_client

Read one client in detail.

Read one client in detail. Returns its status. Use "include" to embed contacts, groups, integration summaries, projects (open and closed), client_tasks (pending and completed client-portal tasks), or About custom fields. Request only the includes you need. Use list_clients first to find a client id.

Read

List Client Attachments

list_client_attachments

List files and folders linked to one client.

List files and folders linked to one client. Browse direct folder children or search the whole tree or one folder subtree. Call get_client_attachment only when you need metadata plus a short-lived signed download URL. Attachments are client-scoped: if the user has not identified the client, ask which client owns the file instead of searching every client.

Read

Get Client Attachment

get_client_attachment

Read metadata for one attachment linked to a client.

Read metadata for one attachment linked to a client. For an eligible file, this call also creates a signed download URL that expires after 10 minutes; call it only immediately before downloading. Folders and unavailable or known virus-positive files return safe metadata without a URL. Use list_client_attachments first to find an attachment id.

Write

Manage Client

manage_client

Create a client, or update an existing one named by client_id.

Create a client, or update an existing one named by client_id. Both operations accept contacts and client groups in the same call; on update, a contact with a contact_id is edited and one without is created. Nothing is ever removed and no field can be cleared — omitted arguments leave the stored value untouched. Read clients back with list_clients and get_client.

Write

Manage Client About Fields

manage_client_about_fields

Create a company-wide client About field, or update an existing one named by about_field_id.

Create a company-wide client About field, or update an existing one named by about_field_id. About fields are custom labels such as "VAT Number" that every client in the firm can hold a value for; a create always names a client_id and value to seed, and an update can send that pair to write one client's value in the same call. Renaming a field never changes its email placeholder, and nothing here deletes a field or clears a value — omitted arguments leave stored data untouched. Discover field ids and read values back with get_client include ["about"], which returns the fields one client has filled in.

Read

List Client Tasks

list_client_tasks

List individual client tasks with report-equivalent client, project, section progress, project assignees, and reminder context.

List individual client tasks with report-equivalent client, project, section progress, project assignees, and reminder context. created_by is the user who created the task. The assignee_id filter targets project assignees, not created_by. meta.totals counts the distinct clients and projects those rows span. For one client's tasks together with its projects, get_client(include=[client_tasks,projects]) answers in a single call.

Read

List Client Chat Topics

list_client_chat_topics

List client chat topics for one client, with per-caller unread counts and a short preview of the latest message.

List client chat topics for one client, with per-caller unread counts and a short preview of the latest message. client_id is required: when the request does not name a client, ask the user which client before calling, rather than reaching for whatever is listable. Resolve a client name to client_id with list_clients. unread_messages_count counts only messages you have not read and did not write, and only those sent after 2024-10-02 — it is not a firm-wide unread total. Topic names and message previews ship inside <untrusted>.

Read

Get Client Chat Topic

get_client_chat_topic

Read one client chat topic.

Read one client chat topic. unread_messages_count is per-caller and ignores messages at or before 2024-10-02. Topic name and message body ship inside <untrusted>. messages is the newest 50; messages_truncated means older rows were withheld. Resolve topic_id with list_client_chat_topics. This call does not mark messages as read.

Write

Manage Client Chat Topic

manage_client_chat_topic

Create a client chat topic, or update the name, archive state, assignees, or contacts of an existing one.

Create a client chat topic, or update the name, archive state, assignees, or contacts of an existing one. Create requires client_id, name, at least one assignee, and contacts (an empty list is allowed). Update requires topic_id and leaves any omitted field unchanged. The write returns id, name, and archived; call get_client_chat_topic for assignees, contacts, and messages. The name ships inside <untrusted>.

Write

Manage Client Chat Message

manage_client_chat_message

Send a message to a client chat topic, or edit a message you sent earlier.

Send a message to a client chat topic, or edit a message you sent earlier. Sending emails the topic's client contacts and notifies anyone mentioned, and it cannot be undone through this tool — confirm the wording with the user before calling create. Safe formatting such as links and images is preserved for the client and only dangerous markup is removed, so reading a thread back shows link text but never link targets. Editing never re-notifies the client, so a correction does not reach an inbox that already holds the original. Find topics with list_client_chat_topics and read threads back with get_client_chat_topic.

Files

2 tools
Upload

Prepare Attachment Upload

prepare_attachment_upload

Start uploading a local file to a project, client, or client task (client request) in the company the access token is scoped to.

Start uploading a local file to a project, client, or client task (client request) in the company the access token is scoped to. Step 1 of 3: this returns an upload_id and a short-lived upload_url. Step 2: send the raw file bytes with an HTTP PUT to upload_url (use the returned curl_example with the real local path) within 5 minutes; no auth header is needed. Step 3: call create_attachment_from_upload with the upload_id and the same target to attach it. Do not open or read the file: get its size with stat and send it with the curl command. Never put file contents or base64 in tool arguments — the bytes only travel in the PUT. Requires a shell or network access able to run curl. Send the exact size in bytes. Finalize discards the upload if the stored object is not that size. Allowed file types follow the product upload allowlist; max 50 MB. Call once per file.

Upload

Create Attachment From Upload

create_attachment_from_upload

Attach a file uploaded with prepare_attachment_upload to its project, client, or client task.

Attach a file uploaded with prepare_attachment_upload to its project, client, or client task. Step 3 of 3: call after the PUT to upload_url succeeded, passing the upload_id and the same target, project_id / client_id / client_task_id, and parent_id used in step 1. The stored object must be exactly the size_bytes declared at prepare, or this call discards it. The file then behaves exactly like a web upload: it appears in the Files tab, is virus-scanned, and syncs to the client's Google Drive / OneDrive when connected. Uploading into a client folder that is shared with portal contacts emails those contacts. That call is rejected unless confirm_notify is true after the user agrees. Files attached to a client task are visible to the client in the portal. The upload_id is single use; the returned data is the new attachment's metadata — call get_project_attachment or get_client_attachment for a download URL.

Billing

9 tools
Read

List Invoices

list_invoices

List company invoices with client, amounts, dates, payment and QuickBooks sync state, plus the first ten service line items (line_items_truncated flags any invoice with more).

List company invoices with client, amounts, dates, payment and QuickBooks sync state, plus the first ten service line items (line_items_truncated flags any invoice with more). Built for accounts receivable: status ["receivable"] is everything still owed, status ["overdue"] is unpaid and past due. meta.totals is money across the whole filtered set, not the page. Never read last_payment_date as proof an invoice is unpaid: it is null on any invoice not tied to a merchant account even when payments have settled — total_payment_amount and outstanding_amount are the reliable signals.

Read

Get Invoice

get_invoice

Read one invoice by id (find ids with list_invoices).

Read one invoice by id (find ids with list_invoices). Returns amounts, dates, status, client, can_remind_now, QuickBooks number, applied payments (up to 50 newest by id; payments_truncated when more), and top-level Sales line items (up to 100; line_items_truncated when more). total_payment_amount is the product paid sum (includes canceled); payments[] omits canceled, failed, requires_action, and credit-memo applications. Never read last_payment_date as proof an invoice is unpaid: it is null on any invoice not tied to a merchant account even when payments have settled — total_payment_amount and outstanding_amount are the reliable signals.

Read

List Payments

list_payments

List company payments with client, invoices, amount, fees, status, date, and payment method.

List company payments with client, invoices, amount, fees, status, date, and payment method. Money is integer minor units in the row currency — amount_cents 12345 is 123.45, never 12,345. Failed, canceled, requires_action, and credit-memo application payments are omitted, same as the Payments report. meta.totals is money over the whole filtered set, not the page; group_by=month adds the same money per calendar month in meta.groups. Filter one client with client_id. Resolve client names with list_clients and user ids with lookup(resource='users').

Read

List Credit Memos

list_credit_memos

List company credit memos (client credit balances) with client, service item, status, amount, unused amount_remaining, and the full credit_memo_transactions history from the web list.

List company credit memos (client credit balances) with client, service item, status, amount, unused amount_remaining, and the full credit_memo_transactions history from the web list. Money is integer cents — amount 12345 is 123.45. Transaction amounts are signed (credits positive, debits negative); invoice_id and user_id are raw ids, and payment_id has no MCP lookup. meta.totals sums amount and amount_remaining over the whole filtered set, not the page, so a client's available credit is one call with client_id. Resolve client names with list_clients.

Read

List Proposals

list_proposals

List company proposals with client, money, status, send/open timestamps, package count, and section types.

List company proposals with client, money, status, send/open timestamps, package count, and section types. Money fields are cents of the row's own currency — never sum across differing currency values. Unfiltered calls include cancelled and void. Filter via schema args (search, status, client_id, date). meta.totals is money over the whole filtered set, not the page. Resolve a client name with list_clients. Drill into one proposal with get_proposal.

Read

Get Proposal

get_proposal

Read one proposal by id (find ids with list_proposals).

Read one proposal by id (find ids with list_proposals). Returns client, money, status, send/open timestamps, package count, and section types, plus template, start_date_type, date_signed, cancelled_at, remind_every, and next_reminder_at. Optional include: packages (nested packages → sections → line items), signatories, generated_invoices (requires manage invoices). Request only needed includes.

Write

Manage Service Item

manage_service_item

Create a service item, or update an existing one named by service_item_id (find ids with lookup resource=service_items).

Create a service item, or update an existing one named by service_item_id (find ids with lookup resource=service_items). Omitted arguments leave stored values unchanged; null or an empty string clears description and service_description and is ignored for every other field. Set is_active=false to archive an item. rate is dollars, not cents. Other changes sync to QuickBooks when the firm has a QuickBooks connection; archiving or restoring alone does not. On every update, ask the user before calling, and do not choose for them. Use only this question, with no added text: title "Update proposal templates?"; "There might be proposal templates that use this service item. Do you want to update the Service Items on the relevant proposal templates?"; choices "Update" and "Don't Update". Pass update_proposal_templates=true only when they choose Update; Don't Update leaves those templates unchanged. There is no delete. The write response data is id and name.

Write

Manage Credit Memo

manage_credit_memo

Create a client credit memo, or update an existing one named by credit_memo_id.

Create a client credit memo, or update an existing one named by credit_memo_id. Money is integer cents. A new memo is unapplied and never auto-applied to invoices; each create makes a new numbered memo, so do not retry a call that succeeded. On update, amount + type adjusts the balance (credit adds, debit subtracts, and a debit may take amount_remaining below zero) — send expected_amount_remaining so a retry cannot apply the adjustment twice. Update keeps the memo's existing auto-apply setting: when data.auto_apply_invoices is true (the web default), added credit can be applied to the client's next recurring invoice. Changes sync to QuickBooks when the firm is connected; data.sync_errors says why a sync did not happen. A fully applied memo cannot be updated, and there is no delete.

Write

Manage Discount

manage_discount

Create a discount, or update an existing one named by discount_id (find ids with lookup resource=discounts).

Create a discount, or update an existing one named by discount_id (find ids with lookup resource=discounts). amount is integer cents (5000 = $50.00) and percentage is a percent (10 = 10%); a discount has one or the other, matching its type. Omitted or null arguments leave stored values unchanged and nothing can be cleared; is_active=false archives a discount and true restores it — archived discounts drop out of lookup but keep working on invoices that already use them. Before an update that changes type, amount, or percentage, ask the user to confirm: every invoice, recurring invoice template, and proposal that uses this discount picks up the new value the next time it is recalculated. There is no delete.

Time tracking

2 tools
Read

List Time Entries

list_time_entries

List individual time entries for the firm.

List individual time entries for the firm. Filter by date range, teammate, client group, service item, billable type, and invoiced status — see schema. billing_rate is what the client is charged per hour and labor_rate is what the hour costs the firm (the member cost rate); both appear only for callers holding 'manage billing rate', so margin = (billing_rate - labor_rate) * hours. meta.totals is hours and money over the whole filtered set, not the page. Money here is dollars, unlike the integer cents list_invoices and list_payments report. Pass group_by to get the same totals per client, team member, service item, client group, or project in meta.groups. Rows carry the fields manage_time_entry writes (worked_at and completed_at as Y-m-d H:i:s, log_type, billing_type, internal_notes when the firm has internal notes on), so read an entry here before correcting it.

Write

Manage Time Entry

manage_time_entry

Log a new time entry, correct an existing one named by hour_id, or pause, resume, or stop your timer.

Log a new time entry, correct an existing one named by hour_id, or pause, resume, or stop your timer. On create, name either a client_id or a project_id (with a project the client is taken from the project, and any task_id must belong to it) and a billing_type of "billable" or "non_billable". Omit billing_rate to use the fallback: a service item other than the project's own bills at that item's price (an unpriced item bills 0); the project's own service item bills at the project rate when one is set; otherwise the team member's hourly rate, then the project rate. Client billing rates are not applied. Send billing_rate only when you hold "manage billing rate" and want to override that fallback. When the fallback finds no rate, the entry is recorded as non_billable. On update only the arguments you send change: an omitted argument keeps its stored value, and no field can be cleared. Use log_type "duration" to record a number of hours. Use log_type "time_in_out" without completed_at, worked_at, or hours to start the running timer shown in the app header; it starts now and is stored on timers for you. The response identifies it with timer_id only. An existing running timer is paused unless stop_existing_timer is true, which records that timer first. Use operation "pause" to pause your running timer the way the header pause button does, and "resume" to run a paused timer again. Resume first pauses your other running timers in this company. Omit timer_id to pause your one running timer or to resume your one paused timer; send timer_id when you have more than one. Those responses use timer_id and status and have no id. Use operation "stop" to record the timer the way the header stop button does; omit timer_id to stop your one running timer, or your one paused timer when nothing is running, or send timer_id. comments and internal_notes on stop are stored with the time entry. Send completed_at on create to log a finished start and end directly. Find an hour_id with list_time_entries; an entry that is locked, or already on a finalized invoice, is refused with the reason.

Try asking

Plain English works. Each prompt below names the tool your assistant will most likely reach for — copy one to get going.

“Which invoices are overdue, and what is the total still outstanding?”

list_invoices

“Show my open tasks due this week, grouped by client.”

list_tasks

“Log 1.5 billable hours on the Acme year-end project for today.”

manage_time_entry

“How much did we collect last month, month by month this year?”

list_payments

“Create a client called Northwind Traders with Jane Doe as the contact.”

manage_client

“Summarize the latest unread client chat for Acme.”

list_client_chat_topics

“Which proposals have been sent but are still unsigned?”

list_proposals

“Upload this engagement letter to the Acme project files.”

prepare_attachment_upload

Security and data handling

One account per connection

Each token is bound to a single company at consent time. A connection can never read data from another firm you belong to, even if you switch accounts in the app.

Your permissions apply

Tools run through the same authorization checks as the app. A connection can only see what you can already see.

No credentials shared

Authentication uses OAuth 2.1 with PKCE. Your password never reaches the AI client, and no API keys are copied around.

Audited and rate limited

Every tool call is recorded with who, what, and how long it took, and requests are rate limited to protect your account.

Revoke in one click

Delete the token from your API settings and the connection stops working immediately — no waiting for expiry.

Writes confirm in your AI client

Your AI client prompts before a change. Financial Cents adds its own check only when an upload would email your client's portal contacts — that needs your explicit go-ahead. Deletes are not available.

A note on prompt injection

AI assistants act on the content they read. Anything a client wrote — chat messages, topic names — is handed to your assistant clearly marked as untrusted, but when you combine this connector with other tools, treat anything an assistant summarises as unverified until you check it in Financial Cents. Review actions before acting on them, especially anything financial.

Managing and revoking access

  1. 1 In Financial Cents, go to Settings → API.
  2. 2 Open the FC MCP tab to see every connected client, when it connected, and the account it is bound to.
  3. 3 Choose Revoke to end a connection. Reconnecting requires a fresh consent screen.

Troubleshooting

The connection fails right after I approve it

This usually means MCP is not enabled for your firm yet. It is included on the Scale plan; on other plans, contact support and we will switch it on for your account.

My client says it cannot authenticate

Delete the server from your client and add it again so it re-runs discovery. In Cursor, click the "Needs authentication" label under the server name if the browser does not open, and make sure you are on Cursor 2.5 or newer — older builds had a Connect button that did nothing.

Claude says it cannot reach the server

Claude connects from Anthropic's cloud, not from your computer, so the server has to be reachable on the public internet. If your firm restricts outbound access, ask us about network requirements.

Claude will not let me add a connector

On Team and Enterprise plans only an owner can add a custom connector, and they do it once for the whole organisation. On a Free plan you can only have one custom connector at a time. Adding a connector also has to happen on the web or desktop app rather than on your phone.

I added it but no tools show up

Most clients need the connector switched on for the conversation. In Claude, click + → Connectors in the chat. In VS Code, the tools only exist in Agent mode. In ChatGPT, start a fresh chat and pick it from the + menu.

Cursor does not show tools we just shipped

Cursor caches the tool list when it first connects and never asks again. Fully quit Cursor (not just the window) and relaunch it to pick up the new catalog.

I connected the wrong account

Revoke the token in Settings → API → FC MCP, then reconnect and pick the right account on the consent screen.

Tools return nothing

Results are limited to the account bound to the connection and to your own permissions. Ask your assistant "which account am I connected to?" — it will call whoami and tell you.

My connection stopped working after leaving a firm

Tokens bound to a firm stop working when your membership ends. Reconnect and select a firm you currently belong to.