Cartrack Fleet MCP Server
This server exposes Cartrack's Fleet API as MCP tools for fleet monitoring, trip/fuel analysis, and automated Google Sheets reconciliation.
List vehicles – returns the full fleet with registration, vehicle ID, make/model, and maintenance status; optional filters by registration, manufacturer, colour, model year, chassis, or vehicle ID.
Get vehicle status – live snapshot of ignition, speed, odometer, fuel level, and GPS position for the fleet or a single vehicle; filterable by ignition state.
Get trips – trip history with start/end locations, route coordinates, distance, duration, idle time, and driving-behavior events (harsh braking/cornering/acceleration, speeding); defaults to previous 24h and auto-chunks ranges longer than 31 days.
Get fuel data – fuel level and consumption for the whole fleet or one vehicle over a date range; bulk fleet-wide for 24h windows, per-vehicle history for wider ranges.
Daily sync – pulls the previous 24h of vehicle status, trips, and fuel into a Google Sheet, appending history and flagging idle-all-day vehicles, trips with no geofence match, and fuel-consumption anomalies.
Monthly reconciliation – compares Cartrack-measured fuel against fleet-card litres/Rand from a master workbook, flags vehicles beyond a configurable variance tolerance, and can export the live dashboard as a dated .xlsx file.
Uses Google Drive to store and manage the dashboard spreadsheet and monthly Excel exports, including creating files in Shared Drives or overwriting placeholder files.
Syncs vehicle status, trips, fuel data, and monthly reconciliation results to a Google Sheets dashboard, creating and managing tabs in a specified spreadsheet.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Cartrack Fleet MCP Servershow me the live status of all vehicles"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Cartrack Fleet MCP Server — Procon Fleet
Wraps Cartrack's Fleet API (developer.cartrack.com) as an MCP server for interactive use in
Claude Code, plus two standalone CLI scripts that a cloud Routine runs on a schedule:
sync:daily— pulls the previous 24h of vehicle status, trips, and fuel data for the whole fleet and appends it to the Procon Fleet — Live Dashboard Google Sheet.sync:monthly— compares that month's Cartrack-metered fuel per vehicle against the fleet card's litres/Rand already merged into the master workbook, and flags mismatches.
Endpoints, parameters, pagination, and rate limits below were confirmed against the live
OpenAPI spec (https://developer.cartrack.com/openapi/openapi.yaml, v1.26.0824.1) — not
guessed. See "Things to double-check with real data" at the bottom before trusting output.
1. Setup
npm install
cp .env.example .env # then fill in the values below
npm run buildCartrack credentials
CARTRACK_USERNAME/CARTRACK_PASSWORD are deliberately optional (see CartrackConfig in
src/cartrackClient.ts) and should stay blank in .env and .env.example — real credentials
never belong in this repo, tracked or not. CARTRACK_BASE_URL is not secret and stays filled
in (https://fleetapi-na.cartrack.com/rest — confirmed from Cartrack's docs: Namibia has its
own country code na, not South Africa's; Cartrack has ~26 per-country hosts total, all
shaped https://fleetapi-<cc>.cartrack.com/rest).
This machine keeps real credentials in a separate vault, not in this repo:
C:\Users\Quinton\Desktop\Claude Second Brain\API's\Enviroment secrets (read that folder's
own CLAUDE.md/README.md first). For a local run:
& "...\Enviroment secrets\Load-Secrets.ps1" cartrack -Quiet # loads into this shell session
node --env-file=.env dist/scripts/syncDaily.jsFor the cloud Routine, Cartrack access is not an environment variable at all — see "API credentials for cloud Routines" below.
Google Sheets/Drive (service account — no OAuth, works unattended)
In Google Cloud Console: create a project (or reuse one), enable the Google Sheets API and Google Drive API.
Create a service account, generate a JSON key, save it as
google-service-account.jsonin this folder (already gitignored).
Important: service accounts have zero personal Drive storage quota under Google's
current policy — they cannot create new files (a new Sheet, a new dated monthly .xlsx
export) at all unless the file lives inside a Google Workspace Shared Drive, where
storage is billed to the Drive rather than the account. This shows up as a
403 "The caller does not have permission" error that has nothing to do with API enablement
or auth being wrong — confirmed the hard way against a real project. Two paths from here,
depending on whether you have a Shared Drive available:
Path A — you have a Shared Drive (or can create one):
Google Drive -> New -> Shared Drive, e.g. "Procon Fleet Dashboard", then add the service account's
client_emailas a member with Content Manager access.Grab the Shared Drive's ID from its URL when you open it (
drive.google.com/drive/folders/<id>).Run the setup script — creates the dashboard Sheet inside that Shared Drive, shares it with your own account, and pre-creates every tab:
npm run setup:sheet -- <sharedDriveId> you@procongroup.coIt prints the new Sheet's ID — set that as
GOOGLE_SHEET_IDin.env.For the monthly
.xlsxexport as a new dated file each month, create a folder inside the same Shared Drive and setGOOGLE_EXPORT_FOLDER_IDto its ID.
Path B — no Shared Drive available (e.g. Workspace access issues, or plain personal Gmail): a human-owned file has normal storage quota, so writing rows into a Sheet you already created and shared isn't "creating a file" in the quota sense — only the service account creating a brand-new file hits the wall.
Create the "Procon Fleet — Live Dashboard" Sheet yourself (sheets.new), share it with the service account's
client_emailas Editor.Set
GOOGLE_SHEET_IDto that Sheet's ID (the long string in its URL).Run
npm run setup:tabsto pre-create every tab with headers.For the monthly
.xlsxexport, create one placeholder.xlsxfile yourself (any content), share it with the service account as Editor, and setGOOGLE_EXPORT_FILE_IDto its ID. Its content gets overwritten with the latest month's numbers each run — one recurring file with the latest snapshot, not a dated file per month (that trade-off is the price of not having a Shared Drive; switch to Path A later if that changes).
Tabs (Vehicle Status, Trips, Fuel, Flags, Monthly Reconciliation) are created by
either setup script; ensureTabs() also creates any that are still missing on every sync
run, so it's safe if you add a tab by hand later.
Registering the MCP server with Claude Code (local/interactive use)
claude mcp add cartrack-fleet -- node "<absolute-path>/dist/server.js"Claude Code will pick up .env if you run it from this directory, or set the four
CARTRACK_*/GOOGLE_* variables in your shell profile / MCP server config instead.
Related MCP server: Cariot MCP Server
2. The four tools
Tool | Cartrack endpoint(s) | Notes |
|
| Auto-paginated. No filters by default — whole fleet. |
|
| Live snapshot only, no date range. Rate-limited by Cartrack to 60 req/min. |
|
| Defaults to previous 24h. Cartrack caps each request at 31 days — longer ranges are chunked automatically. The fleet-wide endpoint has no vehicle filter at the API level; pass |
|
| Defaults to previous 24h fleet-wide, which fits the bulk endpoints in one call each. Wider ranges/single vehicle fall back to per-vehicle calls, paced to Cartrack's 10 req/min cap on the bulk endpoints. |
3. Test before scheduling anything
Run each tool manually first, against the real account:
npm run dev # starts the MCP server over stdio — drive it from Claude Code, or:Or call the underlying script paths directly for a quick sanity check without an MCP client —
e.g. add a throwaway node -e snippet importing CartrackClient.
Specifically confirm, before scheduling the daily Routine:
Vehicle count matches Procon's actual fleet (~41 vehicles, Electrical + Steel). If
list_vehiclesreturns a different count, check for vehicles markedis_under_maintenanceor decommissioned units still in Cartrack's system.Timestamps line up with Namibia local time (UTC+2). The OpenAPI spec's
dateschema ("2023-01-01 12:00:00") carries no timezone marker — it's genuinely ambiguous from the spec alone whether Cartrack expects/returns UTC or each terminal's local time. Callget_vehicle_statusfor a vehicle you can see in person right now and comparelocation.updated/event_tsagainst the actual wall-clock time. If it's off by 2 hours (or by the vehicle's DST-naive local offset), adjustdateWindow.tsand the request-building code incartrackClient.tsaccordingly — right now both assume the API wants/returns values already in local time in that plain format.A vehicle's registration format matches the Fleet Register in the fuel tracking workbook exactly (Cartrack vs. the workbook sometimes differ in spacing/hyphenation) — this matters for
syncMonthly.ts's vehicle matching.
4. Daily Routine (cloud, ~6am Namibia time)
Namibia is UTC+2 year-round (no DST), so 6am local = 04:00 UTC. Cron for the Routine:
0 4 * * *The Routine's prompt should be effectively: "Run npm run sync:daily in this repo and
report the console output." Since the whole sync — Cartrack calls, flag computation, and
Sheet writes — happens inside the script (not via separate MCP tool calls from the cloud
agent), the Routine just needs Bash access and the environment variables below.
Dashboard regeneration + publish (both Routines, since 2026-09-01)
Both the daily and monthly Routines also run npm run dashboard:generate && npm run dashboard:build, then call the Artifact tool to republish dashboard/preview.html in
place over the live "Procon Fleet Fuel Dashboard" artifact
(https://claude.ai/code/artifact/3b674af3-5d68-4117-9c66-0209d9b8bbd0) — same title and
favicon every time ("Procon Fleet Fuel Dashboard" / 🚚), so it updates rather than
forking into a new artifact. This is a second, independent step in each Routine's prompt —
it still runs even if the sync/reconciliation half fails.
Confirmed live (not assumed) that a Routine session can call the Artifact tool by firing
a disposable diagnostic prompt through the daily trigger with session_context.allowed_tools
temporarily set to ["Bash", "Artifact", "Skill"] — it successfully listed the existing
artifact and loaded the artifact-design skill. Routines default to ["Bash"] only, so
allowed_tools must include Artifact and Skill for this to work — check
job_config.ccr.session_context.allowed_tools if the publish step starts failing with a
"tool not available" style error.
No mode-splitting: generateDashboard.ts doesn't distinguish a cheap daily run from an
expensive monthly one — every run refetches the full 3-month per-vehicle window that backs
Cost/KM, Fuel Efficiency, and the Vehicle Report's Cartrack columns (~26 vehicles × 3 months
of trips), even though that window's fleet-card side (existing-fleet-data.json) only
changes when someone manually re-extracts it from the master workbook — so most days it
refetches data whose comparison values won't have moved. Deliberately kept simple rather than
adding a DASHBOARD_MODE=daily|full flag with carry-forward-from-previous-run logic; revisit
if the daily API call volume becomes a real cost/rate-limit concern.
If dashboard:generate fails, the Routine prompt tells it to retry once, then skip the
publish for that run rather than fail the whole Routine — a transient
ConnectTimeoutError to fleetapi-na.cartrack.com has already happened once in testing and
is not a code bug.
API credentials for cloud Routines — current status: not available yet
A Routine's environment variables are readable by anyone who uses that Environment on
claude.ai — fine for GOOGLE_SHEET_ID, not fine for a password. Anthropic's agent proxy
documents a mechanism for exactly this case: an API credential, attached to outbound
requests for hosts you list after the request leaves the session, so the key never reaches
the agent or the run log — see Configure cloud
environments.
Confirmed against this account on 2026-09-01: the feature doesn't actually appear in the UI. Neither the "New cloud environment" dialog nor the "Edit cloud environment" dialog for an existing environment (hover the environment in the selector → gear icon on hover) shows an API credentials section, even though the docs say Pro/Max users hold the required role automatically and should see one. Checked both the create and edit flows directly — this is very likely a documented feature still in staged/research-preview rollout, not a misconfiguration on this account. Check for it again before assuming it's still unavailable — hover the environment, click the gear, look below "Environment variables."
Until it appears, Cartrack auth uses plain Environment variables instead — the pragmatic
fallback, accepted deliberately (see the "Use plain Environment variables now" decision) given
this is a personal (not team/org) account, so "anyone using this environment" is just the
account owner. Set these on the Environment (via the gear-icon edit dialog, .env format):
CARTRACK_USERNAME
CARTRACK_PASSWORD
CARTRACK_BASE_URL
GOOGLE_SHEET_ID
GOOGLE_APPLICATION_CREDENTIALS_CONTENTS (raw JSON contents — the Environment can't see a
local file path, so this has to be the file's actual content, not a path. The Routine's
prompt tells the agent to write it to ./google-service-account.json, export
GOOGLE_APPLICATION_CREDENTIALS to that path, and delete the file again after the sync)
FLEET_TIMEZONE_OFFSET_MINUTES=120
ENABLE_GEOFENCE_FLAG=falseCartrackConfig in src/cartrackClient.ts treats username/password as optional — if API
credentials becomes available later, unset these three from the Environment, add the API
credential instead, and the client automatically stops building its own Authorization header
and relies on the proxy-injected one. No code change needed either way.
Also set Network access to Custom and add to Allowed domains (needed regardless of
which auth path Cartrack ends up using): fleetapi-na.cartrack.com (Cartrack) and
sheets.googleapis.com, www.googleapis.com, oauth2.googleapis.com (Google Sheets/Drive —
the googleapis package hits all three). The default allowlist doesn't include any of these;
requests to a domain not listed fail with 403.
Getting the actual credential values into the browser safely: don't type or paste secret
values through an AI-driven browser session — its clipboard is sandboxed and can't see the
real OS clipboard anyway, so this doesn't actually work, and typing them directly would put
the raw value in that session's own transcript. Build the .env-format block locally instead
(reads from the vault, never printed):
Set-Location "C:\Users\Quinton\Desktop\Claude Second Brain\API's\Enviroment secrets"
.\Load-Secrets.ps1 cartrack -Quiet
Set-Clipboard -Value "CARTRACK_USERNAME=$env:CARTRACK_USERNAME`nCARTRACK_PASSWORD=$env:CARTRACK_PASSWORD`nCARTRACK_BASE_URL=$env:CARTRACK_BASE_URL"then paste into the Environment variables box in your own real browser.
What it writes
Vehicle Status,Trips,Fuel— appended, one row per vehicle per sync, so history accumulates day over day.Flags— replaced each run (it's a snapshot of today's issues, not a log):Idle all day: no trips in the last 24h and ignition currently off, checked only during work hours (07:00–17:00 local — adjust
WORK_HOURS_START/ENDinsyncDaily.tsif Procon's hours differ).No job-site match: a trip where Cartrack matched no geofence at either end (
start_geofence_name/end_geofence_nameboth empty). This only works if geofences are set up in Fleetweb for Procon's job sites — if none exist yet, every trip will flag, which isn't useful. Set up geofences first, or treat this flag as informational until then.Fuel anomaly: today's fuel consumed deviates >50% from that vehicle's trailing 30-day average (needs ≥5 days of history before it starts flagging). This 50% threshold is a day-to-day noise filter, unrelated to the monthly 5% fleet-card tolerance below — tune
FUEL_ANOMALY_DEVIATIONinsyncDaily.tsif it's too noisy or too quiet.
5. Monthly reconciliation
Design choice, read before changing anything: syncMonthly.ts only reads the master
"Procon Electrical & Steel Fleet Fuel Tracking System" workbook — it never writes to it. That
workbook's formulas, charts, and recalculation order are fragile (see the
fleet-cost-workbook skill's warnings about openpyxl and recalc.py), and this runs
unattended in the cloud with nobody watching a broken chart happen. So instead:
The comparison (Cartrack litres vs. fleet-card litres/Rand per vehicle, this month) is written to a new
Monthly Reconciliationtab in the live Google Sheet — additive, reversible, safe to overwrite. Re-running for the same month replaces just that month's rows (idempotent).Vehicles beyond
CARTRACK_VARIANCE_TOLERANCE(default 5%, per your instruction) getFlagged = YES.If you want the numbers folded into the master workbook's actual Dashboard, that's still a manual step — same fleet-cost-workbook merge process as today, just with the Cartrack side of the comparison already computed and sitting in the Sheet ready to copy across.
Requires the master workbook to be in Google Drive (not just local disk) — set
MASTER_WORKBOOK_DRIVE_FILE_ID to its Drive file ID. A cloud Routine can't reach a file
that only exists on your machine.
Column matching is a best-effort guess (readWorkbookFuelTotals in syncMonthly.ts
looks for columns containing "date", "registration", "litre", and "amount"/"rand" in the
Fuel Log tab's header row). Check references/workbook-structure.md (in the fleet-cost-
workbook skill) against the actual header row before trusting this, and adjust the column-
matching if it's wrong — a silent mismatch here produces confidently wrong numbers.
Suggested schedule: monthly, a few days after the statement typically lands (adjust to Procon's actual billing cycle) — e.g. the 5th at 6am Namibia time:
0 4 5 * *Monthly .xlsx export
If GOOGLE_EXPORT_FOLDER_ID is set, syncMonthly.ts exports the whole live Sheet to .xlsx
and uploads it to that Drive folder as Procon Fleet — Live Dashboard - YYYY-MM.xlsx — the
literal Excel snapshot you asked for, alongside the Sheet itself. Leave it unset to skip.
6. Things to double-check with real data
max_speedunits — the/tripsschema example suggests meters/second, while the vehicle-levelmax_speedin/vehicleslooks like km/h. Not used in any flag logic yet; verify before displaying it anywhere user-facing.Trip-window overlap — Cartrack's docs note a trip active at any point in a requested window is returned in full even if its own timestamps fall outside it. Don't sum
trip_distanceacross days expecting an exact daily total; if that's ever needed, use the dedicated odometer endpoint instead.get_vehicle_statushas no pagination — for a ~41-vehicle fleet this is fine, but if the fleet grows a lot, revisit.
Available Tools
4 toolsget_fuel_dataGet fuel dataA
Fuel level and consumption for a date range, fleet-wide or for one vehicle. Defaults to the previous 24 hours. When no registration is given, fetches the whole fleet in one batch (Cartrack's bulk endpoints, capped at 100 vehicles and a 24-hour window); wider ranges or a single vehicle fall back to per-vehicle history, capped at 31 days per request and paced to Cartrack's 10-requests/minute limit on the bulk endpoints.
| Name | Required | Description | Default |
|---|---|---|---|
| registration | No | Exact registration to get fuel data for one vehicle instead of the whole fleet. | |
| end_timestamp | No | Range end, "YYYY-MM-DD HH:MM:SS". Defaults to now (Namibia local time). | |
| start_timestamp | No | Range start, "YYYY-MM-DD HH:MM:SS". Defaults to 24 hours before now (Namibia local time). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so richly: it discloses batch vs. per-vehicle fallback logic, vehicle and time-window caps, and rate-limit pacing. It also makes the read-only nature of the operation evident from wording like 'fetches' and 'history'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence adds operational value: purpose, defaults, batch behavior, caps, and rate limits are packed without filler. The description is dense but well organized and front-loaded with the core function before the complex fallback details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, the description adequately covers input defaults, scope selection, batch limits, per-vehicle caps, and caller pacing. It does not describe the return structure, but that is a minor gap given the strong input-side and behavioral context already provided.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameter formats are already documented; the description adds meaningful behavioral semantics by explaining that omitting registration triggers a fleet batch and that wider ranges or a single vehicle trigger per-vehicle history limits. It also states the start/end defaults, complementing the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: retrieves fuel level and consumption for a date range, scoped fleet-wide or to one vehicle. This clearly differentiates it from sibling tools like get_vehicle_status, list_vehicles, and get_trips by data type and optional scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context by explaining the default 24-hour window and the meaning of omitting registration (fleet-wide batch) versus providing it (single vehicle). It does not explicitly name alternatives or exclusions, but the fuel-specific scope makes when to use this tool reasonably clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tripsGet tripsA
Trip history for a date range: route (start/end location and coordinates), distance, duration, idle time, and driving behavior (harsh braking/cornering/acceleration, speeding events). Defaults to the previous 24 hours. Cartrack caps each request at 31 days — longer ranges are chunked automatically. Fleet-wide queries cannot be filtered by vehicle at the API level (Cartrack has no such filter on the fleet-wide endpoint); pass registration to query one vehicle directly instead.
| Name | Required | Description | Default |
|---|---|---|---|
| registration | No | Exact registration to get trips for one vehicle instead of the whole fleet. | |
| end_timestamp | No | Range end, "YYYY-MM-DD HH:MM:SS". Defaults to now (Namibia local time). | |
| include_private | No | Include trips marked private. Defaults to false. | |
| start_timestamp | No | Range start, "YYYY-MM-DD HH:MM:SS". Defaults to 24 hours before now (Namibia local time). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It goes beyond a simple summary by revealing the 24-hour default, the 31-day request cap with automatic chunking, and the critical API limitation that fleet-wide queries cannot be filtered by vehicle. These are non-obvious behaviors an agent must know to use the tool correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-organized, front-loading the returned fields before explaining defaults, limits, and filtering behavior. Every sentence contributes essential information, and no filler or tautology is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the returned data, default range, maximum range behavior, and the single-vehicle vs fleet distinction. Given the schema fully documents parameter formats and defaults, there is little else an agent needs to invoke the tool correctly. Even with no output schema, the listed fields effectively communicate the expected return contents.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already covers all four parameters with 100% coverage, setting a baseline of 3. The description adds meaningful context for the registration parameter, explaining the fleet-wide filtering limitation and how passing registration switches to a single-vehicle query. This adds value beyond the schema without duplicating it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as retrieving trip history for a date range and enumerates the exact data types returned: route, distance, duration, idle time, and driving behavior. This distinguishes it from siblings like get_vehicle_status, list_vehicles, and get_fuel_data, all of which serve different data needs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool: for historical trip data over a date range, with default behavior and the 31-day cap explained. It also gives usage guidance for the registration parameter to query a single vehicle instead of the fleet. However, it does not explicitly name sibling tools as alternatives or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_vehicle_statusGet vehicle statusA
Current status and last-known location for the fleet (or one vehicle): ignition, speed, idling, odometer, fuel level, and GPS position. This is a live snapshot, not history — there is no date range. Rate-limited to 60 requests/minute by Cartrack.
| Name | Required | Description | Default |
|---|---|---|---|
| ignition | No | Filter to vehicles with ignition on (true) or off (false). | |
| vehicle_id | No | Filter to one vehicle by exact Cartrack vehicle ID. | |
| registration | No | Filter to one vehicle by registration (partial match). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the disclosure burden and does so reasonably well. It reveals that the data is a live snapshot, not historical, that location is 'last-known' rather than guaranteed-current, and that the endpoint is rate-limited to 60 requests/minute. It does not mention authentication or error behavior, but for a simple read-status tool the key behavioral traits are exposed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the first sentence states the purpose and output fields, and the second sentence adds two crucial constraints (live snapshot, rate limit) with zero filler. Every sentence earns its place, and there is no redundant restating of the tool name or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only status tool with no required parameters and no output schema, the description covers the essential context: what data is returned, the scope (fleet vs. one vehicle), the live-snapshot limitation, and the rate limit. It does not define a formal response structure, but the listed fields serve as a practical substitute. Auth and error details are absent, but this is a low-complexity tool and the description is sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline of 3 applies. The description does not add parameter-level meaning beyond the schema, but it does not need to because each parameter (ignition, vehicle_id, registration) is already well described in the input schema. No additional explanation is necessary to invoke the tool correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description specifies a clear verb-and-resource pairing: it returns current status and last-known location, with a concrete list of fields (ignition, speed, idling, odometer, fuel level, GPS). It distinguishes itself from siblings by framing the tool as a live snapshot and explicitly contrasting it with history. The fleet-or-one-vehicle scope is also stated, leaving no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states when the tool is appropriate: for a current, live snapshot of vehicle status. It also gives an explicit exclusion: 'not history — there is no date range,' which guides an agent away from get_trips. It does not name alternatives like get_fuel_data or list_vehicles, but the scope is clear enough that an agent can route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_vehiclesList vehiclesA
Full Procon fleet vehicle list from Cartrack: registration numbers, vehicle IDs, make/model, and maintenance status. No filtering by default — returns the whole fleet (auto-paginated). Use this to match against the Fleet Register.
| Name | Required | Description | Default |
|---|---|---|---|
| colour | No | ||
| model_year | No | ||
| vehicle_id | No | Exact Cartrack vehicle ID, to filter to one vehicle. | |
| manufacturer | No | ||
| registration | No | Partial/case-insensitive registration match, to filter to one vehicle. | |
| chassis_number | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral transparency burden. It discloses that the tool returns the entire fleet by default and is auto-paginated, which is useful context not present in the schema. It does not cover response shape or data freshness, but for a read-style listing tool the disclosure is solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: source and content first, then default behavior and pagination, then the intended use case. Every sentence earns its place and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an all-optional-parameter list tool, the description provides the source, default behavior, pagination behavior, representative return fields, and a concrete use case. The missing output schema is partially offset by listing returned fields, though an explicit statement that all six properties act as optional filters would make it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33% (2 of 6 parameters documented). The description does not compensate: it only says 'No filtering by default' and never explains the other filter parameters (colour, model_year, manufacturer, chassis_number) or how filters combine. Low coverage with no compensating detail leaves the agent guessing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Full Procon fleet vehicle list from Cartrack', and enumerates the returned content (registration numbers, vehicle IDs, make/model, maintenance status). It is clearly distinct from siblings like get_vehicle_status, get_trips, and get_fuel_data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit use case: 'Use this to match against the Fleet Register.' It also clarifies the default behavior (no filtering, whole fleet, auto-paginated). It does not explicitly name alternatives or when-not-to-use cases, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool targets a distinct resource and data type: live vehicle status, the full vehicle list, trip history, and fuel data. No overlap or ambiguity between them.
Names mostly follow a get_/list_ + resource pattern, with list_vehicles being the only deviation from the get_ prefix. This is predictable and easy to navigate.
Four tools is well-scoped for a fleet data retrieval server. Each tool covers a meaningful slice of the domain without unnecessary bloat or overlap.
The core fleet data surface is covered: vehicle inventory, live status, trip history, and fuel consumption. Minor gaps exist such as driver details or location history, but nothing that blocks primary workflows.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Read-only access to your Drivara fleet — jobs, drivers, vehicles, fuel, profit & analytics.
Manage projects, tasks, time tracking, and team collaboration through natural language.
Connect AI assistants to Google Sheets through controlled tools for reading and updating rows.
AI-ready GIS, geofencing, DataSynch, CRM, inventory, routing, APIs, telemetry and workflows.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables Claude to ask questions about your fleet data via the Geotab ACE AI service, with support for multi-account authentication, async queries, and DuckDB caching for large datasets.10Apache 2.0

Cariot MCP Serverofficial
AlicenseBqualityDmaintenanceEnables querying Cariot APIs for fleet management data, including alcohol checks, daily reports, drivers, vehicles, and realtime snapshots, with utility for generating chart configurations.7291MIT- FlicenseAqualityDmaintenanceEnables AI agents to query orders, manage routes, track drivers, and analyze delivery performance on the FleetSync last-mile delivery platform through natural language.18
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with Google Sheets via natural language, supporting CRUD operations, listing, sharing, and batch updates.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Procon-Group/cartrack-fleet-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server