AirMCP
AirMCP
MCP server for the entire Apple ecosystem — Notes, Reminders, Calendar, Contacts, Mail, Messages, Music, Finder, Safari, System, Photos, Shortcuts, Apple Intelligence, TV, Screen Capture, Maps, Podcasts, Weather, Pages, Numbers, Keynote, Location, and Bluetooth. Connect any AI to your Mac.
Available in multiple languages at the project landing page.
Features
272 tools (29 modules) — Apple app CRUD + system control + Apple Intelligence + UI Automation + Screen Capture + Maps + Podcasts + Weather + iWork (Pages/Numbers/Keynote) + Google Workspace + dynamic shortcuts + context memory + audit introspection
229 Shortcuts / Siri AppIntents — auto-generated from the tool manifest (50 Interactive Snippet views + 17 AppEnum pickers);
AskAirMCPIntentnatural-language agent on iOS 26+/macOS 26+ via FoundationModels34 prompts + 14 YAML skill built-ins — per-app workflows + cross-module + developer workflows + Skills DSL (
inputs/parallel/loop/on_error/retry/ 9 event triggers)9 MCP resources — Notes, Calendar, Reminders, Music, Mail, System, Context Memory + unified
context://snapshot/{depth}3 interactive MCP Apps —
calendar_week_view,music_player,timeline_today(fuses events + reminders on one day-axis)9 event triggers — calendar, reminders, pasteboard, mail unread, focus mode, now playing, file modified, screen locked/unlocked — skills bind to any of these for automation
Safety first — HITL approval + audit log + rate limit (60/min + 10 destructive/hr) + emergency stop file +
allowNetworkdeclarative HTTP policy (RFC 0002)OAuth 2.1 + Resource Indicators — RFC 0005 Steps 1+2:
with-oauth*network policy, JWT verification (RS256/ES256 only, 60s clock tolerance), scope gate (mcp:read/mcp:write/mcp:destructive/mcp:admin),.well-known/oauth-protected-resourceper RFC 9728, zero-interaction local dev vianpm run dev:oauth. Browser MCP clients: see docs/oauth-browser-pkce.md for the Authorization Code + PKCE setupSessionless discovery —
.well-known/mcp.jsonpublishes the full tool + module inventory, network policy, allowed origins, and authorization mode so registry crawlers (Anthropic MCP Registry, Smithery, PulseMCP, Glama) catalog AirMCP without opening a sessionJXA + Swift 6.2 bridge — JXA for basic automation, Swift 6 strict concurrency with EventKit/PhotoKit/HealthKit/Vision/FoundationModels
Apple Intelligence — On-device summarize / rewrite / proofread /
ai_agent/ai_plan_metrics(planner regression catcher) — all via Foundation Models (macOS 26+)Context memory —
memory_put/query/forget/stats+memory://recentresource for facts/entities/episodes, surviving restartsNative menubar app — SwiftUI companion with onboarding wizard, auto-start, log viewer, update notifications, permission setup, server crash auto-restart. Codesigned + notarized release builds ship Gatekeeper-green.
One-click setup —
setup_permissionstool or menubar app to request all macOS permissions at onceDual transport — stdio (default) + HTTP/SSE (
--http) with token auth, origin allow-list, and startup invariants that refuse to boot misconfigured servers
Related MCP server: macos-mcp-tools
Get Started
Two paths. Claude Desktop users get one-click install via .mcpb. Everyone else uses the CLI wizard.
Option A — Claude Desktop one-click install (recommended for non-devs)
Download
airmcp-<version>.mcpbfrom Releases.Drag it onto Claude Desktop, or Settings → Extensions → Install from file….
Fill in the config form (Gemini API key optional; modules toggle). Click Install.
Full walkthrough: docs/mcpb.md.
Option B — CLI wizard (2 minutes)
1. Install Node.js — brew install node or nodejs.org.
2. Run the Setup Wizard:
npx airmcp initPicks the modules to enable, writes the MCP-client config, saves preferences to ~/.config/airmcp/config.json.
3. Restart your MCP client. Your AI can now read notes, manage reminders, check your calendar, and more.
Troubleshooting
npx airmcp doctorChecks Node.js version, config files, MCP client setup, macOS permissions, and module status — all in one command.
Try It — Talk to Your Mac
Once connected, just ask your AI in natural language. Here are some things you can try:
Everyday
"Read my latest notes and summarize them"
"What's on my calendar today?"
"Show me overdue reminders and reschedule them to tomorrow"
"Play some jazz on Apple Music"
Productivity
"Draft a meeting agenda in Notes, then create calendar events for each topic"
"Find all emails from Alex about the project and create reminders for action items"
"Search my contacts for everyone at Acme Corp"
System Control
"Turn on dark mode, set volume to 50%, and lower brightness"
"Take a screenshot and save it to my Desktop"
"What apps are running right now? Quit anything I'm not using"
Research & Web
"Open the Apple developer docs in Safari and summarize the page"
"Search my Safari tabs for that article I was reading about Swift"
Power User
"Scan nearby Bluetooth devices"
"Get my current GPS coordinates and show the weather here"
"Record my screen for 10 seconds"
"Run my 'Morning Routine' shortcut"
Cross-App Workflows
"Check today's meetings, find related notes, and create a prep checklist in Reminders"
"Search my files for the Q1 report, read it, and draft a summary email to the team"
These are just starting points — with 272 tools across 29 Apple apps, the combinations are endless.
Why AirMCP?
After supermemoryai/apple-mcp was archived 2026-01-01 (3.1k stars, no more updates), AirMCP is the only production-grade Apple-native MCP server still shipping. Apple has not released an official iCloud MCP; Google, Dropbox, and Microsoft have. That gap is AirMCP's.
Direct AppleScript | Siri Shortcuts | apple-mcp (archived) | AirMCP | |
Tools | Manual scripts | Limited actions | 15 | 272 |
Modules | — | — | 5 | 29 |
MCP protocol | ❌ | ❌ | ✅ | ✅ (2025-06-18 spec + OAuth 2.1 + Resource Indicators, RFC 0005) |
Input validation | ❌ | N/A | ❌ | Zod + |
Security | None | Sandboxed | Basic | HITL + audit log (queryable) + rate limit + emergency stop + |
Automations | Hand-wired AppleScripts |
| ❌ | 14 YAML skills with |
Multi-client | ❌ | ❌ | ✅ | Claude Desktop/Code/Cowork, Cursor, Windsurf, Copilot, VS Code, ChatGPT (MCP Apps) |
Swift bridge | ❌ | ❌ | ❌ | EventKit, PhotoKit, HealthKit, Vision, Foundation Models |
iOS: Siri/Shortcuts/Spotlight | ❌ | Native | ❌ | 154 auto-generated AppIntents + AppShortcutsProvider (RFC 0007) |
iOS: on-device agent | — | — | — |
|
HTTP transport | — | — | ❌ | Streamable HTTP + declarative |
i18n | ❌ | ❌ | ❌ | 9 languages |
Maintained | — | Apple | ❌ Archived 2026-01-01 | Active (v2.10+, daily commits) |
The Apple-native MCP reference slot is open. Research from Apr 2026 notes: "Outside the archived apple-mcp, no implementation exceeds 5 stars. Most have single-digit commits and single contributors."
Skills DSL
Declare a multi-step workflow in YAML and expose it as an MCP prompt or tool. The executor handles error policy, retries, parallel fan-out, loops, runtime arguments, and event triggers.
name: sender-to-tasks
title: Sender → Tasks
expose_as: tool
inputs:
query: { type: string, default: newsletter }
mailbox: { type: string, default: INBOX }
limit: { type: number, default: 10 }
steps:
- id: hits
tool: search_messages
args: { query: "{{query}}", mailbox: "{{mailbox}}", limit: "{{limit}}" }
retry: 2
retry_backoff_ms: 1000
- id: queue
tool: create_reminder
only_if: "{{hits}} != null"
loop: "{{hits}}"
on_error:
continue # per-iteration: a HITL denial on one item
# doesn't abort the rest of the batch
args:
title: "Follow up: {{_item.subject}}"
body: "From {{_item.sender}} (query: {{query}})"Built-in skills (14): morning-briefing, calendar-alert, inbox-triage, meeting-action-items, focus-guardian, skills-weekly-review, project-digest, weekly-digest-note, focus-block-planner, clipboard-url-to-reading, favorites-digest, sender-to-tasks, evening-winddown, daily-journal.
Event triggers: calendar_changed, reminders_changed, pasteboard_changed, mail_unread_changed, focus_mode_changed, now_playing_changed, file_modified, screen_locked, screen_unlocked.
User-authored skills land in ~/.config/airmcp/skills/*.yaml and hot-reload.
Safety & Operations
AirMCP runs with access to 272 tools on your machine. A few layers keep a buggy agent plan from turning into an incident:
HITL approval — every destructive tool prompts before firing (via MCP Elicitation or a Unix socket fallback). Per-call, per-scope.
Rate limit — 60 tool calls/minute globally, 10 destructive/hour. Token-bucket so bursts are fine; sustained rate isn't.
Emergency stop —
touch ~/.config/airmcp/emergency-stopblocks every destructive tool immediately with a 1-second probe cache. No restart needed.rmthe file to resume.Audit log — every tool call lands in
~/.airmcp/audit.jsonlwith PII-scrubbed args, 0600 perms, 10MB rotation. Query it viaaudit_log/audit_summarytools. Each entry carries an HMAC chain (single-line tamper detection —AIRMCP_AUDIT_HMAC_KEYfor cross-machine integrity) and a correlation ID that threads the entry, any thrown error, and the OpenTelemetry span (when enabled) for the same call — so a failing tool can be traced across log lines with onegrep. Every env knob lives in docs/environment.md (77 vars indexed by category).HTTP network policy (RFC 0002) —
AIRMCP_ALLOW_NETWORK=loopback-only(default) /with-token/with-token+origin/unauthenticated. Startup invariant refuses to boot a misconfigured server. Reverse-proxy header detection warns when aloopback-onlyserver seesX-Forwarded-*so silently-public deploys get caught.npx airmcp doctor— runs all the above policy + macOS compatibility + permission checks in one command.
Siri · Shortcuts · Spotlight (iOS 17+ / macOS 14+)
AirMCP's 154 read-only tools auto-register as Apple App Intents. Anything that speaks the Intents system — Siri, Shortcuts, Spotlight, the Action Button, Widgets — calls them directly without opening the app.
Top-10 Siri phrases ship out of the box via
AppShortcutsProvider(codegen'd from the MCP tool manifest).Shortcuts app: every AirMCP tool appears as an action with typed parameters.
iOS 26 "Use Model": autonomously picks AirMCP tools as tool-call targets.
Interactive Snippets (iOS 26+): 50 typed tools render SwiftUI result views inline in Shortcuts/Siri/Spotlight.
"Ask AirMCP" (iOS 26+/macOS 26+): natural-language agent routed to Apple's on-device Foundation Models with AirMCP tools registered. 100% on-device.
See docs/shortcuts.md for the full guide + RFC 0007 for the architecture.
Client Setup
Works with any MCP-compatible client. Examples:
Claude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"airmcp": {
"command": "npx",
"args": ["-y", "airmcp"]
}
}
}Claude Code
claude mcp add airmcp -- npx -y airmcpCursor
Add to .cursor/mcp.json:
{
"mcpServers": {
"airmcp": {
"command": "npx",
"args": ["-y", "airmcp"]
}
}
}Windsurf
Add to ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"airmcp": {
"command": "npx",
"args": ["-y", "airmcp"]
}
}
}Other MCP Clients
Any client that supports the MCP stdio transport can use AirMCP. Use npx -y airmcp as the server command.
Local Development
git clone https://github.com/heznpc/AirMCP.git
cd AirMCP
npm install
npm run build
node dist/index.jsDeveloper Testing
npm run dev:test -- notes # test one module (fast, in-process)
npm run dev:test:changed # test only git-changed modules
npm run dev:test:watch -- notes # watch mode: auto re-test on save
npm run dev:test -- --tool list_notes # test a single toolSee Testing & Debugging Guide for the full testing workflow.
Menubar App (Optional)
A native SwiftUI companion app for server status monitoring and permission setup.
cd app && swift build -c release
# Binary: app/.build/release/AirMCPAppFeatures: onboarding wizard, auto-start on login, log viewer, update notifications, server status, one-click permission setup, MCP client config clipboard copy.
HTTP Mode
HTTP server mode for remote agents, registries, and multi-client setups:
npx airmcp --http --port 3847Endpoint:
POST/GET/DELETE /mcpTransport: Streamable HTTP + SSE (MCP spec 2025-11-25)
Session management via
Mcp-Session-IdheaderDefault port: 3847
Startup policy invariant (RFC 0002): refuses to bind public interfaces without a token — see Safety & Operations above.
Useful for running a Mac Mini as an "always-on AI hub."
Claude in Chrome & other browser-based MCP clients
Browser extensions — including Anthropic's Claude in Chrome — can't spawn stdio subprocesses, so they consume MCP over HTTP. AirMCP's HTTP transport is designed for exactly this case.
1 · Start AirMCP with a token + origin allow-list:
# Generate a token and keep it — you'll paste it into the Chrome extension.
export AIRMCP_HTTP_TOKEN=$(openssl rand -hex 32)
# Only accept requests whose Origin matches Claude's web UI:
export AIRMCP_ALLOWED_ORIGINS="https://claude.ai"
# Declarative policy: external binding, token required, Origin allow-list enforced.
export AIRMCP_ALLOW_NETWORK="with-token+origin"
npx airmcp --http --bind-all --port 38472 · In the browser extension's MCP settings, add:
Field | Value |
Server URL |
|
Auth header |
|
Transport | Streamable HTTP (SSE) |
3 · Verify wiring:
# From the same machine — should return the server card JSON:
curl http://127.0.0.1:3847/.well-known/mcp.jsonThe response includes "network_policy": "with-token+origin" so the client can confirm what it's connecting to before a single tool call. Registry crawlers (Anthropic MCP Registry, Smithery, PulseMCP, Glama) use the same endpoint to build their catalog without connecting live — it carries the full tool inventory (tools.count, tools.names), enabled modules, license, and homepage, so a crawler can surface "AirMCP: 272 tools across calendar, notes, mail, …" without opening a session. MCP spec version pinned via schema_version: "2025-11-25". When the policy is with-oauth*, a sibling /.well-known/oauth-protected-resource endpoint (RFC 9728) advertises the authorization server + audience + supported scopes so conforming clients can negotiate OAuth before the first MCP call.
Running AirMCP on a laptop that suspends? Put the menubar app on your Mac Mini / always-on host, point the browser at that hostname, and leave the token in Chrome's secure storage. Revoke by rotating AIRMCP_HTTP_TOKEN and restarting the server.
Security gotchas — in order of "most likely to bite":
Don't put AirMCP behind a proxy that strips
X-Forwarded-*without also switching toAIRMCP_ALLOW_NETWORK=with-token. AirMCP detects proxy headers and warns, but only when it's inloopback-onlymode — flip the policy first.Don't hand-edit origin lists into
"*"— the Origin check is your last line of defence if a token leaks from the extension's storage.touch ~/.config/airmcp/emergency-stopon the server blocks every destructive call within 1s, no restart needed. Remember this path.
Tools
Notes (12 tools)
Tool | Description | Type |
| List all notes with title, folder, dates | read |
| Search by keyword in title and body | read |
| Read full content by ID | read |
| Create a note with HTML body | write |
| Replace entire body | destructive |
| Delete (moved to Recently Deleted) | destructive |
| Move to another folder | destructive |
| List folders with note counts | read |
| Create a new folder | write |
| Bulk scan with metadata and preview | read |
| Compare 2-5 notes side by side | read |
| Move multiple notes at once | destructive |
Reminders (11 tools)
Tool | Description | Type |
| List all lists with counts | read |
| Filter by list/completed | read |
| Full details by ID | read |
| Create with due date/priority | write |
| Update properties | destructive |
| Mark complete/incomplete | write |
| Delete permanently | destructive |
| Search by keyword in name/body | read |
| Create a new reminder list | write |
| Delete a reminder list | destructive |
| Create with recurrence rule (Swift/EventKit) | write |
Calendar (10 tools)
Tool | Description | Type |
| List calendars with name/color | read |
| Events in date range with pagination | read |
| Full details with attendees | read |
| Create with location/description | write |
| Update properties | destructive |
| Delete permanently | destructive |
| Keyword search in date range | read |
| Next N events from now | read |
| All events for today | read |
| Create with recurrence rule (Swift/EventKit) | write |
Contacts (10 tools)
Tool | Description | Type |
| List with email/phone, pagination | read |
| Search by name, email, phone, or org | read |
| Full details (emails, phones, addresses) | read |
| Create with email/phone/org | write |
| Update properties | destructive |
| Delete permanently | destructive |
| List contact groups | read |
| Add email to existing contact | write |
| Add phone to existing contact | write |
| List contacts in a group | read |
Mail (11 tools)
Tool | Description | Type |
| List mailboxes with unread counts | read |
| Recent messages in a mailbox | read |
| Full message content | read |
| Search by subject/sender | read |
| Mark read/unread | write |
| Flag/unflag a message | write |
| Total unread across all mailboxes | read |
| Move message to another mailbox | destructive |
| List all mail accounts | read |
| Compose and send an email | write |
| Reply to an email message | write |
Music (17 tools)
Tool | Description | Type |
| List playlists with track counts | read |
| Tracks in a playlist | read |
| Current track and playback state | read |
| Play, pause, next, previous | write |
| Search by name/artist/album | read |
| Play a specific track by name | write |
| Start playing a playlist | write |
| Detailed track metadata | read |
| Set shuffle and repeat mode | write |
| Create a new playlist | write |
| Add a track to a playlist | write |
| Remove a track from a playlist | destructive |
| Delete an existing playlist | destructive |
| Get rating, favorited, and disliked status | read |
| Set star rating (0-100) for a track | write |
| Mark or unmark a track as favorited | write |
| Mark or unmark a track as disliked | write |
Finder (8 tools)
Tool | Description | Type |
| Spotlight file search | read |
| File info (size, dates, tags) | read |
| Set Finder tags | destructive |
| Recently modified files | read |
| List files in directory | read |
| Move/rename file | destructive |
| Move to Trash | destructive |
| Create new directory | write |
Safari (12 tools)
Tool | Description | Type |
| List tabs across all windows | read |
| Read page text content | read |
| Current active tab URL/title | read |
| Open URL in Safari | write |
| Close a specific tab | destructive |
| Switch to a specific tab | write |
| Execute JavaScript in tab | write |
| Search tabs by title/URL | read |
| List all bookmarks across folders | read |
| Add a bookmark to Safari | write |
| List Reading List items | read |
| Add URL to Reading List | write |
System (27 tools)
Tool | Description | Type |
| Read clipboard content | read |
| Write to clipboard | write |
| Get system volume | read |
| Set system volume | write |
| Toggle dark/light mode | write |
| Get frontmost application | read |
| List running applications | read |
| Display information | read |
| Show system notification | write |
| Capture screenshot (full/window/selection) | write |
| WiFi connection status and signal | read |
| Turn WiFi on or off | write |
| List paired Bluetooth devices | read |
| Battery percentage, charging, time remaining | read |
| Get display brightness level | read |
| Set display brightness level | write |
| Toggle Do Not Disturb on or off | write |
| Put system to sleep | write |
| Keep system awake for N seconds | write |
| Shutdown or restart the system | destructive |
| Launch/activate an application | write |
| Quit a running application | destructive |
| Check if an application is running | read |
| List all windows across all apps | read |
| Move a window to specific coordinates | write |
| Resize a window | write |
| Minimize or restore a window | write |
Photos (9 tools)
Tool | Description | Type |
| List albums | read |
| List photos in album | read |
| Search photos by keyword | read |
| Photo metadata details | read |
| List favorite photos | read |
| Create new album | write |
| Add photo to album | write |
| Import photo from file (Swift/PhotoKit) | write |
| Delete photos by ID (Swift/PhotoKit) | destructive |
Messages (6 tools)
Tool | Description | Type |
| Recent conversations with participants | read |
| Chat details (participants, last update) | read |
| Search by name/participant/handle | read |
| Send iMessage/SMS text | write |
| Send file via iMessage/SMS | write |
| List chat participants | read |
Shortcuts (11 tools)
Tool | Description | Type |
| List available shortcuts | read |
| Run shortcut by name | write |
| Search shortcuts by name | read |
| Shortcut details/actions | read |
| Create a new shortcut via UI automation | write |
| Delete shortcut by name (macOS 13+) | destructive |
| Export shortcut to .shortcut file | write |
| Import shortcut from .shortcut file | write |
| Open shortcut in Shortcuts app for editing | write |
| Duplicate an existing shortcut | write |
UI Automation (10 tools)
Tool | Description | Type |
| Open app and read accessibility summary | read |
| Click element by coordinates or text | write |
| Type text into focused field | write |
| Send key combinations | write |
| Scroll in direction | write |
| Read app accessibility tree | read |
| Query UI elements by role/title/value/identifier | read |
| Find element by locator + perform AX action | write |
| BFS traverse with PID targeting + visible filter | read |
| Compare UI state before/after an action | read |
Apple Intelligence (13 tools)
Requires macOS 26+ with Apple Silicon.
Tool | Description | Type |
| On-device text summarization | read |
| Rewrite with specified tone | read |
| Grammar/spelling correction | read |
| Generate text with custom instructions via on-device AI | read |
| Generate structured JSON output with schema | read |
| Content classification/tagging with confidence | read |
| Named multi-turn on-device AI session | read |
| Generate an image on disk via Image Playground | write |
| Detect text / tables / forms in an image | read |
| Ask the on-device model for a JSON tool-call plan | read |
| Run a sampled GOLDEN_PLANS batch and report planner quality | read |
| Check Foundation Model availability | read |
| On-device autonomous tool-calling agent | read |
Context Memory (4 tools)
Durable on-disk store for facts, named entities, and time-anchored episodes. Backed by ~/.cache/airmcp/memory.json; also exposed as the memory://recent MCP resource.
Tool | Description | Type |
| Insert or update a fact / entity / episode (idempotent upsert, optional TTL) | write |
| Filter by kind / tags / substring, newest-first | read |
| Delete by id / key / tag | destructive |
| Counts by kind + oldest/newest timestamps (sweeps expired as a side-effect) | read |
Audit (2 tools)
Consumable view of the on-device audit log (populated for every tool call).
Tool | Description | Type |
| Paginated recent calls, filterable by tool / status / time window | read |
| Total count, error rate, top-N busiest tools over a window | read |
TV (6 tools)
Tool | Description | Type |
| List Apple TV playlists (library) | read |
| List movies/episodes in playlist | read |
| Currently playing content | read |
| Play/pause/next/previous control | write |
| Search movies/TV shows | read |
| Play movie/episode by name | write |
Screen Capture (5 tools)
Tool | Description | Type |
| Capture full screen screenshot (returns PNG image) | read |
| Capture a specific app window | read |
| Capture a screen region by coordinates | read |
| List all visible windows with position/size | read |
| Record screen for 1-60 seconds (.mov) | write |
Maps (8 tools)
Tool | Description | Type |
| Search for a place in Apple Maps | write |
| Get directions between two locations | write |
| Drop a pin at specific coordinates | write |
| Open a specific address in Apple Maps | write |
| Search for places near a location | write |
| Generate a shareable Apple Maps link | read |
| Convert place name/address to coordinates | read |
| Convert coordinates to place name/address | read |
Podcasts (6 tools)
Tool | Description | Type |
| List subscribed podcast shows | read |
| List episodes for a show | read |
| Currently playing podcast episode | read |
| Play, pause, next, previous | write |
| Play a specific episode by name | write |
| Search episodes by keyword | read |
Weather (3 tools)
Tool | Description | Type |
| Get current weather by coordinates | read |
| Get multi-day forecast by coordinates | read |
| Get hourly forecast by coordinates | read |
Location (2 tools)
Tool | Description | Type |
| Get device's current GPS coordinates | read |
| Check Location Services authorization status | read |
Bluetooth (4 tools)
Tool | Description | Type |
| Check Bluetooth power state | read |
| Scan for nearby BLE devices | read |
| Connect to a BLE device by UUID | write |
| Disconnect a BLE device | write |
Google Workspace (16 tools)
Requires: npm install -g @googleworkspace/cli && gws auth setup
Tool | Description | Type |
| Check GWS CLI availability | read |
| List Gmail messages with query | read |
| Read Gmail message by ID | read |
| Send email via Gmail | write |
| List Google Drive files | read |
| Get Drive file metadata | read |
| Full-text search across Drive | read |
| Read Google Sheet values | read |
| Write to Google Sheet | write |
| List Google Calendar events | read |
| Create Google Calendar event | write |
| Read Google Doc content | read |
| List Google Tasks | read |
| Create Google Task | write |
| Search Google Contacts | read |
| Execute any GWS CLI command | write |
Resources
MCP resources provide live data from Apple apps via URI.
URI | Description |
| 10 most recent notes |
| Recent notes (custom count, max 50) |
| Today's calendar events |
| Next 7 days of calendar events |
| Overdue reminders |
| Today's due reminders (incomplete only) |
| Currently playing Apple Music track |
| macOS clipboard content |
| Unread mail count across all mailboxes |
| Unified context from all active apps |
| Configurable depth context (brief/standard/full) |
Prompts
Per-App
organize-notes — Classify notes by topic, create folders, move
find-duplicates — Find similar notes, compare, suggest cleanup
weekly-review — Summarize past week's notes
organize-reminders — Scan, identify overdue/completed, cleanup
daily-review — Today's due reminders with priorities
schedule-review — Upcoming events, conflicts, optimizations
meeting-prep — Event details + related notes for meeting prep
Cross-Module
daily-briefing — Today's events + due reminders + recent notes
weekly-digest — Past N days: events + notes + reminders combined
meeting-notes-to-reminders — Extract action items from meeting notes, create reminders
event-follow-up — Create follow-up note and reminders after a meeting
research-with-safari — Safari research + save results to Notes
focus-session — Calendar + Reminders + Music focus session
file-organizer — Finder file organization + Notes logging
Developer Workflows
dev-session — Scan project, check specs, research docs, create session notes
debug-loop — Capture errors from Safari/clipboard, locate code, log bugs, create fix tasks
screen-capture-flow — Screenshot → Photos import → annotation notes
app-release-prep — Calendar schedule + Notes changelog + Reminders checklist
idea-to-task — Break idea into tasks → Reminders + Calendar time blocks
build-log — Analyze build output, log errors or celebrate success
Shortcuts
shortcut-automation — Discover and chain Siri Shortcuts for automation
shortcut-discovery — Find relevant shortcuts for a task
shortcut-troubleshooting — Debug and fix broken shortcuts
Developer Agent Pipeline
AirMCP's developer prompts connect Apple apps into autonomous agent workflows. Each prompt orchestrates tools across multiple modules — AI reads the actual filesystem, Notes, Calendar, and Reminders for context, then records structured results.
┌─────────────────────────────────────────────────────────────────┐
│ dev-session │
│ Finder (scan) → Notes (specs) → Safari (docs) → Notes (log) │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ debug-loop │
│ Safari (JS errors) → Clipboard → Finder (locate) → │
│ Notes (bug log) → Reminders (fix tasks) │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ idea-to-task │
│ Notes (idea) → AI (decompose) → Reminders (tasks) → │
│ Calendar (time blocks) │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ build-log │
│ Finder (output) → Clipboard (log) → │
│ ┌ Fail → Notes (error log) → Reminders (fix tasks) │
│ └ Pass → Notification → Music (celebrate) → Notes (success) │
└─────────────────────────────────────────────────────────────────┘Designed for AI coding agents (Claude Code, Cursor, Copilot, etc.) to invoke via MCP prompts, turning your Mac into a context-aware development environment.
Module Presets
By default, new installations start with 5 core modules (Notes, Reminders, Calendar, Shortcuts, System) to keep things simple. You can enable more anytime:
# Re-run the setup wizard to change modules
npx airmcp init
# Or enable all modules at once
npx airmcp --fullOr edit ~/.config/airmcp/config.json directly:
{
"disabledModules": ["messages", "intelligence"]
}CLI Commands
Command | Description |
| Interactive setup wizard |
| Diagnose installation issues |
| Start MCP server (stdio, default) |
| Print version and exit |
| Start with all 27 modules enabled |
| Start as HTTP server (port 3847) |
Configuration
Environment Variables
Variable | Default | Description |
|
| Include shared notes/folders |
|
| Allow sending iMessages (opt-in) |
|
| Allow sending emails (opt-in) |
|
| Enable all modules (ignores preset) |
| — | Disable a specific module (e.g. |
| — | Google Gemini API key for cloud embeddings (optional) |
|
| Gemini embedding model name |
|
| Embedding dimension (256/512/1024/2048/3072) |
| auto | Force provider: |
| — | Bearer token for HTTP mode authentication |
Config File
~/.config/airmcp/config.json:
{
"disabledModules": ["messages", "intelligence"],
"includeShared": false,
"allowSendMessages": false,
"allowSendMail": false,
"hitl": {
"level": "destructive-only",
"timeout": 30
}
}Human-in-the-Loop (HITL)
Require manual approval before destructive operations:
{
"hitl": {
"level": "destructive-only",
"timeout": 30
}
}Levels: off, destructive-only, all-writes, all
Semantic Search (Optional)
On-device cross-app semantic search powered by Apple's NLContextualEmbedding. Find related notes, events, reminders, and emails by meaning — not just keywords.
npm run swift-build # Build the Swift bridge firstThen use the tools:
semantic_index— Index data from enabled Apple apps into a local vector storesemantic_search— Search by meaning across all indexed datafind_related— Find items related to a specific note/event/remindersemantic_status— Check index status
Supports Korean, English, Japanese, Chinese with automatic language detection. Optionally set GEMINI_API_KEY for higher-quality Google Gemini embeddings.
Swift Bridge (Optional)
For semantic search, recurring events/reminders (EventKit), photo import/delete (PhotoKit), and Apple Intelligence — requires macOS 26+:
npm run swift-buildRequirements
macOS
Node.js >= 18
Per-app automation permissions (prompted on first run) — use
setup_permissionstool to request all at onceApple Intelligence: macOS 26+ with Apple Silicon
Limitations
Modules with OS requirements (e.g., Intelligence requires macOS 26+) are automatically disabled at startup on older systems via runtime OS detection.
Architecture & Security
JXA/AppleScript dependency — Core automation relies on Apple's scripting dictionaries. While these have been stable for 10+ years, macOS updates can theoretically break individual modules. Circuit breaker (3 failures → 60s auto-disable) isolates failures. UI Automation tools (6 tools) are inherently more brittle and separated into their own module.
Input sanitization —
run_javascriptblocksjavascript:anddata:URL schemes to prevent code injection.escJxaShellstrips control characters from shell arguments.Read data exposure — Destructive operations require HITL approval, but read operations (mail, messages, contacts) are not rate-limited. When connected to cloud LLMs, sensitive data passes through the LLM provider. Mitigations: PII scrubbing in logs, pagination limits, sensitive modules (mail, messages) require explicit opt-in.
IPC overhead — Multi-process path (Client → Node.js → osascript/Swift CLI → macOS app). Each JXA call adds ~50ms overhead. Pagination prevents bulk data transfers. Swift bridge path bypasses JXA for EventKit/PhotoKit operations.
Scope — 272 tools across 29 modules follow 5 repeating patterns (JXA CRUD, Swift bridge, HTTP API, System Events, CLI wrapper), keeping maintenance proportional to pattern count, not tool count.
Location & Bluetooth
Location requires macOS Location Services permission (first use triggers system dialog).
Bluetooth scanning discovers BLE (Low Energy) devices only. Classic Bluetooth devices are listed via
list_bluetooth_devicesin the System module.Bluetooth connect/disconnect operates within the server process lifecycle.
Notes
Move copies and deletes (new ID, reset dates, lost attachments). Update replaces entire body — read first to preserve content.
Password-protected notes cannot be read.
Reminders / Calendar
JXA recurrence is read-only — use
create_recurring_event/create_recurring_reminder(Swift/EventKit).Calendar attendees are read-only.
Contacts
Custom fields not accessible.
Content truncated to 5000 chars by default (
maxLengthparameter adjustable).
Messages
Individual message content (chat history) not accessible via JXA.
Send requires recipient to be a registered buddy in Messages.
Music
Smart playlists are read-only.
Queue manipulation not available.
Finder
Tags use Spotlight (mdfind), performance varies with index state.
Safari
Reading page content requires "Allow JavaScript from Apple Events" in Safari Developer menu.
run_javascriptrejectsjavascript:anddata:URLs to prevent injection attacks.macOS 26+: Bookmark and Reading List tools (
list_bookmarks,list_reading_list,add_bookmark) useBookmarks.plistinstead of JXA (Apple removed bookmark scripting). Requires Full Disk Access for your terminal in System Settings > Privacy & Security.add_bookmarkis not supported on macOS 26+.
Podcasts
macOS 26+: All Podcasts tools are non-functional. Apple removed the Podcasts scripting dictionary in macOS 26 (Tahoe). The circuit breaker will auto-disable the module after 3 failures.
Photos
JXA: album creation and photo addition only, no import/delete.
Swift bridge (macOS 26+): full import/delete via PhotoKit.
Pages / Numbers / Keynote
macOS 26+: Apple renamed iWork apps (e.g. "Pages" → "Pages Creator Studio"). AirMCP uses bundle IDs internally so this is handled transparently.
Requires the corresponding iWork app to be open for document operations.
Apple Intelligence
Requires macOS 26 (Tahoe) + Apple Silicon.
Build bridge binary with
npm run swift-build.
Roadmap
v2.1 (Current)
Gemini Embedding 2 — Apple Intelligence의 Gemini 채택에 맞춰
gemini-embedding-2-preview로 업그레이드. 네이티브 멀티모달(텍스트/이미지/오디오/비디오) 3072차원 임베딩. on-device Swift bridge + cloud Gemini 하이브리드 provider 지원. Apple이 Foundation Models에 Gemini를 도입하면서 AirMCP도 동일 생태계로 확장Google Workspace — Gmail, Drive, Sheets, Calendar, Docs, Tasks, People via
@googleworkspace/cliDynamic module loading — New modules = 1 line in MANIFEST (no import boilerplate)
Centralized constants — All API URLs, timeouts, buffer sizes in
src/shared/constants.tswith env var overrides
v2.0
CoreLocation — Native GPS coordinates via Swift/CLLocationManager
CoreBluetooth — BLE device scanning, state, connect/disconnect via Swift/CBCentralManager
App Management — Launch, quit, check app status
Window Management — List, move, resize, minimize windows across all apps
Geocoding — Forward/reverse geocoding via Open-Meteo and Nominatim APIs
Security hardening — Sensitive modules (mail, messages) opt-in by default, architecture limitations documented
Platform Constraints (macOS 26+)
Safari bookmarks/reading list — Apple removed JXA bookmark scripting classes in macOS 26. The plist fallback (
~/Library/Safari/Bookmarks.plist) requires Full Disk Access, which TCC blocks for MCP server processes. Investigating Shortcuts-based or WebExtension bridge approaches.Safari
add_bookmark— Legacy JXAmake new bookmarkno longer supported in macOS 26. No programmatic alternative available yet.Podcasts — Apple removed the Podcasts JXA scripting dictionary entirely in macOS 26. All 6 Podcasts tools return errors. Investigating Shortcuts bridge or Media framework alternatives.
Future
OAuth 2.1 browser PKCE flow guide — RFC 0005 Step 3: docs for Managed Agents / Claude in Chrome clients (Steps 1+2 shipped in v2.11.0)
Stateless streamable HTTP — horizontal scale per MCP 2026 roadmap (session state externalized)
iOS / visionOS exploration (v3.0+)
Marketplace listings — MCP Market, Cline Marketplace, LobeHub (Anthropic MCP Registry + Smithery + PulseMCP + Glama already live)
Contributing
See CONTRIBUTING.md for development setup, code style, and PR guidelines.
First-time contributors: look for issues labeled good first issue.
Community
GitHub Discussions — Questions, ideas, show & tell
Issues — Bug reports and feature requests
Changelog — Release history
License
MIT
Available Tools
28 toolsdescribe_toolDescribe ToolARead-onlyIdempotent
Fetch the full description for one registered AirMCP tool after discover_tools returns a compact match.
| Name | Required | Description | Default |
|---|---|---|---|
| full | No | Return the full description instead of the compact summary | |
| name | Yes | Registered tool name to describe | |
| sessionId | No | Optional task-scoped tool session id; requires the tool to be in the session allowlist |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| title | No | |
| exposed | Yes | |
| readOnly | No | |
| sensitive | No | |
| description | No | |
| destructive | No | |
| descriptionDetail | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds workflow context ('after discover_tools returns a compact match') but does not disclose additional behavioral traits such as session-related requirements or output behavior beyond what the schema and annotations already convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that communicates purpose and usage context with no filler or redundant wording. Every phrase earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity lookup tool, the description is sufficient: it has a clear trigger, full schema coverage, strong annotations, and an output schema, so return-value details do not need to be repeated in the description. The tool is fully usable as documented.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented with meaningful descriptions. The tool description adds no new parameter-level semantics beyond aligning 'full description' with the 'full' boolean, but it does not need to compensate because the schema carries the burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Fetch') and a specific resource ('full description for one registered AirMCP tool'), and explicitly contrasts with discover_tools's 'compact match'. This clearly distinguishes the tool from its sibling discover_tools and makes its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'after discover_tools returns a compact match' clearly establishes when this tool should be used in relation to its main alternative. It does not explicitly state when not to use it or list alternative tools, but the contextual sequencing is strong enough for an agent to infer appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
discover_toolsDiscover ToolsARead-onlyIdempotent
Search available tools by keyword. Returns matching tools with descriptions.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 20) | |
| query | Yes | Search query — e.g. 'calendar', 'send email', 'music playback' | |
| sessionId | No | Optional task-scoped tool session id; limits matches to the session allowlist |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| query | Yes | |
| total | No | |
| method | No | |
| matches | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is clear. The description adds that the tool returns 'matching tools with descriptions,' which clarifies the output nature but does not go deeper into ranking or other search behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core action, and unencumbered by repetitive schema information. Every word provides value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a relatively simple keyword-search tool with comprehensive parameter descriptions, a complete annotations block, and an output schema present, the description conveys what the tool does and what it returns. There are no significant gaps that would hinder selection or invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with all three parameters individually documented, including examples for query and a default for limit. The tool description itself adds no additional parameter semantics, so it sits at the baseline for high-schema-coverage tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Search available tools by keyword' and the return behavior: 'Returns matching tools with descriptions.' This distinguishes it from siblings like describe_tool (specific tool details) and run_tool (execution) by emphasizing keyword-based discovery.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys when to use it (when you need to find tools by keyword) but offers no explicit exclusions or alternatives, such as 'use describe_tool for detailed info' or 'use suggest_next_tools for recommendations.' Usage is implied, not fully mapped against siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
end_tool_sessionEnd Tool SessionAIdempotent
End a tool session before its TTL expires.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | Session id returned by start_tool_session |
Output Schema
| Name | Required | Description |
|---|---|---|
| ended | Yes | |
| sessionId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already communicate that the operation is not read-only, is idempotent, and is not classed as destructive. The description adds the TTL context but does not disclose side effects, error behavior, or session invalidation details. Given the annotation coverage, this is adequate but not enriched.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one compact sentence, front-loaded with the action and followed by the relevant TTL condition. There is no filler or redundant explanation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with full annotation coverage, schema coverage, and an output schema, the description is nearly complete. It only omits minor behavioral details such as what happens when called with an already-expired or invalid session.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents sessionId as the session id returned by start_tool_session. The description adds no additional parameter-level meaning, so it stays at the schema-covered baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('End') on a specific resource ('a tool session') and adds the meaningful condition 'before its TTL expires'. This distinguishes it from associated tools like start_tool_session and tool_session_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the intended usage context reasonably clear: an active tool session should be ended before its TTL expires. It does not explicitly name alternatives or provide when-not-to-use guidance, but the relationship with start_tool_session makes the use case easy to infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_clipboardGet ClipboardARead-onlyIdempotent
Read the current text content of the system clipboard.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| length | Yes | |
| content | Yes | |
| truncated | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is well covered. The description adds value by specifying that it reads 'text content' specifically, distinguishing this from possible non-text clipboard formats.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence communicates the action and resource with no filler or repetition. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple, zero-parameter read operation with comprehensive annotations and an output schema present. The description captures the essential behavior completely for the tool's scope.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and schema description coverage is 100%, so the description does not need to explain parameter details. The stated behavior is consistent with a no-argument read operation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Read' with a clear resource, 'the current text content of the system clipboard,' which precisely identifies the action and object. It also distinguishes itself from the sibling tool set_clipboard by making the read-vs-write difference obvious.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is implied by the verb 'Read' and the clipboard resource, but the description provides no explicit guidance about when to use this tool versus alternatives. There are no stated exclusions or references to set_clipboard for write operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_current_weatherGet Current WeatherARead-onlyIdempotent
Get current weather conditions for a location using coordinates.
| Name | Required | Description | Default |
|---|---|---|---|
| latitude | Yes | Latitude coordinate | |
| longitude | Yes | Longitude coordinate |
Output Schema
| Name | Required | Description |
|---|---|---|
| units | Yes | Units for numeric values |
| humidity | Yes | Relative humidity percentage |
| feelsLike | Yes | Apparent temperature in Celsius |
| windSpeed | Yes | Wind speed in km/h |
| cloudCover | Yes | Cloud cover percentage |
| temperature | Yes | Current temperature in Celsius |
| weatherCode | Yes | WMO weather code |
| precipitation | Yes | Precipitation in mm |
| windDirection | Yes | Wind direction in degrees |
| weatherDescription | Yes | Human-readable weather description |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false, so the agent knows this is a safe, non-mutating read. The description adds no extra behavioral context beyond repeating 'using coordinates', which is already in the schema. It does not disclose anything like data source, units, or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that is concise and contains no filler. Every word contributes to the meaning, making it highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with only two parameters, rich annotations, and an output schema, the description is complete enough. It does not need to explain return values because the output schema exists. The description adequately covers the tool's scope without requiring additional details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with each parameter having a clear description ('Latitude coordinate' and 'Longitude coordinate'). The description only says 'using coordinates', which adds no new meaning beyond schema. Since schema covers semantics fully, the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Get current weather conditions for a location using coordinates.' It specifies the verb (get), resource (weather conditions), and scope (current, location-based), making it unambiguous and distinguishable from forecast tools by the word 'current'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for current weather via 'current', but does not explicitly contrast with sibling tools like get_daily_forecast or provide when-to-use/not-use guidance. No alternatives are named, so the usage context is only implied, not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_daily_forecastGet Daily ForecastBRead-onlyIdempotent
Get daily weather forecast for a location.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Number of forecast days (default: 7) | |
| latitude | Yes | Latitude coordinate | |
| longitude | Yes | Longitude coordinate |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnly, idempotent, and non-destructive behavior, covering the safety profile. The description adds no additional behavioral context such as return format, units, or any constraints beyond what the schema already specifies. It is not misleading but adds minimal value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single concise sentence that directly states the core purpose without any fluff or redundancy. It is perfectly sized and front-loaded, with every word earning its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple forecast tool with complete parameter schemas and robust annotations, the description is minimally adequate. However, it does not mention output structure or nuances like default days or range limits, relying entirely on the schema. Given the low complexity, this is acceptable but not exceptional.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for all parameters, and the description adds no extra explanation of latitude, longitude, or days beyond what the schema provides. Baseline 3 is appropriate since the schema fully documents parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves a daily weather forecast for a location. The verb 'get' and resource 'daily weather forecast' are specific, and the name itself differentiates from sibling get_current_weather, though the description does not explicitly mention that distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like get_current_weather, or any conditions for use. The description simply states the function without contextual direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_workflowGet WorkflowARead-onlyIdempotent
Retrieve a registered MCP prompt by name and return its workflow instructions as text.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | Prompt arguments as key-value pairs | |
| name | Yes | Prompt name (e.g. 'daily-briefing', 'dev-session') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds that it retrieves by name and returns text, which is some behavioral context but does not elaborate on error behavior or response format. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, direct sentence with no unnecessary words. It is front-loaded with the action and clearly communicates the purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only retrieval tool with good annotations, the description covers the return type ('workflow instructions as text') and the name-based lookup. It does not discuss error handling, but that is not essential given the tool's simplicity and annotation coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters. The description only reiterates the 'name' parameter ('by name') and does not mention 'args'. It adds minimal value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Retrieve') and clearly identifies the resource ('registered MCP prompt') and the output ('workflow instructions as text'). This clearly distinguishes it from sibling tools like get_clipboard or workflow_readiness.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool (when you need workflow instructions for a registered prompt) but provides no explicit context, exclusions, or alternatives. There is no mention of when not to use it or how it compares to similar tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
install_module_packInstall Module PackADestructive
Install, repair, update, or uninstall one AirMCP add-on package after explicit user confirmation. Use dryRun first to preview the npm command.
| Name | Required | Description | Default |
|---|---|---|---|
| pack | Yes | Non-core module pack name, for example productivity, communications, media, or spatial | |
| action | No | install repairs or updates the exact matching add-on version; uninstall removes it | |
| dryRun | No | Preview the npm command and config change without writing anything | |
| confirm | No | Required true for real install/uninstall because this runs npm and edits AirMCP config |
Output Schema
| Name | Required | Description |
|---|---|---|
| pack | Yes | |
| action | Yes | |
| dryRun | Yes | |
| command | Yes | |
| message | Yes | |
| skipped | Yes | |
| confirmed | Yes | |
| configPath | Yes | |
| activePacks | Yes | |
| installSpec | Yes | |
| packageName | Yes | |
| restartRequired | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the description adds value by highlighting the need for confirmation and the dryRun workflow. It also mentions 'repair, update, or uninstall' which implies mutating behavior, complementing the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that states the action and key workflow guidance. No filler or redundancy; every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (4 params, one required, destructive action) and the presence of an output schema, the description covers the core workflow (dryRun first, confirmation needed) and the package scope. It doesn't describe return values, but that is expected to be in the output schema. Overall, adequate for agent selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions cover all parameters (100% coverage) with clear explanations for pack, action, dryRun, and confirm. The description does not add extra parameter detail beyond what's in the schema; the baseline of 3 is appropriate since the schema already carries the burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Install, repair, update, or uninstall one AirMCP add-on package' – a specific verb-resource combination. It distinguishes from sibling tools like list_module_packs (listing) and preview_action (preview) by focusing on the mutating operations and explicit user confirmation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides an explicit guideline to 'Use dryRun first to preview the npm command' and emphasizes 'after explicit user confirmation', which sets expectations for prerequisites. However, it does not explicitly mention alternatives or when not to use the tool, relying on the action enum and sibling names to infer scope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_directoryList DirectoryARead-onlyIdempotent
List files and folders in a directory with metadata (kind, size, modification date).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute directory path | |
| limit | No | Max items to return (default: 100) |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| total | Yes | |
| returned | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, covering the safety profile. The description adds 'with metadata' which is return content, not additional behavioral context like pagination, sorting, or error handling. It does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler. Every word contributes to the tool's purpose and output characteristics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a robust input schema (100% param coverage), clear annotations, and an output schema present, the description is sufficient for a simple list operation. It might lack explicit behavioral details, but the combination of structured data and description is complete enough for correct usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does not add extra meaning to the parameters beyond what the schema already provides (e.g., 'path' as absolute directory path, 'limit' with default).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'List files and folders in a directory' which is a specific verb+resource, and adds metadata details (kind, size, modification date). This clearly distinguishes it from sibling tools like list_notes or list_events.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when directory contents are needed but provides no explicit when-to-use/when-not-to-use guidance or alternatives. Unlike high-scoring examples, it does not mention when another tool would be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_eventsList EventsARead-onlyIdempotent
List events within a date range. Requires startDate and endDate (ISO 8601). Optionally filter by calendar name. Supports limit/offset pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max events to return (default: 100) | |
| offset | No | Number of events to skip (default: 0) | |
| endDate | Yes | End of range (ISO 8601, e.g. '2026-03-31T23:59:59Z') | |
| calendar | No | Filter by calendar name | |
| startDate | Yes | Start of range (ISO 8601, e.g. '2026-03-01T00:00:00Z') |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| events | Yes | |
| offset | Yes | |
| returned | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and destructiveHint=false, so the description doesn't need to restate that this is a safe read operation. It adds value by mentioning pagination support (limit/offset) and the optional calendar filter. It does not describe potential performance implications or edge cases like empty results, but with the existing annotations this is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences, front-loaded with the primary purpose. It avoids fluff and repeats no structural details. Every clause is informative: the date range requirement, the optional filter, and pagination support are all mentioned without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists, the description doesn't need to explain return values. It covers the essential usage constraints (required date range, optional calendar, pagination) and is adequate for a read-only listing tool with strong annotations. It could mention inclusive/exclusive date boundaries or timezone handling, but these are minor and not critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents all five parameters. The description reinforces that startDate and endDate are required and mentions the optional calendar filter and pagination, but adds little beyond the schema. It does highlight the required fields, which is helpful, but the incremental value is marginal.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'List events within a date range.' It specifies the resource (events) and the core scope (date range), which distinguishes it from sibling tools like list_notes or list_reminders. The verb 'list' is direct and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides implicit usage guidance by stating required parameters (startDate and endDate) and optional filters (calendar) and pagination. However, it does not explicitly mention when to use this tool instead of alternatives like today_events, nor does it describe when not to use it. It could benefit from naming a specific alternative for narrower queries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_module_packsList Module PacksARead-onlyIdempotent
List DLC-like AirMCP module packs and whether each pack is available in the current runtime configuration.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| packs | Yes | |
| active | Yes | |
| configured | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true. The description adds the behavioral detail that the list includes availability status in the current runtime, which is a meaningful piece of information not present in annotations. This meets the lower bar set by strong annotations and adds a useful nuance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that directly states the tool's function and one key behavioral nuance. It is concise and free of fluff. The only minor downside is the potentially ambiguous 'DLC-like' jargon, but this does not detract significantly from clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with zero parameters, a robust set of annotations, and an output schema provided, the description is sufficiently complete. It covers both the primary action (list) and the key return detail (availability). No extra configuration or side effects require explanation, so this is adequate for the low complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters in the schema, so per the rubric, the baseline is 4. The description does not need to explain parameter behavior, and no further details are required for the agent to invoke the tool correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'List' and a specific resource 'DLC-like AirMCP module packs', and adds the availability check dimension, distinguishing it from sibling list tools like list_shortcuts, list_notes, and list_directory. The phrase 'whether each pack is available in the current runtime configuration' adds a unique scope that clarifies the tool's purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. Sibling tools such as list_shortcuts and list_notes exist, but no differentiation or explicit exclusions are given. The phrase 'current runtime configuration' hints at context but does not direct an agent on when to select this tool over another.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_notesList NotesARead-onlyIdempotent
List all notes with title, folder, and dates. Optionally filter by folder name. Supports pagination via limit/offset.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max number of notes to return (default: 200) | |
| folder | No | Filter by folder name | |
| offset | No | Number of notes to skip for pagination (default: 0) |
Output Schema
| Name | Required | Description |
|---|---|---|
| notes | Yes | |
| total | Yes | |
| offset | Yes | |
| returned | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, covering the safety profile. The description adds details on filtering and pagination, which are behavioral traits not in annotations. It does not specify return format or edge cases, but with an output schema present and the provided context, the description adds moderate value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the primary purpose, then details. Every sentence earns its place, with no fluff or redundancy. It is suitably concise for a simple listing operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, the presence of an output schema, and comprehensive parameter descriptions in the schema, the description is complete enough. It covers the key behavior (list, filter, paginate) without needing to restate return structure or error handling, which are expected to be in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: each parameter (limit, offset, folder) is described with default values and constraints. The description mentions pagination and folder filter but adds no new semantic detail beyond what the schema already provides. The baseline of 3 applies since the schema carries the full parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (list), resource (all notes), and the specific data returned (title, folder, dates). It distinguishes from siblings like read_note (single note) and search_notes (search for specific criteria) by indicating a full listing operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives context about optional folder filtering and pagination, implying this tool is for broad enumeration. However, it does not explicitly instruct when to use this versus search_notes or read_note, nor does it mention exclusions. The usage is implied rather than explicitly guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_profilesList ProfilesARead-onlyIdempotent
List AirMCP runtime profiles. Profiles choose which modules load; toolExposure chooses how much of that surface appears in tools/list.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| active | Yes | |
| profiles | Yes | |
| toolExposure | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds conceptual context about profiles and toolExposure, but no additional behavioral details like return format or ordering. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with the core purpose front-loaded. The second sentence adds meaningful conceptual information without padding or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only listing tool with an output schema and strong annotations, the description is fully sufficient. It explains what is listed and why profiles matter, and the structured metadata covers the remaining operational details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is no schema description to enrich. The description does not need to explain parameters, and the baseline of 4 is appropriate for the no-parameter case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the specific action 'List' and resource 'AirMCP runtime profiles', making the tool's purpose immediately clear. It also differentiates the concept by explaining that profiles select which modules load, which helps distinguish it from listing other resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives useful context about how profiles relate to module loading and the tools/list surface, implying when profile listing matters. However, it does not explicitly compare this tool to alternatives like profile_status or suggest when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_remindersList RemindersARead-onlyIdempotent
List reminders. Optionally filter by list name and/or completion status. Supports pagination via limit/offset.
| Name | Required | Description | Default |
|---|---|---|---|
| list | No | Filter by list name | |
| limit | No | Max number of reminders to return (default: 200) | |
| offset | No | Number of reminders to skip for pagination (default: 0) | |
| completed | No | Filter by completed status (true/false). Omit to list all. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| offset | Yes | |
| returned | Yes | |
| reminders | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is clear. The description adds behavioral details about optional filters and pagination via limit/offset, which are not fully stated in the annotations but align with them. It does not contradict annotations and provides enough transparency for this read-only operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is exceptionally concise at two sentences, front-loads the core action, and includes only essential details about filters and pagination. No redundant or irrelevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema, comprehensive parameter documentation, and safety annotations, the description adequately covers the tool's functionality. It mentions filters and pagination but does not explicitly state default behavior for no filters, though this is implied and covered by schema defaults. Overall, it is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all parameters are well documented. The description adds minimal value by paraphrasing the filter and pagination behavior, but it does not provide additional semantics beyond the schema. Baseline of 3 is appropriate given high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists reminders, a specific resource, and distinguishes it from siblings like list_notes or list_events by name. It also mentions optional filters and pagination, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving reminders and mentions filtering options, but does not provide explicit guidance on when to use this tool versus alternatives (e.g., list_notes, list_events). No exclusions or alternative tool references are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_shortcutsList ShortcutsARead-onlyIdempotent
List all available Siri Shortcuts on this Mac.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| shortcuts | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description does not need to repeat these. It adds the scope 'on this Mac' which is useful context. However, it does not disclose details like whether the list is sorted, whether it includes hidden shortcuts, or any rate limits. Given annotations, the bar is lower, so a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence with no fluff. It is front-loaded and immediately conveys the tool's purpose. It is an excellent example of economy of language.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with no parameters, an output schema, and comprehensive annotations, the description is complete. It tells the user exactly what is returned (all shortcuts) and the context (this Mac). There is no missing information that would hinder usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is nothing to explain. The schema coverage is trivially 100%. The description does not add parameter information because none exists, which is acceptable. The baseline for zero parameters is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action (list) and resource (Siri Shortcuts on this Mac). It is specific and distinct from siblings like run_shortcut, which runs a shortcut rather than listing them. The scope 'on this Mac' adds useful context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It does not mention that run_shortcut is needed to execute shortcuts, nor any prerequisites or exclusions. A user must infer usage from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_actionPreview ActionARead-onlyIdempotent
Dry-run governance preview of a tool call WITHOUT executing it.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | Arguments you would pass. Validated against the tool's real input schema; never executed. | |
| tool | Yes | Tool name to preview, for example delete_reminder or move_note. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tool | Yes | |
| exists | Yes | |
| exposed | No | |
| argsValid | No | |
| hitlLevel | Yes | |
| rateLimit | Yes | |
| sideEffect | Yes | |
| annotations | No | |
| auditPreview | No | |
| requiredScope | No | |
| validationError | No | |
| wouldRequireApproval | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds the 'dry-run' and validation-against-schema behavior, which is beyond the annotations and provides useful context about the tool's non-executing nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that conveys the essential purpose and behavior without any filler. Every word adds value and it is front-loaded with the key concept.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, annotations cover the safety profile, and there is an output schema (not shown but present). The description adequately covers the main behavioral trait (no execution) and validation, making it complete for an agent to understand usage without needing more detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does not add additional meaning beyond what the schema already provides for the 'tool' and 'args' parameters. No extra insight is given about parameter format or constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('preview') and resource ('a tool call'), and clearly distinguishes it from execution with 'WITHOUT executing it.' This differentiates from sibling tools like run_tool and describe_tool effectively.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies a governance/preview use case but does not explicitly state when to use this tool versus alternatives such as run_tool or describe_tool. No explicit exclusions or 'when not to use' guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proactive_contextProactive ContextARead-onlyIdempotent
Return tool/workflow candidates ranked by a deterministic heuristic over the current time of day, day of week, and this install's tallied usage counts.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| timeContext | Yes | |
| suggestedTools | Yes | |
| suggestedWorkflows | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds valuable context beyond these by disclosing the deterministic, time/usage-based nature of the heuristic and the install-specific perspective, which are not evident from the structured fields alone. The absence of side effects (matching idempotency) is reinforced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that front-loads the action, defines the resource, and provides the key ranking criteria. Every phrase earns its place with zero redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity (0 params), strong annotations, and presence of an output schema, the description provides sufficient context for an agent to use the tool correctly. The deterministic heuristic is well-specified, though a brief note on the default behavior when usage counts are unavailable could make it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0 parameters and 100% schema coverage, the baseline is 4 per the rubric. The description adds behavioral context about how rankings are computed, though no parameter-specific clarification is needed since there are no parameters to document.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Return' with a clear resource (tool/workflow candidates) and distinguishes itself through a unique ranking mechanism ('deterministic heuristic over the current time of day, day of week, and this install's tallied usage counts'). This clearly differentiates it from siblings like suggest_next_tools or get_workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied by the name and description (proactive suggestion), but there is no explicit guidance on when to prefer this tool over alternatives like suggest_next_tools or get_workflow. No exclusion criteria or alternative references are provided, so the agent must infer when the tool should be used.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
profile_statusProfile StatusARead-onlyIdempotent
Show the active AirMCP profile, module set, tool exposure mode, exposed tool count, and total registered tool count.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| profile | Yes | |
| toolExposure | Yes | |
| toolsExposed | Yes | |
| frontDoorTools | Yes | |
| harnessAdapter | Yes | |
| modulesEnabled | Yes | |
| modulesDisabled | Yes | |
| toolsRegistered | Yes | |
| workflowReadiness | Yes | |
| requireToolSession | Yes | |
| toolSessionsActive | Yes | |
| modulesMissingPacks | Yes | |
| modulePacksAvailable | Yes | |
| modulePacksConfigured | Yes | |
| missingPackInstallHints | Yes | |
| modulePackInstallIssues | Yes | |
| modulesMissingAddonPackages | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, which fully cover the safety profile,Skip The description adds context about what specific data points are returned (profile, module set, exposure mode, counts), which complements the annotations by specifying the scope of the read operation. No contradiction exists between the description and annotations
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that front-loads the primary action ('Show the active AirMCP profile') and then lists the specific details returned. There are no redundant or unnecessary words, and every element earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters, no nested objects, and a simple read-only purpose, the description is complete. It lists all the relevant output fields, and with an output schema already present, the agent can infer the exact return format. The description leaves no ambiguity about what the tool does.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has zero parameters, so the description doesn't need to explain parameter usage. The baseline for zero parameters is 4, and the description appropriately focuses on what the tool returns rather than inputs. It fully compensates for the absence of parameter documentation by describing the output structure.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: displaying the active AirMCP profile, module set, tool exposure mode, exposed tool count, and total registered tool count. It uses specific verbs and resource types, distinguishing it from potentially similar status-like tools like 'tool_session_status' or 'workflow_readiness' by focusing on profile/module configuration metrics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly clarifies its use as a read-only status/inspection command, useful for checking the current profile configuration)Skip The description clearly states the tool is a read-only inspection command for viewing configuration details)Skip It doesn't explicitly state when not to use it or name alternative tools, but the purpose is clear enough that an agent can infer when this status check is appropriate. The sibling list includes other status tools, but no explicit guidance for choosing between them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_noteRead NoteARead-onlyIdempotent
Read the full content of a specific note by its ID. Returns HTML body and plaintext.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Note ID (x-coredata:// format) |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| body | Yes | |
| name | Yes | |
| folder | Yes | |
| shared | Yes | |
| plaintext | Yes | |
| creationDate | Yes | |
| modificationDate | Yes | |
| passwordProtected | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds that the return includes HTML body and plaintext, which is useful but not deeply behavioral. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that immediately states the verb and resource, followed by return type. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one required parameter), has full annotations, and an output schema. The description sufficiently covers the tool's purpose and return format without needing extra detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a clear description ('Note ID (x-coredata:// format)') and maxLength. The tool description does not add additional parameter meaning beyond what the schema already provides, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (read), the resource (a specific note), and the selection criterion (by its ID). It also distinguishes from siblings like list_notes and search_notes by focusing on a single note's full content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool: when you have a specific note ID and need the full content. It does not explicitly mention alternatives or exclusions, but the context is clear enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_shortcutRun ShortcutADestructive
Run a Siri Shortcut by name. Optionally provide text input. Returns the shortcut's output. Note: shortcuts may trigger UI prompts or perform system actions.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Shortcut name (exact match) | |
| input | No | Optional text input for the shortcut |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint and non-idempotency, and the description adds a valuable specific warning about UI prompts and system actions. It also discloses that the shortcut's output is returned. This goes beyond the annotations, though the phrase 'system actions' is slightly generic.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is composed of four short, information-dense sentences with zero fluff. The primary action is front-loaded, and each additional sentence adds a distinct detail (input, output, side-effect warning).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even without an output schema, the description covers all essential aspects: what it does, how to invoke it (by name), optional input, return value, and potential side effects. For a 2-parameter tool with rich annotations, this is complete and sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for both parameters ('exact match' and 'Optional text input'). The description merely echoes the input parameter with 'Optionally provide text input' and adds no new semantic meaning, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Run a Siri Shortcut by name.' It clearly distinguishes from siblings like list_shortcuts and specifies optional input and return value, leaving no ambiguity about the tool's function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context: run a shortcut by name with optional text input. It doesn't explicitly state when to avoid this tool or name alternatives, but the purpose is self-evident and aligned with the sibling list (e.g., list_shortcuts for listing, run_shortcut for executing).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_toolRun ToolA
Run an AirMCP tool by name with JSON arguments. Use discover_tools first when the tool is not visible in tools/list.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | Tool arguments as a JSON object | |
| name | Yes | Registered tool name to run | |
| sessionId | No | Optional task-scoped tool session id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations provide no safety hints because all flags are false, and the description does not add important behavioral context. A generic runner that invokes arbitrary tools should disclose potential side effects, execution behavior, or return flow, but the description only says 'Run', which is under-specified for a dynamic dispatch tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, front-loaded with the primary action and enriched with one practical discovery tip. No wasted words or redundancy with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a generic tool runner, the description covers the core runtime action and the important discover-first fallback. The absence of an output schema is somewhat mitigated by the dynamic nature of the tool, but a note on what the response contains would have been helpful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameter meaning already comes from the schema. The description adds only the generic phrase 'by name with JSON arguments', which does not materially improve parameter understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states what the tool does: run an AirMCP tool by name with JSON arguments. It also distinguishes this from sibling tools by mentioning discover_tools as the complementary discovery step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance to use discover_tools first when the tool is not visible in tools/list. It does not list exhaustive when-not-to-use scenarios, but the main alternative discovery flow is clearly stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_notesSearch NotesARead-onlyIdempotent
Search notes by keyword in title and body. Returns matching notes with a 200-char preview.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return (default: 50) | |
| query | Yes | Search keyword | |
| offset | No | Number of matching results to skip (for pagination) |
Output Schema
| Name | Required | Description |
|---|---|---|
| notes | Yes | |
| total | Yes | |
| offset | Yes | |
| returned | Yes | |
| totalMatched | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is known. The description adds the search scope and preview length, but no behavioral side-effects, auth requirements, rate limits, or pagination caveats beyond what the schema provides. It adds some context but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the action, and contains no redundant words. Every word adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only search tool with comprehensive schema and annotations, the description adequately covers purpose, scope, and return preview. It could mention pagination (offset/limit) but those are already in the schema, so overall it is complete enough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and all parameters have descriptions, so the description does not add meaning beyond the schema. The baseline score of 3 applies because the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Search') with a clear resource ('notes') and defines scope ('by keyword in title and body'), distinguishing it from sibling tools like list_notes (list all) and read_note (read a single note). It also states what is returned (matching notes with a preview).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for finding notes by keyword, but it does not explicitly state when to use it over alternatives like list_notes or read_note, nor does it provide exclusions or conditions. The usage context is clear but not directly compared to siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_clipboardSet ClipboardAIdempotent
Write text to the system clipboard, replacing its current content.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text to copy to the clipboard |
Output Schema
| Name | Required | Description |
|---|---|---|
| set | Yes | |
| length | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=false, idempotentHint=true, destructiveHint=false. The description adds the 'replacing its current content' detail, which is useful and goes beyond annotations, but overall disclosure is minimal, and no permission or side-effect details are given.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence with no redundancy; it states the action and effect efficiently. Each word contributes to meaning, and the description is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with a single well-documented parameter and an existing output schema (per context signals). The description covers the essential behavior, including replacement, and no significant gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema fully documents the single parameter with 'Text to copy to the clipboard'. The tool description repeats this meaning without adding new format, constraints, or usage nuances, so it adds negligible value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Write text to the system clipboard, replacing its current content' is a specific verb-resource pair (write + clipboard) with a clear scope. It also distinguishes from the sibling get_clipboard, which reads the clipboard.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the description's clarity, but no explicit when-to-use or alternatives are mentioned. It does not contrast with get_clipboard or other sibling tools, offering only implicit context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_tool_sessionStart Tool SessionA
Create a short-lived allowlist for discover_tools and run_tool. Use this to keep a task scoped to the tools it actually needs.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | Optional human-readable task label | |
| tools | Yes | Registered tool names allowed in this session | |
| ttlSeconds | No | Session lifetime in seconds (default 900, max 3600) |
Output Schema
| Name | Required | Description |
|---|---|---|
| label | No | |
| createdAt | Yes | |
| expiresAt | Yes | |
| sessionId | Yes | |
| allowedTools | Yes | |
| remainingSeconds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that it creates a session with a time limit ('short-lived') and mentions the scoping behavior, which is the key side effect. It does not fully detail all consequences (e.g., what happens upon expiry), but the annotations (all false) are not contradicted, and the description provides a reasonable understanding of the tool's non-readonly nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, consisting of two short sentences with no redundant information. It efficiently conveys the core functionality and use case without any fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool of this complexity, the description covers the essential aspects: creation of a scoped session, its temporary nature, and the intended use. It does not delve into lifecycle details (e.g., how to end or extend), but these are not critical for basic understanding and are partially covered by the parameter descriptions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds minimal meaning to the parameters beyond what the schema already provides. It indirectly references the 'tools' parameter via 'allowlist' and hints at 'ttlSeconds' with 'short-lived,' but does not elaborate on 'label' or default behaviors. Since the schema descriptions are complete, the description's contribution is marginal.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states that the tool creates a short-lived allowlist for specific tools, providing a clear and unambiguous purpose. It also explains the intended use case (scoping a task to only needed tools), making the function obvious.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a direct instruction on when to use the tool: 'Use this to keep a task scoped to the tools it actually needs.' This clearly conveys the appropriate context and differentiates it from broader tool access, even without explicitly naming alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_next_toolsSuggest Next ToolsARead-onlyIdempotent
Rank the tools that most often followed a given tool in this install's local call history.
| Name | Required | Description | Default |
|---|---|---|---|
| after | Yes | Tool name to get suggestions for — e.g. 'today_events' | |
| limit | No | Max suggestions (default 5) |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| after | Yes | |
| totalCalls | Yes | |
| suggestions | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a read-only, idempotent operation. The description adds that it ranks by frequency in local call history, which is behavioral context not captured by annotations. It doesn't explain edge cases but the output schema covers return structure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, efficiently conveys purpose and context. No fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 2-param tool with full schema descriptions and output schema, the description fully covers the tool's behavior and data source. No notable gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters are fully described in the schema, and the description reinforces that 'after' is the tool name. No additional semantics needed beyond schema, so baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (rank), the resource (tools that followed a given tool), and the context (local call history). This distinguishes it from sibling discovery tools like discover_tools or describe_tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the use case: when you need to know which tools are commonly used after a specific tool, based on local history. It doesn't mention alternatives or exclusions, but the context is clear enough for an agent to choose this over generic discovery tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
today_eventsToday's EventsARead-onlyIdempotent
Get all calendar events for today.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| events | Yes | |
| returned | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the description only adds the time scope ('today'). It does not disclose potential behavioral details such as timezone handling, ordering, or whether only certain calendar types are included, but this is acceptable given annotations cover the safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence: 'Get all calendar events for today.' Every word adds meaning and there is no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only tool with an output schema, the description is complete enough. It states exactly what will be returned (all calendar events) and the time scope (today), and the structured annotations and output schema cover remaining details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and schema coverage is trivially complete, so no parameter explanation is needed. The description appropriately focuses on scope rather than parameter syntax.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and resource ('all calendar events for today'), clearly stating scope. It differentiates from sibling 'list_events' by narrowing to today's calendar events, eliminating ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use for retrieving today's calendar events but provides no explicit guidance about when to choose this over sibling tools like 'list_events' or whether it excludes other date ranges. Context is clear but no alternatives or exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tool_session_statusTool Session StatusARead-onlyIdempotent
Inspect one active tool session by id without listing other clients' sessions.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | Session id returned by start_tool_session |
Output Schema
| Name | Required | Description |
|---|---|---|
| label | No | |
| createdAt | Yes | |
| expiresAt | Yes | |
| sessionId | Yes | |
| allowedTools | Yes | |
| remainingSeconds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that the tool is read-only, idempotent, and non-destructive, which significantly lowers the burden on the description. The description adds context about inspecting only one active session and not viewing other clients' sessions, but it does not provide deeper behavioral details like error conditions, auth requirements, or what happens when a session is not found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one sentence, front-loaded with the core action, and contains no filler or redundant wording. Every word contributes to understanding the tool's purpose and scope.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple one-parameter, read-only inspection tool with full annotations and an output schema present. The description covers the object and scope adequately; nothing important is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the sessionId property already explains it is returned by start_tool_session. The tool description only says 'by id,' which adds no additional semantic value beyond what the input schema already provides, so the baseline score is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('Inspect one active tool session by id') and explicitly differentiates its behavior from listing ('without checking other clients' sessions'). This clearly distinguishes it from session lifecycle siblings like start_tool_session and end_tool_session.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies when to use the tool: when you need to inspect a specific active session by its ID. It also conveys a scope boundary by noting it does not list other clients' sessions, but it does not explicitly name alternatives or say when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflow_readinessWorkflow ReadinessARead-onlyIdempotent
Explain whether curated AirMCP workflows are ready in the active runtime, including missing modules, add-ons, tools, and write opt-ins.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Optional workflow id, for example daily-briefing or meeting-prep |
Output Schema
| Name | Required | Description |
|---|---|---|
| summary | Yes | |
| workflows | Yes | |
| toolExposure | Yes | |
| activeProfile | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, establishing a safe read-only operation. The description adds behavioral detail beyond these flags by specifying what readiness includes (missing modules, add-ons, tools, write opt-ins) and the 'active runtime' scope, giving the agent a clearer picture of the tool's output focus.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that directly states the tool's purpose without filler. Every element (workflows, readiness, specific dimensions) earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with one optional parameter and an output schema, the description provides sufficient context. It explains the scope ('curated AirMCP workflows', 'active runtime') and the key readiness factors. It does not specify return format, but the existence of an output schema covers that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage: the only parameter 'id' is already described with examples in the schema. The description does not add any extra parameter-level meaning, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Explain' and clearly identifies the resource as 'curated AirMCP workflows' and their readiness in the active runtime. It enumerates the readiness dimensions (missing modules, add-ons, tools, write opt-ins), which distinguishes it from sibling tools like get_workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied: use this tool to check if workflows are ready. However, the description does not explicitly mention when to use this tool versus alternatives such as profile_status or get_workflow, nor does it provide exclusions or alternative recommendations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
28 tool updates
v2.16.5- Changed
describe_tool2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
discover_tools2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
end_tool_session2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
get_clipboard2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
get_current_weather2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
get_daily_forecast1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
get_workflow1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
install_module_pack2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
list_directory2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
list_events2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
list_module_packs2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
list_notes2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
list_profiles2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
list_reminders2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
list_shortcuts2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
preview_action2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
proactive_context2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
profile_status2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
read_note2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
run_shortcut1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
run_tool1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
search_notes2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
set_clipboard2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
start_tool_session2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
suggest_next_tools2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
today_events2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
tool_session_status2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
workflow_readiness2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
1 tool update
v2.16.3- Changed
today_events2 fields changed- added
Output schema / properties / returnedAdded value: +{ + "type": "number" +} - changed
Output schema / requiredPrevious value: -[ - "total", - "events" -]New value: +[ + "total", + "returned", + "events" +]
4 tool updates
v2.16.2- Changed
describe_tool1 field changed- added
Output schema / properties / sensitiveAdded value: +{ + "type": "boolean" +}
- Added
preview_action - Changed
profile_status2 fields changed- added
Output schema / properties / workflowReadinessAdded value: +{ + "additionalProperties": false, + "properties": { + "blocked": { + "type": "number" + }, + "partial": { + "type": "number" + }, + "ready": { + "type": "number" + }, + "total": { + "type": "number" + } + }, + "required": [ + "total", + "ready", + "partial", + "blocked" + ], + "type": "object" +} - changed
Output schema / requiredPrevious value: -[ - "profile", - "toolExposure", - "modulePacksConfigured", - "modulePacksAvailable", - "modulesMissingPacks", - "modulesMissingAddonPackages", - "modulePackInstallIssues", - "missingPackInstallHints", - "requireToolSession", - "harnessAdapter", - "modulesEnabled", - "modulesDisabled", - "toolsExposed", - "toolsRegistered", - "toolSessionsActive", - "frontDoorTools" -]New value: +[ + "profile", + "toolExposure", + "modulePacksConfigured", + "modulePacksAvailable", + "modulesMissingPacks", + "modulesMissingAddonPackages", + "modulePackInstallIssues", + "missingPackInstallHints", + "requireToolSession", + "harnessAdapter", + "modulesEnabled", + "modulesDisabled", + "toolsExposed", + "toolsRegistered", + "toolSessionsActive", + "frontDoorTools", + "workflowReadiness" +]
- Added
workflow_readiness
5 tool updates
v2.14.1- Added
describe_tool - Added
install_module_pack - Added
list_module_packs - Changed
profile_status9 fields changed- added
Output schema / properties / harnessAdapterAdded value: +{ + "type": "string" +} - added
Output schema / properties / missingPackInstallHintsAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "installSpec": { + "type": "string" + }, + "message": { + "type": "string" + }, + "modules": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pack": { + "type": "string" + }, + "packageName": { + "type": "string" + } + }, + "required": [ + "pack", + "packageName", + "installSpec", + "modules", + "command", + "message" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / modulePackInstallIssuesAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "command": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "expectedVersion": { + "type": "string" + }, + "installStatus": { + "type": "string" + }, + "installedVersion": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "message": { + "type": "string" + }, + "pack": { + "type": "string" + }, + "packageName": { + "type": "string" + } + }, + "required": [ + "pack", + "packageName", + "installStatus", + "installedVersion", + "expectedVersion", + "command", + "message" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / modulePacksAvailableAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / modulePacksConfiguredAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / modulesMissingAddonPackagesAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / modulesMissingPacksAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / requireToolSessionAdded value: +{ + "type": "boolean" +} - changed
Output schema / requiredPrevious value: -[ - "profile", - "toolExposure", - "modulesEnabled", - "modulesDisabled", - "toolsExposed", - "toolsRegistered", - "toolSessionsActive", - "frontDoorTools" -]New value: +[ + "profile", + "toolExposure", + "modulePacksConfigured", + "modulePacksAvailable", + "modulesMissingPacks", + "modulesMissingAddonPackages", + "modulePackInstallIssues", + "missingPackInstallHints", + "requireToolSession", + "harnessAdapter", + "modulesEnabled", + "modulesDisabled", + "toolsExposed", + "toolsRegistered", + "toolSessionsActive", + "frontDoorTools" +]
- Changed
search_notes4 fields changed- added
Output schema / properties / notes / items / properties / sharedAdded value: +{ + "type": "boolean" +} - changed
Output schema / properties / notes / items / requiredPrevious value: -[ - "id", - "name", - "folder", - "preview", - "creationDate", - "modificationDate" -]New value: +[ + "id", + "name", + "folder", + "preview", + "creationDate", + "modificationDate", + "shared" +] - added
Output schema / properties / totalMatchedAdded value: +{ + "type": "number" +} - changed
Output schema / requiredPrevious value: -[ - "total", - "returned", - "offset", - "notes" -]New value: +[ + "total", + "totalMatched", + "returned", + "offset", + "notes" +]
113 tool updates
v2.14.0- Removed
bulk_move_notes - Removed
calendar_week_view - Removed
capture_screenshot - Removed
cloud_sync_status - Removed
compare_notes - Removed
complete_reminder - Removed
create_directory - Removed
create_event - Removed
create_folder - Removed
create_note - Removed
create_recurring_event - Removed
create_recurring_reminder - Removed
create_reminder - Removed
create_reminder_list - Removed
create_shortcut - Removed
delete_event - Removed
delete_note - Removed
delete_reminder - Removed
delete_reminder_list - Removed
delete_shortcut - Changed
discover_tools2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / sessionIdAdded value: +{ + "description": "Optional task-scoped tool session id; limits matches to the session allowlist", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "type": "string" +}
- Removed
duplicate_shortcut - Removed
edit_shortcut - Added
end_tool_session - Removed
event_status - Removed
event_subscribe - Removed
export_shortcut - Removed
find_related - Removed
get_battery_status - Removed
get_brightness - Changed
get_current_weather1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
get_daily_forecast1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Removed
get_file_info - Removed
get_frontmost_app - Removed
get_hourly_forecast - Removed
get_screen_info - Removed
get_shortcut_detail - Removed
get_upcoming_events - Removed
get_volume - Removed
get_wifi_status - Changed
get_workflow2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / args / propertyNamesAdded value: +{ + "type": "string" +}
- Removed
import_shortcut - Removed
is_app_running - Removed
launch_app - Removed
list_all_windows - Removed
list_bluetooth_devices - Removed
list_calendars - Changed
list_directory1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
list_events2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / offset / maximumAdded value: +9007199254740991
- Removed
list_folders - Changed
list_notes2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / offset / maximumAdded value: +9007199254740991
- Added
list_profiles - Removed
list_reminder_lists - Changed
list_reminders4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / offset / maximumAdded value: +9007199254740991 - added
Output schema / properties / reminders / items / properties / dueDate / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / reminders / items / properties / dueDate / typeRemoved value: -[ - "string", - "null" -]
- Removed
list_running_apps - Removed
list_triggers - Removed
local_llm_generate - Removed
local_llm_status - Removed
minimize_window - Removed
move_file - Removed
move_note - Removed
move_window - Removed
prevent_sleep - Added
profile_status - Removed
quit_app - Removed
read_event - Changed
read_note1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Removed
read_reminder - Removed
recent_files - Removed
resize_window - Changed
run_shortcut1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Added
run_tool - Removed
scan_notes - Removed
search_events - Removed
search_files - Changed
search_notes2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / offset / maximumAdded value: +9007199254740991
- Removed
search_reminders - Removed
search_shortcuts - Removed
semantic_clear - Removed
semantic_index - Removed
semantic_search - Removed
semantic_status - Removed
set_brightness - Changed
set_clipboard1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Removed
set_file_tags - Removed
set_volume - Removed
setup_permissions - Removed
show_notification - Removed
skill_calendar-alert - Removed
skill_clipboard-url-to-reading - Removed
skill_daily-journal - Removed
skill_evening-winddown - Removed
skill_focus-block-planner - Removed
skill_focus-guardian - Removed
skill_inbox-triage - Removed
skill_project-digest - Removed
skill_sender-to-tasks - Removed
spotlight_clear - Removed
spotlight_sync - Added
start_tool_session - Changed
suggest_next_tools1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Removed
summarize_context - Removed
system_power - Removed
system_sleep - Removed
timeline_today - Removed
toggle_dark_mode - Removed
toggle_focus_mode - Removed
toggle_wifi - Added
tool_session_status - Removed
trash_file - Removed
update_event - Removed
update_note - Removed
update_reminder
111 tool updates
v2.12.0- Added
bulk_move_notes - Added
calendar_week_view - Added
capture_screenshot - Added
cloud_sync_status - Added
compare_notes - Added
complete_reminder - Added
create_directory - Added
create_event - Added
create_folder - Added
create_note - Added
create_recurring_event - Added
create_recurring_reminder - Added
create_reminder - Added
create_reminder_list - Added
create_shortcut - Added
delete_event - Added
delete_note - Added
delete_reminder - Added
delete_reminder_list - Added
delete_shortcut - Added
discover_tools - Added
duplicate_shortcut - Added
edit_shortcut - Added
event_status - Added
event_subscribe - Added
export_shortcut - Added
find_related - Added
get_battery_status - Added
get_brightness - Added
get_clipboard - Added
get_current_weather - Added
get_daily_forecast - Added
get_file_info - Added
get_frontmost_app - Added
get_hourly_forecast - Added
get_screen_info - Added
get_shortcut_detail - Added
get_upcoming_events - Added
get_volume - Added
get_wifi_status - Added
get_workflow - Added
import_shortcut - Added
is_app_running - Added
launch_app - Added
list_all_windows - Added
list_bluetooth_devices - Added
list_calendars - Added
list_directory - Added
list_events - Added
list_folders - Added
list_notes - Added
list_reminder_lists - Added
list_reminders - Added
list_running_apps - Added
list_shortcuts - Added
list_triggers - Added
local_llm_generate - Added
local_llm_status - Added
minimize_window - Added
move_file - Added
move_note - Added
move_window - Added
prevent_sleep - Added
proactive_context - Added
quit_app - Added
read_event - Added
read_note - Added
read_reminder - Added
recent_files - Added
resize_window - Added
run_shortcut - Added
scan_notes - Added
search_events - Added
search_files - Added
search_notes - Added
search_reminders - Added
search_shortcuts - Added
semantic_clear - Added
semantic_index - Added
semantic_search - Added
semantic_status - Added
set_brightness - Added
set_clipboard - Added
set_file_tags - Added
set_volume - Added
setup_permissions - Added
show_notification - Added
skill_calendar-alert - Added
skill_clipboard-url-to-reading - Added
skill_daily-journal - Added
skill_evening-winddown - Added
skill_focus-block-planner - Added
skill_focus-guardian - Added
skill_inbox-triage - Added
skill_project-digest - Added
skill_sender-to-tasks - Added
spotlight_clear - Added
spotlight_sync - Added
suggest_next_tools - Added
summarize_context - Added
system_power - Added
system_sleep - Added
timeline_today - Added
today_events - Added
toggle_dark_mode - Added
toggle_focus_mode - Added
toggle_wifi - Added
trash_file - Added
update_event - Added
update_note - Added
update_reminder
TDQS
Scored across 28 tools
Most tools have clear, distinct purposes—clipboard, shortcuts, notes, calendar, weather, and runtime management are each well-separated. However, suggest_next_tools and proactive_context both recommend tools based on usage patterns and could confuse an agent, and run_shortcut vs. run_tool may require careful reading.
The majority of tools follow a consistent verb_noun snake_case pattern (list_notes, set_clipboard, read_note). But a few deviants like today_events, profile_status, workflow_readiness, tool_session_status, and proactive_context break the pattern, making the set feel slightly inconsistent.
With 28 tools, the server clearly exceeds the 25-tool threshold for well-scoped sets. Many runtime management tools (sessions, profiles, module packs, discovery, recommendations) could be consolidated, and the broad personal-assistant coverage inflates the count without adding coherent depth.
Domain coverage is severely shallow: notes support only list/search/read, reminders only list, calendar only list/today, and filesystem only list directory—no create, update, delete, or detailed operations. The runtime management side is more complete, but the personal-productivity surface has obvious gaps that will cause agent failures for basic workflows.
Maintenance
Related MCP Connectors
Search, read, and write your Apple Notes from ChatGPT/Claude via a local Mac agent + MCP relay.
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
MCP connector for Apple Reminders — search, create, complete, and edit via your own Mac.
MCP connector that lets ChatGPT list, search, and run your Apple Shortcuts via a local Mac agent
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server for privacy-gated local Apple data access including Mail, Messages, Notes, Calendar, Contacts, Photos, Reminders, Voice Memos, and iCloud Drive.301MIT
- AlicenseNot gradedqualityBmaintenanceA collection of MCP servers for Apple macOS apps (Mail, Contacts, Notes, Memory, Messages, Calendar, Reminders) enabling AI assistants to read, search, create, and update data via JXA, SQLite, and EventKit.159 npmMIT
- AlicenseBqualityDmaintenanceMCP server that enables AI to fully control macOS — mouse, keyboard, terminal, screenshots, window management, UI element detection, and provides AI-optimized information reporting.3622 npmMIT
- FlicenseNot gradedqualityCmaintenanceEnterprise-grade macOS MCP server that gives AI agents eyes, hands, and a terminal, enabling screen capture, mouse/keyboard control, shell commands, and file operations.-