Skip to main content
Glama
JiteAgar-Code

ontology-mcp

ログインクエリエージェント — オントロジーMCP & ナレッジグラフ

OWL/SHACL/SKOSナレッジグラフ + 2つのMCPサーバーを使用して、SQL ServerとMongoDBにまたがるログイン診断クエリをルーティングし、条件付きでNew Relicへのエスカレーションを行うPOCです。


アーキテクチャ概要

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 KGクエリ

ontology-mcp

stdio子プロセス

VS Codeが自動起動

診断プランニング

data-mcp

stdio子プロセス

VS Codeが自動起動

DBクエリ + 検証

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からSQL Server用ODBC Driver 17または18をダウンロードしてください(未インストールの場合)。

6. GitHub Copilot(エージェントモード)付き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 — ナレッジグラフをロード

初回実行時、またはスキーマ/アーティファクトの変更後は必須です。

$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

iddescriptioncoversを含む全8カテゴリ

get_entity_descriptor

オンデマンド

class_name, schema

KGディスクリプタグラフからの完全な列/フィールドマッピング

get_diagnosis_planはケイパビリティレジストリを**login.yamlから直接**読み取ります — Fuseki呼び出しは不要です。 get_entity_descriptorはFusekiディスクリプタグラフをクエリします — Fusekiの実行が必要です。

data-mcp — ライブデータツール(7ツール)

7つすべてのツールにget_diagnosis_planからのcapability_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

SMS OTPが届かない(モバイルは検証済み)

account_state

アカウントが無効化/非アクティブ/停止/無効化された

account_locked

複数回の失敗試行後にアカウントがロックされた

partner_mapping

パートナー(BPC)マッピングが欠落/非アクティブ

data_sync

SQLとMongoDBのフィールド不一致


SHACLシェイプ(8、シーケンス順に評価)

#

シェイプ

条件

ルール

1

LoginBlockShape

isLocked=1 OR isActive=0 OR isDeleted=1

dr_003

2

SystemUserShape

isSystemUser=1

dr_005

3

BuyerSSOShape

userType=Buyer AND 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クエリ構造(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

コンテンツ

クエリ元

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は各診断の2つの段階でクエリされます:

  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_registryを読み取り、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

トラブルシューティング

エラー

原因

修正

sparql_failed

Fuseki が起動していない

Fuseki を起動する(ステップ 1)

capability_id_required

エージェントが get_diagnosis_plan をスキップした

会話を再開する。CLAUDE.md / copilot-instructions.md がシーケンスを強制する

schema_not_found

registry.yaml にスキーマエントリがない

ontology/schemas/registry.yaml を確認する

registry_load_failed

login.yamlx_capability_registry がない

login.yaml にブロックがあるか確認する

SQL Server connection error

.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

スキーマの拡張

新しいエンティティの追加(新しい SQL テーブルまたは MongoDB コレクション)

  1. ontology/schemas/login/v1.0.0/entities/new_entity.yaml を作成する

  2. login.yaml のインポートに - entities/new_entity を追加する

  3. generate + load + promote を実行する

診断カテゴリの追加または変更

  1. login.yamlx_capability_registry を編集する

  2. x_shacl_ruleslogin.yaml)で対応するシェイプを追加/更新する — KG 駆動のバリデータは shacl グラフからそれを読み取る。sh_in/sh_property/sparql/cross_source シェイプには Python の編集は不要

  3. generate + load + promote を実行する(新しいシェイプ/ルールが KG に入るように)

  4. MCP サーバーを再起動する

SHACL シェイプの追加または変更

シェイプはコードではなく KG から実行される。login.yamlx_shacl_rules を編集し、再生成 + 再ロードする。kg_shacl_validator.py(汎用エンジン)は、まったく新しい制約 タイプ を導入しない限り変更は不要。

新しいスキーマバージョンの追加

  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