Novacal Mcp Server

io.github.ste7由 GitHub 账号 ste7 发布v0.1.0更新于 Oct 25, 2026

Manage Novacal event types, availability, and bookings.

已验证Streamable HTTP可网页运行效率与工作流沟通与协作

概览

AI 生成的概览

远程 Novacal MCP 服务器,让 AI 助手列出活动类型、查询可用时间,并预订、改期或取消会议。

可以做什么
列出和获取活动类型,可按个人或团队范围筛选,并创建新的活动类型(名称、slug、时长、颜色等)。按日期范围和时区查询某活动类型的空闲时段。列出账户中的活动。预订新活动,可填写开始、结束、时区、地点和表单答案。改期或取消未来的活动,取消时可附原因。
适用场景
适合在 Novacal 中管理日程、希望助手直接回答可用时间、推荐时段,或创建、调整、取消会议而无需打开 Novacal 界面的场景。
运行要求
远程 Streamable HTTP 端点 mcp.novacal.io/mcp,需作为 HTTP MCP 服务器或自定义连接器添加。首次连接需 OAuth 登录并粘贴 Novacal API 密钥,服务器会向账户验证该密钥。托管服务无需本地运行环境。
安装前请注意
OAuth 过程中需提供 Novacal API 密钥;密钥会加密存入会话,但在客户端移除连接并不会吊销密钥,需在 Novacal 中轮换密钥才能切断访问。服务器可创建活动类型并预订、改期或取消活动,会改动真实日历数据;取消操作被标记为破坏性,客户端可能先询问确认。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Novacal Mcp Server,将其添加到工作区。
  2. 连接 所需的 凭据。它们会被私密存储,绝不会在公开页面上展示。
  3. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/io.github.ste7%2Fnovacal-mcp-server/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。 客户端会在首次连接时完成 OAuth 登录。

{
  "mcpServers": {
    "novacal": {
      "type": "http",
      "url": "https://mcp.novacal.io/mcp"
    }
  }
}

README

[Novacal MCP Server]

[CI status] [Transport: Streamable HTTP] [Tools: 8] [Deploys to Cloudflare Workers] [Last commit]

A remote MCP server for Novacal. It gives your AI client eight tools to read your event types, check availability, and book, reschedule, or cancel meetings.

It runs as a single Cloudflare Worker and speaks Streamable HTTP. You connect once with OAuth, paste your Novacal API key, and your client keeps working from there.


Connect

The hosted server is at https://mcp.novacal.io/mcp.

Claude Code

bash
claude mcp add --transport http novacal https://mcp.novacal.io/mcp

Cursor, Windsurf, or any client with an MCP config file

json
{  "mcpServers": {    "novacal": {      "type": "http",      "url": "https://mcp.novacal.io/mcp"    }  }}

Claude Desktop and claude.ai

Add a custom connector and paste the same URL.

On first connect your client opens the sign-in page. Paste your Novacal API key and press Connect. That is the whole setup.


Tools

ToolWhat it doesArguments
novacal_get_event_typesList event types on the accountscope (personal or team, optional)
novacal_get_event_typeFetch one event typeid
novacal_create_event_typeCreate an event typename, slug, type, duration, hidden_from_profile, color + 10 optional fields
novacal_get_availabilityFree slots for an event type in a date rangeevent_type_id, start, end, timezone (optional)
novacal_get_eventsList events on the accountnone
novacal_create_eventBook an eventevent_type_id, start, end, timezone, time_format, location and form_field_answers (optional)
novacal_cancel_eventCancel a future eventid, cancellation_reason (optional)
novacal_reschedule_eventMove a future eventid, start, end, timezone, time_format, user_role and form_field_answers (optional)

Read tools are marked read-only and idempotent. novacal_cancel_event is marked destructive, so clients that ask before destructive calls will ask.

Event type scope

novacal_get_event_types takes an optional scope:

json
{ "scope": "personal" }

Use personal for your own event types and team for team event types. Leave it out to get both. The server tells the model to prefer personal unless you ask for a team event type.

Availability date ranges

start and end are plain YYYY-MM-DD dates. The range is start-inclusive and end-exclusive:

txt
[start 00:00, end 00:00)

For a single day, pass the next day as end:

json
{  "event_type_id": 123,  "start": "2026-05-29",  "end": "2026-05-30",  "timezone": "Europe/Amsterdam"}

That returns availability for May 29, 2026. Passing the same date for start and end is an empty range and returns nothing.

Timezones

timezone takes an IANA name such as Europe/Amsterdam, America/New_York, or Asia/Tokyo. It defaults to UTC when omitted.

On connect the server reads your Novacal profile timezone and puts it in the server instructions. So the model reads relative dates in your timezone and shows times in your timezone, unless you ask for another one.


How auth works

  1. Your client starts an OAuth flow against the Worker.
  2. The Worker serves /authorize and asks for your Novacal API key.
  3. It verifies the key with GET /v1/users/me.
  4. It encrypts the key into the OAuth session props and completes the flow.

The key is only recoverable with your access token. It is never written to storage in readable form, never echoed back into the page, and is kept out of the grant metadata, which is stored unencrypted.

Removing the connection in your client does not revoke the key. To cut off access, rotate the key in Novacal.


Local development

You need Node 20+ and a Cloudflare account for deploys.

bash
npm installnpm run dev
EndpointURL
MCPhttp://127.0.0.1:8787/mcp
Sign-in pagehttp://127.0.0.1:8787/authorize
Health checkhttp://127.0.0.1:8787/health

npm run dev uses the dev Wrangler environment. It simulates KV and D1 locally and points at a Novacal API on http://localhost:8010, so it never touches production resources.

To poke at the tools by hand:

bash
npx @modelcontextprotocol/inspector

Checks

bash
npm run check    # tsc --noEmitnpm run lint     # biome checknpm run format   # biome check --writenpm test         # vitest run

CI runs check, lint, and test on Node 20 for every push and pull request.


Deploy

Create the Cloudflare resources once:

bash
npx wrangler kv namespace create OAUTH_KVnpx wrangler d1 create novacal-mcp-server-db

Copy the returned IDs into wrangler.toml under OAUTH_KV and DB, then apply the schema:

bash
npx wrangler d1 execute novacal-mcp-server-db --remote --file=./migrations/0001_user_credentials.sql

Deploy the production environment:

bash
npm run deploy

Note: the user_credentials table is legacy. Credentials now live in the encrypted OAuth session and nothing reads or writes this table. It and the DB binding stay only so existing deployments keep validating.

Configuration

NameTypeValue
NOVACAL_API_BASE_URLvarhttps://api.novacal.io in production, http://localhost:8010 in dev
OAUTH_KVKV namespaceOAuth client, grant, and token storage
DBD1 databaselegacy, unused

How it is put together

txt
src/├── index.ts            OAuthProvider wiring, /authorize, metadata routes├── auth.ts             API key verification and the sign-in page├── mcp.ts              tool registration and server instructions├── api.ts              Novacal HTTP client, UpstreamApiError, 30s timeout├── responses.ts        okResult / failedResult envelopes├── types.ts            Env, session props, Novacal types└── handlers/    ├── event-types.ts  list, get, create    ├── events.ts       list, create, cancel, reschedule    └── availability.ts availability lookup

Handlers are plain async functions with no MCP imports, so they are easy to test on their own. Every tool wraps its handler in a try/catch and returns an isError result instead of throwing. Failures reach the model as a short hint, not a raw JSON dump:

txt
401 — Novacal API key is invalid or revoked. Re-authorize at /authorize.429 — Rate limited by the Novacal API. Wait a moment before retrying.

Calls to the Novacal API time out after 30 seconds.

Public routes

RoutePurpose
GET /server name and status
GET /healthhealth check
GET /.well-known/oauth-protected-resourceRFC 9728 metadata, with /mcp suffix variant
GET POST /authorizesign-in page and form post
POST /token, POST /registerhandled by OAuthProvider
POST /mcpthe MCP endpoint, requires a bearer token

Links

来源:README.md,提交 0b0b457

工具

0
该服务器需要登录,因此 SourceWeft 无法在没有账号的情况下读取其工具,也未收录。已连接账号所能看到的内容可能因账号及其权限而异。

版本历史

1
  1. v0.1.0最新Sep 16, 2026

评分

已满足适用检查项的 75%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分

    请在仓库或注册中心条目中声明许可证。