99 MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| NINENINE_ALLOW_MUTATIONS | No | Set to 'true' to enable mutation tools (request/cancel ride). Defaults to 'false'. | false |
| NINENINE_MCP_ALLOWED_ORIGIN | No | Overrides the allowed Origin for the optional HTTP loopback MCP server. Defaults to http://127.0.0.1:<port>. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| ninenine_connection_statusC | Local doctor: token present, mutations off by default, unofficial passenger surface. |
| ninenine_capabilitiesB | What this unofficial MCP can read and which writes stay gated. Not 99Food or 99Pay. |
| ninenine_privacy_auditA | Shows redaction defaults (street/phone/GPS) and that request-ride is off unless both gates are set. |
| ninenine_multi_estimateB | Read-only POST pMultiEstimatePrice (JSON 200 errno without token). Does not request a car. |
| ninenine_ride_categoriesB | Shipped 99Pop + 99Moto plus any extra product list in pGetConfig. Not 99Food/99Pay. |
| ninenine_estimateA | Read-only fare quotes for origin/destination on the unofficial 99 passenger surface. Always includes 99Pop and 99Moto. Does not request a car. |
| ninenine_list_addressesB | Read saved/home addresses from pGetConfig when present. Dedicated address URLs 404 and are not shipped. GPS/street redacted by default. |
| ninenine_ride_historyA | Past passenger rides. Read-only. GPS polylines redacted. |
| ninenine_track_rideA | Active ride status/ETA/category only. Does not return GPS polylines or driver phone. |
| ninenine_driver_trackB | Dedicated driver URLs 404 HTML. Reads pOrderStatus; lat/lng redacted. |
| ninenine_active_rideB | Same as track without requiring a ride id. Status/ETA/category only. |
| ninenine_request_rideA | Fail-closed. Needs NINENINE_ALLOW_MUTATIONS and explicit_user_intent. Guest tokens cannot charge. Default examples never enable this. |
| ninenine_cancel_rideA | Fail-closed. Needs NINENINE_ALLOW_MUTATIONS and explicit_user_intent. Guest tokens cannot charge. |
| ninenine_logoutA | Deletes ~/.ninenine-mcp/tokens.json. Requires explicit_user_intent. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 14 tools
Several tools have unclear boundaries: ninenine_estimate and ninenine_multi_estimate both provide fare estimates, while ninenine_track_ride, ninenine_active_ride, and ninenine_driver_track all relate to ride status tracking. Descriptions clarify some differences, but an agent could easily select the wrong tool.
All tools share the ninenine_ prefix and snake_case style, but the pattern after the prefix is inconsistent: some are noun phrases like ninenine_ride_categories and ninenine_ride_history, while others are verb phrases like ninenine_track_ride and ninenine_request_ride. The naming is readable but not uniform.
14 tools is within a reasonable range for a ride-hailing MCP server. A few tools overlap or feel redundant, like ninenine_active_ride duplicating ninenine_track_ride without an id, but overall the count is not excessive.
The server covers the core ride-hailing lifecycle: estimate, request, track, cancel, plus history, addresses, categories, and safety/audit tools. Minor gaps exist around payment methods and driver details, but these may be intentionally gated.