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.
Calling…
Every one listed below, straight from the server.
Lists, lookups and detail reads.
Create and update. Never delete.
OAuth sign-in on our domain instead.
Three things need to be true before a client can connect.
You sign in with your existing account. The AI client never sees your password — only a token you approve.
MCP is included on the Scale plan. On other plans, ask our support team and we will switch it on for your firm.
Claude is the shortest path — nothing to install and no command line. Claude Code, Cursor, VS Code, ChatGPT and many others work too.
Every client uses the same server URL and the same OAuth consent screen. Pick yours.
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 ClaudeRunning 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 organisationOr do it by hand
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.
If you already connected on the web with the same account, Claude Code picks the connector up on
its own. Otherwise add it directly and finish the sign-in in your browser — run
/mcp inside Claude Code
if it does not open automatically.
claude mcp add --transport http financial-cents https://app.financial-cents.com/mcp
Add --scope user to make the
connection available in every project instead of just the current one.
The install link adds the server to your
mcp.json. Then open
Customize → MCPs and click
Connect to sign in.
Needs Cursor 2.5 or newer. Cursor caches the tool list when it connects, so after we ship new tools, fully quit and relaunch Cursor to see them.
Or add it manually
{
"mcpServers": {
"financial-cents": {
"url": "https://app.financial-cents.com/mcp"
}
}
}
Put this in ~/.cursor/mcp.json
so the connection follows you across projects.
The link hands the server to VS Code, which asks you to trust it and then opens your browser to sign in. You can also run MCP: Add Server from the command palette and choose HTTP.
Install in VS CodeNeeds VS Code 1.101+ with GitHub Copilot, and the tools only appear in Agent mode.
Or add it manually
{
"servers": {
"financial-cents": {
"type": "http",
"url": "https://app.financial-cents.com/mcp"
}
}
}
Note the key is servers,
not mcpServers.
Server URL
https://app.financial-cents.com/mcp
Custom connectors need a paid plan and the web app — they are not available on Free, on mobile, or in Agent mode. On Business, Enterprise and Edu an admin enables developer mode and publishes the connector for the workspace, then each person signs in with their own account.
Connect Financial Cents to Notion Agent, or to one Custom Agent. Notion is on the Business and Enterprise plans, and a workspace admin has to allow custom MCP servers first.
Notion Agent
A Custom Agent
The connection uses your own Financial Cents permissions. Teammates connect with their own accounts. If Add Custom MCP is missing, ask an admin — it only shows when custom servers are allowed.
https://app.financial-cents.com/mcp
Any client that implements the MCP authorization spec works — we publish standard OAuth discovery metadata and register clients automatically, so pasting the server URL is usually all it takes. Desktop and command-line clients that hand you off to your browser to sign in work out of the box:
Zed
Settings → AI → MCP Servers. Leave the Authorization header blank so Zed starts the sign-in for you.
Windsurf
Settings → Tools → View Raw Config, add the URL, then restart Cascade.
JetBrains & Junie
Settings → Tools → AI Assistant → Model Context Protocol, then run /mcp and choose Authorize.
Warp
Settings → AI → MCP Servers. Local agents only — cloud agents cannot sign in.
Raycast
AI → MCP Servers → +, choose HTTP, set the OAuth type to Dynamic, then Sign In.
LM Studio
Program → Install → Edit mcp.json, then approve the sign-in in your browser.
Gemini CLI
Add the URL to ~/.gemini/settings.json, then run /mcp auth.
Codex CLI
Run codex mcp add with the URL, then codex mcp login.
Amp
Run amp mcp add with the URL — it signs in the next time Amp starts.
OpenCode
Add a remote entry to opencode.json, then run opencode mcp auth.
Cline & Roo Code
Add the URL with the streamable HTTP type, then use the Authenticate button.
Gumloop
Settings → Connectors → Add Connector → Add MCP Connector. Choose Public URL, Authenticate, then add that connector on the agent.
Viktor
Integrations → Add Custom → MCP Server. Paste the HTTPS server URL and sign in. This is Viktor connecting to Financial Cents, separate from Viktor's own MCP server.
npx -y mcp-remote@latest https://app.financial-cents.com/mcp --transport http-only
Using something that only speaks to local MCP servers? Point it at the command above, which bridges to us and handles the sign-in. It needs Node 18 or newer and stores your token on disk, so prefer a client with built-in support where you have the choice.
Cloud-hosted assistants are different: they sign in from their own servers, so we have to approve each one's callback address before it can connect. Claude, ChatGPT, Grok, Cursor's web agents, VS Code for the Web, Perplexity, Notion, Gumloop and Viktor are already approved. If another one refuses to connect, tell us which it is — we log the rejected attempt and can usually add it quickly.
You stay in control the whole way through. No API keys are copied or pasted.
Your AI client registers automatically with our authorization server. Nothing to configure.
Authentication happens on our domain. The AI client never receives your credentials.
If you belong to multiple firms, you choose exactly one on the consent screen. The connection is permanently bound to it.
A token is issued to that client for that account. Every request is checked against your own permissions.
Removing the token from your settings cuts the connection immediately.
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
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.
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.
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'.
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'.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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>.
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.
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>.
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.
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.
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.
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.
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.
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').
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.
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.
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.
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.
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.
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.
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.
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.
No tools match that.
Try a different word, or clear the filter. If something is missing, tell us — the catalog is still growing.
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
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.
Tools run through the same authorization checks as the app. A connection can only see what you can already see.
Authentication uses OAuth 2.1 with PKCE. Your password never reaches the AI client, and no API keys are copied around.
Every tool call is recorded with who, what, and how long it took, and requests are rate limited to protect your account.
Delete the token from your API settings and the connection stops working immediately — no waiting for expiry.
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.
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.
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.
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 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.
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.
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 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.
Revoke the token in Settings → API → FC MCP, then reconnect and pick the right account on the consent screen.
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.
Tokens bound to a firm stop working when your membership ends. Reconnect and select a firm you currently belong to.