ontology-mcp
Login Query Agent — Ontology MCP & Knowledge Graph
Прототип, который использует граф знаний OWL/SHACL/SKOS + два 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: OntoRamp Graph Query
Обзор сервисов
Сервис | Тип | Кто запускает | Требуется для |
Apache Jena Fuseki | Локальный процесс | Вы (вручную) | запросы к графу знаний ontology-mcp |
| Дочерний процесс stdio | VS Code запускает автоматически | Планирование диагностики |
| Дочерний процесс stdio | VS Code запускает автоматически | Запросы к БД + валидация |
SQL Server | Удалённый/LocalDB | Уже запущен | Запросы к данным |
MongoDB | Удалённый сервер | Уже запущен | Запросы к данным |
New Relic | Облачный сервис | Всегда доступен | Эскалация (все проверки пройдены) |
Только Fuseki требует ручного запуска. Оба MCP-сервера автоматически запускаются VS Code.
Предварительные требования
1. Java 11+
java -version2. Apache Jena Fuseki JAR
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 Driver for SQL Server
Скачайте ODBC Driver 17 or 18 for SQL Server от Microsoft, если он ещё не установлен.
6. VS Code с GitHub Copilot (режим агента)
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 | Transaction + Log для |
| 3b | New Relic NerdGraph | Transaction + Log для 3 URI сброса пароля (dr_011) |
Диагностические категории (8)
Категория | Срабатывает, когда |
| Не удаётся войти / пройти аутентификацию / получить доступ к приложению, сбой SSO, отклонены учётные данные |
| Не получена ссылка для сброса пароля или письмо «забыли пароль» |
| Не получено OTP-письмо при сбросе пароля |
| SMS с OTP не получено (мобильный номер подтверждён) |
| Учётная запись деактивирована / неактивна / приостановлена / отключена |
| Учётная запись заблокирована после нескольких неудачных попыток |
| Отсутствует / неактивен маппинг партнёра (BPC) |
| Несоответствие полей между SQL и MongoDB |
SHACL-формы (8, проверяются в порядке последовательности)
# | Форма | Условие | Правило |
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 |
| Нет активной строки маппинга партнёра | dr_004 |
5 |
| Поставщик без активного ненулевого BPC | dr_007 |
6 |
| Нет действительного зарегистрированного адреса эл. почты (потоки сброса/OTP) | — |
7 |
| Несоответствие isMobileNumberVerified между SQL и MongoDB | dr_002 |
8 |
| Несоответствие полей маппинга партнёра между SQL и MongoDB | dr_008 |
Для каждой категории
validation_sequenceвыполняет только соответствующий поднабор этих форм.advisories(например,dr_012— несоответствие email) возвращаются вместе с формами, но не влияют на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}Граф знаний — именованные графы
Граф знаний хранит 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 (форма→правило) — валидатор управляется графом знаний
Запасные варианты (каждый из них записывает предупреждение в лог): если 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) — валидатор на основе графа знаний читает её из графаshacl; правки в Python не нужны для формsh_in/sh_property/sparql/cross_sourceЗапустите generate + load + promote (чтобы новая форма/правило попали в граф знаний)
Перезапустите MCP-серверы
Добавление или изменение SHACL-формы
Формы выполняются из графа знаний, а не из кода. Измените x_shacl_rules в login.yaml, затем выполните regenerate + reload. kg_shacl_validator.py (универсальный движок) не требует изменений, если только вы не вводите совершенно новый тип ограничения.
Добавление новой версии схемы
Скопируйте
ontology/schemas/login/v1.0.0/→v1.1.0/Измените файлы сущностей в
v1.1.0/Запустите generate + load + promote для
v1.1.0
Обе версии сосуществуют в графе знаний — откат всегда доступен через 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.-