billy-mcp (Thourum/billy-mcp) is an MCP server listed on the M8ven Trust Index. It scores 74 out of 100, grade C. It declares 40 tools. No publisher has claimed this listing.

C
Emerging
74/100

billy-mcp

Connects AI assistants to the Danish accounting platform Billy (billy.dk) for managing invoices, journal entries, balances, and receipts, with built-in human approval for all write operations.

Emerging. No concerning findings. Grades remain capped until the project builds reputation through adoption. Grades reflect the full trust pyramid: code, verification depth, and reputation. New projects cap at C until adoption is earned.

How we verified

Code Verified⚡ Live Monitored: not connected

Verified is a snapshot. Live keeps it current, and builds your track record.

⚡ Connect GitHub → continuous verification on every pushwhy connect →

Who stands behind it

Thourum

Source: Glama

Is this your MCP?

Claim it to get a verified publisher badge, a free copy of our full audit findings, and direct contact for any high-priority issues we find. Or connect your repo for our deepest verification, Live Monitored: read-only, revoke anytime. What we access →

Install from

The grade above is for the source repository. Registries can serve a different version, so we mark the ones we were not able to read.

// key findings
40 tools verified — handlers match their declared behaviour
23 read-only tools verified — handlers contain no write/delete/exec
No credential exfiltration, no sensitive file access, no obfuscation
Static analysis found nothing flowing your secrets to unexpected places.
Open source with a license and README
Anyone can audit the code, the license is declared, and the publisher documents what it does.
🔐
You'll be asked for 1 credential: BILLY_ACCESS_TOKEN
These are read from process.env at runtime. Make sure you trust where they’ll be sent.
// tools this server exposes40 tools

These names and descriptions are the publisher's own, read from the source code. We print them as written. Our assessment is the findings above, not this list.

list_accounts

List the chart of accounts in Billy. Use this to find account IDs for bill lines, product revenue accounts, and bank accounts for payments (look for isPaymentEnabled/isBankAccount).

get_account

Get a single account from the Billy chart of accounts by ID.

list_daybook_transactions

List daybook transactions (manual journal entries) in Billy, filterable by state and entry date range.

list_files

List files uploaded to Billy (receipts, invoices PDFs, etc.). Files are append-only via the API.

list_attachments

List attachments (file↔record links). Filter by owner to see what's attached to a specific record; ownerReference is applied client-side within the page.

upload_file

Upload a local file (pdf/jpg/jpeg/png/gif ONLY — Billy rejects other types with a 422) to Billy and get its file ID. Files are append-only: they cannot be deleted or modified via the API afterwards. Use attach_file to link the uploaded file to a record.

attach_file

Attach an uploaded file to a Billy record (daybook transaction, invoice, or bill). Get the fileId from upload_file or list_files. Example: attach a receipt to journal entry #67 → ownerType 'daybookTransaction', ownerId '<transaction id>'.

list_bills

List supplier bills (expenses) in Billy with filters for supplier, state, paid status, date range and free-text search.

get_bill

Get a single Billy bill by ID, including its lines, balance and paid status.

create_bill

Create a supplier bill (expense) in Billy with one or more lines coded to expense accounts. Created as draft by default; pass state=approved to book it immediately.

list_contacts

List contacts (customers and suppliers) in Billy. Supports free-text search and filtering. Use this to find a contact ID before creating invoices or bills.

get_contact

Get a single Billy contact by its ID, including full address and settings.

create_contact

Create a new contact (customer or supplier) in Billy. Returns the created contact including its ID.

update_contact

Update an existing Billy contact. Only provided fields are changed.

list_contact_persons

List contact persons (names/emails used for sending invoices) belonging to a Billy contact.

create_contact_person

Add a contact person (name and/or email) to an existing Billy contact. Emails are used to mail invoices.

list_daybooks

List daybooks in Billy. Find the daybook ID used for manual journal entries.

create_daybook_transaction

Create a manual journal entry (daybook transaction) in Billy with balanced debit/credit lines. Validates balance client-side before asking for approval. Supports safe-retry deduplication via idempotencyKey. Created as draft by default; state=approved books it immediately.

void_daybook_transaction

Void a daybook transaction (journal entry) in Billy. Irreversible — voided entries cannot be reinstated.

batch_void_daybook_transactions

Void many daybook transactions in one call with ONE user approval for the whole batch. Continues past individual failures and reports per-id results. Irreversible.

list_invoices

List invoices in Billy with filters for customer, state, date range and free-text search. Returns invoices plus meta.paging.

get_invoice

Get a single Billy invoice by ID, including its lines, balance and paid status.

create_invoice

Create an invoice (or credit note) in Billy with one or more lines. Created as draft by default; pass state=approved to approve immediately (approval assigns the invoice number and books it). Amounts are in the invoice currency.

approve_invoice

Approve a draft Billy invoice (draft -> approved is the only allowed state change). Approval books the invoice; it cannot be reverted to draft.

delete_invoice

Delete a Billy invoice (drafts only; approved invoices must be voided/credited instead). Returns meta.deletedRecords.

billy_raw_request

Escape hatch: call any Billy API v2 endpoint not covered by a dedicated tool. Examples: GET /currencies, /countries, /taxRates, /salesTaxReturns, /invoiceReminders, /files, /bankLines, /postings, /users. Write requests must wrap the body in a singular resource key, e.g. { "daybookTransaction": {...}

get_organization

Get the Billy organization (company) details: name, base currency, VAT settings, default payment terms, fiscal year, invoice numbering. Call this first to learn the organization ID and base currency used by other tools.

create_bank_payment

Record a bank payment in Billy to mark an invoice or bill as (partially) paid. Creates a bankPayment associated with the subject via 'invoice:<id>' or 'bill:<id>'. For invoices money is deposited (debit); for bills it is withdrawn (credit). WARNING: this posts a real accounting transaction.

list_bank_payments

List bank payments recorded in Billy. Useful to review what payments exist for reconciliation. NOTE: Billy only supports organizationId server-side for this endpoint; contactId/cashAccountId/date filters are applied client-side within the fetched page.

list_balance_modifiers

List balance modifiers (payment associations) in Billy. Filter by subjectReference like 'invoice:<id>' or 'bill:<id>' to see which payments settled a specific invoice or bill. NOTE: subjectReference is not documented server-side; it is also enforced client-side within the fetched page.

list_products

List products in Billy. Use this to find a product ID before creating invoice lines. Supports free-text search.

get_product

Get a single Billy product by ID, plus its per-currency prices.

create_product

Create a product in Billy, optionally with per-currency unit prices. Returns the created product including its ID.

update_product

Update an existing Billy product. Only provided fields are changed. Providing prices replaces all existing prices.

get_account_balances

Account balances / trial balance computed from postings. Ask "what is the balance of account 5211" → accountNos: ["5211"]. Omit account filters for a full trial balance. Bound with minEntryDate/maxEntryDate for speed — the tool fetches and aggregates all matching postings server-side.

list_postings

List ledger postings (individual debit/credit entries). For balances/aggregates use get_account_balances instead. Date/void/text filters are applied client-side within the fetched page — narrow with accountId.

list_transactions

List booked transactions. transactionNo/voucherNo filters are applied CLIENT-SIDE (Billy silently ignores them as query params) by scanning up to 5000 records — bound with dates when possible.

list_bank_lines

List imported bank lines. Date and matched filters are applied client-side within the fetched page.

list_bank_line_matches

List bank line matches (bank reconciliation groupings). isApproved filter applied client-side within the page.

execute_script

Run a short JavaScript (ES2022, top-level await allowed) batch script against the Billy API — use for loops, aggregation and reconciliation instead of many single tool calls (e.g. void 30 entries, post 7 monthly journals, sum postings). In scope: `billy` (get(path,query?), post(path,body), put(path,

// environment variables
To run this server yourself, you supply these values. They go in your own MCP client configuration and stay on your machine. The secret label means the value is sensitive, not that the server mishandles it.
🔐 secretBILLY_ACCESS_TOKEN"": "<your token>"
configBILLY_BASE_URLno Defaults to https://api.billysbilling.com/v2
configBILLY_LOCALEno en_US, da_DK, fr_FR, nl_NL, de_DE
configBILLY_ORGANIZATION_IDno Auto-resolved when the token maps to one company
configBILLY_WRITE_MODEEvery write (create/update/approve/void/pay/upload) is gated by :
// quality suggestions

All four hints declared on every tool

40/40 tools missing one or more hints — list_accounts (missing: destructiveHint, idempotentHint, openWorldHint); get_account (missing: destructiveHint, idempotentHint, openWorldHint); list_daybook_transactions (missing: destructiveHint, idempotentHint, openWorldHint), +37 more. OpenAI's directory rejects tools where any of the four hints are missing or non-boolean.

For every tool, set all four hints (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) to explicit true/false values that match the handler’s actual behaviour.

Tests exist

No test files found

Add tests that exercise each declared tool.

Claim the listing to review these findings one by one and send us a correction where you disagree, straight to the team. Claiming also means we tell you when the grade moves, and reach you first if we find anything urgent.

// full audit trail
The findings above are the summary. The full trail, every check we ran, each deduction, the network hosts observed and the dependency advisories, goes to verified publishers, along with an alert whenever a new one lands. Verified publishers can also review each finding and dispute it in one click. Publisher corrections have sharpened several of our checks this month, because the maintainer knows the codebase better than any scanner.
// improvement guidance — verified publishers only
We have 2 concrete improvements we can share with the publisher of this MCP. Each comes with specific guidance to raise the trust score.
// embed badge in your README
[![M8ven Score](https://m8ven.ai/badge/mcp/thourum/billy-mcp)](https://m8ven.ai/mcp/thourum/billy-mcp)
Shows your grade and updates automatically. Prefer no grade? Append ?variant=verified to the badge URL.
commit: 30524f82234931242891e317bd38f65c65758ac7
code hash: 902bc0c1b636af71fabedc964b37f449ebdfd0930bf58c7445c230122e5716f3
view raw JSON →
Check MCPs from inside your assistant
Tool Check · MCP

Vetting this one by hand? Tool Check is an MCP that scores other MCPs. Add it once and ask Claude, ChatGPT, or any MCP client to grade a server, surface CVEs, check the publisher, and suggest safer alternatives — before you install.

https://m8ven.ai/api/mcp/tool-check
check_toolsearch_toolscompare_toolsrecommend_alternativescheck_publisherreport_concern
How to add it →Free · no account needed · works in any MCP client