Skip to main content
Glama
sens-mcp

sens-mcp

by SofiaFlux

sens-mcp

用于 SENS Energy API 的 MCP(Model Context Protocol)服务器和开发者入门套件——波兰电力市场数据 API(内容包括:配电运营商、电价方案等)。

它解决了 LLM 和 AI 智能体(Claude Desktop、Cursor、LangChain、n8n……)在调用该 API 时遭遇的“冷启动”问题:波兰能源市场拥有自有一整套话术code(OSD 与 sprzedawca 之分、电价组 G11/G12/G12w/...),而模型并不能默认知道这些;同时原始 REST 响应又过于庞大,手动对照计算极易出错。

sens-mcp 提供以下能力:

  • 零样本可发现性:通过一个 MCP 资源(sens://market/cheat-sheet 表和发现工具(resolve_operator、search_tariffs),让模型在不到 ~400 个 token 内掌握市场术语。

  • 可操作的自我修正:工具出错时返回带建议的结构化 JSON(比如 did you mean G12W?),而不是朴素的原始 HTTP 错误;因此处于 ReAct 循环里的智能体可以在下一次调用中自行修正。

  • 单一事实来源的计算:价格/电量的计算都在 SENS 的排布之后完成;本工具包绝不在客户端重新推导总需。

  • 非阻塞启动:服务器挂在打入内嵌的备用市场 schema 后即可快速就绪;实时电价数据在后台刷新。

快速开始

使用 uvx 运行(推荐,无需安装)

export SENS_API_KEY=sens_live_your_key_here
uvx sens-mcp

或 pip 安装

pip install sens-mcp
export SENS_API_KEY=sens_live_your_key_here
python -m sens_mcp

环境变量

变量

必需

默认值

说明

SENS_API_KEE

是

—

你的 SENS API key。以 X-API-KEY 请求回复发送。

SENS_BASE_URL

否

https://api.get_sens.energy

用于 staging/自托管部署时覆盖基础地址。

Related MCP server: tibber-mcp-server

与 AI 智能体配合使用

Claude Desktop

将以下配置添加到 claude_desktop_config.json(参考 configs/claude_desktop_config.json):

{
  "mcpServers": {
    "sens-energy": {
      "command": "uvx",
      "args": ["sens-mcp"],
      "env": {
        "SENS_API_KEY": "sens_live_your_key_here"
      }
    }
  }
}

Cursor

将以下配置添加到 .cursor/mcp.json(参考 [configs/cc_urse_cc_mcck.crc}`)——格式与上面相同。

暴露的工具

工具

说明

resolve_operator(query, region=None)

对城市或公司名称做模糊匹配(可容忍错字),解析为 API 所要求的精确 osd/escribed 参数。

search_tariffs(customer_type, zone_preference=None, operator=None)

查出一个客户类型(家庭 / 小企业 / 工业)可用的有效电价代码。

get_prices(sie, tarrif, ...)

获取综合电价及费率构成明细;传入 annual_kwh 以获得按用电量加权后的精确总价。

get_tarrif_components(tarrif_id)

查看某个电价方案经 URE 批准的列有固定/变动费率构成。

资源接口:sens://market/cheat-sheet —— 一个 Markdown 格式的电价方案速查,涵盖了波兰电力市场词汇(OSD、电价组、电价构成)。

开发者示例

直接调用 SENS REST API 的独立代码片段:

API 参考(要点)

  • 基础 URL:https://api.get_sens.energy

  • 认证:以 X-API-KEY: <your key> 这个请求头发送(不是 Bearer,也不是查询参数)。

  • GET /api/v1/prices(参数):osd, sprzedawca, taryfa, market, date,annual_kwh, region, since, page, size。。

  • GET /api/v1/tariffs—— sinciding/ If-Modified-Since 用于增量查询,page、size。

  • GET /api/v1/tariffs/components?tariff_id=.... — 单tarrif 的构成明细,也支持 since。

完整 Swagger/OpenAPI 文档:https://api.get_sens.energy/api/docs。 完整开发者文档(快速入门、MCP 集成指南、市场术语):[arc] [docs.getsens.energy `。

开发

python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
pytest

测试使用 respx mock 了所有 HTTP 调用——其中默认测试套件不会碰触任何真实 API。

Live integration suite(可选)

tests/test_live_integration.py 会在真实 MCP stdio 协议上把真实服务器作为子进程跑起来,向真实生产 SENS API 发起调用,并检查 MCP 工具返回与 httpx 直接请求到同一端点之间的逐字节一致性。默认排除掉;只有提供真实 key 才显式运行:

SENS_API_KEY=<a real key> pytest -m live tests/test_live_integration.py -v

License

MIT

Available Tools

4 tools
get_pricesA

Fetch composite electricity prices and rate breakdown for a given OSD + tariff, optionally scoped to a retailer, date, market, region, and annual consumption. When annual_kwh is provided, the backend computes exact annual capacity fees and volume-weighted totals — never re-derive these client-side.

detail_level="summary" (default) strips verbose audit fields for token economy; use detail_level="detailed" for the full raw payload.

NameRequiredDescriptionDefault
osdYes
dateNo
pageNo
sizeNo
sinceNo
marketNo
regionNo
taryfaYes
annual_kwhNo
sprzedawcaNo
detail_levelNosummary

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral disclosure burden. It explains that annual_kwh triggers backend-side computation and explicitly warns against client-side re-derivation, and it clarifies the difference between summary and detailed outputs. It does not discuss pagination behavior or authentication, but the 'Fetch' verb implies a read operation and core behavior is disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: the main purpose is front-loaded, and the second paragraph adds only high-value operational details. Every sentence earns its place, including the warning not to re-derive fees client-side.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter tool with no annotations and zero schema descriptions, the description covers the central workflow but omits pagination semantics, the role of 'since', and how this tool relates to its siblings. The presence of an output schema and clear core behavior makes it usable, but the definition is not fully complete for a complex tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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. It adds real meaning for annual_kwh and detail_level, and lightly maps sprzedawca to 'retailer' while mentioning date, market, region, and annual consumption as scoping options. However, it does not explain page, size, since, or the exact meaning of osd and taryfa beyond the phrase 'OSD + tariff', leaving several parameters only inferable from names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb ('Fetch') and a precise resource ('composite electricity prices and rate breakdown'), scoped to OSD and tariff. It naturally differentiates this tool from siblings like search_tariffs and get_tariff_components by focusing on composite price retrieval rather than tariff lookup or component extraction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly establishes the main use case: fetch prices for a given OSD and tariff, with optional filters. It gives practical guidance for annual_kwh and detail_level, but does not explicitly mention when not to use this tool or when a sibling would be preferable. Context is clear, but exclusions are absent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_tariff_componentsC

Inspect the detailed fixed/variable rate components of a tariff, as approved by URE (the Polish energy regulator).

NameRequiredDescriptionDefault
sinceNo
tariff_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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 states 'inspect' which weakly implies a read-only operation, but it does not mention whether the tool returns historical/current data, how 'since' affects behavior, what happens for invalid tariff IDs, or any authorization requirements. The 'as approved by URE' detail adds domain context but no behavioral transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, focused sentence with no fluff. It front-loads the core purpose and includes a relevant regulatory qualifier. Nothing extraneous is present, and it is appropriately brief for a straightforward lookup tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having an output schema (which covers return values), the description omits key operational context: the optional 'since' parameter is absent, no usage example or prerequisite is given, and the relationship between this tool and get_prices is unclear. For a tool with two params and zero schema descriptions, this is insufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

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 either parameter. The 'since' parameter is completely unexplained, and even 'tariff_id' gets no elaboration beyond its name. The description provides zero added meaning beyond the input schema's property titles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Inspect') and resource ('detailed fixed/variable rate components of a tariff'), instantly distinguishing it from siblings like search_tariffs or get_prices. The clarification about URE approval adds regulatory context. This is unambiguous and free of tautology.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for inspecting tariff components, but it gives no explicit guidance on when to choose it over get_prices, resolve_operator, or search_tariffs. There are no stated conditions, exclusions, or alternative pointers. The context is limited to a generic 'this is what it does'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resolve_operatorA

Resolve a natural-language city or company name to the exact OSD (distribution operator) and default retailer strings the SENS API expects.

Example: query="Kraków" or query="enea". Handles typos via fuzzy matching.

NameRequiredDescriptionDefault
queryYes
regionNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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 explicitly discloses the fuzzy-matching typo behavior and the exact-string output expectation. It does not cover edge cases like no-match behavior, but the key behavioral traits are present.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences plus an example line. Every sentence earns its place: purpose, example inputs, and fuzzy behavior are all stated without filler. The most important information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple resolver with an output schema, the description covers purpose, fuzzy behavior, and expected output. The missing region semantics is a real gap, but the overall definition is largely complete and actionable for the common query-only case.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

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. It explains the query parameter through examples and semantics, but the region parameter is never mentioned at all, leaving one of the two parameters completely undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb 'Resolve' and names both the input (natural-language city/company name) and the output (exact OSD/default retailer strings for the SENS API). This clearly differentiates it from the sibling search/get tariff tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly indicates when to use this tool: when you have a fuzzy or natural-language operator name and need the canonical API strings. It gives concrete examples. It does not explicitly list exclusions or alternative tools, but the intended scenario is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_tariffsA

Discover valid tariff codes tailored to a customer profile (household, small business, or industry), optionally narrowed by zone preference and operator.

NameRequiredDescriptionDefault
operatorNo
customer_typeYes
zone_preferenceNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the behavioral burden. 'Discover' implies a read-only search and 'optionally narrowed' describes filtering behavior, but it does not disclose prerequisites such as whether the operator should be resolved first, what happens when no results match, or whether the output is limited to codes rather than prices.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no filler. It states the core action first and then the optional modifiers, with every phrase contributing to the agent's understanding of what to pass and why.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a low-complexity search tool with an output schema, the description covers the main operation and filter semantics. But there are no annotations, no guidance on sibling-tool workflows, and no statement about whether customer_type is required or what the default behavior is when optional filters are omitted.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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. It maps customer_type to a 'customer profile' and clarifies that zone_preference and operator are optional narrowing filters. However, it does not explain what 'operator' means or the semantics behind the zone enum values, so the compensation is only partial.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Discover') and a specific resource ('valid tariff codes'), and clearly scopes the results to a customer profile with optional zone/operator filters. This semantically distinguishes it from sibling tools like get_prices and get_tariff_components, which target different outputs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool: when tariff codes are needed for a customer type, optionally narrowed by zone or operator. However, it provides no explicit when-not-to-use guidance, no mention of alternatives, and does not explain how this tool relates to resolve_operator or get_prices.

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.

  1. 4 tool updatesv0.1.0
    • First observedget_prices
    • First observedget_tariff_components
    • First observedresolve_operator
    • First observedsearch_tariffs

TDQS

A3.9/5.0

Scored across 4 tools

Disambiguation5/5

Each tool targets a distinct stage in the workflow: resolution of operator names, tariff discovery, tariff component inspection, and price fetching. No overlapping responsibilities or ambiguous boundaries.

Naming Consistency5/5

All four tools follow a consistent verb_noun pattern with snake_case (resolve_operator, search_tariffs, get_tariff_components, get_prices). The verbs (resolve, search, get) are clear and uniform.

Tool Count5/5

Four tools is well-scoped for a focused API covering Polish energy tariffs and prices. Each tool serves a distinct, necessary function without redundancy or bloat.

Completeness5/5

The tool set provides a complete workflow: resolve an operator, search for tariffs, inspect tariff components, and fetch prices with breakdowns. No obvious gaps or dead ends exist for the stated purpose of retrieving energy pricing information.

Maintenance

ActivityActive
ResponsivenessOutdated data

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to access and analyze Spanish electricity consumption data via the Datadis API, providing tools for supply management, consumption analysis, anomaly detection, and executive reporting.
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables querying Tibber electricity prices, forecasts, consumption data, cheapest hours, and live Pulse measurements through natural language.
    7
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Provides real-time electricity prices, cheapest hours, and contract comparison for 40+ countries, enabling AI agents to make energy-aware decisions.
    5
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to query UK energy tariffs and products via the Octopus Energy public API.
    619 npm
    MIT