mcpField
G
Goodwe Inverter Mcp Server

Goodwe Inverter Mcp Server

本地服务
github.com/marcinn2其他08 周前更新

关于 Goodwe Inverter Mcp Server

Goodwe Inverter Mcp Server 是用于本地网络 GoodWe 太阳能逆变器监控与控制的 MCP 服务,适合需要读取发电、用电和电池数据并调整逆变器设置的用户。它提供多种连接传输方式,并支持通过令牌保护 HTTP 请求。

主要功能

  1. 01读取实时发电、电池和电网数据
  2. 02读取及写入逆变器设置
  3. 03切换运行模式与出口功率限制
  4. 04提供 7 项 MCP 资源和 6 个提示词
  5. 05支持四种传输模式及 HTTP 令牌认证

适用场景

  1. 01查看光伏产量、电池状态和电网功率流
  2. 02调整运行模式或电网出口上限
  3. 03通过提示词生成状态报告与故障诊断

MCP 相关

作为 MCP 服务,向客户端提供 GoodWe 逆变器数据、设置读写与模式控制工具,以及状态、运行数据等资源和预设提示词。支持 stdio、SSE、Streamable HTTP 及组合服务传输。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

暂未收录安装方式

我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。

代码仓库

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

GoodWe 逆变器 MCP 服务

用于通过本地网络监控和控制 GoodWe 太阳能逆变器 的 MCP 服务。

goodwe-inverter-mcp MCP server

基于 goodwe 库和 Model Context Protocol Python SDK 构建。

基于 Home Assistant GoodWe 集成 构建——传感器定义、运行模式、设置和逆变器系列支持均直接参考该实现。

功能

  • 读取实时运行数据:光伏发电量、电池状态、电网输入/输出功率、负载功耗
  • 读取和写入所有可配置的逆变器设置
  • 切换运行模式(通用、节能、备用、削峰、离网等)
  • 控制电网馈电限制和电池放电深度
  • 7 个 MCP 资源:状态、运行数据、设置、功率流、每日能量、电池、传感器目录
  • 6 个内置提示词模板,适用于常见工作流(状态概览、诊断、优化等)
  • 所有 HTTP 传输方式均支持 Bearer 令牌身份验证
  • 四种传输模式:stdio、SSE、Streamable HTTP 和 server(SSE + Streamable HTTP 组合)
  • 通过环境变量自动连接

要求

  • Python 3.10+
  • 可通过本地网络访问的 GoodWe 逆变器(UDP 端口 8899 或 Modbus/TCP 端口 502)

安装

# with uv (recommended) — installs the locked dependency set from uv.lock
uv sync

# or a plain (editable) install
uv pip install -e .

使用方法

stdio(Claude Desktop)
goodwe-mcp

添加到 ~/.claude/claude_desktop_config.json:

{
  "mcpServers": {
    "goodwe": {
      "command": "goodwe-mcp",
      "env": {
        "GOODWE_HOST": "192.168.1.100"
      }
    }
  }
}
SSE 传输
goodwe-mcp --transport sse --port 8080
# Server listens on http://0.0.0.0:8080/sse
Streamable HTTP 传输
goodwe-mcp --transport streamable-http --port 8080
# Server listens on http://0.0.0.0:8080/mcp
Server 传输(SSE + Streamable HTTP 组合)

在单个端口上同时提供两种传输方式——适用于需要同时支持旧版 SSE 客户端和现代 Streamable HTTP 客户端的场景。

goodwe-mcp --transport server --host 0.0.0.0 --port 8080
# SSE:             http://0.0.0.0:8080/sse  (GET) and /messages/ (POST)
# Streamable HTTP: http://0.0.0.0:8080/mcp
选项
--transport {stdio,sse,streamable-http,server}   Transport mode (default: stdio)
--host HOST                                      Bind address for SSE/HTTP (default: 127.0.0.1)
--port PORT                                      Listen port for SSE/HTTP (default: 8000)
--log-level {DEBUG,INFO,WARNING,ERROR}           Logging verbosity (default: INFO)
--auth-token TOKEN                               Bearer token required on all HTTP requests (env: MCP_AUTH_TOKEN)
--base-url URL                                   Public base URL, e.g. https://mcp.example.com (env: MCP_BASE_URL)
--allowed-hosts HOSTS                            Comma-separated Host header values to accept (env: MCP_ALLOWED_HOSTS)
--allowed-origins ORIGINS                        Comma-separated Origin header values to accept (env: MCP_ALLOWED_ORIGINS)
环境变量
变量描述默认值
GOODWE_HOST启动时自动连接所用的逆变器 IP / 主机名—
GOODWE_PORT逆变器 UDP/TCP 端口8899
GOODWE_FAMILY覆盖逆变器系列(ET、EH、BT、BH、ES、EM、BP、DT、MS、NS、XS)自动检测
MCP_AUTH_TOKEN所有 HTTP 请求都必须提供的 Bearer 令牌—(禁用身份验证)
MCP_BASE_URL服务的公开基础 URL(用作 OAuth 颁发者 URL)http://<host>:<port>
MCP_ALLOWED_HOSTS以逗号分隔的可接受 Host 标头值;在非环回地址上绑定时启用 DNS 重绑定防护—(仅在环回地址上绑定时启用防护)
MCP_ALLOWED_ORIGINS以逗号分隔的可接受 Origin 标头值(基于浏览器的客户端)—
MCP_PORT容器默认命令和健康检查使用的监听端口(仅限 Docker)8000

身份验证

所有 HTTP 传输方式(sse、streamable-http、server)均支持 Bearer 令牌身份验证。 启用后,每个 MCP 请求都必须包含 Authorization: Bearer <token> 标头。 /health 端点始终不受保护,因此 Kubernetes 探针可以继续正常工作。

通过环境变量启用(推荐)
export MCP_AUTH_TOKEN="$(openssl rand -hex 32)"
goodwe-mcp --transport server --host 0.0.0.0 --port 8080
通过 CLI 标志启用
goodwe-mcp --transport streamable-http --port 8080 --auth-token my-secret-token
Claude Desktop / MCP 客户端配置

将令牌添加到客户端的 MCP 服务配置中。例如,在 Claude Desktop 中通过注入标头的代理使用 streamable-http 传输,或用于任何支持 Authorization 标头的客户端:

{
  "mcpServers": {
    "goodwe": {
      "url": "http://localhost:8080/mcp",
      "headers": {
        "Authorization": "Bearer my-secret-token"
      }
    }
  }
}
Docker / Docker Compose

通过环境变量传递令牌:

MCP_AUTH_TOKEN=my-secret-token GOODWE_HOST=192.168.1.100 \
  docker compose -f docs/docker-compose.yml up -d
Kubernetes

在应用清单之前,在 docs/k8s/secret.yaml 中设置令牌:

stringData:
  GOODWE_HOST: "192.168.1.100"
  MCP_AUTH_TOKEN: "my-secret-token"

如果 MCP_AUTH_TOKEN 为空或未设置,则会禁用身份验证,所有 HTTP 端点均可公开访问。当服务绑定到非环回地址且未设置令牌时,服务将在启动时记录警告。

DNS 重绑定防护

当 MCP SDK 服务器绑定到环回地址时,会自动验证 Host 和 Origin 标头。对于其他任何绑定地址(包括 Docker 默认的 0.0.0.0),请列出客户端用于合法访问服务器的主机名或 host:port 对:

MCP_ALLOWED_HOSTS="mcp.example.com,192.168.1.10:8000" \
  goodwe-mcp --transport server --host 0.0.0.0 --port 8000

Host 标头未列出的请求会被拒绝,并返回 HTTP 421。:* 后缀可匹配任意端口(例如 192.168.1.10:*)。使用 MCP_ALLOWED_ORIGINS 可额外允许来自指定来源的浏览器客户端。服务器绑定到非环回地址且未设置此项时,会在启动时记录警告。

TLS / HTTPS

MCP 服务本身不会终止 TLS。对于任何非 localhost 部署,请在其前方放置一个负责终止 TLS 的反向代理(nginx、Caddy、Traefik)。通过纯 HTTP 提供逆变器数据(当与家庭关联时,这属于 GDPR 定义的个人数据)存在安全风险。

Caddy 示例(最简单的方案):

mcp.example.com {
    reverse_proxy localhost:8000
}

数据处理声明

此服务器会处理 GoodWe 太阳能逆变器的数据,包括逆变器的 IP 地址、序列号和能耗指标。在家庭中部署并由房主出于个人用途运行时,此类处理属于 GDPR 家庭豁免范围(第 2(2)(c) 条),GDPR 不适用。如果用于商业部署,例如监控属于第三方客户的逆变器,运营方将成为 GDPR(EU)2016/679 规定的数据控制者,必须为数据处理确立合法依据(第 6 条)、保存数据处理活动记录(第 30 条),并确保采取适当的技术和组织措施(第 32 条),包括 TLS 加密和访问控制。

Docker

构建

针对当前机器的架构进行构建:

docker build -t goodwe-inverter-mcp:latest .
多平台构建(amd64 + arm64)

使用 docker buildx 构建可在 x86-64 服务器和 ARM 设备(Raspberry Pi、Apple Silicon、AWS Graviton 等)上运行的镜像。

一次性设置 — 创建支持交叉编译的构建器:

docker buildx create --name multi --driver docker-container --bootstrap --use

构建两个平台并加载到本地守护进程 — 需要使用 containerd 镜像存储(Docker Desktop 4.34+ 默认启用;在 Linux 上运行 dockerd --snapshotter=overlayfs,或在 /etc/docker/daemon.json 中启用):

docker buildx build --platform linux/amd64,linux/arm64 -t goodwe-inverter-mcp:latest --load .

构建两个平台并推送到镜像仓库(例如 Docker Hub 或 GHCR):

docker buildx build \
  --platform linux/amd64,linux/arm64 \
  -t youruser/goodwe-inverter-mcp:latest \
  --push .

构建两个平台并导出为本地 OCI tar 文件(无需镜像仓库):

docker buildx build \
  --platform linux/amd64,linux/arm64 \
  -t goodwe-inverter-mcp:latest \
  --output type=oci,dest=goodwe-inverter-mcp.tar .
运行
docker run -d \
  --name goodwe-mcp \
  -e GOODWE_HOST=192.168.1.100 \
  -p 8000:8000 \
  goodwe-inverter-mcp:latest

容器默认使用 --transport server(在端口 8000 上运行 SSE + Streamable HTTP)。

使用 MCP_PORT 更改端口,以确保内置健康检查也使用新端口:

docker run -d -e GOODWE_HOST=192.168.1.100 -e MCP_PORT=9000 -p 9000:9000 \
  goodwe-inverter-mcp:latest

要更改传输方式,请覆盖命令。请确保 MCP_PORT 与之同步,因为健康检查会探测该端口:

docker run -d -e GOODWE_HOST=192.168.1.100 -e MCP_PORT=9000 -p 9000:9000 \
  goodwe-inverter-mcp:latest \
  goodwe-mcp --transport streamable-http --host 0.0.0.0 --port 9000
Docker Compose
GOODWE_HOST=192.168.1.100 docker compose -f docs/docker-compose.yml up -d

docs/docker-compose.yml 默认使用 network_mode: host,以便容器访问本地局域网中的逆变器。如果你的网络已将局域网流量路由到容器,请删除该行。

Kubernetes

前提条件

GoodWe 逆变器通过本地网络上的 UDP/TCP 进行通信。Pod 需要能够访问逆变器的 IP。最简单的配置是在同一子网中的节点上设置 hostNetwork: true;如果集群采用扁平网络或有其他路由方案,则可删除此项。

部署
# 1. Edit the inverter IP
vi docs/k8s/secret.yaml

# 2. Apply all manifests
kubectl apply -f docs/k8s/

# 3. Check status
kubectl rollout status deployment/goodwe-mcp
kubectl logs -f deployment/goodwe-mcp
健康检查端点

存活探针和就绪探针都会请求 GET /health,该端点返回:

{ "status": "ok", "inverter_connected": true }

HTTP 服务器启动后,Pod 即变为就绪状态。服务器成功连接到逆变器之前,inverter_connected 会一直为 false(首次 MCP 客户端会话时会触发自动连接)。

工具

工具描述
connect_inverter通过 IP/主机连接 GoodWe 逆变器
get_connection_status检查是否已连接并显示设备信息
get_device_info型号名称、序列号、固件版本
get_runtime_data所有实时传感器值(可按类型筛选:PV/AC/BAT/GRID/UPS/BMS)
list_sensors列出所有传感器 ID 和名称
read_sensor按 ID 读取单个传感器
get_settings_data所有可配置设置及其当前值
read_setting按 ID 读取单个设置
write_setting为可配置设置写入一个值
get_operation_mode当前模式和支持的模式
set_operation_mode设置模式:general、eco、backup、off_grid、peak_shaving、eco_charge、eco_discharge
get_grid_export_limit电网输出功率上限,单位为瓦
set_grid_export_limit设置电网输出功率上限(0 = 已禁用)
get_battery_dod电池放电深度设置
set_battery_dod设置电池放电深度(0–99%)

提示词

预先编写的提示词模板,MCP 客户端可以获取并直接使用。

提示词参数描述
status_overview—完整状态报告:连接、实时功率流、电池、电网
battery_optimisation—检查电池设置并建议改进放电深度/模式
grid_export_config—检查并调整电网输出功率上限
operation_mode_change—说明可用模式并帮助切换到合适的模式
diagnose_issuesymptom(可选)收集完整诊断信息并识别问题
daily_energy_summary—以易读表格显示今日能量计数器数据

资源

URI描述
inverter://status连接状态和设备信息(JSON)
inverter://runtime所有实时传感器值(JSON)
inverter://settings所有可配置设置(JSON)
inverter://power/now实时功率流——PV、电池、电网和负载(单位为瓦),按类型分组
inverter://energy/today今日能量计数器数据——发电量、负载、电网购电/售电、电池充电/放电(kWh)
inverter://battery在一个数据载荷中提供电池传感器、放电深度限制和当前运行模式
inverter://sensors静态传感器目录——每个传感器的 ID、名称、单位和类型(无实时值)

逆变器系列

系列型号说明
ET / EH / BT / BH混合型三相支持电池,最多 4 个 PV 组串
ES / EM / BP混合型单相支持电池
DT / MS / NS / XS仅并网不支持电池

开发

# install runtime + dev dependencies from the lockfile
uv sync

# run the test suite
uv run pytest

# with a coverage report
uv run pytest --cov=goodwe_mcp --cov-report=term-missing

# lint
uv run ruff check src tests

测试完全使用内存中的模拟逆变器运行,因此不需要硬件或网络访问。测试通过真实的 MCP 客户端会话和实际的 ASGI 应用驱动服务,涵盖工具输入验证、资源数据载荷、Bearer 身份验证、DNS 重绑定防护和 CLI。GitHub Actions 会在 Python 3.10 至 3.13 上运行测试套件,并在每次推送和拉取请求时构建容器映像。

许可证

请参阅代码库根目录中的 LICENSE 文件。

免责声明

本软件与 GoodWe Inc. 无关,也未获其认可。使用风险由您自行承担。 本软件是我利用业余时间维护的个人项目。 更多信息请参阅许可证。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。