API and MCP reference

Calendar

2 operations. Each REST operation is also an MCP tool of the same name. REST https://tlntconnect.com/api/v1

GET/api/v1/calendar/holdsInternal calendar holds starting between start and end (YYYY-MM-DD, at most a year apart).

The workspace's internal calendar holds (the holds the app's calendar shows, whoever created them — staff in Atlas, Atlas from an email signal, or an API key) starting between start and end inclusive (YYYY-MM-DD, UTC days, at most 366 days apart): id, title, description, starts_at, ends_at, timezone, location, event_kind, campaign_id, created_by, created_at. Holds Atlas proposed from email can carry text from outside the agency, so title, description and location are labelled untrusted. Tasks with due dates are read with GET /tasks.

MCP tool
list_calendar_holds
Scopes
tasks:read
Members
admin, manager, scout, viewer
Idempotency-Key
Ignored (read)
Rate weight
1
Untrusted fields
title description location

Input

end query, requiredstring
start query, requiredstring

Responses

200Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
429rate_limited (honour Retry-After)
500internal_error
POST/api/v1/calendar/holdsPut an internal hold on the workspace calendar (not an invite: nobody outside the agency is contacted).

Creates an internal calendar hold through the same operation Atlas chat uses (createTlntAgentCalendarEvent): it appears on the app's calendar at once, is recorded on the Atlas action ledger with source public_api, and contacts nobody. API holds are internal-only: external invites (anything that would contact someone outside the agency) are refused, and are never created over the API. An API hold is not governed by Atlas's calendar setting: it is created even when Atlas's calendar area is set to ask for approval or is off, because the Public API is its own feature (its own scopes and role ceiling decide). title (1-240), starts_at (ISO 8601), optional ends_at (not before starts_at), timezone (default UTC), description, location, event_kind (default meeting_request) and campaign_id (a campaign the member can open; otherwise 404). Returns 201 with the hold.

MCP tool
create_calendar_hold
Scopes
tasks:write
Members
admin, manager
Idempotency-Key
optional
Rate weight
1

Input

Idempotency-Key headerstring — Retry-safe key (1-255 printable ASCII; a UUID is recommended; an RFC 8941 quoted string is accepted). The same key with the same request within 24h replays the stored response byte for byte (Idempotent-Replayed: true) without running again; the replay still consumes the operation's rate weight.
campaign_id bodystring (uuid) | null
description bodystring | null
ends_at bodystring | null
event_kind body"meeting_request" | "due_date" | "campaign_milestone" | "call_reschedule" | "deliverable_deadline"
location bodystring | null
starts_at body, requiredstring
timezone bodystring
title body, requiredstring

Responses

201Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
409idempotency_key_reused / idempotency_in_progress / idempotency_context_changed / idempotency_response_too_large
429rate_limited (honour Retry-After)
500internal_error / idempotent_replay_of_failure
503service_unavailable