acuity-mcp

acuity-mcp

A local MCP server that enables Claude to manage Acuity Scheduling appointments, check availability, list appointment types, and handle multiple accounts, all via natural language.

Category
访问服务器

README

acuity-mcp

A local MCP server exposing the Acuity Scheduling API as Claude Code tools — list/create/reschedule/cancel appointments, check availability, list appointment types, calendars, and clients, all directly from a Claude session. Supports multiple Acuity accounts side by side, switchable per tool call.

Built custom because no maintained free MCP for Acuity exists — the only GitHub repo found during research pointed at an npm package that was never published. Uses @modelcontextprotocol/sdk + zod, runs over stdio.

If you're Claude: read this first

If a user asks you to set this up, add an Acuity account, switch accounts, or troubleshoot a connection, load .claude/skills/acuity-mcp-setup/SKILL.md in this repo — it has the full step-by-step for all of that. This README is the human-facing reference; the skill is what you should actually follow.

What you need before setup

An Acuity Scheduling User ID and API Key, from Acuity: Business Settings → Integrations → API. One pair per Acuity account you want to connect.

⚠️ Acuity gates API access by plan tier. Some plans return 403: API access is only available on Powerhouse plans for every request — this is Acuity rejecting your account, not a bug here. Basic Auth succeeding (no 401) but every call still 403-ing is the signature of this. If you hit it, either upgrade the plan, or use an alternative path to the same account (e.g. a Zapier Acuity connector, which has empirically not been subject to the same restriction).

Install

npm install

Quick start — one account

node bin/acuity-accounts.js add production --user-id <your-user-id> --api-key <your-api-key>

The first account you add automatically becomes the default. Then register the server with Claude Code:

claude mcp add acuity -s user -- node "$(pwd)/server.js"

Start a new Claude Code session (or run /mcp in an existing one) so the tools show up.

Verify it works without a Claude session at all:

node bin/acuity-accounts.js test

Multiple accounts

Add as many named accounts as you want:

node bin/acuity-accounts.js add production --user-id 1111111 --api-key aaaa... --label "Real account"
node bin/acuity-accounts.js add sandbox    --user-id 2222222 --api-key bbbb... --label "Trial/test account"

Credentials live in ~/.config/acuity-mcp/accounts.json (chmod 600, never inside this repo, never committed). Manage them:

node bin/acuity-accounts.js list                # see configured accounts (never prints API keys)
node bin/acuity-accounts.js set-default sandbox # change which one is used by default
node bin/acuity-accounts.js remove sandbox      # remove one
node bin/acuity-accounts.js test sandbox        # verify one specific account's credentials

Switching accounts inside a Claude session doesn't require re-registering anything — every tool this server exposes accepts an optional account argument:

"List appointment types for the sandbox account" → Claude calls list_appointment_types with {"account": "sandbox"}.

Ask Claude to run list_accounts at any time to see what's configured and which is default.

If you'd rather run fully separate MCP server registrations per account instead (e.g. so each shows up as a distinctly-named server), that still works — point ACUITY_ACCOUNT at a name instead of passing account per call:

claude mcp add acuity-production -s user -e ACUITY_ACCOUNT=production -- node "$(pwd)/server.js"
claude mcp add acuity-sandbox    -s user -e ACUITY_ACCOUNT=sandbox    -- node "$(pwd)/server.js"

Credential resolution order

  1. ACUITY_USER_ID + ACUITY_API_KEY env vars (direct override, no accounts file needed)
  2. account argument on a tool call, or the ACUITY_ACCOUNT env var — looked up by name
  3. accounts.json's own default account
  4. accounts.json with exactly one account configured — used automatically
  5. Legacy flat ~/.config/acuity-mcp/credentials file (ACUITY_USER_ID=.../ACUITY_API_KEY=... lines) — supported for backward compatibility with older single-account setups

Tools

Local only, no Acuity API call:

  • list_accounts — list configured account names/labels and the default (never API keys)

Read-only:

  • list_appointment_types — list bookable consult types
  • list_calendars — list calendars/staff
  • list_appointments — filterable by date range / calendar / type / canceled status
  • get_appointment — full detail on one appointment by ID
  • check_availability_dates — available dates in a month for an appointment type
  • check_availability_times — available time slots on a date for an appointment type
  • list_clients — clients who have booked appointments

Mutating (real changes to the live calendar — Claude will ask for confirmation before calling these):

  • create_appointment — book a new appointment
  • reschedule_appointment — change an appointment's date/time
  • cancel_appointment — cancel an appointment

All tools accept an optional account argument (see Multiple accounts).

Not implemented (same pattern, add later if needed): payments, blocks, forms, webhooks, gift certificates.

Lessons learned (read before extending this server)

  • A 200 OK from a mutating call does not prove the mutation happened. reschedule_appointment originally called PUT /appointments/:id, which returned 200 and echoed back the unchanged appointment — Acuity silently ignored the datetime field on that endpoint. The fix was the dedicated PUT /appointments/:id/reschedule route, matching the pattern cancel_appointment already used (/appointments/:id/cancel). Always re-fetch with get_appointment after a write before trusting it, especially for any new mutating tool added later.
  • npx @modelcontextprotocol/inspector --cli does not reliably forward ad-hoc env vars to the node server.js process it spawns. If you're testing credentials that aren't already the resolved default (e.g. ACUITY_USER_ID=x ACUITY_API_KEY=y npx @modelcontextprotocol/inspector --cli ...), it can silently fall back to whatever's already configured and give a false positive/negative. Use node bin/acuity-accounts.js test <name> instead — built specifically to avoid this trap. The inspector CLI remains fine for its original purpose: testing the resolved default credentials, or --method tools/list to check tool schemas.

Manual verification

node bin/acuity-accounts.js test            # tests the default/env-resolved account
node bin/acuity-accounts.js test <name>     # tests one specific named account
npx @modelcontextprotocol/inspector --cli node server.js --method tools/list   # confirms the server starts and tools register correctly

推荐服务器

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 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

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

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

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

官方
精选
Python
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 模型以安全和受控的方式获取实时的网络信息。

官方
精选