archive_invoice
Archive an invoice (move out of the active list). Does not delete or cancel it.
Run a Papierkram accounting account from an assistant — invoices, estimates, expenses, contacts, projects, time tracking and banking.
LABSCO SUMMARY
Editing and deletion are confined to drafts and a numbered invoice is cancelled with a Storno — the tools mirror those rules, so an assistant cannot quietly break the audit trail. Lists return trimmed summaries by default, which is what keeps a hundred-invoice query readable; ask for the full record only when you need it.
An MCP server for the Papierkram.de accounting API. It covers the full document lifecycle — draft an invoice, send it, cancel or archive it, download the PDF — alongside contacts, projects, tracked time, tasks and read-only banking, so an assistant can do the bookkeeping instead of describing it.
A Papierkram account with API access. Create the key under Einstellungen > API and set PAPIERKRAM_API_KEY plus PAPIERKRAM_SUBDOMAIN — the part before .papierkram.de in your URL. Clients run npx -y papierkram-mcp-server over stdio; Node.js 20 or newer. An HTTP/SSE mode on port 3001 is available via Docker for n8n and other non-stdio clients.
One command plus a key — npx papierkram-mcp-server, then supply credentials
USE CASES
Pull the time entries for the project, look up the payment terms, and draft the invoice from them.
Check the draft, deliver it by email or finalise it as PDF, and download the file for your records.
Issue the cancellation document rather than deleting anything, then draft the replacement.
Create the expense voucher with its line items and the right Papierkram category.
Read the bank transactions for the period and line them up against the outstanding invoices.
Counted once with only startup setup. Other versions, modes or optional credentials may expose a different list.
archive_invoiceArchive an invoice (move out of the active list). Does not delete or cancel it.
archive_projectArchive a project. Reversible via unarchive_project.
cancel_invoiceCancel a finalised invoice by creating a cancellation document (Storno). Use for invoices that already have a number; use delete_invoice for drafts.
create_companyCreate a new company/contact. Requires contact_type and name. Returns the created company with its new ID.
create_contact_personCreate a new contact person for a company. Requires company_id, first_name, last_name. Returns the created contact with its new ID.
create_estimateCreate a new estimate/proposal (Angebot). Requires name, document_date and at least one line_item (vat_rate as decimal, e.g. 0.19). Returns the created estimate with its new ID.
create_expense_voucherCreate a new expense voucher (Ausgabebeleg). Requires name, provenance, and at least one line_item. Each line_item needs a category from the fixed Papierkram account list and a vat_rate as decimal (0.19). Returns the created voucher with its new ID.
create_invoiceCreate a new invoice (as a draft). Requires name, payment_term_id and at least one line_item (vat_rate as decimal, e.g. 0.19). The invoice number is assigned later via send_invoice. Returns the created draft with its ID.
create_projectCreate a new project. Requires name and customer_id (a project must belong to a company). Returns the created project with its new ID.
create_taskCreate a new task (Tracker-Aufgabe). Requires name and project_id (a task must belong to a project). Returns the created task with its new ID.
create_time_entryCreate a new time entry. Requires entry_date, start/end time, task_id and user_id (the API requires a task and a user). Returns the created entry with its new ID.
delete_companyPermanently delete a company/contact. Returns a confirmation string.
delete_contact_personPermanently delete a contact person. Returns a confirmation string.
delete_estimatePermanently delete an estimate/proposal. Returns a confirmation string.
delete_expense_voucherPermanently delete an expense voucher. Returns a confirmation string.
delete_invoicePermanently delete a draft invoice. Only works on draft invoices. Returns a confirmation string.
delete_projectPermanently delete a project. Returns a confirmation string.
delete_taskPermanently delete a task. Returns a confirmation string.
delete_time_entryPermanently delete a time entry. Returns a confirmation string.
download_estimate_pdfDownload an estimate as PDF. Returns base64-encoded PDF data (content_type, base64_length, base64).
download_invoice_pdfDownload an invoice as PDF. Returns base64-encoded PDF data (content_type, base64_length, base64).
get_account_infoGet account information from Papierkram (company name, plan, subscription details).
get_bank_connectionGet the full bank connection record by ID (IBAN, BIC, account details).
get_bank_transactionGet the full bank transaction record by ID.
get_companyGet the full company/contact record by ID.
get_contact_personGet the full contact person record by ID (within a company).
get_estimateGet the full estimate/proposal record by ID (line items, totals, state).
get_expense_voucherGet the full expense voucher record by ID.
get_invoiceGet the full invoice record by ID, including invoice_no (null while still a draft), state, line items and totals.
get_projectGet the full project record by ID (budget, dates, state, customer).
get_propositionGet a specific proposition (Ware/Dienstleistung — product/service) by ID.
get_taskGet the full task record by ID.
get_time_entryGet the full time entry record by ID.
list_bank_connectionsList bank connections in Papierkram. Returns compact summaries (id, name) by default; set compact=false for the full API response. Supports pagination.
list_bank_transactionsList bank transactions in Papierkram. Returns compact summaries (id, value, state, date, usage, counterparty) by default; set compact=false for the full API response. Filter by bank connection and paginate.
list_companiesList companies/contacts in Papierkram. Returns compact summaries (id, name, contact_type, email, customer/supplier no.) by default; set compact=false for the full API response. Supports pagination. NOTE: the Papierkram API does not filter by contact_type server-side, so contact_type filters the returned page client-side only.
list_contact_personsList contact persons of a specific company. Returns compact summaries (id, name, email, position) by default; set compact=false for the full API response.
list_estimatesList estimates/proposals (Angebote) in Papierkram. Returns compact summaries (id, name, estimate_no, state, date, total) by default; set compact=false for the full API response. Supports pagination and filtering.
list_expense_vouchersList expense vouchers (Ausgabebelege) in Papierkram. Returns compact summaries (id, name, voucher_no, state, dates, amount) by default; set compact=false for the full API response. Supports pagination and filtering.
list_invoicesList invoices in Papierkram. Returns compact summaries (id, name, invoice_no, state, dates, total_gross, customer) by default; set compact=false for the full API response. Supports pagination and filtering.
list_payment_termsList payment terms (Zahlungsbedingungen). Use the returned IDs as payment_term_id when creating invoices.
list_projectsList projects in Papierkram. Returns compact summaries (id, name, record_state, dates, company_id) by default; set compact=false for the full API response. Supports pagination and filtering by company.
list_propositionsList propositions (Waren/Dienstleistungen — products and services) that can be referenced in invoices and estimates.
list_tasksList tasks (Tracker-Aufgaben) in Papierkram. Returns compact summaries (id, name, complete, deadline, project) by default; set compact=false for the full API response. Supports pagination and filtering by project.
list_time_entriesList time entries in Papierkram. Returns compact summaries (id, times, duration, comments, task/project) by default; set compact=false for the full API response. Supports pagination and filtering.
send_estimateDeliver an estimate. With send_via='email' the estimate is mailed (recipient, subject and body are required). With send_via='pdf' the estimate is finalised without sending an email — the PDF can then be retrieved via download_estimate_pdf. Either way Papierkram assigns the final estimate number. Finalising is not reversible.
send_invoiceDeliver an invoice. With send_via='email' the invoice is mailed (recipient, subject and body are required). With send_via='pdf' the invoice is finalised without sending an email — the PDF can then be retrieved via download_invoice_pdf. Either way Papierkram assigns the final invoice number. Finalising is not reversible.
unarchive_projectUnarchive a project (restore from archive). Reversible via archive_project.
update_companyUpdate an existing company/contact (partial). Only provided fields are changed.
update_contact_personUpdate an existing contact person (partial). Only provided fields are changed.
update_estimateUpdate an existing estimate/proposal (partial). Only provided fields are changed.
update_expense_voucherUpdate an existing expense voucher (partial). Only provided fields are changed.
update_invoiceUpdate an existing draft invoice (partial). Only provided fields are changed. Only works on draft invoices (before send_invoice assigns the number).
update_projectUpdate an existing project (partial). Only provided fields are changed.
update_taskUpdate an existing task (partial). Only provided fields are changed.
update_time_entryUpdate an existing time entry (partial). Only provided fields are changed.
BEFORE YOU INSTALL
56 tools when we connected. Banking tools are read-only: you can read bank connections and transactions but not create or reconcile them.
CONTEXT COST
Rated by the size of the 56 tool definitions that ride along on every turn, not by how many there are
INSTALLATION
npx papierkram-mcp-server{
"mcpServers": {
"papierkram": {
"command": "npx",
"args": [
"-y",
"papierkram-mcp-server"
],
"env": {
"PAPIERKRAM_API_KEY": "<YOUR_PAPIERKRAM_API_KEY>",
"PAPIERKRAM_SUBDOMAIN": "<YOUR_PAPIERKRAM_SUBDOMAIN>"
}
}
}
}git clone https://github.com/Wagner-Emden-IT-Services/papierkram-mcp-server.git
cd papierkram-mcp-server
cp .env.example .env
docker compose up -d