GeoArm Taxi — Tbilisi ⇄ Yerevan rides
Server Details
Book shared or private rides between Tbilisi and Yerevan: live prices, schedule, booking requests.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 3 tools
Each tool targets a distinct resource+action: reading offers (get_prices_and_schedule), creating a request (create_booking), and checking its state (get_booking_status). The descriptions explicitly cross-reference each other (read prices before booking, use the token from create_booking), eliminating ambiguity.
All three names follow a consistent snake_case verb_noun pattern (create_booking, get_booking_status, get_prices_and_schedule). The get_* vs create_* prefix cleanly signals read vs write.
Three tools is on the lean side but well-matched to a narrow booking flow: quote, book, track. Nothing extraneous, though the surface is minimal enough that a small addition wouldn't feel crowded.
The core lifecycle (get offer → create request → check status) is fully covered and the request/confirmation flow is well explained. A cancel or list-my-bookings operation is absent, but the dispatcher-mediated confirmation model makes that a minor, workable gap.
Available Tools
3 toolscreate_bookingRequest a bookingAInspect
Sends a booking request for a ride between Tbilisi and Yerevan (a seat, or a whole vehicle) for the passenger. A booking is a request: it is NOT confirmed until a GeoArm Taxi dispatcher contacts the passenger to confirm it. Use the values from get_prices_and_schedule (point, time, car, currency), the passenger's real name and phone, and get the passenger's yes to the price first. Payment is in cash to the driver. Returns the booking number, what was booked, the total, and a status_token for get_booking_status.
| Name | Required | Description | Default |
|---|---|---|---|
| car | Yes | `sprinter` = a seat on the scheduled minibus (the default choice) | |
| dir | Yes | `tbs-evn` = Tbilisi → Yerevan, `evn-tbs` = Yerevan → Tbilisi | |
| lat | No | ||
| lng | No | ||
| pax | Yes | Passengers; at most `types[car].max` | |
| date | Yes | YYYY-MM-DD, today or later (Tbilisi date), at most a year ahead | |
| lang | No | The language we should use with the passenger (an unknown value is treated as `en`) | en |
| name | Yes | The passenger's name | |
| time | Yes | One of `schedule[dir]` from /api/config, or `other` for a time outside the timetable (whole vehicle; the dispatcher sets the price) | |
| agent | No | If an AI agent makes the booking: its name (e.g. `ChatGPT`, `Claude`). Shown to the dispatcher. When you leave it out, your MCP client's name is used. | |
| notes | No | Flight number, luggage, a child seat request and the like (longer text is cut to 1000 characters) | |
| phone | Yes | The passenger's phone in international format, e.g. +995 5xx xx xx xx | |
| point | Yes | A departure point id from `points[dir]` in /api/config, or `@addr` for pick-up from an address (extra fee, confirmed by the dispatcher) | |
| address | No | Required with `point: "@addr"` unless `lat`/`lng` are given | |
| currency | Yes | One of `currencies` from /api/config; the price is taken from the server |
Output Schema
| Name | Required | Description |
|---|---|---|
| number | No | The booking number |
| status | No | |
| booking | No | What was booked, as the server understood it |
| message | No | A sentence for the passenger, in `lang` |
| telegram | No | A link the passenger can open to get the confirmation in Telegram |
| confirmed | No | Always false here: a dispatcher confirms later |
| status_url | No | |
| status_token | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-idempotent, open-world behavior, but the description adds crucial semantics: a booking is a request and is NOT confirmed until a dispatcher contacts the passenger, and payment is cash to the driver. It does not discuss duplicate-submission or cancellation behavior, so a 4 rather than 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences, each carrying distinct information: capability, request-not-confirmation status, input sourcing, payment, and return payload. Front-loaded with the core action and scoping.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 15-parameter mutation with an output schema and strong annotations, the description covers the confirmation workflow, the input sourcing rule, payment mode, and the follow-up tool. Nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 87%, so the baseline is 3; the description adds interpretive value by tying point, time, car and currency to /api/config values via get_prices_and_schedule, and stressing a real name and phone. It doesn't add meaning for lat/lng, agent, notes or lang beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (sends a booking request) and resource (a ride between Tbilisi and Yerevan, seat or whole vehicle), plus the scope variants. An agent can immediately distinguish it from get_prices_and_schedule and get_booking_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: take point/time/car/currency from get_prices_and_schedule, obtain the passenger's consent to the price first, and use get_booking_status with the returned status_token. It names prerequisites and the follow-up tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_booking_statusBooking statusARead-onlyIdempotentInspect
The state of a booking request made with create_booking: received (not confirmed yet), confirmed, completed or cancelled. Needs the status_token create_booking returned. No personal data is returned.
| Name | Required | Description | Default |
|---|---|---|---|
| status_token | Yes | The status_token from create_booking |
Output Schema
| Name | Required | Description |
|---|---|---|
| dir | No | |
| pax | No | |
| date | No | |
| time | No | |
| number | No | |
| status | No | |
| confirmed | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, non-destructive and closed-world behavior. The description adds two genuinely useful facts beyond them: the meaning of each returned state (not present in the schema, which has zero enums) and the privacy guarantee that no personal data is returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the resource and its state vocabulary, then the prerequisite token, then the privacy note. Every sentence carries distinct information and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no elaboration, and the description covers the two things the schema cannot: the semantics of each status value and the data-protection guarantee. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single parameter and the schema already says 'The status_token from create_booking'. The description repeats that same provenance with no additional format, length, or sourcing nuance, so this is the baseline case where structured data does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource ('the state of a booking request') and explicitly ties it to the create_booking lifecycle, enumerating the four possible states (received, confirmed, completed, cancelled). An agent can distinguish this read-only status lookup from create_booking and get_prices_and_schedule without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly implies the usage context: this is the follow-up call to create_booking, and it requires the status_token that create_booking returned. It provides a clear when-to-use signal but never names an alternative tool or states an explicit exclusion, so it stops short of the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_prices_and_schedulePrices, departure points and timesARead-onlyIdempotentInspect
The live GeoArm Taxi offer for rides between Tbilisi (Georgia) and Yerevan (Armenia): currencies; per car type (sprinter = a seat on the scheduled minibus, minivan, sedan) the seats, the price per passenger and the whole-vehicle price when there is one; the departure points (ids and English names) and departure times per direction; and the key facts. Read it before create_booking.
| Name | Required | Description | Default |
|---|---|---|---|
| direction | No | Only this direction: `tbs-evn` = Tbilisi → Yerevan, `evn-tbs` = Yerevan → Tbilisi. Leave it out for both. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cars | Yes | |
| facts | Yes | |
| currencies | Yes | |
| directions | Yes | |
| address_pickup | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive, and openWorldHint=false, so safety is covered. The description adds useful context beyond them: the data is a 'live' offer, implying dynamic pricing/freshness rather than a cached static list, which matters for a pricing tool. It does not mention output shape, but an output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the identity of the tool before the inventory of returned fields, and every clause is an informative item rather than filler. The long semicolon list makes it dense but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with rich annotations and an output schema, the description covers identity, scope, returned content, and workflow placement. An agent has everything needed to call it correctly and to know when to prefer it over its siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single enum parameter already documents tbs-evn/evn-tbs and the both-directions default. The description reinforces 'per direction' departure times but adds no syntax or semantics beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific resource set (live GeoArm Taxi offer for the Tbilisi–Yerevan route) and enumerates exactly what is returned: currencies, per-car-type seats and prices, departure points with ids, departure times per direction, and key facts. An agent can distinguish this read-only pricing tool from create_booking and get_booking_status without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Read it before create_booking,' which names the sibling and the sequencing condition. It does not state when not to call it or how it differs from get_booking_status, so it falls just short of 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.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
- First observed
create_booking - First observed
get_booking_status - First observed
get_prices_and_schedule
Related MCP Connectors
Search minibus trips between Ukraine, Germany and Switzerland. Read-only.
Airport transfers: Novi Sad ↔ Belgrade Airport (BEG). Look up prices and book a ride.
Book trip logistics in chat: cars, transfers, eSIM, luggage storage, tours & flight compensation.
Book a private driver in Paris: live quotes, airport transfers, tours, VIP Meet & Greet. No auth.
Related MCP Servers
- AlicenseAqualityDmaintenanceReal-time train, bus, ferry and private transfer prices between 40+ Italian cities4MIT
- AlicenseNot gradedqualityCmaintenanceLive intercity bus-trip search across Ukraine and Europe — real-time prices, seats, carriers, cheapest-day-of-month calendar, and trip details with passenger discounts. Read-only, no API key; also available as a hosted remote endpoint at https://mcp.soloway.com.ua/mcp.MIT
- AlicenseAqualityFmaintenanceEnables booking premium private chauffeur transfers in Paris and across Europe directly from AI agents. Provides tools to list vehicles, get quotes, book rides, and retrieve service information.4MIT
- AlicenseAqualityBmaintenanceEnables AI agents to search and compare the cheapest flights, trains, buses, private taxis and hotels across Iran, including free seats, baggage allowances, refund rules and exact prices, for a single date or across weeks. All 22 tools are read-only and return compact structured JSON, so an agent can plan multi-mode trips and hotel stays without logging in or booking.22MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.