33 tools · 41 prompts

MCP Server

Connect skdul to Claude and other AI assistants for natural-language scheduling.

Overview

The skdul MCP (Model Context Protocol) Server lets AI assistants like Claude manage your scheduling through natural language. Instead of clicking through a UI, just tell Claude what you need — "Book a 30-minute call with Jane tomorrow at 2pm" — and it handles the rest.

The server exposes 31 tools across 9 categories, 2 resources, and 42 example prompts. Tools cover everything from profile management to calendar intelligence, smart booking, and async scheduling negotiation. Resources let AI clients read structured data without invoking a tool call.

Authentication is handled automatically via OAuth 2.1 + PKCE when connecting from claude.ai or Claude Code. Session tokens are valid for 2 hours; the server prompts re-authentication when they expire.

Setup

Connect from claude.ai, Claude Code, or any MCP-compatible client. All three methods are shown below.

Connect from claude.ai

No local setup or API key required — authentication is handled via OAuth.

  1. 1.Go to claude.ai → Settings → Integrations → Add custom integration
  2. 2.

    Enter the MCP server URL:

    https://www.skdul.ai/api/mcp
  3. 3.Complete the OAuth sign-in to authorize access to your skdul account
  4. 4.Start using skdul tools in your Claude conversations

Connect from Claude Code

No local setup required — authentication is handled via OAuth on first use.

{
  "mcpServers": {
    "skdul": {
      "url": "https://www.skdul.ai/api/mcp"
    }
  }
}

Connect from other clients

For any MCP client that supports remote servers via streamable HTTP. Use the URL below in your client's MCP configuration.

https://www.skdul.ai/api/mcp
{
  "url": "https://www.skdul.ai/api/mcp"
}

Authentication

The MCP server uses OAuth 2.1 + PKCE for authorization. When you first connect from claude.ai or Claude Code, the server redirects you to skdul's authorization page. After you approve, a session token is issued and stored by your MCP client.

PropertyValue
Auth flowOAuth 2.1 with PKCE
Token lifetime2 hours
On token expiryClaude shows an auth error; click to re-authorize
Alternative authAPI key via Authorization: Bearer sk_live_…

For non-OAuth clients, generate an API key from Dashboard → MCP Server → API Keys and pass it as a Bearer token. The server accepts both OAuth access tokens and API keys.

Protocol

PropertyValue
MCP spec version2025-03-26
TransportsStreamable HTTP (primary), SSE (legacy fallback)
Server URLhttps://www.skdul.ai/api/mcp
Local stdioNot supported — server is cloud-hosted only

Clients that only support the older SSE transport can still connect using the same URL — the server negotiates the transport automatically during the initialization handshake.

Example Prompts

42 example prompts across 9 categories. Hover any prompt to reveal the copy button, then paste it into a Claude conversation with the skdul MCP server connected.

Profile

  • What's my skdul profile?Featured
  • Update my bio to 'Founder building in public'.
  • Change my brand color to midnight blue.
  • Switch my time format to 24-hour.
  • What timezone am I set to?

Events

  • Create a 15-minute coffee chat event.Featured
  • List all my active events.
  • Add a 5-minute buffer after my 30-minute meetings.
  • Disable my 'Quick Call' event temporarily.
  • Set a minimum 2-hour notice on all events.

Availability

  • What slots do I have open next Tuesday?Featured
  • Show available times for my 30-min meeting this week.
  • Am I free between 2-4pm on Thursday?
  • Find open slots for a 1-hour meeting in the next 3 days.

Bookings

  • Show all my upcoming bookings.Featured
  • Book a 30-min call with jane@example.com tomorrow at 2pm.
  • Cancel my meeting with John and let him know.
  • Reschedule tomorrow's 3pm to Friday at 10am.
  • How many meetings do I have this week?

Schedule

  • What are my current working hours?Featured
  • Set my hours to 10am-6pm, Monday through Friday.
  • Block off Fridays — no meetings.
  • Add Saturday 9am-12pm as available.

Smart Booking

  • Find the best time to meet with @sarah next week.Featured
  • What meeting types does @alex offer?
  • Book the earliest morning slot with @sarah.
  • Preview available times with @mike, preferring afternoons.

Preferences

  • I prefer morning meetings — remember that.Featured
  • Never schedule anything before 10am.
  • Cap my meetings at 4 per day.
  • What scheduling patterns have you noticed?
  • How often do I meet with sarah@example.com?

Calendar Intelligence

  • How healthy is my calendar this week?Featured
  • Do I have any scheduling conflicts?
  • Give me a summary of next week.
  • Find me a 2-hour focus block tomorrow.
  • Which meetings should I consider rescheduling?

Negotiation

  • Send a meeting request to @alex for a 30-min sync.Featured
  • Show my pending scheduling requests.
  • Accept the scheduling request from Sarah.
  • Cancel the request I sent to Mike.
  • What's the status of my request to @alex?

Tools Reference

31 tools across 9 categories. Each tool can be invoked by any connected MCP client.

get_profile

Returns the authenticated user's full profile including name, username, timezone, branding settings, and plan. No inputs required — always returns the profile of the connected account.

Returns Profile object with id, username, full_name, email, timezone, time_format, brand_color, bio, week_start, avatar_url, plan.

update_profile6 params

Updates one or more profile fields. Only include the fields to change — omitted fields stay untouched. Timezone changes affect future slot calculations but do not alter existing bookings.

Returns Updated Profile object.

Show 6 parameters
NameTypeRequiredDescription
fullNamestringNoDisplay name shown on the booking page.
timezonestringNoIANA timezone (e.g. America/New_York).
timeFormat"12h" | "24h"NoClock display format.
brandColorstringNoHex color code (e.g. #E8634A).
biostringNoShort bio for the public booking page.
weekStart"sunday" | "monday"NoFirst day of the week on calendar views.
list_event_types1 param

Lists all event types (meeting templates) for the authenticated user. Active events are returned by default; pass includeInactive to also retrieve disabled ones.

Returns Array of EventType objects sorted by creation date.

Parameters
NameTypeRequiredDefaultDescription
includeInactivebooleanNofalseInclude disabled event types in results.
create_event_type10 params

Creates a new event type. The slug must be unique per user and forms the booking URL path (/{username}/{slug}). Newly created event types are active by default.

Returns The created EventType object.

Show 10 parameters
NameTypeRequiredDefaultDescription
titlestringYesEvent title (e.g. '30 Minute Meeting').
slugstringYesURL slug (e.g. '30min'). Must be lowercase, no spaces.
durationMinutesnumberYesDuration in minutes.
descriptionstringNoDescription shown on the booking page.
locationType"video" | "phone" | "in_person" | "custom"NovideoMeeting location type.
bufferBeforenumberNo0Minutes to block before the meeting.
bufferAfternumberNo0Minutes to block after the meeting.
minimumNoticenumberNo60Minimum advance notice in minutes.
maxPerDaynumberNoMaximum bookings of this type per day. Omit for unlimited.
colorstringNoDisplay color hex code.
update_event_type12 params

Updates any subset of fields on an existing event type. Use isActive to pause bookings without deleting. Slug changes take effect immediately.

Returns The updated EventType object.

Show 12 parameters
NameTypeRequiredDescription
eventTypeIdstringYesThe event type ID to update.
titlestringNoEvent title.
slugstringNoURL slug.
durationMinutesnumberNoDuration in minutes.
descriptionstringNoBooking page description.
locationType"video" | "phone" | "in_person" | "custom"NoLocation type.
bufferBeforenumberNoBuffer minutes before.
bufferAfternumberNoBuffer minutes after.
minimumNoticenumberNoMinimum advance notice in minutes.
maxPerDaynumberNoMaximum bookings per day.
colorstringNoDisplay color hex code.
isActivebooleanNoSet to false to stop accepting new bookings.
delete_event_type1 param

Permanently deletes an event type. Existing confirmed bookings are not affected. Use isActive: false instead if you want to preserve booking history.

Returns { success: true }

Parameters
NameTypeRequiredDescription
eventTypeIdstringYesThe event type ID to delete.
get_available_slots4 params

Returns all open time slots for an event type within a date range. Slots account for working hours, buffer times, existing bookings, and synced external calendar events. Pass the guest's timezone for localised results.

Returns Array of { start: ISO 8601, end: ISO 8601 } objects.

Show 4 parameters
NameTypeRequiredDefaultDescription
eventTypeIdstringYesThe event type ID to check availability for.
startDatestringYesStart of date range (YYYY-MM-DD).
endDatestringYesEnd of date range (YYYY-MM-DD). Max 60-day range.
timezonestringNoUTCIANA timezone for slot times.
list_bookings4 params

Lists the authenticated user's bookings with optional filters. Returns upcoming confirmed bookings by default, sorted by start time.

Returns Array of Booking objects.

Show 4 parameters
NameTypeRequiredDefaultDescription
statusstringNoFilter by status: confirmed, cancelled_by_host, cancelled_by_guest, rescheduled, completed, no_show.
upcomingbooleanNotrueWhen true, only return bookings with a future start time.
guestEmailstringNoFilter to bookings for a specific guest email.
limitnumberNo20Maximum results to return (max 100).
get_booking1 param

Retrieves full details for a single booking including nested event type metadata. Use to display confirmation pages or sync to external systems.

Returns Booking object with nested event_types field.

Parameters
NameTypeRequiredDescription
bookingIdstringYesThe booking ID.
create_booking8 params

Creates a confirmed booking for a guest. The slot must be within the event's availability window — call get_available_slots first. Returns an error if the slot is taken. Confirmation emails are sent automatically.

Returns The created Booking object with status: confirmed.

Show 8 parameters
NameTypeRequiredDescription
eventTypeIdstringYesEvent type ID to book.
startTimestring (ISO 8601)YesMeeting start time in UTC.
endTimestring (ISO 8601)YesMeeting end time in UTC.
guestNamestringYesGuest's full name.
guestEmailstringYesGuest's email for confirmations.
durationMinutesnumberYesDuration in minutes — must match event type duration.
guestTimezonestringNoGuest's IANA timezone for email formatting.
guestNotesstringNoOptional notes from the guest.
cancel_booking2 params

Cancels a confirmed booking, removes the calendar event, deletes the Zoom meeting if applicable, and sends a cancellation email to the guest. This action is irreversible.

Returns Updated Booking object with status: cancelled_by_host.

Parameters
NameTypeRequiredDescription
bookingIdstringYesThe booking ID to cancel.
reasonstringNoCancellation reason included in the guest email.
reschedule_booking3 params

Reschedules a booking to a new time. Creates a new confirmed booking, marks the original as rescheduled, and sends rescheduling emails. The new slot must be available.

Returns The new Booking object at the rescheduled time.

Parameters
NameTypeRequiredDescription
bookingIdstringYesThe booking ID to reschedule.
newStartTimestring (ISO 8601)YesNew start time in UTC.
newEndTimestring (ISO 8601)YesNew end time in UTC.
get_availability_schedule

Returns the host's weekly availability schedule — the days and hours during which bookings are accepted. Used alongside buffer times and external calendar data to compute open slots.

Returns Schedule object with name, timezone, and rules array (dayOfWeek, startTime, endTime, isEnabled).

update_availability_schedule5 params

Replaces the weekly working hour schedule. This is a full replacement — send all rules you want active. Days not included will block all bookings.

Returns Updated Schedule object with new rules.

Show 5 parameters
NameTypeRequiredDefaultDescription
rulesAvailabilityRule[]YesFull set of availability rules. Replaces all existing rules.
rules[].dayOfWeeknumber (0–6)YesDay of week. 0 = Sunday … 6 = Saturday.
rules[].startTimestring (HH:MM)YesStart of availability window in 24h format.
rules[].endTimestring (HH:MM)YesEnd of availability window in 24h format.
rules[].isEnabledbooleanNotrueSet to false to block this day without removing the rule.
browse_booking_pages1 param

Discovers a host's public event types by username before attempting a booking. Returns available meeting types, durations, and booking page URLs.

Returns Array of public EventType objects with booking page URLs.

Parameters
NameTypeRequiredDescription
usernamestringYesThe host's skdul username (e.g. 'janedoe').
find_and_book_best_slot15 params

Finds the optimal time slot with a host using preference-aware scoring, then optionally creates the booking. Runs as a dry run by default — set dryRun: false to confirm the booking. Supports rich scheduling constraints for time-of-day and day-of-week preferences.

Returns Best slot with score, and Booking object if dryRun is false.

Show 15 parameters
NameTypeRequiredDefaultDescription
bookingPageUrlstringNoFull booking page URL. Use instead of username + eventSlug.
usernamestringNoHost username. Required if bookingPageUrl not provided.
eventSlugstringNoEvent slug. Required if bookingPageUrl not provided.
guestNamestringNoGuest name for the booking.
guestEmailstringNoGuest email for confirmation.
guestNotesstringNoNotes to include with the booking.
guestTimezonestringNoGuest IANA timezone.
preferMorningbooleanNoScore morning slots higher.
preferAfternoonbooleanNoScore afternoon slots higher.
avoidDaysnumber[]NoDays of week to avoid (0 = Sunday … 6 = Saturday).
preferDaysnumber[]NoPreferred days of week.
earliestHournumber (0–23)NoEarliest acceptable hour for a meeting start.
latestHournumber (0–23)NoLatest acceptable hour for a meeting start.
withinDaysnumberNo14How many days ahead to search for slots.
dryRunbooleanNotrueIf true, returns the best slot without booking. Set to false to confirm.
get_scheduling_preferences3 params

Retrieves active scheduling preference rules. Rules can be explicit (set manually) or learned (inferred by AI from booking history). These rules power the slot scoring engine.

Returns Array of Preference objects with rule_type, rule payload, priority, and is_learned flag.

Parameters
NameTypeRequiredDefaultDescription
contactEmailstringNoFilter to preferences scoped to a specific contact.
ruleTypestringNoFilter by type: time_preference, day_preference, contact_rule, focus_block, max_meetings, buffer_rule, duration_rule, custom.
includeLearnedRulesbooleanNotrueWhether to include AI-inferred rules alongside explicit ones.
set_scheduling_preference7 params

Creates a scheduling preference rule. Higher priority rules override lower ones when they conflict. Contact-scoped rules only apply when scheduling with that specific contact.

Returns The created Preference object.

Show 7 parameters
NameTypeRequiredDefaultDescription
ruleTypestringYesRule category: time_preference, day_preference, contact_rule, focus_block, max_meetings, buffer_rule, duration_rule, custom.
ruleobjectYesRule payload. Structure varies by ruleType (e.g. { preferMorning: true } for time_preference).
contactEmailstringNoScope this rule to a specific contact.
contactCategorystringNoScope to a category of contacts (e.g. VIP, teammate).
eventTypeIdstringNoScope to a specific event type.
prioritynumber (1–100)No5Rule priority. Higher values take precedence.
descriptionstringNoHuman-readable label for this rule.
delete_scheduling_preference1 param

Deletes a preference rule. Takes effect immediately — subsequent slot scoring calls will no longer apply this rule. Learned rules can also be deleted.

Returns { success: true }

Parameters
NameTypeRequiredDescription
preferenceIdstringYesThe preference rule ID to delete.
get_scheduling_insights2 params

Returns AI-computed patterns from booking history: busiest days, peak hours, back-to-back frequency, and weekly load. Each insight includes a confidence score (0–1). Pass recompute: true to refresh stale data.

Returns Array of Insight objects with insightType, summary, data payload, and confidence score.

Parameters
NameTypeRequiredDefaultDescription
insightTypestringNoFilter to a specific type: busiest_day, peak_hours, back_to_back, weekly_load, duration_pattern.
recomputebooleanNofalseRecompute from the last 90 days of bookings before returning.
get_contact_context1 param

Returns the full scheduling history and learned context for a contact — past bookings, observed time preferences, and contact-scoped preference rules. Use before creating a scheduling request to find the most convenient times.

Returns ContactContext with email, totalMeetings, preferredDays, preferredHourRange, recentBookings, and rules.

Parameters
NameTypeRequiredDescription
contactEmailstringYesThe contact's email address.
analyze_calendar_health3 params

Computes a weighted health score (0–100) for your calendar over a date range. The score factors in meeting density, back-to-back sequences, missing buffers, and available focus time. Also returns actionable text recommendations.

Returns CalendarHealthResult with score, totalMeetings, totalHoursBooked, backToBackCount, focusTimeHours, overbookedDays, and recommendations array.

Parameters
NameTypeRequiredDefaultDescription
startDatestringNo14 days agoStart of analysis range (YYYY-MM-DD).
endDatestringNo14 days aheadEnd of analysis range (YYYY-MM-DD).
timezonestringNoUTCIANA timezone for day boundary calculations.
detect_conflicts2 params

Finds double-booked or overlapping events within a date range. Returns each conflicting pair with the specific overlap duration in minutes.

Returns Object with conflicts array (eventA, eventB, overlapMinutes) and a total count.

Parameters
NameTypeRequiredDefaultDescription
startDatestringNotodayStart of detection range (YYYY-MM-DD).
endDatestringNo7 days aheadEnd of detection range (YYYY-MM-DD).
get_week_summary2 params

Returns a daily breakdown of a single week — meeting count, total hours, and back-to-back sequences per day. Includes warnings for overloaded days. Defaults to the current week.

Returns WeekSummary with totalMeetings, totalHours, and byDay array with per-day stats and warnings.

Parameters
NameTypeRequiredDefaultDescription
weekOfstringNocurrent weekAny date within the target week (YYYY-MM-DD).
timezonestringNoUTCIANA timezone for day boundary calculations.
find_focus_time6 params

Finds uninterrupted blocks of free time suitable for deep work. Filters out blocks shorter than minBlockMinutes. Optionally restricts results to a preferred hour range.

Returns Object with focusBlocks array (start, end, durationMinutes, date) and totalFocusHours.

Show 6 parameters
NameTypeRequiredDefaultDescription
minBlockMinutesnumberNo90Minimum block duration in minutes.
startDatestringNotodayStart of search range (YYYY-MM-DD).
endDatestringNo7 days aheadEnd of search range (YYYY-MM-DD).
preferredStartHournumber (0–23)NoOnly return blocks starting at or after this hour.
preferredEndHournumber (0–23)NoOnly return blocks ending at or before this hour.
timezonestringNoUTCIANA timezone for hour filtering.
suggest_reschedules3 params

Identifies back-to-back meetings and overloaded days, then suggests which specific bookings to move and better alternative times. Powered by the same scoring engine as smart booking.

Returns Object with suggestions array — each has the booking to move, the reason, and up to 3 suggestedSlots.

Parameters
NameTypeRequiredDefaultDescription
datestringNotodayFocus suggestions around this date (YYYY-MM-DD).
maxSuggestionsnumberNo5Maximum number of suggestions to return.
timezonestringNoUTCIANA timezone for suggestion context.
create_scheduling_request12 params

Sends an async scheduling request to another skdul user. The engine automatically finds mutual availability and proposes a matched slot. A notification email goes to the target. Returns 400 if no mutual slot is found.

Returns SchedulingRequest with requestId, status: pending, matchedSlotStart, matchedSlotEnd.

Show 12 parameters
NameTypeRequiredDefaultDescription
targetUsernamestringYesThe username of the person you want to schedule with.
titlestringYesMeeting title shown to the recipient.
durationMinutesnumberNo30Desired meeting duration in minutes.
locationType"video" | "phone" | "in_person"NovideoPreferred meeting format.
notesstringNoOptional context message to the recipient.
preferMorningbooleanNoPrefer morning slots for mutual availability search.
preferAfternoonbooleanNoPrefer afternoon slots.
avoidDaysnumber[]NoDays of week to avoid (0 = Sunday … 6 = Saturday).
preferDaysnumber[]NoPreferred days of week.
earliestHournumber (0–23)NoEarliest acceptable meeting hour.
latestHournumber (0–23)NoLatest acceptable meeting hour.
withinDaysnumberNo14Days ahead to search for mutual availability.
list_scheduling_requests3 params

Lists scheduling requests where you are the initiator or recipient. Use direction to filter to sent or received. Pending requests are awaiting a response.

Returns Array of SchedulingRequest objects sorted by creation date descending.

Parameters
NameTypeRequiredDefaultDescription
direction"sent" | "received" | "all"NoallWhich requests to return.
statusstringNoFilter by status: pending, accepted, rejected, cancelled, expired.
limitnumberNo20Maximum results to return.
get_scheduling_request1 param

Retrieves full details for a specific scheduling request including the matched slot and current status.

Returns SchedulingRequest object with all fields.

Parameters
NameTypeRequiredDescription
requestIdstringYesThe scheduling request ID.
respond_to_scheduling_request3 params

Accepts or rejects an incoming scheduling request. Accepting automatically creates a confirmed booking at the matched slot and notifies the initiator. Only the recipient can respond.

Returns If accepted: Booking object. If rejected: SchedulingRequest with status: rejected.

Parameters
NameTypeRequiredDescription
requestIdstringYesThe scheduling request ID to respond to.
action"accept" | "reject"YesWhether to accept or reject the request.
rejectionReasonstringNoOptional reason sent to the initiator when rejecting.
cancel_scheduling_request2 params

Cancels an outgoing scheduling request that has not yet been accepted. Only the initiator can cancel. If already accepted, cancel the resulting booking via cancel_booking instead.

Returns SchedulingRequest with status: cancelled.

Parameters
NameTypeRequiredDescription
requestIdstringYesThe scheduling request ID to cancel.
reasonstringNoOptional cancellation reason.

Resources

Resources are read-only MCP primitives that AI clients can fetch without invoking a tool. Reference them to give Claude a quick snapshot of your scheduling context at the start of a conversation.

skdul://booking-pagetext/plain

Booking Page URL

Returns the authenticated user's public booking page URL. Use this when an AI assistant needs to share the booking link in a conversation or email draft.

Example response

"https://skdul.ai/janedoe"
skdul://dashboard-summaryapplication/json

Dashboard Summary

Returns a JSON snapshot of the user's current scheduling state: upcoming bookings (next 7 days), active event types, and the next scheduled meeting. Useful for briefing an AI assistant at the start of a session.

Example response

{
  "upcomingBookings": [
    {
      "id": "bkg_uuid",
      "guestName": "John Smith",
      "startTime": "2026-05-28T14:00:00Z",
      "eventTitle": "30 Minute Meeting"
    }
  ],
  "activeEventTypes": [
    { "id": "evt_uuid", "title": "30 Minute Meeting", "slug": "30min" }
  ],
  "nextBooking": {
    "guestName": "John Smith",
    "startTime": "2026-05-28T14:00:00Z"
  }
}

Frequently Asked Questions

What is the skdul MCP Server?
The skdul MCP (Model Context Protocol) Server lets AI assistants like Claude manage your scheduling through natural language. It exposes 33 tools across 9 categories including profile management, bookings, calendar intelligence, and smart booking.
Do I need an API key to use the MCP Server?
No. When connecting from claude.ai or Claude Code, authentication is handled automatically via OAuth. API keys are only needed for other MCP clients that don't support OAuth.
How do I connect skdul to Claude?
Go to claude.ai → Settings → Integrations → Add custom integration, enter the URL https://www.skdul.ai/api/mcp, and complete the OAuth sign-in. For Claude Code, add the MCP config to your .claude/settings.local.json file.
What can I do with natural-language scheduling?
You can manage your entire scheduling workflow: create and manage events, check availability, book meetings, cancel and reschedule, set working hours, analyze calendar health, find focus time, detect conflicts, and negotiate meeting times with other users — all through conversation.
What is the difference between MCP tools and prompts?
Tools are executable actions the AI can perform (like create_booking or detect_conflicts). Prompts are example natural-language phrases you can use in conversation to trigger those tools — they show you how to talk to Claude to get things done.
Can the MCP Server detect scheduling conflicts?
Yes. The detect_conflicts tool finds overlapping bookings and scheduling conflicts. The analyze_calendar_health tool provides a health score and the suggest_reschedules tool recommends meetings to move on overloaded days.
Is the MCP Server compatible with clients other than Claude?
Yes. Any MCP-compatible client that supports remote servers via streamable HTTP can connect using the URL https://www.skdul.ai/api/mcp. Non-OAuth clients can authenticate with an API key.
What scheduling preferences can I set via MCP?
You can set rules like preferred meeting times (mornings, afternoons), maximum meetings per day, minimum notice periods, and no-meeting days. The AI remembers these preferences and applies them when finding slots or making suggestions.

Ready to try it yourself?

Set up your booking page in two minutes. No credit card required.

Start scheduling with AI
Free forever plan MCP server included
Ask AI about skdul