BinaSmart MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@BinaSmart MCP Serverquote a ride from Bole to Meskel Square"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
BinaSmart MCP server
The public Model Context Protocol server for BinaSmart (bina.et), Ethiopia's all-in-one platform. Any MCP-capable assistant (Claude, ChatGPT, Gemini and others) can use it to:
Ride in Addis Ababa: quote fixed fares, book a ride (the user confirms first), check its status, cancel it
Find places: buildings, hotels, hospitals and clinics, shops and restaurants, with their bina.et pages
Jobs and tenders: open vacancies by field or city (Amharic or English), employers, open tenders with deadlines. Vacancies show as job cards in assistants that support MCP Apps
Working abroad: licensed Ethiopian overseas employment agencies and their GCC partner offices
Homes and cars: properties for sale or rent, cars for sale
Guides and news: the bilingual Digital Ethiopia guides (Fayda, passport, telebirr, tax, …) and Amharic news
BinaPool: shared commute corridors and groups
Endpoint: https://bina.et/mcp (Streamable HTTP, stateless, no sign-in needed)
Registry: et.bina/binasmart on the MCP Registry
Docs: GET https://bina.et/mcp · health: https://bina.et/mcp/health
Claude plugin
The plugin/ folder is a Claude plugin: the same MCP server plus five skills that show Claude how to use it for rides, jobs, paperwork, places and tenders. It contains no code, only Markdown skills and one MCP server entry.
Related MCP server: Navitia MCP Server
Connect
In any client that accepts a remote MCP server, add the URL https://bina.et/mcp. For example, in Claude: Settings → Connectors → Add custom connector.
How it is built
mcp-server/server.mjs: the MCP endpoint (Express +@modelcontextprotocol/sdk)mcp-server/tools/: one file per tool group (ride, directory, jobs, health, market, content, guides, knowledge, agencies)mcp-server/widgets/andmcp-server/lib/widgets.mjs: the job-card page (MCP Apps) served asui://bina/jobs-v1.html, with the@modelcontextprotocol/ext-appsbrowser bundle inlinedmcp-server/lib/: phone normalisation, an idempotency key so retries never double-book, a per-caller rate limiter, the ride API clientapi/andhotels/rules.js: the shared usage meter, API-key check and hotel rules from the main BinaSmart app, which this server imports
The server runs next to the private BinaSmart application and reads its data and settings at runtime (database, ride API on localhost, the .env file). No credentials are in this repository. So this code documents exactly what the public endpoint does, but on its own it will not run against BinaSmart data.
Safety
request_rideandcancel_rideare marked as write tools (readOnlyHint: false), so clients ask the user before calling them.The job-card page only reads the tool result: it opens bina.et links through the host and can reach no other site.
Reviewers can test
request_ridewith the reserved number0900000099: it returns a clearly marked test booking and no driver is sent.Bookings are limited per phone (5 per 10 minutes) and per caller (10 per hour). Retries with the same details within 10 minutes return the same booking instead of a second one.
Only Ethiopian phone numbers are accepted for rides. Phone numbers are masked in logs.
Privacy: bina.et/privacy · Terms: bina.et/terms · Support: bina.et/support
Standalone (tool definitions only)
node mcp-server/stdio.mjs starts the same tools over stdio without the BinaSmart database or .env, so MCP directories such as Glama can build it in their own container and read the tool definitions. Calls that need live data return an error pointing to https://bina.et/mcp.
Tests
cd mcp-server && npm install && node --test test/*.test.mjsThe tests use reserved test phone numbers only.
Licence
MIT. See LICENSE. © 2026 BinaSmart (Ibrahim Kedir).
Available Tools
27 toolscancel_rideCancel a rideADestructiveIdempotentInspect
Cancels a BinaSmart ride that has not started yet. A cancellation cannot be undone. Needs the ride id and the rider phone used to book.
| Name | Required | Description | Default |
|---|---|---|---|
| ride_id | Yes | Ride id returned by request_ride | |
| rider_phone | Yes | Ethiopian phone number used to book the ride, e.g. 0911234567 or +251911234567 |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | How to use or present this result |
| test | No | true for a reviewer test booking (no driver is sent) |
| tier | No | Vehicle tier |
| driver | No | Assigned driver, null until one is assigned |
| pickup | No | Pickup place |
| status | No | dispatching, assigned, arriving, arrived, ontrip, completed, cancelled, or test_booking |
| dropoff | No | Drop-off place |
| ride_id | No | Ride id (needed for get_ride_status and cancel_ride) |
| fare_etb | No | Fixed fare in birr |
| source_url | No | bina.et page this result comes from; cite it |
| requested_at | No | When the ride was requested (ISO time) |
| tracking_url | No | Live tracking page |
| payment_method | No | cash, telebirr or chapa |
| payment_status | No | Payment status |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=true, so the safety profile is covered structurally. The description adds real context beyond them: the cancellation is irreversible and only valid pre-start. It does not disclose the effect on fares/refunds or that repeat calls are safe (idempotency), which the annotations already imply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the action and its precondition, then the irreversibility warning and the required inputs. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and annotations carry the safety profile, so the description need only convey action, precondition, and required inputs — all of which are present. Nothing an agent needs in order to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% — both ride_id and rider_phone are fully documented in the schema, including format examples. The description only restates that both are needed ('the ride id and the rider phone used to book'), adding no syntax or edge-case detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Cancels a BinaSmart ride') plus a scope constraint ('that has not started yet'), which separates it from request_ride/quote_ride/get_ride_status. It never names a sibling explicitly, so differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear applicability condition: use it only for a ride that has not started. It does not name what to do instead once a ride is underway or already cancelled, so no explicit alternatives or exclusions are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_pool_groupsFind BinaPool cars filling near a pointARead-onlyInspect
Cars currently filling within about 2.5 km of a point in Addis Ababa: destination, seats left, seat price, women-only flag, and a share url (https://bina.et/pool/) the rider can open to join. Driver-opened cars at stations are listed first. Requires lat/lng.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Latitude | |
| lng | Yes | Longitude |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | How to use or present this result |
| count | No | Number of items returned |
| groups | No | Cars filling up near the given point |
| start_one_url | No | Start a new pool group |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuinely useful behavior beyond that: an approximate 2.5 km search radius and the ordering rule that driver-opened cars at stations come first. It stops short of stating result limits or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense sentence that front-loads the verb, scope, and radius before listing return fields. The inline share-url template is slightly more detail than needed for tool selection, but nothing is wasted or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is optional; the description still summarizes the payload fields helpfully. Combined with the annotation-provided read-only profile and the geographic constraint, an agent has enough to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the bounds (8.5–9.5 lat, 38.4–39.2 lng) already pin the coordinates to Addis Ababa. The description's 'point in Addis Ababa' and 'Requires lat/lng' only restate what the schema conveys, so this is the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Find) and resource (BinaPool cars currently filling near a point), then enumerates the returned fields. It is clearly distinguishable from siblings like list_pool_corridors, quote_ride, and request_ride.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage via 'Requires lat/lng' and the 2.5 km radius, but never states when to pick this over list_pool_corridors or how it relates to the ride-booking siblings. Usage is inferable rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_employerA company and its vacanciesARead-onlyInspect
A company listed on BinaSmart: what it does, its address and location when we hold them, and every vacancy it has posted. By employer slug from list_jobs or get_job.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Employer slug, e.g. from list_jobs employer_url |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | How to use or present this result |
| employer | No | Employer |
| vacancies | No | Its vacancies on BinaSmart |
| source_url | No | bina.et page this result comes from; cite it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds one genuinely useful behavioral detail: address and location are returned only 'when we hold them', i.e. those fields may be absent. It says nothing about pagination or vacancy list size, which is a plausible concern for a company with many postings.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, no filler, and the resource contents are front-loaded ahead of the input-provenance note. Slightly dense phrasing ('what it does, its address and location when we hold them') but nothing wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description is not obliged to explain return values, and annotations carry the read-only profile. It adequately covers scope and input sourcing; only vacancy-list volume/pagination behavior is left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single slug parameter, which already documents the expected format ('e.g. from list_jobs employer_url'). The description reinforces provenance and adds a second valid source (get_job), a marginal gain over the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (a company on BinaSmart) and enumerates the payload: profile, address/location, and all posted vacancies. This clearly separates it from get_job, which returns a single posting, though it never states the verb and relies on the name to convey retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It tells the agent where the required slug comes from (list_jobs or get_job), which implicitly routes the workflow: enumerate jobs first, then hydrate the employer. It stops short of an explicit 'use this instead of X when Y' statement or any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ethiopia_guideDigital Ethiopia guideARead-onlyInspect
BinaSmart's bilingual (Amharic + English) step-by-step guides to Ethiopian government and banking services: Fayda ID, telebirr, CBE Birr, e-Passport, eVisa, TIN, business licence, VAT/TOT, customs, driving licence, car import, Yellow Card, bank account, birth/marriage certificate, utility bills, Labor ID and LMIS registration and the COC occupational competency certificate (Overseas Employment Proclamation 1389/2025), rental agreements, tenant screening. Call with no slug to list guides; call with a slug for the full text. The guides hold the correct official names and links.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | Guide slug from the list, e.g. tin-registration-ethiopia |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | How to use or present this result |
| slug | No | Guide slug |
| text | No | Full guide text (Amharic and English) |
| title | No | Guide title |
| guides | No | Guide list (when called without a slug) |
| summary | No | Summary |
| source_url | No | bina.et page this result comes from; cite it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds useful context that the guides are bilingual and carry correct official names and links, but says nothing about list size, pagination, or truncation of the full text, which are the practical traits an agent needs for a content-retrieval tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and the slug/no-slug behavior are front-loaded and useful. The middle of the description is a single run-on sentence listing roughly twenty guide topics, which is heavy for a one-parameter tool and could be condensed, though the enumeration does aid discoverability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and annotations cover the read-only profile. The description supplies mode behavior and content scope, leaving only minor gaps (pagination, list size) for what is a simple single-parameter lookup.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents the slug with an example. The description goes beyond the schema by explaining the otherwise-undocumented behavior of omitting slug entirely (returns the guide list rather than an error), which is genuine added meaning for an optional parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete resource (bilingual step-by-step guides to Ethiopian government and banking services) and enumerates the covered topics, which clearly separates it from siblings like get_news_article or search_knowledge. It does not explicitly name a sibling to avoid, but the domain scoping is specific enough that an agent can place it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Call with no slug to list guides; call with a slug for the full text' clearly documents the two invocation modes, which is real operational guidance. However, it gives no when-to-use context versus alternatives (e.g. search_knowledge for general queries) and no exclusions, so it stays at implied usage rather than explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_hospital_departmentsHospital departments and slotsARead-onlyInspect
Departments of a hospital listed on BinaSmart with consultation fee (ETB), doctors, hours, floor/room and appointment slots left for a date. Use the slug from search_places (is_hospital = true).
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | YYYY-MM-DD (default today) | |
| slug | Yes | Hospital slug from search_places |
Output Schema
| Name | Required | Description |
|---|---|---|
| date | No | Date the slots are for (YYYY-MM-DD) |
| demo | No | true for a demo listing |
| book_url | No | Appointment page |
| hospital | No | Hospital |
| source_url | No | bina.et page this result comes from; cite it |
| demo_notice | No | Shown when the listing is a demo |
| departments | No | Departments |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds useful behavioral context the annotations do not: it discloses the returned field set (fee, doctors, hours, location, live slot availability) and the cross-tool slug dependency, though it says nothing about pagination or how stale the slot data is.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with zero filler; the resource and its output are front-loaded and the prerequisite is deferred to the trailing sentence where it belongs. Nothing repeats the name or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only lookup with an output schema, complete param coverage, and only two inputs, this says everything an agent needs: what comes back, the optional date scoping, and where the required slug originates. No material gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented, including the date pattern and 'default today' semantics. The description only reinforces slug provenance, matching the baseline 3 when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource (departments of a hospital) and enumerates the exact payload — consultation fee in ETB, doctors, hours, floor/room, and remaining appointment slots for a date. That specificity lets an agent distinguish this detail-lookup from a broader discovery tool like search_health without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the prerequisite explicitly: 'Use the slug from search_places (is_hospital = true)', which routes the agent to the correct upstream sibling. It stops short of naming when NOT to use it or how it differs from search_health, so it is clear context rather than full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_hotel_roomsHotel rooms and pricesARead-onlyInspect
Room types, nightly prices (ETB), capacity and amenities for a hotel listed on BinaSmart. Use the slug from search_places (is_hotel = true).
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Hotel slug from search_places |
Output Schema
| Name | Required | Description |
|---|---|---|
| demo | No | true for a demo listing |
| hotel | No | Hotel |
| rooms | No | Room types |
| book_url | No | Booking page |
| source_url | No | bina.et page this result comes from; cite it |
| demo_notice | No | Shown when the listing is a demo |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds the useful detail that prices are in ETB, but says nothing about freshness of pricing, availability guarantees, or pagination behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with zero filler; the returned fields lead and the prerequisite follows. Nothing is padded or restated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be detailed, and the one required parameter plus its source are covered. The definition is sufficient to invoke the tool correctly, with only minor gaps around pricing freshness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single slug parameter is already documented as coming from search_places, so the schema carries the load. The description's only marginal addition is the is_hotel = true filter hint for choosing the right slug, which is a minor but real clarification.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (room types, prices, capacity, amenities for a hotel) and implicitly the retrieval action, so an agent knows exactly what data comes back. It also ties itself to the slug-based lookup pattern, though it does not explicitly contrast with the sibling search_hotels/search_places tools beyond sourcing the slug.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a concrete prerequisite chain: obtain the slug from search_places and only use results where is_hotel = true. That is clear actionable context, but there is no explicit when-not-to-use or mention of alternative hotel tools such as search_hotels.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_jobOne vacancy in fullARead-onlyInspect
The full advert for a single vacancy on BinaSmart, by its slug from list_jobs: the duties and requirements as the employer wrote them, how to apply, and the company behind it with its address when we hold one.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Job slug from list_jobs |
Output Schema
| Name | Required | Description |
|---|---|---|
| job | No | The vacancy in full, with detail and employer_profile |
| note | No | How to use or present this result |
| source_url | No | bina.et page this result comes from; cite it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description goes further by enumerating the payload's substance (duties, requirements, how to apply, company with address when held), which usefully sets expectations about completeness and conditional fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence that opens with the core purpose before listing payload contents; no filler or restated title. Dense but every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be spelled out, and the description covers origin of the input, scope, and payload shape. Nothing essential for correct invocation is missing; only explicit usage exclusions are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and there is a single parameter, so the schema already documents the slug fully. The description only repeats its origin ('from list_jobs'), adding no format or constraint detail beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('the full advert for a single vacancy on BinaSmart') plus the identifier it keys on, and explicitly separates itself from list_jobs. An agent can distinguish it from get_employer and list_jobs without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'by its slug from list_jobs' tells the agent this follows a list_jobs call and what input it needs, which is clear usage context. It stops short of stating when not to use it (e.g. preferring list views for browsing), so it doesn't reach the explicit alternatives level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_news_articleOne news article in fullARead-onlyInspect
The full text of a single BinaSmart news article by its slug from list_news.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Article slug from list_news |
Output Schema
| Name | Required | Description |
|---|---|---|
| article | No | The article with its full text |
| source_url | No | bina.et page this result comes from; cite it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered and the bar is lower. The description's only added signal is that the response is the complete article text (not a snippet). With an output schema present, no return-value detail is owed, but nothing is said about error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, zero filler, with the resource and its lookup key front-loaded. Nothing could be removed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a trivial single-parameter read with an output schema, full annotation coverage, and a complete input schema, the description supplies everything needed to call it correctly. Only slug-validation or not-found behavior is left unstated, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is a single parameter, so the schema already documents 'slug' fully, including its origin. The description's 'by its slug from list_news' merely echoes the schema wording rather than adding format or validation detail, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (fetch the full text of one news article) plus the exact lookup key (slug). It also names list_news as the origin of that slug, so an agent can immediately tell it apart from the sibling listing tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'by its slug from list_news' effectively routes the agent: call list_news first, then come here with a slug. It gives clear context for use but states no exclusions or failure conditions (e.g., unknown/expired slug).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ride_statusRide statusARead-onlyInspect
Current status of a BinaSmart ride (dispatching, assigned, arriving, arrived, ontrip, completed, cancelled) with driver name, vehicle and plate once assigned. Needs the ride id and the rider phone used to book.
| Name | Required | Description | Default |
|---|---|---|---|
| ride_id | Yes | Ride id returned by request_ride | |
| rider_phone | Yes | Ethiopian phone number used to book the ride, e.g. 0911234567 or +251911234567 |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | How to use or present this result |
| test | No | true for a reviewer test booking (no driver is sent) |
| tier | No | Vehicle tier |
| driver | No | Assigned driver, null until one is assigned |
| pickup | No | Pickup place |
| status | No | dispatching, assigned, arriving, arrived, ontrip, completed, cancelled, or test_booking |
| dropoff | No | Drop-off place |
| ride_id | No | Ride id (needed for get_ride_status and cancel_ride) |
| fare_etb | No | Fixed fare in birr |
| source_url | No | bina.et page this result comes from; cite it |
| requested_at | No | When the ride was requested (ISO time) |
| tracking_url | No | Live tracking page |
| payment_method | No | cash, telebirr or chapa |
| payment_status | No | Payment status |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and openWorldHint=false, and the description adds real value on top: the status state machine and the fact that driver name, vehicle and plate only appear 'once assigned'. It still says nothing about what happens on an unknown ride id or a phone mismatch.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the status enumeration and then the input requirement; there is no filler and nothing that could be cut without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description covers the status set and conditional driver/vehicle availability. It is nearly complete, with only edge-case behavior (invalid id, mismatched phone) left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are already documented (ride_id returned by request_ride, Ethiopian phone formats). The description only restates that the ride id and booking phone are needed, adding no syntax or format detail beyond the schema. Baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Current status of a BinaSmart ride') and enumerates the full status lifecycle, which cleanly separates it from the sibling write operations request_ride, cancel_ride and quote_ride. An agent can route to it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives the precondition for a successful call ('Needs the ride id and the rider phone used to book'), which tells the agent this is a post-booking lookup rather than a booking action. It does not, however, explicitly name alternatives or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tenderOne tender in fullARead-onlyInspect
The full text of a single tender notice on BinaSmart, by its slug from list_tenders: requirements, bid bond, where and when to submit, and the link to the original notice.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Tender slug from list_tenders |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | How to use or present this result |
| tender | No | The tender in full, with detail |
| source_url | No | bina.et page this result comes from; cite it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and openWorldHint=false, so the safety profile is already covered. The description adds real value beyond them by disclosing what the payload contains (requirements, bid bond, submission place/time, original link), which helps the agent decide to fetch full text rather than a summary.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with a colon-delimited content list; every clause carries information and nothing is repeated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the description still sketches the payload contents plus the slug dependency, making the tool callable without further context. Minor gap only in not contrasting with other single-item detail siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single slug parameter is already documented as coming from list_tenders. The description only restates that origin, adding no format, length, or lookup guidance beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('full text of a single tender notice on BinaSmart') and enumerates the content returned. The word 'single' plus the slug reference cleanly separates it from list_tenders without needing the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'by its slug from list_tenders' tells the agent this is the follow-up detail call to list_tenders, which is clear context. It gives no explicit when-not case or comparison to sibling detail tools like get_news_article or get_job, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_eventsUpcoming eventsARead-onlyInspect
Upcoming films, concerts, theatre and events on BinaSmart in Addis Ababa with venue, hall, start time, prices per tier and seats left. Seats are chosen and paid at the url returned (Chapa or at the counter); the ticket is a QR code.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | Number of items returned |
| events | No | Upcoming events |
| book_hint | No | How tickets are bought |
| source_url | No | bina.et page this result comes from; cite it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description adds genuinely useful behavior beyond them: this tool does not transact, seating and payment occur at the returned url via Chapa or at the counter, and the ticket is a QR code. That clarifies the full flow. It says nothing about result ordering, volume, or pagination, keeping it out of the top band.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler. The first front-loads what the tool returns; the second carries only the behaviorally relevant downstream flow (payment location and QR ticket). Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and an output schema present, the description does not need to explain return values or arguments. It covers scope, contents, and the post-listing purchase path, which is everything an agent needs to select and call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and the schema is empty, so there are no parameter semantics to add or omit. Baseline for a no-parameter tool is 4; nothing in the description contradicts or muddies the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete resource set (films, concerts, theatre, events) scoped to BinaSmart in Addis Ababa, and enumerates the fields returned (venue, hall, start time, prices per tier, seats left). That is far beyond restating the name. It stops short of distinguishing itself from close siblings like list_films or search_places, so an agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the content — an agent can tell this is the browse-upcoming-events tool — but there is no explicit when-to-use, when-not-to-use, or named alternative such as list_films for cinema-specific queries. Nothing misleading, but nothing that routes the agent either.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_filmsAmharic films to watch onlineARead-onlyInspect
Licensed Amharic (Ethiopian) films that can be watched online on BinaSmart Watch (bina.et/watch): title in Amharic and English, year, genre, whether it is free or rented for 48 hours (ETB), and the watch url. Free titles are public YouTube releases played through the YouTube player; rentals need Chapa. Optional search by title or genre.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max films, default 20 | |
| query | No | Title (Amharic or English) or genre to filter by; omit for the latest films |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | Number of items returned |
| films | No | Amharic films |
| source_url | No | bina.et page this result comes from; cite it |
| watch_hint | No | How to watch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond the readOnlyHint/openWorldHint annotations: free titles are public YouTube releases played through the YouTube player, while rentals require Chapa payment and last 48 hours in ETB. It does not mention ordering, pagination, or result-size behaviour, but the payment/playback distinction is genuinely useful behavioral detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and scope are front-loaded in the first clause, and the sentence carries the field list, the free/rental distinction, and the optional filter without padding. It is a long run-on sentence, but every clause adds information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't enumerate return values, yet it usefully clarifies what a film record contains and how playback/payment works. The only gap is ordering/result-window behaviour, which is left to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema; the description only restates the query filter ('search by title or genre') and says nothing about limit. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (licensed Amharic films watchable online on BinaSmart Watch) and enumerates the returned fields, so an agent can immediately distinguish it from every sibling (news, tenders, rides, hotels, etc.). There is no near-duplicate tool it could be confused with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says search by title or genre is optional, which tells the agent both the filtered and the unfiltered ('latest films') modes. However, it never frames when to use this tool versus any alternative path, and there is no explicit exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_job_fieldsFields of work hiring nowARead-onlyInspect
The fields of work with open vacancies on BinaSmart right now and how many are in each, plus the cities hiring most — useful before calling list_jobs with a field or city filter.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| cities | No | Cities |
| fields | No | Job fields |
| source_url | No | bina.et page this result comes from; cite it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds some behavioral value by implying freshness ('right now') and an aggregated/ranked result shape, but it says nothing about result size limits, pagination, or caching of the counts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler: the primary payload comes first, the secondary payload second, and the call-to-action last. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only listing tool with an output schema already describing the return shape, the description covers what is returned and when to reach for it. Nothing an agent needs in order to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4 and there is no schema surface for the description to compensate for. No parameter claims are made or needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the exact resource ('fields of work with open vacancies'), the aggregation ('how many are in each'), and the secondary payload ('cities hiring most'), so it is unmistakably not list_jobs or get_job. The only shortfall is that it is phrased as a noun clause rather than an explicit verb+resource statement, and the differentiation from list_jobs is delivered as usage advice rather than as a contrast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the sibling to use next ('useful before calling list_jobs with a field or city filter') and the condition that makes this tool the right first step, which is genuine routing guidance. It stops short of stating when not to call it (e.g., when the caller already knows the field).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_jobsJob vacancies in EthiopiaARead-onlyInspect
Open job vacancies in Ethiopia listed on BinaSmart (bina.et/jobs): the job title, the company posting it, the city, the deadline and days left, salary and requirements where the advert states them. Thousands of vacancies from Ethiopian job boards and employers, refreshed every morning. Search by keyword in English or Amharic, and filter by field of work (banking, accounting, engineering, it, health, education, sales, ngo, logistics, admin, hospitality, construction, agriculture, legal, security, media) or by city. Open vacancies only unless include_closed is set. Where the assistant shows MCP Apps, the result also appears as job cards with an apply link for each vacancy.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City, e.g. Addis Ababa, Adama, Hawassa, Bahir Dar, Dire Dawa | |
| field | No | Field of work: banking, accounting, engineering, it, health, education, sales, ngo, logistics, admin, hospitality, construction, agriculture, legal, security, media. Use list_job_fields to see what is open now. | |
| limit | No | Max vacancies, default 20 | |
| query | No | Keyword in the job title, summary or company name — English or Amharic. Omit for the vacancies closing soonest. | |
| include_closed | No | Include vacancies whose deadline has passed (default false) |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | No | Open vacancies |
| note | No | How to use or present this result |
| count | No | Number of items returned |
| source_url | No | bina.et page this result comes from; cite it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=true, openWorldHint=false), so the bar is lower, and the description adds real context: daily morning refresh, sourcing from multiple Ethiopian job boards and employers, server-side default of open vacancies only, and a UI caveat that results render as job cards with apply links under MCP Apps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the resource and scope, then progressively narrows to filters and defaults. It is somewhat long and repeats the field-of-work enumeration that the schema already carries, but every sentence is informational rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, yet the description still covers the practical essentials: what is indexed, refresh cadence, open-vs-closed default, search language support, and the job-card rendering. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds marginal value by noting Amharic keyword search and that closed vacancies are excluded unless include_closed is set, but it largely restates the field-of-work list and city filter already documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Open job vacancies in Ethiopia listed on BinaSmart') plus the exact fields returned (title, company, city, deadline, salary, requirements). This clearly separates it from get_job (single vacancy), get_employer, and list_job_fields.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives usable search patterns ('Search by keyword in English or Amharic, and filter by field of work or by city') and the open/closed default, but it never routes to alternatives such as get_job for a single vacancy or list_job_fields for field discovery. Usage is implied rather than explicitly delimited.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_newsBinaSmart Amharic newsARead-onlyInspect
Recent articles from BinaSmart news (bina.et/news), mostly in Amharic: technology, business, law, real estate, construction and employment in Ethiopia. Returns the headline, a short excerpt and the url — call get_news_article for the full text.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max articles, default 15 | |
| query | No | Keyword in the headline or excerpt, English or Amharic. Omit for the newest articles. | |
| category | No | Category filter, matched loosely: ቴክኖሎጂ technology, ንግድ business, ሕግ law, ሪል እስቴት real estate, ግንባታ construction, ቅጥር employment, መመሪያ guides. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | Number of items returned |
| articles | No | Amharic news articles |
| source_url | No | bina.et page this result comes from; cite it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety and locality are covered. The description adds a genuinely useful behavioral trait the annotations cannot convey: content is mostly Amharic. It does not mention pagination or result-ordering behavior, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero filler; the identity and topic scope come first, then the return fields and the hand-off to the sibling. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not enumerate return fields in detail, and annotations cover the safety profile. Language, source, topics and the follow-up tool are all present, so nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so limit, query and category are fully documented in the schema, including the loose category matching and the Amharic/English keyword rule. The description's topic list largely restates the category parameter, adding no syntax or semantics beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list), resource (recent articles) and source (BinaSmart news / bina.et/news), plus the topic coverage. It explicitly contrasts with the sibling get_news_article, so an agent can route between the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly implies when to use it (recent articles, browse-level) and names the alternative get_news_article with the condition that selects it (full text). It does not state exclusions versus other list_* siblings, but the usage context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_overseas_agenciesLicensed Ethiopian overseas employment agenciesARead-onlyInspect
Ethiopian agencies that send domestic workers to GCC countries, approved on BinaSmart/GCC Domestic: name, licence, whether it is in the Ministry of Labor and Skills register, and for each country its GCC partner office (the office families contact). Filter by country: UAE, KSA, Qatar, Kuwait, Bahrain, Oman. Recruitment is through LMIS only (Proclamation 1389/2025).
| Name | Required | Description | Default |
|---|---|---|---|
| country | No | GCC destination country; omit for all |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | Number of items returned |
| updated | No | When the list was last updated |
| agencies | No | Licensed agencies with their GCC partner offices |
| source_url | No | bina.et page this result comes from; cite it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description adds genuine context beyond them: the upstream source (BinaSmart/GCC Domestic), the Ministry of Labor and Skills register flag, and the note that recruitment runs through LMIS under Proclamation 1389/2025. It does not discuss pagination or result-set size, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the entity and returned fields come first, filtering second, legal context last. The explicit country enumeration partly duplicates the enum in the schema, which is the only real waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return structure need not be explained, and the description still covers scope, filter behavior, data provenance, and a relevant legal constraint. Complete enough for an agent to call correctly, though result volume/ordering is unmentioned.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter has 100% schema coverage including the enum and the 'omit for all' default, so the baseline is 3. The description only re-lists the same six country values, adding no syntax or semantic detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource (Ethiopian overseas employment agencies licensed to send domestic workers to GCC countries) and the fields returned (name, licence, ministry-register status, per-country partner office). No sibling tool covers this domain, so it is unambiguous by construction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It says how to narrow results by country and implies usage (looking up agencies/partner offices families contact), but never states when to call this versus other lookups or any preconditions. Usage is inferable rather than prescribed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_pool_corridorsBinaPool corridors and seat pricesARead-onlyInspect
BinaPool (ጋራ ጉዞ) is BinaSmart's shared commute in Addis Ababa: up to four riders share one Comfort car and pay per seat. Lists the corridors open right now (Megenagna → Bole, CMC → Bole, Megenagna → Kazanchis, Piassa → Kazanchis, Mexico → Kazanchis; inbound until 13:00 Addis time, outbound after) with their stops, the live seat-price ladder (1–4 riders) and cars currently filling. Riders join at https://bina.et/ride?pool=1.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Rider latitude, to sort by distance | |
| lng | No | Rider longitude |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | How to use or present this result |
| peak | No | true during peak hours |
| join_url | No | Where to join a pool |
| corridors | No | BinaPool corridors with live seat prices |
| direction | No | Commute direction |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful behavior beyond that: the listing is time-gated (inbound/outbound cutoffs), pricing is a live 1–4 rider ladder, and it surfaces "cars currently filling", which tells the agent the result is volatile rather than a static catalog.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense but well front-loaded sentence: the purpose verb lands first, then scope, timing rules, and the join URL. The Amharic brand gloss and corridor enumeration cost length but carry real orientation value; nothing is truly wasted, though it could be broken into two shorter sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shape needn't be explained, and the description covers scope, time conditions, and pricing model. The one real gap is routing guidance against the ride/pool siblings, which is left to the agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both lat/lng already have clear descriptions ("to sort by distance"), and the description adds nothing about them. Per the baseline rule for high-coverage schemas, a 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ("Lists") and resource (BinaPool commute corridors open right now) and enumerates the actual corridors (Megenagna → Bole, CMC → Bole, etc.), so the agent knows exactly what data comes back. The combination of shared-ride context and seat-price ladder is distinctive enough that no sibling in the catalog could be confused with it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives strong situational context ("corridors open right now", inbound until 13:00 Addis time, outbound after) which implies when the listing is valid, but it never tells the agent when to pick this over the ride siblings such as quote_ride, request_ride, or find_pool_groups. Usage is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tender_categoriesTender categories open nowARead-onlyInspect
The categories of tender open on BinaSmart right now and how many are in each — useful before calling list_tenders with a category filter.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| categories | No | Categories |
| open_total | No | Open tenders in total |
| source_url | No | bina.et page this result comes from; cite it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety and worldliness are covered. The description adds that results reflect the current open set ('right now') and include per-category counts, which is modest but real context beyond the annotations. No pagination, freshness, or auth detail is given.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence, front-loaded with what is returned and followed by the routing hint. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description needn't enumerate return fields, and it still tells the agent the shape is category→count. For a zero-param read-only discovery tool this is essentially complete, though it could note whether empty categories are omitted.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters (empty schema), so the baseline of 4 applies; there is nothing for the description to disambiguate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (tender categories), a scope constraint (open on BinaSmart right now), and the returned payload (count per category). It also implicitly distinguishes itself from the sibling list_tenders by being the pre-filter discovery step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent when to reach for it: 'useful before calling list_tenders with a category filter'. That names the sibling and the sequencing. It does not state when NOT to use it (e.g., if you already know the category), so it stops short of a full when/when-not pair.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tendersOpen tenders in EthiopiaARead-onlyInspect
Public tender and procurement notices in Ethiopia listed on BinaSmart (bina.et/tenders): the issuing organisation, what is wanted, the deadline and days left, budget when stated, and a link to the original notice. Banks, government bodies, NGOs and World Bank–financed projects. Open tenders only unless include_closed is set. Search by keyword (English or Amharic) and filter by category such as Supply, Construction, Consultancy, Services, Transport.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max tenders, default 20 | |
| query | No | Keyword in the title, organisation or summary — English or Amharic. Omit for the tenders closing soonest. | |
| newest | No | Newest published first, for "new", "latest", "today" or "this week" (default: closing soonest first). Each tender has published_at, the date that shows whether it is new. | |
| category | No | Category filter, matched loosely: Supply / አቅርቦት, Construction / ግንባታ, Consultancy / ማማከር, Services / አገልግሎት, Transport / ትራንስፖርት, Disposal auction / ሽያጭ ጨረታ. Use list_tender_categories to see what is open now. | |
| include_closed | No | Include tenders whose deadline has passed (default false) |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | How to use or present this result |
| count | No | Number of items returned |
| tenders | No | Open tender notices |
| source_url | No | bina.et page this result comes from; cite it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: the data source (BinaSmart, bina.et/tenders), the returned fields including deadline, days-left and original link, the issuer types covered, and the default open-only filter. It does not mention result caps or pagination, which is a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the resource and scope before filters and defaults. Nearly every clause carries information, though the issuer-type enumeration ('Banks, government bodies, NGOs and World Bank–financed projects') is the one segment that could be trimmed without losing agent-relevant meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return-value explanation is not required, yet the description still summarizes record contents helpfully. With a 5-parameter optional-only schema, a live data source, and category vocabularies, the description supplies everything an agent needs to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline would be 3. The description goes beyond the schema by noting bilingual (English or Amharic) keyword matching, listing the concrete category values, and restating the include_closed default, which meaningfully enriches how the agent should populate parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource (public tender and procurement notices listed on BinaSmart) plus scope (Ethiopia, open tenders). It enumerates exactly what each record contains and who issues them, which cleanly separates it from get_tender (single tender) and list_tender_categories (taxonomy). An agent can identify the tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for use — keyword search in English or Amharic, category filtering, and the default that closed tenders are excluded unless include_closed is set. It does not explicitly state when to prefer this over get_tender or list_tender_categories (the latter pointer lives only in the schema), so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
quote_rideQuote a BinaSmart rideARead-onlyInspect
Fixed upfront price for a ride inside Addis Ababa, Ethiopia — no surge, cash or telebirr/Chapa. Returns distance, ETA and the fare for every vehicle tier (moto, bajaj, economy, comfort, XL). request_ride books at the fare this returns. Also returns book_url: a one-tap bina.et link with this route and fare for the user to confirm.
| Name | Required | Description | Default |
|---|---|---|---|
| pickup | Yes | Pickup: a place name in Addis Ababa (e.g. "Edna Mall", "Bole Airport", "Piassa") or "lat,lng" like "9.0108,38.7578". | |
| dropoff | Yes | Drop-off: a place name in Addis Ababa (e.g. "Edna Mall", "Bole Airport", "Piassa") or "lat,lng" like "9.0108,38.7578". |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | How to use or present this result |
| pickup | No | Resolved pickup place |
| quotes | No | Fixed fare for each vehicle tier |
| dropoff | No | Resolved drop-off place |
| eta_min | No | Trip time in minutes |
| book_url | No | bina.et/ride link with this route for the user to confirm |
| estimate | No | true when the route time is an estimate |
| source_url | No | bina.et page this result comes from; cite it |
| distance_km | No | Route distance in km |
| pickup_coords | No | Pickup "lat,lng" |
| dropoff_coords | No | Drop-off "lat,lng" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuine behavioral context beyond that: no surge pricing, accepted payment methods (cash or telebirr/Chapa), the full tier list returned, and a book_url confirmation link. It stops short of stating auth requirements or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with zero waste: the pricing promise and scope are front-loaded, the return contents follow, and the sibling routing closes. Every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be enumerated, yet the description still names the key fields (distance, ETA, fare per tier, book_url) helpfully. Combined with annotations and a fully documented 2-param schema, nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are fully documented in the schema with format examples (place name or lat,lng). The description only reinforces the geographic constraint ('inside Addis Ababa'), adding little beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (quote) and resource (ride), scopes it geographically (inside Addis Ababa, Ethiopia), and explicitly separates itself from the booking sibling: 'request_ride books at the fare this returns.' An agent can distinguish it from request_ride and get_ride_status without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The relationship to request_ride ('books at the fare this returns') makes the intended workflow clear: quote first, then book. It does not give explicit when-not conditions or name other alternatives, but the sequencing guidance is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_rideBook a BinaSmart rideAIdempotentInspect
Books a ride in Addis Ababa at the fixed fare from quote_ride. It sends a real driver, so it takes the pickup, drop-off, tier, fare and the rider's Ethiopian phone number as the user confirmed them. A dispatcher assigns a driver; the rider is contacted on the phone given. Returns the ride id and a live tracking link. To book for someone else (e.g. a relative in Addis while you are abroad), pass passenger_name and passenger_phone; rider_name/rider_phone are then the booker and may be a foreign number.
| Name | Required | Description | Default |
|---|---|---|---|
| tier | Yes | Vehicle tier from quote_ride | |
| pickup | Yes | Pickup: a place name in Addis Ababa (e.g. "Edna Mall", "Bole Airport", "Piassa") or "lat,lng" like "9.0108,38.7578". Prefer the pickup_coords from quote_ride. | |
| dropoff | Yes | Drop-off: a place name in Addis Ababa (e.g. "Edna Mall", "Bole Airport", "Piassa") or "lat,lng" like "9.0108,38.7578". Prefer the dropoff_coords from quote_ride. | |
| rider_name | Yes | Rider's name (or the booker's name when booking for someone else) | |
| rider_phone | Yes | Ethiopian mobile: 09XXXXXXXX or +2519XXXXXXXX (any number if booking for someone else) | |
| passenger_name | No | Book for someone else: the passenger's name (the driver calls the passenger) | |
| payment_method | No | cash (default) or chapa (telebirr/card link) | |
| passenger_phone | No | Book for someone else: the passenger's Ethiopian mobile (09… or +2519…) |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | How to use or present this result |
| test | No | true for a reviewer test booking (no driver is sent) |
| tier | No | Vehicle tier |
| driver | No | Assigned driver, null until one is assigned |
| pickup | No | Pickup place |
| status | No | dispatching, assigned, arriving, arrived, ontrip, completed, cancelled, or test_booking |
| dropoff | No | Drop-off place |
| ride_id | No | Ride id (needed for get_ride_status and cancel_ride) |
| fare_etb | No | Fixed fare in birr |
| No | BinaSmart WhatsApp support | |
| duplicate | No | true when the same booking was already made |
| next_step | No | What to tell the user now |
| booked_for | No | Passenger name when booked for someone else |
| source_url | No | bina.et page this result comes from; cite it |
| requested_at | No | When the ride was requested (ISO time) |
| tracking_url | No | Live tracking page |
| payment_method | No | cash, telebirr or chapa |
| payment_status | No | Payment status |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=true, openWorldHint=false), and the description adds real value on top: a real driver is dispatched, a human dispatcher assigns the driver, the rider is phoned, and it returns a ride id plus live tracking link. It misses the one thing the idempotentHint most warrants — whether a retried call re-books or returns the same ride — and says nothing about cancellation windows or payment timing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the action and destination, then side effects and return values, then the alternate-booker case. The middle sentence ("It sends a real driver, so it takes ... as the user confirmed them") is compressed to the point of being slightly hard to parse, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, yet the description still usefully names the return payload, and the 8-parameter mutation surface is well covered including the optional passenger and payment paths. What's still absent is preconditions: account/registration needs and whether a payment authorization happens at booking time for chapa.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the per-field semantics are already documented and the baseline is 3. The description does contribute the cross-field meaning of passenger_name/passenger_phone flipping rider_name/rider_phone into booker fields with a possibly foreign number, which the schema only states tersely, so it edges toward useful without reaching 4-level depth on fare/payment semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Books a ride") scoped to Addis Ababa at the fixed fare from quote_ride. It is clearly distinguishable from the pricing sibling quote_ride and from get_ride_status/cancel_ride, which handle post-booking lifecycle.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage context: fare must come from quote_ride, inputs passed "as the user confirmed them", and a full explanation of the booking-for-someone-else variant. It does not explicitly name the when-not path (e.g. use cancel_ride to undo, or re-quote if details change), so the routing guidance is strong but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_carsCars for sale in Addis AbabaARead-onlyInspect
Live new and used cars on bina.et/cars from Addis Ababa dealers' and car markets' own websites, checked every week: make, model, year, price, mileage, fuel, gearbox, the dealer with its own phone and WhatsApp, and a bina.et link with every photo. Use for "used Toyota", "SUV under 10 million birr", "electric car price", "BYD". Not for taxi rides. Source: the BinaSmart car listings at https://bina.et/cars.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Body type | |
| fuel | No | Fuel type | |
| make | No | Brand, e.g. Toyota, Suzuki, BYD, Hyundai, Ford | |
| limit | No | Max results, default 5 | |
| model | No | Model name, e.g. Corolla, Vitz, Dzire, Atto 3 | |
| min_year | No | Oldest model year to include, e.g. 2018 | |
| condition | No | New or used | |
| max_price | No | Highest price in birr | |
| cheapest_first | No | true to sort by lowest price first |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | How to use or present this result |
| count | No | Number of items returned |
| results | No | Cars from the dealers' own websites |
| source_url | No | bina.et page this result comes from; cite it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the bar is lower, but the description still adds real context: weekly refresh cadence, provenance (dealers' own sites), and that results carry dealer phone/WhatsApp and a bina.et link with photos. It does not discuss pagination or the limit ceiling, so not a full 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense, front-loaded passage that leads with the verb+resource before examples and exclusions. Minor waste: the bina.et URL appears twice, once inline and again as a trailing "Source:" line, which is redundant rather than clarifying.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value detail is not required, and the description covers purpose, freshness, provenance and routing. Given nine optional parameters and a curated dataset, it is complete enough to call correctly, though default behavior (limit=5) is left entirely to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all nine parameters are already documented with types, enums and bounds; baseline 3 applies. The description's example queries (price in birr, brand names, body types) loosely reinforce make/price/body fields but add no syntax or filtering semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (search live new/used cars) with a concrete scope: Addis Ababa dealers and car markets. The listed attributes (make, model, year, price, mileage, fuel, gearbox, dealer contact, photos) make it unmistakable against siblings like search_properties or search_hotels.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger examples ("used Toyota", "SUV under 10 million birr", "BYD") and an explicit exclusion ("Not for taxi rides"), which routes the agent toward quote_ride/request_ride. Both the when and the when-not are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_healthHospitals, clinics, dentists and doctors in Addis AbabaARead-onlyInspect
Find hospitals, clinics, dentists, laboratories, health centres and doctors in Addis Ababa from BinaSmart Health (bina.et/health, 250+ places from the city map plus services and doctors the facilities confirmed; doctors' licences are checked by the BinaSmart team). Filter by kind, sub-city, a place to be near (nearest first) and a specialty (children, gynecology, eye, heart, bone, fertility, skin, mental health, blood test). Returns each place's bina.et/health page, landline, sub-city, distance, and its services and doctors when known. Not medical advice; emergencies: 907.
| Name | Required | Description | Default |
|---|---|---|---|
| area | No | A sub-city: Bole, Kirkos, Arada, Yeka, Lideta, Gulele, Addis Ketema, Kolfe Keranio, Nifas Silk-Lafto, Akaki Kality, Lemi Kura (English or Amharic) | |
| kind | No | lab = laboratory or diagnostic centre; doctor = individual doctors' profiles | |
| near | No | A neighbourhood or landmark to be near, e.g. Piassa, CMC, Megenagna, Edna Mall. Nearest places first. | |
| limit | No | Max results, default 6 | |
| specialty | No | A specialty, service or part of a name, e.g. children, gynecology, eye, blood test, Hayat |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | How to use or present this result |
| count | No | Number of items returned |
| results | No | Hospitals, clinics, labs and doctors |
| source_url | No | bina.et page this result comes from; cite it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/openWorldHint annotations, it discloses data provenance and quality (250+ places from the city map, services and doctors confirmed by facilities, doctor licences verified by the BinaSmart team) plus the returned fields (bina.et page, landline, sub-city, distance). It also flags the non-clinical nature of the results and the emergency number, which annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense paragraph but well front-loaded: purpose, then filters, then returns, then disclaimer. Every clause carries information, though the filter/return/disclaimer run-ons in one block make it slightly harder to scan than it could be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With five optional parameters, an output schema, and read-only annotations already covering safety, the description supplies everything else an agent needs: filter semantics, result ordering, return shape, provenance and a scope disclaimer. Nothing material is left for the agent to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds meaning: the specialty list expands the enum-like value space (children, gynecology, eye, heart, bone, fertility, skin, mental health, blood test), and 'nearest first' documents the ordering semantics of the near parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource (find hospitals, clinics, dentists, laboratories, health centres and doctors) scoped to Addis Ababa, and names the data source (BinaSmart Health, 250+ places). The health-only scope makes it unmistakable against siblings like search_places or search_hotels.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Enumerates the four usable filter dimensions (kind, sub-city, near, specialty) with concrete specialty examples, and sets a scope boundary ('Not medical advice; emergencies: 907'). It never explicitly states when to prefer a sibling such as search_places, so routing guidance is implicit rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_hotelsHotels and guest houses in Addis AbabaARead-onlyInspect
Hotels, guest houses, pensions, hostels and furnished apartments in Addis Ababa from BinaSmart's directory (1,000+ places from the city map): name, type, sub-city, stars, the hotel's own office phone and website, and its bina.et page. It has no prices or room availability: those come from the hotel, whose phone is included. Not for hospitals or clinics (use search_health) or for shops, restaurants and other buildings (use search_places).
| Name | Required | Description | Default |
|---|---|---|---|
| area | No | Sub-city or area in English or Amharic, e.g. Bole, Kirkos, Arada, ቦሌ | |
| kind | No | hotel; guest_house (also pensions, ፔንስዮን, መኝታ); hostel; motel; apartment (furnished apartments and suites) | |
| name | No | Part of the hotel name | |
| limit | No | Max results, default 6 | |
| min_stars | No | Only hotels with at least this many stars (1-5) |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | How to use or present this result |
| count | No | Number of items returned |
| results | No | Hotels and guest houses |
| source_url | No | bina.et page this result comes from; cite it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, so the description adds real value: a directory with no prices or room availability, and a note that the hotel's own phone is the fallback channel. That tells the agent how to set expectations on results. It does not mention the hard result cap beyond what the schema's limit maximum enforces, so it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no filler. Scope and source are front-loaded, the limitation follows, and exclusions come last — a clean information hierarchy with every clause earning its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't explain return values, and it covers scope, exclusions, and the price/availability caveat. The one gap is the relationship to get_hotel_rooms and search_properties, which the description leaves ambiguous.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with area, kind, name, limit, and min_stars all documented, including the Amharic examples and the enum's synonym mapping. The description adds essentially nothing parameter-level beyond repeating 'sub-city' as a returned field, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names the resource (hotels, guest houses, pensions, hostels, furnished apartments), the geography (Addis Ababa), the source (BinaSmart's directory, 1,000+ places) and the exact fields returned. It explicitly rules out adjacent categories by naming the sibling tools (search_health, search_places), so an agent can separate it from its neighbors without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear when-not-to-use guidance with named alternatives (search_health for clinics, search_places for restaurants and shops), which is more than most definitions offer. However, it omits any routing to get_hotel_rooms and instead says availability comes from the hotel's phone — the existence of a dedicated rooms sibling makes that advice misleading at the edges, and the overlap with search_properties for furnished apartments is unaddressed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_knowledgeSearch BinaSmart knowledgeARead-onlyInspect
Semantic search over BinaSmart's knowledge base: every service (BinaRide, BinaPool shared commute, Bina Airport, hotels, cinema, BinaWatch, insurance, flights, property, cars, tenders), the product rules (fixed fares, what is demo, payments), the 25 Digital Ethiopia guides, and practical Addis Ababa knowledge (neighbourhoods, transport hubs, Ethiopian time and calendar, emergency numbers). For questions about BinaSmart, Ethiopian paperwork or getting around Addis. Returns the best-matching passages, each with its source url. Exact fares are not in the passages: they come from quote_ride.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | How many passages (default 4) | |
| query | Yes | Question or keywords, English or Amharic |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | How to use or present this result |
| query | No | The query searched |
| results | No | Best-matching passages |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered and the description adds the boundary of the corpus plus the result shape ('best-matching passages, each with its source url'). It stops short of noting result-count behaviour beyond k or any ranking/coverage caveats, but adds real context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the verb+resource before the coverage list. The long parenthetical enumeration of services is dense but it is the information that makes scope unambiguous; nothing is padding, though it could be trimmed slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema and annotations exist, so the description does not need to explain return values; it still summarises them briefly. Purpose, corpus scope, use conditions, and the fare exception are all present, leaving nothing an agent needs before calling it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters carry their own descriptions including the default of k and the English/Amharic input allowance. The description adds no further parameter guidance, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Semantic search over BinaSmart's knowledge base') and then enumerates the corpora it covers, so an agent can tell exactly what content is reachable. It also distinguishes itself from quote_ride on the one point of overlap (exact fares).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit use condition ('For questions about BinaSmart, Ethiopian paperwork or getting around Addis') and an explicit exclusion with the alternative to use instead ('Exact fares are not in the passages: they come from quote_ride'). The agent is routed rather than left to guess.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_placesSearch the BinaSmart directoryARead-onlyInspect
Find buildings, hotels, hospitals and shops in Addis Ababa listed on BinaSmart (bina.et): cafés, restaurants, pharmacies, banks, gyms, salons, clinics, offices. Returns names (English + Amharic), building and unit, the phone only for shops that have claimed their listing, coordinates when known (usable as pickup/dropoff for quote_ride), and the bina.et page. Hotels and hospitals are flagged — use get_hotel_rooms / get_hospital_departments for details. For hospitals, clinics, dentists, labs and doctors anywhere in Addis Ababa, use search_health. For food (restaurants, cafes, a dish, "lunch near Megenagna") with no listed shop it returns map_place results from the city map: name, area, distance, coords and ride link, with no phone, hours, prices or menu (see map_note).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results per kind (default 8) | |
| query | Yes | Name or part of a name, English or Amharic | |
| category | No | Shop category filter: cafe | restaurant | pharmacy | retail | service | gym | salon | clinic | bank | office | other |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | How to use or present this result |
| count | No | Number of items returned |
| results | No | Matching places |
| source_url | No | bina.et page this result comes from; cite it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint; the description adds substantial extra context — phone numbers appear only for claimed listings, coordinates are reusable as pickup/dropoff for quote_ride, hotels/hospitals are flagged, and the map fallback omits phone/hours/prices/menu. This is meaningful behavioral disclosure beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and coverage are front-loaded, and the semicolon-separated content mostly earns its place, but the single dense paragraph packs in return-field and fallback detail that borders on overload.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, the description need not explain returns, yet it still covers the key asymmetries (claimed vs unclaimed phone, map fallback limitations) and routing to sibling tools, leaving nothing an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so query, limit (default 8, max 25), and category are already documented. The description lists categories in prose but adds no syntax or format detail beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Find') and resource (buildings, hotels, hospitals, shops in Addis Ababa listed on BinaSmart) and enumerates the covered categories. It clearly differentiates itself from siblings like search_health, get_hotel_rooms, and get_hospital_departments, so an agent can route without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names alternatives and the conditions that select them: use get_hotel_rooms / get_hospital_departments for detail, search_health for health providers anywhere in the city, and it explains the map_place fallback for food searches with no listed shop. When-to-use and when-to-switch are both spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_propertiesHomes, land and shops for sale or rent in Addis AbabaARead-onlyInspect
Live listings on bina.et/property from Addis Ababa real-estate companies' own websites, checked every week: title, price as the company wrote it (some per m² or in USD), bedrooms, size, area, the listing company with its own phone and WhatsApp, the date the company last updated it, and a bina.et link with every photo. Use for "apartment for rent in Bole", "3 bedroom for sale", "ቤት ኪራይ". Every listing and price is as the company published it.
| Name | Required | Description | Default |
|---|---|---|---|
| area | No | Neighbourhood in English or Amharic, e.g. Bole, Sarbet, CMC, Ayat, ሳርቤት | |
| beds | No | At least this many bedrooms (0 = studio) | |
| type | No | Property type | |
| limit | No | Max results, default 5 | |
| query | No | Other words: a building, project or company name | |
| listing | No | Buy (sale) or rent | |
| max_price | No | Highest price in birr (total for sale, per month for rent) |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | How to use or present this result |
| count | No | Number of items returned |
| results | No | Listings from the companies' own websites |
| source_url | No | bina.et page this result comes from; cite it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description adds meaningful context beyond that: data is refreshed weekly, prices are unmodified (some expressed per m² or in USD), and listings carry the company's own phone/WhatsApp. The warning that prices are as-published rather than normalized is a genuinely useful behavioral caveat.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence front-loads the source and refresh cadence well, but it then spends most of its length enumerating returned fields even though an output schema exists, making that portion largely redundant. The three-sentence structure is legible but the field list could be trimmed without loss.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the annotations cover the safety profile. The description fills the remaining gaps an agent needs: provenance, refresh cadence, price-format caveats, and concrete query examples. The lack of any exclusion or alternative-tool guidance is the only notable gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds the important note that prices may be written per m² or in USD, which bears on interpreting max_price (documented as birr), but it does not explain how to use area, beds, type, or limit beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource (live Addis Ababa property listings sourced from real-estate companies' own sites via bina.et) and enumerates what each listing contains. There is no direct property sibling among the other search_* tools to differentiate from, so explicit sibling routing is absent, but the domain is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides concrete example intents: "apartment for rent in Bole", "3 bedroom for sale", and the Amharic "ቤት ኪራይ", which tells the agent the kinds of queries this tool serves. It does not state when NOT to use it or name alternatives, so it stops short of explicit when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
27 tool updates
v0.1.2- Changed
cancel_ride1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "driver": { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "name": { + "description": "Driver name", + "type": [ + "string", + "null" + ] + }, + "phone": { + "description": "Driver phone", + "type": [ + "string", + "null" + ] + }, + "plate": { + "description": "Plate number", + "type": [ + "string", + "null" + ] + }, + "rating": { + "anyOf": [ + { + "type": [ + "number", + "string" + ] + }, + { + "type": "null" + } + ], + "description": "Driver rating" + }, + "vehicle": { + "description": "Vehicle" + } + }, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Assigned driver, null until one is assigned" + }, + "dropoff": { + "description": "Drop-off place", + "type": [ + "string", + "null" + ] + }, + "fare_etb": { + "anyOf": [ + { + "type": [ + "number", + "string" + ] + }, + { + "type": "null" + } + ], + "description": "Fixed fare in birr" + }, + "note": { + "description": "How to use or present this result", + "type": [ + "string", + "null" + ] + }, + "payment_method": { + "description": "cash, telebirr or chapa", + "type": [ + "string", + "null" + ] + }, + "payment_status": { + "description": "Payment status", + "type": [ + "string", + "null" + ] + }, + "pickup": { + "description": "Pickup place", + "type": [ + "string", + "null" + ] + }, + "requested_at": { + "description": "When the ride was requested (ISO time)", + "type": [ + "string", + "null" + ] + }, + "ride_id": { + "description": "Ride id (needed for get_ride_status and cancel_ride)", + "type": [ + "string", + "null" + ] + }, + "source_url": { + "description": "bina.et page this result comes from; cite it", + "type": [ + "string", + "null" + ] + }, + "status": { + "description": "dispatching, assigned, arriving, arrived, ontrip, completed, cancelled, or test_booking", + "type": [ + "string", + "null" + ] + }, + "test": { + "description": "true for a reviewer test booking (no driver is sent)", + "type": [ + "boolean", + "null" + ] + }, + "tier": { + "description": "Vehicle tier", + "type": [ + "string", + "null" + ] + }, + "tracking_url": { + "description": "Live tracking page", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
- Changed
find_pool_groups1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "count": { + "description": "Number of items returned", + "type": [ + "number", + "null" + ] + }, + "groups": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Cars filling up near the given point" + }, + "note": { + "description": "How to use or present this result", + "type": [ + "string", + "null" + ] + }, + "start_one_url": { + "description": "Start a new pool group", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
- Changed
get_employer1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "employer": { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "address": { + "description": "Address", + "type": [ + "string", + "null" + ] + }, + "city": { + "description": "City", + "type": [ + "string", + "null" + ] + }, + "name": { + "description": "Name", + "type": [ + "string", + "null" + ] + }, + "sector": { + "description": "Sector", + "type": [ + "string", + "null" + ] + }, + "url": { + "description": "Employer page", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Employer" + }, + "note": { + "description": "How to use or present this result", + "type": [ + "string", + "null" + ] + }, + "source_url": { + "description": "bina.et page this result comes from; cite it", + "type": [ + "string", + "null" + ] + }, + "vacancies": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Its vacancies on BinaSmart" + } + }, + "type": "object" +}
- Changed
get_ethiopia_guide1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "guides": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "slug": { + "description": "Guide slug", + "type": [ + "string", + "null" + ] + }, + "summary": { + "description": "Summary", + "type": [ + "string", + "null" + ] + }, + "title": { + "description": "Title", + "type": [ + "string", + "null" + ] + }, + "url": { + "description": "Guide page", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Guide list (when called without a slug)" + }, + "note": { + "description": "How to use or present this result", + "type": [ + "string", + "null" + ] + }, + "slug": { + "description": "Guide slug", + "type": [ + "string", + "null" + ] + }, + "source_url": { + "description": "bina.et page this result comes from; cite it", + "type": [ + "string", + "null" + ] + }, + "summary": { + "description": "Summary", + "type": [ + "string", + "null" + ] + }, + "text": { + "description": "Full guide text (Amharic and English)", + "type": [ + "string", + "null" + ] + }, + "title": { + "description": "Guide title", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
- Changed
get_hospital_departments1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "book_url": { + "description": "Appointment page", + "type": [ + "string", + "null" + ] + }, + "date": { + "description": "Date the slots are for (YYYY-MM-DD)", + "type": [ + "string", + "null" + ] + }, + "demo": { + "description": "true for a demo listing", + "type": [ + "boolean", + "null" + ] + }, + "demo_notice": { + "description": "Shown when the listing is a demo", + "type": [ + "string", + "null" + ] + }, + "departments": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "floor": { + "anyOf": [ + { + "type": [ + "number", + "string" + ] + }, + { + "type": "null" + } + ], + "description": "Floor" + }, + "hours": { + "description": "Opening hours", + "type": [ + "string", + "null" + ] + }, + "name": { + "description": "Department", + "type": [ + "string", + "null" + ] + }, + "name_am": { + "description": "Name in Amharic", + "type": [ + "string", + "null" + ] + }, + "room": { + "anyOf": [ + { + "type": [ + "number", + "string" + ] + }, + { + "type": "null" + } + ], + "description": "Room" + }, + "slots_left": { + "description": "Appointment slots left that day", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Departments" + }, + "hospital": { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "city": { + "description": "City", + "type": [ + "string", + "null" + ] + }, + "name": { + "description": "Name", + "type": [ + "string", + "null" + ] + }, + "name_am": { + "description": "Name in Amharic", + "type": [ + "string", + "null" + ] + }, + "sub_city": { + "description": "Sub-city", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Hospital" + }, + "source_url": { + "description": "bina.et page this result comes from; cite it", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
- Changed
get_hotel_rooms1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "book_url": { + "description": "Booking page", + "type": [ + "string", + "null" + ] + }, + "demo": { + "description": "true for a demo listing", + "type": [ + "boolean", + "null" + ] + }, + "demo_notice": { + "description": "Shown when the listing is a demo", + "type": [ + "string", + "null" + ] + }, + "hotel": { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "city": { + "description": "City", + "type": [ + "string", + "null" + ] + }, + "name": { + "description": "Name", + "type": [ + "string", + "null" + ] + }, + "name_am": { + "description": "Name in Amharic", + "type": [ + "string", + "null" + ] + }, + "sub_city": { + "description": "Sub-city", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Hotel" + }, + "rooms": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "capacity": { + "anyOf": [ + { + "type": [ + "number", + "string" + ] + }, + { + "type": "null" + } + ], + "description": "Guests" + }, + "name": { + "description": "Room type", + "type": [ + "string", + "null" + ] + }, + "price_per_night_etb": { + "anyOf": [ + { + "type": [ + "number", + "string" + ] + }, + { + "type": "null" + } + ], + "description": "Nightly price in birr" + }, + "total_rooms": { + "anyOf": [ + { + "type": [ + "number", + "string" + ] + }, + { + "type": "null" + } + ], + "description": "Rooms of this type" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Room types" + }, + "source_url": { + "description": "bina.et page this result comes from; cite it", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
- Changed
get_job1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "job": { + "anyOf": [ + { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The vacancy in full, with detail and employer_profile" + }, + "note": { + "description": "How to use or present this result", + "type": [ + "string", + "null" + ] + }, + "source_url": { + "description": "bina.et page this result comes from; cite it", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
- Changed
get_news_article1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "article": { + "anyOf": [ + { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The article with its full text" + }, + "source_url": { + "description": "bina.et page this result comes from; cite it", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
- Changed
get_ride_status1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "driver": { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "name": { + "description": "Driver name", + "type": [ + "string", + "null" + ] + }, + "phone": { + "description": "Driver phone", + "type": [ + "string", + "null" + ] + }, + "plate": { + "description": "Plate number", + "type": [ + "string", + "null" + ] + }, + "rating": { + "anyOf": [ + { + "type": [ + "number", + "string" + ] + }, + { + "type": "null" + } + ], + "description": "Driver rating" + }, + "vehicle": { + "description": "Vehicle" + } + }, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Assigned driver, null until one is assigned" + }, + "dropoff": { + "description": "Drop-off place", + "type": [ + "string", + "null" + ] + }, + "fare_etb": { + "anyOf": [ + { + "type": [ + "number", + "string" + ] + }, + { + "type": "null" + } + ], + "description": "Fixed fare in birr" + }, + "note": { + "description": "How to use or present this result", + "type": [ + "string", + "null" + ] + }, + "payment_method": { + "description": "cash, telebirr or chapa", + "type": [ + "string", + "null" + ] + }, + "payment_status": { + "description": "Payment status", + "type": [ + "string", + "null" + ] + }, + "pickup": { + "description": "Pickup place", + "type": [ + "string", + "null" + ] + }, + "requested_at": { + "description": "When the ride was requested (ISO time)", + "type": [ + "string", + "null" + ] + }, + "ride_id": { + "description": "Ride id (needed for get_ride_status and cancel_ride)", + "type": [ + "string", + "null" + ] + }, + "source_url": { + "description": "bina.et page this result comes from; cite it", + "type": [ + "string", + "null" + ] + }, + "status": { + "description": "dispatching, assigned, arriving, arrived, ontrip, completed, cancelled, or test_booking", + "type": [ + "string", + "null" + ] + }, + "test": { + "description": "true for a reviewer test booking (no driver is sent)", + "type": [ + "boolean", + "null" + ] + }, + "tier": { + "description": "Vehicle tier", + "type": [ + "string", + "null" + ] + }, + "tracking_url": { + "description": "Live tracking page", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
- Changed
get_tender1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "note": { + "description": "How to use or present this result", + "type": [ + "string", + "null" + ] + }, + "source_url": { + "description": "bina.et page this result comes from; cite it", + "type": [ + "string", + "null" + ] + }, + "tender": { + "anyOf": [ + { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The tender in full, with detail" + } + }, + "type": "object" +}
- Changed
list_events1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "book_hint": { + "description": "How tickets are bought", + "type": [ + "string", + "null" + ] + }, + "count": { + "description": "Number of items returned", + "type": [ + "number", + "null" + ] + }, + "events": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "price_from_etb": { + "anyOf": [ + { + "type": [ + "number", + "string" + ] + }, + { + "type": "null" + } + ], + "description": "Lowest ticket price in birr" + }, + "seats_left": { + "anyOf": [ + { + "type": [ + "number", + "string" + ] + }, + { + "type": "null" + } + ], + "description": "Seats left" + }, + "show_id": { + "anyOf": [ + { + "type": [ + "number", + "string" + ] + }, + { + "type": "null" + } + ], + "description": "Event id" + }, + "starts_at": { + "description": "Start time", + "type": [ + "string", + "null" + ] + }, + "title": { + "description": "Title", + "type": [ + "string", + "null" + ] + }, + "url": { + "description": "Ticket page", + "type": [ + "string", + "null" + ] + }, + "venue": { + "description": "Venue", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Upcoming events" + }, + "source_url": { + "description": "bina.et page this result comes from; cite it", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
- Changed
list_films1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "count": { + "description": "Number of items returned", + "type": [ + "number", + "null" + ] + }, + "films": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "free": { + "description": "true if free to watch", + "type": [ + "boolean", + "null" + ] + }, + "slug": { + "description": "Film slug", + "type": [ + "string", + "null" + ] + }, + "title": { + "description": "Title", + "type": [ + "string", + "null" + ] + }, + "title_am": { + "description": "Title in Amharic", + "type": [ + "string", + "null" + ] + }, + "url": { + "description": "Watch page", + "type": [ + "string", + "null" + ] + }, + "year": { + "anyOf": [ + { + "type": [ + "number", + "string" + ] + }, + { + "type": "null" + } + ], + "description": "Year" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Amharic films" + }, + "source_url": { + "description": "bina.et page this result comes from; cite it", + "type": [ + "string", + "null" + ] + }, + "watch_hint": { + "description": "How to watch", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
- Changed
list_job_fields1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "cities": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "city": { + "description": "City", + "type": [ + "string", + "null" + ] + }, + "open_vacancies": { + "description": "Open vacancies", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Cities" + }, + "fields": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "field": { + "description": "Field", + "type": [ + "string", + "null" + ] + }, + "open_vacancies": { + "description": "Open vacancies", + "type": [ + "number", + "null" + ] + }, + "url": { + "description": "Page", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Job fields" + }, + "source_url": { + "description": "bina.et page this result comes from; cite it", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
- Changed
list_jobs1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "count": { + "description": "Number of items returned", + "type": [ + "number", + "null" + ] + }, + "jobs": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "city": { + "description": "City", + "type": [ + "string", + "null" + ] + }, + "closed": { + "description": "true if closed", + "type": [ + "boolean", + "null" + ] + }, + "days_left": { + "description": "Days until the deadline", + "type": [ + "number", + "null" + ] + }, + "deadline": { + "description": "Application deadline", + "type": [ + "string", + "null" + ] + }, + "employer": { + "description": "Employer", + "type": [ + "string", + "null" + ] + }, + "employer_url": { + "description": "Employer page", + "type": [ + "string", + "null" + ] + }, + "field": { + "description": "Field", + "type": [ + "string", + "null" + ] + }, + "slug": { + "description": "Job slug for get_job", + "type": [ + "string", + "null" + ] + }, + "title": { + "description": "Job title", + "type": [ + "string", + "null" + ] + }, + "url": { + "description": "Job page", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Open vacancies" + }, + "note": { + "description": "How to use or present this result", + "type": [ + "string", + "null" + ] + }, + "source_url": { + "description": "bina.et page this result comes from; cite it", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
- Changed
list_news1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "articles": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "category": { + "description": "Category", + "type": [ + "string", + "null" + ] + }, + "excerpt": { + "description": "Excerpt", + "type": [ + "string", + "null" + ] + }, + "published_at": { + "description": "Published", + "type": [ + "string", + "null" + ] + }, + "slug": { + "description": "Article slug for get_news_article", + "type": [ + "string", + "null" + ] + }, + "title": { + "description": "Title", + "type": [ + "string", + "null" + ] + }, + "title_am": { + "description": "Title in Amharic", + "type": [ + "string", + "null" + ] + }, + "url": { + "description": "Article page", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Amharic news articles" + }, + "count": { + "description": "Number of items returned", + "type": [ + "number", + "null" + ] + }, + "source_url": { + "description": "bina.et page this result comes from; cite it", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
- Changed
list_overseas_agencies1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "agencies": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Licensed agencies with their GCC partner offices" + }, + "count": { + "description": "Number of items returned", + "type": [ + "number", + "null" + ] + }, + "source_url": { + "description": "bina.et page this result comes from; cite it", + "type": [ + "string", + "null" + ] + }, + "updated": { + "description": "When the list was last updated", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
- Changed
list_pool_corridors1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "corridors": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "carFareEtb": { + "description": "Whole-car fare in birr", + "type": [ + "number", + "null" + ] + }, + "from": { + "anyOf": [ + { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Start point" + }, + "key": { + "description": "Corridor id", + "type": [ + "string", + "null" + ] + }, + "leavesInS": { + "description": "Seconds until the next car leaves", + "type": [ + "number", + "null" + ] + }, + "name": { + "description": "Corridor name", + "type": [ + "string", + "null" + ] + }, + "nameAm": { + "description": "Name in Amharic", + "type": [ + "string", + "null" + ] + }, + "seats": { + "description": "Seats per car", + "type": [ + "number", + "null" + ] + }, + "to": { + "anyOf": [ + { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "End point" + }, + "waiting": { + "description": "Riders waiting", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "BinaPool corridors with live seat prices" + }, + "direction": { + "description": "Commute direction", + "type": [ + "string", + "null" + ] + }, + "join_url": { + "description": "Where to join a pool", + "type": [ + "string", + "null" + ] + }, + "note": { + "description": "How to use or present this result", + "type": [ + "string", + "null" + ] + }, + "peak": { + "description": "true during peak hours", + "type": [ + "boolean", + "null" + ] + } + }, + "type": "object" +}
- Changed
list_tender_categories1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "categories": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "category": { + "description": "Category", + "type": [ + "string", + "null" + ] + }, + "open": { + "description": "Open tenders", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Categories" + }, + "open_total": { + "description": "Open tenders in total", + "type": [ + "number", + "null" + ] + }, + "source_url": { + "description": "bina.et page this result comes from; cite it", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
- Changed
list_tenders1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "count": { + "description": "Number of items returned", + "type": [ + "number", + "null" + ] + }, + "note": { + "description": "How to use or present this result", + "type": [ + "string", + "null" + ] + }, + "source_url": { + "description": "bina.et page this result comes from; cite it", + "type": [ + "string", + "null" + ] + }, + "tenders": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "category": { + "description": "Category", + "type": [ + "string", + "null" + ] + }, + "closed": { + "description": "true if closed", + "type": [ + "boolean", + "null" + ] + }, + "days_left": { + "description": "Days until the deadline", + "type": [ + "number", + "null" + ] + }, + "deadline": { + "description": "Bid deadline", + "type": [ + "string", + "null" + ] + }, + "org": { + "description": "Issuing organisation", + "type": [ + "string", + "null" + ] + }, + "original_notice": { + "description": "Link to the original notice", + "type": [ + "string", + "null" + ] + }, + "region": { + "description": "Region", + "type": [ + "string", + "null" + ] + }, + "slug": { + "description": "Tender slug for get_tender", + "type": [ + "string", + "null" + ] + }, + "title": { + "description": "Title", + "type": [ + "string", + "null" + ] + }, + "url": { + "description": "Tender page", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Open tender notices" + } + }, + "type": "object" +}
- Changed
quote_ride1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "book_url": { + "description": "bina.et/ride link with this route for the user to confirm", + "type": [ + "string", + "null" + ] + }, + "distance_km": { + "description": "Route distance in km", + "type": [ + "number", + "null" + ] + }, + "dropoff": { + "description": "Resolved drop-off place", + "type": [ + "string", + "null" + ] + }, + "dropoff_coords": { + "description": "Drop-off \"lat,lng\"", + "type": [ + "string", + "null" + ] + }, + "estimate": { + "description": "true when the route time is an estimate", + "type": [ + "boolean", + "null" + ] + }, + "eta_min": { + "description": "Trip time in minutes", + "type": [ + "number", + "null" + ] + }, + "note": { + "description": "How to use or present this result", + "type": [ + "string", + "null" + ] + }, + "pickup": { + "description": "Resolved pickup place", + "type": [ + "string", + "null" + ] + }, + "pickup_coords": { + "description": "Pickup \"lat,lng\"", + "type": [ + "string", + "null" + ] + }, + "quotes": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "book_url": { + "description": "bina.et/ride link for this tier", + "type": [ + "string", + "null" + ] + }, + "eta_min": { + "description": "Driver arrival estimate in minutes", + "type": [ + "number", + "null" + ] + }, + "fare_etb": { + "description": "Fixed fare in birr", + "type": [ + "number", + "null" + ] + }, + "label": { + "description": "Tier name", + "type": [ + "string", + "null" + ] + }, + "label_am": { + "description": "Tier name in Amharic", + "type": [ + "string", + "null" + ] + }, + "seats": { + "description": "Seats", + "type": [ + "number", + "null" + ] + }, + "tier": { + "description": "Tier id to pass to request_ride", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Fixed fare for each vehicle tier" + }, + "source_url": { + "description": "bina.et page this result comes from; cite it", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
- Changed
request_ride1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "booked_for": { + "description": "Passenger name when booked for someone else", + "type": [ + "string", + "null" + ] + }, + "driver": { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "name": { + "description": "Driver name", + "type": [ + "string", + "null" + ] + }, + "phone": { + "description": "Driver phone", + "type": [ + "string", + "null" + ] + }, + "plate": { + "description": "Plate number", + "type": [ + "string", + "null" + ] + }, + "rating": { + "anyOf": [ + { + "type": [ + "number", + "string" + ] + }, + { + "type": "null" + } + ], + "description": "Driver rating" + }, + "vehicle": { + "description": "Vehicle" + } + }, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Assigned driver, null until one is assigned" + }, + "dropoff": { + "description": "Drop-off place", + "type": [ + "string", + "null" + ] + }, + "duplicate": { + "description": "true when the same booking was already made", + "type": [ + "boolean", + "null" + ] + }, + "fare_etb": { + "anyOf": [ + { + "type": [ + "number", + "string" + ] + }, + { + "type": "null" + } + ], + "description": "Fixed fare in birr" + }, + "next_step": { + "description": "What to tell the user now", + "type": [ + "string", + "null" + ] + }, + "note": { + "description": "How to use or present this result", + "type": [ + "string", + "null" + ] + }, + "payment_method": { + "description": "cash, telebirr or chapa", + "type": [ + "string", + "null" + ] + }, + "payment_status": { + "description": "Payment status", + "type": [ + "string", + "null" + ] + }, + "pickup": { + "description": "Pickup place", + "type": [ + "string", + "null" + ] + }, + "requested_at": { + "description": "When the ride was requested (ISO time)", + "type": [ + "string", + "null" + ] + }, + "ride_id": { + "description": "Ride id (needed for get_ride_status and cancel_ride)", + "type": [ + "string", + "null" + ] + }, + "source_url": { + "description": "bina.et page this result comes from; cite it", + "type": [ + "string", + "null" + ] + }, + "status": { + "description": "dispatching, assigned, arriving, arrived, ontrip, completed, cancelled, or test_booking", + "type": [ + "string", + "null" + ] + }, + "test": { + "description": "true for a reviewer test booking (no driver is sent)", + "type": [ + "boolean", + "null" + ] + }, + "tier": { + "description": "Vehicle tier", + "type": [ + "string", + "null" + ] + }, + "tracking_url": { + "description": "Live tracking page", + "type": [ + "string", + "null" + ] + }, + "whatsapp": { + "description": "BinaSmart WhatsApp support", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
- Changed
search_cars1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "count": { + "description": "Number of items returned", + "type": [ + "number", + "null" + ] + }, + "note": { + "description": "How to use or present this result", + "type": [ + "string", + "null" + ] + }, + "results": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "condition": { + "description": "New or used", + "type": [ + "string", + "null" + ] + }, + "dealer": { + "description": "Dealer", + "type": [ + "string", + "null" + ] + }, + "fuel": { + "description": "Fuel", + "type": [ + "string", + "null" + ] + }, + "link": { + "description": "bina.et listing", + "type": [ + "string", + "null" + ] + }, + "make": { + "description": "Make", + "type": [ + "string", + "null" + ] + }, + "model": { + "description": "Model", + "type": [ + "string", + "null" + ] + }, + "phone": { + "description": "Dealer phone", + "type": [ + "string", + "null" + ] + }, + "price": { + "description": "Price as the dealer wrote it", + "type": [ + "string", + "null" + ] + }, + "title": { + "description": "Title", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Cars from the dealers' own websites" + }, + "source_url": { + "description": "bina.et page this result comes from; cite it", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
- Changed
search_health1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "count": { + "description": "Number of items returned", + "type": [ + "number", + "null" + ] + }, + "note": { + "description": "How to use or present this result", + "type": [ + "string", + "null" + ] + }, + "results": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "area": { + "description": "Area", + "type": [ + "string", + "null" + ] + }, + "hours": { + "description": "Hours", + "type": [ + "string", + "null" + ] + }, + "kind": { + "description": "Type", + "type": [ + "string", + "null" + ] + }, + "name": { + "description": "Name", + "type": [ + "string", + "null" + ] + }, + "nameAm": { + "description": "Name in Amharic", + "type": [ + "string", + "null" + ] + }, + "phone": { + "description": "Phone", + "type": [ + "string", + "null" + ] + }, + "url": { + "description": "bina.et/health page", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Hospitals, clinics, labs and doctors" + }, + "source_url": { + "description": "bina.et page this result comes from; cite it", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
- Changed
search_hotels1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "count": { + "description": "Number of items returned", + "type": [ + "number", + "null" + ] + }, + "note": { + "description": "How to use or present this result", + "type": [ + "string", + "null" + ] + }, + "results": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "area": { + "description": "Area", + "type": [ + "string", + "null" + ] + }, + "kind": { + "description": "Type", + "type": [ + "string", + "null" + ] + }, + "link": { + "description": "bina.et page", + "type": [ + "string", + "null" + ] + }, + "name": { + "description": "Name", + "type": [ + "string", + "null" + ] + }, + "nameAm": { + "description": "Name in Amharic", + "type": [ + "string", + "null" + ] + }, + "phone": { + "description": "Hotel phone", + "type": [ + "string", + "null" + ] + }, + "website": { + "description": "Hotel website", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Hotels and guest houses" + }, + "source_url": { + "description": "bina.et page this result comes from; cite it", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
- Changed
search_knowledge1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "note": { + "description": "How to use or present this result", + "type": [ + "string", + "null" + ] + }, + "query": { + "description": "The query searched", + "type": [ + "string", + "null" + ] + }, + "results": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "score": { + "description": "Relevance", + "type": [ + "number", + "null" + ] + }, + "source_url": { + "description": "Page it comes from", + "type": [ + "string", + "null" + ] + }, + "text": { + "description": "Passage", + "type": [ + "string", + "null" + ] + }, + "title": { + "description": "Passage title", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Best-matching passages" + } + }, + "type": "object" +}
- Changed
search_places1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "count": { + "description": "Number of items returned", + "type": [ + "number", + "null" + ] + }, + "note": { + "description": "How to use or present this result", + "type": [ + "string", + "null" + ] + }, + "results": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "city": { + "description": "City", + "type": [ + "string", + "null" + ] + }, + "coords": { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "lat": { + "description": "Latitude", + "type": [ + "number", + "null" + ] + }, + "lng": { + "description": "Longitude", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Coordinates; pass as \"lat,lng\" to quote_ride" + }, + "is_hospital": { + "description": "Use get_hospital_departments", + "type": [ + "boolean", + "null" + ] + }, + "is_hotel": { + "description": "Use get_hotel_rooms", + "type": [ + "boolean", + "null" + ] + }, + "kind": { + "description": "Place type", + "type": [ + "string", + "null" + ] + }, + "name": { + "description": "Name", + "type": [ + "string", + "null" + ] + }, + "name_am": { + "description": "Name in Amharic", + "type": [ + "string", + "null" + ] + }, + "slug": { + "description": "Place slug", + "type": [ + "string", + "null" + ] + }, + "sub_city": { + "description": "Sub-city", + "type": [ + "string", + "null" + ] + }, + "url": { + "description": "bina.et page", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Matching places" + }, + "source_url": { + "description": "bina.et page this result comes from; cite it", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
- Changed
search_properties1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "count": { + "description": "Number of items returned", + "type": [ + "number", + "null" + ] + }, + "note": { + "description": "How to use or present this result", + "type": [ + "string", + "null" + ] + }, + "results": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "area": { + "description": "Area", + "type": [ + "string", + "null" + ] + }, + "company": { + "description": "Listing company", + "type": [ + "string", + "null" + ] + }, + "link": { + "description": "bina.et listing", + "type": [ + "string", + "null" + ] + }, + "listing": { + "description": "sale or rent", + "type": [ + "string", + "null" + ] + }, + "phone": { + "description": "Company phone", + "type": [ + "string", + "null" + ] + }, + "price": { + "description": "Price as the company wrote it", + "type": [ + "string", + "null" + ] + }, + "title": { + "description": "Title", + "type": [ + "string", + "null" + ] + }, + "type": { + "description": "Property type", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Listings from the companies' own websites" + }, + "source_url": { + "description": "bina.et page this result comes from; cite it", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
6 tool updates
v0.1.1- Changed
cancel_ride2 fields changed- added
Input schema / properties / ride_id / descriptionAdded value: +"Ride id returned by request_ride" - added
Input schema / properties / rider_phone / descriptionAdded value: +"Ethiopian phone number used to book the ride, e.g. 0911234567 or +251911234567"
- Changed
get_ride_status2 fields changed- added
Input schema / properties / ride_id / descriptionAdded value: +"Ride id returned by request_ride" - added
Input schema / properties / rider_phone / descriptionAdded value: +"Ethiopian phone number used to book the ride, e.g. 0911234567 or +251911234567"
- Changed
list_overseas_agencies1 field changed- added
Input schema / properties / country / descriptionAdded value: +"GCC destination country; omit for all"
- Changed
search_cars6 fields changed- added
Input schema / properties / body / descriptionAdded value: +"Body type" - added
Input schema / properties / cheapest_first / descriptionAdded value: +"true to sort by lowest price first" - added
Input schema / properties / condition / descriptionAdded value: +"New or used" - added
Input schema / properties / fuel / descriptionAdded value: +"Fuel type" - added
Input schema / properties / min_year / descriptionAdded value: +"Oldest model year to include, e.g. 2018" - added
Input schema / properties / model / descriptionAdded value: +"Model name, e.g. Corolla, Vitz, Dzire, Atto 3"
- Changed
search_hotels1 field changed- added
Input schema / properties / min_stars / descriptionAdded value: +"Only hotels with at least this many stars (1-5)"
- Changed
search_properties1 field changed- added
Input schema / properties / type / descriptionAdded value: +"Property type"
27 tool updates
v0.1.0- First observed
cancel_ride - First observed
find_pool_groups - First observed
get_employer - First observed
get_ethiopia_guide - First observed
get_hospital_departments - First observed
get_hotel_rooms - First observed
get_job - First observed
get_news_article - First observed
get_ride_status - First observed
get_tender - First observed
list_events - First observed
list_films - First observed
list_job_fields - First observed
list_jobs - First observed
list_news - First observed
list_overseas_agencies - First observed
list_pool_corridors - First observed
list_tender_categories - First observed
list_tenders - First observed
quote_ride - First observed
request_ride - First observed
search_cars - First observed
search_health - First observed
search_hotels - First observed
search_knowledge - First observed
search_places - First observed
search_properties
TDQS
Scored across 27 tools
Most tools target clearly distinct resources or actions, and descriptions explicitly cross-reference alternatives. However, several search tools (search_places/search_hotels/search_health), BinaPool tools (list_pool_corridors/find_pool_groups), and knowledge tools (search_knowledge/get_ethiopia_guide) have adjacent purposes that rely heavily on descriptions to separate.
All tools use snake_case with a consistent verb_noun pattern (list_*, get_*, search_*, quote_ride, request_ride, cancel_ride, find_pool_groups). Minor verb variety is domain-appropriate and does not break the predictable naming convention.
27 tools for a multi-vertical super-app covering rides, news, tenders, jobs, property, cars, hotels, health, events, films, guides, and knowledge. Each vertical has a small focused set, but the overall count is on the high side.
Ride lifecycle is complete, and discovery/detail pairs exist for jobs, tenders, hotels, health, and news. Minor gaps remain for standalone detail tools for events, films, properties, and cars, though search results and external links let agents work around them.
Maintenance
Related MCP Connectors
African intelligence infrastructure for AI apps, developers, and data products via MCP.
Automate 1,000+ services from any MCP-compatible AI agent: build Applets, run actions and queries.
Melaya is a remote MCP server. It gives an assistant hands on your own Android phone and browser: it reads the screen through the accessibility tree, then taps, types and navigates inside the apps and sites you allow-list, with no per-app API. It also builds, schedules and runs agent pipelines across 6k+ connected tools. OAuth 2.1, nothing to install.
One MCP endpoint over 69 public PPN APIs: search_apis to discover, execute_api to call. Free tier.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables programmatic WhatsApp automation through MCP, including sending messages, managing chats and contacts, searching conversation history, and exchanging media files.MIT
- AlicenseAqualityBmaintenanceEnables public-transport journey planning, place search, realtime departures and timetables, usable from any MCP client.9MIT
- AlicenseNot gradedqualityBmaintenanceGives an AI assistant its own real phone number and email address so it can place and answer calls, book reservations by phone, send and receive texts, and read written summaries, structured details, and transcripts of every conversation. Also manages contacts, persona and voice settings, webhooks, and a unified call/message history through a hosted OAuth-secured MCP endpoint requiring no local code.MIT
- AlicenseNot gradedqualityCmaintenanceEnables MCP-aware agents to initiate M-Pesa B2C/B2B payouts, query transaction status, validate phone numbers, and reconcile M-Pesa statements against ledger CSVs to surface discrepancies, plus structured lookups for county public data and KRA tax helpers. It runs in sandbox mode by default, uses idempotency keys for safe retries, and stays read-only for reconciliation and lookups.MIT