Skip to content
ProductFebruary 15, 2026

Your AI Agent Doesn't Need 5 Tools to Control Your Mac

A technical look at consolidating OpenClaw's fragmented macOS skills into a single MCP server with native API access to Calendar, Mail, Notes, and more.

"Schedule a meeting for tomorrow at 10am."

Before your OpenClaw agent can do this, you need calctl installed. Which depends on ical-buddy. Which you install with brew install ical-buddy. Then you realize the skill also needs AppleScript access, so you grant Automation permissions. Now Calendar works.

Next you want to manage reminders. That's remindctl. Different tool, different install. Notes? That's memo, from a different Homebrew tap. Email? There's apple-mail-search, but it only reads from the SQLite database. It can't send.

We ran into these same problems when building Macuse. This post walks through the technical gaps in the current OpenClaw macOS skill stack and how we approached them differently.

How OpenClaw Controls Mac Apps Today

OpenClaw's Apple app skills use three different technical approaches depending on who built them:

AppleScript wrapping. calctl shells out to osascript for write operations, ical-buddy for reads. apple-contacts is pure AppleScript. This works but inherits AppleScript's quirks. Calendar names are case-sensitive and must match exactly. Contact phone lookup needs the stored format (+1XXXXXXXXXX won't match XXXXXXXXXX).

Dedicated CLI tools. remindctl and memo are standalone binaries that wrap macOS frameworks. Each needs its own install. memo uses Automation permissions to talk to Notes.app, which means it can't edit notes that contain images or attachments.

Direct SQLite reads. apple-mail-search queries ~/Library/Mail/V{9,10,11}/MailData/Envelope Index directly. Fast (~50ms vs 8+ minutes for AppleScript traversal of 130k emails), but read-only by design. Sending email requires a separate tool like himalaya.

The result is a mix of capabilities:

AppReadWriteLimitation
Calendarical-buddyosascriptSearch limited to 30 days
RemindersremindctlremindctlSeparate binary install
NotesmemomemoNo image/attachment notes
MailSQLite queryNot supportedNeed himalaya to send
ContactsosascriptNot supportedExact format matching

None of this is broken. These skills work. But the fragmentation adds friction, and the read-only gaps mean some workflows need two or three tools chained together.

A Different Approach: Native API Access

Macuse takes a different path. Instead of wrapping CLI tools or reading SQLite databases, it talks to macOS apps through their native frameworks. Calendar uses EventKit. Contacts uses the Contacts framework. This runs inside a signed macOS app with proper TCC entitlements, so the system grants access through the standard permission flow.

Here's what that looks like in practice.

Email: Read and Write in One Place

Ask your agent to triage email and it calls mail_get_messages to fetch recent mail, then mail_reply_message or mail_compose_message to respond. No second tool needed.

A typical email workflow:

You: "Check my inbox and reply to anything from the team about the launch."

Agent calls: mail_search_messages(query: "launch", date_from: "2026-02-14")
Agent calls: mail_get_messages(message_ids: ["msg_1", "msg_2"])
Agent calls: mail_reply_message(message_id: "msg_1", body: "...")

With OpenClaw's current skills, step 3 isn't possible. apple-mail-search returns the messages but can't send replies. Your agent would need to switch to himalaya, set up IMAP credentials, and send through a completely different code path.

Mail toolbox reference

Calendar: Search Without Time Limits

calctl wraps ical-buddy, which searches a rolling 30-day window by default. Macuse's calendar_search_events accepts arbitrary date ranges. Need to find that conference you attended last quarter? Just search for it.

You: "When was the last all-hands meeting?"

Agent calls: calendar_search_events(query: "all-hands", date_from: "2025-01-01")
→ Returns: "All-Hands Q4" on 2025-12-15, "All-Hands Q3" on 2025-09-20, ...

The calendar_find_available_times tool is also worth mentioning. It checks multiple calendars for conflicts and returns open slots. Useful for scheduling without double-booking.

Calendar toolbox reference

UI Automation Without a Second Server

For apps that don't have native integration, Macuse includes UI automation through the macOS Accessibility API. This covers the same ground as Peekaboo: screenshot capture, element detection, clicking, typing, scrolling, drag-and-drop, window management.

The capture_snapshot tool returns role-based element IDs (B1 for button, T2 for text field, L3 for link) that stay stable across tool calls. You can optionally get an annotated screenshot with bounding boxes drawn on each element.

Agent calls: ui_viewer_capture_snapshot(app: "Safari", annotate: true)
→ Returns: screenshot + refs map {B1: "Back button", T1: "Address bar", ...}

Agent calls: ui_controller_click(app: "Safari", ref_id: "T1")
Agent calls: ui_controller_type_text(app: "Safari", text: "example.com")

This isn't a Peekaboo replacement for every use case. Peekaboo has built-in AI vision analysis through multiple providers (GPT-5.1, Claude, Gemini, Ollama), virtual desktop management via space, and a bridge architecture that reuses other apps' TCC permissions. If you rely on those, keep Peekaboo alongside Macuse.

Where Macuse's approach differs: it runs as part of the same MCP server that handles Calendar, Mail, and Notes. Your agent doesn't need to context-switch between two separate tool providers.

Setting Up Macuse with OpenClaw

Macuse exposes tools over MCP. OpenClaw connects to external MCP servers through the mcporter skill.

1. Install and Configure

Download Macuse, move it to Applications, and launch. The app walks you through permissions. Grant what you need:

  • Calendars and Reminders for those apps
  • Full Disk Access for Mail, Notes, and Messages
  • Accessibility and Screen Recording for UI automation

2. Add to OpenClaw via mcporter

For stdio transport (same machine):

{
  "name": "macuse",
  "command": "/Applications/Macuse.app/Contents/MacOS/macuse",
  "args": ["mcp"]
}

For HTTP transport (network access or multiple clients):

http://127.0.0.1:35729/mcp

HTTP requires authentication. Macuse supports OAuth and API Key. See the transport docs for setup.

3. Verify

Ask your agent to list available Macuse tools. You should see tools prefixed with calendar_, mail_, notes_, reminders_, ui_viewer_, ui_controller_, and others.

4. Clean Up Old Skills

Once verified, you can disable the overlapping skills:

  • calctl / ical-buddycalendar_* tools
  • remindctlreminders_* tools
  • memonotes_* tools
  • apple-mail-searchmail_* tools
  • apple-contactscontacts_* tools

Keep any skills Macuse doesn't cover. Apple Music, Photos, and Shortcuts don't have Macuse equivalents.

What Macuse Doesn't Do

A few things to be aware of:

  • No built-in AI vision. Macuse captures screenshots and returns element data, but doesn't analyze images with LLMs. That's left to your agent's model. If you need server-side image analysis, Peekaboo's Tachikoma module handles that.
  • macOS only. If your OpenClaw runs on a Linux VPS, Macuse won't help. It needs a Mac with the apps installed.
  • No Apple Music, Photos, or Shortcuts. The community skills for these still fill a gap.
  • Contacts are read-only. Same as apple-contacts. The macOS Contacts framework restricts write access for sandboxed apps.

Further Reading