← All work

esm-devkit · Sep – Oct 2026

esm-devkit: an MCP server for a 20-year-old platform

Tooling that lets a coding agent do the work of a Matrix42 ESM platform developer: create and edit pages, widgets, navigation, data queries, workflows, localisation and cards on a live tenant, instead of clicking through the Solution Builder or hand-writing XML.

Role
Sole author
Period
Sep – Oct 2026
Stack
TypeScriptNode@modelcontextprotocol/sdkzodcommander
MCP tools
56
MCP tools
knowledge entries
359
knowledge entries
tool calls
7,355
tool calls
live changes, no incident
231
live changes, no incident

ESM screens are JSON descriptors stored in a database and rendered by an AngularJS shell. There is no usable OpenAPI spec: the endpoint returns a bare GUID. Writes land in one of three layers depending on two flags, and the third layer answers 200 while making the change visible only to its author. A configuration session can be deleted silently by starting another. Schema writes take a global lock. An agent let loose on this would do damage without ever seeing an error.

One write path

  • Exactly one tool writes: esm_apply_plan. Everything else plans. A plan is previewed, applied, read back and journaled; every apply has a rollback and an undo, and rollback never deletes objects that existed before.
  • Reads cover apps, navigation, views, data queries, schema, workflows, runs, adaptive cards and audiences, with --json output shaped for an agent.
  • A knowledge base of 359 entries records the platform's silent failures and is attached to the plan that would trip over them; about 860 oracle checks verify assumptions against a live tenant before a write.
  • An api-map generated from the backend source lists 1,209 routes across 170 controllers and marks the 38 that are contractual.
  • The layer is never inferred from flags; the tool states it and checks both directions.

esm-devkit MCP tools (a selection of the 56)

  • esm_whoami
  • esm_apps
  • esm_nav
  • esm_read
  • esm_schema
  • esm_query_data
  • esm_data_sources
  • esm_dataquery_columns
  • esm_workflows
  • esm_workflow_show
  • esm_workflow_catalog
  • esm_workflow_compile
  • esm_workflow_runs
  • esm_adaptive_cards
  • esm_knowledge
  • esm_api_search
  • esm_api_show
  • esm_render_check
  • esm_plan_screen
  • esm_plan_widget
  • esm_plan_nav
  • esm_plan_dashboard
  • esm_plan_landing_page
  • esm_plan_wizard
  • esm_plan_action
  • esm_plan_ai_function
  • esm_plan_prompt_template
  • esm_plan_workflow
  • esm_plan_workflow_release
  • esm_plan_localize
  • esm_plan_audience
  • esm_plan_record_update
  • esm_plan_preview
  • esm_apply_plan
  • esm_undo
  • esm_export_fragments
  • esm_export_workflow

Only esm_apply_plan writes. Everything else reads, plans or previews.

What it built

Every live change in the Device Insights app, the self-service portal cards, the Neo adoption flows and the keynote demo tenants went through it: 7,355 calls, 231 live applies on test tenants, no incident, a journal for every one. The same package carries the test rigs, the demo reset scripts and the keynote-recording pipeline, and a Claude skill that teaches an agent the workflow. It is the piece I would point to first for what it means to make a legacy platform agent-ready.

Built through the devkit: the Insights app's pages, actions, flows and cards.
Built through the devkit: the activation banner and its events.