StatusPro MCP Server
Model Context Protocol (MCP) server for the StatusPro API. Exposes the API as tools so AI assistants (Claude Desktop, Claude.ai, Cursor, etc.) can read and update order status through natural language.
The StatusPro API is intentionally small — seven endpoints for listing and looking up orders and applying status/comment/due-date changes. This server maps them to nine tools and adds a two-step confirm pattern on every mutation.
Features
- 9 tools across Orders and Statuses — see the table below.
- Two-step confirmation: mutations require
confirm=trueand elicit explicit user approval viactx.elicit. - Built-in resilience: automatic retries, 429 rate-limit handling with exponential
backoff, and auto-pagination inherited from the
statuspro-openapi-clienttransport layer. - Environment-based authentication: bearer token via
STATUSPRO_API_KEY(env var,.env, or~/.netrc). - Response caching for read-only tools (30s TTL) via the FastMCP response caching middleware.
- Structured logging with sensitive-data redaction.
Installation
pip install statuspro-mcp-server
Quick Start
1. Get your StatusPro API Key
Obtain your API key from your StatusPro account settings.
2. Configure environment
export STATUSPRO_API_KEY=your-api-key-here
Or create a .env:
STATUSPRO_API_KEY=your-api-key-here
STATUSPRO_BASE_URL=https://app.orderstatuspro.com/api/v1 # optional override
3. Choose a transport
| Transport | Use case | Command |
|---|---|---|
stdio (default) |
Claude Desktop, Claude Code | statuspro-mcp-server |
streamable-http |
Claude.ai, remote clients | statuspro-mcp-server --transport streamable-http |
sse |
Cursor IDE | statuspro-mcp-server --transport sse |
http |
Generic HTTP clients | statuspro-mcp-server --transport http |
4. Use with Claude Desktop (stdio)
Recommended: install the .mcpb bundle — Claude Desktop has built-in support for
MCP Bundles, which install local MCP servers in
one click and prompt for the API key via UI (no JSON editing).
- Download
statuspro-mcp-server-<version>.mcpbfrom the latest GitHub release. - Drag the
.mcpbfile into Claude Desktop, or open it from the Finder. - Confirm install in the dialog. Claude Desktop prompts for your StatusPro API key (stored securely; never written to a config file by hand).
The bundle ships the server source plus a manifest that declares the runtime requirements; UV handles dep resolution on first launch.
Manual uvx install (fallback) — if you'd rather edit
~/Library/Application Support/Claude/claude_desktop_config.json directly:
{
"mcpServers": {
"statuspro": {
"command": "uvx",
"args": ["statuspro-mcp-server"],
"env": {
"STATUSPRO_API_KEY": "your-api-key-here"
}
}
}
}
Either path: restart Claude Desktop and the StatusPro tools will appear.
5. Use with Claude.ai (streamable-http)
Claude.ai requires HTTPS and a publicly reachable URL. For local development, use a tunnel like ngrok:
# Terminal 1: Start the MCP server with hot-reload
uv run poe dev
# Terminal 2: Create an HTTPS tunnel
ngrok http 8765
# → gives you https://abc123.ngrok-free.app
Then in Claude.ai:
- Go to Customize > Connectors
- Select "Add custom connector"
- Paste your ngrok HTTPS URL
For production, run the Docker image behind a reverse proxy with TLS:
docker run -p 8765:8765 \
-e STATUSPRO_API_KEY=your-key \
ghcr.io/dougborg/statuspro-mcp-server:latest
6. Run standalone (optional)
export STATUSPRO_API_KEY=your-api-key
statuspro-mcp-server
Tools
Mutations use a two-step confirm pattern: call with confirm=false first to get a
preview, then confirm=true to execute.
| Tool | Mutation? | Endpoint | Purpose |
|---|---|---|---|
list_orders |
no | GET /orders |
Paginated list with filters |
get_order |
no | GET /orders/{id} |
Full detail incl. history |
lookup_order |
no | GET /orders/lookup |
Lookup by order number + customer email |
list_statuses |
no | GET /statuses |
Full status catalog |
get_viable_statuses |
no | GET /orders/{id}/viable-statuses |
Valid transitions for this order |
update_order_status |
yes | POST /orders/{id}/status |
Change an order's status |
add_order_comment |
yes | POST /orders/{id}/comment |
Add a history comment (5/min limit) |
update_order_due_date |
yes | POST /orders/{id}/due-date |
Set or change the due date |
bulk_update_order_status |
yes | POST /orders/bulk-status |
Update up to 50 orders at once (5/min, async) |
Example: look up an order and change its status
lookup_order(number="1188", email="customer@example.com")
→ Order 6110375248088, status "In Production"
get_viable_statuses(order_id=6110375248088)
→ [Shipped, Ready for Pickup, Cancelled]
update_order_status(order_id=6110375248088, status_code="st000003", confirm=False)
→ Preview: change status from "In Production" to "Shipped"
→ ...confirm=true to execute
Resources
Resources expose stable, read-only reference data so AI agents can orient themselves without mutating tools.
statuspro://statuses— full status catalog (JSON).statuspro://help— tool reference and recommended workflows (Markdown).
For transactional data (orders, status history), use the tools.
Configuration
Environment variables
STATUSPRO_API_KEY(required) — your bearer token.STATUSPRO_BASE_URL(optional) — defaults tohttps://app.orderstatuspro.com/api/v1.STATUSPRO_MCP_LOG_LEVEL(optional) —DEBUG/INFO/WARNING/ERROR(defaultINFO).STATUSPRO_MCP_LOG_FORMAT(optional) —jsonortext(defaultjson).
Endpoint authentication (HTTP transport)
When running over http, sse, or streamable-http, the MCP endpoint is
unauthenticated by default. Pick one of:
Bearer token (simple, for dev/personal use):
export MCP_AUTH_TOKEN=your-secret-token
Clients must send Authorization: Bearer your-secret-token. In Claude.ai, enter the
token in the connector's Advanced Settings.
GitHub OAuth (production):
export MCP_GITHUB_CLIENT_ID=your-github-client-id
export MCP_GITHUB_CLIENT_SECRET=your-github-client-secret
export MCP_BASE_URL=https://your-public-url.ngrok-free.app
Create a GitHub OAuth App at https://github.com/settings/developers with the callback
URL set to <MCP_BASE_URL>/auth/callback.
Auth is not required for stdio transport (local only).
Logging
# Development
export STATUSPRO_MCP_LOG_LEVEL=DEBUG
export STATUSPRO_MCP_LOG_FORMAT=text
statuspro-mcp-server
# Production
export STATUSPRO_MCP_LOG_LEVEL=INFO
export STATUSPRO_MCP_LOG_FORMAT=json
statuspro-mcp-server
Troubleshooting
"STATUSPRO_API_KEY environment variable is required"
Set the variable or add it to .env:
export STATUSPRO_API_KEY=your-api-key-here
401 Unauthorized
Your API key is invalid or expired. Rotate it in your StatusPro account settings.
Tools not showing in Claude Desktop
- Check
~/Library/Logs/Claude/mcp*.log. - Verify the config file is valid JSON.
- Test standalone:
statuspro-mcp-server(should start with no errors). - Restart Claude Desktop.
Persistent 429 rate limiting
The client retries 429s with exponential backoff automatically. If you see persistent
rate limits, reduce your request frequency — especially around add_order_comment and
bulk_update_order_status (5/min each).
Development
Prerequisites
- uv package manager (install)
- Python 3.12+
Install from source
git clone https://github.com/dougborg/statuspro-openapi-client.git
cd statuspro-openapi-client/statuspro_mcp_server
uv sync
Run tests
# Unit tests only (no API key needed)
uv run pytest tests/ -m "not integration"
# All tests (requires STATUSPRO_API_KEY)
export STATUSPRO_API_KEY=your-key
uv run pytest tests/
Hot-reload development
# Install mcp-hmr (requires Python 3.12+)
uv pip install mcp-hmr
# Run with hot reload
uv run mcp-hmr src/statuspro_mcp/server.py:mcp
Claude Desktop config for development:
{
"mcpServers": {
"statuspro-dev": {
"command": "/Users/YOUR_USERNAME/.local/bin/uv",
"args": ["run", "mcp-hmr", "src/statuspro_mcp/server.py:mcp"],
"cwd": "/absolute/path/to/statuspro-openapi-client/statuspro_mcp_server",
"env": {
"STATUSPRO_API_KEY": "your-api-key-here"
}
}
}
}
Build and install locally
uv build
pipx install --force dist/statuspro_mcp_server-*.whl
Links
- Repo: https://github.com/dougborg/statuspro-openapi-client
- Issues: https://github.com/dougborg/statuspro-openapi-client/issues
- PyPI: https://pypi.org/project/statuspro-mcp-server/
- StatusPro API docs: https://app.orderstatuspro.com/api/v1
License
MIT License — see LICENSE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file statuspro_mcp_server-0.1.0.tar.gz.
File metadata
- Download URL: statuspro_mcp_server-0.1.0.tar.gz
- Upload date:
- Size: 93.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dff0ec16e3c356f3caa875147bdbd48438e04b054c115654e4f2e55e92d8b742
|
|
| MD5 |
cbb39170e8621913caf6843c39f3840f
|
|
| BLAKE2b-256 |
23847d1fa78e9237de07e68787cb839c49399fa5306d28e1fcc3d97a285ff8ce
|
Provenance
The following attestation bundles were made for statuspro_mcp_server-0.1.0.tar.gz:
Publisher:
release.yml on dougborg/statuspro-openapi-client
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
statuspro_mcp_server-0.1.0.tar.gz -
Subject digest:
dff0ec16e3c356f3caa875147bdbd48438e04b054c115654e4f2e55e92d8b742 - Sigstore transparency entry: 2254002866
- Sigstore integration time:
-
Permalink:
dougborg/statuspro-openapi-client@6d43ea24cb51714349b9319e38956881dd3086a7 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/dougborg
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@6d43ea24cb51714349b9319e38956881dd3086a7 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file statuspro_mcp_server-0.1.0-py3-none-any.whl.
File metadata
- Download URL: statuspro_mcp_server-0.1.0-py3-none-any.whl
- Upload date:
- Size: 53.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0d8e657f15c386c76bf2ed8dd83f113a86ed885b598a537043e5d1aa45d79e05
|
|
| MD5 |
af4f2440f6e5b41af7b7d0bf57c8e709
|
|
| BLAKE2b-256 |
c19be32cf10a2e07ba8fcea0743f727832c3b72520b85ad2dd80b32457316aaa
|
Provenance
The following attestation bundles were made for statuspro_mcp_server-0.1.0-py3-none-any.whl:
Publisher:
release.yml on dougborg/statuspro-openapi-client
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
statuspro_mcp_server-0.1.0-py3-none-any.whl -
Subject digest:
0d8e657f15c386c76bf2ed8dd83f113a86ed885b598a537043e5d1aa45d79e05 - Sigstore transparency entry: 2254002909
- Sigstore integration time:
-
Permalink:
dougborg/statuspro-openapi-client@6d43ea24cb51714349b9319e38956881dd3086a7 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/dougborg
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@6d43ea24cb51714349b9319e38956881dd3086a7 -
Trigger Event:
workflow_dispatch
-
Statement type: