MCP server and skill

Your fleet, in the agentyou already have open.

FleetAI is an MCP server as well as a chat app. Connect Claude, ChatGPT, Codex, Cursor or VS Code to your Wialon account, sign in with Wialon once, and ask about it where you are already working. A skill ships with it, so the agent knows how Wialon behaves before it asks anything.

  • Nineteen tools, thirty-seven operations in all, every one read-only
  • Sign in on Wialon’s own page — FleetAI never sees your password
  • Positions come back as a map in the chat, where the client can draw one
  • A report comes back inside the answer, as the file Wialon renders
claude plugin marketplace add assettrackhq/wialon-mcp
claude plugin install wialon@wialon-mcp

Then /mcp → fleetai → Authenticate, and sign in with Wialon.

Install

Wherever your agent lives

One URL. The first time the client connects, it opens a page to sign in with Wialon — no token to copy, no account here. A token still works for scripts and clients without a browser; that is under configuration.

claude plugin marketplace add assettrackhq/wialon-mcp
claude plugin install wialon@wialon-mcp

Then run /mcp, pick fleetai and choose Authenticate — a browser page opens to sign in with Wialon. The server alone, without the skill files, is claude mcp add --transport http fleetai https://ai.theassettrack.com/mcp.

Check it took

Ask the agent how many vehicles are online. A number means it is connected; an agent that says it has no fleet tools is covered under when it goes wrong.

Signing in

Wialon’s login page, not ours

Sign-in is OAuth, the way MCP clients expect it. The server keeps no record of it: client ids, codes and tokens are sealed with a server secret, so nothing has to be stored to check them. What your client holds is the Wialon token, encrypted, and it sends it with each request.

  1. 01
    Pick your data centre

    The client opens a page of ours in your browser. Choose hosting.wialon.com, .eu or .us — wherever your account lives.

  2. 02
    Sign in on Wialon

    You land on Wialon’s own login page and sign in there. FleetAI never sees your password.

  3. 03
    Wialon issues a view-only token

    Online tracking and view access, nothing that modifies, valid for 30 days. It is listed in your Wialon user settings under Access tokens as “FleetAI MCP”.

  4. 04
    Delete it to end access

    Deleting that token in Wialon locks out every client holding it. After 30 days the client asks you to sign in again.

The skill

Tools are reach. A skill is judgement.

An agent with the tools can read your account. An agent with the skill knows what the numbers mean — which is the difference between an answer and a confident wrong answer. It is written from the things this account taught us, and it comes with the server.

Comes with the server

The server hands the skill to the agent as its instructions when the client connects — which tool answers what, and the rules that decide whether an answer is right. A client that reconnects has the current version.

Or as files

Agents that load skills on demand do better with it on disk. The Claude Code plugin installs it with the server; for any other agent:

npx skills add assettrackhq/wialon-mcp

The source, and the place for issues: github.com/assettrackhq/wialon-mcp.

What it tells the agent
  • A reading is only current if the position behind it is

    Every vehicle carries how many minutes old its position is, and every sensor how old its value is. A speed of 13 km/h recorded in April is not a moving truck.

  • null means nobody measured it

    Unknown, never zero. An unreadable fuel sensor is not an empty tank, and the two are answered differently.

  • Relative dates belong to the tool

    analyze_trips takes a named period. An agent that works out "last 7 days" itself reports today’s driving under yesterday’s name.

  • A report runs and exports in one call

    Wialon keeps one report result per session, so running and exporting as two steps would export whatever ran in between.

  • Machine statuses translate

    no_messages is "has never reported", no_actual_state is "no current data". Neither a raw status code nor an internal unit id is ever shown to a person.

  • Say what is missing

    What the account reaches is what can be answered. Out of reach is said plainly, never filled in with a plausible figure.

Configuration

Signing in needs only the URL

With OAuth there is nothing else to set. For a script, or a client with no browser to sign in through, send a Wialon access token yourself — in a header, never in the URL, which clients and proxies write into their logs far more readily.

https://ai.theassettrack.com/mcpurl

The whole setup when you sign in. Streamable HTTP; the data centre is chosen on the sign-in page.

Authorization: Bearer <token>header

Instead of signing in: an access token you created in your Wialon user settings, sent with every request. The server acts as that token.

?region=eu | ?region=usquery

With a token only: the data centre your account is on, appended to the URL. Leave it off for hosting.wialon.com.

With a token, in Claude Code
claude mcp add --transport http fleetai \
  "https://ai.theassettrack.com/mcp?region=eu" \
  --header "Authorization: Bearer <your token>"

A token is minted at one data centre and is meaningless at the others — hosting.wialon.com, .eu and .us are three separate worlds. With a token, the region is the first thing to check when nothing authenticates. Signing in asks for it on the page instead.

What it exposes

Nineteen tools, thirty-seven answers

Eighteen tools answer fleet questions directly. The nineteenth is one door to nineteen more Wialon operations, with a catalogue instead of nineteen schemas in every call. Each one is marked read-only to the client, so it does not ask you to confirm every call.

Direct18 tools
Where they are
  • get_fleet_statusCounts, and every unit with its freshness
  • get_vehicle_locationWhere one vehicle is, and when it said so
  • get_all_vehicle_locationsThe whole fleet, each position with its age
  • find_nearest_vehiclesClosest to an address, a geofence or a point
Trips and use
  • analyze_tripsTrips over a named period, never a computed one
  • get_trip_summaryDistance, engine hours, idling, per unit
  • get_trip_trackThe positions of one drive, for a map
  • get_utilizationHow hard the fleet is actually worked
  • get_idlingIdle time, and the fuel burnt standing still
  • get_geofence_visitsWho was in a geofence, when, for how long
Fuel
  • check_fuel_levelsWho is low, and whose sensor cannot be read
  • get_fuel_eventsFills and suspected drains over a period
Drivers and vehicles
  • get_driversDrivers and the vehicles they are bound to
  • get_driving_behaviorEco-driving violations and a score, ranked
  • get_vehicle_infoOne unit in full — sensors, service, fault codes
  • get_maintenance_statusService intervals and what is overdue
The whole fleet
  • get_fleet_analyticsFleet-wide numbers over a period
  • get_fleet_digestWhat changed since yesterday, in one answer

get_vehicle_info includes engine fault codes (DTC) when the unit reports them.

wialon_api19 operations
  • The account
    check_connection · search_units · list_groups · list_resources · get_account_snapshot
  • One unit
    get_unit_briefing · get_sensors_now · get_last_messages · get_messages_interval
  • Geofences
    list_geofences · list_notifications
  • Reports
    list_saved_reports · run_saved_report · run_temporary_report · get_report_catalog · fetch_more_report_rows · export_report
  • Audits
    audit_notifications · audit_unit_settings

Call an operation with no arguments and it answers with its own schema, so an agent never has to guess what it takes.

A map in the chat

In clients that support MCP Apps — Claude, ChatGPT and others — the location tools draw an interactive map inline in the conversation. A position more than an hour old is drawn greyed and dashed, so a stale one cannot pass for current. Other clients get the same answer as text.

get_vehicle_location · get_all_vehicle_locations · find_nearest_vehicles · get_trip_track
Recipes

What a question turns into

These are in the skill, so the agent reaches for them without being told. They are here because they are also the clearest description of what the server can do.

“Which trucks are low on fuel?”

check_fuel_levels

Reads fuelUnit before calling anything low — litres and percent are different facts — and lists units whose sensor is unreadable separately rather than counting them as empty.

“Has anyone drained fuel this week?”

get_fuel_events

Fills and suspected drains across the fleet, per vehicle. Ask about one truck and each event comes with its time, place and tank levels.

“Who drove worst last month?”

get_driving_behavior

A score and violations per 100 km for every driver, ranked, from Wialon’s own eco-driving and speeding reports.

“Which truck is closest to Storgatan 1, Örebro?”

find_nearest_vehicles

The address becomes a point, and every vehicle is ranked by straight-line distance from its last position — as the crow flies, not by road.

“Who was at the depot today and for how long?”

get_geofence_visits

Each vehicle that entered the geofence, its first entry and last exit, and the time it spent inside.

“What changed since yesterday?”

get_fleet_digest

Distance, fuel events, violations, units gone offline and service now overdue, against the day before — one call rather than five.

“How far did each vehicle drive last week?”

analyze_trips · get_fleet_analytics

A named period, so the week is the week Wialon means. Totals come from the fleet-wide tool rather than ninety-six per-unit calls.

“Show me Friday's route for Van 023”

wialon_search_units → analyze_trips → get_trip_track

The unit id first, then the day, then the positions of the one drive in question — drawn on a map where the client can show one.

“Run my mileage report for last week as a PDF”

wialon_list_saved_reports → wialon_export_report

Your own saved template, run and exported in one call. The file Wialon itself rendered comes back inside the answer — the same document its Export button produces.

“Is the account set up properly?”

wialon_audit_notifications · wialon_audit_unit_settings

Geofences with no notification on them, units sending no fuel sensor, settings that quietly stopped making sense.

When it goes wrong

The six failures worth knowing

Most of them are the connection or the sign-in, and both are quick to check.

The agent says it has no fleet tools

The client has not connected, or has not signed in. Check the config file is the one that client reads and restart it — most read their MCP config only at startup — then look for a sign-in or Authenticate step in its MCP settings.

The client asks you to sign in again

The 30 days are up, or the “FleetAI MCP” token was deleted in Wialon. Sign in again and Wialon issues a new one.

With a token, every call fails with an authentication error

Almost always the region. A token is minted at one data centre and is meaningless at the others, so add ?region=eu or ?region=us to the URL if your account is not on hosting.wialon.com. After that, check the header reads Bearer, a space, then the token. Signing in has no such step: the data centre is picked on the sign-in page.

"The connection to Wialon dropped"

Wialon error 1: the session is gone. Retrying the same call will not help — sign in again, or, with a token, check it is still valid and has not expired or been deleted.

The exported report is missing

An empty interval answers with zero rows and no file, on purpose, rather than handing over an empty document. Widen the dates or check the unit reported at all.

A question about raw messages takes forever

A fleet-week of raw messages is megabytes. Ask for one unit over a bounded interval, and prefer the current sensor values when the question is about now.

What it cannot do

An agent with read access

Signing in gives a server of ours a view-only key to your account. Here is exactly what that server can do with it.

Read-only

Every tool reads, and says so to the client. The token Wialon issues at sign-in is view-only, so it could not change your account if anything asked it to.

Nothing stored

Sign-in codes and tokens are sealed with a server secret rather than kept in a database. The Wialon session lives in memory for a few idle minutes, and no log line carries the token or the session.

Never echoed

Wialon names the session in some of its errors, so the credential is stripped out of every answer before it reaches the model.

No web pages

A request that carries a browser Origin is refused, so a website you visit cannot call the server as you.

Delete “FleetAI MCP” under Access tokens in your Wialon user settings and every client holding it is locked out the same second.

Would rather just ask?

The chat app is the same tools with a dashboard, a live map and somewhere to put the answer. Nothing to install.

Open the app