What you can do
Track time
Log hours, pull unbilled time entries, and check timesheets.
Manage invoices
Create invoices from unbilled entries and send them to recipients.
Manage the team
List, invite, update, and deactivate team members.
Hand off the busywork
Ask your assistant to bill a client for the month, chase down missing timesheets, or flag a PTO conflict for you.
MCP vs CLI: which should I use?
NeetoInvoice’s CLI reaches the same resources MCP does - clients, recipients, projects, project users, time entries, invoices, PTO, and the rest. The two are level on reach, so choose on how the work reaches NeetoInvoice.Reach for MCP when
- The details live in your chat, not in your head. A client writes “we approved 6 hours of design on the 14th” and your assistant turns that message into the time entry. The same entry from the shell needs the client, project, and task ids, the date, and the hours all typed out, and the CLI cannot see the message at all.
- You have not decided the steps yet. “Acme’s July hours look wrong - have a look” means reading what is there and choosing what to do about it. A command can only carry out a decision you have already made.
- One request should cover several steps. “Bill Acme for July” finds the client, pulls its unbilled entries for the month, bills them, and emails the invoice to the recipients, with the ids carried from one call to the next. The same invoice from the shell needs a JSON file listing every entry with its ids, hours, and rate, plus a total you worked out yourself.
- The person doing it does not use a terminal. The office manager chasing this week’s missing timesheets installs nothing: NeetoInvoice hosts the server, and their assistant is already open.
Reach for the CLI instead when
- No AI assistant should be in the loop. A cron entry or a CI step runs
neetoinvoice reports payroll-summary --month 8 --year 2026with nothing but the binary and a workspace it is already signed in to - no assistant open, no model account, no tokens spent per run. Every MCP call needs something with model access running. - The output feeds another program. The CLI prints a bare identifier or raw JSON for
jq, a spreadsheet, or your own script. Here you get prose you would have to copy out by hand. - You are working through a year of time entries. Here every page is a separate tool call, and entries in that volume crowd out the assistant’s context. The CLI returns
total_pagesnext to the entries, so a shell loop walks every page unattended and writes each one to a file or intojq- the size of the project’s history stops mattering. - The run has to be repeatable and reviewable. Month-end close is the same commands in the same order every month: the timesheet summary, then the payroll summary, then the invoices. A command is the artifact: it records exactly what ran and repeats identically. Ask twice here and the assistant may take a different route.
What you need
- An AI assistant that supports MCP. Setup steps for Claude, ChatGPT, Claude Code, Codex, Cursor, Gemini CLI, VS Code with GitHub Copilot, Windsurf, and Antigravity are on Connect.
- A NeetoInvoice API key, but only for workspace scoped access, and for Antigravity, where it is the only documented route. Every other client can sign you in over OAuth instead, which needs nothing beyond the server URL. See Authentication.
An OAuth connection is approved in the browser, much as the CLI signs you in, and you decide there whether the assistant may create, update, or delete. An API key is the same one the REST API uses, passed as a bearer token from your assistant’s config, and it carries every permission for the whole workspace.