Invoicing & freelance CRM
Tradify
Jobs, quotes, invoices and schedule in Tradify.
23 endpoints
HERO Software has no official MCP server, and its GraphQL API comes only with HERO OS and a key from HERO support (checked 14 Nov 2026). Cotlet runs a hosted HERO Software MCP server with 15 tools that ChatGPT and Claude use in your own HERO account, on the plan you have. Invoices, emails to customers and payment reminders wait for your OK.
15 tools Read and write
HERO Software has a GraphQL API, but only on HERO OS (from 119 EUR a month) and HERO OS Plus, and you ask HERO support for the key. HERO Software has no official MCP server; its own AI, HERO Command, works only inside HERO.
| What you need | HERO GraphQL API | HERO Command | Cotlet |
|---|---|---|---|
| Ask ChatGPT or Claude to do the work | No MCP server | HERO's own AI, inside HERO | Hosted MCP server |
| Contacts, projects, logbook | Documented | By voice or chat | 15 tools, read and write |
| Quotes, invoices, reminders | Not named in the guide | Quotes and invoices | Billing steps after your OK |
| Run from n8n or a script | GraphQL, key from support | Only in the HERO app | REST, same key |
| HERO plan you need | HERO OS or OS Plus | HERO OS or OS Plus | The plan you have, Select too |
Checked 14 Nov 2026. Sources: HERO API documentation · HERO GraphQL API guide · HERO Lead API · HERO plans and prices · HERO Command · HERO on Make · Make: HERO app documentation
Once, in a browser we host for you.
One address in its settings.
It drafts the invoice, you check the total.
Your agent works in your own signed-in Cloud Browser. Invoices, emails to customers and payment reminders wait for your OK. Who can see your session
Sign in to HERO Software in a Cloud Browser. Open login.hero-software.de in your Cotlet Cloud Browser and log in with your own HERO user.
Add the Cotlet address. Enter https://cotlet.dev/mcp/v1 as the MCP server or connector URL in your agent.
Let the agent in. Chat apps open a Cotlet sign-in page. Editors, n8n and scripts send an API key made in the console.
HERO Software sits on the shared address https://cotlet.dev/mcp/v1 with every other app you turn on, so one connector covers them all. Turned on HERO after connecting? Refresh the connector and its 15 tools appear.
Settings > Apps & Connectors > Create
MCP server URL: https://cotlet.dev/mcp/v1/connect
Authentication: OAuth Settings > Connectors > Add custom connector
URL: https://cotlet.dev/mcp/v1/connect
Claude Code:
claude mcp add --transport http cotlet \
https://cotlet.dev/mcp/v1 \
--header "Authorization: Bearer $COTLET_API_KEY" // ~/.cursor/mcp.json
{
"mcpServers": {
"cotlet": {
"url": "https://cotlet.dev/mcp/v1",
"headers": { "Authorization": "Bearer ${env:COTLET_API_KEY}" }
}
}
} # ~/.codex/config.toml
[mcp_servers.cotlet]
url = "https://cotlet.dev/mcp/v1"
bearer_token_env_var = "COTLET_API_KEY" MCP Client Tool (inside an AI Agent)
Transport: HTTP Streamable
URL: https://cotlet.dev/mcp/v1
Auth: Bearer, <your key>
Tool: hero_software_read One tool per everyday job in HERO's projects, documents and calendar. Quotes and invoices are saved to the project and stay there until send_document emails them.
Search the customer index before adding anyone, open projects for a contact and keep the project logbook.
Returns projects as HERO shows them in the project overview, with the internal project ID, the project number, the customer and the status. Use the ID in get_project and the other project tools. A long list comes in pages: follow next_cursor until it is empty.
MCP callhero_software_read → list_projects
REST endpointGET https://cotlet.dev/api/v1/hero-software/projects
| Name | Type | Description |
|---|---|---|
| query string | string | Part of a project name, number or customer name. |
| cursor string | string | Next page cursor from the previous call. |
{
"projects": [
{
"project_id": "48213",
"number": "P-2026-0187",
"name": "Keller bathroom tap",
"customer": "Anna Keller",
"status": "In progress"
},
{
"project_id": "48190",
"number": "P-2026-0184",
"name": "Brandt heating service",
"customer": "Brandt GmbH",
"status": "Quote sent"
}
],
"next_cursor": null
} Returns the project data, the documents saved to the project (quotes, order confirmations, invoices) with their IDs, its appointments and the logbook entries, newest first. Use it before a reminder or an invoice to see what already exists for the job.
MCP callhero_software_read → get_project
REST endpointGET https://cotlet.dev/api/v1/hero-software/projects/{project_id}
| Name | Type | Description |
|---|---|---|
| project_id string required | string | Project ID from list_projects. |
{
"project_id": "project_8c41d2"
} {
"project_id": "48213",
"number": "P-2026-0187",
"name": "Keller bathroom tap",
"customer": "Anna Keller",
"status": "In progress",
"documents": [
{
"document_id": "d-7731",
"type": "quote",
"number": "A-2026-0301",
"total": 875.84
}
],
"appointments": [
{
"appointment_id": "e-5520",
"title": "Fit tap set",
"starts_at": "2026-11-18T08:00:00+01:00"
}
],
"logbook": [
{
"date": "2026-11-14",
"text": "Quote sent, customer wants to start on 18 Nov."
}
]
} Returns contacts from the customer index with their ID, name, address, phone and email. Check it before create_contact so the same customer is not added twice.
MCP callhero_software_read → list_contacts
REST endpointGET https://cotlet.dev/api/v1/hero-software/contacts
| Name | Type | Description |
|---|---|---|
| query string | string | Part of a name, company or street. |
| cursor string | string | Next page cursor from the previous call. |
{
"contacts": [
{
"contact_id": "c-2201",
"name": "Anna Keller",
"address": "Lindenweg 4, 30159 Hannover",
"phone": "+49 511 555 0142",
"email": "anna.keller@example.com"
}
],
"next_cursor": null
} Creates the contact and returns its ID. It changes only your own HERO account and reaches no customer, so it does not wait for your OK. Run list_contacts first to avoid a duplicate.
MCP callhero_software_write → create_contact
REST endpointPOST https://cotlet.dev/api/v1/hero-software/contacts
| Name | Type | Description |
|---|---|---|
| name string required | string | Full name or company name. |
| address string | string | Street, postcode and city. |
| phone string | string | Phone number. |
| email string | string | Email address. |
{
"name": "Jane Doe"
} {
"contact_id": "c-2201",
"name": "Anna Keller",
"created": true
} Creates the project for the contact and returns its ID and project number. It reaches no one outside your account, so it does not wait for your OK.
MCP callhero_software_write → create_project
REST endpointPOST https://cotlet.dev/api/v1/hero-software/contacts/{contact_id}/projects
| Name | Type | Description |
|---|---|---|
| contact_id string required | string | Contact ID from list_contacts or create_contact. |
| name string required | string | Project name. |
| note string | string | First note on the project. |
{
"contact_id": "contact_8c41d2",
"name": "Jane Doe"
} {
"project_id": "48213",
"number": "P-2026-0187",
"name": "Keller bathroom tap",
"status": "New"
} Adds the entry to the project logbook under your name. It reaches no one, so it does not wait for your OK.
MCP callhero_software_write → add_logbook_entry
REST endpointPOST https://cotlet.dev/api/v1/hero-software/projects/{project_id}/logbook-entries
| Name | Type | Description |
|---|---|---|
| project_id string required | string | Project ID from list_projects. |
| text string required | string | The note. |
{
"project_id": "project_8c41d2",
"text": "text"
} {
"project_id": "48213",
"logged": true,
"text": "Tap fitted, old valve left with the customer."
} Line items with quantity, unit, price and VAT rate. Prices come from you or your article master data, never from the agent.
Returns documents with their ID, type, number, customer, project, total and the status HERO shows. With overdue_only the list holds unpaid invoices past their due date, with the days overdue. Documents come in pages: follow next_cursor.
MCP callhero_software_read → list_documents
REST endpointGET https://cotlet.dev/api/v1/hero-software/documents
| Name | Type | Description |
|---|---|---|
| type string | string | quote, order_confirmation, invoice or delivery_note. Leave empty for all. |
| project_id string | string | Only documents of this project. |
| overdue_only boolean | boolean | Only invoices past their due date and not paid. |
| cursor string | string | Next page cursor from the previous call. |
{
"documents": [
{
"document_id": "d-7702",
"type": "invoice",
"number": "R-2026-0412",
"customer": "Brandt GmbH",
"project_id": "48190",
"total": 1190,
"due_date": "2026-10-30",
"days_overdue": 15
},
{
"document_id": "d-7731",
"type": "quote",
"number": "A-2026-0301",
"customer": "Anna Keller",
"project_id": "48213",
"total": 875.84,
"status": "sent"
}
],
"next_cursor": null
} Returns the line items with quantity, unit, unit price and tax rate, the net, tax and gross totals, the customer and the project. Use it to check a quote before it becomes an invoice.
MCP callhero_software_read → get_document
REST endpointGET https://cotlet.dev/api/v1/hero-software/documents/{document_id}
| Name | Type | Description |
|---|---|---|
| document_id string required | string | Document ID from list_documents. |
{
"document_id": "document_8c41d2"
} {
"document_id": "d-7731",
"type": "quote",
"number": "A-2026-0301",
"customer": "Anna Keller",
"project_id": "48213",
"items": [
{
"title": "Labour",
"quantity": 8,
"unit": "h",
"unit_price": 62,
"vat_rate": 19
},
{
"title": "Tap set, chrome",
"quantity": 1,
"unit": "pc",
"unit_price": 240,
"vat_rate": 19
}
],
"net": 736,
"vat": 139.84,
"gross": 875.84
} Saves the quote to the project and returns its number and totals. It is not sent: it stays in the project until send_document. Prices not in your article master data are used as you give them; the agent never invents a price.
MCP callhero_software_write → create_quote
REST endpointPOST https://cotlet.dev/api/v1/hero-software/projects/{project_id}/quotes
| Name | Type | Description |
|---|---|---|
| project_id string required | string | Project ID from list_projects. |
| items array required | array | Line items: title, quantity, unit, unit_price, vat_rate. Optional article_id to take an item from the article master data. |
| intro string | string | Text above the items. |
{
"project_id": "48213",
"items": [
{
"title": "Labour",
"quantity": 8,
"unit": "h",
"unit_price": 62,
"vat_rate": 19
},
{
"title": "Tap set, chrome",
"quantity": 1,
"unit": "pc",
"unit_price": 240,
"vat_rate": 19
}
],
"intro": "Thank you for your inquiry. We offer the following work:"
} {
"document_id": "d-7731",
"type": "quote",
"number": "A-2026-0301",
"net": 736,
"vat": 139.84,
"gross": 875.84,
"sent": false
} Uses the convert function HERO offers on a quote: customer, items and prices carry over, and the invoice is saved to the project. It is not sent. It creates a financial document, so you confirm each call and check the numbers first. By default you confirm each call; you can switch that off for this tool.
MCP callhero_software_write → create_invoice_from_quote
REST endpointPOST https://cotlet.dev/api/v1/hero-software/documents/{document_id}/invoice-from-quotes
| Name | Type | Description |
|---|---|---|
| document_id string required | string | ID of the quote or order confirmation from list_documents. |
{
"document_id": "document_8c41d2"
} {
"document_id": "d-7760",
"type": "invoice",
"number": "R-2026-0420",
"from_document_id": "d-7731",
"gross": 875.84,
"sent": false
} Sends the document to the customer's email address on the contact. The email reaches the customer and cannot be recalled. By default you confirm each call; you can switch that off for this tool.
MCP callhero_software_write → send_document
REST endpointPOST https://cotlet.dev/api/v1/hero-software/documents/{document_id}
| Name | Type | Description |
|---|---|---|
| document_id string required | string | Document ID from list_documents. |
| subject string | string | Email subject. Empty uses the default. |
| message string | string | Email text. |
{
"document_id": "document_8c41d2"
} {
"document_id": "d-7731",
"sent_to": "anna.keller@example.com",
"sent_at": "2026-11-14T10:12:00+01:00"
} Creates the reminder from the invoice, as HERO does for payment reminders, and emails it to the customer. It asks for money from a customer, so check the project logbook first. By default you confirm each call; you can switch that off for this tool.
MCP callhero_software_write → send_payment_reminder
REST endpointPOST https://cotlet.dev/api/v1/hero-software/documents/{document_id}/payment-reminders
| Name | Type | Description |
|---|---|---|
| document_id string required | string | Invoice ID from list_documents with overdue_only. |
| message string | string | Extra text for the customer. |
{
"document_id": "document_8c41d2"
} {
"document_id": "d-7790",
"type": "payment_reminder",
"invoice_number": "R-2026-0412",
"sent_to": "office@brandt.example",
"sent_at": "2026-11-14T10:20:00+01:00"
} Appointments by date range, open tasks by project, and new appointments on the planning board. No email goes to the customer.
Returns the appointments from the HERO calendar in the range, soonest first, with title, time, project, customer address and the people assigned. Single and recurring appointments both appear.
MCP callhero_software_read → list_appointments
REST endpointGET https://cotlet.dev/api/v1/hero-software/appointments
| Name | Type | Description |
|---|---|---|
| from string required | string | First day, YYYY-MM-DD. |
| to string required | string | Last day, YYYY-MM-DD. |
| cursor string | string | Next page cursor from the previous call. |
{
"from": "from",
"to": "to"
} {
"appointments": [
{
"appointment_id": "e-5520",
"title": "Fit tap set",
"starts_at": "2026-11-18T08:00:00+01:00",
"project_id": "48213",
"address": "Lindenweg 4, 30159 Hannover",
"assigned": [
"Jonas"
]
}
],
"next_cursor": null
} Returns the tasks HERO shows in its task overview, with title, project, assignee and due date. Use state open for a daily briefing.
MCP callhero_software_read → list_tasks
REST endpointGET https://cotlet.dev/api/v1/hero-software/tasks
| Name | Type | Description |
|---|---|---|
| state string | string | open or completed. Leave empty for both. |
| project_id string | string | Only tasks of this project. |
| cursor string | string | Next page cursor from the previous call. |
{
"tasks": [
{
"task_id": "t-9120",
"title": "Order tap set",
"project_id": "48213",
"assignee": "Jonas",
"due_date": "2026-11-17",
"state": "open"
}
],
"next_cursor": null
} Creates a single appointment on the project and shows it in the calendar and the planning board. It does not email the customer, so it does not wait for your OK.
MCP callhero_software_write → create_appointment
REST endpointPOST https://cotlet.dev/api/v1/hero-software/projects/{project_id}/appointments
| Name | Type | Description |
|---|---|---|
| project_id string required | string | Project ID from list_projects. |
| title string required | string | Appointment title. |
| starts_at string required | string | Start, ISO 8601 with offset. |
| ends_at string required | string | End, ISO 8601 with offset. |
| assigned array | array | Names of team members to assign. |
{
"project_id": "project_8c41d2",
"title": "title",
"starts_at": "starts at",
"ends_at": "ends at"
} {
"appointment_id": "e-5520",
"title": "Fit tap set",
"starts_at": "2026-11-18T08:00:00+01:00",
"assigned": [
"Jonas"
]
} Your signed-in HERO browser profile, AES-256-GCM encrypted, in Finland. Never your password.
The 15 HERO Software tools. The session stays in the Cloud Browser.
The projects, contacts, documents and calendar your HERO user has rights to, and nothing more.
HERO Command, Voice and Report, HERO Wallet payments and bank matching, time tracking and staff records, your licences, plan and company settings.
You sign in again yourself, in the same Cloud Browser.
Disable HERO for agents, reset the browser, or change your HERO password.
You type your HERO password yourself; the agent only works in the session your sign-in leaves. Our site scores A+ on Qualys SSL Labs, securityheaders.com and Mozilla Observatory (live results).
The agent works through the project, document and calendar pages you use, so it keeps working when HERO updates them. Cotlet watches the apps it serves and updates the HERO server when HERO changes.
New HERO features become available to the agent. It still sees only what your HERO user and its rights allow.
Cotlet never sees or stores your password. If HERO signs you out, one click in the Cotlet console reopens the Cloud Browser so you can sign in again.
| Action | How to put it right |
|---|---|
| Quote drafted with a wrong item | Not sent yet: correct it in the project before send_document |
| Invoice made from a quote | Not sent yet: correct or cancel it in HERO before send_document |
| Appointment on the wrong day | Move or delete it in the HERO calendar |
| Logbook entry with a mistake | Add a new entry with add_logbook_entry that corrects it |
| Emailed quote, invoice or reminder | Already with your customer: follow up with them directly |
create_invoice_from_quote, send_document, send_payment_reminder ask first: by default you confirm each of their calls, and you can switch that off per tool. The other 5 writes change only your own HERO account and run at once, like the 7 reads.
{
"name": "create_quote",
"arguments": {
"project_id": "48213",
"items": [
{
"title": "Labour",
"quantity": 8,
"unit": "h",
"unit_price": 62,
"vat_rate": 19
},
{
"title": "Tap set, chrome",
"quantity": 1,
"unit": "pc",
"unit_price": 240,
"vat_rate": 19
}
],
"intro": "Thank you for your inquiry. We offer the following work:"
}
} curl -X POST https://cotlet.dev/api/v1/hero-software/projects/48213/quotes \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"items":[{"title":"Labour","quantity":8,"unit":"h","unit_price":62,"vat_rate":19},{"title":"Tap set, chrome","quantity":1,"unit":"pc","unit_price":240,"vat_rate":19}],"intro":"Thank you for your inquiry. We offer the following work:"}' {
"document_id": "d-7731",
"type": "quote",
"number": "A-2026-0301",
"net": 736,
"vat": 139.84,
"gross": 875.84,
"sent": false
} The example quotes 8 hours of labour at 62 EUR and a 240 EUR tap set: 736.00 EUR net, 139.84 EUR VAT at 19%, 875.84 EUR gross, saved to the project and not sent. A cron job or n8n flow makes the same call over REST at /api/v1/hero-software with the same key and price, in JSON. Failed calls are free.
About $20 a monthfor a heating and plumbing business with three fitters, 3,490 credits. Your HERO plan stays as it is.
| Job | Calls | Credits |
|---|---|---|
| Morning briefing: appointments and open tasks | 2 × 22 | 440 |
| New inquiries: contact check, contact, project | 3 × 12 | 360 |
| Quotes drafted and emailed | 2 × 12 | 240 |
| Accepted quotes: read, invoice, email | 3 × 10 | 300 |
| Site notes added to the logbook | 1 × 40 | 400 |
| Appointments booked for the crew | 1 × 15 | 150 |
| Weekly overdue check and reminders | 2 × 5 | 100 |
| Cloud Browser, 30 days | 1,500 | |
| Total | 199 calls | 3,490 |
The $29 pack covers a typical month for most owners.
Credit packs are one-time purchases, not a subscription. The month above is our own example, not measured customer usage.
| Credits | Price, one time | Calls at 10 credits | Per 1,000 credits |
|---|---|---|---|
| 5,000 | $29 | 500 | $5.80 |
| 15,000 | $79 | 1,500 | $5.27 |
| 32,000 | $149 | 3,200 | $4.66 |
| 60,000 | $249 | 6,000 | $4.15 |
Only successful calls use credits; failed calls and timeouts cost nothing. At a balance of 0 calls pause, never a surprise charge. Authenticate with the Authorization: Bearer header.
| Option | What it does | Where it stops |
|---|---|---|
| HERO Command | HERO's own AI: quotes from free text or an upload, invoices from quotes, projects and time, by voice or chat. | Inside HERO only, on HERO OS (from 119 EUR a month) or OS Plus. |
| HERO Copilot | 14 automation modules for mails, tasks and appointments, set up and run by HERO. | HERO OS Plus only, from 299 EUR a month plus a paid setup. |
| HERO GraphQL and Lead API | Reads contacts, projects, documents, appointments and articles; the guide names three writes. | HERO OS and up, a key from support, and code you write and host. |
| Make | HERO's app with 5 triggers, 11 actions and 1 search: contacts, projects, logbook and document events. | The same API key; it moves data between apps, no AI agent does the office work. |
| Zapier | No HERO Software app on Zapier. | Only webhooks or code steps with your own API key. |
| n8n | No HERO node; an HTTP Request node can call the GraphQL API. | The same plan and key; you write every query. |
| GitHub MCP servers | Five community servers with 0 or 1 stars, most read only or with writes off by default. | Each needs the HERO OS API key, and you host it. |
| By hand | Open each project, quote and invoice in HERO. | Only while you are at the desk. |
If you are on HERO OS and need web form leads or contacts synced into HERO, the Lead API, GraphQL API or Make app is HERO's own route. Only Cotlet lets your agent do your daily HERO office work on every screen you use, reading and writing, from ChatGPT, Claude or any MCP client, with no API key and on the plan you have now.
Cotlet belongs to Take Group sp. z o.o., a software company registered in Poland, EU (VAT PL6342984273), working since 2019 and run by its founders Bart Krawczyk (Co-founder, CTO) and Jake Slugocki (Co-founder, SEO, sales and marketing). Questions about the HERO Software tools: contact@cotlet.dev.
Sign up free at https://cotlet.dev/signup?app=hero-software, turn on HERO Software under Integrations in the console and log in at https://login.hero-software.de/login in your Cloud Browser. Then connect your AI agent and ask it which invoices are overdue. The trial needs no card.
No. Cotlet works in your own HERO account through the web app, so it does not need the API key. HERO includes API access only in HERO OS and HERO OS Plus, not in HERO Select (hero-software.de/preise, checked 14 Nov 2026). Your user's rights in HERO still decide what the agent can open.
HERO Command is HERO's own AI inside the app, part of HERO OS and HERO OS Plus. Cotlet lets the AI you already use, Claude or ChatGPT, work in your HERO account next to your other apps. Anything that reaches a customer waits for your OK by default.
The office user whose work the agent should do. HERO gives each user rights, and the agent sees and changes only what that user can, so pick a user who can open quotes and invoices.
Only in how it is called. Both carry the same 15 tools, inputs, answers, API key and price. Agents use MCP; scripts and n8n HTTP steps use REST.
No. Cotlet is independent and not affiliated with HERO Software or HERO Software GmbH.
Free 7-day trial with 2,000 credits, no card needed.
May we use Google Analytics to see which pages help people? It sets cookies only if you accept. No ads, and we never sell data. Cookie policy