ontology-mcp
Login Query Agent — Ontology MCP & Wissensgraph
Ein POC, das einen OWL/SHACL/SKOS-Wissensgraph + zwei MCP-Server verwendet, um Login-Diagnoseabfragen über SQL Server und MongoDB zu leiten, mit bedingter New Relic-Eskalation.
Architektur auf einen Blick
User prompt (VS Code Copilot)
│
▼ LLM classifies category natively — no tool call
│
ontology-mcp ──► Fuseki KG (SPARQL)
│ get_diagnosis_plan(category)
│ returns: capability_id, required_entities,
│ validation_sequence, newrelic_tool
▼
data-mcp ──► SQL Server (UM_Users, UM_UserPartnermapping,
│ UM_UserMobileNumberVerified)
├──────► MongoDB (users collection — 9 projected fields)
├──────► SHACL Validator (shapes read from KG shacl graph, evaluated in sequence order)
└──────► New Relic (only when all_shapes_pass=true — 2-step NRQL)Related MCP server: openclaw-brain
Übersicht der Dienste
Dienst | Typ | Wer startet ihn | Erforderlich für |
Apache Jena Fuseki | Lokaler Prozess | Sie (manuell) | ontology-mcp-KG-Abfragen |
| stdio-Unterprozess | VS Code startet automatisch | Diagnoseplanung |
| stdio-Unterprozess | VS Code startet automatisch | DB-Abfragen + Validierung |
SQL Server | Remote/LocalDB | Läuft bereits | Datenabfragen |
MongoDB | Remote-Server | Läuft bereits | Datenabfragen |
New Relic | Cloud-Dienst | Immer verfügbar | Eskalation (alle Shapes bestehen) |
Nur Fuseki muss manuell gestartet werden. Beide MCP-Server werden von VS Code automatisch gestartet.
Voraussetzungen
1. Java 11+
java -version2. Apache Jena Fuseki JAR
Das JAR ist von git ausgeschlossen (54 MB). Laden Sie es von jena.apache.org herunter und platzieren Sie es unter:
infra/fuseki/fuseki-server.jar3. Python 3.12+
python --version4. Python-Abhängigkeiten
cd c:\Ontology
python -m pip install -r requirements.txt5. ODBC-Treiber für SQL Server
Laden Sie ODBC Driver 17 oder 18 für SQL Server von Microsoft herunter, falls noch nicht installiert.
6. VS Code mit GitHub Copilot (Agent-Modus)
VS Code 1.99+ mit der GitHub-Copilot-Erweiterung.
Schritt-für-Schritt-Lokaler Start
Schritt 1 – Fuseki starten
cd c:\Ontology
java -jar infra\fuseki\fuseki-server.jar --config infra\fuseki\config\login-kg.ttlLassen Sie dieses Terminal geöffnet. Überprüfen Sie unter http://localhost:3030.
Schritt 2 – Wissensgraph laden
Erforderlich beim ersten Start oder nach jeder Schema-/Artefaktänderung.
$env:PYTHONIOENCODING = "utf-8"
python scripts/generate/generate.py --schema login --version 1.0.0
python scripts/kg/load_kg.py --schema login --version 1.0.0
python scripts/kg/promote.py --schema login --version 1.0.0Schritt 3 – Geheimnisse konfigurieren
Kopieren Sie .env.example in .env und füllen Sie Ihre Werte aus:
SQL_SERVER_HOST=your-server
SQL_SERVER_DATABASE=your-database
SQL_SERVER_TRUSTED_CONNECTION=yes
SQL_SERVER_ENCRYPT=yes
SQL_SERVER_TRUST_CERT=yes
MONGODB_URI=mongodb://your-host:27017
MONGODB_DATABASE=your-database
NEW_RELIC_API_KEY=NRAK-xxxxxxxxxxxxxxxxxxxx
NEW_RELIC_ACCOUNT_ID=your-account-id
NEW_RELIC_REGION=US
APP_ENV=prodSchritt 4 – Beide MCP-Server registrieren
Erstellen Sie .vscode/mcp.json im Workspace-Root:
{
"servers": {
"ontology-mcp": {
"type": "stdio",
"command": "python",
"args": ["-m", "mcp_server.server"],
"cwd": "c:\\Ontology",
"env": {
"PYTHONPATH": "c:\\Ontology\\src",
"PYTHONIOENCODING": "utf-8"
}
},
"data-mcp": {
"type": "stdio",
"command": "python",
"args": ["-m", "mcp_server.diagnostic_server"],
"cwd": "c:\\Ontology",
"env": {
"PYTHONPATH": "c:\\Ontology\\src",
"PYTHONIOENCODING": "utf-8"
}
}
}
}Laden Sie VS Code neu (Ctrl+Shift+P → Developer: Reload Window).
Vollständiger Diagnoseablauf
User: "testgdpr1235@gep.com can't reset password"
│
│ LLM classifies: category = "password_reset" (no tool call)
│
▼
① ontology-mcp / get_diagnosis_plan(category="password_reset")
Reads x_capability_registry from login.yaml (no Fuseki needed for this step)
Returns: capability_id, required_entities, validation_sequence, newrelic_tool
│
▼ (agent extracts username from user message; asks if missing)
│
② data-mcp / query_sql_user(username, capability_id)
SELECT from UM_Users → islocked, isactive, isdeleted, usertype, emailaddress, ...
│
③ data-mcp / query_sql_mobile_verification(username, capability_id)
SELECT from UM_UserMobileNumberVerified → ismobilenumberverified
│
④ data-mcp / query_sql_partner_mappings(username, capability_id)
SELECT from UM_UserPartnermapping → bpc, partnercode, isactive, contactcode
│
⑤ data-mcp / query_mongo_user(username, capability_id)
db.users.find_one({...}, { 9 diagnostic fields }) → MongoDB document
│
⑥ data-mcp / validate_login_shapes(username, capability_id, validation_sequence)
Runs only the shapes in validation_sequence (plan-scoped)
Returns: per-shape PASS/FAIL, all_shapes_pass, advisories (e.g. dr_012)
│
┌────┴──────────────────────────┐
violations found all_shapes_pass = true
│ │
report per shape ⑦a data-mcp / query_newrelic_login_mfa(username, capability_id)
with mapped rule OR
dr_003..dr_008 ⑦b data-mcp / query_newrelic_reset_password(username, capability_id)
→ Transaction → Log per traceId (max 7 days)Nur Entitäten, die in
required_entitiesaufgeführt sind, werden abgerufen. Schritte ②–⑤ werden für Kategorien übersprungen, die sie nicht benötigen (z. B. überspringtaccount_lockedPartner- und Mobilfunkabfragen).
MCP-Tools-Referenz
ontology-mcp – Planungswerkzeuge für den Wissensgraph (3 Tools)
Tool | Schritt | Eingabe | Rückgabe |
| 0 – obligatorischer erster Aufruf |
|
|
| nur Fallback |
| Alle 8 Kategorien mit |
| auf Anfrage |
| Vollständige Spalten-/Feldzuordnung aus dem KG-Descriptors-Graph |
get_diagnosis_planliest die Capability-Registry direkt auslogin.yaml– kein Fuseki-Aufruf erforderlich.get_entity_descriptorfragt den Fuseki-Descriptors-Graph ab – erfordert laufendes Fuseki.
data-mcp – Live-Daten-Tools (7 Tools)
Alle 7 Tools erfordern capability_id von get_diagnosis_plan. Ein Aufruf ohne diese gibt einen strukturierten Fehler zurück.
Tool | Schritt | Quelle | Rückgabe |
| 1a |
| userid, username, emailaddress, usertype, authenticationtype, islocked, isactive, isdeleted, issystemuser, mobileno |
| 1b |
| ismobilenumberverified + ausgeführte SQL |
| 1c |
| Alle Zuordnungszeilen, Gesamtzahl, aktive Anzahl |
| 1d |
| 9 projizierte Felder + ausgeführte Abfrage |
| 2 | SQL + MongoDB | Pro Shape PASS/FAIL, |
| 3a | New Relic NerdGraph | Transaktion + Log für |
| 3b | New Relic NerdGraph | Transaktion + Log für 3 Reset-URIs (dr_011) |
Diagnosekategorien (8)
Kategorie | Auslöser, wenn |
| Kann sich nicht anmelden / authentifizieren / auf die App zugreifen, SSO-Fehler, Anmeldeinformationen abgelehnt |
| Reset-Link oder E-Mail zum Vergessen des Passworts nicht erhalten |
| OTP-E-Mail während des Resets nicht erhalten |
| SMS-OTP nicht erhalten (Mobilgerät ist verifiziert) |
| Konto deaktiviert / inaktiv / gesperrt / deaktiviert |
| Konto nach mehreren fehlgeschlagenen Versuchen gesperrt |
| Fehlende / inaktive Partner-(BPC)-Zuordnung |
| SQL- vs. MongoDB-Feldabweichung |
SHACL-Shapes (8, in Sequenzreihenfolge ausgewertet)
# | Shape | Bedingung | Regel |
1 |
| isLocked=1 OR isActive=0 OR isDeleted=1 | dr_003 |
2 |
| isSystemUser=1 | dr_005 |
3 |
| userType=Buyer AND authenticationType=SSO | dr_006 |
4 |
| Keine aktive Partner-Zuordnungszeile | dr_004 |
5 |
| Lieferant ohne aktiven Nicht-Null-BPC | dr_007 |
6 |
| Keine gültige registrierte E-Mail-Adresse (Reset-/OTP-Abläufe) | — |
7 |
| SQL- vs. MongoDB-isMobileNumberVerified-Abweichung | dr_002 |
8 |
| SQL- vs. MongoDB-Partner-Zuordnungsfelder-Abweichung | dr_008 |
Die
validation_sequencejeder Kategorie führt nur die relevante Teilmenge dieser Shapes aus.advisories(z. B.dr_012E-Mail-Abweichung) werden zusammen mit den Shapes zurückgegeben, beeinflussen aber nichtall_shapes_pass.
New-Relic-Abfragestruktur (2-stufig)
Step 1: Transaction table (max 7 days lookback, filtered by APP_ENV)
/Account/Login → LoginUserName, traceId, RequiresTwoFactor, TwoFactorDetails
/Account/RecoverPassword → traceId, errorMessage, RecoveryUserName, RecoveryEmail
/Account/PreResetPassword → traceId, errorMessage, PreResetUserName
/Account/ResetPassword → LoginUserName, traceId, errorMessage
Step 2: Log table (per traceId from Step 1)
SELECT * FROM Log WHERE `trace.id` = '{traceId}' SINCE {transaction_timestamp}Wissensgraph – Benannte Graphen
Der KG speichert 6 benannte Graphen pro Version + 1 Metagraph:
Benannter Graph-IRI | Inhalt | Abgefragt von |
| Diagnose-Playbooks – 8 Kategorien, erforderliche Entitäten, Validierungssequenzen |
|
| Spalten-/Feldzuordnungen von Entitäten |
|
| Entscheidungsregeln (dr_001..dr_012) |
|
| SHACL-Knoten-Shapes + Einschränkungen |
|
| OWL-Klassen + Eigenschaften | Zur Einsicht verfügbar |
| SKOS-Konzeptschema + Bezeichnungen | Zur Einsicht verfügbar |
| Zeiger auf aktive Version | Jede Fuseki-Abfrage (Graph-Erkennung) |
Fuseki wird in zwei Phasen jeder Diagnose abgefragt:
get_diagnosis_plan(Schritt 0) –get_active_graphs(Metagraph) +get_capability_plan(Capabilities-Graph) → das vollständige Diagnose-Playbookvalidate_login_shapes(Schritt 2) – liest den shacl-Graph (Shapes), den descriptors-Graph (Feld-/Typ-Zuordnung für die Materialisierung) und den rules-Graph (Shape→Regel) – der Validator ist KG-gesteuert
Fallbacks (jeder protokolliert eine Warnung): Wenn Fuseki nicht erreichbar ist, liest get_diagnosis_plan x_capability_registry aus login.yaml, und validate_login_shapes fällt auf den programmatischen shacl_validator.py zurück.
Artefakt-Regenerierung
Wenn sich eine YAML-Schemadatei ändert:
$env:PYTHONIOENCODING = "utf-8"
python scripts/generate/generate.py --schema login --version 1.0.0
python scripts/kg/load_kg.py --schema login --version 1.0.0
python scripts/kg/promote.py --schema login --version 1.0.0Projektstruktur
c:\Ontology\
├── src/
│ └── mcp_server/ # PYTHONPATH=c:\Ontology\src
│ ├── server.py # ontology-mcp entrypoint (KG planning tools)
│ ├── diagnostic_server.py # data-mcp entrypoint (DB/NR tools)
│ ├── tool_meta.py # loads config/tool_descriptions.yaml
│ ├── connectors/
│ │ ├── sql_connector.py # pyodbc — UM_Users, UM_UserPartnermapping, ...
│ │ ├── mongo_connector.py # pymongo — users collection (projected)
│ │ └── newrelic_connector.py # NerdGraph GraphQL — 2-step NRQL
│ ├── diagnostics/
│ │ ├── data_fetcher.py # orchestrates SQL + MongoDB fetch
│ │ ├── kg_shacl_validator.py # KG-driven SHACL interpreter (PRIMARY)
│ │ └── shacl_validator.py # programmatic evaluation (Fuseki-down fallback)
│ ├── tools/
│ │ ├── get_diagnosis_plan.py # ontology-mcp: reads x_capability_registry
│ │ ├── list_capabilities.py # ontology-mcp: lists all 8 categories
│ │ ├── get_descriptor.py # ontology-mcp: SPARQL descriptors graph
│ │ ├── fetch_user_data.py # data-mcp: 4 individual SQL/Mongo queries
│ │ ├── validate_shapes.py # data-mcp: shape evaluation + advisories
│ │ └── query_newrelic.py # data-mcp: NR login + reset handlers
│ ├── kg/
│ │ └── sparql_client.py # Fuseki HTTP client + graph discovery
│ └── registry/
│ └── schema_registry.py # registry.yaml + load_capability_registry()
│
├── ontology/
│ ├── schemas/
│ │ ├── registry.yaml
│ │ └── login/v1.0.0/
│ │ ├── login.yaml # root: x_capability_registry + x_shacl_rules + x_decision_rules
│ │ ├── shared/types.yaml
│ │ ├── shared/enums.yaml # AuthenticationTypeEnum, UserTypeEnum
│ │ ├── shared/subsets.yaml
│ │ └── entities/
│ │ ├── abstract_user.yaml
│ │ ├── user.yaml # SQL UM_Users
│ │ ├── partner_mapping.yaml # SQL UM_UserPartnermapping
│ │ ├── mobile_verification.yaml # SQL UM_UserMobileNumberVerified
│ │ └── user_document.yaml # MongoDB users collection
│ └── sparql/
│ ├── get_entity_descriptor.sparql
│ └── get_decision_rules.sparql
│
├── artifacts/login/v1.0.0/
│ ├── owl/login.owl.ttl
│ ├── shacl/login.shacl.ttl
│ ├── skos/login.skos.ttl
│ ├── rules/login.rules.ttl
│ ├── descriptors/login.descriptors.json
│ └── jsonld/login.context.jsonld + login.agent_template.json
│
├── scripts/
│ ├── generate/generate.py + gen_*.py + _yaml_loader.py
│ └── kg/load_kg.py + promote.py
│
├── config/
│ └── tool_descriptions.yaml # single source of truth for all MCP tool descriptions
│
├── infra/fuseki/
│ ├── fuseki-server.jar # not committed — download separately
│ ├── config/login-kg.ttl
│ └── data/ # TDB2 storage — gitignored
│
├── .github/copilot-instructions.md # Copilot workspace instructions (auto-loaded)
├── CLAUDE.md # Claude Code workspace instructions (auto-loaded)
├── .vscode/mcp.json # MCP server registration (2 servers)
├── .env / .env.example # secrets — .env never committed to git
└── requirements.txtFehlerbehebung
Fehler | Ursache | Behebung |
| Fuseki läuft nicht | Fuseki starten (Schritt 1) |
| Agent hat | Konversation neu starten; |
|
| Prüfen Sie |
|
| Stellen Sie sicher, dass |
| Falscher Host/Anmeldedaten in | Prüfen Sie |
| Fehlende Abhängigkeit |
|
| Windows-Konsolenkodierung | Fügen Sie |
Fuseki graphs empty | Frischer Fuseki-Start nach Neustart | Führen Sie |
Täglicher Workflow
# 1. Start Fuseki
java -jar infra\fuseki\fuseki-server.jar --config infra\fuseki\config\login-kg.ttl
# 2. Load KG (only after schema or artifact changes)
$env:PYTHONIOENCODING = "utf-8"
python scripts/kg/load_kg.py --schema login --version 1.0.0
python scripts/kg/promote.py --schema login --version 1.0.0
# 3. Open VS Code — both MCP servers start automaticallyErweitern des Schemas
Neue Entität hinzufügen (neue SQL-Tabelle oder MongoDB-Sammlung)
Erstellen Sie
ontology/schemas/login/v1.0.0/entities/new_entity.yamlFügen Sie
- entities/new_entityzu denlogin.yaml-Importen hinzuFühren Sie generate + load + promote aus
Diagnosekategorie hinzufügen oder ändern
Bearbeiten Sie
x_capability_registryinlogin.yamlFügen Sie die passende Shape in
x_shacl_rules(login.yaml) hinzu/aktualisieren Sie sie – der KG-gesteuerte Validator liest sie aus demshacl-Graphen; keine Python-Bearbeitung erforderlich fürsh_in/sh_property/sparql/cross_source-ShapesFühren Sie generate + load + promote aus (damit die neue Shape/Regel in den KG gelangt)
Starten Sie die MCP-Server neu
SHACL-Shape hinzufügen oder ändern
Shapes werden aus dem KG ausgeführt, nicht aus Code. Bearbeiten Sie x_shacl_rules in login.yaml und führen Sie dann regenerate + reload aus. kg_shacl_validator.py (die generische Engine) muss nicht geändert werden, es sei denn, Sie führen einen völlig neuen Einschränkungstyp Typ ein.
Neue Schema-Version hinzufügen
Kopieren Sie
ontology/schemas/login/v1.0.0/→v1.1.0/Bearbeiten Sie die Entitätsdateien in
v1.1.0/Führen Sie generate + load + promote für
v1.1.0aus
Beide Versionen koexistieren im KG – ein Rollback ist jederzeit über promote.py möglich.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
No tool schema history has been recorded yet.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
Official Microsoft MCP Server to query Microsoft Entra data using natural language
Token-free MCP server for structured RevoGrid Core, Pro, and Enterprise knowledge retrieval.
An MCP server that provides an API to LLMs to manage their JumpCloud resources.
Related MCP Servers
- FlicenseCqualityDmaintenanceMCP server allowing AI agents to query New Relic for debugging incidents.2-
- AlicenseAqualityBmaintenanceAn MCP server that ingests semiconductor PDFs into a Neo4j knowledge graph, enabling AI agents to query domain knowledge, verify claims against source text, and record design reasoning.35MIT
- FlicenseNot gradedqualityCmaintenanceAn autonomous MCP server that enables LLMs to intelligently query and analyze MongoDB databases by reverse-engineering schemas, proving relationships, and enforcing security safeguards like PII masking and query limits.-
- AlicenseNot gradedqualityBmaintenanceAn MCP server that provides SQL generation, validation, transpilation, and schema introspection across 10 SQL dialects, using a property graph schema and phase-locked reasoning to convert natural language to accurate SQL.2MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/JiteAgar-Code/ontology-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server