Skip to main content
Glama
jjayaprarathbones

Rathbones Reconciliation MCP PoC

Rathbones Reconciliation MCP PoC — Orbus Infinity + ServiceNow CMDB Emulator

A single deployed service exposing two MCP endpoints that emulate Orbus Infinity and ServiceNow CMDB on top of the same synthetic dataset. Built specifically to support the Current State Architecture Reconciliation Agent intern project.

⚠️ Synthetic data only. Do not load real Rathbones data into this repository. All object IDs, names, owners and attributes are invented to illustrate reconciliation patterns.


Why two MCPs?

The reconciliation agent's job is to compare two sources of truth:

Source

Models

Strength

Weakness

Orbus Infinity

Architectural lens — applications, components, relationships, capabilities, processes, HLD links

Best place for architectural relationships and design context

Naming and lifecycle data may drift

ServiceNow CMDB

Operational lens — production CIs, owners, lifecycle, dependencies

Authoritative for "what is actually deployed"

Doesn't carry rich relationship modelling

Treating each source as its own MCP server is intentional: it mirrors the production architecture (where each system would be its own Copilot Studio custom connector / MCP connection), and it lets the reconciliation agent reason about source-of-truth precedence per attribute.


Related MCP server: Constructoo MCP Server

Architecture

                           ┌─────────────────────────────────────┐
                           │       Render.com (one service)      │
                           │                                     │
   Copilot Studio          │  ┌──────────────────────────────┐   │
   Reconciliation   ──────►│  │  /orbus/mcp                  │───┼─┐
   Agent                   │  │  Orbus Infinity emulator     │   │ │
                           │  │  - list_object_types         │   │ │
                           │  │  - list_objects              │   │ │
                           │  │  - get_object                │   │ │
                           │  │  - search_objects            │   │ │
                           │  │  - get_relationships         │   │ │
                           │  │  - get_attribute_schema      │   │ │
                           │  │  - get_linked_documents      │   │ │
                           │  │  - find_servicenow_match     │   │ │
                           │  └──────────────────────────────┘   │ │
                           │                                     │ │
                           │  ┌──────────────────────────────┐   │ │
                           │  │  /servicenow/mcp             │───┼─┤
                           │  │  ServiceNow CMDB emulator    │   │ │
                           │  │  - list_classes              │   │ │
                           │  │  - query_cis                 │   │ │
                           │  │  - get_ci                    │   │ │
                           │  │  - get_ci_relationships      │   │ │
                           │  │  - get_user                  │   │ │
                           │  │  - search_business_apps      │   │ │
                           │  │  - get_class_schema          │   │ │
                           │  │  - find_orbus_match          │   │ │
                           │  └──────────────────────────────┘   │ │
                           │                                     │ │
                           │  ┌──────────────────────────────┐   │ │
                           │  │  Shared synthetic dataset    │◄──┘ │
                           │  │  (data/*.py)                 │     │
                           │  │  + reconciliation_truth.py   │     │
                           │  └──────────────────────────────┘     │
                           └─────────────────────────────────────┘

The reconciliation findings baked into the dataset

These are the 10 deliberate mismatches the agent should be able to surface. See data/reconciliation_truth.py for the full answer key.

#

Finding

Type

Orbus

ServiceNow

F1

MyRathbones Portal — clean match

perfect_match

orb-app-001

sn-ci-001

F2

ExBO vs Eximius Backoffice

name_mismatch

orb-app-002

sn-ci-002

F3

3 Orbus components vs 1 SN business app

classification_mismatch

orb-comp-003a/b/c

sn-ci-003

F4

CAMMS ERM approved, not yet in CMDB

missing_in_servicenow

orb-app-005

F5

Snowflake EDP — owner conflict

attribute_conflict

orb-app-006

sn-ci-006

F6

Citrix VDI — Live in Orbus, Retired in SN

lifecycle_drift

orb-app-007

sn-ci-007

F7

Proactis vs Proactis P2P — no ID link

ambiguous_match

orb-app-009

sn-ci-009

F8

Power BI — two SN candidates

ambiguous_name

orb-app-010

sn-ci-010a, sn-ci-010b

F9

ExBO→Snowflake feed missing in CMDB

relationship_asymmetry

orb-int-100

F10

Legacy Citrix Reporting only in SN

missing_in_orbus

sn-ci-004


Quick start

1. Push to your GitHub repo

The repo should sit on a personal account (not a Rathbones-managed account).

git init
git add .
git commit -m "Initial dual-MCP reconciliation PoC"
git remote add origin https://github.com/<your-user>/<repo-name>.git
git push -u origin main

2. Deploy on Render

  • New Web Service → connect the repo → Free plan.

  • Build command: pip install -r requirements.txt

  • Start command: python main.py

  • Render assigns a $PORT automatically; main.py reads it.

Once live you'll get a URL like https://<service>.onrender.com.

3. Wake the server (free tier sleeps after 15 min idle)

Open in a browser:

https://<service>.onrender.com/

You'll see a JSON response listing the two endpoints — server is alive.

4. Connect to Copilot Studio

In Copilot Studio → your agent → ToolsAdd a toolNew toolModel Context Protocol. Add each endpoint as a separate MCP connection:

Name

Server URL

Auth

Orbus Infinity

https://<service>.onrender.com/orbus/mcp

None

ServiceNow CMDB

https://<service>.onrender.com/servicenow/mcp

None

The agent will see 16 tools total (8 per server) and can route calls to whichever source it needs.


Project structure

rathbones-reconciliation-mcp/
├── data/
│   ├── orbus_metamodel.py         # Object types + attribute schemas
│   ├── orbus_objects.py           # ~14 synthetic Orbus objects
│   ├── orbus_relationships.py     # ~14 relationships
│   ├── snow_schemas.py            # CMDB class definitions
│   ├── snow_users.py              # 6 sys_user records
│   ├── snow_cis.py                # ~11 CIs paired with Orbus objects
│   ├── snow_rel_ci.py             # 8 cmdb_rel_ci entries
│   └── reconciliation_truth.py    # ANSWER KEY: 10 expected findings
├── tools/
│   ├── orbus_tools.py             # Pure Orbus query functions
│   ├── snow_tools.py              # Pure ServiceNow query functions
│   └── cross_lookup.py            # Bridge tool — Orbus <-> SN
├── servers/
│   ├── orbus_server.py            # FastMCP wrapper for Orbus tools
│   └── snow_server.py             # FastMCP wrapper for ServiceNow tools
├── main.py                        # Starlette app mounting both MCPs
├── requirements.txt
├── runtime.txt                    # python-3.11.0
└── README.md

Upgrade path to real data

When real OrbusInfinity and ServiceNow access is wired up, only the files in data/ need to be replaced. The tool functions, MCP wrappers and reconciliation agent never change.

  • Orbus: replace ORBUS_OBJECTS / ORBUS_RELATIONSHIPS with httpx GETs against https://rathbones-api.iserver365.com/odata/Objects and /odata/Relationships (OAuth2 implicit flow as per the OrbusInfinity HLD).

  • ServiceNow: replace SN_CIS / SN_REL_CI / SN_USERS with calls to https://rathbones.service-now.com/api/now/table/cmdb_ci_business_app, cmdb_rel_ci, sys_user (basic auth via a Rathbones service account).

  • Tool signatures stay identical. Function bodies just swap their data source. The agent calling the MCP server can't tell the difference.


Local development

python -m venv .venv
.\.venv\Scripts\Activate.ps1     # Windows PowerShell
# source .venv/bin/activate         # macOS / Linux

pip install -r requirements.txt
python main.py

Then in another shell:

curl http://localhost:8000/

Returns the endpoint list. To talk MCP, point an MCP client at http://localhost:8000/orbus/mcp or http://localhost:8000/servicenow/mcp.


Important notes

  • Synthetic data only. Do not load real Rathbones HLD, CMDB or owner data into any file in data/.

  • The MCP server is unauthenticated by design (synthetic data only). When the real-data version is built, authentication MUST be added before exposing it publicly.

  • Tenant DLP can block custom MCP server URLs in Copilot Studio. If the connection fails with "Couldn't load MCP tools", confirm with IT that Render.com URLs are allowed.

  • The reconciliation answer key in data/reconciliation_truth.py is for validating the reconciliation agent — it is not exposed via either MCP server.

F
license - not found
-
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/jjayaprarathbones/reconciliationTestMCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server