ontology-mcp
Login Query Agent — Ontología MCP y grafo de conocimiento
Un POC que utiliza un grafo de conocimiento OWL/SHACL/SKOS + dos servidores MCP para enrutar consultas de diagnóstico de inicio de sesión entre SQL Server y MongoDB, con escalación condicional a New Relic.
Arquitectura de un vistazo
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: OntoRamp Graph Query
Resumen de servicios
Servicio | Tipo | Quién lo inicia | Requerido para |
Apache Jena Fuseki | Proceso local | Tú (manual) | Consultas KG de ontology-mcp |
| Proceso hijo stdio | VS Code lo inicia automáticamente | Planificación del diagnóstico |
| Proceso hijo stdio | VS Code lo inicia automáticamente | Consultas a BD + validación |
SQL Server | Remoto/LocalDB | Ya en ejecución | Consultas de datos |
MongoDB | Servidor remoto | Ya en ejecución | Consultas de datos |
New Relic | Servicio en la nube | Siempre disponible | Escalación (todas las formas pasan) |
Solo Fuseki requiere un inicio manual. Ambos servidores MCP son iniciados automáticamente por VS Code.
Requisitos previos
1. Java 11+
java -version2. JAR de Apache Jena Fuseki
El JAR está excluido de git (54 MB). Descárgalo desde jena.apache.org y colócalo en:
infra/fuseki/fuseki-server.jar3. Python 3.12+
python --version4. Dependencias de Python
cd c:\Ontology
python -m pip install -r requirements.txt5. Controlador ODBC para SQL Server
Descarga ODBC Driver 17 or 18 for SQL Server de Microsoft si aún no está instalado.
6. VS Code con GitHub Copilot (modo agente)
VS Code 1.99+ con la extensión GitHub Copilot.
Inicio local paso a paso
Paso 1 — Iniciar Fuseki
cd c:\Ontology
java -jar infra\fuseki\fuseki-server.jar --config infra\fuseki\config\login-kg.ttlMantén esta terminal abierta. Verifícalo en http://localhost:3030.
Paso 2 — Cargar el grafo de conocimiento
Requerido en la primera ejecución o después de cualquier cambio de esquema/artefacto.
$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.0Paso 3 — Configurar los secretos
Copia .env.example a .env y completa tus valores:
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=prodPaso 4 — Registrar ambos servidores MCP
Crea .vscode/mcp.json en la raíz del espacio de trabajo:
{
"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"
}
}
}
}Recarga VS Code (Ctrl+Shift+P → Developer: Reload Window).
Flujo de diagnóstico completo
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)Solo se obtienen las entidades listadas en
required_entities. Los pasos ②–⑤ se omiten para categorías que no los necesitan (p. ej.account_lockedomite las consultas de partner + móvil).
Referencia de herramientas MCP
ontology-mcp — Herramientas de planificación del grafo de conocimiento (3 herramientas)
Herramienta | Paso | Entrada | Devuelve |
| 0 — primera llamada obligatoria |
|
|
| solo respaldo |
| Las 8 categorías con |
| bajo demanda |
| Mapeo completo de columna/campo desde el grafo de descriptores del KG |
get_diagnosis_planlee el registro de capacidades directamente desdelogin.yaml— no se necesita ninguna llamada a Fuseki.get_entity_descriptorconsulta el grafo de descriptores de Fuseki — requiere que Fuseki esté en ejecución.
data-mcp — Herramientas de datos en vivo (7 herramientas)
Las 7 herramientas requieren capability_id de get_diagnosis_plan. Llamarlas sin él devuelve un error estructurado.
Herramienta | Paso | Origen | Devuelve |
| 1a |
| userid, username, emailaddress, usertype, authenticationtype, islocked, isactive, isdeleted, issystemuser, mobileno |
| 1b |
| ismobilenumberverified + SQL ejecutado |
| 1c |
| Todas las filas de mapeo, recuento total, recuento activo |
| 1d | colección | 9 campos proyectados + consulta ejecutada |
| 2 | SQL + MongoDB | PASS/FAIL por forma, |
| 3a | New Relic NerdGraph | Transacción + Log para |
| 3b | New Relic NerdGraph | Transacción + Log para 3 URI de restablecimiento (dr_011) |
Categorías de diagnóstico (8)
Categoría | Se activa cuando |
| No puede iniciar sesión / autenticarse / acceder a la aplicación, fallo de SSO, credenciales rechazadas |
| Enlace de restablecimiento o correo de contraseña olvidada no recibido |
| Correo OTP no recibido durante el restablecimiento |
| SMS OTP no recibido (el móvil está verificado) |
| Cuenta desactivada / inactiva / suspendida / inhabilitada |
| Cuenta bloqueada después de varios intentos fallidos |
| Falta el mapeo de partner (BPC) o está inactivo |
| Discrepancia de campos entre SQL y MongoDB |
Formas SHACL (8, evaluadas en orden de secuencia)
# | Forma | Condición | Regla |
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 |
| No hay ninguna fila de mapeo de partner activo | dr_004 |
5 |
| Proveedor sin un BPC activo distinto de cero | dr_007 |
6 |
| No hay ninguna dirección de correo electrónico registrada válida (flujos de restablecimiento/OTP) | — |
7 |
| Discrepancia de isMobileNumberVerified entre SQL y MongoDB | dr_002 |
8 |
| Discrepancia en los campos de mapeo de partner entre SQL y MongoDB | dr_008 |
La
validation_sequencede cada categoría ejecuta solo el subconjunto relevante de estas formas. Losadvisories(p. ej.dr_012discrepancia de correo) se devuelven junto con las formas pero no afectan aall_shapes_pass.
Estructura de consulta de New Relic (2 pasos)
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}Grafo de conocimiento — Grafos con nombre
El KG almacena 6 grafos con nombre por versión + 1 metagrafo:
IRI del grafo con nombre | Contenido | Consulta por |
| Playbooks de diagnóstico — 8 categorías, entidades requeridas, secuencias de validación |
|
| Mapeos de columna/campo de entidades |
|
| Reglas de decisión (dr_001..dr_012) |
|
| Formas de nodo SHACL + restricciones |
|
| Clases y propiedades OWL | Disponible para inspección |
| Esquema de conceptos SKOS + etiquetas | Disponible para inspección |
| Puntero de versión activa | Cada consulta a Fuseki (descubrimiento de grafos) |
Fuseki se consulta en dos etapas de cada diagnóstico:
get_diagnosis_plan(Paso 0) —get_active_graphs(metagrafo) +get_capability_plan(grafo de capacidades) → el playbook de diagnóstico completovalidate_login_shapes(Paso 2) — lee el grafo shacl (formas), el grafo descriptors (mapeo de campo/tipo para la materialización) y el grafo rules (forma→regla) — el validador está impulsado por KG
Resguardos (cada uno registra una advertencia): si Fuseki no está disponible, get_diagnosis_plan lee x_capability_registry de login.yaml, y validate_login_shapes recurre al shacl_validator.py programático.
Regeneración de artefactos
Cuando cambie cualquier archivo de esquema YAML:
$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.0Estructura del proyecto
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.txtSolución de problemas
Error | Causa | Solución |
| Fuseki no está en ejecución | Inicia Fuseki (Paso 1) |
| El agente omitió | Reinicia la conversación; |
|
| Comprueba |
| Falta | Verifica que |
| Host/credenciales incorrectos en | Comprueba |
| Falta una dependencia |
|
| Codificación de la consola de Windows | Añade |
Grafos de Fuseki vacíos | Inicio de Fuseki limpio tras un reinicio | Ejecuta |
Flujo de trabajo diario
# 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 automaticallyAmpliar el esquema
Añadir una nueva entidad (nueva tabla SQL o colección de MongoDB)
Crea
ontology/schemas/login/v1.0.0/entities/new_entity.yamlAñade
- entities/new_entitya los imports delogin.yamlEjecuta generate + load + promote
Añadir o cambiar una categoría de diagnóstico
Edita
x_capability_registryenlogin.yamlAñade/actualiza la forma correspondiente en
x_shacl_rules(login.yaml) — el validador impulsado por el KG la lee desde el grafoshacl; no se necesita editar Python para las formassh_in/sh_property/sparql/cross_sourceEjecuta generate + load + promote (para que la nueva forma/regla entre en el KG)
Reinicia los servidores MCP
Añadir o cambiar una forma SHACL
Las formas se ejecutan desde el KG, no desde el código. Edita x_shacl_rules en login.yaml,
y luego regenera + recarga. kg_shacl_validator.py (el motor genérico) no necesita
cambios a menos que introduzcas un tipo de restricción completamente nuevo.
Añadir una nueva versión del esquema
Copia
ontology/schemas/login/v1.0.0/→v1.1.0/Edita los archivos de entidades en
v1.1.0/Ejecuta generate + load + promote para
v1.1.0
Ambas versiones coexisten en el KG — la reversión siempre está disponible mediante promote.py.
This server cannot be deployed
Maintenance
Related MCP Connectors
Knowledge graph for AI agents. Query concepts, walk edges, get advisories.
Knowledge graph ingestion, entity search, ontology analysis, and CoSync scoring.
LLM Orchestration Observability Agent
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to query and record SOC analyst reasoning via a knowledge graph, allowing access to institutional memory from Splunk.MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to query organizational architecture and governance constraints, returning evidence-grounded answers from documented structures.MIT
- FlicenseNot gradedqualityCmaintenanceLets AI agents query a computerized system inventory as a knowledge graph using Cypher, enabling blast radius, data lineage, regulation checks, and change impact assessments while preventing hallucinated regulatory claims.-
- FlicenseNot gradedqualityCmaintenanceEnables manufacturing traceability queries and analysis through GraphRAG, supporting semantic search, graph traversal, natural language to Cypher, defect chain retrieval, requirement traceability, and product health dashboards.-