DEV Community

What we learned giving AI assistants a real taxi button in Addis Ababa

Most MCP servers you find in directories read things. They search docs, query a database, summarise a repo. We built one that can send a real car to a real street corner in Addis Ababa, and that changed how we designed almost every tool.

BinaSmart (bina.et) is an everyday-services platform for Ethiopia: fixed-price rides, a directory of hotels, hospitals and buildings, job and tender boards, and bilingual Amharic/English guides to government paperwork like Fayda ID, passports and TIN registration.

We opened all of it to AI assistants through one remote MCP endpoint: https://bina.et/mcp. It exposes 27 tools, is listed in the official MCP Registry as et.bina/binasmart, and the source is on GitHub.

Here are the design choices that mattered most.

A quote and a booking are different tools

A model that is unsure of a pickup point will happily guess, and a guessed pickup is a driver waiting in the wrong place. So booking is never a single step.

quote_ride is safe to call any number of times: it returns the fixed fare for each tier and a book_url that opens bina.et/ride with the route and price filled in, so the person can confirm it themselves.

request_ride is the only tool that dispatches a driver, and its description tells the model it must pass the pickup, drop-off, tier, fare and Ethiopian phone number exactly as the user confirmed them. get_ride_status and cancel_ride close the loop.

If your server has one tool with real-world side effects, give it its own name and make the safe version the obvious first call.

The fare is locked before the ride, so the model never does maths

Our rides are fixed-price: the fare is set when you book, not when you arrive. That turned out to be a gift for AI use. The model never estimates a price, never multiplies kilometres by a rate, and never tells someone "about 300 birr". It quotes what quote_ride returned, and that is what the passenger pays.

We wrote about the product side of that decision here.

Every result carries its source

Government procedures in Ethiopia change often, and a confident wrong answer about a passport fee costs someone a wasted trip. So every tool result includes a source_url, and the get_ethiopia_guide tool returns our maintained guides with the official portal names and links (immigration.gov.et, id.gov.et, evisa.gov.et and so on).

The model is pushed to cite rather than recall. The guides are written in both Amharic and English, which also means an assistant can answer in whichever language the user wrote in without translating facts on the fly.

Directories need to start your server, even if it is remote

Glama and similar directories score servers by starting them in a container and reading the tool definitions. Our server is remote and depends on a database, a ride API and private config, none of which belong in a public container.

The fix was small. The server is built by a buildServer() function that takes its dependencies as arguments. We added a standalone stdio.mjs entry that passes in offline stubs: the same 27 tool definitions are registered, but any call that needs live data returns an error pointing to https://bina.et/mcp. Directories can build and score it, and nobody can mistake it for the live service.

What is in the box

  • Rides (Addis Ababa only): quote_ride, request_ride, get_ride_status, cancel_ride, plus BinaPool shared commutes (list_pool_corridors, find_pool_groups).
  • Places and health: search_places, search_hotels, get_hotel_rooms, search_health, get_hospital_departments.
  • Work: list_jobs, get_job, get_employer, list_tenders, get_tender, licensed overseas employment agencies.
  • Life admin: get_ethiopia_guide (25 guides) and search_knowledge.
  • Also: property and car listings, events, Amharic news and films.

Try it

Add https://bina.et/mcp as a remote MCP server in any client that supports streamable HTTP, then ask something like "How much is a ride from Bole airport to Piassa?" or "What do I need to renew my Ethiopian passport?".

  • Endpoint: https://bina.et/mcp
  • Source: https://github.com/akembalo-svg/binasmart-mcp
  • Glama listing: https://glama.ai/mcp/servers/akembalo-svg/binasmart-mcp

If you are building MCP servers for places the big platforms do not cover yet, we would like to hear what you ran into.

Originally published on Hashnode.

Read on DEV Community ↗ ← Back to News

Comments

No comments yet. Start the discussion.