Skip to main content
Glama

Apple MCP Tools

by wearesage
remindersHandler.ts4.46 kB
import { z } from "zod"; import type { LoadModuleFunction, ToolResult } from "./../types"; // Define the Zod schema for reminders arguments export const RemindersArgsSchema = z.discriminatedUnion("operation", [ z.object({ operation: z.literal("list") }), z.object({ operation: z.literal("search"), searchText: z.string().min(1) }), z.object({ operation: z.literal("open"), searchText: z.string().min(1) }), z.object({ operation: z.literal("create"), name: z.string().min(1), listName: z.string().optional(), notes: z.string().optional(), dueDate: z.string().datetime().optional() // Assuming ISO 8601 format }), z.object({ operation: z.literal("listById"), listId: z.string().min(1), props: z.array(z.string()).optional() }), ]); // Define the argument type from the schema type RemindersArgs = z.infer<typeof RemindersArgsSchema>; export async function handleReminders( args: RemindersArgs, loadModule: LoadModuleFunction ): Promise<ToolResult> { try { const remindersModule = await loadModule('reminders'); switch (args.operation) { case "list": { const lists = await remindersModule.getAllLists(); const allReminders = await remindersModule.getAllReminders(); // Create a more detailed message that includes list names let detailedText = `Found ${lists.length} lists and ${allReminders.length} reminders.\n\n`; // Add list details if any lists exist if (lists.length > 0) { detailedText += "Available lists:\n"; lists.forEach(list => { const remindersInList = allReminders.filter(r => r.listName === list.name).length; detailedText += `- ${list.name} (${remindersInList} reminders)\n`; }); } return { content: [{ type: "text", text: detailedText }], success: true, lists, // Include lists in the result reminders: allReminders, // Include reminders in the result isError: false }; } case "search": { const results = await remindersModule.searchReminders(args.searchText); return { content: [{ type: "text", text: results.length > 0 ? `Found ${results.length} reminders matching "${args.searchText}".` : `No reminders found matching "${args.searchText}".` }], reminders: results, // Include results isError: false }; } case "open": { const result = await remindersModule.openReminder(args.searchText); return { content: [{ type: "text", text: result.success ? `Opened Reminders app. Found reminder: ${result.reminder?.name}` : result.message }], ...result, // Spread the result object which contains success, message, reminder? isError: !result.success }; } case "create": { const result = await remindersModule.createReminder(args.name, args.listName, args.notes, args.dueDate); return { content: [{ type: "text", text: `Created reminder "${result.name}" ${args.listName ? `in list "${args.listName}"` : ''}.` }], success: true, // Explicitly set success reminder: result, // Include the created reminder isError: false }; } case "listById": { const results = await remindersModule.getRemindersFromListById(args.listId, args.props); return { content: [{ type: "text", text: results.length > 0 ? `Found ${results.length} reminders in list with ID "${args.listId}".` : `No reminders found in list with ID "${args.listId}".` }], reminders: results, // Include results isError: false }; } default: // This should be unreachable due to Zod validation throw new Error(`Unknown reminders operation: ${(args as any).operation}`); } } catch (error) { console.error("Error in reminders tool:", error); return { content: [{ type: "text", text: `Error in reminders tool: ${error instanceof Error ? error.message : String(error)}` }], isError: true }; } }

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/wearesage/mcp-apple'

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