freshbooks-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@freshbooks-mcpList my overdue invoices"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
freshbooks-mcp
MCP server for FreshBooks — invoices, clients, estimates and payments, exposed to Claude as typed tools.
This project was developed and is maintained by AI (Claude Code). Use at your own discretion.
Install
npm install -g @chrischall/freshbooks-mcpRelated MCP server: mcp-freshbooks
Setup
FreshBooks is OAuth2 only — there is no API key and no personal access token, so a one-time browser authorization is required.
Register an app at https://my.freshbooks.com/#/developer. The redirect URI must be HTTPS with no query string;
https://localhostworks and never needs to resolve.Note the Client ID and Client Secret.
Run the one-time bootstrap to obtain a refresh token — see
skills/freshbooks-curl, which ships the bootstrap script.Configure:
FRESHBOOKS_CLIENT_ID=...
FRESHBOOKS_CLIENT_SECRET=...
FRESHBOOKS_REFRESH_TOKEN=... # from the bootstrap
FRESHBOOKS_REDIRECT_URI=https://localhost # optional; must match what you registered
FRESHBOOKS_TOKEN_STORE=~/.freshbooks-mcp/session.json # optional⚠️ Refresh tokens rotate
FreshBooks issues a new refresh token on every refresh and immediately invalidates the
old one. This server persists each rotation to FRESHBOOKS_TOKEN_STORE (mode 0600)
before the refresh is considered complete, and prefers the stored token over the
environment value — the stored one has rotated past it.
Two consequences worth knowing:
Do not point two tools at the same store. The MCP server and the
freshbooks-curlskill keep separate state files on purpose; sharing one makes them spend each other's tokens and locks both out.If the store is lost, re-run the bootstrap. A spent refresh token cannot be recovered.
Changing FRESHBOOKS_REFRESH_TOKEN to a freshly bootstrapped value is detected and
adopted, so re-bootstrapping is the supported recovery path.
Tools
Tool | Purpose |
| Resolve accountId / businessId / businessUuid |
| Browse and fetch invoices |
| Browse and fetch clients |
| Browse and fetch estimates |
| Browse and fetch payments |
| Browse and fetch catalogue items |
| Create a client — confirm-gated |
| Create an invoice — confirm-gated |
| Update an invoice — confirm-gated |
| Record a payment against an invoice — confirm-gated |
| Browse and fetch expenses |
| Categories supplying |
| Record an expense — confirm-gated |
| Projects (businessId-keyed) |
| Create a project — confirm-gated |
| Tracked time, with |
| Log time in seconds — confirm-gated |
| Billable work types for projects and time entries |
| Generic accessor for the accounting long tail (taxes, credit notes, invoice profiles, tasks, staff, gateways, bills, bill vendors, bill payments, other income) |
Confirm-gated means the tool makes no network call unless confirm: true is passed;
without it you get a dry-run preview of exactly what would be sent.
Writes require an owner/admin accounting account
FreshBooks separates the role you hold on a business from the role you hold on an
accounting account. You can own a business that has no accounting account
(account_id: null) while being only a client on the account you can actually see —
in which case reads succeed and every write returns 403 Permission Denied, even though
your OAuth token carries all the :write scopes.
freshbooks_get_identity reports accountRole and businessRole so this is visible up
front. If accountRole is client, the invoicing write tools will not work against that
account — that is an account permission, not a configuration problem.
Two things the API reports misleadingly
totalcounts records you may not be able to read. Expenses reportedtotal: 16while returning zero rows. List results attach anotewhen that happens, so it reads as a permission boundary rather than an empty account.Projects and time tracking are keyed by
businessId, notaccountId, and paginate under ametablock instead of flatpage/pages/total. They also work on a business with no accounting account at all.
The three identifiers
FreshBooks hands out three non-interchangeable ids, and using the wrong one returns a bare 404 that reads like a missing record:
Identifier | Used by |
|
|
|
|
|
|
Call freshbooks_get_identity first. Full API notes, including the four different error
envelopes, are in docs/FRESHBOOKS-API.md.
Shell access without the server
skills/freshbooks-curl covers the same API from a
shell with curl + jq, including the OAuth bootstrap and rotation-safe token handling.
Development
npm install
npm run build
npm testLicense
MIT
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- Flicense-qualityDmaintenanceAutomates FreshBooks invoicing and time tracking through Claude, allowing users to send invoices, list invoices, log billable hours, and get financial insights via natural language commands.2
- AlicenseBqualityDmaintenanceProduction-grade MCP server for FreshBooks. 25 tools for invoices, clients, expenses, payments, time tracking, projects, estimates, and financial reports. OAuth2 with automatic token refresh.253MIT
- Alicense-qualityCmaintenanceMCP server for the FreeAgent accounting API, enabling LLMs to securely access and manage accounting data including contacts, invoices, bills, bank transactions, and more.51MIT
- Flicense-qualityAmaintenanceAn MCP server that connects Claude to FreshBooks, enabling reading and management of invoices, clients, expenses, projects, and time entries via natural language.1
Related MCP Connectors
Hosted MCP server for Mini Accountant: invoices, expenses, customers, analytics, tax estimates.
Hosted Amazon Seller Central and Amazon Ads MCP server for Claude, ChatGPT, Cursor, and agents.
Hosted Amazon Seller and Vendor MCP server for Claude, ChatGPT, Cursor, Codex, Gemini, Copilot.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/chrischall/freshbooks-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server