MCP server
Let Claude, ChatGPT and other AI agents read your warehouse
MPH WMS speaks MCP (Model Context Protocol), so an AI assistant can look things up in your warehouse directly instead of you copying numbers into a chat window.
Ask "how many EL-050 do we have in Stockholm", "where is order SO-1042", or "what should we reorder from Nordic Supply" and the assistant answers from your live data.
The MCP server is read-only. It can look at whatever the connection allows and change nothing. Stock adjustments, bundles and shipping templates stay in the in-app AI assistant, where every write is shown on an approval card first.
Connecting
There are two ways in. Sign in with your own account if the assistant is working on your behalf; use an API key for a script or a shared setup that has no person behind it.
As a connector (Claude, ChatGPT)
Add https://mcp.your-instance.com/mcp as a custom connector. You will be sent
to MPH WMS to sign in, then asked to approve the connection and pick which
organization it may read. Nothing is granted until you approve.
A connector reads as you: it sees exactly what your own permissions allow, in the one organization you chose. Leave that organization and the connector stops working on its next request - there is no token to hunt down and revoke. To point it at a different organization, connect again and pick the other one.
Connect once per organization. A connector is bound to the organization you chose at approval, not to whichever one you last had open in the app.
With an API key
For scripts, shared machines, or any client that cannot do a browser sign-in. Create a key under Settings → API keys and give it only the scopes the assistant should have - see What each tool needs below.
claude mcp add --transport http mph-wms https://mcp.your-instance.com/mcp \
--header "Authorization: Bearer mph_live_..."Any client that supports a remote MCP server over Streamable HTTP works. Point
it at https://mcp.your-instance.com/mcp and send the key as a bearer token.
For a client that can only launch a local command, put
mcp-remote in front of it:
{
"mcpServers": {
"mph-wms": {
"command": "npx",
"args": [
"-y", "mcp-remote", "https://mcp.your-instance.com/mcp",
"--header", "Authorization: Bearer mph_live_..."
]
}
}
}What the assistant can do
| Area | Tools |
|---|---|
| Products | find_items, get_item, find_bundle_components |
| Stock | get_stock, list_stock_levels, list_warehouses |
| Orders | find_orders, get_order |
| Shipping | find_shipments, get_order_shipments |
| Purchasing | find_purchase_orders, get_purchase_order, find_suppliers, suggest_purchases |
| Returns | find_returns, find_claims |
| Reports | describe_reports, run_report, get_slow_movers |
| Support | search_docs, read_doc, get_tenant_config, explain_permission |
find_shipments matches a parcel's tracking number as well as the
shipment's own, so a customer quoting a kolli number still finds their delivery.
run_report runs the same report cubes the Reports pages use,
so an assistant can answer "revenue by month" or "shipments per carrier"
without anyone building a view first. Ask it to call describe_reports if it
guesses at metric names.
What each tool needs
A connection only sees the tools its permissions allow - an API key's scopes,
or your own permissions when you connected as yourself. A connection with just
items:read is offered nine tools; one with full access sees all twenty-three.
A tool it cannot see cannot be called by name either.
| Scope | Unlocks |
|---|---|
items:read | Products, warehouses, purchase orders, suppliers, documentation |
stock:read | Stock levels and replenishment suggestions |
orders:read | Sales orders |
shipments:read | Shipments and tracking |
returns:read | Returns |
claims:read | Carrier claims |
reports:read | Report cubes and slow movers |
settings:tenant | Plan features and limits |
team:read | Permission explanations |
Either way the connection is scoped to one organization. An API key carries permissions exactly like a team member, and anyone holding it can read everything it allows - give it the narrowest set that answers the questions you actually ask, and revoke it the moment it is no longer needed. A connector instead carries your own permissions and dies with your membership.
Limits
- Rate limit: 120 calls per minute per connection. An assistant that loops gets slowed down, not cut off.
- Result caps: search tools return 10 results by default and at most 50, so a broad question comes back as a summary rather than your whole catalog.
- Feature gate: MCP access requires
has_api_accesson your plan, the same as the REST API. If calls are refused rather than rejected as unauthorised, check the plan under Billing.
Troubleshooting
Every call returns 401. With an API key: it is wrong, revoked or expired. Keys are shown once; if it was lost, create a new one and revoke the old. With a connector: the sign-in expired. Reconnect it.
The connector says you are no longer a member. It was approved for an organization you have since left. Reconnect and choose one you still belong to.
The connector asks you to reconnect and choose an organization. It was approved before you belonged to more than one, so there is nothing recorded to say which one it may read. Connecting again settles it.
The assistant says a feature does not exist. Ask it to check the docs again. If its documentation tool reports that its index is unavailable, that is a deployment fault on our side, not an answer - tell us.
The assistant asks which warehouse. A connector uses your own default warehouse if you have one set; an API key has none. On a single-warehouse organization it picks the only one either way. With several and no default, name the warehouse in your question.
Calls appear in your API log. Every tool call is recorded under
/mcp#tool_name alongside your REST traffic, so you can see what an assistant
actually did.