使用说明
NetworkX MCP服务器
此存储库提供了一个MCP(模型上下文协议)服务器,该服务器公开了一小部分 图形分析工具 建在上面 NetworkX服务器是通过以下方式实现的 FastMCP 并通过以下方式托管 快速API.
这些工具的设计便于LLM正确调用:每个工具都有一个图 NetworkX节点链接JSON 格式化并返回一个小的JSON对象。
项目结构
networkx-mcp/
├── main.py # Server entry point (FastAPI + FastMCP)
├── src/
│ ├── cache.py # Graph caching infrastructure
│ ├── tools.py # MCP tool definitions
│ ├── resources.py # MCP resource definitions
│ └── base/
│ ├── base.py # Graph construction utilities
│ └── graph_analytics.py # Node/edge filtering logic
├── data/ # Example graph JSON files
└── pyproject.toml # Project dependencies
关键原则:
main.py仅初始化并启动服务器- 工具定义见
src/tools.py并通过注册register_tools() - 资源定义见
src/resources.py并通过注册register_resources() - 图缓存逻辑被隔离在
src/cache.py
图形输入格式(重要)
所有接受的工具 graph_data 预期 NetworkX节点链接JSON (Python dict),由 networkx.node_link_data(G).
最低要求结构:
nodes:节点对象列表,每个对象包含一个idlinks或edges:包含以下内容的边对象列表source和target
可选标志:
directed(bool):默认为true如果缺失multigraph(bool):默认为true如果缺失
示例:参见 data/example_graph.json 和 data/sample_graph_attr.json.
高效的图形加载(推荐)
为了尽量减少上下文和流量,请使用 图形缓存工作流程 而不是在每次工具调用时传递全图JSON:
- 加载一次:呼叫
load_graph_from_file具有文件路径 - 多次引用:使用返回的
graph://后续工具调用中的URI
工作流程示例:
# Step 1: Load the graph (transmits file path only, ~50 bytes)
result = load_graph_from_file(
path="/path/to/my_graph.json",
alias="mygraph"
)
# Returns: {"status": "loaded", "uri": "graph://mygraph", "node_count": 100, ...}
# Step 2: Use the URI in all subsequent calls (transmits ~20 bytes)
path = shortest_path(
graph_uri="graph://mygraph", # ← Reference cached graph
source="A",
target="B"
)
# Step 3: More calls using same URI
nodes = find_nodes_by_attribute(
graph_uri="graph://mygraph",
attribute="type",
operator="==",
value="important"
)
交通比较:
- ❌ 无缓存:每次调用都会传输全图JSON(可以是兆字节)
- ✅ 使用缓存:加载一次(~文件大小),然后每次调用只传输约20个字节的URI
备注:所有工具支持 两者 graph_data (直接JSON)和 graph_uri (缓存引用)。为您的用例选择最佳方法。
工具
load_graph_from_file
从JSON文件加载图形并在服务器端缓存,以实现高效重用。
- 输入:
path(str):NetworkX节点链接JSON文件的绝对或相对文件路径alias(str,可选):缓存键(默认值:"default")
- 输出:
- 成功:
{"status": "loaded", "alias": "...", "uri": "graph://...", "node_count": N, "edge_count": M, "directed": bool, "multigraph": bool} - 失败:
{"error": "..."}(例如,找不到文件、JSON无效、图形模式无效)
- 成功:
- 副作用: 将图形存储在服务器内存中.使用返回的
uri在后续的工具调用中,避免重新传输图形数据。
health_check
生命探测。
- 输入:无
- 输出:
{"status": "ok"} - 副作用:无
shortest_path
计算a 未加权的 两个节点之间的最短路径。
- 输入:
graph_data(dict,可选):节点链接图 或graph_uri(str,可选):缓存的图引用(例如。,"graph://default")source(str):节点id(必须存在)target(str):节点id(必须存在)
- 输出:
- 成功:
{"path": ["nodeA", "nodeB", ...]} - 失败:
{"error": "..."}(例如,没有路径、找不到节点、架构无效)
- 成功:
- 副作用:无
find_nodes_by_attribute
使用比较运算符按节点属性过滤节点。
- 输入:
graph_data(dict,可选):节点链接图 或graph_uri(str,可选):缓存的图引用(例如。,"graph://default")attribute(str):节点属性键value(any|null):要比较的值;如果null,该工具仅检查属性是否存在operator(str):其中之一==,!=,<,<=,>,>=
- 行为:
- 如果
value是null:返回节点,其中attrs[attribute]存在且不为空。 - Else:返回以下节点
attrs[attribute] operator value这是真的。
- 如果
- 输出:
- 成功:
{"matching_nodes": ["A", "B", ...]} - 失败:
{"error": "..."}(例如,不支持的运算符、不可比较的类型)
- 成功:
find_edges_by_attribute
使用比较运算符按边属性过滤边。
- 输入:
graph_data(dict,可选):节点链接图 或graph_uri(str,可选):缓存的图引用(例如。,"graph://default")attribute(str):边属性键value(任意|空)operator(str):其中之一==,!=,<,<=,>,>=
- 输出:
- 成功:
{"matching_edges": [...]}- 对于多图:元组列表
(u, v, key) - 对于非MultiGraphs:元组列表
(u, v)
- 对于多图:元组列表
- 失败:
{"error": "..."}
- 成功:
find_best_matching_node_attribute
发现 节点属性名称 部分匹配搜索字符串。
- 输入:
graph_data(dict,可选):节点链接图 或graph_uri(str,可选):缓存的图引用(例如。,"graph://default")attribute(str):搜索字符串
- 行为:不区分大小写的子字符串与节点属性键匹配。
- 输出:
{"matching_attributes": ["holdup_max", "holdup_min", ...]}
find_best_matching_edge_attribute
发现 边属性名称 部分匹配搜索字符串。
- 输入:
graph_data(dict,可选):节点链接图 或graph_uri(str,可选):缓存的图引用(例如。,"graph://default")attribute(str):搜索字符串
- 行为:不区分大小写的子字符串与边缘属性键匹配。
- 输出:
{"matching_attributes": ["capacity", "transport_time", ...]}
find_best_matching_node_attribute_vals
搜索 节点属性值 通过子字符串匹配,返回按匹配值分组的匹配节点。
- 输入:
graph_data(dict,可选):节点链接图 或graph_uri(str,可选):缓存的图引用(例如。,"graph://default")attribute(str):精确的节点属性键comparison(str):要搜索的子字符串(不区分大小写)
- 输出:
{"matching_nodes": {"<value_as_string>": ["node1", "node2"], ...}}
find_best_matching_edge_attribute_vals
搜索 边缘属性值 通过子字符串匹配,返回按匹配值分组的匹配边。
- 输入:
graph_data(dict,可选):节点链接图 或graph_uri(str,可选):缓存的图引用(例如。,"graph://default")attribute(str):精确的边属性键comparison(str):要搜索的子字符串(不区分大小写)
- 输出:
{"matching_edges": {"<value_as_string>": [(u, v) or (u, v, key), ...], ...}}
运行服务器
此repo使用 justfile.
-
启动FastAPI(为MCP提供服务)
/api/mcp):just fastapi_run
-
通过FastMCP CLI(HTTP传输)启动:
just mcp_run
使用的默认URL client.py:
http://localhost:8000/api/mcp
LLM工具调用者注意事项
- 总是通过a 单 在调用工具时使用params对象(例如。,
{"graph_uri": "graph://default", "source": "A", "target": "B"}). - 节点ID通常是字符串(请参阅示例JSON文件)。
- 为了提高效率:使用
load_graph_from_file一次缓存图形,然后通过引用它graph_uri在所有后续通话中。这将流量从兆字节减少到字节。 - 灵活性:接受所有工具 要么
graph_data(直接JSON) 或graph_uri(缓存引用),但不能同时使用。 - 用于数字比较(
<,>=, ...),确保图中的属性值是数字,并且提供value也是数字。
