mcpField
D
Dine MCP

Dine MCP

本地服务
github.com/benjamin-di地图与出行15 天前更新

关于 Dine MCP

Dine MCP 是只读餐位查询服务,面向希望查看多个预订平台空位的人。它识别餐厅并返回当地时区的可订时段和预订链接,但不会代为预订或留桌。

主要功能

  1. 01查找餐厅及预订渠道
  2. 02查询多个平台的空位
  3. 03显示当地时间和预订链接
  4. 04报告平台状态与覆盖情况
  5. 05提供命令行和 Python 接口

适用场景

  1. 01查询多人晚餐时段
  2. 02比较多家餐厅的空位
  3. 03查找餐厅预订页面
  4. 04检查平台状态和请求限制

MCP 相关

通过 MCP 工具提供餐厅查找、详情、空位查询和服务状态。结果包含文本与结构化数据;服务不会预订、留桌或取消。

配置

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

mcp.json · 通用配置
{
"mcpServers": {
"benjamin-di-dine": {
"command": "uvx",
"args": [
"dine-mcp"
]
}
}
}
启动命令uvx dine-mcp

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypidine-mcp0.2.10

工具

4

收录的工具列表 · 更新于 4 天前

参数类型必填说明
urlany否预订页面链接(SevenRooms、TableCheck、ResDiary);不会抓取该链接
areaany否所在位置:区域或城市(“Central”、“Shibuya”)
nameany否餐厅名称,可使用任意文字体系(“Amber”、“鮨 しこう”)
limitinteger否返回的候选项数量(1-10)
countryany否ISO 3166-1 alpha-2 国家/地区代码(“HK”、“JP”)
google_place_idany否来自地图工具的 Google place id(ChIJ…)

详细介绍

dine-mcp

面向 AI 助手(MCP)、命令行和 Python,查询餐厅实际使用的预订系统中的餐桌空位,覆盖全球各国。

询问“周五晚上能在 Harbour Grill 订到一张四人桌吗?”,助手会找到餐厅,确定其使用的预订系统(通过 Google Maps 的“预订餐桌”链接、餐厅的预订页面或整理好的事实信息),按餐厅所在时区查询空位,并提供预订服务商的预订页面;条件允许时,还会预先填写信息。dine-mcp 绝不会替你预订、占位或取消:你需要自行前往服务商页面预订。

服务商国家/地区模式成熟度上次在线验证
CatchTable (Korea)KR列表实验性未验证
Formitable (Zenchef)NL, BE, FR, DE, GB公开实验性未验证
ResDiaryGB, IE, AU, NZ, AE, SG, HK, MY, ZA公开Beta2026-10-29
SevenRoomsHK, GB, US, AE, AU, SG, IE, CA公开Beta2026-10-29
TabelogJP列表实验性未验证
TableCheckJP, HK, SG, KR, TW, TH, AU, GB, US公开Beta2026-10-29
ZenchefFR, NL, BE, GB, DE, CH, ES, IT公开实验性未验证

SevenRooms 会返回可预订/可申请的时段、用餐体验和银行卡标记;ResDiary 还会列出就餐区域。TableCheck 不公布其放号时间,因此尚未开放的日期可能显示为客满。 其他预订页面仅提供链接;仅通过电话、消息或网站预订的餐厅会返回联系方式。 如果地点列表中没有预订链接,可选择启用网站发现功能,以检测受支持的小组件。

后续将通过定义和适配器支持更多服务商(CONTRIBUTING.md);下一步计划见 docs/ROADMAP.md。

非官方项目,与任何预订服务商或 Google 均无关联。服务商条款限制自动访问:dine-mcp 只读取其公开预订小组件,供个人以正常人工操作的速度查询自己要预订的餐桌,且绝不代为预订。请仅用于个人、低频用途,风险自负。餐厅查询通过 google-maps-keyless-mcp 使用 Google Maps;该项目的条款提示同样适用。

快速开始

版本:0.2.10。 有关安全更新和空位查询修复,请参阅更新日志。从源码检出目录运行:

uv sync --locked
uv run dine-mcp --transport stdio

对应的安装包命令和客户端配置如下:

uvx dine-mcp --transport stdio            # for a local MCP client (Claude Desktop, Claude Code, …)

Claude Code:claude mcp add dine -- uvx dine-mcp --transport stdio。Claude Desktop (claude_desktop_config.json):

{"mcpServers": {"dine": {"command": "uvx", "args": ["dine-mcp", "--transport", "stdio"]}}}

无需助手,也可以直接使用命令行执行相同操作:

uvx dine-mcp find "Harbour Grill" --area "Raffles Place" --country SG
uvx dine-mcp check v_abc123def456 --date 2026-11-06 --from-time 18:00 --to-time 21:30 --party 4

工具

工具功能
dine_find_venue(name, area, country | url | google_place_id, limit)识别一家餐厅及其预订渠道。名称不明确时会返回候选项及其 Google place id,不会猜测。预订链接只会与已知服务商匹配,不会抓取链接。
dine_get_venue(venue_id)餐厅的完整信息:各服务商的预订规则(可提前预订的天数、人数限制)、预订链接、营业时间。
dine_check_availability(venue_ids ≤5, date_from, date_to ≤7 days, time_from, time_to, party_size, kinds, response_format)每家餐厅和每个渠道各返回一条结果:餐厅所在时区的可订时段、覆盖范围、observed_at、预订链接。
dine_status(check=false)服务商、预算和暂停状态。可选的限速探测共用一个持久化的 15 分钟冷却时间。

所有工具均为只读。每项结果也会以简短文本形式返回,供只显示文本的客户端使用。

要查询餐厅,先用 dine_find_venue 确认餐厅,然后调用 dine_check_availability。 请先询问缺少的日期和用餐人数,并说明使用的时间范围(API 默认值为 17:00–22:30)。dine_status 用于诊断服务;它不会查询餐厅的餐位。 请求失败和未经检查的日期表示可订情况未知,绝不能视为已订满的证据。

状态(按餐厅和渠道):ok、none_available、not_yet_open(日期尚未开放预订;已知时会提供 opens_at)、party_too_small(附带 min_party)或 party_too_large(附带餐厅的在线人数上限及其联系方式)、closed、contact_only、unsupported(dine-mcp 无法读取的预订系统;会提供链接)、blocked / rate_limited(服务商要求我们降低请求频率)、unavailable、unknown_venue、skipped_deadline。任何一个服务商失败都不会导致整个调用失败。

**限制:**每次查询可订情况最多查询 5 家餐厅和 7 天。预计会产生超过 20 次服务商请求的计划将被拒绝,并返回 too_broad;实际发送的请求(包括重定向请求)共用相同的上限。查找、获取和查询可订情况共用 30 秒的端到端截止时间,涵盖查找、规划和服务商处理。已完成的批次会保留,不受后续错误和超时影响;未返回的日期仍为未知,绝不能视为无可订时段。观察结果缓存 2 分钟。TableCheck 的结果复用要求时间范围相同;因服务商限流而返回较早的观察结果时,会标注其原始时间。stdio 支持进度通知;无状态 JSON HTTP 会返回已完成的结果。

错误是带有 isError 的工具结果,其文本为 {"error": {"code", "retryable", "retry_after_seconds", "action", "next_step"}}。

运行服务

经过加固的 Compose 示例提供了只读根文件系统、已移除的能力和私有状态卷。部署时,将 DINE_IMAGE 设为经过验证的不可变镜像摘要。 接受远程客户端之前,请为代理配置 HTTP Host/Origin 允许列表。

在源码检出目录中运行 uv run dine-mcp --transport http,或者在启动容器前,将 DINE_IMAGE 设为 0.2.10 镜像经过验证的不可变摘要:

docker run -d -p 127.0.0.1:8000:8000 -v dine-state:/state \
  -e MCP_BEARER_TOKEN="$(openssl rand -hex 32)" \
  "${DINE_IMAGE:?set a verified immutable image digest}"

MCP 端点为 /mcp(可流式传输的 HTTP、无状态 JSON);/health 为开放端点。由调用方决定使用哪部分请求预算:

模式设置用户
singleMCP_BEARER_TOKEN一位用户,owner
users(独立多用户)DINE_USERS_FILE;dine-mcp users add <id> --file users.toml 会将该用户的令牌显示一次提交令牌的用户
gatewayMCP_BEARER_TOKEN(网关的令牌)和 DINE_PERSON_HEADER(例如 X-Person)经验证的用户,由通过身份验证的网关声明;首次联系时会创建记录
stdio--transport stdio本地用户
变量默认值含义
---------
DINE_STATE_DIR$XDG_STATE_HOME/dine-mcp(镜像中为 /state)场所、预算、断路器、名单
DINE_OVERRIDES无运营方开关(如下)
DINE_PLACESgooglenone 会关闭按名称搜索场所(链接仍可使用)
DINE_GOOGLE_DAILY_BUDGET200Google Maps 每日请求数
DINE_WEBSITE_DISCOVERY0设为 1 可在场所来源提供的网站上进行有界 HTML 探索
DINE_DEADLINE_SECONDS30find/get/check 和显式 canary 的端到端超时
DINE_HTTP_ALLOWED_HOSTSlocalhost,127.0.0.1,[::1]显式 HTTP Host 允许列表;添加反向代理主机名
DINE_HTTP_ALLOWED_ORIGINS空以逗号分隔的精确跨源 HTTP 来源;接受同源请求
DINE_APPS0设为 1 可启用可选的 MCP Apps 可用性网格;文本结果仍可用
DINE_HOST、DINE_PORT127.0.0.1、8000HTTP 监听地址

覆盖项(DINE_OVERRIDES,TOML)是运营方唯一的开关,在启动时应用:

disabled = false                 # true: find/get/check refuse before external work
[providers.tablecheck]
access_mode = "listing"          # stop reading availability; return links only (never raise a mode)
[providers.sevenrooms]
enabled = false                  # off entirely

每个提供方的请求频率限制为每两秒一次,且一次只处理一个请求;每日预算由服务器上的所有人共享(每人最多使用一半)。如果提供方拒绝请求(返回 429、401 或 403,或出现机器人检查),则至少暂停五分钟。它绝不会重试或解决挑战。

启用网站探索后,如果未知预订渠道,find/get/check 可能会读取当前场所来源网站。它能识别受支持的锚点和 iframe/button 属性,不运行 JavaScript,也不进行爬取。若检测到多个不同的场所组件,则视为存在歧义,不推断渠道。检测到的链接为暂定链接(source=website、verified=false),缓存时间最长为一天,且绝不会超出场所来源记录的范围;这些链接不会创建永久场所别名。

预订提供方的主机仍由其适配器管理;网站探索无法绕过其固定操作或预算。如果来源网站已列出受支持的预订场所,则无需抓取即可识别。网站读取使用独立的无凭据客户端,解码后正文上限为 512 kB,可选信息补充的截止时间为五秒。强制使用 HTTPS、公共 DNS 和精确主机重定向。所有网站合计每天最多读取 50 次,每人最多使用一半,请求间隔至少一秒;重定向也计入次数。读取失败后暂停 15 分钟,拒绝请求则触发共享的持久暂停。目录结果不受探索失败影响。dine_status 会报告该功能的总预算和暂停状态,但不会读取网站。禁用该功能并重启即可移除缓存的探索数据。网站请求会省略跟踪参数和片段;带有其他查询参数的来源 URL,以及带有查询参数的重定向,都会被拒绝。探索仅存储不含查询参数的已识别预订链接,不存储原始 HTML 或 Cookie。原始场所数据遵循其通常的保留政策。

身份验证、运营方操作、撤销和共享数据的说明见 docs/PERMISSIONS.md。

用作库

from dine_mcp.composition import build_app

app = build_app()
found = await app.service.find_venue("me", name="Harbour Grill", area="Raffles Place", country="SG")
venue_id = found["venues"][0]["venue_id"]
result = await app.service.check_availability("me", [venue_id], "2026-11-06", party_size=4)

工具接口遵循 SemVer;Python API 尚未稳定(0.x)。

工作原理

docs/ARCHITECTURE.md 介绍场所解析、提供方协议、请求预算和安全边界;docs/PROVIDERS.md 列出各提供方的端点、限制和特性;docs/ROADMAP.md 说明后续计划。

验证

make check 会运行离线安全、契约、真实 stdio/HTTP、隔离和回归检查。 make qualify 还会安装固定版本的 Node 22+ 工具,并运行 Inspector 以及适用的通用 MCP 一致性场景。有关范围、软件包检查以及单独设门控的运营方 canary,请参阅验证。运行状况检查绝不会联系提供方。

许可证

Apache-2.0。先前成果和依赖项均已在 NOTICE 中致谢。

可选的可用性网格

设置 DINE_APPS=1,即可向 MCP Apps 宿主公布 ui://dine/availability.html。 内置视图会按场所当地的服务日期显示各场所的可用情况,包括午夜后的时段、 观测时间戳和未知覆盖情况。筛选在本地执行。只有在用户点击后,预订页面导航才会请求 宿主打开 HTTPS 链接;视图本身不会调用服务提供方或工具。 不支持 Apps 的客户端仍会收到文本和结构化结果。此选项默认关闭。

运行 make ui(重新构建)和 make ui-check(锁定依赖、 可复现的打包产物和声明,以及离线渲染/SDK 测试)需要 Node 22+。Python 安装无需 Node。 剩余的服务提供方和连接前置条件请参阅路线图。

生成的接口参考记录了完整的 MCP 发现信息 (包括可选的 App 配置文件)和 CLI 解析器声明。有意更改接口后,运行 python scripts/surface.py update,并结合参考文档差异审查 surface.json。缺少基线或基线过期时,make check 会拒绝通过。在 这些声明仍分散于各加载器期间,环境和配置覆盖范围明确为不完整; 本参考不会取代上文的配置指南。图像冒烟测试会比较已安装入口点的完整 发现模式,以及合成的成功/错误行为。

评论

支持 Markdown

第一次接触 MCP?

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

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