heorth-mcp
Single MCP server that translates tool calls into requests against the Heorth and KithLedger REST APIs, exposing 50 household and relationship management tools while holding no credentials of its own.
README
heorth-mcp
The Wyrhta Labs household's single MCP server, running as its own container.
It owns no data and no domain logic. Every tool call is translated into calls against an upstream service's public REST API — so an MCP tool can only ever do what an authenticated household member could already do over HTTP.
MCP client ──Streamable HTTP──▶ heorth-mcp ──▶ Heorth REST (37 tools)
└─▶ KithLedger REST (13 tools)
Status
All 50 tools ported. The 37 Heorth tools (household.*, calendar.*,
meals.*, library.*, inventory.*, tasks.*, feoh.*) landed in task A5;
the 13 kith.* tools in task B11. tools/list serves whatever the configured
upstreams provide — both, one, or (with neither configured) nothing at all. The
MCP code still lives embedded in Heorth and KithLedger and is deleted there only
once the equivalent tool here is verified against the deployed container.
Configuration
| Variable | Meaning |
|---|---|
HEORTH_BASE_URL |
Heorth's base URL. Unset -> the 37 Heorth tools are not registered. |
KITH_BASE_URL |
KithLedger's base URL. Unset -> the 13 kith.* tools are not registered. Requires HEORTH_BASE_URL (see below) — set alone, it is a boot error. |
KITH_AUDIENCE |
The satellite audience for exchanged tokens (default kithledger). Must match Heorth's SATELLITE_AUDIENCES and KithLedger's SATELLITE_AUDIENCE. |
PORT |
Default 3200. |
UPSTREAM_TIMEOUT_MS |
Per upstream call, default 10000. |
heorth-mcp holds no credential of its own — for either upstream. Heorth
calls carry the caller's Bearer he_... verbatim. KithLedger calls carry a
short-lived member token that heorth-mcp exchanges at Heorth
(POST /api/v1/auth/satellite-token, ADR 0009) using that same caller
credential, cached in memory per caller for just under its 5-minute life. That
is why kith.* needs both upstreams: Heorth is the identity authority, so with
it unreachable the kith.* tools fail (IDENTITY_UNAVAILABLE) even when
KithLedger is healthy.
KITH_API_KEY is gone. KithLedger enforces per-member access control
(ADR 0004) and none of its three kl_ credential kinds is the calling member: a
member key reads as the issuing account's own scope, a household key sees
only the household slice, an ops key has no data access at all.
docs/spec/tool-surface.md— the 50-tool contract and its REST mappingdocs/spec/migration.md— what moves out of the upstream repos, in what order, and what must be true before each deletionAGENTS.md— architecture, auth model, and conventions
Created by ADR 0008 — MCP as a standalone container over REST in the meta
repo Wyrhta-Labs/wyrhta-labs.
Container image
Published to the GitHub Container Registry as
ghcr.io/wyrhta-labs/heorth-mcp by
.github/workflows/build-image.yml. The
workflow typechecks and runs the full test suite first — a red suite blocks the
publish — then builds this repo's Dockerfile for linux/amd64.
Only two things publish: a push to main and a v* git tag. Nothing else
does, so the registry stays free of branch junk.
| Tag | Produced by | Pinnable? |
|---|---|---|
main-<short sha> |
every push to main |
yes — immutable, one build per commit |
<version>, <major>.<minor>, <major> |
a v* tag push (e.g. v0.2.0 -> 0.2.0, 0.2, 0) |
<version> yes; the truncated ones move |
main |
every push to main |
no — moving pointer |
latest |
a v* tag push only |
no — moving pointer |
Pinning it in production. The meta repo's deploy/compose.prod.yml
requires an explicit tag in deploy/.env:
HEORTH_MCP_IMAGE_TAG=main-a1b2c3d # a main build, by short commit sha
HEORTH_MCP_IMAGE_TAG=0.2.0 # a release, once a v0.2.0 tag exists
Never pin latest or main — both move under the running deployment and
defeat the point of pinning. Use the exact main-<sha> shown in the workflow
run (or docker images), or the semver of a release.
The image is private, like the repo. A host that pulls it needs a GHCR login
with read:packages for the Wyrhta-Labs org.
Related repos
| Repo | Role |
|---|---|
Wyrhta-Labs/wyrhta-labs |
Concept, ADRs, deploy stack |
Wyrhta-Labs/Heorth |
Household hub — upstream |
Wyrhta-Labs/KithLedger |
Relationship manager — upstream |
Wyrhta-Labs/wyrhta-core |
Shared lib, pinned by git tag |
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。