Custom MCP server and knowledge graph development: Your assistants know nothing about your systems. Teach them once.
Your engineers have Copilot, Claude or ChatGPT open all day, and none of them can tell anyone which setting a service reads, which team owns an interface, or what breaks if a value changes. So people paste fragments into the chat and get confident answers built on half the picture. We build a knowledge graph from your own source, publish it through an MCP server every assistant can use, and run every call as the person who asked.
▸ "What breaks if we change max_retries in order-service?"
✓ identity · token issued for this server
✓ graph.impact · as of release 7.2
✓ callers · 3
✓ configs · 2
✓ tests · 14 read it, 0 assert the limit
✓ citations · file, line, commit on every fact
◆ change request · waiting for a person
→ answered in the assistant you already use
Sound familiar
The question your team asked this morning.
It crosses three systems, so nobody can answer it alone. With your graph, the same question gets one answer, in the assistant your people already use, with every source attached.
Today
With your graph
Software teams
Is the fix for Northwind’s failed payments shipping this week?
Yes. Northwind’s escalation ESC-881 is linked to PAY-2231, and pull request #4120 closes it 123. It is merged into payments-svc and goes out in Thursday’s release. Northwind’s renewal is open for FY27, so their account team will want to know 4.
- ZendeskESC-881escalation from Northwind · opened 4 Nov
- JiraPAY-2231retry limit on failed payments
- GitHubpayments-svc #4120merged 6 Nov · ships Thursday
- SalesforceNorthwind · Renewal FY27open · closes Q1
- Dana Northwind escalated again about failed payments. Is the retry fix going out this week?
- Sam Not sure which ticket that is. Priya wrote the retry code, maybe ask her?
- Priya I moved teams in the spring. Try PAY-2231? No idea if it’s merged.
- Dana PAY-2231 doesn’t mention Northwind. Does anyone know who owns the Zendesk side?
4 messages · 3 people · 5½ hours · still open
Banks & insurers
Which systems hold customer account numbers, and who can read them?
Three places: LOANS.CUSTOMER, CRM.EXPORT, and the Account_No__c field in Salesforce, which feeds CRM.EXPORT every night 12. loan-ops-read can query LOANS.CUSTOMER, certified under CTL-118 in October 34. fin-analysts can query CRM.EXPORT, and no control covers that group yet 5.
- SnowflakeLOANS.CUSTOMERcolumn account_no
- SalesforceClient · Account_No__cexported nightly to CRM.EXPORT
- Entra IDloan-ops-read34 members
- ServiceNowCTL-118access certification · passed 2 Oct
- Entra IDfin-analysts9 members · no certifying control
- Morgan Audit wants every system that holds customer account numbers, and who can read them. By Friday.
- Alex The loans warehouse for sure. Maybe the CRM export too? The data catalogue is from last year.
- Jo Access is in Entra, but the groups don’t say which tables they cover.
- Morgan So we are building the spreadsheet again.
4 messages · 3 people · 5½ hours · spreadsheet started
Health systems
Which systems hold PHI, and can Fabrikam’s support staff reach them?
Scheduling holds PHI: it writes APPOINTMENTS and reads ENCOUNTERS 12. Fabrikam’s support staff are in vendor-support, which can reach Scheduling today 34. Nothing gives that group ENCOUNTERS directly.
- ServiceNowSchedulingapplication · holds PHI
- SnowflakeAPPOINTMENTS, ENCOUNTERStables it writes and reads
- Entra IDvendor-support12 members · can reach Scheduling
- ServiceNowFabrikamvendor record · support contract
- Rae Fabrikam wants remote access for their support team. Which of our systems hold PHI that they could reach?
- Chris Scheduling for sure. The CMDB should list the rest, but nobody has updated the PHI flags in a while.
- Lee Their group is already in Entra, I think? Not sure what it is scoped to.
- Rae I’ll set up a meeting.
4 messages · 3 people · 5½ hours · meeting booked
Revenue & data teams
Why does the board pack show Net revenue down 3% when finance says it is flat?
The definition changed. Net revenue in the board pack comes from net_revenue.sql 12, and pull request #212 started subtracting FIN.CREDITS on 3 October 3. Finance’s figure still uses invoices only, so the 3% gap is the credit notes 4.
- Power BIBoard pack Q3 · Net revenuemeasure on page 2
- GitHubnet_revenue.sqlsemantic model source
- GitHub#212merged 3 Oct · subtracts credits
- SnowflakeFIN.CREDITSQ3 credit notes
- Maya The board pack says Net revenue is down 3%, but finance says it is flat. Which one is right?
- Theo Different definitions, probably. The Power BI measure changed at some point.
- Sana I think someone changed the credit-note logic in the SQL? Not sure when.
- Maya Can we get on a call before the board meeting?
4 messages · 3 people · 5½ hours · call booked
Your graph
Your systems, answering your questions.
Pick who you are. The graph assembles from the systems a team like yours runs, and answers in the assistant your people already use, under each person's own sign-in.
Blue lines join records across systems. No single system holds them today.
Software teams
- Jira EPIC
Checkout v2TICKETPAY-2231 - GitHub PULL REQUEST
#4120SERVICEpayments-svc - Confluence RUNBOOK
Failover guidePAGEAPI limits - Zendesk ESCALATION
ESC-881ORGANIZATIONNorthwind - Salesforce ACCOUNT
NorthwindOPPORTUNITYRenewal FY27
- contains
- merged into
- from
- for
- linked to
- closes
- documents
- documents
- same customer
Is the fix for Northwind’s failed payments shipping this week?
Yes. Northwind’s escalation ESC-881 is linked to PAY-2231, and pull request #4120 closes it 123. It is merged into payments-svc and goes out in Thursday’s release. Northwind’s renewal is open for FY27, so their account team will want to know 4.
- ZendeskESC-881escalation from Northwind · opened 4 Nov
- JiraPAY-2231retry limit on failed payments
- GitHubpayments-svc #4120merged 6 Nov · ships Thursday
- SalesforceNorthwind · Renewal FY27open · closes Q1
Who owns payments-svc, and is its failover runbook current?
team-payments owns payments-svc 1. The failover runbook was last edited before pull request #4120 changed the retry limit, so it still describes the old behaviour 23.
- GitHubCODEOWNERSpayments-svc → team-payments
- ConfluenceFailover guidelast edited 21 Oct
- GitHubpayments-svc #4120merged 6 Nov
What is still open in Checkout v2?
Three of its 14 tickets are open 1. PAY-2231 already has a merged pull request and closes with Thursday’s release 2. The other two have no code yet.
- JiraCheckout v214 tickets · 11 closed
- GitHubpayments-svc #4120closes PAY-2231
Banks & insurers
- SharePoint POLICY
Retention 4.2PROCEDUREAccess review - ServiceNow CONTROL
CTL-118CHANGECHG-30412 - Salesforce OBJECT
ClientFIELDAccount_No__c - Snowflake TABLE
LOANS.CUSTOMERTABLECRM.EXPORT - Entra ID GROUP
loan-ops-readGROUPfin-analysts
- covers
- tests
- certifies
- can read
- can read
- changed
- exported to
- on
Which systems hold customer account numbers, and who can read them?
Three places: LOANS.CUSTOMER, CRM.EXPORT, and the Account_No__c field in Salesforce, which feeds CRM.EXPORT every night 12. loan-ops-read can query LOANS.CUSTOMER, certified under CTL-118 in October 34. fin-analysts can query CRM.EXPORT, and no control covers that group yet 5.
- SnowflakeLOANS.CUSTOMERcolumn account_no
- SalesforceClient · Account_No__cexported nightly to CRM.EXPORT
- Entra IDloan-ops-read34 members
- ServiceNowCTL-118access certification · passed 2 Oct
- Entra IDfin-analysts9 members · no certifying control
Which controls cover retention policy 4.2, and when were they last tested?
CTL-118 covers it 12. Its last test was the quarterly access review on 2 October, and it passed 3.
- SharePointRetention policy 4.2records and access
- ServiceNowCTL-118control · owner: data governance
- SharePointAccess review procedurerun quarterly · last 2 Oct
What changed in LOANS.CUSTOMER this quarter, and who approved it?
One change: CHG-30412 added a column to LOANS.CUSTOMER 12. The change advisory board approved it on 14 October.
- ServiceNowCHG-30412standard change · approved 14 Oct
- SnowflakeLOANS.CUSTOMERcolumn added: risk_band
Health systems
- SharePoint POLICY
Remote accessSOPVendor intake - ServiceNow APPLICATION
SchedulingVENDORFabrikam - Entra ID GROUP
vendor-supportGROUPsched-admins - Workday TRAINING
Privacy 2026DEPARTMENTRadiology - Snowflake TABLE
APPOINTMENTSTABLEENCOUNTERS
- writes
- reads
- can reach
- administers
- staff in
- applies to
- requires
- requires
- assigned to
Which systems hold PHI, and can Fabrikam’s support staff reach them?
Scheduling holds PHI: it writes APPOINTMENTS and reads ENCOUNTERS 12. Fabrikam’s support staff are in vendor-support, which can reach Scheduling today 34. Nothing gives that group ENCOUNTERS directly.
- ServiceNowSchedulingapplication · holds PHI
- SnowflakeAPPOINTMENTS, ENCOUNTERStables it writes and reads
- Entra IDvendor-support12 members · can reach Scheduling
- ServiceNowFabrikamvendor record · support contract
What does Fabrikam have to sign before it gets access?
The vendor intake SOP applies to Fabrikam, and it requires sign-off under section 3.1 of the remote access policy 12. Intake is open in ServiceNow, and the policy sign-off is not on file yet 3.
- SharePointVendor intake SOPnew vendors with system access
- SharePointRemote access policysection 3.1 · vendor sign-off
- ServiceNowFabrikamintake task open
Which departments still owe the 2026 privacy training?
Radiology, with 6 people outstanding. It is the only department past the due date 1. The remote access policy requires the training before anyone gets vendor-facing access 2.
- WorkdayPrivacy 2026all staff · due 31 Oct
- SharePointRemote access policysection 3.4 · training required
Revenue & data teams
- HubSpot CAMPAIGN
Q3 webinarLISTAttendees - Salesforce ACCOUNT
NorthwindOPPORTUNITYRenewal FY27 - Power BI REPORT
Board pack Q3MEASURENet revenue - Snowflake TABLE
FIN.INVOICESTABLEFIN.CREDITS - GitHub MODEL
net_revenue.sqlPULL REQUEST#212
- registered
- includes
- for
- billed in
- credited in
- shows
- defined in
- reads
- subtracts
- changed
Why does the board pack show Net revenue down 3% when finance says it is flat?
The definition changed. Net revenue in the board pack comes from net_revenue.sql 12, and pull request #212 started subtracting FIN.CREDITS on 3 October 3. Finance’s figure still uses invoices only, so the 3% gap is the credit notes 4.
- Power BIBoard pack Q3 · Net revenuemeasure on page 2
- GitHubnet_revenue.sqlsemantic model source
- GitHub#212merged 3 Oct · subtracts credits
- SnowflakeFIN.CREDITSQ3 credit notes
Which Q3 webinar attendees are now in open deals?
Two attendees work at Northwind, and both are contacts on the open Renewal FY27 opportunity 12.
- HubSpotQ3 webinar · Attendees2 from Northwind
- SalesforceNorthwind · Renewal FY27open · 2 contacts attended
How much has Northwind been billed this year, net of credits?
$412,000 across 9 invoices, less one $18,000 credit note, so $394,000 net 123.
- SalesforceNorthwindaccount · billing ID NW-0042
- SnowflakeFIN.INVOICES9 invoices in 2026
- SnowflakeFIN.CREDITS1 credit note · August
Why these projects stall
A wrapper is not a server, and a shared key is not access control.
The fast way to give an assistant your systems is to wrap every API endpoint as a tool and hand the server a service account. It demos well. In production the model faces a hundred thin tools to choose between, spends its context reading their descriptions, and calls them under an identity that can see more than the person asking. When the answer is wrong, nothing says where it came from.
Security reviews stop these projects for good reasons. Whatever a tool returns lands in the model's context, where an instruction hidden in a ticket field looks no different from one the user typed, and it can steer the next call. A token forwarded from one system to the next erases who did what. The NSA's 2026 guidance on the protocol names both risks, and the protocol's own specification forbids passing tokens through.
None of that is a reason not to do it. It is the specification of what doing it properly means, and it is the part we build first.
What we build
Four things, each one a reviewer can check.
We start with one graph and one server, read-only, and grow from there. That start is the First Graph: four weeks, $35,000 fixed, credited in full to the build if you continue. All four run in your cloud account, from infrastructure as code, behind your identity provider.
01
Knowledge graphs built from source
Parsers read your code, configuration, interface definitions, requirements and tests, and every fact they record points at the file, line and commit it was read from. No model decides what is true: rerun the extraction on the same commit and you get an identical graph. Earlier versions are kept, so a question can be answered for the release it is about.
02
MCP servers over the systems you already run
A handful of tools shaped around the questions people actually ask, not one per endpoint. Typed inputs, a tool contract pinned in CI so it cannot drift unnoticed, long jobs run as tasks the assistant can check on, and one audit line for every call. The same server works in every assistant your people use.
03
Several servers, one person, no deputy
When an answer needs two systems, the assistant asks each one with the person's own sign-in. Servers never call each other and never hold anyone else's credentials. What one server's answer brings to another is checked against that server's own index before it is used, and a conflict is reported rather than quietly resolved.
04
Review and migration of what you already have
A security review of an existing MCP deployment against the 2026-07-28 specification and its security best practices, and a plan to move it: off the deprecated transport, from sessions to explicit handles, and from dynamic client registration to client metadata documents.
What an MCP server is1
Server, usable from every MCP-compatible assistant
3
Coordinates on every fact: file, line, commit
0
Shared service keys: every call runs as a person
0
Writes without a person's approval
Walkthrough
Watch one question become a cited answer.
“What breaks if we change max_retries in order-service?” Six steps from that question, typed into the assistant an engineer already uses, to an answer that cites its evidence and a change that waits for a person.
-
01 / 06
Your source becomes a graph, by code.
Parsers read the repositories, configurations, interface definitions and specifications that go into your build. Every fact they record points at the file, line and commit it was read from. No model decides what is true: run it again on the same commit and you get the same graph.
orders/retry.pyreads max_retries · 3 callersconfig/prod.yamlsets max_retries = 5tests/14 tests read it
model calls · 0a91c3e7 -
02 / 06
An engineer asks, in the assistant they already use.
Copilot, Claude or ChatGPT turns the question into a typed tool call to your MCP server. The server checks the token on this very request: issued by your identity provider, for this server, for this person. It is never passed on to anything else.
tool graph.impact args { "setting": "max_retries", "service": "order-service" } caller the engineer who asked token audience = this server ✓ -
03 / 06
The server asks the graph, not the model.
The lookup is a graph query the server runs itself: who reads this setting, which configurations set it, which tests touch it, as of the release the question is about. Questions that cross several hops are exactly where a graph beats search.
callersretry.py · worker.py · api.pyconfigsprod.yaml · staging.yamltests14 read it · 0 assert the limit
-
04 / 06
The answer comes back with its evidence.
The assistant receives facts, each with the file, line and commit it came from, and writes its answer from those alone. Anyone can check a claim in seconds, and an answer that cites something the graph never returned is rejected rather than shown.
retry.py:42reads max_retriesprod.yaml:18sets it to 5tests/no test asserts the limit
every fact citeda91c3e7 -
05 / 06
A change waits at the gate.
The engineer asks for a test that covers the limit. The server drafts the change request and stops. A reviewer sees exactly what will be filed, and the approval is pinned to that version: edit one field and it has to be approved again.
title Add a test asserting max_retries system your change tracker status awaiting approval · v1 -
06 / 06
Approved, filed, and on the record.
Once a person approves, the change is filed, and every call along the way has left one audit line: who asked, which tool ran, who approved. The audit log names people, never a machine account.
09:14graph.impact · engineer09:15change.draft · engineer09:21change.file · approved by reviewer
shared service keys · 0unreviewed writes · 0
Anatomy of a call
Reads run on their own. Writes stop at the gate.
Every call passes the same checkpoints in the same order, whichever assistant sent it. The model chooses which tool to call; it never decides who is calling, what they may see, or whether a record changes.
- any MCP client
-
1 · ASSISTANT Copilot, Claude, ChatGPT The model picks a tool and its arguments. That is all it decides.
-
2 · IDENTITY Token checked on every request Issued by your IdP, for this server, for this person. Never passed on.
-
3 · TOOL CONTRACT A few typed tools, pinned in CI What may be called is fixed by policy before the session starts.
-
every call
4 · AUDIT LOG One line: the person, the tool, the approver A source that is down is recorded too, and the answer says what it could not consult.
Governed by default
A new door into your systems gets the same lock as the others.
The specification standardises the conversation between an assistant and a server and deliberately says little about policy. These are the controls we put into every server we build.
Your identity provider decides who gets in
Each server is an OAuth resource server that publishes its protected-resource metadata, checks that every token was issued for it, and accepts enterprise-managed authorization, so your IdP decides who reaches which server by group and role.
Least privilege, raised one step at a time
A session starts with read-only scopes. A privileged tool challenges for the scope it needs the first time it is used, and the elevation is logged with the request that caused it.
Nothing changes without a person
A tool that changes a record first shows the person the change it intends to make. Approval is pinned to that version of the change: alter one field and the approval no longer applies, and a replayed approval is refused.
How the write gate worksEvery answer cites its evidence
Each fact resolves to the file, line and commit, or the record and version, it was drawn from, and a reviewer checks it in seconds instead of re-deriving it.
Read the provenance teardownCaller text is data, never instructions
What the model is allowed to call is fixed by policy before the session starts, so nothing it reads in a document or a tool result can add to that list. Tool descriptions are checked for invisible characters before release, because an instruction a reviewer cannot see is still one the model will follow.
How tool abuse is containedOne failure stays one failure
Heavy work is isolated per request and rate-limited per person, so one runaway job cannot starve everyone else. When a source is unavailable, the answer is still returned, marked with the source it could not consult, rather than padded with a guess.
Where a graph earns its keep
A graph answers relationships. It is not better at everything.
Graph retrieval wins on questions that cross several hops: who depends on this, what breaks if it changes, which requirement no test reaches. For a single-fact lookup, plain search is as good and cheaper; a controlled 2025 comparison found the two complementary rather than one ahead of the other. We use each where it wins, and every answer says which one produced each fact.
Engineering graph
Components, interfaces, settings and faults, and how a change travels through them.
Traceability graph
Requirements, code, tests and changes, linked on the artifacts themselves so the link cannot quietly go stale.
Business graph
Entities, metrics and lineage, built on the semantic layer you already maintain.
AI-ready dataConfiguration graph
Which product variant carries which options and which software, release by release.
Before you hire anyone
When we will tell you not to build one.
One person, one machine
Someone automating their own work locally is better served by a command-line tool or a packaged skill. Both are lighter, and both cost the model less context.
Your platform already ships one
Databricks and Snowflake publish managed MCP servers for the data they hold. Use them, and spend the budget on the systems nobody has connected yet.
A thin wrapper is all you need
If every tool would map to one endpoint and every question is a single lookup, you do not need a graph or us. We would rather say so in the first call than in the third month.
Asked in the first meeting.
Already have an MCP deployment stalled in review? The Security Review Memo answers it in five business days, without access to your data.
Any client that speaks the Model Context Protocol. VS Code with Copilot, Claude, ChatGPT business plans, Gemini Enterprise and the command-line coding agents all connect to remote MCP servers. Support for individual features still varies by client, so we test against the assistants your people actually use.
The graph holds facts with pointers back to their source, and it lives in your account. The source of truth stays where it is. A fact is the name of a thing, how it relates to other things, and the file, line and commit it was read from, so it can always be checked against the original.
You do. The graph and the servers deploy into your own cloud account from infrastructure as code, behind your identity provider, and you receive the full source with its history and tests. There is no licence and no per-seat fee.
The one your platform team is willing to run. The model of the graph matters more than the engine, and it moves between engines. We resell nothing, so the recommendation follows what you already operate and support.
Yes, on a twelve-month clock rather than overnight. The protocol became stateless, the older server-sent-events transport is deprecated with a year-long window, and client metadata documents replace dynamic client registration. Existing servers keep working during the window, so the migration is planned work, not an emergency.
Not on its own authority. A change passes through the write gate, where a person reviews the exact edit and approves that version of it. We start read-only and introduce write tools one at a time, after the read tools have shown they can be trusted.
Bring the system nobody can explain.
The one whose behaviour lives in three repositories, two spreadsheets and one person's memory. That is where a knowledge graph pays for itself first, and a four-week First Graph is the fastest way to find out whether this is worth doing.