India Logistics MCP
README.md
# India Logistics MCP ๐ฎ๐ณ โ How can my AI agent ship a parcel across India (Delhivery / Bluedart / Ekart via Shiprocket)?
<!-- install-cta -->
## Use it in 60 seconds
Paste this into your MCP client config (Claude Desktop, Cursor, Windsurf, or any MCP-capable agent):
```json
{
"mcpServers": {
"india-logistics": {
"type": "http",
"url": "https://logi-in.wishpool.app/mcp"
}
}
}
```
Nothing to install. Credentials, when you need them, travel as HTTP headers on each request and are never stored โ see the [threat model](https://mcp.wishpool.app/trust).
### Or run it yourself
Would you rather not send production credentials to a server you do not control? Deploy this identical code to your own account and point your agent at your own URL:
[](https://vercel.com/new/clone?repository-url=https://github.com/junter1989k-ai/india-logistics-mcp)
```bash
git clone https://github.com/junter1989k-ai/india-logistics-mcp && cd india-logistics-mcp && npx vercel --prod
```
MIT-licensed. Self-hosting removes us from the picture entirely, at no cost and with no loss of function.
---
Remote MCP server that lets any AI agent ship parcels **across India** โ over Delhivery, Bluedart, Ekart, Xpressbees, DTDC and more โ through the [Shiprocket](https://www.shiprocket.in/) shipping API. Check **courier serviceability + live rates** by pincode, create shipping orders, track parcels by **AWB**, and cancel orders. Stateless, bring-your-own merchant credentials, never stores anything.
**Live endpoint:** `https://logi-in.wishpool.app/mcp` ยท Registry: `app.wishpool/india-logistics-mcp`
## Quick start
```json
{
"mcpServers": {
"india-logistics": {
"type": "http",
"url": "https://logi-in.wishpool.app/mcp",
"headers": {
"x-shiprocket-email": "your_api_user@example.com",
"x-shiprocket-password": "your_api_user_password"
}
}
}
}
```
**No shared demo โ use your own Shiprocket account.** Create an **API user** in the Shiprocket dashboard (*Settings โ API โ Configure / Create an API User*) and send its email + password in the headers above. The server is stateless: on every call it exchanges the credentials for a short-lived Bearer token at Shiprocket's `/auth/login` and stores nothing. **Real shipping requires completed merchant KYC (Aadhaar/GSTIN) and at least one registered pickup location** โ merchant-side prerequisites.
## Tools
| Tool | What it does |
|---|---|
| `check_serviceability` | **Call this first.** Given `pickup_postcode`, `delivery_postcode`, `weight` (kg) and `cod`, returns every serviceable courier (Delhivery, Bluedart, Ekart, Xpressbees, DTDCโฆ) with its `rate` (INR), `estimated_delivery_days` and rating, and flags the **cheapest**. Read-only โ quotes only, spends nothing. |
| `create_shipment` | Create a Shiprocket **adhoc order**. `pickup_location` (a nickname already registered in your dashboard) + buyer address + `order_items` (`name`/`units`/`selling_price`) + `payment_method` (COD/Prepaid) + `sub_total` (INR) + parcel box `length`/`breadth`/`height` (**cm**) + `weight` (**kg**). Returns `order_id`, `shipment_id`, `status`. **Creating the order does not charge your wallet** โ that happens when a courier/AWB is assigned. |
| `query_tracking` | Track by `shipment_id` (preferred) or `awb`. Returns `current_status` from the Shiprocket set โ `NEW` / `PICKUP SCHEDULED` / `PICKED UP` / `IN TRANSIT` / `OUT FOR DELIVERY` / `DELIVERED` / `UNDELIVERED` / `RTO INITIATED` / `RTO DELIVERED` / `CANCELED` / `LOST` โ plus a plain-English hint; non-terminal statuses carry `next_steps`. Raw `tracking_data` always included. |
| `cancel_shipment` | Cancel one or more Shiprocket orders by their Shiprocket `order_id` (or `order_ids` array). Only works before pickup โ an already-shipped order needs an RTO. |
Owner policy guardrails ride optional headers (`x-agentpay-max-amount`, `x-agentpay-approval-above`, `x-agentpay-allowed-tools`) โ set by the human owner in client config; the agent cannot relax them. The **order value (INR) is gated before the order is created**: `approval-above` returns an unsigned draft with no order created.
## Units
Weight in **kilograms (kg)**, parcel box dimensions in **centimetres (cm)**, money in **INR**.
## Develop
```bash
node test/serve.js # local server on :3246 (/mcp)
node test/e2e.js # protocol + validation + policy/shiprocket units + fake-credential live probe to apiv2.shiprocket.in (expects native 403)
```
## How it talks to Shiprocket
Every tool call is **two server-to-server requests**: first `POST /v1/external/auth/login` (`{ email, password }` โ `{ token }`), then the business endpoint with `Authorization: Bearer <token>` โ the token is never cached (stateless). `check_serviceability` is `GET /v1/external/courier/serviceability/?pickup_postcode=&delivery_postcode=&weight=&cod=`. `create_shipment` is `POST /v1/external/orders/create/adhoc`. `query_tracking` is `GET /v1/external/courier/track/shipment/{shipment_id}` (or `/track/awb/{awb}`). `cancel_shipment` is `POST /v1/external/orders/cancel` (`{ ids: [...] }`). Base URL `https://apiv2.shiprocket.in`.
## Safety
Pure stateless translation layer. Orders, labels and tracking are held by Shiprocket and the couriers; the merchant credentials travel per-request in headers, are exchanged for a short-lived token, and nothing is stored. Parcels flow sender โ courier โ recipient directly. [Privacy policy](https://logi-in.wishpool.app/privacy).
## Sister servers
USA labels (USPS/UPS/FedEx) via EasyPost live in [usa-logistics-mcp](https://logi-us.wishpool.app); Taiwan CVS pickup + home delivery in [taiwan-logistics-mcp](https://logi-tw.wishpool.app). One family of stateless BYO local-commerce MCP servers: local payments in 81 countries at [mcp.wishpool.app](https://mcp.wishpool.app), plus electronic-invoice servers across nine countries including India GST, Mexico CFDI, Brazil NF-e, Chile DTE and Peru CPE.
MIT licensed.
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessSyncing