Skip to main content
Glama
JiteAgar-Code

ontology-mcp

登录查询代理 — Ontology MCP 与知识图谱

一个概念验证(POC),使用 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: openclaw-brain

服务概览

服务

类型

启动方

用途

Apache Jena Fuseki

本地进程

您(手动)

ontology-mcp 知识图谱查询

ontology-mcp

stdio 子进程

VS Code 自动生成

诊断规划

data-mcp

stdio 子进程

VS Code 自动生成

数据库查询 + 验证

SQL Server

远程/LocalDB

已在运行

数据查询

MongoDB

远程服务器

已在运行

数据查询

New Relic

云服务

始终可用

升级(所有形状均通过)

只有 Fuseki 需要手动启动。两个 MCP 服务器均由 VS Code 自动生成。


前置条件

1. Java 11+

java -version

2. Apache Jena Fuseki JAR

该 JAR 已从 git 中排除(54 MB)。请从 jena.apache.org 下载并放置于:

infra/fuseki/fuseki-server.jar

3. Python 3.12+

python --version

4. Python 依赖

cd c:\Ontology
python -m pip install -r requirements.txt

5. SQL Server 的 ODBC 驱动程序

如果尚未安装,请从 Microsoft 下载 ODBC Driver 17 或 18 for SQL Server

6. 安装了 GitHub Copilot(Agent 模式)的 VS Code

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 — 加载知识图谱

首次运行或任何 schema/工件变更后必需。

$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+PDeveloper: 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 个工具)

工具

步骤

输入

返回

get_diagnosis_plan

0 — 强制首次调用

category, schema

capability_id, required_entities, validation_sequence, newrelic_tool, required_parameters, datasources, additional_checks

list_capabilities

仅回退

schema

全部 8 个类别,包含 id, description, covers

get_entity_descriptor

按需

class_name, schema

来自 KG 描述符图的完整列/字段映射

get_diagnosis_plan 直接从 login.yaml 读取能力注册表 — 无需调用 Fuseki。 get_entity_descriptor 查询 Fuseki 描述符图 — 需要 Fuseki 正在运行。

data-mcp — 实时数据工具(7 个工具)

全部 7 个工具都需要来自 get_diagnosis_plancapability_id。未携带该参数调用将返回结构化错误。

工具

步骤

来源

返回

query_sql_user

1a

UM_Users

userid, username, emailaddress, usertype, authenticationtype, islocked, isactive, isdeleted, issystemuser, mobileno

query_sql_mobile_verification

1b

UM_UserMobileNumberVerified

ismobilenumberverified + 已执行的 SQL

query_sql_partner_mappings

1c

UM_UserPartnermapping

所有映射行、总计数、活跃计数

query_mongo_user

1d

users 集合

9 个投影字段 + 已执行的查询

validate_login_shapes

2

SQL + MongoDB

每个形状的 PASS/FAIL、all_shapes_passadvisoriesnext_step

query_newrelic_login_mfa

3a

New Relic NerdGraph

/Account/Login 的事务 + 日志(dr_010)

query_newrelic_reset_password

3b

New Relic NerdGraph

3 个重置 URI 的事务 + 日志(dr_011)


诊断类别(8 个)

类别

触发条件

login_failure

无法登录 / 认证 / 访问应用,SSO 失败,凭据被拒绝

password_reset

未收到重置链接或忘记密码邮件

otp_email

重置期间未收到 OTP 邮件

sms_otp

未收到短信 OTP(手机已验证)

account_state

账户已停用 / 非活跃 / 已暂停 / 已禁用

account_locked

多次尝试失败后账户被锁定

partner_mapping

缺少 / 非活跃的合作伙伴(BPC)映射

data_sync

SQL 与 MongoDB 字段不匹配


SHACL 形状(8 个,按顺序求值)

#

形状

条件

规则

1

LoginBlockShape

isLocked=1 或 isActive=0 或 isDeleted=1

dr_003

2

SystemUserShape

isSystemUser=1

dr_005

3

BuyerSSOShape

userType=Buyer 且 authenticationType=SSO

dr_006

4

PartnerMappingShape

无活跃的合作伙伴映射行

dr_004

5

SupplierPartnerMappingShape

供应商无活跃的非零 BPC

dr_007

6

EmailVerificationShape

无有效的已注册电子邮件地址(重置/OTP 流程)

7

MobileConsistencyShape

SQL 与 MongoDB 的 isMobileNumberVerified 不匹配

dr_002

8

PartnerMappingDataSyncShape

SQL 与 MongoDB 的合作伙伴映射字段不匹配

dr_008

每个类别的 validation_sequence 仅运行这些形状的相关子集。 advisories(例如 dr_012 电子邮件不匹配)与形状一起返回,但影响 all_shapes_pass


New Relic 查询结构(两步)

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

内容

被查询方

urn:kg:login:v1.0.0:capabilities

诊断剧本 — 8 个类别、必需实体、验证序列

get_diagnosis_plan(步骤 0)

urn:kg:login:v1.0.0:descriptors

实体列/字段映射

get_entity_descriptor + validate_login_shapes(物化)

urn:kg:login:v1.0.0:rules

决策规则(dr_001..dr_012)

validate_login_shapes — 运行时读取形状→规则映射

urn:kg:login:v1.0.0:shacl

SHACL 节点形状 + 约束

validate_login_shapes — 运行时读取并执行形状(KG 驱动)

urn:kg:login:v1.0.0:ontology

OWL 类 + 属性

可供检查

urn:kg:login:v1.0.0:skos

SKOS 概念方案 + 标签

可供检查

urn:kg:login:meta

活跃版本指针

每次 Fuseki 查询(图发现)

每次诊断在两个阶段查询 Fuseki:

  1. get_diagnosis_plan(步骤 0)— get_active_graphs(元图)+ get_capability_plan(能力图)→ 完整诊断剧本

  2. validate_login_shapes(步骤 2)— 读取 shacl 图(形状)、descriptors 图(用于物化的字段/类型映射)和 rules 图(形状→规则)— 验证器由 KG 驱动

回退机制(每次记录警告):如果 Fuseki 不可达,get_diagnosis_planlogin.yaml 读取 x_capability_registryvalidate_login_shapes 回退到程序化的 shacl_validator.py


工件重新生成

当任何 YAML schema 文件变更时:

$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

故障排查

Error

Cause

Fix

sparql_failed

Fuseki 未运行

启动 Fuseki(步骤 1)

capability_id_required

Agent 跳过了 get_diagnosis_plan

重新开始对话;CLAUDE.md / copilot-instructions.md 强制该顺序

schema_not_found

registry.yaml 缺少 schema 条目

检查 ontology/schemas/registry.yaml

registry_load_failed

login.yaml 缺少 x_capability_registry

确认 login.yaml 包含该块

SQL Server 连接错误

.env 中主机/凭据错误

检查 SQL_SERVER_HOSTTRUSTED_CONNECTION

No module named 'pyodbc'

缺少依赖

pip install pyodbc

UnicodeEncodeError

Windows 控制台编码

添加 $env:PYTHONIOENCODING = "utf-8"

Fuseki 图为空

重启后 Fuseki 全新启动

运行 load_kg.py + promote.py


每日工作流

# 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

扩展 Schema

添加新实体(新的 SQL 表或 MongoDB 集合)

  1. 创建 ontology/schemas/login/v1.0.0/entities/new_entity.yaml

  2. - entities/new_entity 添加到 login.yaml 的 imports 中

  3. 运行 generate + load + promote

添加或修改诊断类别

  1. 编辑 login.yaml 中的 x_capability_registry

  2. login.yamlx_shacl_rules 中添加/更新匹配的 shape——KG 驱动的验证器从 shacl 图中读取它;无需编辑 Python 即可处理 sh_in/sh_property/sparql/cross_source shapes

  3. 运行 generate + load + promote(使新的 shape/rule 进入 KG)

  4. 重启 MCP 服务器

添加或修改 SHACL shape

Shapes 从 KG 执行,而非代码。编辑 login.yaml 中的 x_shacl_rules,然后重新生成并重新加载。kg_shacl_validator.py(通用引擎)无需更改,除非你引入全新的约束类型

添加新的 schema 版本

  1. 复制 ontology/schemas/login/v1.0.0/v1.1.0/

  2. 编辑 v1.1.0/ 中的实体文件

  3. v1.1.0 运行 generate + load + promote

两个版本在 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.

Maintenance

ActivityMaintained
ResponsivenessNo issues

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

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    An 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.
    35
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    An 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.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    An 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.
    2
    MIT

Latest Blog Posts

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