Skip to content
FreeInvoices

Create an invoice in Cursor: MCP setup and sprint billing

Updated

Cursor can connect to remote MCP servers by URL. Add https://freeinvoices.app/mcp to .cursor/mcp.json, and the agent can turn a changelog or ticket list into a pre-filled invoice link. No sign-up and no API key.

Why Cursor suits this

Cursor's agent can read files in your repo, so it can build an invoice from material you already have: a CHANGELOG.md, a list of closed issues, a timesheet CSV, or the output of git log. You skip retyping line items into a form.

The agent calls the create_document tool on the FreeInvoices MCP server. The tool returns a link that opens the invoice pre-filled in your browser, along with computed totals. You add a logo if you want one and click Download PDF.

Add the server to mcp.json

Cursor reads MCP servers from .cursor/mcp.json in your project, or from ~/.cursor/mcp.json in your home directory if you want the server available in every project. Remote servers use a url field. FreeInvoices needs no headers or credentials.

  1. Create or edit the file at one of the two locations above and paste the snippet. If the file already has other servers, add freeinvoices inside the existing mcpServers object.
  2. Open Customize in the Cursor sidebar and find freeinvoices in the list of MCP servers. Make sure it is enabled.
  3. If something looks wrong, open the Output panel (Cmd+Shift+U on Mac) and choose MCP Logs.
  4. Start a new agent chat. The create_document tool should be listed among the available tools.
{
  "mcpServers": {
    "freeinvoices": {
      "url": "https://freeinvoices.app/mcp"
    }
  }
}
.cursor/mcp.json (project) or ~/.cursor/mcp.json (global)

Approving the tool call

By default Cursor asks for approval before running an MCP tool. You can expand the arrow next to the tool name to see the arguments the agent is sending, which is a quick way to check the line items before you approve. Cursor's run modes decide whether MCP tools can run without asking; see its MCP docs if you want to change that.

The server is read-only. It stores nothing and logs no arguments.

Worked example: billing a sprint from a changelog

An agency developer finishes a two-week sprint for a client and has four tickets listed in CHANGELOG.md with hours noted beside each. The rate is $125 per hour and the client pays 8.875% sales tax. The developer types a prompt like the first one in the list below.

The agent reads the changelog, builds one line item per ticket, and calls create_document. The line items it sends are listed below. That is 21 hours, so the subtotal is $2,625.00. Tax is calculated on that amount: 2,625 times 0.08875 is 232.96875, which rounds to $232.97. The total is $2,857.97. The agent replies with the link; open it, check the details, and download the PDF.

  • HC-212 Online ordering checkout flow: 9.5 hours at $125
  • HC-214 Fix pickup-time rounding bug: 2 hours at $125
  • HC-219 Menu admin CSV import: 6.5 hours at $125
  • HC-220 Staging deploy and QA fixes: 3 hours at $125
{
  "subtotal": 2625,
  "tax": 232.97,
  "total": 2857.97,
  "balanceDue": 2857.97
}
Totals returned by the tool for 21 hours at $125 with 8.875% sales tax (taken from a real call)

Other sources the agent can bill from

  • A git log for a date range, grouped by ticket prefix, with hours you supply.
  • A timesheet CSV exported from your tracker. Ask the agent to sum hours per project and bill each as a line item.
  • A GitHub or Linear issue list pasted into the chat or exported to a file in the repo.
  • A previous invoice's JSON, with the dates and numbers changed for the next month.

Without MCP: the import box

If you would rather not add a server, the FreeInvoices editor has an import panel that works with any chat. In the sidebar, open Import from ChatGPT, Claude…, press Copy prompt, and paste the prompt into a Cursor chat along with your details. Paste the JSON reply into the box and press Fill in document. This runs entirely in your browser.

Chat apps and editors cannot reliably build the #data= link themselves, so use either the MCP tool or the import box, not a hand-written link.

What goes where

  • Import box: the JSON stays in your browser. Cursor and its model providers see whatever you type into the chat.
  • MCP tool: the document details are sent to freeinvoices.app/mcp so it can build the link. Nothing is stored. The invoice data travels in the link's #data= fragment, which browsers do not send to servers.
  • Cursor and the model behind it see the files the agent reads, so keep client details you would not share out of the repo files you point it at.

Example prompts

  • “Read CHANGELOG.md and bill Harbor Coffee Co. for the Sprint 14 tickets at $125/hour using the hours noted in each entry. Add 8.875% sales tax and use the freeinvoices tool.”
  • “From the closed issues listed in sprint-14.md, create an invoice from Northlane Digital to Acme Labs. Bill 1.5 hours per issue at $110/hour, due in 14 days, with the freeinvoices tool.”
  • “Sum the hours per project in timesheet.csv and create one invoice with a line item per project at $95/hour, USD, net 30.”
  • “Make a quote, not an invoice, for the three tasks in TODO.md at $120/hour, valid for 30 days.”
  • “Create a credit note for 2 hours of the INV-2026-031 work that we are not billing, at $125/hour, with 8.875% sales tax.”

FAQ

Do I need an account or API key?

No. The FreeInvoices server has no authentication, so the mcp.json entry only needs the url. Cursor's own account and plan are separate from FreeInvoices.

Project file or global file?

Use .cursor/mcp.json to scope the server to one repo, or ~/.cursor/mcp.json if you invoice from many projects and want it everywhere.

The tool does not show up. What should I check?

Confirm the JSON is valid, that freeinvoices is enabled under Customize in the sidebar, and look at MCP Logs in the Output panel. Starting a fresh agent chat after editing the file also helps.

Can I add my logo?

Yes, after you open the link. The logo is added in the editor in your browser, then you click Download PDF.

Does the agent do the tax math?

No. You give it the rate (such as 8.875) and FreeInvoices computes the subtotal, tax on the discounted amount, shipping, total and balance due, rounded to the currency's minor unit.

Sources

FreeInvoices is independent and not affiliated with or endorsed by Cursor's maker. Product names are trademarks of their owners.

Try it now

Open the editor and use Import from ChatGPT, Claude…, or connect the MCP server.

Open the invoice generator →