bring-hermes

bring-hermes

MCP server that exposes the Bring! shopping list API as tools, enabling an AI assistant to read lists, add items, and import recipes with correct quantities.

Category
访问服务器

README

bring-hermes

An MCP server that exposes the Bring! shopping list API as tools — so an assistant ("hermes") can read your lists and add items or whole recipes (with the correct quantity) to Bring!.

It is served over the MCP Streamable HTTP transport, protected by an API key, and built to run on Docker and Kubernetes (TLS terminated at the Ingress).

Built on the actively maintained bring-api Python library (the one behind Home Assistant's Bring! integration), which provides batch updates, automatic token refresh, and a recipe-URL parser.


What it can do

Tool Description
list_shopping_lists List all lists on the account with their UUIDs.
get_list_items Show the items currently on a list (name + quantity).
add_item Add a single item; quantity → the item's specification.
add_recipe Add all ingredients of a recipe in one call, with optional servings scaling.
import_recipe_from_url Parse a recipe URL via Bring! and add its ingredients.
remove_item Remove an item from a list.
complete_item Mark an item as bought (moves it to "recently used").

Quantities: Bring! stores an item's amount in a free-text specification field. Pass amounts like "500 g", "2", or "1 EL" in the quantity field — that is exactly what shows up under the item in the app.

Servings scaling

add_recipe (and import_recipe_from_url) accept base_servings and target_servings. When both are given, the leading number of each quantity is scaled by target / base (units and text are preserved):

"500 g" + base=4, target=6  ->  "750 g"
"2"     + base=4, target=6  ->  "3"
"1 EL"  + base=4, target=2  ->  "0.5 EL"
"Salz"  (no number)         ->  "Salz" (unchanged)

Configuration

All configuration is via environment variables (see .env.example):

Variable Required Default Description
BRING_EMAIL ✅ — Bring! account email.
BRING_PASSWORD ✅ — Bring! account password.
MCP_API_KEY ✅ — One or more API keys (comma-separated) clients must present.
BRING_DEFAULT_LIST — first list Default list (name or UUID) when a tool call omits one.
HOST — 0.0.0.0 Bind address.
PORT — 8080 Bind port.
MCP_PATH — /mcp Path the MCP endpoint is served at.
MCP_JSON_RESPONSE — true Plain-JSON Streamable HTTP responses; false = SSE-framed.
LOG_LEVEL — INFO Python log level.

Run locally (Docker Compose)

cp .env.example .env
# edit .env: set BRING_EMAIL, BRING_PASSWORD, and a strong MCP_API_KEY
docker compose up --build

The server listens on http://localhost:8080 with the MCP endpoint at http://localhost:8080/mcp. Health endpoints (/healthz, /readyz) are unauthenticated; everything else requires the API key.

Quick check:

curl -s http://localhost:8080/healthz            # -> ok
curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8080/mcp   # -> 401 (no key)

Run without Docker (uv)

uv sync
uv run bring-hermes        # reads the same env vars (e.g. via `set -a; . ./.env`)

Connecting an MCP client

Point a Streamable-HTTP-capable MCP client at the /mcp URL and send the API key in the Authorization header:

{
  "mcpServers": {
    "bring": {
      "type": "http",
      "url": "https://bring-hermes.example.com/mcp",
      "headers": {
        "Authorization": "Bearer <MCP_API_KEY>"
      }
    }
  }
}

(X-API-Key: <MCP_API_KEY> is accepted as an alternative to the bearer header.)


Deploy to Kubernetes (Helm)

A Helm chart lives in helm/bring-hermes/ — see its README for the full values reference. TLS is terminated at the Ingress (cert-manager + Let's Encrypt in the example), or you can expose it via the Gateway API instead — set httpRoute.enabled=true with a parentRefs Gateway (see the chart README).

# Credentials as a managed Secret (recommended)
kubectl create namespace bring-hermes
kubectl -n bring-hermes create secret generic bring-hermes-credentials \
  --from-literal=BRING_EMAIL='you@example.com' \
  --from-literal=BRING_PASSWORD='your-bring-password' \
  --from-literal=MCP_API_KEY="$(openssl rand -hex 32)"

helm install bring-hermes ./helm/bring-hermes \
  --namespace bring-hermes \
  --set bring.existingSecret=bring-hermes-credentials \
  --set image.repository=ghcr.io/scramb/bring--mcp \
  --set image.tag=0.2.0 \
  --set ingress.enabled=true \
  --set ingress.hosts[0].host=bring-hermes.example.com

(Or pass bring.email / bring.password / bring.apiKey directly and let the chart create the Secret — fine for testing, not for production.)

Notes:

  • Stateless MCP transport → safe to run multiple replicas behind a normal Service (no session affinity required).
  • Probes: /healthz is liveness; /readyz returns 503 until the first successful Bring! login, then 200.
  • Responses: plain-JSON Streamable HTTP by default (no SSE), so no special proxy buffering/timeout tuning is required at the Ingress.
  • Hardening: runs as non-root with a read-only root filesystem and all capabilities dropped.

Releases (GitHub Actions → GHCR)

Pushing a version tag triggers .github/workflows/release.yml, which publishes both artifacts to GHCR with the same version as the git tag (a leading v is stripped so the value is valid SemVer for Helm):

git tag v0.2.0
git push origin v0.2.0
# -> image:  ghcr.io/<owner>/bring-hermes:0.2.0  (+ :latest)
# -> chart:  oci://ghcr.io/<owner>/charts/bring-hermes  version 0.2.0

The chart is packaged with --version/--app-version set to that version, and its image.tag defaults to the chart appVersion — so image tag and chart version always match.

Build the image manually

docker build -t ghcr.io/your-org/bring-hermes:0.1.0 .
docker push ghcr.io/your-org/bring-hermes:0.1.0

How it works

  • One shared Bring client (single login) is created in the app's lifespan and reused across requests; the underlying library refreshes the access token automatically, and an expired-token error triggers a one-shot re-login.
  • The FastMCP Streamable HTTP session manager is nested inside that lifespan, so the login is not re-run per request (which would otherwise happen in stateless mode).
  • API-key auth is a small ASGI middleware in front of the MCP mount; health endpoints are exempt so Kubernetes probes work without credentials.
  • The Streamable HTTP transport replies with plain JSON by default (MCP_JSON_RESPONSE=true); set it to false to get SSE-framed responses for streaming clients.

Security

  • Treat MCP_API_KEY as a secret; use a long random value and rotate it by setting a comma-separated list and removing the old key once clients migrate.
  • Always serve behind TLS (the Ingress). The API key is a bearer credential — never expose /mcp over plain HTTP in production.
  • The Bring! credentials grant full access to your shopping lists; scope and store them like any other secret.

Credits

Huge thanks to the authors of bring-api, Cyrill Raccaud (@miaucl) and Manfred Dennerlein Rodelo — the actively maintained Python Bring! client that also powers Home Assistant's Bring! integration. This server is a thin MCP wrapper around their work; all the real Bring! API heavy lifting (batch updates, automatic token refresh, recipe parsing) is theirs. 💙

If you find this useful, please go star miaucl/bring-api.

License

MIT. bring-api is MIT-licensed by its respective authors. Bring! is a trademark of its respective owners; this project is unofficial and not affiliated with Bring! Labs AG.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选