Skip to main content
Glama

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_ride and ninenine_cancel_ride do nothing unless NINENINE_ALLOW_MUTATIONS is enabled and explicit_user_intent is 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 doctor

Token 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

ninenine_estimate (always 99Pop + 99Moto), ninenine_multi_estimate, ninenine_ride_categories

Read · account

ninenine_list_addresses, ninenine_ride_history

Read · live

ninenine_track_ride, ninenine_driver_track (GPS redacted), ninenine_active_ride

Meta

ninenine_connection_status, ninenine_capabilities, ninenine_privacy_audit

Gated pay (mutations and intent)

ninenine_request_ride, ninenine_cancel_ride

Intent only

ninenine_logout

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/mcp

Security

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 test

No live 99 login required.

Available Tools

14 tools
ninenine_active_rideActive 99 ride statusB
Read-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)A
Destructive

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 capabilitiesB
Read-onlyIdempotent

What this unofficial MCP can read and which writes stay gated. Not 99Food or 99Pay.

Inputs: response_format.

ninenine_connection_status99 connection statusC
Read-onlyIdempotent

Local doctor: token present, mutations off by default, unofficial passenger surface.

Inputs: response_format.

ninenine_driver_track99 driver track (GPS redacted)B
Read-onlyIdempotent

Dedicated driver URLs 404 HTML. Reads pOrderStatus; lat/lng redacted.

Inputs: ride_id, privacy_mode, response_format.

ninenine_estimateEstimate 99Pop and 99Moto faresA
Read-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 addressesB
Read-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 tokenA
DestructiveIdempotent

Deletes ~/.ninenine-mcp/tokens.json. Requires explicit_user_intent.

Inputs: response_format, explicit_user_intent.

ninenine_multi_estimate99 multi-estimate (pMultiEstimatePrice)B
Read-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 auditA
Read-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)A
Destructive

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 categoriesB
Read-onlyIdempotent

Shipped 99Pop + 99Moto plus any extra product list in pGetConfig. Not 99Food/99Pay.

Inputs: privacy_mode, response_format.

ninenine_ride_history99 ride historyA
Read-onlyIdempotent

Past passenger rides. Read-only. GPS polylines redacted.

Inputs: privacy_mode, response_format.

ninenine_track_rideTrack a 99 rideA
Read-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

    B3.3/5.0

    Scored across 14 tools

    Disambiguation2/5

    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.

    Naming Consistency3/5

    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.

    Tool Count4/5

    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.

    Completeness4/5

    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

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      Not graded
      quality
      B
      maintenance
      Provides a trust and governance layer for AI agents, enabling secure API access, credential vaulting, paid execution with human approval, and automatic call resume.
      4 npm
      2
      -
    • A
      license
      C
      quality
      B
      maintenance
      Enables AI agents to access iFood orders, addresses, restaurants, and cart locally, with fail-closed checkout requiring explicit opt-in.
      33
      35 npm
      1
      MIT
    • A
      license
      A
      quality
      C
      maintenance
      Enables 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.
      8
      MIT