nebula-mcp
Connect Codex to YueShu Nebula 5.3 for read-only GQL exploration, validation, visualization, and guarded mutations.
Test the configured YueShu connection and return redacted connection/version info.
List available persistent graphs with pagination and optional schema filtering.
Read a Graph Type schema, optionally with a bounded DDL string.
Validate GQL/Cypher/nGQL before execution: placeholders, dialect residuals, policy, statement kind, and optional non-executing EXPLAIN.
Execute approved read-only GQL and return tables, Cytoscape interactive graph elements, Vega-Lite charts, deterministic column analysis, truncation info, and explanation context.
Execute mutations only if
NEBULA_ALLOW_MUTATIONS=trueandconfirm_mutation=true; destructive and no charts.Support multiple environments as separate MCP servers (e.g., dev/prod/test), each with its own connection config.
Default behavior is read-only; mutations are disabled unless explicitly enabled and confirmed.
Provides tools for connecting to and interacting with a NebulaGraph (悦数图数据库 5.3) instance, including graph and schema discovery, GQL validation, read-only query execution, and structured result output.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@nebula-mcpwhat graphs are available and show me the schema for the user graph?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
nebula-mcp
在 Codex 中连接悦数图数据库 5.3,执行 GQL,查看表格、交互图、PROFILE 和结果解释。MCP 安装在使用者电脑上,无需部署到数据库服务器。
安装
准备 Python 3.10+、Codex,以及可访问的悦数图数据库 5.3。安装需要访问 GitHub 和 Python 包源。
macOS / Linux:
curl -fL https://github.com/MuYiYong/nebula-mcp/releases/latest/download/install.py -o install.py
python3 install.py --mode mcpWindows PowerShell:
Invoke-WebRequest -Uri "https://github.com/MuYiYong/nebula-mcp/releases/latest/download/install.py" -OutFile install.py
py -3 install.py --mode mcp安装器会校验并安装程序包,将 nebula 注册为独立 MCP 服务器。如果未找到 Codex CLI,按安装器输出的命令完成注册。下载或分享固定版本请使用 GitHub Releases。
Related MCP server: mcp4gql
配置连接
如果 Codex 中的 nebula 只出现在 “来自插件” 分组,且这一行没有齿轮按钮,就不能在该插件条目上编辑连接参数。请先按上面的安装命令运行 python3 install.py --mode mcp(Windows 为 py -3 install.py --mode mcp);已经安装过插件也可以运行。完成后重新打开 Codex 设置,在 插件 → MCP → 服务器 分组找到带齿轮的独立 nebula,点击齿轮,在环境变量中填写:
新建的独立条目会预置以下字段名;地址、用户名和密码留空,其他字段采用表中的默认值。已有条目升级时保留原配置,不会重置这些字段。
字段 | 内容 |
| 数据库地址 |
| 数据库用户名 |
| 数据库密码 |
|
|
|
|
| 环境名称,例如 |
保存并重启该 MCP,然后在新对话中输入“测试 Nebula 连接”。如果仍只看到“来自插件”的条目,先重启 Codex,再确认安装命令没有报错;不要在无齿轮的插件条目上寻找环境变量编辑入口。插件条目可以继续保留,连接配置以“服务器”分组中的独立 nebula 为准。
连接信息保存在本机 Codex config.toml 中,包含明文密码;页面编辑密码时也可能可见,请勿分享该文件或把它加入版本库。若更希望在终端无回显输入密码,可使用高级配置命令,但页面配置不需要运行该命令。
多套环境
每套环境添加一个独立的 STDIO MCP 服务器,名称由你定义,例如 dev_nebula、prod_nebula、test_nebula,不限制为两套。
根据当前公开的 Codex 插件接口,本项目不能在原生 MCP 设置页的 nebula 齿轮旁添加“复制集群”按钮。添加另一套环境时,请在同一设置页新建独立 MCP 服务器并按下面步骤配置。
在 MCP 设置中添加自定义服务器,填写一个不重复的名称。
复制已安装
nebula的命令和参数,复用同一程序,无需重复安装。launcher.py路径应作为一个完整参数,含空格时不要拆开。分别填写该环境的地址、用户名和密码;建议
NEBULA_ENVIRONMENT与服务器名称一致。保存后按客户端提示重启对应服务器,测试连接。
切换时关闭当前条目、开启目标条目。若同时启用多套,请在查询请求中明确指定服务器名称。尚未配置的条目,以及不再使用的默认或插件条目,应保持关闭。
使用
直接输入 GQL:
使用 dev_nebula,执行 MATCH (n) RETURN n LIMIT 20
用自然语言提出查询:
使用 dev_nebula,先查看图和 Schema,再查找指定球员的队友关系。
未选图时,客户端会列出可用图并请你选择;选择后自动继续刚才的查询,不需要重复发送。后续查询沿用所选图。
自然语言、Cypher 或 nGQL 转换可配合客户端的 gql-query-generator 技能。已有 GQL 可以直接执行,不需要额外安装该技能。
查询结果可显示表格、交互图、图表、PROFILE 和解释。点击点或边查看属性与主键;复制图标复制原始 GQL 并提示“已复制”。自动添加的 PROFILE 不出现在复制的语句中。客户端不支持 MCP Apps 时,仍可查看文本和表格结果。
默认只读。需要写入时,应使用具备相应权限的账号,将 NEBULA_ALLOW_MUTATIONS 设为 true,重启 MCP,并在每次写入时明确确认。请按业务需要限制数据库账号权限。
升级
重新执行上面的下载与安装命令即可。安装器会保留已管理服务器的连接配置;自定义条目共用同一启动程序,升级后重启相关 MCP。
卸载
如添加了多个自定义条目,先在 Codex 中删除共用此程序的条目,再卸载程序:
python3 install.py --uninstallWindows 使用 py -3 install.py --uninstall。卸载会删除受管 MCP 程序;仅删除某个环境时,在 Codex 中删除对应条目即可,不必卸载程序。
常见问题
CONFIGURATION_REQUIRED:程序已启动,但连接信息尚未填完整。检查地址、用户名和密码。
连接失败:检查数据库服务、端口、网络和账号权限;保存配置后重启相应 MCP。
没有交互图:语句需要返回点、边或路径;聚合值通常只显示表格或图表。客户端也需要支持 MCP Apps。
结果被截断:仅展示了部分数据,解释和统计也仅针对返回部分;请收紧查询范围。
安装时提示同名冲突:先检查已有条目的启动命令,避免覆盖其他程序的配置。
Available Tools
12 toolsnebula_configure_connectionB
Configure the database inside MCP without restarting. Connection settings stay in this process only; replacing a connection resets its session and graph choice. Passwords are never returned, but tool arguments may be stored by the host. Use installer --configure for local no-echo password entry instead if preferred.
| Name | Required | Description | Default |
|---|---|---|---|
| password | Yes | ||
| username | Yes | ||
| addresses | Yes | ||
| tls_enabled | No | ||
| default_schema | No | ||
| connect_timeout_ms | No | ||
| request_timeout_ms | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| config | Yes | |
| version | Yes | |
| connected | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-idempotent, open-world behavior, but the description adds non-obvious consequences: settings are process-scoped only, and replacing a connection resets its session and graph choice. It also discloses a security trait ('passwords are never returned, but tool arguments may be stored by the host') that no annotation conveys. It stops short of permission/auth requirements or error behavior, keeping it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the core action, then side effects, then the alternative. Every sentence carries distinct information with no filler, though the security caveat and alternative are packed tightly enough to be slightly overloaded for one paragraph.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description covers scope, reset behavior, and credential handling. The main gap is parameter meaning for a 7-parameter connection tool at 0% schema coverage, which leaves an agent guessing at acceptable input formats.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 7 parameters, and the description names none of them. Format-critical details such as how 'addresses' should be expressed (host:port list? URI?), TLS semantics, and timeout units are absent from both the schema and the description, so the description fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Configure the database') and adds the key constraint 'without restarting', which distinguishes it from setup-style siblings such as nebula_switch_environment or nebula_test_connection. It does not explicitly name which sibling to use instead, so sibling differentiation is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names one alternative ('installer --configure for local no-echo password entry instead if preferred') with a clear condition (prefer no-echo local entry), which is genuine routing guidance. However, it gives no guidance on when to configure vs. test or switch an existing connection among the many nebula_* siblings, leaving the main usage decision implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nebula_execute_mutationADestructive
Execute one mutation only when NEBULA_ALLOW_MUTATIONS=true and confirm_mutation=true. This tool is destructive and returns no charts.
| Name | Required | Description | Default |
|---|---|---|---|
| graph | No | ||
| statement | Yes | ||
| confirm_mutation | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| warnings | No | |
| affected_edges | Yes | |
| affected_nodes | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructiveHint=true, so the description's 'This tool is destructive' reinforces rather than adds. It does add useful context by stating 'returns no charts' and 'one mutation only', but it does not disclose other behavioral traits such as whether changes are reversible or what happens on failed validation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with no filler. The critical usage condition is front-loaded, and the destructive/no-charts warning is placed prominently. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is adequate for a simple mutation tool with an output schema: it states the mutation role, safety gate, destructive nature, and output expectation. However, it lacks guidance on how 'statement' and 'graph' relate, and it could benefit from explicitly routing non-mutating users to nebula_execute_query.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate by explaining the parameters. It mentions confirm_mutation as a safety gate, which is useful, but it gives no semantics for the required 'statement' parameter or the optional 'graph' parameter, leaving the agent to infer their roles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies a specific verb ('Execute'), a specific resource ('mutation'), and adds a scope constraint ('one mutation only'). It is distinguishable from sibling tools by the term 'mutation', though it does not explicitly name the sibling it contrasts with, such as nebula_execute_query.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit gating conditions: 'only when NEBULA_ALLOW_MUTATIONS=true and confirm_mutation=true'. This is strong usage guidance for a destructive tool. However, it does not explicitly state when to prefer a sibling like nebula_execute_query for non-mutating work.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nebula_execute_queryARead-onlyIdempotent
Execute one approved read-only GQL statement. Graph, analysis, and charts are independently configurable and default to enabled. Present all enabled results together: render a non-empty cytoscape-elements-v1 graph, render every non-empty vega-lite-v5 chart, and write a human-readable explanation from explanation_context. A table does not replace charts or the explanation.
| Name | Required | Description | Default |
|---|---|---|---|
| graph | No | ||
| max_rows | No | ||
| statement | Yes | ||
| render_mode | No | spec | |
| include_graph | No | ||
| include_charts | No | ||
| include_analysis | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| graph | No | Render this Cytoscape graph when enabled and its elements contain nodes or edges. |
| query | Yes | |
| table | Yes | |
| charts | No | Render every Vega-Lite chart in this list when charts are enabled and the list is non-empty; a table is not a chart replacement. |
| status | Yes | |
| profile | No | |
| analysis | No | Deterministic facts about the bounded returned rows when enabled. |
| truncation | Yes | |
| explanation_context | Yes | Use this evidence to write a human-readable explanation for every successful query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the safety profile is covered. The description adds genuine behavioral context beyond them: that graph, analysis and charts toggle independently, default enabled, and that a table must not be treated as a substitute for charts or the explanation. It does not mention pagination or row limits behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then the configuration semantics. The third sentence about presentation is longer than strictly needed, but the instruction is actionable rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and the description covers the toggle defaults and expected output composition. Remaining gaps are the semantics of statement, max_rows, and render_mode, which are minor for this query tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% across 7 parameters, so the description has to compensate. It clarifies the include_graph/include_charts/include_analysis toggles and their defaults, but leaves statement syntax, max_rows semantics, render_mode, and the purpose of the 'graph' string parameter unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (execute a read-only GQL statement) and implicitly routes away from the mutation sibling by emphasizing 'read-only' and 'approved'. An agent can distinguish this from nebula_execute_mutation without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The word 'approved' signals a workflow prerequisite (statements must be validated/approved first), and the description specifies how to present results once the query runs. It does not explicitly say when to prefer this over nebula_validate_gql or nebula_render_result, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nebula_get_graph_schemaCRead-onlyIdempotent
Read a Graph Type schema; optionally include a UTF-8 byte-bounded DDL string.
| Name | Required | Description | Default |
|---|---|---|---|
| schema | Yes | ||
| graph_type | Yes | ||
| include_ddl | No | ||
| max_ddl_bytes | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ddl | No | |
| schema | Yes | |
| status | Yes | |
| entities | Yes | |
| graph_type | Yes | |
| ddl_truncated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive behavior, lowering the burden on the description. The description adds the useful detail that DDL output can be optionally included and is UTF-8 byte-bounded, but does not explain what happens when max_ddl_bytes is exceeded or how the DDL string appears in the output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, compact sentence with no filler or repeated schema information. It front-loads the core operation and puts the optional behavior second, though it is perhaps too sparse to fully carry the 0% schema coverage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with two required parameters and no schema-level descriptions, the description is not complete enough to guide correct invocation. The presence of an output schema helps with return values, but the opaque 'schema' and 'graph_type' parameters and lack of sibling differentiation leave meaningful gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the missing parameter documentation. It provides a hint about include_ddl and max_ddl_bytes through the 'UTF-8 byte-bounded DDL string' phrase, but the required parameters 'schema' and 'graph_type' are left completely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: 'Read a Graph Type schema'. This clearly distinguishes it from mutation/execution siblings and signals it is a retrieval operation. However, 'Graph Type' is domain-specific and not expanded, so a less knowledgeable agent could still be unsure what object is being read.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to use this tool over siblings like nebula_list_graphs or nebula_execute_query. The description implies a read operation but does not state prerequisites, when it is appropriate, or when an alternative should be chosen.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nebula_list_environmentsARead-onlyIdempotent
List preconfigured environment names and the active environment; no credentials.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| active | Yes | |
| environments | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered structurally. The description adds one genuine behavioral fact beyond that — the call requires no credentials — but says nothing about freshness, caching, or the active-environment resolution semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; every clause (names, active environment, no credentials) carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description is not obliged to describe return values, and for a zero-param read-only list tool this is nearly sufficient. The only gap is the absence of routing context relative to the environment-related siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and schema coverage is 100%, so there is no parameter surface for the description to explain. Baseline for a parameterless tool is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (preconfigured environment names and the active environment), which is concrete and distinguishable from siblings like nebula_switch_environment or nebula_list_graphs. It does not explicitly name or differentiate against those siblings, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the discovery step before nebula_switch_environment, but no when-to-use or when-not-to-use guidance is given. The trailing 'no credentials' clause hints at when the call is safe/available but is not framed as usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nebula_list_graphsARead-onlyIdempotent
List persistent graphs before choosing schema and graph context.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| schema | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | Yes | |
| graphs | Yes | |
| offset | Yes | |
| status | Yes | |
| returned_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, covering the safety profile. The description adds the qualifier 'persistent graphs', which implies a distinction from temporary graphs. It does not mention pagination behavior (limit/offset) or the optional schema filter, but since annotations carry the main behavioral load, a baseline 3 is reasonable. It doesn't contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It states the core action and its usage context efficiently. Every word earns its place, making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While the tool is simple and has an output schema (reducing the need to describe return values), the description is incomplete due to the lack of parameter explanations and limited behavioral detail. It does not address the optional schema filter, which is a common source of confusion. The description provides only minimal context, which is insufficient for an agent to use the tool optimally, even with annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not mention any of the three parameters (limit, offset, schema). With low coverage, the description must compensate, but it completely fails to explain what these parameters control. An agent would have to rely solely on the schema, which may be insufficient for understanding the schema parameter's purpose. This is a critical gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('List persistent graphs') on a clear resource, and adds the context of being a preliminary step ('before choosing schema and graph context'). This clearly distinguishes it from siblings like nebula_get_graph_schema (which retrieves schema) and nebula_execute_query (which executes queries). The verb-resource pairing is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear 'when to use' signal ('before choosing schema and graph context'), which is helpful. However, it does not explicitly mention when not to use it or alternative tools, only implying its role as a precursor. A 4 is appropriate because it provides clear context but lacks explicit exclusions or alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nebula_render_graphARead-onlyIdempotent
Legacy compatibility entry; prefer nebula_render_result. Render a non-empty query graph together with its table, charts, explanation, and exact executed GQL. Explain specific findings, their meaning and limitations; counts alone are insufficient.
| Name | Required | Description | Default |
|---|---|---|---|
| result | Yes | ||
| explanation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| explanation | Yes | Explain result meaning and insights with concrete entities, directions, values and comparisons. Distinguish facts from hypotheses and state sampling/missing-data limits. Do not merely repeat row or path counts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds non-trivial behavioral context beyond that: the graph must be non-empty, and the explanation must address meaning and limitations rather than bare counts. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded: the legacy/deprecation status leads, then the scope of what is rendered, then the explanation requirement. Every clause carries information; nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a rendering tool whose output schema is rich, the description covers the essential contract: non-empty graph, all artifacts rendered, and explanation expectations. It is complete enough to invoke correctly, though it leaves the legacy fallback condition unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for two parameters, so the description must compensate. It does meaningfully for 'explanation' ('Explain specific findings, their meaning and limitations; counts alone are insufficient'), which tells the agent what content to supply. It gives no guidance for the 'result' payload beyond restating that it carries table/charts/graph, so the coverage is good but not complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (render) and resource (query graph plus table, charts, explanation, executed GQL), and explicitly distinguishes itself from the sibling nebula_render_result as a legacy compatibility entry. An agent can tell what this does and why it might be a second choice without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly routes agents to nebula_render_result with 'prefer nebula_render_result', giving a comparative context. However, it never states the condition under which the legacy entry should still be used, so the when-to-use guidance is incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nebula_render_resultARead-onlyIdempotent
Display a query result: graph entities open as an interactive graph, otherwise open the table. Supply an evidence-based explanation of result meaning, specific observations, insights and limitations, not only counts. Includes charts and actual GQL.
| Name | Required | Description | Default |
|---|---|---|---|
| result | Yes | ||
| explanation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| explanation | Yes | Explain result meaning and insights with concrete entities, directions, values and comparisons. Distinguish facts from hypotheses and state sampling/missing-data limits. Do not merely repeat row or path counts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds rendering behavior (graph vs table, charts, actual GQL) and the mandatory explanation content, but says nothing about input provenance or failure handling. Adds moderate value over the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences; the display behavior is front-loaded and the explanation mandate follows. Dense but every clause carries information, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A rich output schema ($defs for GraphSpec, TableResult, ChartSpec, ExplanationContext) means return values need not be explained, and the description correctly focuses on display behavior and the required explanation. The remaining gap is not tying the tool to nebula_execute_query as the source of 'result'.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage at the top level is 0%, so the description must carry the load. It does meaningfully characterize the 'explanation' parameter (evidence-based, observations, insights, limitations, not only counts), but adds almost nothing about what the 'result' parameter should contain, leaving half the parameters unexplained outside the nested $defs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Display a query result', plus the rendering branch (graph entities -> interactive graph, otherwise the table). It is clear what the tool does, but it never explicitly differentiates itself from the sibling nebula_render_graph, leaving the agent to infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives content requirements for the explanation ('not only counts') but no explicit when-to-use versus nebula_render_graph or indication that the result must come from nebula_execute_query. Usage is implied by the input shape rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nebula_select_graphA
Choose the user's graph using SESSION SET GRAPH in the existing database session. Automatically execute the last read-only query blocked by a missing graph. Return its result; do not execute that query again.
| Name | Required | Description | Default |
|---|---|---|---|
| graph | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| graph | Yes | |
| result | No | |
| session_statement | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false (mutation-like session change), idempotentHint=false (because it executes a pending query), and openWorldHint=true. The description adds critical behavioral context: it automatically executes the last read-only query blocked by a missing graph and returns its result, and warns against re-execution. It lacks details on what happens to the session state or error handling, but covers the main side effect well.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three concise sentences, each adding necessary information: the action, the automatic execution, and the warning. It is front-loaded with the primary purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has one parameter (undocumented in schema) and an output schema (so return values needn't be explained), the description provides enough context about the side effect and the session-based operation. However, it could clarify whether the graph parameter expects a name or an identifier, which would aid completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the single parameter 'graph' is only named. The description provides no additional semantics about the format of the graph identifier (e.g., name vs. ID), which a user might need. Baseline 3 is appropriate given the schema's lack of detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Choose the user's graph using SESSION SET GRAPH in the existing database session') and explicitly differentiates from sibling tools like nebula_execute_query by describing the side-effect of auto-executing a previously blocked query. An agent can immediately understand the tool's distinct purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: use when a query was blocked due to a missing graph. It also warns not to re-execute that query. However, it does not explicitly mention alternatives for setting graphs in other ways, though the session-based nature is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nebula_switch_environmentA
Switch to a preconfigured environment after testing its connection. Failure keeps the existing session. Success resets selected graph and pending query. Does not execute pending queries in the new environment or switch host MCP servers.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| config | Yes | |
| version | Yes | |
| connected | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only readOnlyHint=false and destructiveHint=false from annotations, the description carries real weight: it discloses that failure preserves the existing session, that success resets the selected graph and pending query, and that pending queries are not executed in the new environment. These are non-obvious state effects an agent needs before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, zero filler, with the core action front-loaded and the caveats following. Every sentence adds a distinct behavioral fact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. The description covers failure/success semantics and scope limits, which is most of what an agent needs; it is only thin on what a valid environment name looks like and whether invalid names fail loudly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% for the single 'name' parameter, so the description must compensate. "Preconfigured environment" implies that name is an environment identifier, which is meaningful but minimal; no format, valid values, or case/matching rules are provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource: switch to a preconfigured environment. It also bounds the action by stating what it does not do (does not execute pending queries or switch host MCP servers). It does not explicitly contrast itself with siblings like nebula_test_connection or nebula_list_environments, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"After testing its connection" implies this tool handles the connection test itself, which is useful implicit routing against nebula_test_connection, and the failure/success conditions give context. However, no alternative tool is named and no explicit when-not guidance is given, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nebula_test_connectionARead-onlyIdempotent
Test the configured YueShu connection and return only redacted settings.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| config | Yes | |
| version | Yes | |
| connected | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, open-world, and non-destructive behavior. The description adds value by disclosing that the response is redacted, which is a meaningful behavioral trait beyond the annotations. It does not contradict any annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler, front-loading the action ('Test') before the output detail ('return only redacted settings'). Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, an output schema present, and a clear one-sentence description, nothing essential is missing for an agent to invoke this tool correctly. The redaction note and connection-testing purpose fully cover the low-complexity context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema coverage is effectively complete, so there is no parameter burden for the description to carry. The baseline of 4 applies here because no parameter documentation is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Test') and identifies the resource ('configured YueShu connection'), then clarifies the scope of the response ('return only redacted settings'). This makes the tool's purpose immediately distinguishable from sibling tools like nebula_execute_query or nebula_get_graph_schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Test the configured YueShu connection' clearly implies use as a connectivity/health check before graph operations, and the sibling list reinforces that it is not for querying or schema work. It lacks explicit when-not-to-use statements or named alternatives, but the context is clear enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nebula_validate_gqlARead-onlyIdempotent
Validate YueShu 5.3 GQL for placeholders, dialect residuals, policy, and optional EXPLAIN. This never executes the original statement.
| Name | Required | Description | Default |
|---|---|---|---|
| graph | No | ||
| statement | Yes | ||
| run_explain | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| policy | Yes | |
| explain | No | |
| evidence | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly discloses that the original statement is never executed, which goes beyond the readOnlyHint annotation by ruling out even read-side execution. It also surfaces optional EXPLAIN behavior, which helps set expectations for the run_explain parameter. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler. Every phrase adds meaning, and the most important safety behavior is placed at the end for emphasis.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is strong on safety and purpose, and the output schema plus annotations reduce the need for return-value detail. However, for a 3-parameter tool with zero schema coverage, it leaves the 'graph' parameter unexplained and does not explicitly establish when to use validation versus execution.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the parameter-meaning burden. It does convey that 'statement' is the GQL being validated and hints at 'optional EXPLAIN' for run_explain, but it never explains the 'graph' parameter or specifies expected values for the validation dimensions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description opens with a specific verb, 'Validate,' and identifies the precise resource, 'YueShu 5.3 GQL,' along with concrete validation dimensions: placeholders, dialect residuals, policy, and optional EXPLAIN. This clearly distinguishes it from sibling execution-oriented tools such as nebula_execute_query.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The statement 'This never executes the original statement' clearly implies a safe validation use case and separates this tool from execution tools. However, it does not explicitly name alternatives or state when validation should be preferred over execution.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
7 tool updates
v0.1.4- Added
nebula_configure_connection - Changed
nebula_execute_query11 fields changed- added
Output schema / $defs / ProfileOutputAdded value: +{ + "additionalProperties": false, + "properties": { + "latency_us": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Latency Us" + }, + "operators": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "title": "Operators", + "type": "array" + }, + "truncated": { + "default": false, + "title": "Truncated", + "type": "boolean" + } + }, + "title": "ProfileOutput", + "type": "object" +} - added
Output schema / $defs / QueryMetadata / properties / connection_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Connection Id" +} - added
Output schema / $defs / QueryMetadata / properties / display_statementAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Display Statement" +} - added
Output schema / $defs / QueryMetadata / properties / environmentAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Environment" +} - added
Output schema / $defs / QueryMetadata / properties / executed_statementAdded value: +{ + "title": "Executed Statement", + "type": "string" +} - changed
Output schema / $defs / QueryMetadata / requiredPrevious value: -[ - "statement", - "graph", - "validation" -]New value: +[ + "statement", + "executed_statement", + "graph", + "validation" +] - added
Output schema / properties / analysis / descriptionAdded value: +"Deterministic facts about the bounded returned rows when enabled." - added
Output schema / properties / charts / descriptionAdded value: +"Render every Vega-Lite chart in this list when charts are enabled and the list is non-empty; a table is not a chart replacement." - added
Output schema / properties / explanation_context / descriptionAdded value: +"Use this evidence to write a human-readable explanation for every successful query." - added
Output schema / properties / graph / descriptionAdded value: +"Render this Cytoscape graph when enabled and its elements contain nodes or edges." - added
Output schema / properties / profileAdded value: +{ + "anyOf": [ + { + "$ref": "#/$defs/ProfileOutput" + }, + { + "type": "null" + } + ], + "default": null +}
- Added
nebula_list_environments - Added
nebula_render_graph - Added
nebula_render_result - Added
nebula_select_graph - Added
nebula_switch_environment
6 tool updates
v0.1.3- First observed
nebula_execute_mutation - First observed
nebula_execute_query - First observed
nebula_get_graph_schema - First observed
nebula_list_graphs - First observed
nebula_test_connection - First observed
nebula_validate_gql
TDQS
Scored across 12 tools
Tools mostly target distinct resources and actions: environment listing, connection setup/testing, graph listing/selection, schema retrieval, GQL validation, read execution, mutation execution, and rendering. However, nebula_render_graph is explicitly a legacy alias of nebula_render_result, and nebula_execute_query also renders results, creating mild ambiguity about when to use render_result separately. The descriptions mitigate but do not fully eliminate this overlap.
All 12 tools use consistent snake_case with a nebula_ prefix and a verb_noun pattern: list_environments, select_graph, execute_query, validate_gql, etc. There is no mixing of conventions or vague verb styles.
12 tools sit well within the 3-15 sweet spot for a graph database MCP. Each tool covers a distinct operational area (connection, environment, graph selection, schema, validation, execution, mutation, rendering) without excessive redundancy.
The surface covers connection and environment setup, graph listing and selection, schema retrieval, GQL validation, read query execution, mutation execution, and result rendering. Minor gaps exist for explicit graph creation/deletion or query cancellation, but the core query lifecycle is well covered and mutations may handle DDL.
Maintenance
Related MCP Connectors
Repository knowledge graph MCP server for codebase understanding and debugging.
Token-free MCP server for structured RevoGrid Core, Pro, and Enterprise knowledge retrieval.
The Grafbase MCP server sits in front of a GraphQL API and exposes an MCP protocol-compliant interface that allows AI agents and LLMs to explore and query GraphQL APIs using natural language. It provides tools to search schemas, introspect types and fields, and execute GraphQL queries while minimizing context bloat by returning only relevant schema subsets, with built-in support for authentication, authorization, and configurable access control.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA MCP server that exposes GraphQL schema information to LLMs like Claude. This server allows an LLM to explore and understand large GraphQL schemas through a set of specialized tools, without needing to load the whole schema into the context59 npm46MIT
- AlicenseAqualityDmaintenanceGraphQL MCP Server that acts as a bridge allowing MCP clients (like Cursor or Claude Desktop) to interact with target GraphQL APIs through standard tools for schema introspection and operation execution.210 npm3MIT
- AlicenseNot gradedqualityAmaintenanceA high-performance code knowledge graph server implementing MCP, indexing codebases into a structured AST knowledge graph with semantic search, call graph traversal, and HTTP route tracing.3,890 npm83MIT
- AlicenseNot gradedqualityDmaintenanceA Node.js server that enables LLMs to inspect GraphQL schemas and retrieve information about queries, mutations, and types via MCP.9 npm1MIT