easybill-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| EASYBILL_API_KEY | Yes | Required. Your easybill API key. | |
| EASYBILL_BASE_URL | No | Override the API base URL for a proxy or test double. | |
| EASYBILL_TIMEOUT_MS | No | HTTP request timeout. | 30000 |
| EASYBILL_MAX_RETRIES | No | Retries on HTTP 429 / 5xx. | 3 |
| EASYBILL_ENABLE_WRITES | No | Set to 'true' to register create/update/delete tools. Otherwise read-only. | false |
| EASYBILL_CHARACTER_LIMIT | No | Max characters per response before truncation. | 25000 |
| EASYBILL_RATE_LIMIT_PER_MINUTE | No | Client-side throttle. Use '10' for PLUS, '60' for BUSINESS. | 60 |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| easybill_find_customerA | Search for an existing customer by company name, person name, email, customer number or city. USE THIS FIRST whenever you need to know whether someone is already a customer — for example before creating an offer or invoice from an inbound inquiry. The easybill API has no full-text search, so this tool combines exact filters with a local fuzzy match over the customer list. It tolerates the differences that break exact matching: legal forms ('GmbH & Co. KG'), punctuation ('M.B. MUSTERMANN' vs 'MB Mustermann'), umlauts, and word order. Args:
Returns: { query, match_count, exact_match (boolean), candidates[] } where each candidate has its easybill 'id', 'match_score' (1 = certain) and the usual summary fields. Next steps based on the result:
Examples:
|
| easybill_list_customersA | List customers from easybill with optional filters and pagination. NOTE: easybill has no fuzzy full-text customer search. The filters below match exact values (though each accepts several comma-separated values). To find a customer by a partial name, filter on company_name or last_name with the exact spelling, or page through the list and match locally. Returns a compact field set by default; pass 'fields' for specific columns or ['all'] for everything. Returns: { total, count, page, pages, has_more, next_page, items[] }. Use 'next_page' to continue paging. Monetary values are integers in cents (150 = 1.50 EUR). |
| easybill_get_customerA | Fetch one customer by its numeric easybill ID, returning all fields by default. Use easybill_list_customers first if you only know a name or number. Pass 'fields' to narrow the response. Monetary values are integers in cents (150 = 1.50 EUR). |
| easybill_list_contactsA | List contacts from easybill with optional filters and pagination. Contacts are always scoped to one customer, so 'customer_id' is required. Returns a compact field set by default; pass 'fields' for specific columns or ['all'] for everything. Returns: { total, count, page, pages, has_more, next_page, items[] }. Use 'next_page' to continue paging. Monetary values are integers in cents (150 = 1.50 EUR). |
| easybill_get_contactA | Fetch one contact by its numeric easybill ID, returning all fields by default. Use easybill_list_contacts first if you only know a name or number. Pass 'fields' to narrow the response. Monetary values are integers in cents (150 = 1.50 EUR). |
| easybill_list_customer_groupsA | List customer groups from easybill with optional filters and pagination. Customer groups classify customers and can carry their own pricing level. Use a group's 'id' as 'group_id' when creating or filtering customers. Returns a compact field set by default; pass 'fields' for specific columns or ['all'] for everything. Returns: { total, count, page, pages, has_more, next_page, items[] }. Use 'next_page' to continue paging. Monetary values are integers in cents (150 = 1.50 EUR). |
| easybill_get_customer_groupA | Fetch one customer group by its numeric easybill ID, returning all fields by default. Use easybill_list_customer_groups first if you only know a name or number. Pass 'fields' to narrow the response. Monetary values are integers in cents (150 = 1.50 EUR). |
| easybill_list_documentsA | List documents from easybill with optional filters and pagination. Covers every document type: invoices, offers, credit notes, reminders, deliveries, orders. NOT the right tool for: finding out whether a customer exists (use easybill_find_customer), or orienting yourself before creating a document (see easybill_create_document). Only call this when you actually need to read existing documents, and always with a filter. Common recipes:
Returns a compact field set by default; pass 'fields' for specific columns or ['all'] for everything. Returns: { total, count, page, pages, has_more, next_page, items[] }. Use 'next_page' to continue paging. Monetary values are integers in cents (150 = 1.50 EUR). |
| easybill_get_documentA | Fetch one document by its numeric easybill ID, returning all fields by default. Use easybill_list_documents first if you only know a name or number. Pass 'fields' to narrow the response. Monetary values are integers in cents (150 = 1.50 EUR). |
| easybill_download_documentA | Download a document as a PDF or e-invoicing file and save it to a local path. Supported formats: 'pdf' (plain), 'zugferd1', 'zugferd2_2' (PDF with embedded XML), 'xrechnung2_3', 'xrechnung3_0' (XML), and 'jpg' (first page as an image). Returns the saved file path and its size in bytes. The file content itself is NOT loaded into the conversation, so this is safe for large PDFs. |
| easybill_list_document_versionsA | List the change history of a document. easybill snapshots a version whenever a completed document is modified, which is what you need for audit questions like 'was this invoice altered after it was issued?'. Returns: { total, count, page, pages, items[] } with each version's id, created_at and reason. |
| easybill_list_positionsA | List positions from easybill with optional filters and pagination. Positions are the reusable article catalogue (products, services and text blocks). Referencing one by 'position_id' in a document line item copies its price and description over. Prices are integers in cents (1999 = 19.99 EUR). Returns a compact field set by default; pass 'fields' for specific columns or ['all'] for everything. Returns: { total, count, page, pages, has_more, next_page, items[] }. Use 'next_page' to continue paging. Monetary values are integers in cents (150 = 1.50 EUR). |
| easybill_get_positionA | Fetch one position by its numeric easybill ID, returning all fields by default. Use easybill_list_positions first if you only know a name or number. Pass 'fields' to narrow the response. Monetary values are integers in cents (150 = 1.50 EUR). |
| easybill_list_stock_entriesA | List stock entries from easybill with optional filters and pagination. Stock entries are the inventory movement log for articles that have stock management enabled (position.stock = 'YES'). Each entry records a new absolute stock level. Filter by position_id to see one article's history. Returns a compact field set by default; pass 'fields' for specific columns or ['all'] for everything. Returns: { total, count, page, pages, has_more, next_page, items[] }. Use 'next_page' to continue paging. Monetary values are integers in cents (150 = 1.50 EUR). |
| easybill_get_stock_entryA | Fetch one stock entry by its numeric easybill ID, returning all fields by default. Use easybill_list_stock_entries first if you only know a name or number. Pass 'fields' to narrow the response. Monetary values are integers in cents (150 = 1.50 EUR). |
| easybill_list_document_paymentsA | List document payments from easybill with optional filters and pagination. Payments booked against documents. Recording a payment is what marks an invoice as paid — it updates the document's 'paid_amount' and 'paid_at'. To find open invoices instead, use easybill_list_documents with type='INVOICE' and paid_at='null'. Amounts are integers in cents (150 = 1.50 EUR). Returns a compact field set by default; pass 'fields' for specific columns or ['all'] for everything. Returns: { total, count, page, pages, has_more, next_page, items[] }. Use 'next_page' to continue paging. Monetary values are integers in cents (150 = 1.50 EUR). |
| easybill_get_document_paymentA | Fetch one document payment by its numeric easybill ID, returning all fields by default. Use easybill_list_document_payments first if you only know a name or number. Pass 'fields' to narrow the response. Monetary values are integers in cents (150 = 1.50 EUR). |
| easybill_list_projectsA | List projects from easybill with optional filters and pagination. Projects group documents and tracked time under a customer engagement, with an optional budget. 'consumed_amount' and 'consumed_time' show progress against 'budget_amount' and 'budget_time' — useful for budget-burn questions. Amounts are integers in cents; times are in minutes. Returns a compact field set by default; pass 'fields' for specific columns or ['all'] for everything. Returns: { total, count, page, pages, has_more, next_page, items[] }. Use 'next_page' to continue paging. Monetary values are integers in cents (150 = 1.50 EUR). |
| easybill_get_projectA | Fetch one project by its numeric easybill ID, returning all fields by default. Use easybill_list_projects first if you only know a name or number. Pass 'fields' to narrow the response. Monetary values are integers in cents (150 = 1.50 EUR). |
| easybill_list_time_trackingsA | List time tracking entries from easybill with optional filters and pagination. Tracked working time, optionally tied to a project and an article. 'timer_value' is the tracked duration in MINUTES and 'hourly_rate' is in cents. 'cleared_at' is set once the entry has been billed — entries with cleared_at = null are still unbilled, which is what you want when preparing an invoice. Returns a compact field set by default; pass 'fields' for specific columns or ['all'] for everything. Returns: { total, count, page, pages, has_more, next_page, items[] }. Use 'next_page' to continue paging. Monetary values are integers in cents (150 = 1.50 EUR). |
| easybill_get_time_trackingA | Fetch one time tracking entry by its numeric easybill ID, returning all fields by default. Use easybill_list_time_trackings first if you only know a name or number. Pass 'fields' to narrow the response. Monetary values are integers in cents (150 = 1.50 EUR). |
| easybill_list_attachmentsA | List attachments from easybill with optional filters and pagination. Files stored in easybill and linked to a document, customer or project. This endpoint has no filters — page through the list and match on 'document_id', 'customer_id' or 'file_name'. Use easybill_download_attachment to fetch the actual file content. Returns a compact field set by default; pass 'fields' for specific columns or ['all'] for everything. Returns: { total, count, page, pages, has_more, next_page, items[] }. Use 'next_page' to continue paging. Monetary values are integers in cents (150 = 1.50 EUR). |
| easybill_get_attachmentA | Fetch one attachment by its numeric easybill ID, returning all fields by default. Use easybill_list_attachments first if you only know a name or number. Pass 'fields' to narrow the response. Monetary values are integers in cents (150 = 1.50 EUR). |
| easybill_download_attachmentA | Download an attachment's file content and save it to a local path. Returns the saved file path and size in bytes. The content is NOT loaded into the conversation, so this is safe for large files. Find attachment IDs with easybill_list_attachments. |
| easybill_list_text_templatesA | List text templates from easybill with optional filters and pagination. Reusable text blocks for document headers, footers and notes. Handy for reusing your standard payment terms or closing wording when creating a document. Returns a compact field set by default; pass 'fields' for specific columns or ['all'] for everything. Returns: { total, count, page, pages, has_more, next_page, items[] }. Use 'next_page' to continue paging. Monetary values are integers in cents (150 = 1.50 EUR). |
| easybill_get_text_templateA | Fetch one text template by its numeric easybill ID, returning all fields by default. Use easybill_list_text_templates first if you only know a name or number. Pass 'fields' to narrow the response. Monetary values are integers in cents (150 = 1.50 EUR). |
| easybill_list_pdf_templatesA | List the PDF layout templates configured in your easybill account. Pass a template's 'id' as 'pdf_template' when creating or converting a document to control its layout and language. The built-in values are 'DE' (German, the default) and 'EN' (English); anything custom uses a numeric ID. Note: this endpoint is not paginated and returns all templates at once. |
| easybill_get_server_infoA | Report this MCP server's configuration and verify the easybill API credentials work. Call this when a write tool appears to be missing, when you get authentication errors, or when you hit rate limits — it explains the current mode and limits. Returns: { server_version, api_base_url, writes_enabled, tools_registered, rate_limit_per_minute, character_limit, connection } where 'connection' reports whether a live test call to easybill succeeded. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/stack74/easybill-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server