Bob Meets Maximo: MAS 9.2 MCP Server, IBM Skills, Local Dev Mode, and Agent-Neutral TMG Tooling

🎯 Who this is for: Maximo developers, integration engineers, and technical leads who have read the Bob pitch, heard "69% time savings," and now need to know what Bob can actually do against a Maximo estate on Monday morning. You should already know what an automation script, an MBO, and an object structure are. We will not explain those.

Series: IBM Bob for Maximo Teams | Part 4 of 5 | Read time: ~35 minutes
Previous: Part 3, Governance, Pricing, and Bobcoins | Next: Part 5, Pilot Playbook

πŸ”₯ The Demo That Skips the Hard Part

Picture the vendor demo. A developer types: "Close out all the work orders for pump P-1001 that have been in COMP for more than thirty days." The agent thinks for a moment, calls a tool, and a green check appears. Applause.

Now picture the same sentence at 2 a.m. in your production estate, where nobody is clapping.

"Which API key did it use?" β€” "The admin one. It was already in the environment."
"Which work orders did it touch?" β€” "We think forty. Maybe four hundred."
"Was there a dry run?" β€” "There was a plan."

Every Maximo shop that has stood up an AI agent against a live instance has had some version of this conversation. In Part 3 we covered the controls around Bob: policies, identity, audit, and cost. This part is about the other side of the connection. What does Bob actually touch in Maximo, through which door, and under whose authority?

There is real substance here. IBM shipped a native Maximo MCP server in MAS 9.2. IBM's Build Engineering team published Bob skills for Maximo automation scripts. A Maximo Application Framework extension supports the Bob IDE as a first-class editor. An independent consultant has tested Bob against real Maximo chores and written down what happened. And we run three open or semi-open tools of our own that any agent can use.

But the substance comes with caveats, some of which IBM's own pages disagree on, and we found one where a file path in IBM's own README no longer matches the repository. We will show our work.

πŸ’‘ Key insight: "Bob works with Maximo" is four different claims. Reading and rewriting files in a repository is one. Calling Maximo APIs through MCP is another. Using an IBM skill is a third. Previewing app XML in Local Dev Mode is a fourth. Each has a different risk profile, a different credential, and a different evidence trail. Never let anyone merge them into one sentence.

πŸ“Œ The Short Version

QuestionShort answerSource label
Is the 69% figure usable in a business case?No. One sentence, internal estimate, no methodIBM-reported
Does MAS 9.2 have a native MCP server?Yes: an instance_ID-mcp deployment on OpenShiftIBM docs
Can external agents (including Bob) use it?Yes, via a public route with an apikey header or JWTIBM docs, third-party summary
How are its tools created?Generated from Manage: AI configurations plus custom tools from object structures, automation scripts, workflows, API routesIBM docs
Does an agent bypass Manage security through it?No. Every tool is a Maximo REST API POST under Manage authorizationIBM docs
What are IBM's two Maximo Bob skills?maximo-code-optimization and maximo-java-conversionIBM GitHub, verified Oct 2026
Where do they live now?automation/operate/asset-management/bob-skills in ibm-self-serve-assets/building-blocksIBM GitHub, verified Oct 2026
Does Local Dev Mode support Bob?Yes: "IBM Bob IDE or VSCode 1.74.0+"; MAS 9.1.21+ and 9.2.1+IBM docs
Is there an end-to-end Bob to MAS 9.2 MCP walkthrough?Not that we could findGap
Are TMG's tools open source?Max_Interfaces: MIT. Max_autoscripts: MIT. Max_mcp: proprietary, not open sourceTMG repos

"Source label" means where the claim comes from, not that we tested it. We read IBM's pages and repositories this run and downloaded the skill packages to inspect their contents. We did not connect Bob to a live MAS 9.2 server, because we have not got one in this environment. Where a claim rests on a vendor page alone, the text says so.

πŸ“Š The 69% Claim, With Its Caveat Attached

IBM's April 2026 GA announcement contains the sentence every Maximo conversation about Bob starts with. The IBM Maximo development team used Bob for code generation, refactoring, and updates that "normally take days," finished them in hours, and IBM calls the result "an estimated 69% time savings."

Read it again, slowly, the way you would read a vendor performance claim in an RFP.

What a number needsDoes the Bob sentence provide it?
A defined task mixNo. "Code generation, refactoring, and updates" is a category list
A baselineNo. "Normally take days" is not a measured control
A sample sizeNo
A measurement methodNo. "Estimated" tells you it was not timed
Whether review, test, and rework time were countedNo
Who did the workPartly: IBM's own product team, who know the codebase
Whether it transfers to a customer estateNo. Product engineering is not configuration, integration, data, or upgrade work

None of that means the number is false. It means it is unusable for planning. A product team with deep codebase knowledge doing greenfield-adjacent refactoring is the best case for any coding agent. A customer team doing the third rework of an integration against an undocumented ERP endpoint is a different animal.

How to cite it

DoDon't
"IBM reports an estimated 69% time savings on internal Maximo product development tasks (IBM-reported, no published method)""Bob makes Maximo development 69% faster"
Put it in a footnote next to your own pilot metricPut it on the slide as the headline
Ask IBM for the task mix and measurement methodExtrapolate it to upgrade projects
Use it to justify running a pilotUse it to justify a seat count

Part 5 builds the replacement: a scorecard of Bobcoins per task, review hours, and defect escapes that you collect yourself. For now, hold the number at arm's length and read on, because the interesting material is not the percentage. It is the plumbing.

πŸ—ΊοΈ Four Doors Between Bob and Maximo

Before the deep dives, here is the map. Everything Bob does with Maximo goes through one of four doors, and the doors have very different consequences.

╔══════════════════════════════════════════════════════════════════════╗
β•‘  DOOR 1: THE REPOSITORY            files on the developer's machine  β•‘
β•‘  Bob reads/edits autoscripts, app XML, BIRT, Java, integration code  β•‘
β•‘  Credential: none needed.   Blast radius: the working tree           β•‘
╠══════════════════════════════════════════════════════════════════════╣
β•‘  DOOR 2: IBM SKILLS                packaged instructions + tools     β•‘
β•‘  maximo-code-optimization / maximo-java-conversion                   β•‘
β•‘  Credential: API key (optimizer fetches scripts).  Blast: scripts    β•‘
╠══════════════════════════════════════════════════════════════════════╣
β•‘  DOOR 3: MAF LOCAL DEV MODE        editor extension for app config   β•‘
β•‘  OAuth/OIDC sign-in, live preview, offline cache, XML diff/merge     β•‘
β•‘  Credential: your MAS login.   Blast: app configuration             β•‘
╠══════════════════════════════════════════════════════════════════════╣
β•‘  DOOR 4: MCP                       the agent acts on LIVE Maximo     β•‘
β•‘  MAS 9.2 native server  |  TMG Max_mcp  |  any MCP server            β•‘
β•‘  Credential: API key / JWT.   Blast: whatever the key can do         β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•
       Doors 1 to 3 change files or previews. Door 4 changes data.
DoorAgent changesNeeds a Maximo credential?Review artifactWhere Part 3's controls apply
1. RepositoryFiles in a working treeNoGit diffApproval groups edit, execute
2. IBM skillsFiles, plus a fetch from Maximo by the optimizerYes for the optimizerDiff, skill's before/after reportskill group
3. Local Dev ModeApp configuration in preview, local filesYes (your login)Maximo XML diffedit group
4. MCPLive Maximo records and configurationYes, and it is the dangerous oneMaximo-side API logs, Plan outputmcp group, key scope

A useful rule: move up the table only when the evidence above you is boring. Run Door 1 for a month before you open Door 4, and run Door 4 read-only before you ever give it a write key.

πŸ”Œ The MAS 9.2 Maximo MCP Server

MCP, the Model Context Protocol, is the open standard that lets an AI agent discover and call tools on another system through a uniform interface. If you have not met it, think of it as a typed, self-describing API catalog an agent can read at runtime. MAS 9.2 puts one in front of Manage.

What IBM documents

Everything in this section comes from IBM's "Maximo MCP server overview" documentation for MAS 9.2 unless stated otherwise.

AspectWhat IBM states
DeploymentA pod on Red Hat OpenShift, named instance_ID-mcp
ReadinessThe pod stays unready until Manage is ready, then performs a full tools refresh
Tool sourcesAI configurations (mcc, pcc, similarity, nl2oslc, docsearch, insightsgenerator), plus custom tools from automation scripts, object structures, workflows, and API routes
Tool registryAI configuration tools are governed through the MAXAICFGTOOL table
Transport to Manage"All Maximo Manage-based tools are Maximo REST API POST calls." Not all Maximo APIs are tools
RefreshPulls the tool list on startup, re-checks every POLLING_FREQUENCY (default 10 minutes)
TimeoutTOOL_RESPONSE_TIMEOUT, default 10 minutes
External accessPublic-facing OpenShift route; apikey header or JSON Web Token
ProtocolJSON-RPC 2.0 tools/call; responses via Server-Sent Events (SSE), per DOC16
AnnotationsMCP annotations can be applied after deployment, for example marking a tool as destructive
Built-in consumerIn MAS 9.2 the agentic Maximo Assistant runs on the ALM-agent, which chains tool calls through this server

A practitioner write-up from Naviam adds two details worth knowing. The server refreshes tool definitions from OpenAPI specifications using ETags, so polling is cheap. And for built-in agents the call carries an x-access-token JWT validated through Core IDP, while external agents authenticate with API keys or JWT, with internal MCP-to-Manage-to-Core traffic protected by MAS certificates. Naviam also notes that only non-interactive workflows are supported, meaning workflows built from nodes, condition nodes, and actions. A workflow that opens a dialog for a human cannot be a tool in this release.

The architecture in one picture

 β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   apikey / JWT     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
 β”‚  Bob IDE or  β”‚ ─────────────────► β”‚  OpenShift route        β”‚
 β”‚  Bob Shell   β”‚   JSON-RPC 2.0     β”‚  (public-facing)        β”‚
 β”‚  (MCP client)β”‚ ◄───────────────── β”‚                         β”‚
 β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   SSE responses    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                 β”‚
 β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
 β”‚  Maximo      β”‚   tool call        β”‚  instance_ID-mcp pod    β”‚
 β”‚  Assistant   β”‚ ─────────────────► β”‚  tools list synced from β”‚
 β”‚  (ALM-agent) β”‚                    β”‚  Manage every 10 min    β”‚
 β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                 β”‚ REST POST (as a Manage user)
                                     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                                     β”‚  Maximo Manage          β”‚
                                     β”‚  security groups, rules,β”‚
                                     β”‚  validation, workflow   β”‚
                                     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Why the REST-POST detail matters for governance

The single most important sentence in IBM's documentation, for a Maximo person, is that tools are REST API calls. It means an agent action is not a side door. The call goes through Manage's security layer, so the agent can only do what the user behind the API key could do in the product. It also goes through business rules, validations, and workflow, so an agent cannot, for instance, put a work order into a status your status-change rules forbid.

That is good news. It is also a trap if you stop reading there.

ProtectionProvided by the MCP server's design?Provided by you
Agent cannot bypass Manage securityYesChoosing the key's security group
Agent cannot skip business rulesYesWriting good business rules
Agent cannot do more than the key allowsYesMaking the key small
Agent cannot be tricked into a legal but harmful actionNoRead-only keys, destructive annotations, human approval
Agent actions are attributablePartly (key identity in Maximo logs)One key per use case
Tool set is smallBy default; grows as you expose scripts and object structuresCurating what you expose

A legal but harmful action is the interesting category. "Cancel all open work orders at this location" is a valid, authorized, rule-compliant call for a planner's account. The agent did not break any rule. It did the wrong thing. Only a narrow key, a destructive annotation, and a human approval step stop that.

Which tools exist, and how to read them

The AI-configuration tools are Maximo's own AI building blocks surfaced as MCP tools. We do not have IBM's per-tool descriptions, so treat the following interpretations as our reading of the names, to be verified against tools/list on your server.

ToolLikely purpose (our reading; verify with tools/list)
nl2oslcTurn a natural-language question into an OSLC query against Manage
docsearchSearch documentation or attached document content
similarityFind similar records, for example similar work orders
mcc, pccAI configuration categories used by Manage's AI features
insightsgeneratorProduce condition insights summaries for assets

The custom tools are the part that matters to a developer, because you decide what the agent can call. IBM's own Assistant announcement gives the examples of changing work order status, creating follow-up work orders, and executing custom automation scripts as tools. In other words, an automation script with a clear input and output contract can become an agent-callable tool without you writing an MCP server at all.

Exposing your own capability, the right way

Here is the design pattern we recommend for custom tools. The principle is that a tool should be a narrow verb with a validated input, not a generic "run anything" door.

Good toolBad tool
wo_set_failure_class(wonum, failurecode)wo_update(any_field, any_value)
asset_get_last_5_downtimes(assetnum)run_sql(statement)
sr_add_worklog(ticketid, text)execute_script(name, args)
Read-only by constructionWrite capability hidden behind a read-sounding name

If you build tools from automation scripts, put the validation in the script. Here is a minimal Jython example of a script that is safe to expose, because it checks its own input and refuses to act outside a narrow lane. The script name, object, and message keys are illustrative.

# Illustrative: an action-style script intended to back a narrow agent tool.
# Verify implicit variable names and launch point configuration in your version.
from psdi.mbo import MboConstants

ALLOWED_STATUSES = ["WAPPR", "APPR"]

# "params" stands for whatever input mapping your action launch point provides.
if mbo.getString("STATUS") not in ALLOWED_STATUSES:
    service.error("wo", "agentstatusnotallowed")   # custom message you create in MAXMESSAGES

mbo.setValue("FAILURECODE", params["failurecode"], MboConstants.NOACCESSCHECK)

The detail worth stealing is the pattern, not the exact syntax: an allow-list, a hard refusal, and a custom message key that appears in the agent's tool result so the failure is legible.

πŸ’‘ Key insight: The MCP server decides how a tool is invoked. You decide how narrow the tool is. A permissive tool behind a careful server is still a permissive tool.

What we could not verify: Bob to this server

Here is the honest part. IBM's documentation and a third-party summary both say external agents such as Bob, Claude, and OpenAI can connect through the supported route and authentication model. But we found no published end-to-end write-up of Bob calling this server in production. DOC16 records the same gap, and the independent Bordelanne evaluation we discuss below explored MCP only as a future possibility.

There is also a transport detail worth a sandbox test. Bob's documented remote transport is streamable-http with custom headers. IBM's Maximo server is described as accepting JSON-RPC 2.0 tools/call and responding over SSE. Streamable HTTP and SSE are related, and many clients handle both, but we have not seen that exact pairing confirmed. Test it.

πŸ”§ Connecting Bob to Manage Without Handing It the Keys to the Plant

Bob stores MCP server definitions in two places, per IBM's Bob documentation: globally in ~/.bob/settings/mcp.json, or per project in .bob/mcp.json, where the project file takes precedence and can be shared through version control. Both use a JSON object named mcpServers. Each entry can set command, args, cwd, env, alwaysAllow, and disabled for local (stdio) servers, or type: "streamable-http", url, and headers for remote servers.

That last field is the one to be careful with. alwaysAllow is a list of tools Bob will run without asking. In Part 3 we recommended locking the mcp approval group through group policy. If you do that, alwaysAllow entries in a project file do not defeat your policy. If you do not, a single alwaysAllow line in a repository you cloned from somewhere can turn a read tool into an unattended one.

A project file, step by step

This is an illustrative .bob/mcp.json. The server name, URL path, and header handling are placeholders. IBM's page for the Maximo server does not publish a sample for Bob, and we have not tested this against a live route. Check the route URL in your own OpenShift console, and do not commit a real key.

{
  "mcpServers": {
    "maximo-native-readonly": {
      "type": "streamable-http",
      "url": "https://<instance_ID>-mcp.<your-apps-domain>/mcp",
      "headers": {
        "apikey": "<paste a READ-ONLY key from your secret manager, never commit>"
      },
      "alwaysAllow": [],
      "disabled": false
    }
  }
}

Three habits protect you here.

  1. Keep `alwaysAllow` empty at first. Make every call a human click until you understand what the agent calls and how often.
  2. Keep the project file out of git, or keep the key out of the file. Add .bob/mcp.json to .gitignore for any repository that holds client code, and add .bobignore entries for key files. (Part 2 explains why .bobignore is a courtesy, not a sandbox.)
  3. Prefer a key per use case and name it for the use case. When the agent does something odd, BOB_READONLY_ANALYSIS in the Maximo log tells you what it was meant to be doing.

For the pre-flight check, use MCP Inspector or plain curl before you involve Bob. IBM notes MCP Inspector can be used for debugging the server. A raw JSON-RPC call looks like this (illustrative, adjust the route and confirm the exact path and required Accept headers in your environment):

# List available tools (read-only metadata call), illustrative
curl -sS -X POST "https://<instance_ID>-mcp.<your-apps-domain>/mcp" \
  -H "apikey: $MAXIMO_READONLY_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

If tools/list works from curl and fails from Bob, you have a client transport problem. If it fails from both, you have a route, key, or TLS problem. That binary split saves an afternoon.

The API key ladder

Maximo's own guidance is the foundation here. In Manage, API keys are created in the API Keys application and are registered to a user; the key value is shown once and cannot be recovered later, and API key authentication depends on the mxe.oslc.webappurl system property pointing at your Manage server. What the key can do is defined by the security groups of the user that owns it. That makes the service user and its security group your real control surface.

Climb this ladder one rung at a time, and only when the previous rung has been boring for long enough to trust.

RungService user (example name)What the security group allowsEnvironmentPromote when
0. Files onlynonen/anoneAlways start here
1. Read-only analysisBOB_READONLYRead on a short list of object structures (for example MXAPIWODETAIL, MXAPIASSET)Non-production, or masked dataTwo clean weeks, no surprise calls in the Maximo log
2. Draft writesBOB_DRAFTCreate and change on draft records only; no approving status changesTestA named owner and a rollback script exist
3. Dev configurationBOB_DEV_SCRIPTSAutoscript and deploy signature optionsDev onlyReviewed script diffs, tests in CI
4. Production writeNone for agentsHumans, through your normal change pathProductionNever delegate this to an agent

Notice that rung 4 is empty on purpose. Our position, consistent with Part 3, is that the agent drafts and a human executes in production.

Marking tools as destructive

IBM states that MCP annotations can be applied after deployment, for example to mark a tool as destructive. Use that. A destructive annotation tells a well-behaved client to ask for confirmation. But remember the layering: an annotation is a hint to the client, not an access control. The security group is the enforcement. Do both.

LayerMechanismStrength
Tool designNarrow verbs, validated inputsPrevents whole classes of misuse
MCP annotationdestructive markingHint to the client; depends on client behavior
Bob approvalGroup policy locks mcp; no alwaysAllowHuman gate per call
Maximo security groupObject structure and operation permissionsHard enforcement
EnvironmentNon-production endpointLimits blast radius regardless of the above

A read-only session, annotated

Here is the kind of session we recommend as the first MCP experiment. Every step is a read.

StepPrompt to BobWhat should happenWhat you verify
1"List the tools the Maximo server exposes and tell me which ones can modify data."Bob calls tools/list and classifiesCompare against your own tool inventory and annotations
2"How many work orders for asset 11450 are in status COMP in the last 90 days?"One query-style tool callThe Maximo-side request log shows a single read under BOB_READONLY
3"Summarize the open service requests for location BEDFORD."One or two read callsCount matches a query you run yourself
4"Close those work orders."Bob should refuse, ask for approval, or fail on permissionThe security group blocks it. If it succeeds, your key is too wide. Stop and fix it

Step 4 is the test that matters. A pilot that never tries a forbidden action has not proven the control.

🧰 IBM's Two Maximo Skills for Bob

A Bob skill is a packaged bundle of instructions, knowledge files, and sometimes helper tools that Bob loads on demand. IBM's Build Engineering team publishes two for Maximo.

What we verified, and what changed

DOC16 (our knowledge base, written from IBM material) names the skills maximo-code-optimization and maximo-java-conversion and places them in ibm-self-serve-assets/building-blocks under build-and-deploy/asset-management. We checked the live repository this run. The skill names are correct. The path is not.

ItemDOC16 and older materialLive repository (verified October 2026)
Repositoryibm-self-serve-assets/building-blocksSame
Directorybuild-and-deploy/asset-managementautomation/operate/asset-management
Skill 1 zipbob-skills/maximo-code-optimization.zipSame filename, now under automation/operate/asset-management/bob-skills/
Skill 2 zipbob-skills/maximo_java_conversion.zip (underscore)Same filename, same folder
Skill 2 name insidemaximo-java-conversionmaximo-java-conversion (version 1.2.0 in its SKILL.md)
Web app"Maximo Modernization Asset"assets/maximo_code_modernization_asset/

The directory move matches IBM's September 30, 2026 repository restructure, whose commit message describes renaming and regrouping the AI blocks and updating "skill installers, zips, extension config, and MCP tool descriptions." If you have scripted a download from the old path, it will 404. This is the kind of drift that breaks a pipeline silently, so pin a commit, not a branch.

A trap in the same repository

Under ai/engineering/code-modernization/assets/ there is a file called maximo-modernization-java.zip. The name looks like the Java-to-script converter. It is not. When we opened it, its SKILL.md identifies itself as code-modernization-expert, a generic modernization skill covering Python 2 to 3, Java 8 to 21, React, Spring Boot, and monolith-to-microservice patterns. It is a fine generic skill, and it is not the Maximo MBO-to-automation-script converter.

FileReal identity (from its SKILL.md)Use it for
maximo-code-optimization.zipFrontmatter name maximo-script-optimizer, v1.0.0; fetch, analyze, optimize, and secure Maximo automation scriptsReviewing and hardening existing autoscripts
maximo_java_conversion.zipmaximo-java-conversion, v1.2.0; convert Maximo Java classes to Python, Jython, JavaScript, Nashorn, ECMAScript, or MBRJava MBO to automation script conversion
maximo-modernization-java.zipcode-modernization-expert; generic multi-language modernizationNot Maximo-specific; do not confuse with the converter

Note the name drift inside the optimizer: the folder and file are maximo-code-optimization, but its own frontmatter says maximo-script-optimizer. That will not break anything, but if you search Bob's Skills panel for one name and see the other, now you know why.

What each skill actually contains

We downloaded both packages into an isolated temporary directory and listed their contents without executing anything. This is a description of the package structure, not an audit of the code.

SkillStructure we observedNotable contents
maximo-code-optimizationSKILL.md (about 20 KB), tools/fetch_maximo_scripts.py, a knowledge/ tree (core, procedures, troubleshooting, reference), an examples/ folderScripting fundamentals, security best practices, performance optimization, common issues, quick reference, a worked optimization example
maximo-java-conversion.bob/skills/maximo-java-conversion/ with skill.json, knowledge/ (core, reference, troubleshooting, procedures), tools/java_to_script_converter.py (about 45 KB), tools/business_logic_analyzer.pyA language-mapping guide, a best-practices reference, a converter and a business-logic analyzer

The optimizer's workflow, as written in its SKILL.md, is worth knowing before you enable it. It tells Bob to create a maximo-scripts/ project folder, copy the fetch script, ask you for the Maximo base URL and an API key, write those into a .env file, and call /maximo/api/os/MXAPIAUTOSCRIPT to pull your automation scripts. That is Door 2 and Door 4 in one step: a skill that quietly uses a credential.

⚠️ Operational warning: The optimizer creates a .env file containing your Maximo API key inside the workspace. Make sure that file is covered by .bobignore, by .gitignore, and by your secret scanner. The key it needs is read access to MXAPIAUTOSCRIPT. Give it a read-only key, never an admin one.

Installing the skills

IBM's README says to unzip the packages from your project root and then open Bob's Skills panel to enable them. Because the packages differ in how they unzip (the Java converter ships with a .bob/skills/... prefix, and the optimizer's own SKILL.md refers to .bob/skills/maximo-code-optimization/tools/...), inspect the resulting tree before relying on a path.

# In a throwaway test repository, not in client code.
mkdir -p ~/bob-maximo-lab && cd ~/bob-maximo-lab

# Pin a commit rather than main; IBM restructured paths on 2026-09-30.
BASE="https://raw.githubusercontent.com/ibm-self-serve-assets/building-blocks/<pinned-commit>/automation/operate/asset-management/bob-skills"
curl -fsSLO "$BASE/maximo-code-optimization.zip"
curl -fsSLO "$BASE/maximo_java_conversion.zip"

# List before you extract; never run extracted scripts you have not read.
unzip -l maximo-code-optimization.zip
unzip -l maximo_java_conversion.zip

unzip maximo-code-optimization.zip
unzip maximo_java_conversion.zip
find . -name SKILL.md -o -name skill.json

Then enable the skills in Bob's Skills panel. If your policy locks the skill approval group (and for client machines we recommend it), each skill run will prompt. Good. A skill is instructions plus code, and the code runs with your privileges.

Worked example: Java MBO to automation script

This is the task where an IBM skill, a testable outcome, and a real Maximo need line up. Suppose you have a custom WO subclass from a 7.6 era customization that enforces a failure code before completion.

The Java, simplified:

package com.acme.app.workorder;

import java.rmi.RemoteException;
import psdi.app.workorder.WO;
import psdi.mbo.MboSet;
import psdi.util.MXApplicationException;
import psdi.util.MXException;

public class AcmeWO extends WO {
    public AcmeWO(MboSet ms) throws MXException, RemoteException { super(ms); }

    @Override
    public void save() throws MXException, RemoteException {
        if ("COMP".equals(getString("STATUS")) && isNull("FAILURECODE")
                && "CM".equals(getString("WORKTYPE"))) {
            throw new MXApplicationException("acme", "failurecoderequired");
        }
        super.save();
    }
}

The equivalent Jython automation script, as an Object launch point on WORKORDER (Save event, before save). The structure is what the converter should produce; your exact launch point settings and message setup need to be checked in your environment:

# Script: ACME_WO_FAILURECODE_REQUIRED   Object launch point: WORKORDER, Save, Before Save
if mbo.getString("STATUS") == "COMP" and mbo.getString("WORKTYPE") == "CM" \
        and mbo.isNull("FAILURECODE"):
    service.error("acme", "failurecoderequired")   # the message must exist in MAXMESSAGES

The conversion is short, which is why it is dangerous: it looks obviously right. Here is what a human reviewer must check and what a good skill run should surface on its own.

CheckWhy it mattersHow to test
The message group and key exist in MaximoA missing message produces an unhelpful error at runtimeCreate the message; trigger the rule in dev
Event semantics differ from save()A Java save() override and an Object Save launch point do not fire in identical circumstances, for example around child MBOs and non-user savesTest UI save, REST save, workflow-driven status changes, and MIF inbound
Status check uses the right valueJava compared an internal value; synonym domains (internal vs. external status) need careTest with a synonym status in your environment
Entry conditionsWORKTYPE filter and isNull semantics preservedUnit-style test cases: CM with code, CM without, PM without
PerformanceAn autoscript on a hot object runs on every saveCheck the launch point condition field; add one rather than testing in the body
Deployment and rollbackAutoscripts deploy through different paths than JAR classesKeep the Java class until the script is proven, then retire it deliberately

IBM's converter skill advertises business-logic preservation and a conversion report. Treat the report as a checklist for your review, never as a pass certificate. The test matrix above is yours.

Using the optimizer skill responsibly

The optimizer targets patterns Maximo practitioners know well: unreleased MboSet handles, missing error handling, string-built SQL, repeated getMboSet calls inside loops, and logging gaps. We have not benchmarked its findings, so here is how we would review them.

Finding class (typical)Auto-accept?Reason
Add logging or commentsYes, after a skimLow risk
Close or release MboSet resourcesReviewEasy to introduce use-after-close errors
Replace string-built queries with bind parametersReview and testSecurity win; check the semantics of the filter
Restructure loops for performanceNever auto-acceptBehavior changes hide here
Change transaction or save behaviorNever auto-acceptData consequences
"Fix" security by deleting functionalityRejectNot a fix

Feed it your house rules. TMG's Max_autoscripts ships a standards file and an AGENTS.md, and IBM's own README says the patterns apply to any AI coding assistant. Put your standards in .bob/rules/ or an AGENTS.md at the repository root so the skill's generic advice is overridden by your conventions. The house rules post in our vibe-coding series covers how to write them.

The companion web app, and a data-egress question

The same IBM directory includes a Maximo Modernization Asset, a Node.js and React web application for script optimization, Java conversion, batch conversion, impact analysis, and pushing optimized scripts back to Maximo via REST PUT. The README lists an OpenAI API key as a prerequisite for its AI-powered optimization.

That is a governance fact you cannot skip. If you run the web app, your automation script source goes to the model provider you configure, which is a different data path from Bob. Part 2 covers Bob's own data handling. The web app is a separate trust decision. It also offers a write-back path. Our recommendation matches rung 4 of the key ladder: do not give a tool with write-back a production key.

πŸ§ͺ MAF Local Dev Mode: The Inner Loop for App Configuration

If your work is Manage application configuration rather than Java or scripts, the relevant IBM asset is Maximo Application Framework (MAF) Local Dev Mode, an extension published through IBM's ibm-mas.github.io project pages.

What IBM documents

AspectIBM's statement
Editor"IBM Bob IDE or VSCode 1.74.0+"
Node.js20.0.0 or higher
Supported MAS versionsMAS 9.1.21 and newer; MAS 9.2.1 and newer
AuthenticationOAuth 2.0 / OIDC
FeaturesLocal development server with live reload; offline data caching; Maximo XML comparison with visual highlighting; an application browser panel inside the editor; self-signed certificate support
Bob install path`curl -fsSL https://ibm-mas.github.io/maf-local-dev-mode/scripts/install.shbash -s bob`
VS Code installThe same script without the bob argument; interactive mode auto-detects
WarrantyProvided "AS IS," with no warranty of any kind

Two practical notes. The version floor is patch-level specific: 9.1.21 and 9.2.1, not "9.1" and "9.2." Check your Manage version before you plan around it. And the "AS IS" language is standard for IBM-hosted community assets, but it is your signal that this is a developer productivity tool and not a supported product feature. Do not make it a dependency of your delivery contract.

Why this pairs well with Bob

App Designer XML is exactly the kind of artifact where a reviewer wants a diff, not a description. Local Dev Mode's XML comparison gives that diff, and Bob's Plan mode gives the intent. A change request that carries both is easier to approve than one with a screenshot.

StepToolOutput for the change record
1. Describe the screen changeBob Plan modePlan listing the controls and fields to change
2. Apply in the local projectBob Agent mode with edit approved per actionModified XML
3. PreviewLocal Dev Mode live-reload serverScreenshot of the preview
4. Review the deltaLocal Dev Mode XML compareVisual diff
5. ImportHuman, through your normal change pathChange record entry

A caution about step 5: a preview that looks right locally is not evidence the import will behave on your server, particularly with security groups, conditional UI expressions, and data restrictions. Keep a test-environment import in the loop.

πŸ—£οΈ What a Practitioner Found: The Sopra Steria Evaluation

Independent evidence matters more than vendor sentences, and there is little of it. The best Maximo-specific piece we found is by Yann Bordelanne, a Maximo consultant at Sopra Steria, summarized on DEV Community by Abhay Rao. Note the layering: it is a secondhand summary of Bordelanne's work, so we cite the summary and treat finer detail with care.

What was tested

ScenarioWhat Bob was asked to do
Maximo SQLGenerate and explain queries (per DOC16's summary)
BIRT reportsIdentify components, understand logic, suggest changes
Application XMLLocate controls, assist with field additions and layout changes
Log analysisInvestigate a Java library conflict and dependency problem
Java to JythonConvert Java implementations into Maximo-compatible automation scripts

What was concluded

The headline finding is about context. When Bob was given work order details, business rules, naming conventions, and existing internal scripts, the quality and relevance of its output improved markedly compared to generic requests. DOC16 quotes the conclusion this way: "The quality of the output depends heavily on the quality of the context provided." The proposed formula is Context + Tools + Governance + Human Validation.

Two more points matter for readers of this series:

  • MCP was a future possibility, not a tested result. The summary describes MCP integration as the most promising next step, with Bob interacting with Maximo through authorized APIs while keeping security and business logic intact. It did not report a working MCP test.
  • The recommendation favors the API layer. Prefer APIs, object structures, and automation scripts over direct database access. That matches IBM's own architecture, and it matches our position.

What the evaluation does not give you

GapWhy it matters
No quantitative resultsNo time savings, defect rates, or cost per task
Single practitioner, single environmentNot a sample
Secondhand summaryDetails may be compressed
No MCP resultThe most strategic capability is untested here

So read it as directional evidence that context quality drives output quality, and as a map of scenarios worth including in your own pilot. It is not a benchmark.

βš–οΈ Where Bob Fits in Maximo Work

Now to the table most readers want. This is our assessment, built on DOC16's task-fit framework, IBM's skill scope, and the Sopra Steria scenarios. "Fit" means the combination of how well agents do this kind of work, how testable the outcome is, and how contained the failure is. It is not a measured result.

Maximo taskFitWhyDoorCredentialReview artifact
Java MBO to autoscript conversionHighIBM skill exists; pattern-heavy; outcomes are testable1, 2None to read-onlyDiff, test matrix
Autoscript review and refactorHighIBM skill exists; house standards can be fed in1, 2Read-only for fetchDiff, skill report
Integration code (OSLC, REST, MIF, Kafka)Medium to highNeeds an accurate API catalog in context1, 4 (read)Read-only keyDiff, API call log
BIRT report changesMediumWorks with context; layout and SQL need human QA1NoneRendered report, SQL review
App Designer XML editsMediumLocal Dev Mode diff helps; review before import1, 3Your MAS loginXML diff
Upgrade analysis (7.6 to MAS 9)MediumGood at inventorying customizations; verify every finding1NoneInventory with sampled verification
Read-only operational Q&AMediumValuable and low-risk via MCP, but only as good as the tools4 (read)BOB_READONLYMaximo request log
Draft record creation (test)Low to mediumAcceptable with draft-only keys and review4 (draft)BOB_DRAFTRecords in test
Production data fixesDo notUse scoped API tools through a human-run path, never direct database accessn/aNone for agentsNormal change process
Security group or access changesDo notA privilege escalation pathn/aNoneSecurity process

Reading the table

High fit means a bounded input, a known output shape, and a way to check. A Java class has behavior you can characterize. An autoscript either passes your tests or does not.

Medium fit means the agent is useful but the result depends on context it may not have. A BIRT change needs the report's data model and a human to look at the rendered output.

Do not is not about whether the agent can. It is about whether the cost of a mistake is too high for the evidence you can gather. Production data goes through the API layer under a human's hands, with a dry run.

Anti-patterns we have seen

Anti-patternWhat goes wrongFix
"Let it fix the data directly"Direct database writes bypass business rules, audit fields, and integration eventsAPI layer only; agent drafts the payload
One shared admin key in .envNo attribution, maximum blast radiusKey per use case, scoped group
Agent summarizes a customization without the sourceHallucinated behaviorGive it the script or class; require citations to lines
"Convert everything in batch"Review debt piles upConvert by launch-point group, with test evidence per batch
Treating the skill's report as acceptanceLulls reviewersReports are checklists; tests are acceptance
Letting Bob author the rule that guards BobCircular controlHumans write policy and security groups

🧱 TMG Tooling: Agent-Neutral Assets for Any Maximo Agent

Everything above uses IBM-native tools. Our own tools sit beside them, and we want to be precise about what each is, because licenses differ and we will not blur that.

The three tools

ToolWhat it isVersion coverageLicense
Max_InterfacesMaximo API library: 2,439+ endpoints across 14 modules, OSLC and NextGen REST, Postman v2.1 and OpenAPI 3.0 collections, an automation-script deploy pipeline (120 requests), and API discoveryMaximo 7.x, 8.x, MAS 9MIT, open source
Max_mcp (npm @themaximoguys/maximo-mcp, v2.0.0)A Maximo MCP server with 175 tools across 20 modules: TypeScript with Zod validation, rate limiting, caching, retries, multi-environment configuration, DockerMaximo 7.6 through MAS 9 (per TMG; see note below)Proprietary. Not open source. Available on npm and GitHub; all rights reserved
Max_autoscripts67 Jython sample scripts, 28 templates, a standards file TMG_AUTOSCRIPT_STANDARDS.md, Java to Jython and TRM to Jython conversion guides, plus CLAUDE.md and AGENTS.md house rulesMAS 9 targeted, stock objectsMIT, open source

A note on terminology that matters to us: Max_mcp is not open source. Its GitHub repository is publicly readable, which people sometimes confuse with an open license. Its README states it is proprietary software with all rights reserved, and GitHub's license detection reports no recognized license. The npm package metadata points to a LICENSE file rather than an OSI license identifier. If you need to evaluate it for use, read the LICENSE file and talk to us. Max_Interfaces and Max_autoscripts, by contrast, carry the MIT license.

A second note on version coverage: the Max_mcp README describes it as a server for MAS 9.x, while the TMG knowledge base (DOC16) describes it as working across Maximo versions. The README's own title and examples focus on MAS 9, so verify your version against its documentation and a test instance before assuming 7.6 or 8.x support. We flag the difference rather than smooth it over.

What "agent-neutral" means here

None of these tools care which agent calls them.

ToolHow Bob uses itHow Claude, Copilot, or Cursor uses it
Max_InterfacesReference the API catalog and OpenAPI files in the repository so Bob writes correct REST callsSame files, same effect
Max_autoscriptsAGENTS.md and the standards file as .bob/rules/ or repository instructionsCLAUDE.md or AGENTS.md equivalents
Max_mcpAdd as an stdio server in .bob/mcp.jsonAdd to that client's MCP configuration

A Max_mcp entry in Bob's project file looks like the following. The command, args, and env shape follows both Bob's documented stdio schema and the Max_mcp README's npx example. The environment variable names MAXIMO_HOST and MAXIMO_API_KEY come from that README.

{
  "mcpServers": {
    "tmg-maximo": {
      "command": "npx",
      "args": ["-y", "@themaximoguys/maximo-mcp"],
      "env": {
        "MAXIMO_HOST": "https://<your-dev-maximo-host>",
        "MAXIMO_API_KEY": "<read-only dev key from your secret manager>"
      },
      "alwaysAllow": [],
      "disabled": false
    }
  }
}

Two cautions specific to local stdio servers. Bob's own documentation warns that local MCP servers "run with the same permissions as Bob" and can reach your file system and environment variables, so you are trusting the package you install. Pin the version, and review its dependency tree like any other supply-chain input. And with a 175-tool server, a read-only key matters even more, because the tool list includes create, update, status change, bulk, and security group operations. The key's security group is what stops those.

IBM's native server versus Max_mcp

These are complementary, not rivals. Here is how we decide.

DimensionMAS 9.2 native MCP serverTMG Max_mcp
AvailabilityMAS 9.2 onlyPer README, MAS 9.x; check older versions on a test instance
Where it runsOpenShift pod beside ManageYour machine, a container, or a server you host
Tool sourceGenerated from Manage; you expose what you choose175 purpose-built tools, fixed set
Tool surfaceSmall by default, grows with your exposureBroad by default
Powers Maximo AssistantYesNo
Auth to the agentPublic route, apikey or JWTEnvironment-supplied API key to Maximo
ValidationManage's REST layerZod input validation, plus Manage's REST layer
OperationsIBM-supported platform componentYou operate it
LicenseIBM productProprietary, not open source
Best forA 9.2 estate that wants governed, Manage-native toolsEstates not yet on 9.2, developer workstations, broad API coverage in dev and test

The decision by estate

Your estateWhat we would do
MAS 9.2, agents for operationsNative server; curate tools; keys per use case
MAS 9.0 or 9.1Max_mcp in dev and test against a non-production instance; adopt the native server when you upgrade (our 9.0 vs 9.1 vs 9.2 comparison helps you plan)
Maximo 7.6 or MAS 8Use Max_Interfaces and Max_autoscripts as reference material for any agent; test Max_mcp on a lower environment before relying on it
Mixed estateUse the same agent configuration conventions across both and keep key naming consistent
Any estate, regulatedWhichever you choose, the controls from Part 3 apply: locked approval groups, scoped keys, and evidence outside the model

The practical point is that the governance model is the same either way. Whichever server you connect, a narrow key in a scoped security group is what keeps the agent in its lane.

🧭 Three Worked Scenarios

Abstractions are cheap. Here are three scenarios, each with a door, a credential, a prompt, a review, and a stop condition. These are our recommended experiments, not reported results. Replace our assumptions with your pilot data.

Scenario 1: Convert a legacy Java customization

ElementChoice
Door1 and 2 (repository plus maximo-java-conversion)
CredentialNone
EnvironmentA sandbox repo holding the Java class and a dev Maximo for testing
ModePlan first, then Agent with edit approved per action
Prompt"Using the maximo-java-conversion skill, convert AcmeWO.java to an automation script. Produce the script, the launch point settings, the list of message keys I must create, and a test matrix."
EvidencePlan, diff, conversion report, test matrix results from dev
Stop conditionAny difference in behavior between Java and script in a test case
RollbackKeep the Java class deployed until the script is proven; retire it as a separate change

Scenario 2: Review a folder of existing autoscripts

ElementChoice
Door2 (maximo-code-optimization), optionally with a read-only fetch
CredentialBOB_READONLY with read on MXAPIAUTOSCRIPT only, in dev
Prompt"Review these scripts against TMG_AUTOSCRIPT_STANDARDS.md and the skill's security guidance. Report findings by severity. Do not modify files."
EvidenceFindings list; a human triages and then asks for fixes in a second, separate prompt
Stop conditionAny finding the reviewer cannot reproduce by reading the code
Why two promptsSeparating "find" from "fix" gives you a review artifact before any edit

Scenario 3: Read-only operational questions over MCP

ElementChoice
Door4, read-only
CredentialBOB_READONLY on a non-production instance with masked data
Prompt"Using the Maximo tools, list the five assets with the most corrective work orders in the last 180 days, and show the query you ran."
EvidenceThe tool calls Bob made, the Maximo request log, and your own query to cross-check
Stop conditionAny numeric disagreement between Bob's answer and your own query
What to measureCalls per question, wall-clock time, Bobcoins per question, and answer accuracy

The measurement lines feed Part 5. Bobcoins per completed task is the number IBM does not publish, and these three scenarios are small enough to produce it.

⚠️ Pitfalls and Troubleshooting

SymptomLikely causeWhat to do
Download from the old build-and-deploy/asset-management path returns 404IBM restructured building-blocks on 2026-09-30Use automation/operate/asset-management/bob-skills; pin a commit
Skill panel shows maximo-script-optimizer, not maximo-code-optimizationFrontmatter name differs from folder and file nameCosmetic; search by either name
You enabled maximo-modernization-java and Bob talks about Spring BootIt is the generic code-modernization-expert skillUse maximo_java_conversion.zip for MBO conversion
Optimizer skill asks for a Maximo URL and API keyBy design: it fetches scripts from MXAPIAUTOSCRIPTSupply a read-only dev key; protect the generated .env
tools/list empty after you deploy a new script toolTool list refreshes every POLLING_FREQUENCY (default 10 minutes)Wait for the poll, or restart the MCP pod; check Manage readiness
Tool call fails with a timeoutTOOL_RESPONSE_TIMEOUT default is 10 minutes, or the underlying script is slowProfile the script; do not raise the timeout first
Pod never becomes readyMCP pod waits for Manage readinessCheck Manage health before debugging MCP
Works in curl, fails in BobTransport or header handling mismatch (streamable HTTP versus SSE)Test with MCP Inspector; check the Bob server entry type and headers
401 or 403 from the routeWrong header name, expired key, or mxe.oslc.webappurl not set for API key authRe-check the key, the header, and the system property
Agent "can't find" a Maximo APINot all Maximo APIs are toolsExpose a custom tool through an object structure or script
Agent did something you thought forbiddenKey's security group is wider than you intendedAudit the service user's groups; revoke and re-issue the key
Local Dev Mode will not authenticateSelf-signed certificate, or MAS version below 9.1.21 or 9.2.1Check the version floor and the certificate setting
Max_mcp shows write tools on a "read-only" setupThe tool list is broad; only the key limits writesUse a read-only security group; consider disabling the server's write modules if supported
Converted script behaves differently from the Java classEvent semantics, status synonyms, or non-UI save pathsExpand the test matrix; test REST, MIF, and workflow saves
Reviewer cannot tell what Bob changedNo plan or diff attachedMake Plan mode output and the git diff mandatory attachments

πŸ”Ž Open Items and Discrepancies

We verified what we could. These remain open or conflict across sources, and they are the backlog for the next pass.

  1. Bob to MAS 9.2 MCP end-to-end. No IBM or community write-up shows it in production. Treat as a sandbox experiment.
  2. Transport match. Confirm streamable HTTP from Bob works against the server's SSE responses, or whether a different client mode is needed.
  3. Per-tool schemas. IBM's overview names the AI configuration tools; the full tool schemas and descriptions come from tools/list on your server.
  4. Route URL format and path. Take it from your OpenShift route, not from our placeholder.
  5. Repository path drift. DOC16's build-and-deploy/asset-management is now automation/operate/asset-management. We updated our text; DOC16 needs a correction.
  6. Skill naming. maximo-modernization-java.zip is a generic skill; the Java-to-script converter is maximo_java_conversion.zip.
  7. Max_mcp version support. README says MAS 9.x; DOC16 says across Maximo versions. Test and document.
  8. The 69% method. Ask IBM for the task mix and measurement approach, or leave the figure out.
  9. Skill code review. We listed package contents but did not audit the converter and fetch scripts. Read them before you run them.
  10. Optimizer data path. The companion web app's use of an OpenAI key is a separate data-handling decision from Bob's.

🧭 What to Take Away

The Ten Commandments of Connecting an AI Agent to Maximo

  1. Never repeat the 69% without the words "IBM-reported internal estimate."
  2. Open the doors in order: repository, skills, Local Dev Mode, then MCP, and read-only first.
  3. Agents go through the API layer, never the database. No exceptions.
  4. One key per use case, named for the use case, owned by a service user with a small security group.
  5. The security group is the enforcement. Annotations and approval clicks are hints and gates, not walls.
  6. Keep `alwaysAllow` empty until you have watched the agent for weeks.
  7. Pin the commit for every IBM asset you depend on, because IBM moves paths.
  8. Read every skill before you run it. A skill is instructions plus code with your privileges.
  9. Convert in testable batches, and treat a conversion report as a checklist, not a certificate.
  10. Write down what you do not know, especially the transport match, the tool list, and the model.

Your next steps

This week:

  • Create BOB_READONLY in a non-production Maximo, with a security group limited to two or three object structures, and record its key in your secret manager.
  • Download both IBM skill zips from the current path, list their contents, and read the two Python tools before enabling anything.
  • Run Scenario 1 against one real Java customization in a sandbox.

This month:

  • If you are on MAS 9.2, run tools/list against the native server with curl and with MCP Inspector, then connect Bob read-only and run Scenario 3.
  • Add Max_autoscripts' standards file to your .bob/rules/ or AGENTS.md and rerun Scenario 2 to see whether the findings change.
  • Try Local Dev Mode against a test environment if you are on 9.1.21 or 9.2.1 or later.

Before the pilot:

  • Decide your task-fit list and your stop conditions in writing.
  • Capture Bobcoins per task, review hours, and defects for each scenario, so Part 5 has data to work with.

References

Continue the Series

Next: Part 5, Piloting Bob on Maximo. It turns the scenarios in this part into a measured pilot: metrics, competitors, and the open questions to close with IBM.

Back to: Part 3, Governance, Pricing, and Bobcoins | Part 2, Models, Security, and Self-Hosted | Part 1, What IBM Bob Is | Series Index

About TheMaximoGuys: We help Maximo developers and teams navigate the move to MAS 9 with practical, no-hype guidance grounded in how the platform actually behaves.

Published by TheMaximoGuys | October 2026