Developers
Konvoi MCP server
Connect Claude, ChatGPT, Cursor or your own scripts to your fleet data in Konvoi over the Model Context Protocol.
Server URL
https://konvoi.ai/api/mcp
Private betaKonvoi Dispatch and AI clients are in private beta and are switched on per workspace.
Requirements
| Workspace | Dispatch and AI clients (MCP) switched on |
|---|---|
| Sign-in | Your Konvoi login, with your passkey or second step if you use one |
| Client | An MCP client that connects to remote servers over HTTP with OAuth |
Connect
Claude
- Settings → Connectors
- Add custom connector
- Paste the server URL
- Sign in to Konvoi and allow access
ChatGPT
- Settings → Connectors → Advanced
- Turn on Developer mode
- Create a connector with the server URL, authentication OAuth
- Sign in to Konvoi and allow access
Claude Code
Run in a terminal:
claude mcp add --transport http konvoi https://konvoi.ai/api/mcp Run /mcp in Claude Code and sign in to Konvoi
Cursor · VS Code
- Cursor: add to ~/.cursor/mcp.json
- VS Code: MCP: Add Server → HTTP → paste the server URL
- Sign in to Konvoi when asked
{
"mcpServers": {
"konvoi": {
"url": "https://konvoi.ai/api/mcp"
}
}
} Scripts
Personal tokens: Profile → AI clients → Create personal token
curl -s https://konvoi.ai/api/mcp \
-H "Authorization: Bearer $KONVOI_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-06-18",
"capabilities": {},
"clientInfo": {
"name": "curl",
"version": "1.0"
}
}
}' curl -s https://konvoi.ai/api/mcp \
-H "Authorization: Bearer $KONVOI_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}' curl -s https://konvoi.ai/api/mcp \
-H "Authorization: Bearer $KONVOI_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"list_workspaces","arguments":{}}}' What it can reach
- Every workspace you can open where Dispatch and AI clients are on, with your role in that workspace.
- When you connect you can limit it to some workspaces and leave out Propose changes.
- A workspace admin can remove a connection from their workspace in Dispatch → Connect.
- Profile → AI clients lists your connections; Disconnect ends one at once.
Tools
Read tools look things up with your role. propose_* tools create a proposal and change nothing themselves.
Account
- whoami
- Who this connection acts for: the person, the connection's scopes, and the default workspace when there is exactly one. Any role
- list_workspaces
- Every workspace this connection can open: slug, name, organisation, the person's role, whether Dispatch is on, and the vehicle count. Any role
- fleet_overview
- Headline numbers for one or more workspaces side by side: vehicles, drivers, open fines, open fuel cases, silent trackers and fleet fuel use (median L/100 km over the last 30 days). Minimum role: VIEWER
Fleet
- search_fleet
- Search across the entire workspace for vehicles, drivers, fines, invoices, fuelings, emails, inspections, incidents, and contacts. Minimum role: VIEWER
- list_vehicles
- List the fleet page by page: plate, name, make, model, year, type, VIN, primary driver and whether it is active. Minimum role: VIEWER
- get_vehicle
- Get full details of a specific vehicle including its documents, ownership history, odometer readings, and fine count. Minimum role: VIEWER
- get_vehicle_tco
- Get Total Cost of Ownership (TCO) breakdown for a specific vehicle, including invoices by category and fuel costs. Minimum role: VIEWER
- list_drivers
- List the drivers page by page: name, e-mail, phone, external id, licence validity and whether they are active. Minimum role: VIEWER
- get_driver
- Get full details of a specific driver including their vehicle assignments, license information, and fine count. Minimum role: VIEWER
- list_contacts
- List workspace contacts (insurance companies, leasing companies, garages, etc.). Minimum role: VIEWER
- get_fleet_alerts
- Get fleet health alerts for the workspace. Minimum role: VIEWER
- find_duplicate_vehicles
- Find vehicle records that may be the same vehicle twice: same plate, same VIN, VINs one or two characters apart (a misread 0/O, 1/I, 8/B), plates one character apart on the same make, or a VIN typed into the plate field. Minimum role: VIEWER
- list_permits
- List the exceptional-transport permits: number, holder, category, validity, status and the vehicles on each. Minimum role: VIEWER
- get_permit
- Read one permit in full: vehicles, route legs, conditions, validity in the issuing country's days. Minimum role: VIEWER
- list_inspections
- List vehicle inspections, newest first: vehicle, type, status, odometer, defects found, photo count and the evidence-seal status. Minimum role: VIEWER
- get_inspection
- Read one inspection: vehicle, status, odometer, the photos taken (category and notes), the damage analysis and warning lights, and the seal status. Minimum role: VIEWER
Fines and documents
- list_fines
- List traffic fines in the workspace with optional filters. Minimum role: VIEWER
- get_fine
- Get full details of a specific traffic fine including the associated vehicle, driver, payment information, and document. Minimum role: VIEWER
- list_document_reviews
- List documents in the review inbox that need human verification. Minimum role: VIEWER
- list_document_requests
- List document requests sent to contacts (insurance companies, leasing companies, garages, etc.). Minimum role: VIEWER
- get_document
- Get full details of an uploaded document: its classification, processing status, the records it produced (results: permits, fines, invoices with their fuelings, vehicle documents, driver licences, incidents, vehicle imp… Minimum role: VIEWER
- read_document
- Read any uploaded file (document page, inbox attachment, review item): PDF text layer, OCR for scans and photos, spreadsheets. Minimum role: VIEWER
Fuel
- query_fuelings
- Query fuel transactions with filters (date range, vehicle, plate, card, min quantity). Minimum role: VIEWER
- get_fuel_consumption
- The Consumption page numbers from the CAN counter: L/100 km while driving, litres, distance and idle share per driver (default) or per vehicle, over the last days (default 30, max 120), with the fleet baseline (p10/medi… Minimum role: VIEWER
- get_fuel_ledger
- Read one vehicle's fuel ledger over a window: every fill seen at the tank or on a card, with level from→to, litres into the tank, card litres, the delta (tank − card), station, driver and flags, plus the tank capacity u… Minimum role: VIEWER
- query_fuel_cases
- List fuel-integrity cases (open, held or resolved) for the workspace or one vehicle, with their unexplained litres and value at risk. Minimum role: VIEWER
- get_fuel_readiness
- Whether Fuel Watch can judge this fleet: per vehicle which inputs are there (level sensor, CAN fuel counter, fuel cards, tank size) over the last days (default 30), and what is missing. Minimum role: VIEWER
Telemetry and places
- fleet_now
- What every tracked vehicle is doing right now: DRIVING, STOPPED (ignition on), PARKED, NOT_DRIVEN (tracker reporting, not moved for the Fleet Health idle days, 7 by default) or NO_SIGNAL (tracker silent — whether it mov… Minimum role: VIEWER
- locate_vehicle
- Where was a vehicle at a moment: the telemetry position nearest to at (within toleranceMinutes, default 120), with speed, ignition and how many minutes the fix is from the moment. Minimum role: VIEWER
- vehicle_whereabouts
- Track a vehicle around a moment or over a window, per tracker: sample counts, the largest gap, coverage, and the fix nearest to the moment (or to a reference point refLat/refLng, with its distance). Minimum role: VIEWER
- list_vehicle_positions
- Latest known position per vehicle as delivered by its primary tracker: lat/lng, speed, heading, ignition, battery, odometer (real CAN or GPS estimate), recorded time, hours since, and which provider/device reported it. Minimum role: VIEWER
- list_trackers
- List telematics trackers/devices discovered from the providers (Ruptela, Transics, PAJ, …) with their IMEI, provider device id, provider label, the linked vehicle (plate), link status (LINKED/UNMATCHED/IGNORED/CONFLICT)… Minimum role: VIEWER
- list_tracker_events
- Events the trackers raised (POWER_LOST, DISCONNECTED, SOS, GEOFENCE_ENTER/EXIT, provider alarms, …) with severity, message, location and time. Minimum role: VIEWER
- list_telemetry_signals
- Discover which telemetry signals a vehicle (or the fleet) actually emits, with basic stats (count, min, max, last). Minimum role: VIEWER
- get_telemetry_timeseries
- Fetch the downsampled raw (and optionally derived) time-series for ONE vehicle over a window, so you can inspect the data — read the fuel curve, find the exact drop, pick a threshold, or benchmark against fleet norms. Minimum role: VIEWER
- query_telemetry_data
- Generic, bounded query over everything the telemetry sources deliver. Minimum role: VIEWER · Heavy
- run_telemetry_report
- Answer behavioural questions about vehicle GPS/telemetry OVER TIME, across one or many vehicles and any tracker provider (Ruptela, Teltonika, etc.). Minimum role: VIEWER · Heavy
- run_telemetry_analysis
- Run a composable detector analysis across one or many vehicles. Minimum role: VIEWER · Heavy
- search_places
- Find places (geofences) in this workspace — depots, customer sites, fuel stations, workshops, parkings. Minimum role: VIEWER
- place_visits
- Visits of vehicles to known places (depots, customers, fuel stations): entered/left times, newest first. Minimum role: VIEWER
Reports and boards
- list_reports
- List the saved smart reports: id, name, description, number of sections, number of runs and the latest run. Minimum role: VIEWER
- run_report
- Run a saved smart report now (list_reports gives the id) and return its sections with their rows (max 1000 per section). Minimum role: USER · Heavy
- query_report_rows
- Query enriched report rows (e.g. night-allowance claims from the nightly Nachtrapport) across runs, by the day the claim is about. Minimum role: VIEWER
- list_boards
- List the fleet boards (wall reports): the built-in ones and the ones made from a sentence, with their key, title and description. Minimum role: VIEWER
- read_board
- Read a fleet board's current numbers (list_boards gives the key), over its saved period or the last days. Minimum role: VIEWER
- draft_board
- Draft a fleet board from a sentence ("fuel per driver for the Antwerp trucks, this month"). Minimum role: USER · Heavy
Dispatch
- list_pending_proposals
- Changes waiting for a person: proposals from chat or an AI client, and standing-order steps held for approval, newest first. Minimum role: VIEWER
- list_standing_orders
- The standing orders Dispatch runs for this workspace: name, trigger, whether it is on, its autonomy rung (how much it may do without a person) and how often it ran. Minimum role: VIEWER
Changes
- propose_fine_assignment
- Propose assigning a fine to the driver on record (matched by plate and violation date). Minimum role: USER
- propose_place
- Propose saving a place (depot, customer, fuel station) with its geofence. Minimum role: USER
- propose_board
- Propose saving a fleet board: a draft_board spec, or a sentence to draft and save. Minimum role: USER
- propose_vehicle_changes
- Propose creating or updating vehicles in bulk (from a list or a file). Minimum role: USER · Admin approves
- propose_vehicle_merge
- Propose merging duplicate vehicle records (same truck from a telematics sync and a registration import, or a plate/VIN typo): everything on the duplicate moves to the kept vehicle and the duplicate is removed. Minimum role: ADMIN · Admin approves
- propose_document_request
- Propose e-mailing a contact to ask for a missing document. Minimum role: ADMIN · Admin approves
- propose_archive_document
- Propose archiving an uploaded document. Minimum role: USER · Admin approves
- propose_driver_message
- Propose a message to a driver's phone (push + the Konvoi app's inbox), optionally with a link to an app screen or an https address. Minimum role: USER · Admin approves
- propose_close_fuel_case
- Propose closing a fuel case with a resolution and a note. Minimum role: USER · Admin approves
- propose_standing_order
- Propose a standing order: a rule Dispatch runs on a trigger (it starts at proposal-only autonomy). Minimum role: ADMIN · Admin approves
- propose_scheduled_report
- Propose emailing a report on a schedule: the read calls you used (with rolling dates like "today-7d"), recipients, a cron in a timezone, and xlsx/csv/pdf. Minimum role: USER · Admin approves
Changes are proposals
- A propose_* tool changes nothing itself. It creates a proposal in Konvoi Dispatch and returns its link.
- Everyday proposals: approve or reject in the client when it can ask you, otherwise in Konvoi Dispatch.
- Proposals marked Admin approves: a workspace admin approves them in Konvoi Dispatch.
- An approved change runs as the person who approves it, with their role. Every call and decision is logged.
- Proposing needs the Propose changes access, chosen when you connect.
Prompts
- Handle this week’s fines
- Match each open fine to a driver, propose assignments, flag contest candidates.
- fine-triage
- Sweep fuel for anomalies
- Impossible fills vs tank size, off-hours fills at the depot, duplicate charges.
- fuel-anomaly
- What expires in the next 30 days
- Technical inspections, insurance, registrations and licenses coming due.
- expiry-sweep
- Weekly fleet review
- Utilization, idle vehicles, telemetry highlights — one digest.
- weekly-telemetry
Limits
| Per connection | 120 calls per minute, 5 at a time |
|---|---|
| Heavy tools | 10 calls per minute per connection |
| Per person | 300 calls per minute across all connections |
| Result size | 100 KB; longer lists are shortened and the result says what was cut |
| Over a limit | RATE_LIMITED, with the seconds to wait |
Security
- Tokens are random strings stored only as a hash. Access tokens last 1 hour; refresh tokens rotate on every use and lapse after 30 days unused; personal tokens last 30, 90 or 365 days.
- All your connections are revoked at once when you change your password, log out everywhere or turn two-factor authentication off.
- Presenting an old refresh token again revokes that connection.
- Connections do not follow the session lock. Allowing a connection needs a fully unlocked session.
- Text from outside Konvoi, such as scanned documents and e-mails, is marked {"untrusted": true}. Clients are told to treat it as data, never as instructions.
- Data you ask about is sent to the client you use.
Troubleshooting
| WORKSPACE_REQUIRED | The connection reaches several workspaces. Pass workspace, a slug from list_workspaces. |
|---|---|
| WORKSPACE_NOT_FOUND | The slug is wrong or the workspace is not on this connection. Check list_workspaces. |
| DISPATCH_OFF | Dispatch or AI clients is off for that workspace. Ask a workspace admin. |
| ROLE_REQUIRED | Your role in that workspace is below the tool’s minimum role. |
| SCOPE_REQUIRED | The connection has no Propose changes. Connect again and tick it. |
| RATE_LIMITED | Wait the number of seconds in the message. |
| INVALID_ARGUMENTS | The arguments do not match the tool’s input schema. |
| 401 | The token expired or was revoked. Sign in again from the client. |
Protocol reference
| Endpoint | POST https://konvoi.ai/api/mcp |
|---|---|
| Transport | Streamable HTTP, stateless: POST only, no Mcp-Session-Id; GET and DELETE answer 405 |
| Authorization server metadata | /.well-known/oauth-authorization-server |
| Protected resource metadata | /.well-known/oauth-protected-resource |
| OAuth endpoints | authorize /oauth/authorize · token /api/oauth/token · register /api/oauth/register · revoke /api/oauth/revoke |
| Client registration | Client ID Metadata Documents (an https client_id), or Dynamic Client Registration (RFC 7591), 10 per hour per IP |
| PKCE | S256, required |
| Resource indicator | resource=https://konvoi.ai/api/mcp (RFC 8707); tokens are bound to it |
| Redirect URIs | https, exact match; http only on 127.0.0.1 or localhost, any port |
| Scopes | fleet:read (always), fleet:propose (propose_* tools) |
| Token lifetimes | code 60 s · access 1 h · refresh 30 days idle, rotating · personal 30/90/365 days |
| No or bad token | 401 with WWW-Authenticate: Bearer resource_metadata=… |
| Tool errors | A tool result with isError: true and structuredContent.error = { code, message } |