<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Viktor Kondas</title>
    <description>The latest articles on DEV Community by Viktor Kondas (@kondasviktor).</description>
    <link>https://dev.to/kondasviktor</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4073133%2F25c98bb7-481b-479d-acf6-ea4d77265f29.jpg</url>
      <title>DEV Community: Viktor Kondas</title>
      <link>https://dev.to/kondasviktor</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kondasviktor"/>
    <language>en</language>
    <item>
      <title>Giving AI agents live European fuel prices with Apify MCP</title>
      <dc:creator>Viktor Kondas</dc:creator>
      <pubDate>Mon, 14 Sep 2026 15:45:05 +0000</pubDate>
      <link>https://dev.to/apify/giving-ai-agents-live-european-fuel-prices-with-apify-mcp-10gf</link>
      <guid>https://dev.to/apify/giving-ai-agents-live-european-fuel-prices-with-apify-mcp-10gf</guid>
      <description>&lt;h1&gt;
  
  
  &lt;strong&gt;Giving AI agents live European fuel prices with Apify MCP&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;How I turned a CEE + DACH fuel-price Actor into a tool Cursor can call — and what I had to change once a model, not a spreadsheet, was reading the output.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I built European Fuel Station Prices API (CEE + DACH) (&lt;a href="https://apify.com/kondasviktor/cee-dach-fuel-intelligence" rel="noopener noreferrer"&gt;https://apify.com/kondasviktor/cee-dach-fuel-intelligence&lt;/a&gt;) as a normal Apify Actor first: normalized station prices across Central Europe and DACH, scheduled monitoring, and a route cheapest-stop mode. Then I wired the same Actor into Cursor through the Apify MCP server (&lt;a href="https://docs.apify.com/platform/integrations/mcp" rel="noopener noreferrer"&gt;https://docs.apify.com/platform/integrations/mcp&lt;/a&gt;). This piece is about that second step — Theme 2 in Apify's Content Program: your Actor as a tool for AI agents.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What you need&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A free Apify (&lt;a href="https://apify.com" rel="noopener noreferrer"&gt;https://apify.com&lt;/a&gt;) account
&lt;/li&gt;
&lt;li&gt;Cursor (&lt;a href="https://cursor.com" rel="noopener noreferrer"&gt;https://cursor.com&lt;/a&gt;) (or another MCP-capable client)
&lt;/li&gt;
&lt;li&gt;Willingness to let the agent call cloud Actors (each run bills PPE; Austria smoke tests land on the $0.10 minimum)
&lt;/li&gt;
&lt;li&gt;Optional: a Fuelo (&lt;a href="https://fuelo.net/about/api%5C_key%5C_request" rel="noopener noreferrer"&gt;https://fuelo.net/about/api\_key\_request&lt;/a&gt;) API key if you want HU/PL/CZ/SK/CH/BG coverage (BYOK — the Actor never uses platform keys)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No local scrape setup. The Actor already runs on Apify; MCP is how the agent reaches it.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The guessing problem&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Ask any LLM-based agent &lt;em&gt;"where should I fill up between Budapest and Vienna?"&lt;/em&gt; and you get a fluent answer built from training data that is months or years stale. Pump prices move daily. Logistics teams want live, per-station, cross-border numbers — not a national average from memory.&lt;/p&gt;

&lt;p&gt;CEE adds a second failure mode. Slovakia can apply dual pricing for foreign-plated vehicles (dualPricingForForeignPlates: true, verified 2026-07-24 in my Actor's regulatory config). Croatia can run price caps on regular stations while highway stations differ (priceCapActive: true, same date). Austria restricts when prices may increase to Mon/Wed/Fri (priceIncreaseRestrictedDays: ["MO","WE","FR"]). None of that belongs in model weights. It belongs in structured fields an agent reads at call time.&lt;/p&gt;

&lt;p&gt;That gap — volatile, jurisdiction-specific data an LLM cannot reliably know — is what MCP tools are for. The interesting engineering is not scraping a price board. It is designing output so an agent knows how much to trust each number and receives few enough tokens to reason.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why I built a regional Actor in Cursor&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I live in CEE. The Apify Store had US/FR/AU fuel Actors; station-level CEE + DACH coverage did not. I wanted one schema across DE, AT, CH, HU, PL, CZ, SK, RO, HR, SI, and BG — official feeds where they exist, licensed aggregators elsewhere, EUR-normalized for cross-border comparison.&lt;/p&gt;

&lt;p&gt;The Actor is live on Store (build 0.1.10 at time of writing), pay-per-event (&lt;a href="https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event" rel="noopener noreferrer"&gt;https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event&lt;/a&gt;), with public example tasks. No buyer key for AT, SI, HR, RO. BYOK: Tankerkönig for DE, Fuelo for CH/HU/PL/CZ/SK/BG. You can smoke-test Austria in under a minute for the $0.10 minimum run charge.&lt;/p&gt;

&lt;p&gt;I built the Actor in Cursor — the same client that now calls it via MCP. That closed loop mattered: every schema tweak got exercised by an agent that actually had to answer a logistics question, not by me staring at a dataset table.&lt;/p&gt;

&lt;p&gt;Data sources are official public APIs or licensed aggregators with BYOK. The Actor does not scrape pump websites behind a login or ignore site terms; for Poland and similar Fuelo countries, missing a key fails loudly instead of inventing prices.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How the Actor is built&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Each country is a small adapter behind one interface. Austria reads E-Control's public JSON API, maps DIE/SUP/GAS into canonical diesel/petrol95/cng, and tags every row dataConfidence: OFFICIAL_REALTIME with an honest sourceMessage that E-Control returns cheapest-N, not the full market:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Code (typescript)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;// src/adapters/at.ts (excerpt)&lt;br&gt;&lt;br&gt;
url.searchParams.set('fuelType', mapFuel(query.fuel));&lt;br&gt;&lt;br&gt;
// ...&lt;br&gt;&lt;br&gt;
return {&lt;br&gt;&lt;br&gt;
  stationId: s.id != null ? String(s.id) : null,&lt;br&gt;&lt;br&gt;
  country: 'AT',&lt;br&gt;&lt;br&gt;
  diesel: typeof die === 'number' ? die : null,&lt;br&gt;&lt;br&gt;
  petrol95: typeof sup === 'number' ? sup : null,&lt;br&gt;&lt;br&gt;
  dataConfidence: 'OFFICIAL_REALTIME',&lt;br&gt;&lt;br&gt;
  source: 'E-Control Spritpreisrechner',&lt;br&gt;&lt;br&gt;
  sourceMessage:&lt;br&gt;&lt;br&gt;
    'E-Control returns cheapest-N stations for the search — not every station nationwide',&lt;br&gt;&lt;br&gt;
  regulatoryFlags: regulatoryFlagsFor('AT'),&lt;br&gt;&lt;br&gt;
};&lt;br&gt;&lt;br&gt;
Prices pass through ECB FX into *Eur and priceEur so a Budapest→Vienna comparison is not HUF guesswork against EUR memory.&lt;/p&gt;

&lt;p&gt;Route mode keeps cheapest-stop math deterministic — haversine detour, not LLM arithmetic:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Code (typescript)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;// src/route/geometry.ts (excerpt)&lt;br&gt;&lt;br&gt;
const detour = toStation + stationToDest - direct;&lt;br&gt;&lt;br&gt;
if (detour &amp;gt; opts.maxDetourKm) continue;&lt;br&gt;&lt;br&gt;
if (!best || price &amp;lt; best.price || (price === best.price &amp;amp;&amp;amp; detour &amp;lt; best.detour)) {&lt;br&gt;&lt;br&gt;
  best = { station: s, price, detour, fromOrigin: toStation };&lt;br&gt;&lt;br&gt;
}&lt;br&gt;&lt;br&gt;
Partial runs never invent rows. markCountryStatus classifies each country (ok, empty, missing_fuelo_key, …) and the run still succeeds for the rest:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Code (typescript)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;// src/main.ts (excerpt)&lt;br&gt;&lt;br&gt;
if (errMsg) {&lt;br&gt;&lt;br&gt;
  countryStatus[country] = classifyAdapterError(errMsg).status;&lt;br&gt;&lt;br&gt;
  return;&lt;br&gt;&lt;br&gt;
}&lt;br&gt;&lt;br&gt;
Pricing is explicit PPE: station-price $0.0025, route-recommendation $0.05, optional ai-digest $0.15 (BYOK, off by default), $0.10 minimum per run.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Architecture: agent decides, Actor evidences&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Code (text)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;User question&lt;br&gt;&lt;br&gt;
    → Cursor agent&lt;br&gt;&lt;br&gt;
    → Apify MCP (call-actor / fetch-actor-details)&lt;br&gt;&lt;br&gt;
    → Fuel Intelligence Actor&lt;br&gt;&lt;br&gt;
    → country adapters → live feeds&lt;br&gt;&lt;br&gt;
    → normalized dataset&lt;br&gt;&lt;br&gt;
    → agent recommendation&lt;br&gt;&lt;br&gt;
The agent is the decision layer. The Actor is the evidence layer. MCP is the bridge that removes the manual Console handoff.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Wiring Cursor to Apify MCP&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Apify hosts MCP at &lt;a href="https://mcp.apify.com" rel="noopener noreferrer"&gt;https://mcp.apify.com&lt;/a&gt; with OAuth on first connect — no API token in your config file. In .cursor/mcp.json:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Code (json)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;&lt;br&gt;
  "mcpServers": {&lt;br&gt;&lt;br&gt;
    "apify": {&lt;br&gt;&lt;br&gt;
      "url": "&lt;a href="https://mcp.apify.com/?tools=fetch-actor-details,kondasviktor/cee-dach-fuel-intelligence" rel="noopener noreferrer"&gt;https://mcp.apify.com/?tools=fetch-actor-details,kondasviktor/cee-dach-fuel-intelligence&lt;/a&gt;"&lt;br&gt;&lt;br&gt;
    }&lt;br&gt;&lt;br&gt;
  }&lt;br&gt;&lt;br&gt;
}&lt;br&gt;&lt;br&gt;
That pin matches the snippet on the Actor's Store page: fetch-actor-details plus the Actor id. For day-to-day exploration I also use a broader pin (actors,docs,...) so the agent can search Store and read docs; for a fleet assistant that always calls this Actor, the narrow pin skips a search round trip.&lt;/p&gt;

&lt;p&gt;Reload Cursor, sign in to Apify when prompted, then enable the server under &lt;strong&gt;Settings → Tools &amp;amp; MCP&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff5ej5ennnd6i60e7xfud.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff5ej5ennnd6i60e7xfud.png" alt=" " width="682" height="56"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cursor MCP configuration in mcp.json showing the Apify server URL with the cee-dach-fuel-intelligence Actor pinned as a tool&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fplx8fj0wt54p35nrwpzx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fplx8fj0wt54p35nrwpzx.png" alt=" " width="408" height="559"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cursor MCP tool list for the Apify server — all tools enabled including kondasviktor/cee-dach-fuel-intelligence&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Typical discovery path: search-actors → fetch-actor-details (read the input schema (&lt;a href="https://docs.apify.com/platform/actors/development/actor-definition/input-schema)" rel="noopener noreferrer"&gt;https://docs.apify.com/platform/actors/development/actor-definition/input-schema)&lt;/a&gt;) → call-actor. The input schema tells the agent required fields (mode, lat/lng for point, origin/destination for route). Apify can also infer output shapes from recent successful runs; my Actor's dataset schema documents row types (station-price, route-recommendation, run-status). The Actor output schema in Console is mainly deep links (dataset, runOverview) — field typing for agents comes from input + dataset schemas, not from those links alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Three real agent runs (August 2026)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I did not tell the agent &lt;em&gt;"run my fuel Actor."&lt;/em&gt; I asked logistics questions and let it resolve the tool through MCP. All runs below are cloud runs via Apify MCP; run IDs are real. Origin in Console shows &lt;strong&gt;MCP&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;A — Vienna petrol, key-free official data&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt; &lt;em&gt;I need current petrol prices near central Vienna for a delivery van, and tell me how reliable that data is.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Input the agent constructed:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Code (json)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;&lt;br&gt;
  "mode": "point",&lt;br&gt;&lt;br&gt;
  "countries": ["AT"],&lt;br&gt;&lt;br&gt;
  "lat": 48.2082,&lt;br&gt;&lt;br&gt;
  "lng": 16.3738,&lt;br&gt;&lt;br&gt;
  "radiusKm": 8,&lt;br&gt;&lt;br&gt;
  "fuel": "petrol95",&lt;br&gt;&lt;br&gt;
  "maxStations": 8,&lt;br&gt;&lt;br&gt;
  "enableAIDigest": false&lt;br&gt;&lt;br&gt;
}&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Run:&lt;/strong&gt; chJk2dCvN45DnWGKC · SUCCEEDED in 4.5s · 10 dataset items · countryStatus.AT: ok&lt;/p&gt;

&lt;p&gt;Cheapest row returned:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Code (json)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;&lt;br&gt;
  "recordType": "station-price",&lt;br&gt;&lt;br&gt;
  "stationId": "1494440",&lt;br&gt;&lt;br&gt;
  "brand": "TMC",&lt;br&gt;&lt;br&gt;
  "name": "TMC Werkstatt &amp;amp; Tankstelle",&lt;br&gt;&lt;br&gt;
  "country": "AT",&lt;br&gt;&lt;br&gt;
  "city": "Wien",&lt;br&gt;&lt;br&gt;
  "petrol95": 1.669,&lt;br&gt;&lt;br&gt;
  "petrol95Eur": 1.669,&lt;br&gt;&lt;br&gt;
  "priceEur": 1.669,&lt;br&gt;&lt;br&gt;
  "currency": "EUR",&lt;br&gt;&lt;br&gt;
  "dataConfidence": "OFFICIAL_REALTIME",&lt;br&gt;&lt;br&gt;
  "source": "E-Control Spritpreisrechner",&lt;br&gt;&lt;br&gt;
  "sourceStatus": "OK"&lt;br&gt;&lt;br&gt;
}&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Agent conclusion:&lt;/strong&gt; TMC at €1.669 is the cheapest nearby petrol95; data is official E-Control realtime, but cheapest-N — not every Austrian station.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzgfgv3sdr8ilp06d2lbf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzgfgv3sdr8ilp06d2lbf.png" alt=" " width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Scenario A run detail in Apify Console — run chJk2dCvN45DnWGKC, SUCCEEDED, 10 results, origin MCP&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyawnoemikklhx502xywd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyawnoemikklhx502xywd.png" alt=" " width="624" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Scenario A dataset — Vienna petrol95 station-price rows sorted by price, TMC first at €1.669, all with OFFICIAL_REALTIME confidence&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;B — Budapest→Vienna diesel route&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt; &lt;em&gt;I'm driving a diesel van from Budapest to Vienna today. Where should I stop to fill up without a big detour, and how sure are you about that price?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Input (Fuelo key redacted — buyers supply their own):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Code (json)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;&lt;br&gt;
  "mode": "route",&lt;br&gt;&lt;br&gt;
  "countries": ["HU", "AT"],&lt;br&gt;&lt;br&gt;
  "originLat": 47.4979,&lt;br&gt;&lt;br&gt;
  "originLng": 19.0402,&lt;br&gt;&lt;br&gt;
  "destinationLat": 48.2082,&lt;br&gt;&lt;br&gt;
  "destinationLng": 16.3738,&lt;br&gt;&lt;br&gt;
  "fuel": "diesel",&lt;br&gt;&lt;br&gt;
  "maxDetourKm": 20,&lt;br&gt;&lt;br&gt;
  "maxStations": 25,&lt;br&gt;&lt;br&gt;
  "radiusKm": 15,&lt;br&gt;&lt;br&gt;
  "enableAIDigest": false,&lt;br&gt;&lt;br&gt;
  "fueloApiKey": "YOUR_FUELO_KEY"&lt;br&gt;&lt;br&gt;
}&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Run:&lt;/strong&gt; mT6vN8TOsCG7P5d6s · SUCCEEDED in 12.9s · 39 items · one route-recommendation row&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Code (json)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;&lt;br&gt;
  "recordType": "route-recommendation",&lt;br&gt;&lt;br&gt;
  "stationId": "fuelo:HU:36084",&lt;br&gt;&lt;br&gt;
  "brand": "Slovnaft",&lt;br&gt;&lt;br&gt;
  "country": "HU",&lt;br&gt;&lt;br&gt;
  "city": "Bratislava",&lt;br&gt;&lt;br&gt;
  "fuel": "diesel",&lt;br&gt;&lt;br&gt;
  "price": 1.706,&lt;br&gt;&lt;br&gt;
  "priceEur": 1.706,&lt;br&gt;&lt;br&gt;
  "currency": "EUR",&lt;br&gt;&lt;br&gt;
  "distanceFromOriginKm": 158.38,&lt;br&gt;&lt;br&gt;
  "estimatedDetourKm": 1.03,&lt;br&gt;&lt;br&gt;
  "dataConfidence": "COMMUNITY_AGGREGATOR_UNVERIFIED"&lt;br&gt;&lt;br&gt;
}&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Agent conclusion:&lt;/strong&gt; Cheapest stop within ~1 km detour is Slovnaft diesel at €1.706 — but the agent must hedge: COMMUNITY_AGGREGATOR_UNVERIFIED, not official regulator data. The same run also returned OFFICIAL_REALTIME E-Control rows for AT segments; mixing tiers in one answer without naming confidence would be wrong.&lt;/p&gt;

&lt;p&gt;This is token economics in practice: route mode returns one recommendation record plus bounded station rows (maxStations), not an unbounded national dump. MCP still returns full field lists per row — context control is the Actor's modes and caps, not automatic truncation in MCP.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcaf3ug5inwkjc0y6kfvu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcaf3ug5inwkjc0y6kfvu.png" alt=" " width="799" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Scenario B dataset — Budapest-Vienna route, row 42 is the route-recommendation: Slovnaft Bratislava, diesel €1.706, ~1.03 km detour&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;C — Poland without a Fuelo key (honest failure)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt; &lt;em&gt;Current diesel near central Warsaw — same kind of answer as Vienna.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Input:&lt;/strong&gt; point query for PL — fueloApiKey deliberately omitted even though I have a key locally.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Code (json)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;&lt;br&gt;
  "mode": "point",&lt;br&gt;&lt;br&gt;
  "countries": ["PL"],&lt;br&gt;&lt;br&gt;
  "lat": 52.2297,&lt;br&gt;&lt;br&gt;
  "lng": 21.0122,&lt;br&gt;&lt;br&gt;
  "radiusKm": 10,&lt;br&gt;&lt;br&gt;
  "fuel": "diesel",&lt;br&gt;&lt;br&gt;
  "maxStations": 10,&lt;br&gt;&lt;br&gt;
  "enableAIDigest": false&lt;br&gt;&lt;br&gt;
}&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Run:&lt;/strong&gt; RJCT720eHg3INuOzg · SUCCEEDED in 3.6s · 0 stations · 1 run-status row&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Code (json)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;&lt;br&gt;
  "recordType": "run-status",&lt;br&gt;&lt;br&gt;
  "countryStatus": { "PL": "missing_fuelo_key" },&lt;br&gt;&lt;br&gt;
  "stationCount": 0,&lt;br&gt;&lt;br&gt;
  "okStationCount": 0,&lt;br&gt;&lt;br&gt;
  "notes": [&lt;br&gt;&lt;br&gt;
    "PL: PL uses Fuelo.net (BYOK). Set input fueloApiKey from &lt;a href="https://fuelo.net/about/api%5C_key%5C_request" rel="noopener noreferrer"&gt;https://fuelo.net/about/api\_key\_request&lt;/a&gt; — we never use platform keys."&lt;br&gt;&lt;br&gt;
  ]&lt;br&gt;&lt;br&gt;
}&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Agent conclusion:&lt;/strong&gt; Polish station data is unavailable until the caller supplies a Fuelo key — do not invent Warsaw diesel prices. Honest failure beats silent emptiness: the run succeeded, the status says &lt;em&gt;why&lt;/em&gt; it is empty.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F39a63ixemeji4fgvpv7o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F39a63ixemeji4fgvpv7o.png" alt=" " width="799" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Scenario C run detail — run RJCT720eHg3INuOzg, SUCCEEDED with 1 result, origin MCP, completed in 3 seconds&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnb4siya3ox0jal3hdz6q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnb4siya3ox0jal3hdz6q.png" alt=" " width="619" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Scenario C Actor log — ERROR line shows PL uses Fuelo.net BYOK, followed by INFO: stations=0, status=missing_fuelo_key&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What MCP removed&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Without MCP, a human (or agent pretending to be one) does this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open Apify Console
&lt;/li&gt;
&lt;li&gt;Find the Actor
&lt;/li&gt;
&lt;li&gt;Fill input JSON
&lt;/li&gt;
&lt;li&gt;Start run
&lt;/li&gt;
&lt;li&gt;Wait
&lt;/li&gt;
&lt;li&gt;Open dataset
&lt;/li&gt;
&lt;li&gt;Export or copy rows
&lt;/li&gt;
&lt;li&gt;Paste into chat
&lt;/li&gt;
&lt;li&gt;Ask the model to recommend&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With MCP, steps 2–8 collapse into one agent turn: recognize live fuel data is needed → fetch-actor-details → call-actor → reason on structured rows. The manual handoff disappears.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Design choices that mattered for agents&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A few patterns I would steal for any live-data Actor meant for MCP:&lt;/p&gt;

&lt;p&gt;Put provenance on the row, not only in the README. dataConfidence, source, and sourceMessage ride on every station row so the agent can hedge inside one tool call. A spreadsheet buyer scrolls to methodology; an agent cannot.&lt;/p&gt;

&lt;p&gt;Keep regulation in dated config, not model memory. regulatoryFlags come from JSON (lastVerified: 2026-07-24). The optional ai-digest PPE event stays off the hot path — narrative over aggregates is for scheduled batch runs, not every "where's cheapest" query.&lt;/p&gt;

&lt;p&gt;Keep the core deterministic. Currency normalization, detour math, and cheapest-stop selection stay in TypeScript. Let the agent interpret; do not let it calculate pump prices.&lt;/p&gt;

&lt;p&gt;Name fields so a model can infer meaning. estimatedDetourKm and missing_fuelo_key beat internal enums like tier2.&lt;/p&gt;

&lt;p&gt;Design for agent call patterns. One route call beats eleven country calls. Cap maxStations. Batch countries in a single input when the schema allows it.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What broke while building this&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;AT always needs coordinates. Even country mode feeds a national centroid into E-Control's lat/lng search — there is no "whole country" dump.
&lt;/li&gt;
&lt;li&gt;asOfDate on E-Control throws explicitly when asOfDateStrict=true instead of silently serving live prices as history.
&lt;/li&gt;
&lt;li&gt;Tankerkönig free tier caps radius at 25 km — the input schema enforces the same cap.
&lt;/li&gt;
&lt;li&gt;Missing BYOK must not look like "no stations exist." Poland without fueloApiKey → missing_fuelo_key, not an empty success story.
&lt;/li&gt;
&lt;li&gt;Early MCP pins that only exposed call-actor without fetch-actor-details made the agent guess required fields. Pinning the Actor &lt;em&gt;and&lt;/em&gt; details fixed that.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What I would do differently&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I would ship the dataset schema and dataConfidence enums before the first public Store listing. I added provenance after watching an agent treat a Fuelo community price like E-Control realtime. I would also document MCP pin recipes on the Store page earlier — the narrow pin vs broad actors,docs pin is not obvious from Console alone.&lt;/p&gt;

&lt;p&gt;Next on my list: richer route geometry than haversine (road network detours), and clearer city/country consistency checks when a community feed returns odd location labels.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Takeaways&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;One Actor now serves Console, API, schedules, automation tools — and agents via MCP. Fuel was the forcing function because bad answers are costly; the pattern generalizes to any live, messy, geographic dataset (EV charging, truck parking, tolls): normalize in the Actor, expose provenance on every row, keep math deterministic, let MCP handle the call, let the agent handle the question.&lt;/p&gt;

&lt;p&gt;Try it: European Fuel Station Prices API (CEE + DACH) (&lt;a href="https://apify.com/kondasviktor/cee-dach-fuel-intelligence" rel="noopener noreferrer"&gt;https://apify.com/kondasviktor/cee-dach-fuel-intelligence&lt;/a&gt;) — AT/SI/HR/RO need no key. MCP setup: Apify MCP docs (&lt;a href="https://docs.apify.com/platform/integrations/mcp" rel="noopener noreferrer"&gt;https://docs.apify.com/platform/integrations/mcp&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Viktor Kondas · [Apify profile](&lt;a href="https://apify.com/kondasviktor" rel="noopener noreferrer"&gt;https://apify.com/kondasviktor&lt;/a&gt;) · Built in Cursor with Apify MCP&lt;/em&gt;&lt;/p&gt;

</description>
      <category>apify</category>
      <category>mcp</category>
      <category>ai</category>
      <category>automation</category>
    </item>
  </channel>
</rss>
