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クエリ |
| stdio子プロセス | VS Codeが自動起動 | 診断プランニング |
| stdio子プロセス | VS Codeが自動起動 | DBクエリ + 検証 |
SQL Server | リモート/LocalDB | すでに実行中 | データクエリ |
MongoDB | リモートサーバー | すでに実行中 | データクエリ |
New Relic | クラウドサービス | 常時利用可能 | エスカレーション(全シェイプがパス) |
手動起動が必要なのはFusekiのみです。両方のMCPサーバーはVS Codeによって自動起動されます。
前提条件
1. Java 11+
java -version2. Apache Jena Fuseki JAR
JARはgitから除外されています(54 MB)。jena.apache.orgからダウンロードし、以下に配置してください:
infra/fuseki/fuseki-server.jar3. Python 3.12+
python --version4. Python依存パッケージ
cd c:\Ontology
python -m pip install -r requirements.txt5. 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ツール)
ツール | ステップ | 入力 | 戻り値 |
| 0 — 必須の最初の呼び出し |
|
|
| フォールバックのみ |
|
|
| オンデマンド |
| KGディスクリプタグラフからの完全な列/フィールドマッピング |
get_diagnosis_planはケイパビリティレジストリを**login.yamlから直接**読み取ります — Fuseki呼び出しは不要です。get_entity_descriptorはFusekiディスクリプタグラフをクエリします — Fusekiの実行が必要です。
data-mcp — ライブデータツール(7ツール)
7つすべてのツールにget_diagnosis_planからのcapability_idが必要です。これなしで呼び出すと構造化エラーが返されます。
ツール | ステップ | ソース | 戻り値 |
| 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 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 |
| SQLとMongoDBのisMobileNumberVerified不一致 | 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は各診断の2つの段階でクエリされます:
get_diagnosis_plan(ステップ0) —get_active_graphs(メタグラフ)+get_capability_plan(ケイパビリティグラフ)→ 完全な診断プレイブック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トラブルシューティング
エラー | 原因 | 修正 |
| Fuseki が起動していない | Fuseki を起動する(ステップ 1) |
| エージェントが | 会話を再開する。 |
|
|
|
|
|
|
|
|
|
| 依存関係が不足している |
|
| Windows コンソールのエンコーディング |
|
Fuseki グラフが空 | 再起動後の新しい 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を作成するlogin.yamlのインポートに- entities/new_entityを追加するgenerate + load + promote を実行する
診断カテゴリの追加または変更
login.yamlのx_capability_registryを編集するx_shacl_rules(login.yaml)で対応するシェイプを追加/更新する — KG 駆動のバリデータはshaclグラフからそれを読み取る。sh_in/sh_property/sparql/cross_sourceシェイプには Python の編集は不要generate + load + promote を実行する(新しいシェイプ/ルールが KG に入るように)
MCP サーバーを再起動する
SHACL シェイプの追加または変更
シェイプはコードではなく KG から実行される。login.yaml の x_shacl_rules を編集し、再生成 + 再ロードする。kg_shacl_validator.py(汎用エンジン)は、まったく新しい制約 タイプ を導入しない限り変更は不要。
新しいスキーマバージョンの追加
ontology/schemas/login/v1.0.0/をv1.1.0/にコピーするv1.1.0/のエンティティファイルを編集する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.
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