solarnetwork
solarnetwork-mcp
一个 MCP 服务器,将 SolarNetwork 太阳能遥测数据转化为 AI 代理可以调用的工具。
无需凭据。 它运行在 SolarNetwork 的公共端点上,那里有约 52 个实时太阳能站点发布真实的发电量、辐照度和天气数据——其中几个每分钟更新,并拥有六年的历史数据。
它能做什么
读取太阳能遥测数据
无需凭据即可发现公共节点,可按时区或活跃度筛选
对站点上的每条数据流进行分类:站点电表、逆变器、辐照度、天气、ML 异常
以从五分钟到一年的任意聚合粒度查询时间序列
从电表读数获取真正的累计能量,而非平均功率
检查数据流是否仍然活跃,基于时间戳而非数值
发现设备故障,并给出日期
检测逆变器停机,并精确锁定开始和结束的日期
区分死设备与仍在发电但未上报功率的设备
捕捉某设备已静默而其兄弟设备仍在上报的情况
标记电表计数器重置,这会静默破坏跨越重置点的所有能量总计
发现从未存在过的硬件的注册表条目
估算每个故障造成的能量损失,按各设备自身容量从兄弟设备输出进行缩放
不产生误报
检测是相对同侪的,因此云层遮挡不会被视为故障
在存在日射强度计的情况下,辐照度被用作物理天气对照
窗口打开时已在运行的故障被标记为下限,而非虚构的开始日期
无法评估的站点被报告为 未评估,绝不会报告为健康
编写人们可以采取行动的报告
优先排序的工作订单,包含通俗易懂的原因、证据、编号步骤、工具和验收标准
可打印的 PDF 现场资料包,带有复选框和备注页
Markdown 格式便于粘贴到工单中,或 JSON 格式便于后处理
全程纯 ASCII,确保在 PDF 或工单系统中不会出现乱码
Related MCP server: EnergyAtIt MCP Server
它不能做什么
在依赖它之前值得了解:
少于两个逆变器的站点无法评估。 同侪比较需要同侪。工具会明确说明,而不是报告干净的结果。
没有铭牌额定值。 公共节点不暴露这些数据,因此损失数字是同侪缩放的估计值,而非保修计算。
故障检测基于每日桶。 静默六小时的设备是不可见的。
数据流分类依赖于路径约定。 将数据流命名为
Main或SMAInverter1的站点将返回未分类。
它实际做什么
没有它,回答 “这个站点有什么问题吗?” 需要知道节点 ID、/datum/list 端点、存在 aggregation=Day、watts 和 wattHours 是不同的查询,然后阅读 JSON。
有了它,你只需问:
“节点 1000 有什么问题吗?如果输出下降,告诉我是因为天气还是设备。”
代理会发现站点的数据流,选择日期范围,运行聚合,将每个逆变器与其兄弟设备进行比较,并用英语回答。一句话输入,一份诊断输出。
服务器处理语言模型不擅长的部分——请求签名、分页、单位语义、知道九个数据流中哪一个是天气传感器。代理处理它擅长的部分——决定问什么并解释答案。
60 秒内看到它工作
npm install && npm run build && npm run smoke这通过真实的 MCP 协议驱动所有工具,针对实时数据。无需代理、无需 API 密钥、无需配置。如果它为节点 1000 打印了发现结果,你就没问题了。
把它交给你的代理
将下面的整个块复制到 Claude Code、Cursor 或任何支持 MCP 的代理中。它会安装服务器、自行配置、证明安装成功,然后针对实时公共太阳能站点运行每项能力的引导演示。
Set up and demo the solarnetwork MCP server for me.
1. INSTALL
git clone https://github.com/gopisrikrishna/solarnetwork-mcp.git
cd solarnetwork-mcp
npm install
npm run build
2. VERIFY THE INSTALL
Run: npm run verify
This runs 28 assertions against live public solar data. No credentials needed.
Tell me how many passed. If any fail, show me which and stop.
3. CONNECT IT
Register the server with yourself over stdio:
command: node
args: ./dist/index.js (run from the solarnetwork-mcp directory)
The repo ships a .mcp.json that already does this. Restart/reconnect if your
client needs it, then confirm you can see 10 tools and list their names.
4. DEMO IT
Work through these against real public nodes and show me what you find.
Explain your reasoning at each step, do not just dump JSON.
a) DISCOVERY
Which public nodes are live in US timezones? Then: what does node 1000
measure, and how far back does its data go?
b) ENERGY
How much did node 1000 generate in July 2026? Use the right tool for a
billing-shaped question and tell me why you chose it.
c) FAULT DETECTION <- the interesting one
Run an asset review on node 1000 for 2026-01-01 to 2026-09-01.
Tell me what broke, exactly when it started and ended, and what it cost.
There is a real 79-day inverter outage in there, and a second fault where
a device reports 0 watts while still generating. Explain the difference
between those two failure modes and why it matters.
d) NOT BEING FOOLED
Run an asset review on node 949 for July 2026. It will find nothing.
Explain why "no faults found" does NOT mean the site is healthy here.
e) DATA INTEGRITY
Run an asset review on node 781 for 2026-01-01 to 2026-09-01.
Its site meter counter reset mid-year. Show me how the tool handles it and
what would have gone wrong without that handling.
f) CROSS-CHECK
Node 392 publishes the platform's own ML anomaly streams. Compare what
get_anomalies says against what the asset review found. Do they agree?
g) REPORT
Generate a PDF service report for node 1000 over the same window, written
for an on-site technician. Save it and tell me the path, how many pages,
and summarise the priority 1 jobs.
5. WRAP UP
Tell me in plain language: what is wrong with node 1000, how much energy has
been lost, and what you would send a technician to do first.自行验证
因为它运行在公共数据上,你不必相信它的任何结论。每项发现都可以从你自己的机器上独立复现:
npm install && npm run build && npm run verify针对实时公共节点上的固定历史窗口进行 28 项断言。无需凭据。其中包括:
检查 | 节点 | 期望 |
故障时间线 | 1000 | 逆变器 1 停机,恰好 2026-05-17 至 2026-08-03,79 天 |
遥测故障 | 1000 | 逆变器 4 自 2026-03-25 起报告 0 W,但仍处于发电状态 |
分页 | 1000 | 一年超过 SolarQuery 的 1000 行页上限;每一行都被获取 |
电表完整性 | 781 | 计数器重置被标记,站点能量从未报告为负值 |
电表完整性 | 900 | 计数器重置精确定位到 2026-06-03 |
覆盖诚实性 | 949 | 没有逆变器的节点报告“未评估”,绝不报告“健康” |
站点电表选择 | 464 | 真实电表胜过遗留的 |
报告输出 | 1000 | 工作订单、验收标准、仅纯 ASCII |
失败意味着服务器回归,或 SolarNetwork 重述了历史。每项断言都会打印期望值与实际值,因此两者很容易区分。
加载到你的代理中
每个客户端都想要相同的三个事实:运行 node,传入 dist/index.js,通过 stdio 通信。只有文件位置不同。
使用你机器上 dist/index.js 的绝对路径。正斜杠在 Windows 上也适用。
这里提交的 .mcp.json 使用相对路径,这样任何克隆仓库的人都能在不编辑任何内容的情况下获得可用的服务器。这仅适用于从项目根目录启动服务器的客户端,Claude Code 就是这样做的;其他客户端可能需要绝对形式。
Claude Code
已配置——.mcp.json 位于仓库根目录,因此在此目录中启动的会话会自动拾取它。只需编辑路径:
{
"mcpServers": {
"solarnetwork": {
"command": "node",
"args": ["/absolute/path/to/solarnetwork-mcp/dist/index.js"]
}
}
}或从任何位置全局注册:
claude mcp add solarnetwork -- node /absolute/path/to/solarnetwork-mcp/dist/index.jsClaude Desktop
编辑 claude_desktop_config.json:
macOS —
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows —
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"solarnetwork": {
"command": "node",
"args": ["/absolute/path/to/solarnetwork-mcp/dist/index.js"]
}
}
}重启应用。消息框中会出现一个工具图标。
Cursor
项目中的 .cursor/mcp.json,或用于所有项目的 ~/.cursor/mcp.json。与上述相同的 mcpServers 块。
Windsurf
~/.codeium/windsurf/mcp_config.json。与上述相同的 mcpServers 块。
VS Code(Copilot 代理模式)
.vscode/mcp.json — 注意键是 servers,而不是 mcpServers:
{
"servers": {
"solarnetwork": {
"type": "stdio",
"command": "node",
"args": ["/absolute/path/to/solarnetwork-mcp/dist/index.js"]
}
}
}Zed
在 settings.json 中,位于 context_servers 下:
{
"context_servers": {
"solarnetwork": {
"command": { "path": "node", "args": ["/absolute/path/to/dist/index.js"] }
}
}
}其他任何客户端
任何 MCP 客户端都可以通过 stdio 启动它:
node /absolute/path/to/solarnetwork-mcp/dist/index.js要从代码驱动它,scripts/smoke.mjs 是一个使用官方 TypeScript SDK 的完整示例。
检查它是否已加载
问你的代理:“你有哪些太阳能工具?” 你应该看到十个。如果没有,常见原因是相对路径、缺少 npm run build,或客户端未重启。
工具
发现
工具 | 回答 |
| “我可以查看哪些节点?” |
| “这个节点测量什么?” |
| “现在发生了什么?” |
数据
工具 | 回答 |
| “显示我这一时期的输出” |
| “它实际生成了多少千瓦时?” |
分析
工具 | 回答 |
| “什么坏了,何时开始,代价是什么?” |
| “现在有什么问题吗,天气还是设备?” |
| “我的哪些站点需要优先关注?” |
| “平台自己的 ML 检测器怎么说?” |
报告
工具 | 回答 |
| “给我一份可以交给技术员的工作订单” |
可以问它的问题
从这里开始——这些是真实的、活跃的节点:
方向
哪些公共 SolarNetwork 节点在美国时区活跃?
节点 1000 测量什么,它的数据能回溯多远?
现在
节点 892 现在正在生成什么,那里的天气如何?
节点 892 带有天气传感器和日射强度计,因此代理除了输出外还能获得温度、云量和辐照度。
诊断 — 有趣的那些
节点 1000 有什么问题吗?
节点 892 列出了六个逆变器,但我看不到发电量。发生了什么?
车队
按上周输出对节点 880、884、953、964、976、987 和 1000 进行排名。我应该先看哪个?
多步骤,其中链式调用展示了能力
找到一个至少有四个逆变器和辐照度数据的活跃美国节点,然后诊断它过去两周的情况。
你得到什么
来自 diagnose_site 对节点 1000 的真实输出:
[high] reporting-gap /0145/S1/G1/GEN/101, /102, /103
Registered on this node but returned no data for the window. That is a
reporting or comms outage rather than a performance problem, so the
device may well be generating.
[low] inconsistent-instrumentation /0145/S1/G1/INV/4
Reports 0 W, but its `wh` field is non-zero (peak 16508), so it is moving
energy. This device populates energy fields only, unlike its peers, so
power-based comparison would wrongly read it as dead.第二个发现是整个项目的重点。INV/4 读取 0 W,而其三个兄弟设备产生 400–700 W,这看起来完全像一个死逆变器——这个工具的早期版本也这么说过。它并没有死:它的电表那个月累计了 826 kWh。一个站点的逆变器使用不同的上报约定。仅基于 watts 的健康检查会每晚就一个正常工作的逆变器呼叫某人。
你自己的节点
设置两个环境变量,服务器就会从公共 /pub 端点切换到经过身份验证的 /sec 端点。工具表面不变:
SN_TOKEN_ID=... SN_TOKEN_SECRET=... node dist/index.js认证是 SolarNetwork 的 SNWS2 方案——对规范化请求进行 HMAC-SHA256,并使用日期范围的密钥。它已实现但未经测试;我没有令牌对来验证。
工作原理
三个文件,总共约 900 行:
src/solarnetwork.ts— API 客户端、分页、请求签名src/analysis.ts— 源 ID 解析、按站点诊断src/index.ts— 十个工具定义
工具的描述是真正的接口。只有当描述说明何时使用每个工具时,代理才能正确链式调用 list_sources → query_datum。措辞的正确性比任何数据处理都更能决定这个项目是否有效。
限制
公共节点上的节点元数据为空,因此没有铭牌容量,也就没有容量归一化比较。
compare_fleet对原始输出进行排名并说明这一点——大型站点会排在小而健康的站点之前。list_public_nodes读取的是时间点扫描(data/nodes.json),而非实时列表。在依赖某个节点之前,请调用list_sources确认。没有缓存。重复的代理调用会重新访问 API。
没有单元测试。
scripts/smoke.mjs是一个实时探针,而非测试套件。SolarQuery 会静默地将超过约 7 天范围的细粒度聚合强制转换为小时级。
query_datum会按原样传递你的聚合参数,因此长范围会返回比请求更粗的数据。
更多细节:USAGE.md 包含示例和努力比较,DATA.md 包含公共与凭据门控内容的完整清单。
许可证
专有 / 保留所有权利。详情请参阅 LICENSE。
Available Tools
10 toolsasset_reviewReview a site as an asset managerA
Walk a site's day-by-day record and return every fault as a dated event: what broke, when it started, when it ended, how long it ran and how much energy it cost. Use this for 'what is wrong with this site', 'when did it start', 'how much has this cost us' and anything feeding a work order. Prefer this over diagnose_site for any window longer than a few days: diagnose_site reduces each source to one window mean, so a fault that started or ended part way through is invisible to it. Detection is peer-relative, so bad weather never raises an event.
| Name | Required | Description | Default |
|---|---|---|---|
| nodeId | Yes | SolarNetwork node ID | |
| endDate | Yes | Exclusive end, YYYY-MM-DD | |
| startDate | Yes | Inclusive start, YYYY-MM-DD |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden, and it does so well: it reveals that detection is peer-relative, that bad weather never raises an event, and that each fault is returned as a dated event with duration and energy cost. It does not cover pagination, limits, or permission requirements, but the core behavioral model is clearly disclosed.
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 dense but efficient: it front-loads the core behavior, then gives use cases, then the competing-tool routing, then a key detection caveat. Every sentence earns its place and none are redundant.
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 read-style tool with no output schema and no annotations, the description explains the return value sufficiently by listing what each fault event contains. It also handles the main ambiguity around long windows and weather-related false positives. Minor gaps remain around output format details and explicit read-only labeling, but the description is largely complete for correct invocation.
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 100% for all three parameters, and the schema already explains nodeId, startDate, and endDate semantics. The description adds context about the 'day-by-day record' and the window-length preference, but does not add substantial parameter-level meaning beyond the schema, so a baseline 3 is appropriate.
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 and output: 'Walk a site's day-by-day record and return every fault as a dated event' with clear event fields. It also explicitly distinguishes itself from diagnose_site by explaining what diagnose_site cannot see, so an agent can tell them apart.
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?
Provides explicit use cases: 'what is wrong with this site', 'when did it start', 'how much has this cost us', and work-order feeds. It also gives a direct routing rule: 'Prefer this over diagnose_site for any window longer than a few days' with a concrete reason.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_fleetCompare sites across the fleetA
Compare several nodes over the same date range and rank them by output, in a single query. Use for portfolio-level questions: which sites are underperforming, how does this site compare to the rest, which node should I look at first.
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | Yes | Exclusive end, YYYY-MM-DD | |
| nodeIds | Yes | Node IDs to compare, at least two | |
| startDate | Yes | Inclusive start, YYYY-MM-DD | |
| aggregation | No | Roll-up period | Day |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full behavioral burden. It does disclose that the tool ranks nodes by output, but it doesn't explicitly state the operation is read-only or describe any side effects, rate limits, or edge-case behaviors (e.g., what happens when nodes have missing data). The core ranking behavior is clear, but additional transparency would be valuable.
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 two sentences, front-loaded with the primary action and scope, followed by concrete use cases. Every sentence contributes purpose and context without redundancy. It is appropriately concise.
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?
There is no output schema, so the description should explain what the tool returns. It mentions 'rank them by output' but doesn't specify the format (e.g., a table, list, metric) or how the aggregation parameter affects the ranking. It also doesn't mention limits on the number of nodes or date-range constraints beyond the schema. For a comparison tool, more detail on the output shape is needed.
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 100%, so all parameters have description in the schema. The tool description adds the context of a shared date range and ranking by output, but it doesn't add syntax, format, or interaction details beyond the schema. This matches the baseline for full schema coverage.
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 ('Compare', 'rank') and resource ('several nodes'), with a clear scope (same date range, single query). It distinguishes itself from likely siblings like query_datum or get_energy by emphasizing cross-node comparison and ranking, so an agent can immediately tell what this tool does.
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 offers concrete use cases ('which sites are underperforming, how does this site compare to the rest, which node should I look at first') that clarify when to use it. However, it doesn't explicitly state when NOT to use it or name alternative tools for single-node queries, so it's clear on the 'when' but not on the 'when-not'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_service_reportCreate a field service reportA
Turn a site's faults into a service request that a person can act on: prioritised jobs, each with what happened in plain language, the evidence behind it, numbered steps for site, the tools needed and explicit sign-off criteria. Runs asset_review internally, so call this directly rather than reviewing first. Use format 'pdf' for a printable field pack, 'markdown' to paste into a ticket, or 'json' to post-process.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Output format | |
| nodeId | Yes | SolarNetwork node ID | |
| endDate | Yes | Exclusive end, YYYY-MM-DD | |
| raisedOn | No | Date on the report, YYYY-MM-DD. Defaults to the window end. | |
| reference | No | Your own service request number. One is generated if omitted. | |
| startDate | Yes | Inclusive start, YYYY-MM-DD | |
| outputPath | No | Where to write the PDF. Required when format is 'pdf'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that the tool runs asset_review internally and that a reference is auto-generated if omitted, which are valuable behaviors. However, it does not clarify whether the tool is a pure read/compute or writes persistent data, despite an outputPath parameter that implies file writing. It also omits any error or side-effect details. This partial transparency earns a 3.
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 three-sentence description is compact and front-loaded. The first sentence states the core purpose and output content; the second covers the internal-call routing; the third explains format semantics. Every sentence earns its place with no fluff or redundancy.
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 annotations and no output schema, the description must be self-sufficient. It covers the report’s structure, the internal call, and format interpretations. It does not describe error scenarios or return values, but given the tool is a generator that writes files, the basics are covered. The presence of an outputPath parameter and its schema description already conveys the write behavior, so the description is adequately complete.
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 100%, so the baseline is 3. The description adds value by explaining the meaning of each format beyond the enum: 'pdf' for a printable field pack, 'markdown' to paste into a ticket, and 'json' to post-process. This directly helps the agent pick the right format. No other parameters are elaborated in the description, but their schema descriptions are sufficient.
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 opens with a clear, specific purpose: 'Turn a site's faults into a service request that a person can act on' and enumerates the report's constituents (prioritised jobs, plain-language account, evidence, steps, tools, sign-off criteria). It also names a sibling (asset_review) and explicitly tells the agent to call this tool instead, making the differentiation explicit.
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 direct usage guidance: 'Runs asset_review internally, so call this directly rather than reviewing first' tells the agent when to prefer this over the sibling. It also explains the three format options with their intended use cases (pdf for printable pack, markdown for ticketing, json for post-processing). It does not spell out exclusions for other siblings, 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.
diagnose_siteDiagnose site faultsA
Diagnose a solar site over a date range by comparing each inverter against its own siblings, with irradiance as the weather control. Distinguishes a dead inverter (reporting but producing zero) from a reporting gap (producing but not reporting) from ordinary bad weather (everything down, irradiance also down). This is the right tool for 'is anything wrong at this site', 'which inverter is broken', or 'why did output drop'.
| Name | Required | Description | Default |
|---|---|---|---|
| nodeId | Yes | SolarNetwork node ID | |
| endDate | Yes | Exclusive end, YYYY-MM-DD | |
| startDate | Yes | Inclusive start, YYYY-MM-DD | |
| aggregation | No | Roll-up period | Day |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the behavioral burden. It reveals the comparison logic, the weather-control mechanism (irradiance), and the three mutually exclusive diagnoses (dead inverter, reporting gap, bad weather). This is rich, actionable context far beyond a typical one-liner.
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 sentences with zero fluff. The methodology is front-loaded, followed by the fault distinctions, then the practical usage examples. Every sentence contributes to the agent's understanding.
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 covers the core algorithm and use cases, which is the essential knowledge for calling this diagnostic tool. However, with no output schema present, it does not explicitly state what the tool returns or mention any prerequisites beyond the parameters. The missing return format is a minor gap.
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 100% with clear parameter descriptions (nodeId, inclusive/exclusive dates, aggregation enum). The description only references 'a date range' and does not add semantic meaning beyond the schema, so the baseline 3 applies.
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 ('Diagnose') with a precise resource ('solar site') and method ('comparing each inverter against its own siblings, with irradiance as the weather control'). It further enumerates three distinct fault outcomes, clearly differentiating it from generic tools like get_anomalies or compare_fleet.
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 when-to-use scenarios: 'is anything wrong at this site', 'which inverter is broken', or 'why did output drop'. It does not, however, name alternatives or state when not to use the tool, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_anomaliesRead anomaly detection outputA
Read the output of the platform's own ML anomaly detector for a node, where one is published. Each reading carries the predicted value, the actual value, the error between them, the irradiance at the time and an ANOMALY/NOMINAL status. Use this when you want the platform's own verdict rather than computing one yourself, and to cross-check what diagnose_site concluded. Node 392 is a public example.
| Name | Required | Description | Default |
|---|---|---|---|
| nodeId | Yes | SolarNetwork node ID | |
| endDate | No | Exclusive end, YYYY-MM-DD | |
| startDate | No | Inclusive start, YYYY-MM-DD. Omit for the latest readings |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly indicates this is a read operation, scoped to nodes where an anomaly output is published, and enumerates the contents of each reading (predicted value, actual value, error, irradiance, ANOMALY/NOMINAL status). It does not state what happens when no output is published or whether results are ordered, which are minor gaps for a read-only tool.
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 sentences, each adding value: the first defines the operation and scope, the second specifies the returned fields, and the third gives usage context plus a concrete example. There is no padding, and the essential information is front-loaded.
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 simple three-parameter read tool with no output schema, the description adequately covers the return contents and gives a sibling reference for cross-checking. It could additionally state the behavior when no anomaly output is published, but overall the description is sufficient for an agent to call the tool correctly with the schema's help.
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 100%, with descriptions for nodeId, startDate, and endDate already present. The tool description adds context about the readings but does not enhance parameter-level meaning beyond the schema, such as date range interpretation or the effect of omitting startDate. Baseline 3 is appropriate because the schema already documents the parameters.
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 opens with a specific verb and resource: "Read the output of the platform's own ML anomaly detector for a node." It clearly distinguishes this from siblings by emphasizing the platform's own ML verdict, and later contrasts it with computing one's own verdict and with diagnose_site. An agent can tell exactly what this tool does and what it does not do.
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 explicitly states when to use the tool: "Use this when you want the platform's own verdict rather than computing one yourself, and to cross-check what diagnose_site concluded." It names the alternative (diagnose_site) and provides a decision rule, plus a concrete public example node for testing. This is strong routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_energyGet accumulated energyA
Get true accumulated energy (watt-hours) between two dates from meter readings, rather than averaging instantaneous power. Use this for 'how much did this site generate' questions, and for anything reporting- or billing-shaped, because averaging watts loses accuracy on accumulating properties.
| Name | Required | Description | Default |
|---|---|---|---|
| nodeIds | Yes | Node IDs | |
| sourceIds | No | Restrict to these source IDs; omit for all sources | |
| readingType | No | Difference is the usual choice for energy over a period | Difference |
| localEndDate | Yes | Exclusive end in node-local time, YYYY-MM-DDTHH:mm | |
| localStartDate | Yes | Inclusive start in node-local time, YYYY-MM-DDTHH:mm |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that this tool computes from meter readings rather than averaging instantaneous power, which is a key behavioral trait. However, it does not describe the response shape, how missing readings are handled, or whether results are summed across multiple node IDs. For a no-annotation tool, this is adequate but with room to add more behavioral context.
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 sentences, no wasted words. The core purpose and key differentiator are front-loaded, and the usage guidance follows naturally. 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?
For a tool with 5 parameters, no output schema, and no annotations, the description gives purpose, usage context, and a critical behavioral distinction. It does not explain the return value, but for a reporting-oriented tool, this is a notable gap. Still, the description is strong enough that an agent can decide when to use it and what to expect conceptually.
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 input schema covers all parameters with descriptions (100% coverage), so the baseline is 3. The description adds a little semantic value by explaining why 'Difference' is the usual reading type, which helps an agent understand the default parameter. However, it does not go into detail about the date format or node-local time, which is already in the schema.
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 ('Get true accumulated energy') with a precise resource ('meter readings') and unit ('watt-hours'). It explicitly contrasts with averaging instantaneous power, distinguishing it from siblings like get_latest and query_datum without needing to open their schemas.
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 explicitly says when to use it: for 'how much did this site generate' questions and reporting/billing-shaped needs. It also gives a reason (averaging loses accuracy). It does not explicitly name alternative tools to use instead, but the context signals and sibling list imply there are other query tools, so the guidance is clear but not fully exclusionary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_latestGet latest readingsA
Get the most recent reading for each source on a node, including weather and irradiance where available. Use this for 'what is happening right now' and to check whether a stream is still live. Note that generation is legitimately zero at night.
| Name | Required | Description | Default |
|---|---|---|---|
| nodeId | Yes | SolarNetwork node ID | |
| sourceIds | No | Restrict to these source IDs; omit for all sources |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It adds useful interpretation beyond the schema by noting that generation is legitimately zero at night and that weather/irradiance are included where available. This helps the agent avoid misreading valid nighttime data as a failure.
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 short sentences, each earning its place: the first states the core behavior, the second gives the primary use case, and the third provides a critical interpretation caveat. It is front-loaded and free of 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 simple read-style tool with two well-documented parameters and no output schema, the description is largely complete. It explains purpose, when to use it, and a key data-interpretation nuance. A small gap is that it does not describe what happens when no recent reading exists or how to interpret missing sources, but this is minor.
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 100%, so the schema already documents nodeId and sourceIds. The description reinforces the per-source aggregation concept and the optional restriction to specific source IDs, but does not need to add substantial parameter-level 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 clearly states the tool retrieves the most recent reading per source on a node, including weather and irradiance when available. This distinguishes it from siblings like query_datum or get_energy by focusing on latest status rather than history or aggregates.
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 explicitly tells the agent when to use it: for 'what is happening right now' and for checking if a stream is still live. It does not explicitly name alternatives or exclusion criteria, but the context is clear enough for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_public_nodesList known public nodesA
List SolarNetwork nodes known to be readable without credentials, from a catalogue built by scanning node IDs 1-5000. Use this first when you do not have a node ID in hand, since there is no public endpoint that enumerates nodes. Filter to live nodes to avoid ones that stopped reporting years ago.
| Name | Required | Description | Default |
|---|---|---|---|
| liveOnly | No | Only nodes with data since 2026-08-01 | |
| timeZone | No | Filter by IANA timezone substring, e.g. 'America' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that nodes are readable without credentials, that the catalogue comes from scanning IDs 1-5000, and that dead nodes should be filtered to avoid stale data. It does not mention output format or rate limits, but these are less critical for a simple list operation.
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 sentences: purpose, usage guidance, and filtering tip. Every sentence earns its place, with the core behavior front-loaded and no wasted words.
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 two optional parameters and no output schema, the description adequately covers purpose, scope, and usage. It could mention what fields are returned or how results are ordered, but an agent can invoke the tool correctly with the information provided.
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 100%, so the baseline is 3. The description adds a rationale for the liveOnly parameter ('avoid ones that stopped reporting years ago') but does not add new meaning for either parameter beyond what the schema already provides.
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 states the tool lists SolarNetwork nodes that are publicly readable, sourced from a catalogue built by scanning node IDs 1-5000. This is a specific verb+resource and differentiates it from sibling tools that operate on known nodes or sources.
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 explicitly instructs to use this tool first when no node ID is available, and explains why (no public endpoint that enumerates nodes). It also advises filtering to live nodes to avoid stale entries, but it does not name alternative tools for when a node ID is already known.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sourcesList node sourcesA
List the streams reporting on a SolarNetwork node, classified by what they measure: GEN (site generation meter), INV (individual inverter), PYR (pyranometer, i.e. solar irradiance), WEA (weather). Also returns the node's data window and timezone. Always start here when you do not already know what a node measures.
| Name | Required | Description | Default |
|---|---|---|---|
| nodeId | Yes | SolarNetwork node ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly indicates a read-only listing operation ('List'), explains the classification logic, and additionally discloses that it returns the node's data window and timezone, which is beyond a simple listing. It does not mention error conditions or rate limits, but for a simple retrieval tool this is acceptable.
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 two sentences, both of which are purposeful. The first sentence front-loads the core function and classification details, the second provides a usage directive. There is no fluff or redundancy, and each 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?
For a tool with a single parameter, no output schema, and no annotations, the description covers all necessary aspects: what it does, what it returns (streams classification, data window, timezone), and when to use it. Nothing essential is missing for an agent to correctly invoke this 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?
The schema description coverage is 100% (nodeId is fully described as 'SolarNetwork node ID'). The tool description does not add any additional meaning to the parameter beyond what the schema already provides. Per the baseline rule, when schema coverage is high, a score of 3 is appropriate.
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 ('List') and resource ('streams reporting on a SolarNetwork node') and details the classification categories (GEN, INV, PYR, WEA). This clearly distinguishes it from sibling tools like get_latest or query_datum, which focus on data retrieval rather than listing structural information about a node.
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 usage guidance: 'Always start here when you do not already know what a node measures.' This tells the agent the exact trigger condition for using this tool and implies that if the node's measurements are already known, other tools may be more suitable. While it doesn't name specific alternatives, the contextual cue is strong and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_datumQuery time-series datumA
Query time-series data over a date range, rolled up by an aggregation period. Accepts multiple nodes at once. Returns one series per source with mean power, total energy and mean irradiance. Use Day for week-to-month questions, Hour or FifteenMinute to inspect a single day's shape, and Month for year-scale trends. Note that watts is averaged power; for true energy totals use get_energy instead.
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | Yes | Exclusive end, YYYY-MM-DD | |
| nodeIds | Yes | One or more SolarNetwork node IDs | |
| sourceIds | No | Restrict to these source IDs; omit for all sources | |
| startDate | Yes | Inclusive start, YYYY-MM-DD | |
| aggregation | No | Roll-up period | Day |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries the burden of behavioral disclosure. It discloses that 'watts' is averaged power (not total) and points to get_energy for true totals, which is a meaningful behavioral nuance. However, it doesn't mention whether the tool is read-only or any potential side effects, though as a query that is implied. It could also disclose behavior around multiple sources or response size, but the key nuance is covered.
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 concise, front-loaded with the core purpose, and every sentence adds value. It packs essential information into three sentences with no fluff, and the alternative tool reference is clearly positioned at the end. Structure is effective for quick agent parsing.
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 query tool with 5 parameters all documented, no output schema (so the description's summary of returned metrics is essential), and guidance on parameter selection, the description is complete. It covers what the tool does, how to use it, and where to go for alternative functionality. There are no missing pieces an agent would need to call it correctly.
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 schema covers all parameters with descriptions (100% coverage), so baseline is 3. The description adds value by providing aggregation selection guidance (Day, Hour, Month) that goes beyond the enum values, effectively helping the agent choose the right parameter value. It also clarifies the semantics of the 'watts' output, which is related to the data returned. This elevates it above the baseline.
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 states the tool queries time-series data over a date range with aggregation, accepts multiple nodes, and returns specific metrics (mean power, total energy, mean irradiance). It uses specific verbs and resources, and distinguishes itself from get_energy by clarifying the difference between averaged power and true energy totals.
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 provides explicit guidance on when to use different aggregation periods (Day for week-to-month, Hour/FifteenMinute for single-day shape, Month for year trends) and explicitly names an alternative tool (get_energy) for energy totals, telling the agent when NOT to use this tool.
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.
10 tool updates
v0.3.0- First observed
asset_review - First observed
compare_fleet - First observed
create_service_report - First observed
diagnose_site - First observed
get_anomalies - First observed
get_energy - First observed
get_latest - First observed
list_public_nodes - First observed
list_sources - First observed
query_datum
TDQS
Scored across 10 tools
Most tools target clearly distinct purposes: discovery, latest reading, aggregated time-series, true energy, quick diagnosis, fleet ranking, ML verdicts, event history, reporting, and node discovery. Two close pairs (query_datum/get_energy and diagnose_site/asset_review) overlap enough that agents could pick the wrong one, but the descriptions explicitly steer usage, keeping misselection risk low.
Names are uniformly lowercase snake_case and mostly follow a verb_noun pattern (list_sources, get_energy, diagnose_site, create_service_report). Minor deviations: get_latest uses an adjective as the object, and asset_review inverts the verb_noun order, but all names remain easily parseable and predictable.
Ten tools is squarely in the well-scoped range for a solar monitoring domain. Each tool earns its place: two for discovery, one for live status, two for historical data access, three for the diagnostics cluster, one for fleet comparison, and one for report generation. No redundant or filler tools.
The set covers the full analysis lifecycle: discovering public nodes, enumerating sources, reading current state, querying both averaged and true energy, diagnosing faults at both quick and event-level granularity, cross-checking with ML output, comparing sites, and producing serviceready reports. Minor gaps include no raw non-aggregated datum access and no site metadata endpoint, but core workflows have no dead ends.
Maintenance
Related MCP Connectors
Human field services for AI agents: site photos, equipment checks, remote hands and coordination.
Solar, weatherization, EV charging, battery and heat-pump decision tools for AI agents.
IP intelligence, network diagnostics, and AI service availability tools for AI agents.
Live US power market prices, load, generation, weather and permits for AI agents.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP server that enables AI assistants to look up solar permitting authorities, estimate solar production via PVWatts, and retrieve irradiance data. It streamlines the creation of solar-aware workflows by integrating industry-standard APIs like NREL.MIT
- AlicenseBqualityDmaintenanceConnects AI agents to energy infrastructure with 30+ tools for managing sites, assets, dispatch, settlements, compliance, and carbon tracking.3447 npm1MIT
- AlicenseNot gradedqualityBmaintenanceProvides free energy intelligence APIs for AI agents: solar production estimates, US clean-energy incentives by ZIP, home Energy Node Scores, contractor search, and consented installer routing.MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to list demo inverter sites, inspect production, pull weather context, and get deterministic panel-cleaning recommendations over MCP using synthetic solar operations data.MIT