Skip to main content
Glama
NOVA-3951

Fastmail Calendar MCP Server

get_event_details

Retrieve structured details for a specific calendar event, including title, time, location, and description, after obtaining the event URL from list_events.

Instructions

Get parsed details of a specific event. PREREQUISITE: You must first call list_calendars, then list_events to get the eventUrl. Returns structured event data (title, start, end, location, description) instead of raw iCalendar format.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
eventUrlYesREQUIRED. The event URL from list_events output.

Implementation Reference

  • Handler implementation for the 'get_event_details' tool. Fetches the event by URL from calendars, parses the iCal data using parseICalEvent helper, and returns structured details including url and etag.
    case "get_event_details": {
      const { eventUrl } = args as { eventUrl: string };
    
      if (isTestMode) {
        const mockEvent = MOCK_EVENTS.find(e => e.url === eventUrl) || MOCK_EVENTS[0];
        return {
          content: [
            {
              type: "text",
              text: JSON.stringify({
                _testMode: true,
                _message: "Demo mode - showing sample event. Use real Fastmail credentials for actual data.",
                ...mockEvent,
              }, null, 2),
            },
          ],
        };
      }
    
      let existingEvent: DAVCalendarObject | undefined;
    
      for (const calendar of calendars) {
        const events = await davClient.fetchCalendarObjects({
          calendar,
        });
    
        existingEvent = events.find(
          (e: DAVCalendarObject) => e.url === eventUrl
        );
    
        if (existingEvent) {
          break;
        }
      }
    
      if (!existingEvent) {
        throw new Error(`Event not found: ${eventUrl}`);
      }
    
      const parsedEvent = parseICalEvent(existingEvent.data);
      parsedEvent.url = existingEvent.url;
      parsedEvent.etag = existingEvent.etag;
    
      return {
        content: [
          {
            type: "text",
            text: JSON.stringify(parsedEvent, null, 2),
          },
        ],
      };
    }
  • Tool schema definition including name, description, inputSchema (requiring eventUrl), and annotations for the 'get_event_details' tool, registered in list_tools response.
    {
      name: "get_event_details",
      description: `Get parsed details of a specific event. PREREQUISITE: You must first call list_calendars, then list_events to get the eventUrl. Returns structured event data (title, start, end, location, description) instead of raw iCalendar format.`,
      inputSchema: {
        type: "object",
        properties: {
          eventUrl: {
            type: "string",
            description: "REQUIRED. The event URL from list_events output.",
          },
        },
        required: ["eventUrl"],
      },
      annotations: {
        title: "Get Event Details",
        readOnlyHint: true,
        destructiveHint: false,
        idempotentHint: true,
        openWorldHint: false,
      },
    },
  • Helper function parseICalEvent that extracts structured fields (summary, description, location, dates, etc.) from iCalendar data string using regex, called by the get_event_details handler.
    function parseICalEvent(icalData: string): Record<string, any> {
      const result: Record<string, any> = {};
      
      const getField = (fieldName: string): string => {
        const regex = new RegExp(`${fieldName}[^:]*:([^\\r\\n]+)`, "i");
        const match = icalData.match(regex);
        return match ? match[1].trim() : "";
      };
      
      result.summary = getField("SUMMARY") || "Untitled Event";
      result.description = getField("DESCRIPTION") || "";
      result.location = getField("LOCATION") || "";
      result.uid = getField("UID") || "";
      
      const dtstart = getField("DTSTART");
      const dtend = getField("DTEND");
      
      result.startDate = parseICalDate(dtstart);
      result.endDate = parseICalDate(dtend);
      result.startDateRaw = dtstart;
      result.endDateRaw = dtend;
      
      const status = getField("STATUS");
      if (status) result.status = status;
      
      const organizer = getField("ORGANIZER");
      if (organizer) result.organizer = organizer;
      
      return result;
    }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/NOVA-3951/Fastmail-Calendar-MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server