Frappe MCP
Frappe MCP
Read-only Model Context Protocol server for the TourScale ERPNext / FranOS instance at erp.tourscale.com. Lets agents query Franchisees, Franchise Agreements, FBUs, Assets, COIs, and ERPNext invoices/GL entries.
What it exposes
Tool | Purpose |
| Connectivity probe — returns the API user identity |
| Franchisees with optional filters |
| Full Franchisee doc by name (e.g. |
| Franchise Agreements; expiring window key for Compliance Watchdog |
| One FA with child tables (brands/royalty/territory) |
| FBUs |
| One FBU with operating addresses |
| Vehicles/vessels |
| Certificate of Insurance, with renewal-window filter |
| Generic escape hatch for any doctype |
| Generic get-by-name |
| Count records |
| Sales Invoices |
| GL ledger entries |
How auth works
Talks to ERPNext REST API as the claude-mcp@tourscale.com user via API key + secret (Frappe-native auth scheme: Authorization: token <key>:<secret>).
The user has the System Manager role on ERPNext. The MCP layer is the trust boundary — the tools above are read-only by design. Don't add write tools casually; agents that need to mutate should call narrow, purpose-specific tools, not generic CRUD.
To rotate keys: re-run the generate_keys flow in bench --site erp.tourscale.local console, update FRAPPE_API_KEY + FRAPPE_API_SECRET in master env, restart ts-frappe-mcp.
Deployment
Container:
ts-frappe-mcpontourscale-netPort: bound to
127.0.0.1:8096(loopback only — reach via local agent client or SSH tunnel)Compose entry lives in
/opt/tourscale/docker-compose.services.ymlEnv file:
/opt/tourscale/frappe-mcp/.env(sourced from master env)
Local dev
FRAPPE_API_URL=https://erp.tourscale.com \
FRAPPE_API_KEY=... \
FRAPPE_API_SECRET=... \
python3 server.pyThen call tools via any MCP client (Claude Code, FastMCP debug tools, etc.).