Connect your own AI agent as an AI Apprentice
GarageManager does not supply the AI. You connect your own AI agent as an apprentice, with a token you create: any AI agent that can connect to an MCP server over HTTP with a bearer token, or call a REST API, such as Claude Code. It looks things up and preps drafts. A person in your workshop signs off every draft it preps, and only a person issues or sends anything to a customer.
Connect in four steps
- In Settings, open AI Apprentice and choose Take on an AI Apprentice. Whoever can change your workshop's settings can do this; on a paid plan or a trial, that is an owner.
- Name it, choose Read only or Read and draft, and choose when its access ends: 30 days, 90 days or never.
- Copy the token. It is shown once. Then connect your agent with one of the forms below.
- When it preps a quote or an invoice, choose Awaiting sign-off on the Quotes or Invoices list and open the draft with Review. Check the lines and the total, then sign it off. Signing off sends nothing; issuing and sending stay with you.
Claude Code (macOS or Linux)
Set GM_AGENT_TOKEN to your token first, then run:
claude mcp add --transport http garagemanager https://app.garagemanager.co.za/api/agent/mcp \ --header "Authorization: Bearer $GM_AGENT_TOKEN"
Running this saves the token in Claude Code's own settings, in plain text. To keep it only in your environment, use the .mcp.json form instead.
A project's .mcp.json
Put this in a project's .mcp.json, and set GM_AGENT_TOKEN to the token in the environment your agent runs in.
{
"mcpServers": {
"garagemanager": {
"type": "http",
"url": "https://app.garagemanager.co.za/api/agent/mcp",
"headers": {
"Authorization": "Bearer ${GM_AGENT_TOKEN}"
}
}
}
}Other agents
MCP over HTTP: https://app.garagemanager.co.za/api/agent/mcp, with the header Authorization: Bearer and your token. REST: POST https://app.garagemanager.co.za/api/agent/v1/<action name> with the same header and the input as JSON. The OpenAPI description lists every action and its input.
If your agent says the GarageManager server needs authentication, the token was mistyped, has expired or was revoked. Revoke it in Settings, AI Apprentice, and take on a new AI Apprentice.
What it can do
Each action, as your agent sees it. Read only covers looking things up; Read and draft adds the rest.
workshop.get
MCP tool: workshop_get
Read only and Read and draft
Describe the workshop this token belongs to: name, VAT status, currency, plan, and how much of any plan limit is used.
Full description
Describe the workshop this token belongs to: name, VAT status, currency, plan, and how much of any plan limit is used. Call this first.
clients.list
MCP tool: clients_list
Read only and Read and draft
List the workshop's customers, newest first.
Full description
List the workshop's customers, newest first. Optional search matches name, email, phone or customer number.
clients.get
MCP tool: clients_get
Read only and Read and draft
Get one customer by id.
clients.create
MCP tool: clients_create
Read and draft
Add a customer.
Full description
Add a customer. name and email are required; the email must not belong to another customer of this workshop (a duplicate answers conflict, with the existing customer id in issues). The Free plan holds up to 5 customers. Nothing is sent to the customer. Send an idempotencyKey to make a retry safe.
clients.update
MCP tool: clients_update
Read and draft
Change a customer's details.
Full description
Change a customer's details. Only the fields you send change; send null to clear phone, whatsappNumber, address or businessRegNumber. The email and the customer number cannot be changed here: email changes are made by staff in the dashboard. Nothing is sent to the customer.
vehicles.list
MCP tool: vehicles_list
Read only and Read and draft
List vehicles, newest first.
Full description
List vehicles, newest first. Filter by customer id or by registration plate (partial match).
vehicles.get
MCP tool: vehicles_get
Read only and Read and draft
Get one vehicle by id.
vehicles.create
MCP tool: vehicles_create
Read and draft
Add a vehicle to one of the workshop's customers.
Full description
Add a vehicle to one of the workshop's customers. make, model and registrationPlate are required. A plate already on this account (ignoring letter case) answers conflict with the existing vehicle id in issues. Nothing is sent to the customer.
vehicles.update
MCP tool: vehicles_update
Read and draft
Correct a vehicle.
Full description
Correct a vehicle. Only the fields you send change; send null to clear year, vin, engineNumber or odometerKm. A vehicle cannot be moved to another customer.
jobcards.list
MCP tool: jobcards_list
Read only and Read and draft
List job cards, newest first.
Full description
List job cards, newest first. Filter by status or customer id.
jobcards.get
MCP tool: jobcards_get
Read only and Read and draft
Get one job card by id, with its line items.
jobcards.create
MCP tool: jobcards_create
Read and draft
Open a job card for a customer, BOOKED_IN, with an optional vehicle (it must be that customer's), notes and lines.
Full description
Open a job card for a customer, BOOKED_IN, with an optional vehicle (it must be that customer's), notes and lines. Each line needs a serviceName or a description, a quantity above 0, a unitPrice of 0 or more and an itemType (PART, LABOUR or OTHER). Nothing is sent to the customer.
jobcards.update
MCP tool: jobcards_update
Read and draft
Change a job card's notes (send null to clear them).
Full description
Change a job card's notes (send null to clear them). Refused once the card is INVOICED or CANCELLED. The status cannot be changed.
jobcards.set_items
MCP tool: jobcards_set_items
Read and draft
Replace a job card's lines with the list you send (an empty list removes them all).
Full description
Replace a job card's lines with the list you send (an empty list removes them all). Refused once the card is INVOICED or CANCELLED. Does not change the status. Replacing the lines detaches the service-library pins of every replaced line (each pin keeps a snapshot of its line).
quotes.list
MCP tool: quotes_list
Read only and Read and draft
List quotes, newest first.
Full description
List quotes, newest first. Filter by status or customer id.
quotes.get
MCP tool: quotes_get
Read only and Read and draft
Get one quote by id, with its line items.
quotes.create_draft
MCP tool: quotes_create_draft
Read and draft
Prepare a draft quote for one of the workshop's customers and one of that customer's vehicles.
Full description
Prepare a draft quote for one of the workshop's customers and one of that customer's vehicles. The workshop's own totals and VAT rule are applied. The quote waits for a person to sign it off before it can be sent; read awaitingSignOff with quotes.get for its current state (a repeat with the same idempotency key returns the first response, not the current one). Each line needs serviceName, a quantity above 0 and a unitPrice of 0 or more (rands, at most two decimals); itemType (PART, LABOUR, OTHER, CALLOUT), description, catalogItemId and parentServiceCatalogItemId are optional.
quotes.update_draft
MCP tool: quotes_update_draft
Read and draft
Change a draft quote your AI Apprentice prepared, while it is still a DRAFT.
Full description
Change a draft quote your AI Apprentice prepared, while it is still a DRAFT. Sending lines replaces them all. Any change clears an earlier sign-off, so a person must sign it off again. Each line needs serviceName, a quantity above 0 and a unitPrice of 0 or more (rands, at most two decimals); itemType (PART, LABOUR, OTHER, CALLOUT), description, catalogItemId and parentServiceCatalogItemId are optional.
invoices.list
MCP tool: invoices_list
Read only and Read and draft
List invoices, newest first.
Full description
List invoices, newest first. Filter by status or customer id. outstanding: true returns invoices still awaiting payment, using the same rule as the dashboard. Archived invoices are left out unless includeArchived is true.
invoices.get
MCP tool: invoices_get
Read only and Read and draft
Get one invoice by id, with its line items.
invoices.create_draft
MCP tool: invoices_create_draft
Read and draft
Prepare a draft invoice for one of the workshop's customers and one of that customer's vehicles, with its lines.
Full description
Prepare a draft invoice for one of the workshop's customers and one of that customer's vehicles, with its lines. The Free plan allows 5 invoices a month. The invoice waits for a person to sign it off before it can be issued, sent or paid; read awaitingSignOff with invoices.get for its current state (a repeat with the same idempotency key returns the first response, not the current one). Each line needs serviceName, a quantity above 0 and a unitPrice of 0 or more (rands, at most two decimals); itemType (PART, LABOUR, OTHER, CALLOUT), description, catalogItemId and parentServiceCatalogItemId are optional. Totals and VAT are computed by the workshop, never taken from you.
invoices.update_draft
MCP tool: invoices_update_draft
Read and draft
Change a draft invoice your AI Apprentice prepared, while it is still a DRAFT.
Full description
Change a draft invoice your AI Apprentice prepared, while it is still a DRAFT. Sending lines replaces them all; an odometer you do not send is left as it is. Any change clears an earlier sign-off. Each line needs serviceName, a quantity above 0 and a unitPrice of 0 or more (rands, at most two decimals); itemType (PART, LABOUR, OTHER, CALLOUT), description, catalogItemId and parentServiceCatalogItemId are optional. Totals and VAT are computed by the workshop, never taken from you.
catalog.list
MCP tool: catalog_list
Read only and Read and draft
List the workshop's catalogue of services and parts with default prices.
Full description
List the workshop's catalogue of services and parts with default prices. Archived items are left out.
reports.summary
MCP tool: reports_summary
Read only and Read and draft
The workshop's headline figures, computed by the same function as the dashboard: money awaiting payment, money overdue, average invoice value and invoice count.
actions.list
MCP tool: actions_list
Read only and Read and draft
List every action this API offers, with the permission each one needs.
| Action and MCP tool | What it does | Access level |
|---|---|---|
| workshop.getworkshop_get | Describe the workshop this token belongs to: name, VAT status, currency, plan, and how much of any plan limit is used. Call this first. | Read only and Read and draft |
| clients.listclients_list | List the workshop's customers, newest first. Optional search matches name, email, phone or customer number. | Read only and Read and draft |
| clients.getclients_get | Get one customer by id. | Read only and Read and draft |
| clients.createclients_create | Add a customer. name and email are required; the email must not belong to another customer of this workshop (a duplicate answers conflict, with the existing customer id in issues). The Free plan holds up to 5 customers. Nothing is sent to the customer. Send an idempotencyKey to make a retry safe. | Read and draft |
| clients.updateclients_update | Change a customer's details. Only the fields you send change; send null to clear phone, whatsappNumber, address or businessRegNumber. The email and the customer number cannot be changed here: email changes are made by staff in the dashboard. Nothing is sent to the customer. | Read and draft |
| vehicles.listvehicles_list | List vehicles, newest first. Filter by customer id or by registration plate (partial match). | Read only and Read and draft |
| vehicles.getvehicles_get | Get one vehicle by id. | Read only and Read and draft |
| vehicles.createvehicles_create | Add a vehicle to one of the workshop's customers. make, model and registrationPlate are required. A plate already on this account (ignoring letter case) answers conflict with the existing vehicle id in issues. Nothing is sent to the customer. | Read and draft |
| vehicles.updatevehicles_update | Correct a vehicle. Only the fields you send change; send null to clear year, vin, engineNumber or odometerKm. A vehicle cannot be moved to another customer. | Read and draft |
| jobcards.listjobcards_list | List job cards, newest first. Filter by status or customer id. | Read only and Read and draft |
| jobcards.getjobcards_get | Get one job card by id, with its line items. | Read only and Read and draft |
| jobcards.createjobcards_create | Open a job card for a customer, BOOKED_IN, with an optional vehicle (it must be that customer's), notes and lines. Each line needs a serviceName or a description, a quantity above 0, a unitPrice of 0 or more and an itemType (PART, LABOUR or OTHER). Nothing is sent to the customer. | Read and draft |
| jobcards.updatejobcards_update | Change a job card's notes (send null to clear them). Refused once the card is INVOICED or CANCELLED. The status cannot be changed. | Read and draft |
| jobcards.set_itemsjobcards_set_items | Replace a job card's lines with the list you send (an empty list removes them all). Refused once the card is INVOICED or CANCELLED. Does not change the status. Replacing the lines detaches the service-library pins of every replaced line (each pin keeps a snapshot of its line). | Read and draft |
| quotes.listquotes_list | List quotes, newest first. Filter by status or customer id. | Read only and Read and draft |
| quotes.getquotes_get | Get one quote by id, with its line items. | Read only and Read and draft |
| quotes.create_draftquotes_create_draft | Prepare a draft quote for one of the workshop's customers and one of that customer's vehicles. The workshop's own totals and VAT rule are applied. The quote waits for a person to sign it off before it can be sent; read awaitingSignOff with quotes.get for its current state (a repeat with the same idempotency key returns the first response, not the current one). Each line needs serviceName, a quantity above 0 and a unitPrice of 0 or more (rands, at most two decimals); itemType (PART, LABOUR, OTHER, CALLOUT), description, catalogItemId and parentServiceCatalogItemId are optional. | Read and draft |
| quotes.update_draftquotes_update_draft | Change a draft quote your AI Apprentice prepared, while it is still a DRAFT. Sending lines replaces them all. Any change clears an earlier sign-off, so a person must sign it off again. Each line needs serviceName, a quantity above 0 and a unitPrice of 0 or more (rands, at most two decimals); itemType (PART, LABOUR, OTHER, CALLOUT), description, catalogItemId and parentServiceCatalogItemId are optional. | Read and draft |
| invoices.listinvoices_list | List invoices, newest first. Filter by status or customer id. outstanding: true returns invoices still awaiting payment, using the same rule as the dashboard. Archived invoices are left out unless includeArchived is true. | Read only and Read and draft |
| invoices.getinvoices_get | Get one invoice by id, with its line items. | Read only and Read and draft |
| invoices.create_draftinvoices_create_draft | Prepare a draft invoice for one of the workshop's customers and one of that customer's vehicles, with its lines. The Free plan allows 5 invoices a month. The invoice waits for a person to sign it off before it can be issued, sent or paid; read awaitingSignOff with invoices.get for its current state (a repeat with the same idempotency key returns the first response, not the current one). Each line needs serviceName, a quantity above 0 and a unitPrice of 0 or more (rands, at most two decimals); itemType (PART, LABOUR, OTHER, CALLOUT), description, catalogItemId and parentServiceCatalogItemId are optional. Totals and VAT are computed by the workshop, never taken from you. | Read and draft |
| invoices.update_draftinvoices_update_draft | Change a draft invoice your AI Apprentice prepared, while it is still a DRAFT. Sending lines replaces them all; an odometer you do not send is left as it is. Any change clears an earlier sign-off. Each line needs serviceName, a quantity above 0 and a unitPrice of 0 or more (rands, at most two decimals); itemType (PART, LABOUR, OTHER, CALLOUT), description, catalogItemId and parentServiceCatalogItemId are optional. Totals and VAT are computed by the workshop, never taken from you. | Read and draft |
| catalog.listcatalog_list | List the workshop's catalogue of services and parts with default prices. Archived items are left out. | Read only and Read and draft |
| reports.summaryreports_summary | The workshop's headline figures, computed by the same function as the dashboard: money awaiting payment, money overdue, average invoice value and invoice count. | Read only and Read and draft |
| actions.listactions_list | List every action this API offers, with the permission each one needs. | Read only and Read and draft |
What it cannot do
- Issue, send or resend anything to a customer.
- Record, change or refund a payment.
- Sign off a draft, its own included. A person in your workshop does that.
- Cancel or delete a customer, vehicle, job card, quote, invoice or catalogue item. Replacing lines does remove the old lines: jobcards.set_items, quotes.update_draft and invoices.update_draft each replace every line of the job card or draft they change.
- Change a job card's status.
- Edit a quote or invoice that is no longer a draft, or a draft a person created.
- Change a customer's email address. Your staff change it in GarageManager.
- Change settings, team, branding or billing.
Limits and records
- Up to 10 active AI Apprentices per workshop.
- Up to 1 000 requests an hour for each one.
- Settings, AI Apprentice keeps a record of each action an AI Apprentice runs or tries while it has access, refused ones included.
- Anything that would go past your plan's limits, such as its number of customers or of invoices a month, is refused, and the record shows “Refused: plan limit reached”.
- When a trial ends without a plan, it can still look things up, but it cannot add, change or prep anything until a plan is chosen. The record shows “Refused: trial ended”.
- Revoking it, or its access running out, stops it at its next request.