inpost-consumer-mcp
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., "@inpost-consumer-mcp show me my recent InPost parcels"
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.
inpost-consumer-mcp
npm: inpost-consumer-mcp · GitHub: noxlabs-ai/inpost-consumer-mcp
Local MCP (Model Context Protocol) server and TypeScript client for the InPost mobile / consumer API — SMS login, list parcels, pickup codes, open a Paczkomat, returns, and tracking.
Works with Cursor, Claude Desktop, VS Code (MCP-enabled clients), and any host that supports MCP over stdio.
Powered by NOXLABS.
Table of contents
Related MCP server: MCP API Server
Why this project
InPost’s consumer mobile API powers “my parcels”, locker open, and returns — but it is not a polished public SDK. This package wraps that surface as:
An MCP server so AI assistants can list parcels, track shipments, and (with care) open a locker.
A typed TypeScript client you can import in your own scripts.
Auth is SMS OTP → JWT + refresh token, stored in a local multi-account config file and refreshed automatically.
Sign-in: call inpost_consumer_login. If a saved session exists, it refreshes tokens (no SMS). Otherwise it opens a localhost page for phone + SMS code. Secrets never go through the model. Pass forceSms=true to add another phone. If the MCP client supports URL elicitation, it will prompt you to open that page; otherwise the system browser is used.
Features
Feature | Description |
9 MCP tools | Login (SMS), sessions, parcels, locker open/finish, track, returns |
Multi-account | Several phone numbers in one local config (v2 store) |
Auto token refresh | Proactive expiry check + one 401 retry (not exposed as a tool) |
ShipX tracking | Public tracking via ShipX, with status cross-check on parcel lists |
Typed client | Import |
stdio MCP | Drop-in for Cursor / Claude Desktop / VS Code |
Quick start
Requirements: Node.js 20 or newer.
Published on npm as inpost-consumer-mcp — see the package page for the latest version.
Connect your AI client
Add this server entry to your MCP host’s configuration:
{
"mcpServers": {
"inpost-consumer": {
"command": "npx",
"args": ["-y", "inpost-consumer-mcp"]
}
}
}Save the config, enable the inpost-consumer server if your client exposes a toggle, then sign in with inpost_consumer_login (refreshes a saved session, or opens browser OTP if needed).
No InPost developer keys. The server uses stdio transport only. Sessions are stored on disk (see Configuration).
Run manually (optional)
npx -y inpost-consumer-mcpOr install globally:
npm install -g inpost-consumer-mcp
inpost-consumer-mcpGlobal install (optional)
If you ran npm install -g inpost-consumer-mcp:
{
"mcpServers": {
"inpost-consumer": {
"command": "inpost-consumer-mcp"
}
}
}Local development
{
"mcpServers": {
"inpost-consumer": {
"command": "node",
"args": ["/absolute/path/to/inpost-consumer-mcp/dist/cli.js"]
}
}
}Build first: npm install && npm run build.
Environment variables in MCP config
{
"mcpServers": {
"inpost-consumer": {
"command": "npx",
"args": ["-y", "inpost-consumer-mcp"],
"env": {
"INPOST_CONSUMER_CONFIG": "/custom/path/config.json"
}
}
}
}Tools
Auth uses the current mobile endpoints: POST /v1/account (send OTP) and POST /v1/account/verification (confirm). Parcels use GET /v4/parcels/tracked.
Tool | When to use |
| Refresh saved session, or browser SMS if needed ( |
| Sign out one or all phones |
| Show signed-in phones / expiry |
| List your parcels |
| Parcel details / pickup code |
| Open Paczkomat ( |
| End a pickup session |
| Track a shipment (ShipX) |
| List return tickets |
Safety: inpost_consumer_locker_open is destructive — anyone at the machine can take the parcel. Only call it when you are physically at the correct Paczkomat, and always pass confirm=true.
Configuration
Variable | Default | Description |
| OS app-config dir | Path to the local auth/config JSON |
| mobile API default | Override mobile API base URL |
| ShipX default | Override ShipX tracking base URL |
Library
import { InPostConsumerClient } from "inpost-consumer-mcp";
const client = new InPostConsumerClient();
await client.sendSmsCode("+48123456789");
await client.confirmSmsCode("+48123456789", "123456");
const parcels = await client.listParcels({ statuses: ["ready_to_pickup"] });Also exported: createMcpServer, ConfigStore, JWT helpers, status helpers, startLoginUi, openBrowser, and TOOL_NAMES.
The library still exposes sendSmsCode / confirmSmsCode for programmatic use. The MCP server uses a localhost browser UI instead so OTP codes never enter the chat.
How it works
flowchart LR
Client[MCP client] -->|stdio| Server[inpost-consumer-mcp]
Server --> Store[Local config store]
Server --> Mobile[InPost mobile API]
Server --> ShipX[ShipX tracking]
Store --> JWT[JWT + refresh]The MCP host starts
inpost-consumer-mcpas a subprocess.inpost_consumer_loginrefreshes a saved session when possible; otherwise opens a localhost page for SMS OTP and writes tokens to the local config file.Parcel / locker / returns tools call the mobile API with auto-refreshed JWTs.
Tracking uses ShipX; parcel lists can cross-check public status.
Development
git clone https://github.com/noxlabs-ai/inpost-consumer-mcp.git
cd inpost-consumer-mcp
npm install
npm run gen # optional: types from openapi/inpost-mobile.yml
npm run typecheck
npm run build
npm run smoke
npm run pack:check # dry-run npm packOpenAPI under openapi/inpost-mobile.yml describes the mobile endpoints used by this client.
Project layout
src/
cli.ts # MCP stdio entrypoint (bin)
index.ts # Library exports
auth/ # Config store, JWT helpers, login UI, types
client/ # HTTP + InPostConsumerClient
mcp/ # Server, tools, env config
generated/ # Types from OpenAPI
openapi/
inpost-mobile.yml
scripts/
gen-types.mjs
smoke.mtsContributing
Contributions are welcome. Please:
Open an issue for larger changes.
Keep PRs focused; match existing TypeScript style.
Run
npm run typecheck && npm run buildbefore submitting.
Publishing
Package: https://www.npmjs.com/package/inpost-consumer-mcp
Repository: https://github.com/noxlabs-ai/inpost-consumer-mcp
For maintainers releasing a new version:
npm login
npm run pack:check
npm version patch # or minor / major
npm publishprepublishOnly runs typecheck and the build automatically.
Disclaimer
This project is not affiliated with InPost Sp. z o.o. or InPost Group.
It uses unofficial mobile API patterns that may change without notice.
Opening a locker remotely can allow anyone nearby to take the parcel — use that tool only when you are at the machine.
Use at your own risk; respect InPost terms of use and applicable law.
License
Available Tools
10 toolsinpost_consumer_get_parcelParcel detailsARead-only
Get details for one parcel by shipment number (or a unique short prefix): status, locker, pickup code, and QR payload for the app/scanner.
Inputs: shipmentNumber (required), phoneNumbers.
inpost_consumer_list_parcelsList my parcelsARead-only
List your InPost parcels (status, locker, pickup code when available). Statuses are kept up to date with public tracking. Optional filter by status (e.g. ready_to_pickup, delivered) — case does not matter.
Inputs: statuses, phoneNumbers.
inpost_consumer_list_returnsList my returnsARead-only
List your InPost return tickets. Optionally filter by status.
Inputs: statuses, phoneNumbers.
inpost_consumer_locker_finishFinish locker sessionA
End a Paczkomat pickup session after opening (or if you need to tear it down). Use the session id returned by inpost_consumer_locker_open.
Inputs: sessionUuid (required), phoneNumbers.
inpost_consumer_locker_openOpen lockerADestructive
Remotely open the Paczkomat compartment for a parcel. Anyone standing at the machine can take it — only use when you are there. Set confirm=true to proceed. Prefer picking up in person at the correct locker.
Inputs: confirm (required), shipmentNumber (required), openCode, phoneNumbers.
inpost_consumer_login_confirmConfirm login codeA
Enter the SMS code to sign in. Saves your session on this device so you can list parcels and open lockers.
Inputs: smsCode (required), phoneNumber (required).
inpost_consumer_login_send_smsSend login codeA
Send a one-time login code by SMS to your phone. Next: inpost_consumer_login_confirm with the code from the message.
Inputs: phoneNumber (required).
inpost_consumer_login_sessionsShow signed-in phonesARead-only
List phone numbers currently signed in on this device, with when each session expires. Login codes refresh automatically when you use other tools.
Inputs: no named parameters.
inpost_consumer_logoutSign outA
Sign out and remove saved login(s) from this device. Does not change anything in the InPost app.
Inputs: all, phoneNumber.
inpost_consumer_trackTrack a parcelARead-only
Public tracking for any InPost shipment number (no login required for full numbers). If you pass a short prefix, it is matched against your signed-in parcels when needed.
Inputs: shipmentNumber (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 10 tools
Each tool has a clearly distinct purpose: login flow tools are separate from parcel listing/detail, locker operations are distinct from tracking and returns. No two tools overlap in a way that would cause misselection; even list_parcels and get_parcel are clearly list vs. single-item operations.
All tools share the 'inpost_consumer_' prefix, and most follow a verb_noun pattern (list_parcels, get_parcel, track, list_returns). However, some names are structured as noun_verb (locker_open, locker_finish) or use a domain prefix (login_send_sms, login_sessions, login_confirm), creating minor inconsistency in the verb/noun order.
Ten tools is well within the ideal 3-15 range for a consumer-focused InPost service. Each tool covers a necessary part of the user journey—auth, parcel viewing, locker operation, tracking, and returns—without unnecessary bloat or sparseness.
The tool surface covers the core lifecycle: login, logout, session management, listing and getting parcels, opening and finishing locker sessions, tracking, and listing returns. Minor gaps exist, such as no per-return detail view or explicit support for creating a return, but these are edge cases and the essential workflows are fully supported.
Maintenance
Related MCP Connectors
MCP server for EasyPost — rate shipments, buy & refund labels, track packages, verify addresses.
Furgonetka MCP Server is an extension for LLMs (such as Claude) that integrates AI assistants with Poland's most popular courier brokerage platform. The server enables models to interact directly with services from various couriers (including InPost, DPD, DHL, UPS, and Poczta Polska) through a single, unified interface. With this integration, your AI stops just "writing about logistics" and starts actually managing it.
A TypeScript MCP server for Home Assistant, enabling programmatic management of entities, automati…
A paid remote MCP for ShipSwift, built to return verdicts, receipts, usage logs, and audit-ready JSO
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA demonstration MCP server built in TypeScript that shows how to implement stdio-based communication for integration with MCP clients. Serves as a template for building custom MCP servers with strong typing and maintainability.ISC
- AlicenseCqualityDmaintenanceA modular MCP server that connects to external APIs, providing tools for weather data, user management, and company operations. Features a scalable architecture with TypeScript support, HTTP client abstraction, and robust error handling.5ISC
- AlicenseNot gradedqualityDmaintenanceA horizontally scalable Model Context Protocol server for exposing shipment tracking (and other data sources) as authenticated MCP tools, starting with DB Schenker's public tracking endpoint.1MIT
- AlicenseAqualityDmaintenanceGeneral TypeScript MCP server that provides tools for OpenClaw capabilities, including balance and invoice retrieval from RMappi/Osuria.39 npmApache 2.0