<?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: Aicom</title>
    <description>The latest articles on DEV Community by Aicom (@aicom_38ddfdcb2a74af67683).</description>
    <link>https://dev.to/aicom_38ddfdcb2a74af67683</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%2F4207542%2F5e0ad409-6ab8-4ab6-9188-fc92731e8376.jpg</url>
      <title>DEV Community: Aicom</title>
      <link>https://dev.to/aicom_38ddfdcb2a74af67683</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aicom_38ddfdcb2a74af67683"/>
    <language>en</language>
    <item>
      <title>What we learned giving AI assistants a real taxi button in Addis Ababa</title>
      <dc:creator>Aicom</dc:creator>
      <pubDate>Mon, 26 Oct 2026 02:11:31 +0000</pubDate>
      <link>https://dev.to/aicom_38ddfdcb2a74af67683/what-we-learned-giving-ai-assistants-a-real-taxi-button-in-addis-ababa-1o47</link>
      <guid>https://dev.to/aicom_38ddfdcb2a74af67683/what-we-learned-giving-ai-assistants-a-real-taxi-button-in-addis-ababa-1o47</guid>
      <description>&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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: &lt;code&gt;https://bina.et/mcp&lt;/code&gt;. It exposes 27 tools, is listed in the official MCP Registry as &lt;code&gt;et.bina/binasmart&lt;/code&gt;, and the source is on GitHub.&lt;/p&gt;

&lt;p&gt;Here are the design choices that mattered most.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. A quote and a booking are different tools
&lt;/h2&gt;

&lt;p&gt;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. &lt;code&gt;quote_ride&lt;/code&gt; is safe to call any number of times: it returns the fixed fare for each tier and a &lt;code&gt;book_url&lt;/code&gt; that opens bina.et/ride with the route and price filled in, so the person can confirm it themselves. &lt;code&gt;request_ride&lt;/code&gt; 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. &lt;code&gt;get_ride_status&lt;/code&gt; and &lt;code&gt;cancel_ride&lt;/code&gt; close the loop.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The fare is locked before the ride, so the model never does maths
&lt;/h2&gt;

&lt;p&gt;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 &lt;code&gt;quote_ride&lt;/code&gt; returned, and that is what the passenger pays. We wrote about the product side of that decision &lt;a href="https://medium.com/@gccdomestic/why-we-lock-the-fare-before-the-ride-starts-ca54d637f84b" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Every result carries its source
&lt;/h2&gt;

&lt;p&gt;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 &lt;code&gt;source_url&lt;/code&gt;, and the &lt;code&gt;get_ethiopia_guide&lt;/code&gt; 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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Directories need to start your server, even if it is remote
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;The fix was small. The server is built by a &lt;code&gt;buildServer()&lt;/code&gt; function that takes its dependencies as arguments. We added a standalone &lt;code&gt;stdio.mjs&lt;/code&gt; 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 &lt;code&gt;https://bina.et/mcp&lt;/code&gt;. Directories can build and score it, and nobody can mistake it for the live service.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. What is in the box
&lt;/h2&gt;

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

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Add &lt;code&gt;https://bina.et/mcp&lt;/code&gt; 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?".&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Endpoint: &lt;a href="https://bina.et/mcp" rel="noopener noreferrer"&gt;https://bina.et/mcp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/akembalo-svg/binasmart-mcp" rel="noopener noreferrer"&gt;https://github.com/akembalo-svg/binasmart-mcp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Glama listing: &lt;a href="https://glama.ai/mcp/servers/akembalo-svg/binasmart-mcp" rel="noopener noreferrer"&gt;https://glama.ai/mcp/servers/akembalo-svg/binasmart-mcp&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://binasmart.hashnode.dev/what-we-learned-giving-ai-assistants-a-real-taxi-button-in-addis-ababa" rel="noopener noreferrer"&gt;Hashnode&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>javascript</category>
      <category>africa</category>
    </item>
  </channel>
</rss>
