Just after midnight UTC today, a 274-metre crude oil tanker called ALTURA slipped out of Novorossiysk, Russia's largest Black Sea crude export terminal. She's flagged to Sierra Leone at the time of this query, which tells you nothing about where she was built and almost nothing about who owns her. (Shadow fleet vessels re-flag frequently. ALTURA has had at least three names and flags since 2023.) At 163,750 deadweight tonnes, she's a Suezmax, designed to transit the Suez Canal fully loaded, carrying up to around a million barrels of crude. Right now she's somewhere south of Novorossiysk, heading for the Turkish Straits.
You probably don't care about any of that. Unless you trade oil.
If you do, that departure is a data point -- one of nine tankers that left Novorossiysk today alone, ranging from Suezmax crude carriers down to small coastal chemical tankers. Multiply by Primorsk, Ust-Luga, Al Jubail, and the rest of the world's export terminals, and you get the global crude supply picture: not a number in a spreadsheet, but a fleet of ships you can actually watch move.
The firms that turn this into a product -- Kpler, Vortexa, Windward -- charge serious money for it. They should; their platforms layer satellite imagery, cargo manifests, and proprietary models on top of the raw vessel data. But the raw vessel data itself? That part is more accessible than you might think.
The Oil Is on the Water
Here's the thing about seaborne crude: unlike a pipeline, it's visible.
Every tanker over 300 gross tonnes carries an AIS transponder -- a radio beacon that broadcasts position and speed every few seconds when underway, along with identity and destination data at longer intervals. Originally designed to prevent collisions, AIS has become the accidental backbone of commodity intelligence. If a VLCC loads crude at Ras Tanura and sets course for Ningbo, you can see it happen.
The signals that matter to a commodity desk are straightforward:
Departures from export terminals -- Novorossiysk, Ust-Luga, Primorsk (Russia), Al Jubail, Ras Tanura (Saudi Arabia), Basra (Iraq). Each departure is supply entering the water.
Arrivals at refinery ports -- Rotterdam, Singapore, Ningbo, Houston. Each arrival is supply being consumed.
Vessels in transit -- who's heading where, when they'll arrive, how deep they're sitting in the water. A tanker's draught is a rough proxy for how much cargo she's carrying.
The vessel herself -- flag state, owner, classification society, inspection record. These details separate the compliant fleet from the "shadow fleet" that moves sanctioned barrels.
None of this is secret. It's just scattered across different systems and formats. The trick is querying it conversationally instead of writing integration code.
The Setup
MCP (Model Context Protocol) lets an AI model call external APIs during a conversation -- so it retrieves live data rather than guessing from training data. VesselAPI provides the maritime data: AIS positions, port events, EU MRV emissions, port state inspections, and vessel registry information, wrapped in an MCP server.
Add this to your project root as .mcp.json (requires Node.js 18+):
{
"mcpServers": {
"vesselapi": {
"command": "npx",
"args": ["-y", "vesselapi-mcp"],
"env": {
"VESSELAPI_API_KEY": "YOUR_API_KEY"
}
}
}
}
Sign up at vesselapi.com for a free API key. The JSON structure is the same across MCP clients -- file location varies (Cursor reads .mcp.json from the project root; Claude Desktop uses its own settings path). That's the entire setup.
Watching the Black Sea
I asked Claude: "What tankers departed Novorossiysk today?"
The model called list_port_events with the port's UN/LOCODE (RUNVS) and a departure filter. The raw results included everything: tankers, bulk carriers loading grain, tugs, service vessels. Novorossiysk isn't just an oil port. I had to call get_vessel on each result to check the type, then filtered to tankers:
| Vessel | IMO | Type | Flag | Size |
|---|---|---|---|---|
| ALTURA | 9292199 | Crude Oil Tanker | Sierra Leone | 274m, 163,750 DWT |
| ANTARCTICA | 9910492 | Oil Tanker | Liberia | 274m x 50m |
| NISSOS SIKINOS | 9884033 | Tanker | Marshall Islands | 274m x 48m |
| TATIANA | 9340128 | Oil/Chemical Tanker | Liberia | 183m, 38,396 DWT |
| ENERGY DIONE | 9995973 | Tanker | United Kingdom | 274m x 48m |
Three Suezmax-class vessels in a single day from one port. Look at the flags: Sierra Leone, Liberia, Marshall Islands, Liberia, United Kingdom. Four of five are registered to open registries -- countries with no meaningful connection to the cargo, the crew, or the route. That pattern has a name in the industry: flag of convenience. And when you see it concentrated at an oil terminal under sanctions pressure, it gets more specific: shadow fleet. Only ENERGY DIONE flies a flag you'd expect from a vessel operating in compliant trade.
I picked ANTARCTICA and asked: "Tell me everything about this vessel."
The model pulled get_vessel:
- Type: Oil tanker
- Flag: Liberia
- Length: 274m, Beam: 50m
- Home port: Monrovia
Those are Suezmax dimensions. She's big enough to matter.
Then: "What are her emissions?"
The model called get_vessel_emissions and returned her EU MRV data:
- 2024: 3,382 tonnes CO2, 1,084 tonnes fuel consumed, 993 hours at sea
- 2023: 7,616 tonnes CO2, 2,431 tonnes fuel consumed, 1,686 hours at sea
- Technical efficiency: 2.57 gCO2/t.nm
Her 2024 emissions dropped by more than half. Not because she got cleaner -- because she spent half as much time at sea. That's consistent with a vessel that spent part of the year in floating storage or waiting for cargo. My guess is sanctions-related delays, but oversupply looks the same from the outside. Either way, a tanker that suddenly halves its sea time is a signal worth flagging.
"Where is she right now?"
get_vessel_position returned:
- Position: 44.71 degreesN, 37.85 degreesE
- Speed: 6.6 knots, course 200.6 degrees
She's in the Black Sea, heading south-southwest for the Bosphorus. If she's carrying Urals crude, she'll transit the Turkish Straits and enter the Mediterranean. Then the question becomes whether she heads west toward Europe or east toward the Suez and Asia. That routing decision, visible in real-time via AIS, tells you something about where Russian crude is finding buyers.
The Other Side
I flipped to the import side: "What tankers are heading to Rotterdam in the next few days?"
The model constructed an ETA window and called get_port_inbound. Among the results: HAIGUI -- an Oil Products Tanker, Liberian-flagged, 114,900 DWT, built by Samsung Heavy Industries. She's sitting at a draught of 13.2 metres. For a vessel that size, that draught means she's carrying serious weight.
"Check her inspection record."
17 inspections across five regimes -- Paris MoU, Tokyo MoU, Indian Ocean MoU, Black Sea MoU, US Coast Guard. Zero detentions. Only 4 deficiencies across over a decade of inspections. Ports visited include Rotterdam, Houston, Philadelphia, Amsterdam, Sydney, Ulsan, Dalian, Mombasa. That's a vessel with a global trading pattern and a clean compliance record -- the kind of ship a European refiner accepts without questions.
Her former name was GULF VALOUR until 2019. Name changes and ownership transfers are routine in commercial shipping, but they're also the bread crumbs that sanctions investigators follow. When a vessel changes name and flag within a short window, it's worth checking why.
Building the Signal
If I were building this into something real, the first thing I'd automate is departure counts from Novorossiysk and Primorsk. Week-over-week changes in Suezmax departures from Russian Black Sea ports are the crude signal -- more departures means more supply on the water, and you can estimate rough volumes by vessel class.
The import side is harder and more interesting. Counting arrivals at Rotterdam, Ningbo, and Jamnagar tells you where the oil is going. If European arrivals drop while Indian arrivals spike, that's a sanctions-driven rerouting -- exactly the kind of structural shift that moves Brent-Dubai spreads before the commentary catches up.
I tried to see if departure counts from Novorossiysk correlated with anything in the Brent forward curve. With only a week of port event data, the answer is: not enough signal, just noise. You'd need months. But the data is accumulating daily, and it's the same data that professional cargo-tracking firms start from before layering on satellite imagery and bill-of-lading records.
The compliance angle is arguably the most interesting for a smaller operation. Cross-reference departing vessels against classification records and inspection histories. A Suezmax with no classification society, no inspection record, and a Sierra Leone flag departing Novorossiysk is a different kind of data point than a Lloyd's-classed, Paris MoU-inspected vessel doing the same run. That distinction is worth money to compliance teams and underwriters.
You could set up a daily cron job with the Claude API to pull departures from ten export terminals. Pipe it into DuckDB. Track week-over-week. Build alerts for when a port goes quiet, or when shadow fleet tonnage surges at a terminal that normally services compliant trade.
Everything in this post came from live API calls on March 22, 2026. The results will be different tomorrow. That's the point. Sign up at vesselapi.com for a free key, drop the .mcp.json from the Setup section into your project root, and start asking. Try "What crude oil tankers departed Primorsk in the last 12 hours?" or "Find all tankers heading to Singapore -- which ones have the deepest draught?"
This was crude oil. The same approach works for LNG carriers at Sabine Pass, iron ore bulkers at Port Hedland, container ships stacking up outside Shanghai. The data is the same. The questions change.
The oil is on the water. Now you can see it.
Data queried from VesselAPI on March 22, 2026 via vesselapi-mcp. Port events return all vessel types; filtering to tankers requires a second vessel-detail lookup. EU MRV emissions are self-reported and independently verified. AIS identifiers can be spoofed. This is not financial advice.
Top comments (0)