Skip to content

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

WorkspaceDispatch and AI clients (MCP) switched on
Sign-inYour Konvoi login, with your passkey or second step if you use one
ClientAn MCP client that connects to remote servers over HTTP with OAuth

Connect

Claude

  1. Settings → Connectors
  2. Add custom connector
  3. Paste the server URL
  4. Sign in to Konvoi and allow access

ChatGPT

  1. Settings → Connectors → Advanced
  2. Turn on Developer mode
  3. Create a connector with the server URL, authentication OAuth
  4. 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

  1. Cursor: add to ~/.cursor/mcp.json
  2. VS Code: MCP: Add Server → HTTP → paste the server URL
  3. Sign in to Konvoi when asked
{
  "mcpServers": {
    "konvoi": {
      "url": "https://konvoi.ai/api/mcp"
    }
  }
}

Scripts

Personal tokens: Profile → AI clients → Create personal token

Initialize
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"
    }
  }
}'
List tools
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"}'
Call a tool
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 connection120 calls per minute, 5 at a time
Heavy tools10 calls per minute per connection
Per person300 calls per minute across all connections
Result size100 KB; longer lists are shortened and the result says what was cut
Over a limitRATE_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_REQUIREDThe connection reaches several workspaces. Pass workspace, a slug from list_workspaces.
WORKSPACE_NOT_FOUNDThe slug is wrong or the workspace is not on this connection. Check list_workspaces.
DISPATCH_OFFDispatch or AI clients is off for that workspace. Ask a workspace admin.
ROLE_REQUIREDYour role in that workspace is below the tool’s minimum role.
SCOPE_REQUIREDThe connection has no Propose changes. Connect again and tick it.
RATE_LIMITEDWait the number of seconds in the message.
INVALID_ARGUMENTSThe arguments do not match the tool’s input schema.
401The token expired or was revoked. Sign in again from the client.

Protocol reference

EndpointPOST https://konvoi.ai/api/mcp
TransportStreamable 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 endpointsauthorize /oauth/authorize · token /api/oauth/token · register /api/oauth/register · revoke /api/oauth/revoke
Client registrationClient ID Metadata Documents (an https client_id), or Dynamic Client Registration (RFC 7591), 10 per hour per IP
PKCES256, required
Resource indicatorresource=https://konvoi.ai/api/mcp (RFC 8707); tokens are bound to it
Redirect URIshttps, exact match; http only on 127.0.0.1 or localhost, any port
Scopesfleet:read (always), fleet:propose (propose_* tools)
Token lifetimescode 60 s · access 1 h · refresh 30 days idle, rotating · personal 30/90/365 days
No or bad token401 with WWW-Authenticate: Bearer resource_metadata=…
Tool errorsA tool result with isError: true and structuredContent.error = { code, message }