Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
作者提供的说明(英文原文)
Find open slots, book, move and cancel Easy!Appointments bookings, with OAuth and a call log.
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
选择你使用的 AI 应用,然后复制设置。
你需要
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
适用于网页版、桌面版和手机版 Claude:
https://ea-mcp-demo.qiyuanlabs.ai/mcp在终端中运行这条命令
claude mcp add --transport http easyappointments https://ea-mcp-demo.qiyuanlabs.ai/mcp粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"easyappointments": {
"url": "https://ea-mcp-demo.qiyuanlabs.ai/mcp"
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"easyappointments": {
"type": "http",
"url": "https://ea-mcp-demo.qiyuanlabs.ai/mcp"
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
ChatGPT 只能连接互联网上的服务器:
https://ea-mcp-demo.qiyuanlabs.ai/mcp菜单名称可能因套餐和版本不同而略有差异。
你的选择通过 Cookie 保存在这台设备上,无需账户。
这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
工具名称和描述与服务器在 2026年11月6日 报告的完全一致。这些内容由作者撰写,不是我们写的;我们以纯文本形式显示。
list_servicesLists the services this business offers (length, price) and which providers offer each one. Call this first to get the service_id and provider_id that the other tools need.
find_open_slotsFinds open start times for one service over a range of days, across every provider who offers it or just one. Times are in the time zone of each provider, given in the result. Use this before booking or rescheduling.
find_customerSearches customers by name, email or phone and returns up to 10 matches with their customer_id. If several people match, ask which one is meant before booking.
list_appointmentsLists appointments for a customer, a provider and/or a date range, earliest first. Give at least one of customer_id, provider_id or date_from. Without dates it shows the next 30 days.
book_appointmentBooks an appointment for an existing customer (customer_id) or a new one (new_customer). Two steps: first call without confirm to get a preview and show it to the person; only after they agree, call again with the same arguments, confirm: true, the confirmation_token from the pre
reschedule_appointmentMoves an appointment to a new start time, optionally with another provider who offers the same service. Two steps: call without confirm for a preview, then, after the person agrees, again with confirm: true, the confirmation_token from the preview and an idempotency_key. Easy!App
cancel_appointmentCancels an upcoming appointment. Easy!Appointments deletes it and emails the customer a cancellation notice; this cannot be undone. Two steps: call without confirm for a preview, then, after the person agrees, again with confirm: true, the confirmation_token from the preview and
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月8日
注册名称已通过域名 qiyuanlabs.ai 验证(注册中心会核实域名所有权)
我们还没有从 GitHub 读取这个仓库
我们还没有从 GitHub 读取这个仓库
在 307 毫秒内响应(HTTP 200)
无需登录
已读取 7 个工具描述,未发现针对 AI 的隐藏指令
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
它在 3 项适用的基础检查中通过了 3 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
注册中心没有列出必需的密钥,不过有些服务器会在首次使用时要求你登录。
它在作者的云端运行。通过互联网连接,无需安装,但你发送的内容会经过作者的服务器。
GitHub 仓库最后更新于–,最新版本(0.1.0)于7天前进入注册中心。
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。它通过 URL 连接,所以接受远程 MCP 服务器的应用也可以使用,例如开启开发者模式的 ChatGPT。
同一分类中有:Spec Driven Development, Remote Desktop Commander, Filesystem MCP
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:★ 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.
Filesystem MCP server for AI assistants.
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
A remote MCP server that lets Claude, ChatGPT and other AI assistants work the front desk of an Easy!Appointments booking system: find open slots, look up customers, and book, move or cancel appointments.
It is built for the people who run the booking system, not only for developers:
confirmation_token and an idempotency key. A confirm that does not match a preview is refused, and a retried request never books twice.EA_REQUEST_BUDGET, 90 per two minutes by default) so many assistants together cannot lock it out.Not affiliated with or endorsed by Easy!Appointments. Easy!Appointments is a trademark of its owner.
| Tool | Access | What it does |
|---|---|---|
list_services | Read only | Services with duration, price and who offers them, plus each provider's time zone |
find_open_slots | Read only | Open start times for a service over up to 14 days, for one provider or all, filtered by morning, afternoon or evening |
find_customer | Read only | Customers by name, email or phone |
list_appointments | Read only | Bookings for a customer, a provider or a date range |
book_appointment | Front desk | Books for an existing or new customer |
reschedule_appointment | Front desk | Moves a booking to a new time or provider |
cancel_appointment | Front desk | Cancels a future booking |
Easy!Appointments sends its usual confirmation, change and cancellation emails for every change made through the API.
The compose file starts Easy!Appointments 1.6.1, a mail catcher and this server, then seeds a fictional physio clinic with services, providers, customers and two weeks of bookings.
cp .env.docker.example .env.docker
docker compose up -d --build sh demo/setup.sh
Then:
frontdesk@demo.test / demo-password-1)administrator / administrator)To check the whole flow without an AI client, run the end-to-end script. It registers an OAuth client, signs in, picks an access level and calls every tool, including a real booking that it then moves and cancels:
php demo/e2e.php http://localhost:8000 frontdesk@demo.test demo-password-1 front_desk
php demo/e2e.php http://localhost:8000 frontdesk@demo.test demo-password-1 read
To put the demo on a public server with HTTPS, follow docs/deploy-demo.md.
With Docker:
docker run -d --name ea-mcp \
-e APP_KEY=base64:... \ -e APP_URL=https://mcp.example.com \ -e TRUSTED_PROXIES=10.0.0.5 \ -v ea-mcp-data:/data/app \ -p 127.0.0.1:8080:8080 \ ea-mcp-server
Put it behind your HTTPS load balancer or reverse proxy, or set SERVER_NAME=mcp.example.com and publish ports 80 and 443 to let the built-in Caddy get a certificate.
TRUSTED_PROXIES decides whose X-Forwarded-For header is believed, and rate limits are per client IP. Set it to your proxy's address only, and publish port 8080 only to that proxy (or to 127.0.0.1 when the proxy runs on the same host). Never use * while the port can be reached directly, because anyone could then pick their own IP and slip past the rate limits. Leave it unset when the built-in Caddy handles HTTPS. Run php artisan schedule:work in a second container from the same image to prune old logs and expired tokens daily.
Without Docker it is a standard Laravel 13 app: composer install --no-dev, copy .env.example to .env, php artisan key:generate, php artisan passport:keys, php artisan migrate, and point your web server at public/.
Then link the booking system and add staff:
php artisan ea:connect "Maple Street Physio" https://booking.example.com # asks for the API token
php artisan ea:user anna@example.com --name="Anna" --level=front_desk # asks for a password
--level is the most that person may grant an assistant. They still choose per assistant on the consent screen.
If ea:connect gets a 401 from a working token, your web server is not passing the Authorization header to PHP. On Apache with PHP-FPM add SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1 to the Easy!Appointments vhost.
Add https://your-server/mcp as a custom connector (Claude: Settings > Connectors; ChatGPT: a workspace connector in developer mode). The client registers itself, opens the sign-in page, and the person picks *Read only* or *Front desk*. They can change or remove that at any time on /dashboard.
initialize and tools/list answer without a token, so a client can show what the server offers. Any tools/call (and everything else) without a valid token gets 401 with a WWW-Authenticate header pointing at the OAuth metadata, which is what starts sign-in in Claude and other clients. After sign-in, tools a connection may not use are not listed, and are refused if called anyway.confirmation_token from a preview of exactly the same arguments, by the same person and assistant, within 10 minutes (MCP_CONFIRMATION_MINUTES), plus an idempotency key. The key is claimed before anything is written, so parallel retries with one key book once.list_appointments instead of retrying blindly. Once Easy!Appointments confirms a write, nothing that happens afterwards (such as reading names back) can turn it into an error or undo it.https (or http on a loopback address) with no fragment or user info, registration is rate limited per IP (MCP_REGISTRATIONS_PER_HOUR, 10), and clients that are never used are removed after a day and unused ones after 90 days.MCP_KNOWN_CLIENT_HOSTS).MCP_LOGIN_ATTEMPTS_PER_ACCOUNT, 10 per 10 minutes). The public demo account set in DEMO_EMAIL is exempt from the per-account limit, because its password is published and the limit would only let strangers lock it. Session cookies are HTTPS-only whenever APP_URL is https.list_appointments.APP_ENV=production and APP_DEBUG=false in .env.example. ea:connect reads the API token from a prompt or EA_API_TOKEN, so it does not end up in shell history or the process list.MCP_LOG_RETENTION_DAYS).ea:user.composer install
cp .env.example .env && sed -i 's/^APP_ENV=production/APP_ENV=local/' .env php artisan key:generate && php artisan passport:keys && php artisan migrate php artisan test vendor/bin/pint
Tests run against an in-memory fake of the Easy!Appointments API (tests/Support/FakeEasyAppointments.php). demo/e2e.php runs against a real instance.
MIT