ontology-mcp
Login Query Agent — Ontology MCP & Knowledge Graph
POC, который использует OWL/SHACL/SKOS Knowledge Graph + два MCP-сервера для маршрутизации запросов диагностики входа через SQL Server и MongoDB, с условной эскалацией в New Relic.
Архитектура в двух словах
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
Обзор сервисов
Сервис | Тип | Кто запускает | Требуется для |
Apache Jena Fuseki | Локальный процесс | Вы (вручную) | Запросы к KG через ontology-mcp |
| Дочерний процесс stdio | VS Code запускает автоматически | Планирование диагностики |
| Дочерний процесс stdio | VS Code запускает автоматически | Запросы к БД + валидация |
SQL Server | Удалённый/LocalDB | Уже запущен | Запросы к данным |
MongoDB | Удалённый сервер | Уже запущен | Запросы к данным |
New Relic | Облачный сервис | Всегда доступен | Эскалация (все формы проходят) |
Только Fuseki требует ручного запуска. Оба MCP-сервера запускаются автоматически VS Code.
Предварительные требования
1. Java 11+
java -version2. JAR-файл Apache Jena Fuseki
JAR-файл исключён из git (54 МБ). Скачайте с jena.apache.org и поместите в:
infra/fuseki/fuseki-server.jar3. Python 3.12+
python --version4. Зависимости Python
cd c:\Ontology
python -m pip install -r requirements.txt5. Драйвер ODBC для SQL Server
Скачайте ODBC Driver 17 или 18 for SQL Server от Microsoft, если он ещё не установлен.
6. VS Code с GitHub Copilot (режим Agent)
VS Code 1.99+ с расширением GitHub Copilot.
Пошаговый локальный запуск
Шаг 1 — Запуск Fuseki
cd c:\Ontology
java -jar infra\fuseki\fuseki-server.jar --config infra\fuseki\config\login-kg.ttlДержите этот терминал открытым. Проверьте на http://localhost:3030.
Шаг 2 — Загрузка графа знаний
Требуется при первом запуске или после любого изменения схемы/артефактов.
$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.0Шаг 3 — Настройка секретов
Скопируйте .env.example в .env и заполните свои значения:
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=prodШаг 4 — Регистрация обоих MCP-серверов
Создайте .vscode/mcp.json в корне рабочей области:
{
"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"
}
}
}
}Перезагрузите VS Code (Ctrl+Shift+P → Developer: Reload Window).
Полный поток диагностики
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)Извлекаются только сущности, перечисленные в
required_entities. Шаги ②–⑤ пропускаются для категорий, которым они не нужны (например,account_lockedпропускает запросы партнёра и мобильного).
Справочник инструментов MCP
ontology-mcp — инструменты планирования графа знаний (3 инструмента)
Инструмент | Шаг | Входные данные | Возвращает |
| 0 — обязательный первый вызов |
|
|
| только запасной |
| Все 8 категорий с |
| по запросу |
| Полное сопоставление колонок/полей из графа дескрипторов KG |
get_diagnosis_planчитает реестр возможностей напрямую изlogin.yaml— вызов Fuseki не требуется.get_entity_descriptorзапрашивает граф дескрипторов Fuseki — требуется запущенный Fuseki.
data-mcp — инструменты живых данных (7 инструментов)
Все 7 инструментов требуют capability_id из get_diagnosis_plan. Вызов без него возвращает структурированную ошибку.
Инструмент | Шаг | Источник | Возвращает |
| 1a |
| userid, username, emailaddress, usertype, authenticationtype, islocked, isactive, isdeleted, issystemuser, mobileno |
| 1b |
| ismobilenumberverified + выполненный SQL |
| 1c |
| Все строки сопоставления, общее количество, количество активных |
| 1d | коллекция | 9 спроецированных полей + выполненный запрос |
| 2 | SQL + MongoDB | PASS/FAIL по каждой форме, |
| 3a | New Relic NerdGraph | Транзакция + журнал для |
| 3b | New Relic NerdGraph | Транзакция + журнал для 3 URI сброса (dr_011) |
Категории диагностики (8)
Категория | Срабатывает, когда |
| Невозможно войти / аутентифицироваться / получить доступ к приложению, сбой SSO, отклонены учётные данные |
| Ссылка сброса или письмо «забыли пароль» не получены |
| OTP-письмо не получено во время сброса |
| SMS OTP не получено (мобильный подтверждён) |
| Учётная запись деактивирована / неактивна / приостановлена / отключена |
| Учётная запись заблокирована после нескольких неудачных попыток |
| Отсутствует / неактивно сопоставление партнёра (BPC) |
| Несоответствие полей между SQL и MongoDB |
SHACL-формы (8, оцениваются в порядке последовательности)
# | Форма | Условие | Правило |
1 |
| isLocked=1 ИЛИ isActive=0 ИЛИ isDeleted=1 | dr_003 |
2 |
| isSystemUser=1 | dr_005 |
3 |
| userType=Buyer И authenticationType=SSO | dr_006 |
4 |
| Нет активной строки сопоставления партнёра | dr_004 |
5 |
| Поставщик без активного ненулевого BPC | dr_007 |
6 |
| Нет действительного зарегистрированного адреса эл. почты (потоки сброса/OTP) | — |
7 |
| Несоответствие isMobileNumberVerified между SQL и MongoDB | dr_002 |
8 |
| Несоответствие полей сопоставления партнёра между SQL и MongoDB | dr_008 |
validation_sequenceкаждой категории запускает только соответствующий поднабор этих форм.advisories(например,dr_012несоответствие эл. почты) возвращаются вместе с формами, но не влияют наall_shapes_pass.
Структура запросов New Relic (2 шага)
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}Граф знаний — именованные графы
KG хранит 6 именованных графов на версию + 1 мета-граф:
IRI именованного графа | Содержимое | Запрашивается через |
| Плейбуки диагностики — 8 категорий, требуемые сущности, последовательности валидации |
|
| Сопоставления колонок/полей сущностей |
|
| Правила принятия решений (dr_001..dr_012) |
|
| SHACL-формы узлов + ограничения |
|
| Классы и свойства OWL | Доступно для проверки |
| Схема концептов SKOS + метки | Доступно для проверки |
| Указатель активной версии | Каждый запрос Fuseki (обнаружение графов) |
Fuseki запрашивается на двух этапах каждой диагностики:
get_diagnosis_plan(Шаг 0) —get_active_graphs(мета-граф) +get_capability_plan(граф возможностей) → полный плейбук диагностикиvalidate_login_shapes(Шаг 2) — читает граф shacl (формы), граф descriptors (сопоставление полей/типов для материализации) и граф rules (форма→правило) — валидатор управляется KG
Запасные варианты (каждый логирует предупреждение): если Fuseki недоступен, get_diagnosis_plan читает x_capability_registry из login.yaml, а validate_login_shapes переключается на программный shacl_validator.py.
Регенерация артефактов
При изменении любого 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.0Структура проекта
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.txtУстранение неполадок
Ошибка | Причина | Исправление |
| Fuseki не запущен | Запустите Fuseki (Шаг 1) |
| Агент пропустил | Перезапустите разговор; |
| в | Проверьте |
| в | Убедитесь, что в |
| Неверный хост/учётные данные в | Проверьте |
| Отсутствует зависимость |
|
| Кодировка консоли Windows | Добавьте |
Fuseki graphs empty | Свежий запуск Fuseki после перезапуска | Запустите |
Ежедневный рабочий процесс
# 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 automaticallyРасширение схемы
Добавление новой сущности (новая таблица SQL или коллекция MongoDB)
Создайте
ontology/schemas/login/v1.0.0/entities/new_entity.yamlДобавьте
- entities/new_entityв импортыlogin.yamlЗапустите generate + load + promote
Добавление или изменение диагностической категории
Отредактируйте
x_capability_registryвlogin.yamlДобавьте/обновите соответствующую форму в
x_shacl_rules(login.yaml) — валидатор, управляемый KG, читает её из графаshacl; не требуется правка Python для формsh_in/sh_property/sparql/cross_sourceЗапустите generate + load + promote (чтобы новая форма/правило попали в KG)
Перезапустите MCP-серверы
Добавление или изменение SHACL-формы
Формы выполняются из KG, а не из кода. Отредактируйте x_shacl_rules в login.yaml, затем перегенерируйте и перезагрузите. kg_shacl_validator.py (универсальный движок) не требует изменений, если только вы не вводите совершенно новый тип ограничения.
Добавление новой версии схемы
Скопируйте
ontology/schemas/login/v1.0.0/→v1.1.0/Отредактируйте файлы сущностей в
v1.1.0/Запустите generate + load + promote для
v1.1.0
Обе версии сосуществуют в KG — откат всегда доступен через 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