Slatis Public API v1 is open for beta testers Register on the waitlist →
Slatis

MCP Server

Connect AI agents to Slatis over the Model Context Protocol — remote Streamable HTTP endpoint or local stdio server, 25 time-aware scheduling tools.

The Slatis MCP server gives any MCP-capable agent host (Claude Code, Cursor, custom agents) time-aware scheduling tools backed by the public API: discover event types, check availability and team capacity, run the full booking lifecycle, manage time layers and out-of-office, and read team-health analytics — with idempotent, retry-safe mutations and undo support.

Two ways to connect:

TransportURL / commandBest for
Remote (Streamable HTTP)https://slatis.com/api/mcpHosts that support custom headers — zero install
Local (stdio)npx @slatis/mcpHosts without header support, air-gapped configs

Both speak to the same API with the same key — tools, scopes, and behavior are identical.

Authentication

Authenticate every request with your API key (Settings → API Keys):

  • Header: Slatis-Api-Key: sk_live_... (also accepted, in precedence order: x-api-key, Authorization: Bearer sk_live_...)
  • pk_* public keys cover discovery + booking creation; sk_* secret keys unlock everything else (see the scope column in the tool reference below).

Treat the key like a password. The server never logs or echoes it, but your MCP host config stores it — use your host's secret management where available.

Remote setup

Claude Code

claude mcp add --transport http slatis https://slatis.com/api/mcp \
  --header "Slatis-Api-Key: sk_live_..."

Cursor

.cursor/mcp.json:

{
  "mcpServers": {
    "slatis": {
      "url": "https://slatis.com/api/mcp",
      "headers": { "Slatis-Api-Key": "sk_live_..." }
    }
  }
}

Custom agents (TypeScript SDK)

import { Client } from '@modelcontextprotocol/sdk/client/index.js'
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'
 
const transport = new StreamableHTTPClientTransport(
  new URL('https://slatis.com/api/mcp'),
  { requestInit: { headers: { 'Slatis-Api-Key': process.env.SLATIS_API_KEY! } } }
)
const client = new Client({ name: 'my-agent', version: '1.0.0' })
await client.connect(transport)

The remote endpoint is stateless: no session ids, every request is self-contained, and JSON-RPC batching is not supported (one message per request). Hosts that require OAuth for remote connectors (claude.ai web, Claude Desktop connectors directory) are not yet supported — use the local stdio server there.

Local setup (stdio)

Claude Desktop (claude_desktop_config.json) or any host with command-based servers:

{
  "mcpServers": {
    "slatis": {
      "command": "npx",
      "args": ["-y", "@slatis/mcp"],
      "env": { "SLATIS_API_KEY": "sk_live_..." }
    }
  }
}

Environment variables: SLATIS_API_KEY (required), SLATIS_API_URL (optional, defaults to production), SLATIS_API_TIMEOUT_MS (optional).

Rate limits

The remote endpoint shares your key's API rate limit. Each tool call costs two rate-limit units (one for the MCP request, one for the underlying API call); protocol messages like initialize and tools/list cost one. Standard X-RateLimit-* headers apply. Defaults: 1000 req/min for secret keys, 100 req/min for public keys.

Tool reference

25 tools. The scope column shows the minimum key type and API scope; calls without the scope fail with an actionable forbidden error naming the missing scope.

Discovery & availability

ToolDescriptionKey / scope
list_event_typesDiscover bookable services — call firstpk
get_event_typeDetail + booking form fieldspk
get_availabilityOpen slots by date rangepk
check_slotPreflight one specific slotpk
get_freebusyFree/busy + working hours for a memberpk
get_capacityTeam utilization, booked/available hours, timelinepk
list_team_membersMembers, ids, skillspk
find_available_membersWho can take a booking on a datepk

Booking lifecycle

ToolDescriptionKey / scope
create_bookingBook a slot (auto idempotency key, DRAFT→poll)pk
get_bookingStatus/detail — poll until SCHEDULEDsk
list_bookingsFiltered, paginated booking searchsk
cancel_bookingCancel with reasonsk
reschedule_bookingMove to a new verified slotsk
confirm_bookingConfirm PENDING_CONFIRMATIONsk
check_booking_guardrailsPreflight org booking policy before create_bookingsk
log_time_entryRecord actual minutes on a completed bookingsk + time-entries:write

Intelligence

ToolDescriptionKey / scope
get_team_healthAggregated team analytics: load distribution, burnout headcountssk + analytics:read
score_slotRank candidate slots by calendar-health impact (max 10)sk + analytics:read
get_member_loadIndividual load + burnout (org must opt in, else 403)sk + analytics:read

Time layers & OOO

ToolDescriptionKey / scope
list_time_layersList a user's working/bookable/break/OOO layerssk + layers:read
create_time_layerAdd a layer to a user's schedule (undoable)sk + layers:write
replace_time_layersReplace ALL layers of given types — destructive, not undoablesk + layers:write
delete_time_layerSoft-delete one layer (also the undo for create)sk + layers:write
create_oooCreate out-of-office — always PENDING human approvalsk + layers:write
cancel_oooCancel an OOO entry (also the undo for create_ooo)sk + layers:write

Behavior notes for agent builders

  • Idempotency — mutations auto-generate an idempotency key when omitted; retries replay the original result (idempotent_replay: true) instead of duplicating.
  • Undo — write commands return an inverse_command; delete_time_layer undoes create_time_layer, cancel_ooo undoes create_ooo. replace_time_layers is not invertible — the tool description warns the agent before use.
  • Human-in-the-loop — agent-created OOO is always created PENDING approval, regardless of team settings.
  • Errors are prompts — every error returns an actionable next step (e.g. a booking conflict tells the agent to call get_availability for alternatives).
  • Guardrails — org booking policies (max bookings per member/day, burnout protection) are enforced server-side on create_booking; use check_booking_guardrails to preflight instead of burning a 422.

On this page