99 MCP
This server is an unofficial, local-first MCP for 99Pop/99Moto that lets you estimate fares, read account/ride data, and track active rides, while keeping ride requests/cancellations fail-closed unless mutations and explicit intent are enabled.
ninenine_estimate/ninenine_multi_estimate/ninenine_ride_categories: read-only fare estimates and ride categories (always includes 99Pop and 99Moto).ninenine_list_addresses: read saved addresses (GPS/street redacted).ninenine_ride_history: read past ride history (GPS polylines redacted).ninenine_track_ride/ninenine_active_ride: see active ride status, ETA, and category; no GPS or driver phone.ninenine_connection_status/ninenine_capabilities/ninenine_privacy_audit: inspect local token, available capabilities, and privacy/redaction defaults.ninenine_request_ride/ninenine_cancel_ride: gated pay actions requiring bothNINENINE_ALLOW_MUTATIONSandexplicit_user_intent=true; otherwise they do nothing.ninenine_logout: clear the locally stored 99 token with explicit intent.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@99 MCP estimate a 99Pop fare from Av. Paulista to Faria Lima"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Unofficial. Not affiliated with, endorsed by, or supported by 99 or DiDi. Not 99Food, 99Pay, 99Entrega, metro tickets, or the 99 corp B2B API. The passenger gulfstream surface can change without notice.
Never pays by default.
ninenine_request_rideandninenine_cancel_ridedo nothing unlessNINENINE_ALLOW_MUTATIONSis enabled andexplicit_user_intentis true. Guest tokens cannot charge. Street, phone, email and GPS/latlng polylines are redacted (status / ETA / category only).
Setup in 60 seconds
npx -y ninenine-mcp-unofficial setup
npx -y ninenine-mcp-unofficial auth --from-header "Bearer eyJ…"
npx -y ninenine-mcp-unofficial doctorToken is not OAuth. Capture a passenger request to api.99taxis.mobi → copy the Authorization header. Fare estimates still run without a token; pay tools stay blocked.
Stdio snippet (Claude Desktop, Cursor, Grok Bot). Do not set mutations in the snippet:
{
"mcpServers": {
"ninenine": {
"command": "npx",
"args": ["-y", "ninenine-mcp-unofficial"]
}
}
}See examples/claude-desktop.json and examples/grok-bot.md.
Related MCP server: AgentPay MCP Server
Skill or MCP
Same package, two doors. MCP registers tools on stdio/HTTP. The skill is the workflow (estimate → compare Pop/Moto → stop) and can drive the same tools through the CLI when the client has no MCP:
npx -y ninenine-mcp-unofficial call ninenine_estimate --json '{"from_lat":-3.73,"from_lng":-38.52,"to_lat":-3.74,"to_lng":-38.54}'Gates are identical. Copy skill/SKILL.md into your agent skills dir (~/.agents/skills/ninenine/ or Claude/Grok equivalent).
Tools
Kind | Tools |
Read · fares |
|
Read · account |
|
Read · live |
|
Meta |
|
Gated pay (mutations and intent) |
|
Intent only |
|
HTTP (optional, loopback)
Default transport is stdio. Streamable HTTP binds 127.0.0.1 and checks Origin against http://127.0.0.1:<port> (override with NINENINE_MCP_ALLOWED_ORIGIN). This is DNS-rebinding mitigation, not a public server.
npx -y ninenine-mcp-unofficial --http
# GET http://127.0.0.1:3000/health
# POST http://127.0.0.1:3000/mcpSecurity
Tokens live in ~/.ninenine-mcp/tokens.json (0600). They are not in git, the npm tarball, or default examples. Full notes: SECURITY.md. Agents: llms.txt.
Tests
npm testNo live 99 login required.
Available Tools
14 toolsninenine_active_rideActive 99 ride statusBRead-onlyIdempotent
Same as track without requiring a ride id. Status/ETA/category only.
Inputs: ride_id, privacy_mode, response_format.
ninenine_cancel_rideCancel a 99 ride (gated)ADestructive
Fail-closed. Needs NINENINE_ALLOW_MUTATIONS and explicit_user_intent. Guest tokens cannot charge.
Inputs: ride_id (required), response_format, explicit_user_intent.
ninenine_capabilities99 capabilitiesBRead-onlyIdempotent
What this unofficial MCP can read and which writes stay gated. Not 99Food or 99Pay.
Inputs: response_format.
ninenine_connection_status99 connection statusCRead-onlyIdempotent
Local doctor: token present, mutations off by default, unofficial passenger surface.
Inputs: response_format.
ninenine_driver_track99 driver track (GPS redacted)BRead-onlyIdempotent
Dedicated driver URLs 404 HTML. Reads pOrderStatus; lat/lng redacted.
Inputs: ride_id, privacy_mode, response_format.
ninenine_estimateEstimate 99Pop and 99Moto faresARead-onlyIdempotent
Read-only fare quotes for origin/destination on the unofficial 99 passenger surface. Always includes 99Pop and 99Moto. Does not request a car.
Inputs: to_lat (required), to_lng (required), from_lat (required), from_lng (required), +2 more.
ninenine_list_addressesList saved 99 addressesBRead-onlyIdempotent
Read saved/home addresses from pGetConfig when present. Dedicated address URLs 404 and are not shipped. GPS/street redacted by default.
Inputs: privacy_mode, response_format.
ninenine_logoutClear local 99 tokenADestructiveIdempotent
Deletes ~/.ninenine-mcp/tokens.json. Requires explicit_user_intent.
Inputs: response_format, explicit_user_intent.
ninenine_multi_estimate99 multi-estimate (pMultiEstimatePrice)BRead-onlyIdempotent
Read-only POST pMultiEstimatePrice (JSON 200 errno without token). Does not request a car.
Inputs: to_lat (required), to_lng (required), from_lat (required), from_lng (required), +2 more.
ninenine_privacy_audit99 privacy auditARead-onlyIdempotent
Shows redaction defaults (street/phone/GPS) and that request-ride is off unless both gates are set.
Inputs: response_format.
ninenine_request_rideRequest a 99 ride (gated)ADestructive
Fail-closed. Needs NINENINE_ALLOW_MUTATIONS and explicit_user_intent. Guest tokens cannot charge. Default examples never enable this.
Inputs: to_lat (required), to_lng (required), from_lat (required), from_lng (required), +3 more.
ninenine_ride_categories99 ride categoriesBRead-onlyIdempotent
Shipped 99Pop + 99Moto plus any extra product list in pGetConfig. Not 99Food/99Pay.
Inputs: privacy_mode, response_format.
ninenine_ride_history99 ride historyARead-onlyIdempotent
Past passenger rides. Read-only. GPS polylines redacted.
Inputs: privacy_mode, response_format.
ninenine_track_rideTrack a 99 rideARead-onlyIdempotent
Active ride status/ETA/category only. Does not return GPS polylines or driver phone.
Inputs: ride_id (required), privacy_mode, response_format.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
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.
Maintenance
Related MCP Connectors
Give your AI hands. Identity, credential vault, and API gateway for autonomous agents.
Credential broker for AI agents: scoped, revocable API access with policy enforcement and audit.
Scoped agent execution. Server-side credentials, policy, budgets and verifiable receipts.
One API key, dozens of capabilities for your AI agent. Zero provider auth.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to search for cabs, view prices, and book rides through the open Beckn Protocol by connecting to Beckn-compliant mobility providers like Namma Yatri and ONDC.-
- FlicenseNot gradedqualityBmaintenanceProvides a trust and governance layer for AI agents, enabling secure API access, credential vaulting, paid execution with human approval, and automatic call resume.4 npm2-
- AlicenseCqualityBmaintenanceEnables AI agents to access iFood orders, addresses, restaurants, and cart locally, with fail-closed checkout requiring explicit opt-in.3335 npm1MIT
- AlicenseAqualityCmaintenanceEnables agents to search places, get live fares and route previews, list payment methods, book rides, monitor ride and vehicle status, preview and confirm cancellations, and retrieve ride history for Tesla Robotaxi rider accounts.8MIT