Skip to main content
Glama
gopisrikrishna

solarnetwork

solarnetwork-mcp

MCP-сервер, который превращает солнечную телеметрию SolarNetwork в инструменты, которые может вызывать ИИ-агент.

Учётные данные не требуются. Он работает с публичными конечными точками SolarNetwork, где ~52 живые солнечные станции публикуют реальные данные о генерации, облучённости и погоде — несколько из них обновляются ежеминутно, с шестилетней историей.

Что он умеет

Читать солнечную телеметрию

  • Обнаруживать публичные узлы без учётных данных, фильтровать по часовому поясу или активности

  • Классифицировать каждый поток на станции: счётчик станции, инвертор, облучённость, погода, ML-аномалия

  • Запрашивать временные ряды с любым шагом агрегации от пяти минут до года

  • Получать истинную накопленную энергию из показаний счётчика, а не усреднённую мощность

  • Проверять, жив ли поток, по временной метке, а не по значению

Находить неисправности оборудования, с датами

  • Обнаруживать отключения инверторов и определять точный день начала и окончания

  • Отличать мёртвое устройство от того, которое генерирует, но не сообщает мощность

  • Ловить устройство, которое замолчало, пока его соседи продолжают сообщать

  • Отмечать сбросы счётчиков, которые молча портят все итоги по энергии, охватывающие их

  • Находить записи реестра для оборудования, которого никогда не существовало

  • Оценивать потери энергии на каждую неисправность, масштабируя от выработки соседей с учётом собственной мощности каждого устройства

Не поднимать ложных тревог

  • Обнаружение основано на сравнении с соседями, поэтому облачность не может быть зарегистрирована как неисправность

  • Облучённость используется как физический погодный контроль там, где есть пиранометр

  • Неисправности, уже активные на момент открытия окна, помечаются как нижние границы, а не выдуманные даты начала

  • Станции, которые невозможно оценить, сообщаются как не оценены, а не как здоровые

Писать отчёты, по которым можно действовать

  • Приоритизированные наряды на работы с объяснением причины на простом языке, доказательствами, нумерованными шагами, инструментами и критериями приёмки

  • Печатные PDF-полевые комплекты с галочками и листом для заметок

  • Markdown для вставки в тикет или JSON для постобработки

  • Только простой ASCII, чтобы ничего не превращалось в чёрные квадраты в PDF или системе тикетов

Что он не умеет

Стоит знать, прежде чем полагаться на него:

  • Станции с менее чем двумя инверторами не могут быть оценены. Сравнение с соседями требует соседей. Инструмент говорит об этом, а не сообщает чистый результат.

  • Нет паспортных характеристик. Публичные узлы их не раскрывают, поэтому цифры потерь — это оценки, масштабированные от соседей, а не расчёты по гарантии.

  • Обнаружение неисправностей работает на суточных интервалах. Устройство, молчавшее шесть часов, невидимо.

  • Классификация потоков зависит от соглашения об именах. Станции, называющие потоки 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 сообщает 0 Вт с 2026-03-25, продолжая генерировать

Пагинация

1000

Год превышает лимит SolarQuery в 1000 строк; каждая строка получена

Целостность счётчика

781

Поднят сброс счётчика, энергия станции никогда не отрицательна

Целостность счётчика

900

Сброс счётчика точно определён на 2026-06-03

Честность покрытия

949

Узел без инверторов сообщает "не оценён", никогда "здоров"

Выбор счётчика станции

464

Настоящий счётчик побеждает над остатком заглушки /TEST/GEN/1

Вывод отчёта

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.js

Claude Desktop

Отредактируйте claude_desktop_config.json:

  • macOS~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows%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 или клиент не был перезапущен.

Инструменты

Обнаружение

Инструмент

Отвечает

list_public_nodes

"На какие узлы я вообще могу смотреть?"

list_sources

"Что измеряет этот узел?"

get_latest

"Что происходит прямо сейчас?"

Данные

Инструмент

Отвечает

query_datum

"Покажи выработку за этот период"

get_energy

"Сколько кВт·ч он на самом деле выработал?"

Анализ

Инструмент

Отвечает

asset_review

"Что сломалось, когда началось и во что обошлось?"

diagnose_site

"Что-то не так прямо сейчас, погода или оборудование?"

compare_fleet

"Какой из моих станций нуждается во внимании в первую очередь?"

get_anomalies

"Что говорит собственный ML-детектор платформы?"

Отчётность

Инструмент

Отвечает

create_service_report

"Дай мне наряд на работу, который можно передать технику"

Что можно спросить

Начните с этого — это реальные, живые узлы:

Ориентация

Какие публичные узлы 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 Вт, пока его три соседа выдают 400–700 Вт, что выглядит точно как мёртвый инвертор — и более ранняя версия этого инструмента так и говорила. Он не мёртв: его счётчик накопил 826 кВт·ч за тот месяц. Инверторы на одной станции используют разные соглашения о отчётности. Проверка здоровья, основанная только на watts, вызывала бы человека каждую ночь из-за работающего инвертора.

Ваши собственные узлы

Установите две переменные окружения, и сервер переключится с публичных конечных точек /pub на аутентифицированные /sec. Поверхность инструментов не меняется:

SN_TOKEN_ID=... SN_TOKEN_SECRET=... node dist/index.js

Аутентификация — это схема SNWS2 от SolarNetwork — HMAC-SHA256 по канонизированному запросу с ключом, ограниченным по дате. Она реализована, но не протестирована; у меня нет пары токенов для проверки.

Как это работает

Три файла, ~900 строк:

  • src/solarnetwork.ts — API-клиент, пагинация, подпись запросов

  • src/analysis.ts — разбор ID источников, диагностика станции

  • src/index.ts — определения десяти инструментов

Описания инструментов — это настоящий интерфейс. Агент правильно связывает list_sourcesquery_datum только если описания говорят, когда обращаться к каждому. Правильная формулировка важнее для работы, чем любая обработка данных.

Ограничения

  • Метаданные узлов пусты на публичных узлах, поэтому нет паспортной мощности и, следовательно, нет сравнения, нормализованного по мощности. compare_fleet ранжирует сырую выработку и говорит об этом — большая станция обгонит маленькую здоровую.

  • list_public_nodes читает точечный скан (data/nodes.json), а не живой список. Вызовите list_sources, чтобы подтвердить, прежде чем полагаться на узел.

  • Нет кэширования. Повторные вызовы агента снова обращаются к API.

  • Нет модульных тестов. scripts/smoke.mjs — это живой зонд, а не набор тестов.

  • SolarQuery молча приводит мелкозернистую агрегацию к часовой для диапазонов более ~7 дней. query_datum передаёт вашу агрегацию как есть, поэтому длинные диапазоны возвращают более грубые данные, чем запрошено.

Подробнее: USAGE.md с рабочими примерами и сравнением усилий, DATA.md с полным перечнем того, что публично, а что за учётными данными.

Лицензия

MIT

-
license - not tested
Not graded
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

  • Data-center, grid, fiber & gas infrastructure intelligence for AI agents — query and cite.

  • Field-service dispatch & technician scheduling for AI agents — sub-3-second cascade rescheduling.

  • 45 AI data tools for agents — crypto, DeFi risk, audits, equities, energy, and more.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/gopisrikrishna/solarnetwork-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server