元数据图谱服务

一个基于轻量级FalkorDB图引擎的元数据管理服务器,提供带置信度评分的动态图谱和可视化仪表盘功能,适用于需要上下文感知元数据管理的场景。

  • by clydewatts1
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 clydewatts1/generic_database_metadata_mcp

使用说明

GlossaryWeaver

A. 节能、节省上下文的元数据MCP服务器 由...支持 FalkorDBLite (轻量级嵌入式FalkorDB图形引擎),具有 只读可视化web仪表板.

服务 传输 默认端口
MCP服务器 HTTP+SSE(快速MCP) 8000
可视化仪表板 HTTP(FastAPI+静态) 8080

服务器展示了一个类型化元数据对象的图,这些对象的边承载着生命 confidence_score。每次穿过边缘时,边缘都会得到加强,如果不使用,边缘会腐烂——体现了蚁群激励的“使用或丢失”原则。MCP工具响应使用紧凑型 卡通 序列化格式,以保持LLM上下文窗口较小。仪表板绕过TOON,向浏览器提供完整的JSON(规则3.6豁免)。

实施说明:图形后端是 FalkorDBLite --FalkorDB的轻量级嵌入式版本,在单个Docker容器内运行,没有集群开销。Python包是 falkordb;当连接到独立的Docker实例时,轻量级模式会自动激活。


建筑

src/
├── graph/
│   ├── client.py        # FalkorDB connection singleton
│   ├── ontology.py      # MetaType CRUD + health-score management
│   ├── nodes.py         # ObjectNode CRUD + bulk ingest
│   ├── edges.py         # StigmergicEdge CRUD, reinforce, decay, cascading wither
│   ├── decay.py         # Decay runner (single edge + full-graph sweep)
│   ├── query.py         # Bounded traversal (1-2 hops) + flat scan + pagination
│   └── schema.py        # Graph schema helpers
├── dashboard/           # Visual web dashboard API (FastAPI, port 8080)
│   ├── api.py           # App factory; mounts static files; /health + /api/graph + /api/health
│   ├── auth.py          # JWT Bearer decode; DashboardUser dependency; 401/403
│   ├── router.py        # GET /api/graph route (scoped, read-only)
│   ├── health_router.py # GET /api/health/meta-types — USL enforced at constructor level
│   ├── health_service.py# HealthService: colour-band computation, DASHBOARD_NODE_LIMIT cap
│   ├── security.py      # Unified Security Layer: derive_session_id, AuditService, unified_security
│   ├── graph_service.py # DashboardGraphService — wraps query.py; 500-node cap
│   ├── models.py        # Pydantic response models (GraphNodeResponse, HealthPayloadResponse, ...)
│   ├── config.py        # Env-var loading (DASHBOARD_JWT_SECRET, DASHBOARD_PORT, ...)
│   └── server.py        # uvicorn entrypoint (port 8080)
├── models/
│   ├── base.py          # Pydantic models for all graph entities
│   ├── dynamic.py       # Runtime model factory (pydantic.create_model)
│   └── serialization.py # TOON compact serialiser / paginator
├── mcp_server/
│   ├── app.py           # FastMCP singleton
│   ├── server.py        # Entry point — registers all tools, calls mcp.run()
│   ├── formatters/
│   │   └── toon.py      # TOON compact format helpers
│   └── tools/
│       ├── ingestion.py # insert_node, bulk_ingest_seed (circuit breaker)
│       ├── ontology.py  # register_meta_type, list_meta_types_tool
│       ├── stigmergy.py # create_stigmergic_edge, reinforce_stigmergic_edge
│       ├── query.py     # query_graph
│       ├── lifecycle.py # deprecate_node, branch_node_for_domain, request/confirm deletion
│       ├── healing.py   # suggest_schema_heals, confirm_schema_heal
│       └── functions.py # create_function, query_functions, attach_function_to_nodes
└── utils/
    ├── logging.py       # Logger + error class hierarchy
    └── context.py       # RequestContext (profile, domain, prompt hash, session)

dashboard/               # Frontend static assets (served by the dashboard API)
├── index.html           # Single-page app shell; loads Cytoscape.js 3.x from CDN
├── app.js               # Canvas render, node click/dim, filter panel, search, edge tooltips,
│                        #   schema health panel (colour-band indicators, refresh, degraded state)
└── style.css            # Full-height dark-theme layout; confidence_score edge encoding;
                         #   health indicator colour classes (.health-green/amber/red)

scripts/
└── bootstrap_indices.py # Create FalkorDB indices on HumanAuditLog (profile_id, timestamp)

tests/
├── conftest.py
├── unit/
│   ├── dashboard/
│   │   ├── test_auth.py              # JWT auth (401/403, expired, missing claims)
│   │   ├── test_graph_service.py     # Scope enforcement, 500-node cap, confidence clamp
│   │   ├── test_health_service.py    # Health band boundaries, truncation, error handling
│   │   ├── test_unified_security.py  # USL: derive_session_id, audit write, 401/403/503
│   │   └── test_performance.py       # SC-002 serialisation <=1.5s, SC-005 filter <=50ms
│   ├── test_ontology.py
│   ├── test_ingestion.py
│   ├── test_stigmergy.py
│   ├── test_decay.py
│   ├── test_domain_scoping.py
│   ├── test_function_object_model.py
│   ├── test_remaining_rules.py
│   └── test_serialization.py
├── integration/
│   ├── test_dashboard_api.py         # Scope isolation, health endpoint, audit, degraded state
│   └── test_function_objects_e2e.py
└── contract/
    ├── test_dashboard_mutations.py   # Assert zero WRITE Cypher ops from any dashboard route
    └── test_health_mutations.py      # Static-analysis contract: no mutation Cypher in health code

先决条件

要求 版本 注释
Python 3.11+
Docker 最新 运行FalkorDBLite
pip 任何

设置

  1. 启动FalkorDBLite (轻量级嵌入式FalkorDB):

    docker run -p 6379:6379 -it --rm falkordb/falkordb
    
  2. 安装依赖项:

    git clone <repository-url>
    cd generic_database_metadata_mcp
    
    python -m venv .venv
    # Windows
    .venv\Scripts\activate
    # macOS / Linux
    source .venv/bin/activate
    
    pip install -r requirements.txt
    
  3. Bootstrap FalkorDBLite索引 (仅限首次运行):

    python scripts/bootstrap_indices.py
    

运行MCP服务器

继续运行 http://127.0.0.1:8000 (苏格兰和南方能源公司运输)。

python -m src.mcp_server.server

预期日志输出:

INFO: src.graph.client: Connecting to FalkorDBLite at localhost:6379
INFO: src.mcp_server.server: [FastMCP] MCP tools registered: 17
INFO: uvicorn.server: Uvicorn running on http://127.0.0.1:8000

运行可视化仪表板

继续运行 http://127.0.0.1:8080 作为 独立过程。需要 DASHBOARD_JWT_SECRET 有人是。

export DASHBOARD_JWT_SECRET="your-secret-here"
python -m src.dashboard.server

打开 http://localhost:8080 在浏览器中,粘贴一个有效的JWT,元数据图会自动呈现。

仪表板环境变量

变量 默认值 描述
DASHBOARD_JWT_SECRET (必填) JWT承载令牌验证的HS256密钥
DASHBOARD_PORT 8080 仪表板服务器侦听的端口
DASHBOARD_NODE_LIMIT 500 每个作用域有效负载返回的最大节点数
FALKORDB_HOST localhost FalkorDBLite主机名
FALKORDB_PORT 6379 FalkorDBLite端口

仪表板功能

US1--交互式图形画布

经过身份验证的用户允许范围内的节点在3秒内呈现为平移/缩放Cytoscape.js画布。单击节点以打开属性侧面板并调暗非相邻节点。按Esc或单击背景进行还原。

US2--污名化与结构性边缘

耻辱边缘编码 confidence_score 作为线宽(0.0时为1像素->1.0时为6像素)。低于0.2的边渲染为虚线并弱化。结构边缘是一条固定的1.5像素实灰线。将鼠标悬停在任意边上以显示工具提示——刺激能量工具提示包括 confidence_score, rationale_summary,以及 last_accessed.

US3--筛选和搜索

从过滤器面板中选择一个或多个对象类型以限制可见节点。类型a business_name 子字符串用于对不匹配的节点进行暗淡处理,并自动将中心对准连接最紧密的匹配。刷新按钮可重置两者。

US4--配置文件感知范围视图

每个API请求都需要JWT轴承 profile_id 和 domain_scope.Domain作用域是在服务器端对每个查询强制执行的——不可能发生跨域数据泄漏。缺少令牌->HTTP 401;缺少声明->HTTP 403。

US5--模式健康小部件

可折叠的健康面板显示用户范围内的每个MetaType,按以下方式排序 health_score 上升(首先是不健康的)。每行显示一个颜色编码的指示器(绿色>=0.8,琥珀色>=0.5,红色<0.5)、MetaType名称、类别和分数。当健康数据服务不可用时,面板会显示一个黄色的降级横幅。负载时自动刷新;提供手动刷新按钮。

API终点: GET /api/health/meta-types 认证:JWT Bearer(与图形画布相同的标记) 响应字段: items[], total_available, truncated, audit_status


仪表板使用指南

步骤1--启动所有服务

# Terminal 1: start FalkorDBLite
docker run -p 6379:6379 -it --rm falkordb/falkordb

# Terminal 2: start the MCP server (port 8000)
python -m src.mcp_server.server

# Terminal 3: start the visual dashboard (port 8080)
export DASHBOARD_JWT_SECRET="my-super-secret"
python -m src.dashboard.server

步骤2——生成JWT

仪表板需要一个签名的HS256 JWT,上面有两个声明: profile_id 和 domain_scope.

import jwt, datetime

token = jwt.encode(
    {
        "profile_id": "user_alice",
        "domain_scope": "Finance",
        "exp": datetime.datetime.utcnow() + datetime.timedelta(hours=8),
    },
    "my-super-secret",
    algorithm="HS256",
)
print(token)

步骤3--打开仪表板

  1. 导航至 http://localhost:8080 在任何现代浏览器中。
  2. A. JWT登录横幅 出现在页面顶部。
  3. 粘贴步骤2中的令牌(不使用 Bearer 前缀)输入到输入字段中,然后单击 连接.
  4. 图形画布加载 domain_scope 你的令牌。

第4步——浏览图表

行动 如何
潘 单击并拖动画布背景
变焦 滚轮或捏手势
选择一个节点 单击--打开属性侧面板(右)并使无关节点变暗
取消选择 媒体 Escape 或单击画布背景
将边缘悬停 显示带有以下内容的工具提示 confidence_score, rationale_summary,以及 last_accessed
刷新 点击↻ 刷新 标题中的按钮,用于从服务器重新加载

步骤5——过滤和搜索

  • 对象类型筛选器 (左面板):从多选列表中选择一个或多个类型,仅显示匹配的节点。保持 Ctrl/Cmd 选择多个。点击 清除筛选 重置。
  • 搜索 (左面板):键入a的任何子字符串 business_name 以使不匹配的节点变暗。画布自动以连接最紧密的匹配为中心。

步骤6--模式运行状况面板

这 架构运行状况 面板(页面底部)列出了按以下方式排序的每个MetaType health_score (最低优先):

颜色 分数范围 含义
🟢 绿色 ≥0.8 健康
🟡 琥珀色 0.5–0.79 劣化
🔴 红色 <0.5 不健康——考虑跑步 suggest_schema_heals 通过MCP

点击 ↻ 刷新 在面板内重新加载健康评分,而无需重新加载图表。

如果医疗服务暂时不可用,黄色 “架构运行状况数据暂时不可用” 横幅已显示。图形画布继续正常运行。

故障排除

症状 可能原因 修复
登录横幅未解除 令牌格式错误或已过期 重新生成JWT(步骤2)
domain_scope / profile_id 错误横幅 JWT缺少必需的声明 确保有效负载中同时存在这两个声明
Graph engine unavailable 警告 MCP服务器或FalkorDBLite已关闭 请先检查FalkorDB-Lite(docker ps,端口6379),然后重新启动MCP服务器
显示前500个节点消息 范围内有500多个节点 应用对象类型筛选器以缩小结果范围

在LLM环境中配置MCP服务器

MCP服务器公开了一个 SSE端点 在 http://127.0.0.1:8000 (或您配置的任何主机/端口)。下面的例子展示了如何在三种流行的人工智能环境中连接它。


克劳德桌面版

Claude Desktop从JSON文件读取MCP服务器配置。

配置文件位置:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • 视窗: %APPDATA%\Claude\claude_desktop_config.json

选项A--SSE传输(推荐,服务器必须已在运行):

{
  "mcpServers": {
    "glossary-weaver": {
      "url": "http://127.0.0.1:8000/sse"
    }
  }
}

选项B--stdio传输(Claude Desktop自动生成进程):

{
  "mcpServers": {
    "glossary-weaver": {
      "command": "python",
      "args": ["-m", "src.mcp_server.server"],
      "cwd": "/absolute/path/to/generic_database_metadata_mcp",
      "env": {
        "FALKORDB_HOST": "localhost",
        "FALKORDB_PORT": "6379"
      }
    }
  }
}

保存文件后重新启动Claude Desktop。工具列表将出现在 工具 新对话的一部分。


GitHub副本(VS代码)

VS Code中的GitHub Copilot通过工作区或用户设置支持MCP服务器。

选项A——工作区级别配置(.vscode/mcp.json):

{
  "servers": {
    "glossary-weaver": {
      "type": "sse",
      "url": "http://127.0.0.1:8000/sse"
    }
  }
}

选项B--VS代码设置(settings.json):

{
  "github.copilot.chat.mcp.servers": {
    "glossary-weaver": {
      "type": "sse",
      "url": "http://127.0.0.1:8000/sse"
    }
  }
}

保存后,打开 副驾驶聊天 面板(Ctrl+Shift+I / Cmd+Shift+I)服务器的工具将列在MCP部分下。在打开Copilot聊天之前启动MCP服务器。


Gemini CLI

Gemini CLI 从读取MCP服务器配置 ~/.gemini/settings.json.

{
  "mcpServers": {
    "glossary-weaver": {
      "httpUrl": "http://127.0.0.1:8000/sse",
      "timeout": 30000
    }
  }
}

启动MCP服务器,然后运行:

gemini

此服务器注册的工具将在Gemini CLI会话中自动可用。您可以验证它们是否加载了:

/tools

MCP检验员测试

npx @modelcontextprotocol/inspector

配置SSE连接 http://127.0.0.1:8000.


MCP工具

工具 规则 描述
register_meta_type US1 定义一个新的类型化模式(PascalCase名称,JSON模式定义)
list_meta_types_tool US1 列出所有已注册的元类型(TOON分页)
insert_node US2 插入一个ObjectNode;根据其MetaType模式进行验证
bulk_ingest_seed US2 散装负载节点;返回简洁摘要(从不完整数据)
create_stigmergic_edge US3 在两个对象节点之间创建有向边(confidence_score=0.5)
reinforce_stigmergic_edge US3 加固边缘(+0.1,上限为1.0)
query_graph US4 查询具有可选遍历、域过滤器、分页的节点
suggest_schema_heals 规则2.7 识别健康评分低的元类型并建议治疗
confirm_schema_heal 规则2.7 在模式修复后将MetaType健康评分重置为1.0
deprecate_node 规则4.5 弃用节点并触发级联枯萎(修剪附着的边)
branch_node_for_domain 规则5.4 创建节点的域特定副本(并行真理)
request_node_deletion 规则5.5 请求删除并获得批准(最高法院)
confirm_node_deletion 规则5.5 审批后确认节点删除
create_function 函数对象 使用输入/输出模式注册ETL操作或转换
query_functions 函数对象 按名称或描述查询已注册的函数对象
attach_function_to_nodes 函数对象 将函数对象链接到对象节点以进行转换沿袭

示例:注册MetaType

{
  "tool": "register_meta_type",
  "arguments": {
    "name": "Dashboard",
    "type_category": "NODE",
    "schema_definition": {
      "url": {"type": "string", "required": true},
      "owner": {"type": "string"}
    }
  }
}

示例:查询图形

{
  "tool": "query_graph",
  "arguments": {
    "meta_type_name": "Dashboard",
    "domain_scope": "Finance",
    "page": 0,
    "page_size": 5
  }
}

示例:弃用节点(规则4.5)

{
  "tool": "deprecate_node",
  "arguments": {
    "node_id": "node_uuid",
    "profile_id": "user_alice",
    "reason": "Node is no longer used in this domain"
  }
}

示例:域的分支节点(规则5.4——并行真理)

{
  "tool": "branch_node_for_domain",
  "arguments": {
    "source_node_id": "node_uuid",
    "target_domain_scope": "Finance",
    "profile_id": "user_alice",
    "domain_scope": "Global"
  }
}

规范规则覆盖范围

组件 规则 状态
动态元本体论 2.1-2.8 完成
背景节俭(MCP) 3.1-3.5 完成
人类视口异常 3.6 完整-仪表板API免除TOON/压缩
耻辱处决 4.1-4.5 完成
人为干预权限 4.7 已批准v1.3.0版----待执行(保留4.6)
配置文件感知范围界定 5.1-5.5 完成
仪表板统一安全层 5.6 已实现——所有健康路由上的security.py、health_router.py、USL
审核日志记录(人工视口) 5.7 部分——已实施READ审核;待执行的突变审计规则4.7特征
测试与验证 6.1-6.3 完成

7个部分定义了27条规则。宪法v1.3.1。规则4.7(人为干预权限)和完整的5.7(突变审计)仍有待实施。


TOON序列化(仅限MCP工具)

所有返回列表的MCP工具都使用 卡通 紧凑格式:

  • 按键缩写(confidence_score -> cs, name -> n等等)
  • 默认值/空值被删除
  • 硬上限:每个响应有效负载10 KB
  • 分页信封: {"items": [...], "total": N, "page": P, "has_more": bool}

仪表板API是 明确豁免 根据规则3.6,从TOON开始,它向浏览器提供完整的JSON。


耻辱的衰败

一旦超过24小时的访问阈值,边缘就会随着时间的推移被动衰减(0.05/天)。边缘 confidence_score 降至以下 0.1 自动修剪。随时运行完整的衰变扫描:

from src.graph.decay import run_all_decay
result = run_all_decay()
# {"processed": 42, "pruned": 3}

测试

# All tests (requires FalkorDB running)
pytest tests/ -v

# Dashboard tests only (no live FalkorDB needed)
pytest tests/unit/dashboard/ tests/contract/ tests/integration/test_dashboard_api.py -v

仪表板测试使用FastAPI TestClient 使用猴痘匹配的服务方法——不需要实时的FalkorDB。所有其他测试都使用一个名为FalkorDB的临时随机图,该图在完成时被拆除。 freezegun 用于模拟衰变断言的时间传递。


过梁和类型检查

ruff check src/ tests/
mypy src/