Skip to main content
Glama

BinaSmart MCP server

MCP Registry License: MIT

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/ and mcp-server/lib/widgets.mjs: the job-card page (MCP Apps) served as ui://bina/jobs-v1.html, with the @modelcontextprotocol/ext-apps browser bundle inlined

  • mcp-server/lib/: phone normalisation, an idempotency key so retries never double-book, a per-caller rate limiter, the ride API client

  • api/ and hotels/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_ride and cancel_ride are 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_ride with the reserved number 0900000099: 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.mjs

The tests use reserved test phone numbers only.

Licence

MIT. See LICENSE. © 2026 BinaSmart (Ibrahim Kedir).

Available Tools

27 tools
cancel_rideCancel a rideA
DestructiveIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
ride_idYesRide id returned by request_ride
rider_phoneYesEthiopian phone number used to book the ride, e.g. 0911234567 or +251911234567

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoHow to use or present this result
testNotrue for a reviewer test booking (no driver is sent)
tierNoVehicle tier
driverNoAssigned driver, null until one is assigned
pickupNoPickup place
statusNodispatching, assigned, arriving, arrived, ontrip, completed, cancelled, or test_booking
dropoffNoDrop-off place
ride_idNoRide id (needed for get_ride_status and cancel_ride)
fare_etbNoFixed fare in birr
source_urlNobina.et page this result comes from; cite it
requested_atNoWhen the ride was requested (ISO time)
tracking_urlNoLive tracking page
payment_methodNocash, telebirr or chapa
payment_statusNoPayment status

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 pointA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesLatitude
lngYesLongitude

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoHow to use or present this result
countNoNumber of items returned
groupsNoCars filling up near the given point
start_one_urlNoStart a new pool group

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 vacanciesA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesEmployer slug, e.g. from list_jobs employer_url

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoHow to use or present this result
employerNoEmployer
vacanciesNoIts vacancies on BinaSmart
source_urlNobina.et page this result comes from; cite it

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 guideA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugNoGuide slug from the list, e.g. tin-registration-ethiopia

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoHow to use or present this result
slugNoGuide slug
textNoFull guide text (Amharic and English)
titleNoGuide title
guidesNoGuide list (when called without a slug)
summaryNoSummary
source_urlNobina.et page this result comes from; cite it

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 slotsA
Read-only
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoYYYY-MM-DD (default today)
slugYesHospital slug from search_places

Output Schema

ParametersJSON Schema
NameRequiredDescription
dateNoDate the slots are for (YYYY-MM-DD)
demoNotrue for a demo listing
book_urlNoAppointment page
hospitalNoHospital
source_urlNobina.et page this result comes from; cite it
demo_noticeNoShown when the listing is a demo
departmentsNoDepartments

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 pricesA
Read-only
Inspect

Room types, nightly prices (ETB), capacity and amenities for a hotel listed on BinaSmart. Use the slug from search_places (is_hotel = true).

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesHotel slug from search_places

Output Schema

ParametersJSON Schema
NameRequiredDescription
demoNotrue for a demo listing
hotelNoHotel
roomsNoRoom types
book_urlNoBooking page
source_urlNobina.et page this result comes from; cite it
demo_noticeNoShown when the listing is a demo

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 fullA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesJob slug from list_jobs

Output Schema

ParametersJSON Schema
NameRequiredDescription
jobNoThe vacancy in full, with detail and employer_profile
noteNoHow to use or present this result
source_urlNobina.et page this result comes from; cite it

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 fullA
Read-only
Inspect

The full text of a single BinaSmart news article by its slug from list_news.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesArticle slug from list_news

Output Schema

ParametersJSON Schema
NameRequiredDescription
articleNoThe article with its full text
source_urlNobina.et page this result comes from; cite it

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 statusA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
ride_idYesRide id returned by request_ride
rider_phoneYesEthiopian phone number used to book the ride, e.g. 0911234567 or +251911234567

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoHow to use or present this result
testNotrue for a reviewer test booking (no driver is sent)
tierNoVehicle tier
driverNoAssigned driver, null until one is assigned
pickupNoPickup place
statusNodispatching, assigned, arriving, arrived, ontrip, completed, cancelled, or test_booking
dropoffNoDrop-off place
ride_idNoRide id (needed for get_ride_status and cancel_ride)
fare_etbNoFixed fare in birr
source_urlNobina.et page this result comes from; cite it
requested_atNoWhen the ride was requested (ISO time)
tracking_urlNoLive tracking page
payment_methodNocash, telebirr or chapa
payment_statusNoPayment status

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 fullA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesTender slug from list_tenders

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoHow to use or present this result
tenderNoThe tender in full, with detail
source_urlNobina.et page this result comes from; cite it

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 eventsA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNoNumber of items returned
eventsNoUpcoming events
book_hintNoHow tickets are bought
source_urlNobina.et page this result comes from; cite it

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 onlineA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax films, default 20
queryNoTitle (Amharic or English) or genre to filter by; omit for the latest films

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNoNumber of items returned
filmsNoAmharic films
source_urlNobina.et page this result comes from; cite it
watch_hintNoHow to watch

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 nowA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
citiesNoCities
fieldsNoJob fields
source_urlNobina.et page this result comes from; cite it

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 EthiopiaA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity, e.g. Addis Ababa, Adama, Hawassa, Bahir Dar, Dire Dawa
fieldNoField 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.
limitNoMax vacancies, default 20
queryNoKeyword in the job title, summary or company name — English or Amharic. Omit for the vacancies closing soonest.
include_closedNoInclude vacancies whose deadline has passed (default false)

Output Schema

ParametersJSON Schema
NameRequiredDescription
jobsNoOpen vacancies
noteNoHow to use or present this result
countNoNumber of items returned
source_urlNobina.et page this result comes from; cite it

TDQS

A4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 newsA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax articles, default 15
queryNoKeyword in the headline or excerpt, English or Amharic. Omit for the newest articles.
categoryNoCategory filter, matched loosely: ቴክኖሎጂ technology, ንግድ business, ሕግ law, ሪል እስቴት real estate, ግንባታ construction, ቅጥር employment, መመሪያ guides.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNoNumber of items returned
articlesNoAmharic news articles
source_urlNobina.et page this result comes from; cite it

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 agenciesA
Read-only
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
countryNoGCC destination country; omit for all

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNoNumber of items returned
updatedNoWhen the list was last updated
agenciesNoLicensed agencies with their GCC partner offices
source_urlNobina.et page this result comes from; cite it

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 pricesA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoRider latitude, to sort by distance
lngNoRider longitude

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoHow to use or present this result
peakNotrue during peak hours
join_urlNoWhere to join a pool
corridorsNoBinaPool corridors with live seat prices
directionNoCommute direction

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 nowA
Read-only
Inspect

The categories of tender open on BinaSmart right now and how many are in each — useful before calling list_tenders with a category filter.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
categoriesNoCategories
open_totalNoOpen tenders in total
source_urlNobina.et page this result comes from; cite it

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 EthiopiaA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax tenders, default 20
queryNoKeyword in the title, organisation or summary — English or Amharic. Omit for the tenders closing soonest.
newestNoNewest 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.
categoryNoCategory filter, matched loosely: Supply / አቅርቦት, Construction / ግንባታ, Consultancy / ማማከር, Services / አገልግሎት, Transport / ትራንስፖርት, Disposal auction / ሽያጭ ጨረታ. Use list_tender_categories to see what is open now.
include_closedNoInclude tenders whose deadline has passed (default false)

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoHow to use or present this result
countNoNumber of items returned
tendersNoOpen tender notices
source_urlNobina.et page this result comes from; cite it

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 rideA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pickupYesPickup: a place name in Addis Ababa (e.g. "Edna Mall", "Bole Airport", "Piassa") or "lat,lng" like "9.0108,38.7578".
dropoffYesDrop-off: a place name in Addis Ababa (e.g. "Edna Mall", "Bole Airport", "Piassa") or "lat,lng" like "9.0108,38.7578".

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoHow to use or present this result
pickupNoResolved pickup place
quotesNoFixed fare for each vehicle tier
dropoffNoResolved drop-off place
eta_minNoTrip time in minutes
book_urlNobina.et/ride link with this route for the user to confirm
estimateNotrue when the route time is an estimate
source_urlNobina.et page this result comes from; cite it
distance_kmNoRoute distance in km
pickup_coordsNoPickup "lat,lng"
dropoff_coordsNoDrop-off "lat,lng"

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 rideA
Idempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tierYesVehicle tier from quote_ride
pickupYesPickup: 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.
dropoffYesDrop-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_nameYesRider's name (or the booker's name when booking for someone else)
rider_phoneYesEthiopian mobile: 09XXXXXXXX or +2519XXXXXXXX (any number if booking for someone else)
passenger_nameNoBook for someone else: the passenger's name (the driver calls the passenger)
payment_methodNocash (default) or chapa (telebirr/card link)
passenger_phoneNoBook for someone else: the passenger's Ethiopian mobile (09… or +2519…)

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoHow to use or present this result
testNotrue for a reviewer test booking (no driver is sent)
tierNoVehicle tier
driverNoAssigned driver, null until one is assigned
pickupNoPickup place
statusNodispatching, assigned, arriving, arrived, ontrip, completed, cancelled, or test_booking
dropoffNoDrop-off place
ride_idNoRide id (needed for get_ride_status and cancel_ride)
fare_etbNoFixed fare in birr
whatsappNoBinaSmart WhatsApp support
duplicateNotrue when the same booking was already made
next_stepNoWhat to tell the user now
booked_forNoPassenger name when booked for someone else
source_urlNobina.et page this result comes from; cite it
requested_atNoWhen the ride was requested (ISO time)
tracking_urlNoLive tracking page
payment_methodNocash, telebirr or chapa
payment_statusNoPayment status

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 AbabaA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoBody type
fuelNoFuel type
makeNoBrand, e.g. Toyota, Suzuki, BYD, Hyundai, Ford
limitNoMax results, default 5
modelNoModel name, e.g. Corolla, Vitz, Dzire, Atto 3
min_yearNoOldest model year to include, e.g. 2018
conditionNoNew or used
max_priceNoHighest price in birr
cheapest_firstNotrue to sort by lowest price first

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoHow to use or present this result
countNoNumber of items returned
resultsNoCars from the dealers' own websites
source_urlNobina.et page this result comes from; cite it

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 AbabaA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
areaNoA sub-city: Bole, Kirkos, Arada, Yeka, Lideta, Gulele, Addis Ketema, Kolfe Keranio, Nifas Silk-Lafto, Akaki Kality, Lemi Kura (English or Amharic)
kindNolab = laboratory or diagnostic centre; doctor = individual doctors' profiles
nearNoA neighbourhood or landmark to be near, e.g. Piassa, CMC, Megenagna, Edna Mall. Nearest places first.
limitNoMax results, default 6
specialtyNoA specialty, service or part of a name, e.g. children, gynecology, eye, blood test, Hayat

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoHow to use or present this result
countNoNumber of items returned
resultsNoHospitals, clinics, labs and doctors
source_urlNobina.et page this result comes from; cite it

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 AbabaA
Read-only
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
areaNoSub-city or area in English or Amharic, e.g. Bole, Kirkos, Arada, ቦሌ
kindNohotel; guest_house (also pensions, ፔንስዮን, መኝታ); hostel; motel; apartment (furnished apartments and suites)
nameNoPart of the hotel name
limitNoMax results, default 6
min_starsNoOnly hotels with at least this many stars (1-5)

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoHow to use or present this result
countNoNumber of items returned
resultsNoHotels and guest houses
source_urlNobina.et page this result comes from; cite it

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 knowledgeA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
kNoHow many passages (default 4)
queryYesQuestion or keywords, English or Amharic

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoHow to use or present this result
queryNoThe query searched
resultsNoBest-matching passages

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 directoryA
Read-only
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results per kind (default 8)
queryYesName or part of a name, English or Amharic
categoryNoShop category filter: cafe | restaurant | pharmacy | retail | service | gym | salon | clinic | bank | office | other

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoHow to use or present this result
countNoNumber of items returned
resultsNoMatching places
source_urlNobina.et page this result comes from; cite it

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 AbabaA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
areaNoNeighbourhood in English or Amharic, e.g. Bole, Sarbet, CMC, Ayat, ሳርቤት
bedsNoAt least this many bedrooms (0 = studio)
typeNoProperty type
limitNoMax results, default 5
queryNoOther words: a building, project or company name
listingNoBuy (sale) or rent
max_priceNoHighest price in birr (total for sale, per month for rent)

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoHow to use or present this result
countNoNumber of items returned
resultsNoListings from the companies' own websites
source_urlNobina.et page this result comes from; cite it

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

  1. 27 tool updatesv0.1.2
    • Changedcancel_ride1 field changed
      • changedOutput 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"
        +}
    • Changedfind_pool_groups1 field changed
      • changedOutput 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"
        +}
    • Changedget_employer1 field changed
      • changedOutput 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"
        +}
    • Changedget_ethiopia_guide1 field changed
      • changedOutput 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"
        +}
    • Changedget_hospital_departments1 field changed
      • changedOutput 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"
        +}
    • Changedget_hotel_rooms1 field changed
      • changedOutput 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"
        +}
    • Changedget_job1 field changed
      • changedOutput 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"
        +}
    • Changedget_news_article1 field changed
      • changedOutput 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"
        +}
    • Changedget_ride_status1 field changed
      • changedOutput 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"
        +}
    • Changedget_tender1 field changed
      • changedOutput 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"
        +}
    • Changedlist_events1 field changed
      • changedOutput 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"
        +}
    • Changedlist_films1 field changed
      • changedOutput 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"
        +}
    • Changedlist_job_fields1 field changed
      • changedOutput 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"
        +}
    • Changedlist_jobs1 field changed
      • changedOutput 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"
        +}
    • Changedlist_news1 field changed
      • changedOutput 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"
        +}
    • Changedlist_overseas_agencies1 field changed
      • changedOutput 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"
        +}
    • Changedlist_pool_corridors1 field changed
      • changedOutput 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"
        +}
    • Changedlist_tender_categories1 field changed
      • changedOutput 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"
        +}
    • Changedlist_tenders1 field changed
      • changedOutput 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"
        +}
    • Changedquote_ride1 field changed
      • changedOutput 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"
        +}
    • Changedrequest_ride1 field changed
      • changedOutput 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"
        +}
    • Changedsearch_cars1 field changed
      • changedOutput 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"
        +}
    • Changedsearch_health1 field changed
      • changedOutput 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"
        +}
    • Changedsearch_hotels1 field changed
      • changedOutput 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"
        +}
    • Changedsearch_knowledge1 field changed
      • changedOutput 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"
        +}
    • Changedsearch_places1 field changed
      • changedOutput 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"
        +}
    • Changedsearch_properties1 field changed
      • changedOutput 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"
        +}
  2. 6 tool updatesv0.1.1
    • Changedcancel_ride2 fields changed
      • addedInput schema / properties / ride_id / description
        Added value: +"Ride id returned by request_ride"
      • addedInput schema / properties / rider_phone / description
        Added value: +"Ethiopian phone number used to book the ride, e.g. 0911234567 or +251911234567"
    • Changedget_ride_status2 fields changed
      • addedInput schema / properties / ride_id / description
        Added value: +"Ride id returned by request_ride"
      • addedInput schema / properties / rider_phone / description
        Added value: +"Ethiopian phone number used to book the ride, e.g. 0911234567 or +251911234567"
    • Changedlist_overseas_agencies1 field changed
      • addedInput schema / properties / country / description
        Added value: +"GCC destination country; omit for all"
    • Changedsearch_cars6 fields changed
      • addedInput schema / properties / body / description
        Added value: +"Body type"
      • addedInput schema / properties / cheapest_first / description
        Added value: +"true to sort by lowest price first"
      • addedInput schema / properties / condition / description
        Added value: +"New or used"
      • addedInput schema / properties / fuel / description
        Added value: +"Fuel type"
      • addedInput schema / properties / min_year / description
        Added value: +"Oldest model year to include, e.g. 2018"
      • addedInput schema / properties / model / description
        Added value: +"Model name, e.g. Corolla, Vitz, Dzire, Atto 3"
    • Changedsearch_hotels1 field changed
      • addedInput schema / properties / min_stars / description
        Added value: +"Only hotels with at least this many stars (1-5)"
    • Changedsearch_properties1 field changed
      • addedInput schema / properties / type / description
        Added value: +"Property type"
  3. 27 tool updatesv0.1.0
    • First observedcancel_ride
    • First observedfind_pool_groups
    • First observedget_employer
    • First observedget_ethiopia_guide
    • First observedget_hospital_departments
    • First observedget_hotel_rooms
    • First observedget_job
    • First observedget_news_article
    • First observedget_ride_status
    • First observedget_tender
    • First observedlist_events
    • First observedlist_films
    • First observedlist_job_fields
    • First observedlist_jobs
    • First observedlist_news
    • First observedlist_overseas_agencies
    • First observedlist_pool_corridors
    • First observedlist_tender_categories
    • First observedlist_tenders
    • First observedquote_ride
    • First observedrequest_ride
    • First observedsearch_cars
    • First observedsearch_health
    • First observedsearch_hotels
    • First observedsearch_knowledge
    • First observedsearch_places
    • First observedsearch_properties

TDQS

A4/5.0

Scored across 27 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count4/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables programmatic WhatsApp automation through MCP, including sending messages, managing chats and contacts, searching conversation history, and exchanging media files.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Gives 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
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables 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