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+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ツール)

ツール

ステップ

入力

戻り値

get_diagnosis_plan

0 — 必須の最初の呼び出し

category, schema

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

list_capabilities

フォールバックのみ

schema

id、description、coversを含む全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_pass、advisories、next_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_planはlogin.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.yaml に x_capability_registry がない

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

SQL Server connection error

.env のホスト/資格情報が誤っている

SQL_SERVER_HOST、TRUSTED_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.yaml の x_capability_registry を編集する

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

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

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

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

シェイプはコードではなく KG から実行される。login.yaml の x_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 で可能。

Maintenance

ActivityStale
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    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
    D
    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
    D
    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.
    3
    MIT