Skip to main content
Glama
chrischall

freshbooks-mcp

by chrischall

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-mcp

Related 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.

  1. Register an app at https://my.freshbooks.com/#/developer. The redirect URI must be HTTPS with no query string; https://localhost works and never needs to resolve.

  2. Note the Client ID and Client Secret.

  3. Run the one-time bootstrap to obtain a refresh token — see skills/freshbooks-curl, which ships the bootstrap script.

  4. 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-curl skill 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

freshbooks_get_identity

Resolve accountId / businessId / businessUuid

freshbooks_list_invoices / freshbooks_get_invoice

Browse and fetch invoices

freshbooks_list_clients / freshbooks_get_client

Browse and fetch clients

freshbooks_list_estimates / freshbooks_get_estimate

Browse and fetch estimates

freshbooks_list_payments / freshbooks_get_payment

Browse and fetch payments

freshbooks_list_items / freshbooks_get_item

Browse and fetch catalogue items

freshbooks_create_client

Create a client — confirm-gated

freshbooks_create_invoice

Create an invoice — confirm-gated

freshbooks_update_invoice

Update an invoice — confirm-gated

freshbooks_record_payment

Record a payment against an invoice — confirm-gated

freshbooks_list_expenses / freshbooks_get_expense

Browse and fetch expenses

freshbooks_list_expense_categories

Categories supplying categoryid for new expenses

freshbooks_create_expense

Record an expense — confirm-gated

freshbooks_list_projects / freshbooks_get_project

Projects (businessId-keyed)

freshbooks_create_project

Create a project — confirm-gated

freshbooks_list_time_entries

Tracked time, with total_logged / total_unbilled

freshbooks_create_time_entry

Log time in seconds — confirm-gated

freshbooks_list_services

Billable work types for projects and time entries

freshbooks_list_records / freshbooks_get_record

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

  • total counts records you may not be able to read. Expenses reported total: 16 while returning zero rows. List results attach a note when that happens, so it reads as a permission boundary rather than an empty account.

  • Projects and time tracking are keyed by businessId, not accountId, and paginate under a meta block instead of flat page/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

accountId (alphanumeric)

/accounting/account/…, /payments/account/…

businessId (integer)

/projects/business/…, /timetracking/business/…

businessUuid (UUID)

/accounting/businesses/…

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 test

License

MIT

Install Server
A
license - permissive license
A
quality
A
maintenance

Maintenance

Maintainers
Response time
Release cycle
1Releases (12mo)

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

  • F
    license
    -
    quality
    D
    maintenance
    Automates 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
  • A
    license
    B
    quality
    D
    maintenance
    Production-grade MCP server for FreshBooks. 25 tools for invoices, clients, expenses, payments, time tracking, projects, estimates, and financial reports. OAuth2 with automatic token refresh.
    25
    3
    MIT
  • F
    license
    -
    quality
    A
    maintenance
    An MCP server that connects Claude to FreshBooks, enabling reading and management of invoices, clients, expenses, projects, and time entries via natural language.
    1

View all related MCP servers

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.

View all MCP Connectors

Latest Blog Posts

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