Developer
MCP Server
The TrackOut MCP server lets AI agents access your garage data through the Model Context Protocol. No local install required -- just configure your agent with a URL and API key.
Setup
Prerequisites
- An API key from your TrackOut Settings page
Configure your agent
Add TrackOut to your agent's MCP configuration. For Claude Code, add to .claude/mcp.json:
{
"mcpServers": {
"trackout": {
"type": "url",
"url": "https://trackout.app/api/mcp",
"headers": {
"Authorization": "Bearer tok_..."
}
}
}
}
Replace tok_... with your API key from Settings.
Available tools
Once connected, the following tools are available to your agent:
Cars
| Tool | Description |
|---|---|
list_cars | List all cars in your garage with nickname, make, model, trim, year, and mileage |
get_car | Get full details for a specific car including trim, color, VIN, and price |
create_car | Create a new car with nickname, make, model, trim, year, color, VIN, and mileage |
update_car | Update any field on an existing car by car ID |
Parts
| Tool | Description |
|---|---|
list_parts | List parts, optionally filtered by car |
create_part | Create a new part with name, manufacturer, part number, purchase details, and status |
Service records
| Tool | Description |
|---|---|
list_service_records | List service records, optionally filtered by car |
create_service_record | Create a new service record with name, type, mileage, cost, date, notes, and an optional linked receipt ID |
list_service_types | List valid service type values (use before creating records) |
update_service_record | Update any field on an existing service record by ID |
Installers
| Tool | Description |
|---|---|
list_installers | List your saved service shops and installers |
create_installer | Add a new installer by name |
Track sessions
| Tool | Description |
|---|---|
list_track_sessions | List track sessions, optionally filtered by car |
list_track_days | List track days, optionally filtered by car |
create_track_day | Create a new track day event with car, date, and track name |
create_track_session | Create a track session within a track day with lap times and count |
Maintenance
| Tool | Description |
|---|---|
list_maintenance_rules | List recurring maintenance rules, optionally filtered by car |
create_maintenance_rule | Create a new maintenance rule with interval by miles or months |
list_maintenance_reminders | List service reminders with optional car filter and completion status |
complete_maintenance_reminder | Mark a service reminder as complete, optionally linking a service record |
Tires
| Tool | Description |
|---|---|
list_tires | List tires with brand, size, heat cycles, and mileage, optionally filtered by car |
Documents
| Tool | Description |
|---|---|
upload_document | Upload a file (base64-encoded) and receive a fileId, storageId, and file metadata |
scan_receipt | Start or poll AI receipt extraction for an uploaded receipt file or existing receipt ID. Pass wait: true to have the server watch the extraction for you |
create_records_from_receipt | Create multiple service records from reviewed receipt line items in one call |
Receipt workflow
The MCP receipt flow mirrors the TrackOut UI:
- Call
upload_documentwith a PDF or receipt image. - Call
scan_receiptwith the returnedfileIdto start extraction. - Wait for the extraction to finish, either way round:
- Let the server wait. Pass
wait: trueand the call holds open for up to 25 seconds, returning the finished extraction as soon as it is ready. If it is still running when the wait ends, you get the same in-progress response as below -- call again with itsreceiptId. - Poll yourself. Call
scan_receiptagain with either the samefileIdor the returnedreceiptIduntil the receipt is ready for review.fileIdstays valid after the file is stored encrypted.
- Let the server wait. Pass
- Create linked records with either:
create_service_recordfor a single record and passreceiptIdcreate_records_from_receiptfor a multi-line-item receipt import
create_service_record accepts a receiptId. (The HTTP API and the local stdio server also accept receiptDocumentId as a compatibility alias.)
Streaming and progress
Tools that can take a while -- today that is scan_receipt with wait: true -- report progress while they run, so your agent can show "still scanning" instead of sitting silent.
This happens automatically: if your MCP client asks for progress on a call, TrackOut answers that call as a text/event-stream and sends progress updates on it until the result arrives. Clients that do not ask for progress get the same single JSON response they always have. Nothing to configure either way.
Two things worth knowing:
- Progress is scoped to the call that asked for it. TrackOut never opens a long-lived stream of its own, so there is no background connection to keep alive or reconnect.
- A
wait: truecall is bounded at 25 seconds. That is a ceiling, not a delay -- the call returns the moment extraction finishes.
Example usage
Once configured, you can ask your agent things like:
- "List my cars"
- "Show service records for my M3"
- "Log an oil change for my 911 at 42,000 miles, cost $85"
- "What tires are installed on my track car?"
- "Add a new installer called Track Performance Shop"
- "Create a new car named 'Track Beast' -- 2024 Porsche 911 GT3"
- "Add an oil filter part for my M3"
- "Set up a recurring oil change every 5,000 miles"
- "Upload this receipt, scan it, and show me the extracted line items"
- "Create linked service records from this scanned receipt for my M3"
The agent will use the appropriate MCP tools to read or write your TrackOut data.
HTTP API
The MCP server calls the TrackOut HTTP API under the hood. If you want to build your own integration, you can call these endpoints directly:
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/v1/cars | List cars |
| GET | /api/v1/cars/get?id=... | Get car details |
| POST | /api/v1/cars | Create car |
| PATCH | /api/v1/cars | Update car (requires carId in body) |
| DELETE | /api/v1/cars | Soft-delete car (requires carId in body) |
| GET | /api/v1/service-records?carId=... | List service records |
| POST | /api/v1/service-records | Create service record, optionally linked to a receipt |
| PATCH | /api/v1/service-records | Update service record (requires id in body) |
| DELETE | /api/v1/service-records | Delete service record (requires id in body) |
| GET | /api/v1/service-types | List service type enum values |
| GET | /api/v1/installers | List installers |
| POST | /api/v1/installers | Create installer |
| GET | /api/v1/track-sessions?carId=... | List track sessions |
| POST | /api/v1/track-sessions | Create track session |
| PATCH | /api/v1/track-sessions | Update track session (requires id in body). Rejects date, startTime, endTime and sessionType changes on a session that is already complete -- those feed the tire and part counters completion applied. |
| DELETE | /api/v1/track-sessions | Delete track session (requires id in body) |
| GET | /api/v1/track-days?carId=... | List track days |
| POST | /api/v1/track-days | Create track day |
| PATCH | /api/v1/track-days | Update track day (requires id in body) |
| DELETE | /api/v1/track-days | Delete track day and its sessions (requires id in body) |
| GET | /api/v1/tires?carId=... | List tires |
| PATCH | /api/v1/tires | Update tire (requires id in body) |
| DELETE | /api/v1/tires | Delete tire (requires id in body; mounted tires are rejected) |
| GET | /api/v1/parts?carId=... | List parts |
| POST | /api/v1/parts | Create part |
| PATCH | /api/v1/parts | Update part (requires id in body) |
| DELETE | /api/v1/parts | Delete part (requires id in body) |
| GET | /api/v1/maintenance-rules?carId=... | List maintenance rules |
| POST | /api/v1/maintenance-rules | Create maintenance rule |
| PATCH | /api/v1/maintenance-rules | Update maintenance rule (requires id in body) |
| DELETE | /api/v1/maintenance-rules | Delete maintenance rule (requires id in body) |
| GET | /api/v1/maintenance-reminders?carId=...&includeComplete=... | List reminders |
| POST | /api/v1/maintenance-reminders/complete | Complete a reminder |
| GET | /api/v1/checklists?carId=... | List checklists |
| GET | /api/v1/checklists/get?id=... | Get a checklist with its items |
| POST | /api/v1/checklists | Create checklist, optionally from a template |
| GET | /api/v1/checklist-templates | List checklist templates |
| POST | /api/v1/documents/upload | Upload document (base64 content) and receive fileId |
| POST | /api/v1/receipts/scan | Start or poll receipt extraction with a fileId or receiptId |
| POST | /api/v1/receipts/create-records | Create multiple linked service records from a scanned receipt |
The HTTP API also covers update and delete operations that are not yet exposed as remote MCP tools (tires, parts, track days, track sessions, maintenance rules, and deletes generally). The locally-run @trackout/mcp-server stdio package exposes these as update_* / delete_* tools over the same endpoints.
All endpoints require an Authorization: Bearer tok_... header. The base URL for direct API calls is https://site.trackout.app.
curl -H "Authorization: Bearer tok_..." \
https://site.trackout.app/api/v1/cars
Error responses
All error responses are JSON shaped { "error": "<message>" } with an appropriate HTTP status code. The MCP route passes user-facing 4xx messages through unchanged; 5xx responses are mapped to a generic Upstream service temporarily unavailable. message on the MCP client so internal errors never leak through a tool call.
| Status | When you'll see it |
|---|---|
| 400 | Missing or invalid body/query fields |
| 401 | Missing, invalid, or revoked API token |
| 403 | Token is valid but lacks the required scope or access to the resource |
| 404 | Resource does not exist or is not owned by your account |
| 413 | Request body (or decoded upload) exceeds the limit |
| 429 | Rate limit exceeded — back off and retry |
| 5xx | Upstream error — logged server-side, generic message on the client |
Upload limits
The upload_document tool (and POST /api/v1/documents/upload) enforces:
- Encoded request body: up to 14 MB
- Decoded file: up to 10 MB
- Allowed content types:
application/pdf,image/jpeg,image/png,image/webp,image/heic,image/heif,image/gif,text/plain - Uploads per minute: up to 60 per account, the same cap the web app uses. Past that, the tool returns Upload limit reached. Please try again later. until the minute rolls over.
Requests that exceed these limits fail fast with a 4xx before bytes are persisted.
Security notes
- Authorization is driven exclusively by your API token — the MCP session ID plays no role in authorization. Every request is independently authenticated.
- The MCP endpoint is intentionally per-request stateless: it issues no
mcp-session-idat all, and keeps no server-side session store -- not even for streamed calls. There is no session key two users could collide on. - API tokens are SHA-256 hashed at rest. Revoke a compromised token from the API keys page; revocation takes effect on the next request.
- Rotate tokens periodically and prefer creating one token per agent/tool so you can revoke narrowly.
- Uploaded documents are not served at a public URL.
upload_documentreturnsurl: null; receipt images and part attachments are encrypted at rest and shown only through authenticated decrypt actions. - Requesting Delete Account in Settings immediately invalidates the API token. HTTP API calls then receive 401. MCP tools return an authentication error -- even while garage data is still being removed.