Indonesia Logistics MCP
README.md
# Indonesia Logistics MCP ๐ฎ๐ฉ โ How can my AI agent ship a parcel across Indonesia (JNE / J&T / SiCepat via Biteship)?
<!-- 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": {
"indonesia-logistics": {
"type": "http",
"url": "https://logi-id.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/indonesia-logistics-mcp)
```bash
git clone https://github.com/junter1989k-ai/indonesia-logistics-mcp && cd indonesia-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 Indonesia** โ over JNE, J&T, SiCepat, AnterAja, Ninja, Pos Indonesia, Lion Parcel, Gojek and Grab โ through the [Biteship](https://biteship.com/) shipping API. Compare **courier rates by postal code** (*cek ongkir*), create shipping orders, track parcels by **waybill**, and cancel orders. Stateless, bring-your-own Biteship API key, never stores anything.
**Live endpoint:** `https://logi-id.wishpool.app/mcp` ยท Registry: `app.wishpool/indonesia-logistics-mcp`
## Quick start
```json
{
"mcpServers": {
"indonesia-logistics": {
"type": "http",
"url": "https://logi-id.wishpool.app/mcp",
"headers": {
"x-biteship-key": "biteship_live_your_api_key"
}
}
}
}
```
**No shared demo โ use your own Biteship account.** Get an **API key** in the Biteship dashboard at [dashboard.biteship.com](https://dashboard.biteship.com) (*Settings โ API Key*) and send it in the header above. The server is stateless: on every call it sends the key as the `Authorization` header directly to `api.biteship.com` and stores nothing. A `biteship_test_` key runs in the **sandbox**; a `biteship_live_` key ships **real parcels** and debits your Biteship balance.
## Tools
| Tool | What it does |
|---|---|
| `check_rates` | **Call this first (cek ongkir).** Given `items` (`name`/`value` IDR/`weight` grams/`quantity`) plus an origin (`origin_postal_code` or `origin_area_id`) and a destination, returns every available courier service (JNE, J&T, SiCepat, AnterAja, Gojek, Grabโฆ) with its `price` (IDR), `duration` and service type, and flags the **cheapest**. Read-only โ quotes only, spends nothing. |
| `create_shipment` | Create a Biteship **order**. Origin (pickup) + destination (recipient) contact/address + one location id each, `items`, and `courier_company` (`courier_code`) + `courier_type` (`courier_service_code`) from `check_rates`. Returns `order_id`, `status`, `tracking_id`, `waybill_id`, `price` (IDR). `delivery_type` defaults to `now`. A `biteship_live_` key debits your Biteship balance. |
| `query_tracking` | Track by `tracking_id` (preferred), `order_id`, or `waybill_id` + `courier_code`. Returns `status` from the Biteship set โ `confirmed` / `allocated` / `picking_up` / `picked` / `dropping_off` / `delivered` / `on_hold` / `returned` / `cancelled` โ plus a plain-English hint; non-terminal statuses carry `next_steps`. Raw response always included. |
| `cancel_shipment` | Cancel a Biteship order by its `order_id` (+ `cancellation_reason`). Only works before pickup. |
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 (IDR) is gated before the order is created**: `approval-above` returns an unsigned draft with no order created.
## Units
Weight in **grams (g)**, parcel dimensions in **centimetres (cm)**, money in **IDR**.
## Develop
```bash
node test/serve.js # local server on :3251 (/mcp)
node test/e2e.js # protocol + validation + policy/biteship units + fake-key live probe to api.biteship.com (expects native Biteship auth error)
```
## How it talks to Biteship
Every tool call is a **single server-to-server request** with `Authorization: <your key>` (no login step โ Biteship is single-key). `check_rates` is `POST /v1/rates/couriers`. `create_shipment` is `POST /v1/orders`. `query_tracking` is `GET /v1/trackings/{tracking_id}` (or `GET /v1/orders/{order_id}`, or public `GET /v1/trackings/{waybill_id}/couriers/{courier_code}`). `cancel_shipment` is `POST /v1/orders/{order_id}/cancel`. Base URL `https://api.biteship.com/v1`.
## Safety
Pure stateless translation layer. Orders, labels and tracking are held by Biteship and the couriers; the API key travels per-request in a header, is forwarded as the Authorization header, and nothing is stored. Parcels flow sender โ courier โ recipient directly. [Privacy policy](https://logi-id.wishpool.app/privacy).
## Sister servers
India labels (Delhivery/Bluedart/Ekart) via Shiprocket live in [india-logistics-mcp](https://logi-in.wishpool.app); USA labels (USPS/UPS/FedEx) via EasyPost 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