Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
作者提供的说明(英文原文)
Unofficial MCP server for PetKit smart feeders: status, feeding history and schedule control.
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
选择你使用的 AI 应用,然后复制设置。
PETKIT_EMAIL, PETKIT_PASSWORD, PETKIT_REGION, PETKIT_TIMEZONE标为机密的值是你账户的钥匙。千万不要分享给别人,也不要粘贴到聊天里。
你需要
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
打开 Claude Desktop → Settings → Developer → Edit Config,把下面的内容粘贴到 claude_desktop_config.json
{
"mcpServers": {
"petkit": {
"command": "npx",
"args": [
"-y",
"mcp-server-petkit"
],
"env": {
"PETKIT_EMAIL": "your-value",
"PETKIT_PASSWORD": "your-value",
"PETKIT_REGION": "your-value",
"PETKIT_TIMEZONE": "your-value"
}
}
}
}在终端中运行这条命令
claude mcp add petkit --env PETKIT_EMAIL=your-value --env PETKIT_PASSWORD=your-value --env PETKIT_REGION=your-value --env PETKIT_TIMEZONE=your-value -- npx -y mcp-server-petkit运行前请先填写空着的值。
粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"petkit": {
"command": "npx",
"args": [
"-y",
"mcp-server-petkit"
],
"env": {
"PETKIT_EMAIL": "your-value",
"PETKIT_PASSWORD": "your-value",
"PETKIT_REGION": "your-value",
"PETKIT_TIMEZONE": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"petkit": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"mcp-server-petkit"
],
"env": {
"PETKIT_EMAIL": "your-value",
"PETKIT_PASSWORD": "your-value",
"PETKIT_REGION": "your-value",
"PETKIT_TIMEZONE": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
这个服务器在你的电脑上运行,而 ChatGPT 只能连接互联网上的服务器。请选择其他应用。
你的选择通过 Cookie 保存在这台设备上,无需账户。
PETKIT_TIMEZONE env这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月7日
注册名称已通过 GitHub 账户 dirkjanfaber 验证,该账户拥有此仓库
我们还没有从 GitHub 读取这个仓库
我们还没有从 GitHub 读取这个仓库
它在你的电脑上运行,没有互联网端点
在你的电脑上运行,改用本地设置
它在你的电脑上运行;我们只能读取互联网端点的工具列表
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
你需要填写:PETKIT_EMAIL, PETKIT_PASSWORD, PETKIT_REGION
它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。
GitHub 仓库最后更新于–,最新版本(0.4.0)于13天前进入注册中心。
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 Node.js。
同一分类中有:Spec Driven Development, Remote Desktop Commander, Hunter Killer
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Liquidation walls, snapshot age, evidence labels and a public record. Managed OAuth.
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
MCP (Model Context Protocol) server for the PetKit cloud API. Exposes feeder status and control for the Fresh Element Solo (device type D4) as MCP tools.
Disclaimer: This project is not affiliated with, endorsed by, or in any way associated with PetKit. It is an independent, community-developed integration created by a happy user of their hardware and software. PetKit and Fresh Element Solo are trademarks of their respective owner. Use of this package is at your own risk. The underlying API is unofficial and reverse-engineered by the community - it may change or break without notice.
| Tool | Description |
|---|---|
list_feeders | List all Fresh Element Solo feeders and their live state (food/battery/desiccant status, lock/light/sound settings, today's feed totals) |
feed_now | Dispense food immediately |
update_feeder_setting | Change a numeric setting (child lock, indicator light, dispense tone, shortage alarm, ...) |
skip_scheduled_feed | Skip one of today's scheduled meals (d4/removeDailyFeed), leaving the recurring plan untouched |
restore_scheduled_feed | Undo a skip for today (d4/restoreDailyFeed) |
The D4 only accepts these five portion sizes: 10, 20, 30, 40, 50.
list_feeders also returns feedPlanToday: today's scheduled meals from the feeder's weekly plan (d4/device_detail's multiFeedItem), each with its readable time, the feedTime (seconds since midnight) that skip_scheduled_feed takes, the portion amount in feed_now's units, and the meal name.
list_feeders also returns dispenseLogToday (from d4/dailyFeeds): every dispense that completed today, oldest first. dispensedAt is when it really happened in your timezone (dispensedAtUtc in UTC), and feederClock is the time the feeder's own clock showed, so the two differ when that clock is wrong. clockOffsetMinutes sums that up from the latest dispense, rounded to 15 minutes. For example, it's 60 for a feeder that missed the switch to winter time and drops every meal an hour early, and null before the first dispense of the day. PetKit has no endpoint that reads the feeder's clock directly. Power-cycling the feeder made it pick up the new time.
list_feeders' fedToday/fedTodayScheduled/fedTodayExtra/fedTodayPlanned/dispensesToday/feedTimesToday fields reflect what each *physical feeder* dispensed - PetKit has no way to attribute a dispense to a specific cat. If your cats share or steal from each other's bowls, these numbers won't tell you what any one cat actually ate.
| Key | Meaning |
|---|---|
manualLock | Child lock (0/1) |
lightMode | Indicator light |
feedSound | Dispense tone (0/1) |
foodWarn | Shortage alarm (0/1) |
Other numeric keys the device reports via list_feeders may also work but are unconfirmed.
Set the following environment variables before starting the server:
export PETKIT_EMAIL="your@email.com"
export PETKIT_PASSWORD="yourpassword" export PETKIT_REGION="Netherlands" # must match the exact region name shown in the PetKit app export PETKIT_TIMEZONE="Europe/Amsterdam" # optional, defaults to the host's own timezone
Note: PetKit account passwords are capped at 6-14 characters. A longer password fails login with a generic "incorrect username or password" error indistinguishable from an actually-wrong one - if login fails unexpectedly, check that first.
Add to your claude_desktop_config.json:
{
"mcpServers": { "petkit": { "command": "npx", "args": ["mcp-server-petkit"], "env": { "PETKIT_EMAIL": "your@email.com", "PETKIT_PASSWORD": "yourpassword", "PETKIT_REGION": "Netherlands" } } } }
To use the server from claude.ai and the Claude mobile apps, run it in HTTP mode on an always-on machine and add it as a custom connector. claude.ai connects from the internet, so the server needs a public https:// URL. A Cloudflare Tunnel or Tailscale Funnel gives you one without opening ports on your router (see below).
HTTP mode is single-user: when you connect Claude, the server shows a page asking for your owner passphrase. Anyone who knows it can authorize a client, and anyone with a token can dispense food or change the feeding plan - pick a strong one.
npx mcp-server-petkit --http # or MCP_TRANSPORT=http
| Variable | Default | |
|---|---|---|
MCP_PUBLIC_URL | (required) | The https:// URL claude.ai reaches the server on |
MCP_OWNER_PASSWORD | (required) | Passphrase for authorizing Claude, at least 12 characters |
MCP_HOST | 127.0.0.1 | Interface to listen on; the Docker image sets 0.0.0.0 |
MCP_PORT | 3000 | |
MCP_STATE_FILE | ~/.mcp-server-petkit/oauth-state.json | Registered clients and refresh-token hashes, so Claude stays connected across restarts |
plus the PETKIT_* variables from Configuration.
Each release publishes ghcr.io/dirkjanfaber/mcp-server-petkit for amd64, arm64 and arm/v7 (32-bit Raspberry Pi OS), tagged with the version and latest. Put the PetKit and MCP_* settings in a .env next to the compose file (chmod 600 .env), and give the server a public URL with one of the two options below.
Private overlay networks such as ZeroTier or plain Tailscale aren't enough on their own: claude.ai connects from Anthropic's servers, not from your devices.
With a Cloudflare Tunnel alongside the server, no port needs publishing: in the Cloudflare dashboard, go to Zero Trust → Networks → Tunnels, create a Cloudflared tunnel, and point its public hostname at http://petkit-mcp:3000 (service type HTTP). Put the tunnel's token in .env as TUNNEL_TOKEN:
# docker-compose.yml
services: petkit-mcp: image: ghcr.io/dirkjanfaber/mcp-server-petkit:latest # or pin a version, e.g. :0.3.0 restart: unless-stopped env_file: .env # PETKIT_*, MCP_PUBLIC_URL, MCP_OWNER_PASSWORD volumes:
volumes: petkit-data:
Don't put Cloudflare Access in front of the hostname: claude.ai can't get past its login page, and the owner passphrase already guards the server.
Tailscale Funnel gives the Pi a public https:// . .ts.net URL. It runs fine next to ZeroTier or other VPNs.
curl -fsSL https://tailscale.com/install.sh | sh && sudo tailscale uptailscale funnel offers a link to switch it on when it isn't allowed yet. # docker-compose.yml
services: petkit-mcp: image: ghcr.io/dirkjanfaber/mcp-server-petkit:latest restart: unless-stopped env_file: .env # PETKIT_*, MCP_PUBLIC_URL, MCP_OWNER_PASSWORD ports:
sudo tailscale funnel --bg 3000. tailscale funnel status shows the public URL. Put it in .env as MCP_PUBLIC_URL, then run docker compose up -d.The URL contains the machine name, so rename the machine first if you want a nicer one. Changing the URL later means updating MCP_PUBLIC_URL and reconnecting Claude.
Check the public URL before connecting Claude:
curl https://<your public host>/.well-known/oauth-authorization-server
It should return JSON whose issuer matches MCP_PUBLIC_URL. A freshly enabled Funnel can take a minute to start answering.
Update with docker compose pull && docker compose up -d. To build the image yourself instead, replace image: with build: https://github.com/dirkjanfaber/mcp-server-petkit.git.
The server trusts one proxy hop (X-Forwarded-For from the tunnel in front of it) for rate limiting. Don't also publish its port directly to the internet.
In claude.ai: Settings → Connectors → Add custom connector, with URL https:// /mcp. Claude registers itself, opens the passphrase page, and once you allow it, the tools show up in claude.ai and the mobile apps.
PetKit allows one session per account. The server's login signs the PetKit app out (and vice versa); it re-logs in on its own when that happens, but expect the app to ask you to log in again whenever the server restarts or its session lapses. Running the stdio server, Node-RED's PetKit nodes, or a second HTTP instance on the same account makes them take turns signing each other out.
node-red-contrib-petkit's CLAUDE.md