使用说明
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 | 任何 |
设置
-
启动FalkorDBLite (轻量级嵌入式FalkorDB):
docker run -p 6379:6379 -it --rm falkordb/falkordb -
安装依赖项:
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 -
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--打开仪表板
- 导航至
http://localhost:8080在任何现代浏览器中。 - A. JWT登录横幅 出现在页面顶部。
- 粘贴步骤2中的令牌(不使用
Bearer前缀)输入到输入字段中,然后单击 连接. - 图形画布加载
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/