ontology-mcp
Agente de Consulta de Inicio de Sesión — 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 escalado 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: openclaw-brain
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 de diagnóstico |
| Proceso hijo stdio | VS Code lo inicia automáticamente | Consultas de 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 | Escalado (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 o 18 para SQL Server desde 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. Verifica 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 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 (por ejemplo,account_lockedomite consultas de socio y móvil).
Referencia de Herramientas MCP
ontology-mcp — Herramientas de planificación del grafo de conocimiento (3 herramientas)
Herramienta | Paso | Entrada | Retorna |
| 0 — primera llamada obligatoria |
|
|
| solo respaldo |
| Las 8 categorías con |
| bajo demanda |
| Mapeo completo de columnas/campos desde el grafo de descriptores KG |
get_diagnosis_planlee el registro de capacidades directamente desdelogin.yaml— no se necesita 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 | Fuente | Retorna |
| 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 se puede iniciar sesión / autenticar / acceder a la aplicación, fallo de SSO, credenciales rechazadas |
| No se recibe el enlace de restablecimiento o el correo de olvido de contraseña |
| No se recibe el correo OTP durante el restablecimiento |
| No se recibe el SMS OTP (el móvil está verificado) |
| Cuenta desactivada / inactiva / suspendida / deshabilitada |
| Cuenta bloqueada después de múltiples intentos fallidos |
| Mapeo de socio (BPC) faltante / inactivo |
| Discrepancia de campos entre SQL y MongoDB |
Formas SHACL (8, evaluadas en orden de secuencia)
# | Forma | Condición | Regla |
1 |
| isLocked=1 O isActive=0 O isDeleted=1 | dr_003 |
2 |
| isSystemUser=1 | dr_005 |
3 |
| userType=Buyer Y authenticationType=SSO | dr_006 |
4 |
| Sin fila de mapeo de socio activo | dr_004 |
5 |
| Proveedor sin BPC activo distinto de cero | dr_007 |
6 |
| Sin 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 de campos de mapeo de socio entre SQL y MongoDB | dr_008 |
La
validation_sequencede cada categoría ejecuta solo el subconjunto relevante de estas formas. Losadvisories(por ejemplo,dr_012discrepancia de correo) se devuelven junto con las formas pero no afectan aall_shapes_pass.
Estructura de Consulta a 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 Nombrados
El KG almacena 6 grafos nombrados por versión + 1 grafo meta:
IRI del Grafo Nombrado | Contenido | Consultados por |
| Playbooks de diagnóstico — 8 categorías, entidades requeridas, secuencias de validación |
|
| Mapeos de columnas/campos de entidades |
|
| Reglas de decisión (dr_001..dr_012) |
|
| Formas de nodo SHACL + restricciones |
|
| Clases y propiedades OWL + propiedades | 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(grafo meta) +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 campos/tipos para materialización) y el grafo rules (forma→regla) — el validador está impulsado por KG
Respaldo (cada uno registra una advertencia): si Fuseki no está disponible, get_diagnosis_plan lee x_capability_registry desde 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; |
|
| Revisa |
|
| Verifica que |
| Host/credenciales incorrectos en | Revisa |
| Falta una dependencia |
|
| Codificación de consola de Windows | Añade |
Fuseki graphs empty | Inicio de Fuseki nuevo tras 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 automaticallyExtensión del 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 KG lo lee del 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, luego regenera y 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 entidad 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.
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