Ninja MCP
MCP server for AI agents to interact with the Ninja/AnaNinja mobile API, enabling mobile-compatible auth, address management, retail/grocery product search, draft order validation, and checkout/payment flows.
README
Unofficial Ninja MCP
MCP server for AI agents working with the Ninja/AnaNinja API.
This project exposes the Ninja/AnaNinja API as a small operational MCP:
- auth with reusable local
deviceId/authKey - saved addresses
- vertical/store discovery for retail, pharmacy, beauty, and restaurants
- retail/pharmacy/beauty product search, detail lookup, and product image URLs
- restaurant branch search, menu lookup, variant IDs, and topping metadata
- draft order validation for product verticals and restaurants
- guarded checkout creation
- payment-method inspection plus saved-card, wallet, and STC Pay helpers
Live checkout/payment tools use explicit execution flags and keep state in local 0600 files.
Install
npm install
npm run build
Run locally:
npm start
MCP client config example:
{
"mcpServers": {
"ninja": {
"command": "node",
"args": ["/absolute/path/to/ninja-mcp/dist/index.js"],
"env": {
"NINJA_MCP_STATE_FILE": "/Users/you/.ninja-mcp/state.json"
}
}
}
}
First Login
- Call
ninja_auth_start_loginwith the account phone number. This registers a device session and sends an OTP. - Call
ninja_auth_verify_otpwith the OTP. - Future calls reuse the saved auth key. This MCP does not use an OAuth refresh-token flow.
The default state path is:
~/.ninja-mcp/state.json
Override with:
NINJA_MCP_STATE_FILE=/secure/path/state.json
State files contain auth material.
Current Coverage
Implemented:
- auth/device session reuse
- saved address listing
- vertical discovery for
RETAIL,PHARMACY,BEAUTY, andRESTAURANT - product search and detail lookup for retail/pharmacy/beauty through the Fahras products endpoint
- product image URL extraction from product and restaurant menu media
- restaurant branch search and restaurant menu lookup through GraphQL
- draft order validation for retail, pharmacy OTC, beauty, and restaurant carts
- checkout creation for pending unpaid orders/payment requests
- payment-method inspection for a pending checkout
- account-level saved payment option inspection
- payment helpers for saved card and wallet
- STC Pay initiate + OTP helper flow
MCP request-shape support:
- saved-card payment request shape:
savedCard.cardIdwith optionalsavedCard.cvv - wallet payment request shape:
includeWallet: true - restaurant checkout request shape:
OrderRequest.restaurantwithbranchIdandmenuId, plus restaurant variant IDs inlineItems[].itemId
Not implemented by this MCP:
- Tabby/Tamara and other redirect/token-based methods
- Apple Pay, Samsung Pay, Google Pay, QPay, KNET, Benefit, Daftar
- prescription/consultation pharmacy handling beyond
request.pharmacypassthrough
Agent Workflow
Read ninja://agent-guide or call ninja_agent_guide first.
Typical product-vertical call sequence:
ninja_saved_addressesninja_search_productswithvertical: "RETAIL","PHARMACY", or"BEAUTY"ninja_create_draft_order- Review the exact cart, total, delivery location, and payment method.
ninja_create_checkoutwithconfirmCreateOrder: trueninja_pending_payment_methods- Choose from the available payment methods.
- Use a method-specific helper if this MCP implements that method.
Typical restaurant call sequence:
ninja_saved_addressesninja_search_restaurantsninja_restaurant_menuninja_create_draft_orderwithvertical: "RESTAURANT",restaurant.branchId,restaurant.menuId, and restaurant variant IDs inlineItems[].itemId- Review the draft, then continue through checkout/payment if the cart is correct.
Implemented method-specific helpers:
- saved card: call
ninja_pending_payment_methods, choose acardIndex, then callninja_pay_saved_card - wallet: call
ninja_pay_walletif wallet is available for the pending checkout - STC Pay: use
ninja_initiate_stc_pay, collect the fresh OTP, then callninja_submit_stc_otp
Card setup: card registration is outside this MCP. Add a saved card to the account, then refresh ninja_saved_payment_options or ninja_pending_payment_methods. Once the card appears as saved, use ninja_pay_saved_card.
API Notes
- The bearer token is a short-lived HS256 JWT signed locally with
authKey. - Saved addresses are backend GraphQL data, not only local client memory.
- Product search uses vertical discovery to find the store/search context, then the Fahras products endpoint.
- Product image URLs come from
medias; search/menu tools return them asimageUrls. - Retail/pharmacy/beauty product search returns both
idandproductId. UseproductId, exposed asorderItemId, forlineItems[].itemId. Theidfield is store-scoped and should not be used as the cart item id. - Restaurant carts use menu variant IDs. Use
variant.orderItemId/variantIdfromninja_restaurant_menuforlineItems[].itemId. - Restaurant toppings use
toppingIdandtoppingOptionIdfrom the menu response. createDraftOrder.paymentMethodsis a direct list, not a{ data: [...] }wrapper.- Always draft before checkout/payment.
createOrdercan recover the same pending payment request for the same cart.- Payment methods are returned per payment request; availability can vary by account, cart, location, and time.
ninja_pending_payment_methodslabels each method withapiCapabilityandmcpCapability.- Saved cards expose
requiresCvv; saved-card payment acceptscardIndexorcardId, plus optionalcvv. ninja_saved_payment_optionslists account-level saved cards and wallets; for an actual checkout, preferninja_pending_payment_methods.- STC Pay initiate expects
mobileNumberin9665XXXXXXXXform; the MCP normalizes common Saudi formats. - Payment calls can return
PENDING; pollpaymentStatusand then inspectshowOrder. - Totals are read from known payment-summary keys. If the upstream shape changes, the MCP reports candidate keys instead of guessing from an arbitrary amount.
State And Side Effects
- Tool outputs redact full auth/payment IDs.
- Auth state and pending payment context are written with mode
0600. - Live mutation tools use execution flags, such as
confirmCreateOrder,confirmSendOtp,confirmSubmitOtp, andconfirmSubmitPayment. - Failed payment attempts keep pending context so callers can try another available method.
- Successful payment clears pending checkout context.
Environment
NINJA_MCP_STATE_FILE=/secure/path/state.json
NINJA_FIREBASE_CHECK_TOKEN=optional_firebase_check_token
NINJA_CLIENT_VERSION=optional_api_client_version_override
NINJA_CLIENT_USER_AGENT=optional_api_user_agent_override
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
Neon Database
MCP server for interacting with Neon Management API and databases
E2B
Using MCP to run code via e2b.
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.