Skip to main content
Glama
Procon-Group

Cartrack Fleet MCP Server

by Procon-Group

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 build

Cartrack 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.js

For 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)

  1. In Google Cloud Console: create a project (or reuse one), enable the Google Sheets API and Google Drive API.

  2. Create a service account, generate a JSON key, save it as google-service-account.json in 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):

  1. Google Drive -> New -> Shared Drive, e.g. "Procon Fleet Dashboard", then add the service account's client_email as a member with Content Manager access.

  2. Grab the Shared Drive's ID from its URL when you open it (drive.google.com/drive/folders/<id>).

  3. 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.co

    It prints the new Sheet's ID — set that as GOOGLE_SHEET_ID in .env.

  4. For the monthly .xlsx export as a new dated file each month, create a folder inside the same Shared Drive and set GOOGLE_EXPORT_FOLDER_ID to 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.

  1. Create the "Procon Fleet — Live Dashboard" Sheet yourself (sheets.new), share it with the service account's client_email as Editor.

  2. Set GOOGLE_SHEET_ID to that Sheet's ID (the long string in its URL).

  3. Run npm run setup:tabs to pre-create every tab with headers.

  4. For the monthly .xlsx export, create one placeholder .xlsx file yourself (any content), share it with the service account as Editor, and set GOOGLE_EXPORT_FILE_ID to 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

list_vehicles

GET /vehicles

Auto-paginated. No filters by default — whole fleet.

get_vehicle_status

GET /vehicles/status

Live snapshot only, no date range. Rate-limited by Cartrack to 60 req/min.

get_trips

GET /trips (fleet) or GET /trips/{registration} (one vehicle)

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 registration to query one vehicle.

get_fuel_data

POST /fuel/consumed + POST /fuel/level (bulk, ≤24h, ≤100 vehicles) or the per-vehicle GET equivalents (≤31 days)

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:

  1. Vehicle count matches Procon's actual fleet (~41 vehicles, Electrical + Steel). If list_vehicles returns a different count, check for vehicles marked is_under_maintenance or decommissioned units still in Cartrack's system.

  2. Timestamps line up with Namibia local time (UTC+2). The OpenAPI spec's date schema ("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. Call get_vehicle_status for a vehicle you can see in person right now and compare location.updated / event_ts against the actual wall-clock time. If it's off by 2 hours (or by the vehicle's DST-naive local offset), adjust dateWindow.ts and the request-building code in cartrackClient.ts accordingly — right now both assume the API wants/returns values already in local time in that plain format.

  3. 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=false

CartrackConfig 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, Fuelappended, one row per vehicle per sync, so history accumulates day over day.

  • Flagsreplaced 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/END in syncDaily.ts if Procon's hours differ).

    • No job-site match: a trip where Cartrack matched no geofence at either end (start_geofence_name/end_geofence_name both 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_DEVIATION in syncDaily.ts if 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 Reconciliation tab 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) get Flagged = 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_speed units — the /trips schema example suggests meters/second, while the vehicle-level max_speed in /vehicles looks 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_distance across days expecting an exact daily total; if that's ever needed, use the dedicated odometer endpoint instead.

  • get_vehicle_status has no pagination — for a ~41-vehicle fleet this is fine, but if the fleet grows a lot, revisit.

Available Tools

4 tools
get_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
registrationNoExact registration to get fuel data for one vehicle instead of the whole fleet.
end_timestampNoRange end, "YYYY-MM-DD HH:MM:SS". Defaults to now (Namibia local time).
start_timestampNoRange start, "YYYY-MM-DD HH:MM:SS". Defaults to 24 hours before now (Namibia local time).

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
registrationNoExact registration to get trips for one vehicle instead of the whole fleet.
end_timestampNoRange end, "YYYY-MM-DD HH:MM:SS". Defaults to now (Namibia local time).
include_privateNoInclude trips marked private. Defaults to false.
start_timestampNoRange start, "YYYY-MM-DD HH:MM:SS". Defaults to 24 hours before now (Namibia local time).

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
ignitionNoFilter to vehicles with ignition on (true) or off (false).
vehicle_idNoFilter to one vehicle by exact Cartrack vehicle ID.
registrationNoFilter to one vehicle by registration (partial match).

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
colourNo
model_yearNo
vehicle_idNoExact Cartrack vehicle ID, to filter to one vehicle.
manufacturerNo
registrationNoPartial/case-insensitive registration match, to filter to one vehicle.
chassis_numberNo

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

A4.4/5.0
Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

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

Related MCP Servers

Latest Blog Posts

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