The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Maximo Enterprise MCP listing page.
A production-focused integration that brings IBM Maximo Asset Management into AI workflows through the Model Context Protocol.
Built by Maxis Technology as part of Alchemize — a state-of-the-art enterprise data management platform capable of doing in hours what others do in days. Want to know more? Head over to alchemize.io.
This project now exposes:
See CHANGELOG.md for the per-version release history (64 net-new tools across waves 1–9).
The current stable surface is 95 public tools across 21 categories. Every tool ships with a strict Pydantic input model (extra="forbid").
When a customer's Maximo doesn't have a particular vertical's data populated (no oil-and-gas turnarounds, no transportation fleet, no Spatial coordinates, etc.), every tool returns
data_unavailable=Truewith a user-friendly note explaining what's missing and what an admin can do. Never a cryptic 400/404.
The integration suite (64 net-new tools across 8 wave smoke tests) is verified end-to-end against Maximo 7.6.x with the mxapi integration extensions (the API patch pack — mxapi* object structures published).
| Maximo build | Status | Notes |
|---|---|---|
| Maximo 7.6.x with mxapi extensions | ✅ Verified live (8/8 wave smokes pass in ~3.5 minutes) | The configuration we test against |
| Maximo 7.6.x without mxapi extensions | ✅ Should work | Multi-candidate mx* → mxapi* falls back to mx* paths cleanly |
| MAS 8.x (Manage on RHOCP) | ⚠️ Should work, not tested | Both mx* and mxapi* published; auth flow may need MCP_AUTH_MODE=jwt for MAS SSO |
| MAS 9.x (Manage on RHOCP) | ⚠️ Should work, not tested | mxapi* is primary; same auth caveat |
The codebase is defensively designed for cross-version use:
tools/*.py constants like JP_OS_CANDIDATES, LABOR_OS_CANDIDATES) iterate mx* first then mxapi* and fall through 404scompound_where_drops_connection)+field / -field orderBy direction prefix (strict OSLC v2 spec — works on every build)data_unavailable=True flag with admin-action note when an OSLC object structure isn't published on the customer's deployment| Category | Tools | What it gives you |
|---|---|---|
| Assets | 9 | Lifecycle, history, downtime / MTTR / MTBF, search, criticality matrix, warranty buckets, failure-class hierarchy, meter readings |
| Work orders | 8 | List / get / KPIs, task breakdown, planned-vs-actual variance, cost breakdown, schedule calendar, "my assigned WOs" |
| Job plans | 3 | Catalog list, full plan with embedded tasks/labor/materials/tools, cost estimate from job plan |
| Service requests | 2 | List + get — front-door intake before WOs |
| Inventory | 8 | Stock check, low-stock list, reorder recs, item master, storeroom catalog, total valuation, critical-spares risk |
| Purchasing | 6 | POs (list + get), purchase requisitions, vendors (list + performance), spend analysis by vendor / status / worktype |
| Labor | 5 | List labor / crews / crafts, utilization, available-technician finder (least-busy first) |
| Locations | 3 | List + get + hierarchy tree |
| Reporting | 6 | Maintenance KPI dashboard, failure Pareto, bad-actor assets, Excel + PDF export, Carbon HTML table |
| AI intelligence | 4 | NL-to-OSLC, anomaly detection (>2σ), root-cause suggestion, asset health score |
| AI moat (Wave 8) | 6 | WO summary, auto-classify failure, chat with asset, PM optimization, predict failure window, runbook generation — every tool LLM-enhanced with statistical/rule-based fallback |
| Spatial / GIS (Wave 9) | 2 | Find assets near a lat/lon, optimised technician routing — graceful "Spatial not installed" fallback when coordinates aren't populated |
| Compliance & EHS | 6 | Calibrations / inspections / permits / certifications-expiring / incidents / compliance dashboard |
| Pharma | 3 | Calibration audit trail (FDA), cleanroom assets, GxP risk score |
| Oil & Gas | 3 | Turnaround status, pressure-vessel inspections, lifting register |
| Manufacturing | 3 | OEE (Availability), production-line status, changeover (SMED) WOs |
| Utilities | 3 | Outage impact analysis, grid-zone assets, SAIDI/SAIFI proxies |
| Healthcare | 3 | Medical-device PM due, device lifecycle (NEW/STABLE/AGING/EOL), JC Environment of Care |
| Transportation | 3 | Fleet readiness %, mileage-based PM due, fuel consumption trend with spike detection |
| Schema / Admin | 8 | Object-structure discovery, schema details, OSLC query validation, code generation, users, audit log, event subscriptions |
| Core | 1 | health_check — connectivity probe + tool count |
Every read tool returns a structured envelope (success / data / metadata). Tools that need data their Maximo build doesn't expose surface a data_unavailable: true flag with an admin-action note rather than failing silently. Write tools ship # DISABLED by default.
Once connected to Claude Desktop / Cursor / Code, try:
This server speaks to a live IBM Maximo instance and exposes its data — and, when explicitly enabled, its mutating operations — to a language model. Before deploying:
MCP_AUTH_MODE=jwt (OIDC) or static + gateway-injected
X-MCP-* headers. Never expose the FastAPI tool API to untrusted callers
without an identity solution in front.MCP_SSL_*) is mandatory for any
non-stdio deployment. The app does not terminate TLS itself.# DISABLED in server.py until you have
reviewed the RBAC policy and audit posture for your environment.MAXIMO_ENV=dev|staging|prod per deployment so audit records and
/healthz make it obvious which Maximo a container is talking to.https://github.com/mcp-style listings.You have two ways to install: uvx (recommended — no manual install) or pip install.
uvx (recommended)Install uv once, then point your MCP client at uvx maximo-enterprise-mcp. uvx downloads, caches, and runs the package on demand.
pip installThen in the configs below, replace:
with:
Edit %APPDATA%\Claude\claude_desktop_config.json (Windows) or ~/Library/Application Support/Claude/claude_desktop_config.json (macOS):
Restart Claude Desktop. The hammer icon appears once tools load.
Add to project-level .mcp.json or global ~/.claude.json:
Run /mcp in Claude Code to verify the connection.
Add to ~/.cursor/mcp.json (global) or .cursor/mcp.json (per project):
In Cursor: Settings → MCP → Refresh to load.
Hosted mode is intended for trusted network or gateway-protected deployments. It now fails closed unless MCP_ACCESS_TOKEN is set.
Remote MCP clients should connect to:
http://host:8080/ssehttp://host:8080/healthzExample remote MCP config:
Hosted HTTP mode also exposes a tool API for non-MCP platforms:
GET /healthzGET /v1/toolsPOST /v1/tools/{tool_name}GET /v1/providers/openai-toolsGET /v1/providers/gemini-toolsGET /v1/providers/grok-toolsExample invocation:
Use GET /v1/providers/openai-tools to retrieve OpenAI-compatible tool definitions, then execute the selected tool via POST /v1/tools/{tool_name}.
Use GET /v1/providers/gemini-tools to retrieve Gemini function declarations from the same shared tool registry.
Use GET /v1/providers/grok-tools. The payload is OpenAI-compatible so the same orchestration pattern works.
Core installation uses requirements.txt.
Optional extras are defined in pyproject.toml:
pip install ".[ai]" for OpenAI, ChromaDB, and sentence-transformers.pip install ".[exports]" for Excel and PDF export dependencies.pip install ".[dev]" for local test and lint tooling.See .env.example for the complete set. The most important variables are:
| Variable | Required | Description |
|---|---|---|
MAXIMO_URL | Yes | Full Maximo OSLC base URL |
MAXIMO_HOST | Yes | Maximo host root URL |
AUTH_MODE | Yes | basic, apikey, or oauth |
MAXIMO_USERNAME / MAXIMO_PASSWORD | Basic auth | Maximo credentials |
MCP_ACCESS_TOKEN | Hosted HTTP | Required bearer token for hosted MCP/API mode |
CURRENT_USER_ROLE | Local only | Session role for local or trusted deployments |
REDIS_URL | No | Redis cache connection string |
VPN_SAFE_MODE | No | Enables safer default payload sizes |
DEFAULT_PAGE_SIZE | No | Default page size when safe mode is enabled |
Use docker-compose.yml if you want Redis included.
The server does NOT terminate TLS itself. Every non-stdio deployment
MUST terminate TLS either at the edge or in-process via
MCP_SSL_CERTFILE / MCP_SSL_KEYFILE. See SECURITY.md.
Run one container image, three deployments, three secret stores. Stamp
MAXIMO_ENV=dev|staging|prod per deployment — the value lands in every
audit record and on /healthz, so an operator can confirm at a glance
which Maximo a given container is pointed at.
Recommended pattern:
| Deployment | MAXIMO_ENV | Maximo target | Token scope |
|---|---|---|---|
| dev | dev | dev Maximo | dev MCP_ACCESS_TOKEN / OIDC tenant |
| staging | staging | staging Maximo | staging token / OIDC tenant |
| prod | prod | prod Maximo | prod token / OIDC tenant |
Never reuse a token across environments — a leaked dev token must not unlock prod, and a misrouted dev container must not write to prod data.
Exposing the raw hosted MCP to the public internet requires ALL of the following — no exceptions:
MCP_AUTH_MODE)MCP_ALLOWED_ORIGINS) — do NOT use *RATE_LIMIT_PER_MINUTE) and a separate edge limiterIntegration tests hit a real Maximo instance configured in .env. Two suites:
tests/integration_test_tools.py — tool-by-tool smoke against a single live Maximotests/integration/test_smoke_wave[1-4].py — per-wave smoke runs that gate every public tool added in waves 1–4/6.env, .mcp.json, or .cursor/mcp.json values.*.example files and keep secrets in local-only files or a secret manager.MCP_ACCESS_TOKEN.IBM and Maximo are trademarks of International Business Machines Corp., used here for descriptive purposes only. This project is not affiliated with IBM.