Skip to main content
Glama

AirMCP

npm version Tests Coverage License: MIT GitHub stars

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); AskAirMCPIntent natural-language agent on iOS 26+/macOS 26+ via FoundationModels

  • 34 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 + allowNetwork declarative 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-resource per RFC 9728, zero-interaction local dev via npm run dev:oauth. Browser MCP clients: see docs/oauth-browser-pkce.md for the Authorization Code + PKCE setup

  • Sessionless discovery — .well-known/mcp.json publishes 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 session

  • JXA + 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://recent resource for facts/entities/episodes, surviving restarts

  • Native 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_permissions tool or menubar app to request all macOS permissions at once

  • Dual 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.

  1. Download airmcp-<version>.mcpb from Releases.

  2. Drag it onto Claude Desktop, or Settings → Extensions → Install from file….

  3. 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 init

Picks 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 doctor

Checks 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 + outputSchema on ~35% of read tools + script↔schema contract tests

Security

None

Sandboxed

Basic

HITL + audit log (queryable) + rate limit + emergency stop + allowNetwork policy (RFC 0002)

Automations

Hand-wired AppleScripts

.shortcut files

❌

14 YAML skills with parallel/loop/on_error/retry/inputs + 9 event triggers

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

—

—

—

AskAirMCPIntent → Foundation Models tool calling (iOS 26+)

HTTP transport

—

—

❌

Streamable HTTP + declarative allowNetwork policy (RFC 0002)

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-stop blocks every destructive tool immediately with a 1-second probe cache. No restart needed. rm the file to resume.

  • Audit log — every tool call lands in ~/.airmcp/audit.jsonl with PII-scrubbed args, 0600 perms, 10MB rotation. Query it via audit_log / audit_summary tools. Each entry carries an HMAC chain (single-line tamper detection — AIRMCP_AUDIT_HMAC_KEY for 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 one grep. 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 a loopback-only server sees X-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 airmcp

Cursor

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.js

Developer 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 tool

See 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/AirMCPApp

Features: 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 3847
  • Endpoint: POST/GET/DELETE /mcp

  • Transport: Streamable HTTP + SSE (MCP spec 2025-11-25)

  • Session management via Mcp-Session-Id header

  • Default 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 3847

2 · In the browser extension's MCP settings, add:

Field

Value

Server URL

http://<your-mac>:3847/mcp (or https://… behind a TLS-terminating proxy)

Auth header

Authorization: Bearer <AIRMCP_HTTP_TOKEN>

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.json

The 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 to AIRMCP_ALLOW_NETWORK=with-token. AirMCP detects proxy headers and warns, but only when it's in loopback-only mode — 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-stop on the server blocks every destructive call within 1s, no restart needed. Remember this path.

Tools

Notes (12 tools)

Tool

Description

Type

list_notes

List all notes with title, folder, dates

read

search_notes

Search by keyword in title and body

read

read_note

Read full content by ID

read

create_note

Create a note with HTML body

write

update_note

Replace entire body

destructive

delete_note

Delete (moved to Recently Deleted)

destructive

move_note

Move to another folder

destructive

list_folders

List folders with note counts

read

create_folder

Create a new folder

write

scan_notes

Bulk scan with metadata and preview

read

compare_notes

Compare 2-5 notes side by side

read

bulk_move_notes

Move multiple notes at once

destructive

Reminders (11 tools)

Tool

Description

Type

list_reminder_lists

List all lists with counts

read

list_reminders

Filter by list/completed

read

read_reminder

Full details by ID

read

create_reminder

Create with due date/priority

write

update_reminder

Update properties

destructive

complete_reminder

Mark complete/incomplete

write

delete_reminder

Delete permanently

destructive

search_reminders

Search by keyword in name/body

read

create_reminder_list

Create a new reminder list

write

delete_reminder_list

Delete a reminder list

destructive

create_recurring_reminder

Create with recurrence rule (Swift/EventKit)

write

Calendar (10 tools)

Tool

Description

Type

list_calendars

List calendars with name/color

read

list_events

Events in date range with pagination

read

read_event

Full details with attendees

read

create_event

Create with location/description

write

update_event

Update properties

destructive

delete_event

Delete permanently

destructive

search_events

Keyword search in date range

read

get_upcoming_events

Next N events from now

read

today_events

All events for today

read

create_recurring_event

Create with recurrence rule (Swift/EventKit)

write

Contacts (10 tools)

Tool

Description

Type

list_contacts

List with email/phone, pagination

read

search_contacts

Search by name, email, phone, or org

read

read_contact

Full details (emails, phones, addresses)

read

create_contact

Create with email/phone/org

write

update_contact

Update properties

destructive

delete_contact

Delete permanently

destructive

list_groups

List contact groups

read

add_contact_email

Add email to existing contact

write

add_contact_phone

Add phone to existing contact

write

list_group_members

List contacts in a group

read

Mail (11 tools)

Tool

Description

Type

list_mailboxes

List mailboxes with unread counts

read

list_messages

Recent messages in a mailbox

read

read_message

Full message content

read

search_messages

Search by subject/sender

read

mark_message_read

Mark read/unread

write

flag_message

Flag/unflag a message

write

get_unread_count

Total unread across all mailboxes

read

move_message

Move message to another mailbox

destructive

list_accounts

List all mail accounts

read

send_mail

Compose and send an email

write

reply_mail

Reply to an email message

write

Music (17 tools)

Tool

Description

Type

list_playlists

List playlists with track counts

read

list_tracks

Tracks in a playlist

read

now_playing

Current track and playback state

read

playback_control

Play, pause, next, previous

write

search_tracks

Search by name/artist/album

read

play_track

Play a specific track by name

write

play_playlist

Start playing a playlist

write

get_track_info

Detailed track metadata

read

set_shuffle

Set shuffle and repeat mode

write

create_playlist

Create a new playlist

write

add_to_playlist

Add a track to a playlist

write

remove_from_playlist

Remove a track from a playlist

destructive

delete_playlist

Delete an existing playlist

destructive

get_rating

Get rating, favorited, and disliked status

read

set_rating

Set star rating (0-100) for a track

write

set_favorited

Mark or unmark a track as favorited

write

set_disliked

Mark or unmark a track as disliked

write

Finder (8 tools)

Tool

Description

Type

search_files

Spotlight file search

read

get_file_info

File info (size, dates, tags)

read

set_file_tags

Set Finder tags

destructive

recent_files

Recently modified files

read

list_directory

List files in directory

read

move_file

Move/rename file

destructive

trash_file

Move to Trash

destructive

create_directory

Create new directory

write

Safari (12 tools)

Tool

Description

Type

list_tabs

List tabs across all windows

read

read_page_content

Read page text content

read

get_current_tab

Current active tab URL/title

read

open_url

Open URL in Safari

write

close_tab

Close a specific tab

destructive

activate_tab

Switch to a specific tab

write

run_javascript

Execute JavaScript in tab

write

search_tabs

Search tabs by title/URL

read

list_bookmarks

List all bookmarks across folders

read

add_bookmark

Add a bookmark to Safari

write

list_reading_list

List Reading List items

read

add_to_reading_list

Add URL to Reading List

write

System (27 tools)

Tool

Description

Type

get_clipboard

Read clipboard content

read

set_clipboard

Write to clipboard

write

get_volume

Get system volume

read

set_volume

Set system volume

write

toggle_dark_mode

Toggle dark/light mode

write

get_frontmost_app

Get frontmost application

read

list_running_apps

List running applications

read

get_screen_info

Display information

read

show_notification

Show system notification

write

capture_screenshot

Capture screenshot (full/window/selection)

write

get_wifi_status

WiFi connection status and signal

read

toggle_wifi

Turn WiFi on or off

write

list_bluetooth_devices

List paired Bluetooth devices

read

get_battery_status

Battery percentage, charging, time remaining

read

get_brightness

Get display brightness level

read

set_brightness

Set display brightness level

write

toggle_focus_mode

Toggle Do Not Disturb on or off

write

system_sleep

Put system to sleep

write

prevent_sleep

Keep system awake for N seconds

write

system_power

Shutdown or restart the system

destructive

launch_app

Launch/activate an application

write

quit_app

Quit a running application

destructive

is_app_running

Check if an application is running

read

list_all_windows

List all windows across all apps

read

move_window

Move a window to specific coordinates

write

resize_window

Resize a window

write

minimize_window

Minimize or restore a window

write

Photos (9 tools)

Tool

Description

Type

list_albums

List albums

read

list_photos

List photos in album

read

search_photos

Search photos by keyword

read

get_photo_info

Photo metadata details

read

list_favorites

List favorite photos

read

create_album

Create new album

write

add_to_album

Add photo to album

write

import_photo

Import photo from file (Swift/PhotoKit)

write

delete_photos

Delete photos by ID (Swift/PhotoKit)

destructive

Messages (6 tools)

Tool

Description

Type

list_chats

Recent conversations with participants

read

read_chat

Chat details (participants, last update)

read

search_chats

Search by name/participant/handle

read

send_message

Send iMessage/SMS text

write

send_file

Send file via iMessage/SMS

write

list_participants

List chat participants

read

Shortcuts (11 tools)

Tool

Description

Type

list_shortcuts

List available shortcuts

read

run_shortcut

Run shortcut by name

write

search_shortcuts

Search shortcuts by name

read

get_shortcut_detail

Shortcut details/actions

read

create_shortcut

Create a new shortcut via UI automation

write

delete_shortcut

Delete shortcut by name (macOS 13+)

destructive

export_shortcut

Export shortcut to .shortcut file

write

import_shortcut

Import shortcut from .shortcut file

write

edit_shortcut

Open shortcut in Shortcuts app for editing

write

duplicate_shortcut

Duplicate an existing shortcut

write

UI Automation (10 tools)

Tool

Description

Type

ui_open_app

Open app and read accessibility summary

read

ui_click

Click element by coordinates or text

write

ui_type

Type text into focused field

write

ui_press_key

Send key combinations

write

ui_scroll

Scroll in direction

write

ui_read

Read app accessibility tree

read

ui_accessibility_query

Query UI elements by role/title/value/identifier

read

ui_perform_action

Find element by locator + perform AX action

write

ui_traverse

BFS traverse with PID targeting + visible filter

read

ui_diff

Compare UI state before/after an action

read

Apple Intelligence (13 tools)

Requires macOS 26+ with Apple Silicon.

Tool

Description

Type

summarize_text

On-device text summarization

read

rewrite_text

Rewrite with specified tone

read

proofread_text

Grammar/spelling correction

read

generate_text

Generate text with custom instructions via on-device AI

read

generate_structured

Generate structured JSON output with schema

read

tag_content

Content classification/tagging with confidence

read

ai_chat

Named multi-turn on-device AI session

read

generate_image

Generate an image on disk via Image Playground

write

scan_document

Detect text / tables / forms in an image

read

generate_plan

Ask the on-device model for a JSON tool-call plan

read

ai_plan_metrics

Run a sampled GOLDEN_PLANS batch and report planner quality

read

ai_status

Check Foundation Model availability

read

ai_agent

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

memory_put

Insert or update a fact / entity / episode (idempotent upsert, optional TTL)

write

memory_query

Filter by kind / tags / substring, newest-first

read

memory_forget

Delete by id / key / tag

destructive

memory_stats

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

audit_log

Paginated recent calls, filterable by tool / status / time window

read

audit_summary

Total count, error rate, top-N busiest tools over a window

read

TV (6 tools)

Tool

Description

Type

tv_list_playlists

List Apple TV playlists (library)

read

tv_list_tracks

List movies/episodes in playlist

read

tv_now_playing

Currently playing content

read

tv_playback_control

Play/pause/next/previous control

write

tv_search

Search movies/TV shows

read

tv_play

Play movie/episode by name

write

Screen Capture (5 tools)

Tool

Description

Type

capture_screen

Capture full screen screenshot (returns PNG image)

read

capture_window

Capture a specific app window

read

capture_area

Capture a screen region by coordinates

read

list_windows

List all visible windows with position/size

read

record_screen

Record screen for 1-60 seconds (.mov)

write

Maps (8 tools)

Tool

Description

Type

search_location

Search for a place in Apple Maps

write

get_directions

Get directions between two locations

write

drop_pin

Drop a pin at specific coordinates

write

open_address

Open a specific address in Apple Maps

write

search_nearby

Search for places near a location

write

share_location

Generate a shareable Apple Maps link

read

geocode

Convert place name/address to coordinates

read

reverse_geocode

Convert coordinates to place name/address

read

Podcasts (6 tools)

Tool

Description

Type

list_podcast_shows

List subscribed podcast shows

read

list_podcast_episodes

List episodes for a show

read

podcast_now_playing

Currently playing podcast episode

read

podcast_playback_control

Play, pause, next, previous

write

play_podcast_episode

Play a specific episode by name

write

search_podcast_episodes

Search episodes by keyword

read

Weather (3 tools)

Tool

Description

Type

get_current_weather

Get current weather by coordinates

read

get_daily_forecast

Get multi-day forecast by coordinates

read

get_hourly_forecast

Get hourly forecast by coordinates

read

Location (2 tools)

Tool

Description

Type

get_current_location

Get device's current GPS coordinates

read

get_location_permission

Check Location Services authorization status

read

Bluetooth (4 tools)

Tool

Description

Type

get_bluetooth_state

Check Bluetooth power state

read

scan_bluetooth

Scan for nearby BLE devices

read

connect_bluetooth

Connect to a BLE device by UUID

write

disconnect_bluetooth

Disconnect a BLE device

write

Google Workspace (16 tools)

Requires: npm install -g @googleworkspace/cli && gws auth setup

Tool

Description

Type

gws_status

Check GWS CLI availability

read

gws_gmail_list

List Gmail messages with query

read

gws_gmail_read

Read Gmail message by ID

read

gws_gmail_send

Send email via Gmail

write

gws_drive_list

List Google Drive files

read

gws_drive_read

Get Drive file metadata

read

gws_drive_search

Full-text search across Drive

read

gws_sheets_read

Read Google Sheet values

read

gws_sheets_write

Write to Google Sheet

write

gws_calendar_list

List Google Calendar events

read

gws_calendar_create

Create Google Calendar event

write

gws_docs_read

Read Google Doc content

read

gws_tasks_list

List Google Tasks

read

gws_tasks_create

Create Google Task

write

gws_people_search

Search Google Contacts

read

gws_raw

Execute any GWS CLI command

write

Resources

MCP resources provide live data from Apple apps via URI.

URI

Description

notes://recent

10 most recent notes

notes://recent/{count}

Recent notes (custom count, max 50)

calendar://today

Today's calendar events

calendar://upcoming

Next 7 days of calendar events

reminders://due

Overdue reminders

reminders://today

Today's due reminders (incomplete only)

music://now-playing

Currently playing Apple Music track

system://clipboard

macOS clipboard content

mail://unread

Unread mail count across all mailboxes

context://snapshot

Unified context from all active apps

context://snapshot/{depth}

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 --full

Or edit ~/.config/airmcp/config.json directly:

{
  "disabledModules": ["messages", "intelligence"]
}

CLI Commands

Command

Description

npx airmcp init

Interactive setup wizard

npx airmcp doctor

Diagnose installation issues

npx airmcp

Start MCP server (stdio, default)

npx airmcp --version

Print version and exit

npx airmcp --full

Start with all 27 modules enabled

npx airmcp --http

Start as HTTP server (port 3847)

Configuration

Environment Variables

Variable

Default

Description

AIRMCP_INCLUDE_SHARED

false

Include shared notes/folders

AIRMCP_ALLOW_SEND_MESSAGES

false

Allow sending iMessages (opt-in)

AIRMCP_ALLOW_SEND_MAIL

false

Allow sending emails (opt-in)

AIRMCP_FULL

false

Enable all modules (ignores preset)

AIRMCP_DISABLE_{MODULE}

—

Disable a specific module (e.g. AIRMCP_DISABLE_MUSIC=true)

GEMINI_API_KEY

—

Google Gemini API key for cloud embeddings (optional)

AIRMCP_EMBEDDING_MODEL

gemini-embedding-2-preview

Gemini embedding model name

AIRMCP_EMBEDDING_DIM

3072

Embedding dimension (256/512/1024/2048/3072)

AIRMCP_EMBEDDING_PROVIDER

auto

Force provider: gemini, swift, hybrid, none

AIRMCP_HTTP_TOKEN

—

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 first

Then use the tools:

  1. semantic_index — Index data from enabled Apple apps into a local vector store

  2. semantic_search — Search by meaning across all indexed data

  3. find_related — Find items related to a specific note/event/reminder

  4. semantic_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-build

Requirements

  • macOS

  • Node.js >= 18

  • Per-app automation permissions (prompted on first run) — use setup_permissions tool to request all at once

  • Apple 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_javascript blocks javascript: and data: URL schemes to prevent code injection. escJxaShell strips 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_devices in 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.

Mail

  • Content truncated to 5000 chars by default (maxLength parameter 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_javascript rejects javascript: and data: URLs to prevent injection attacks.

  • macOS 26+: Bookmark and Reading List tools (list_bookmarks, list_reading_list, add_bookmark) use Bookmarks.plist instead of JXA (Apple removed bookmark scripting). Requires Full Disk Access for your terminal in System Settings > Privacy & Security. add_bookmark is 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/cli

  • Dynamic module loading — New modules = 1 line in MANIFEST (no import boilerplate)

  • Centralized constants — All API URLs, timeouts, buffer sizes in src/shared/constants.ts with 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 JXA make new bookmark no 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

License

MIT

Available Tools

28 tools
describe_toolDescribe ToolA
Read-onlyIdempotent

Fetch the full description for one registered AirMCP tool after discover_tools returns a compact match.

ParametersJSON Schema
NameRequiredDescriptionDefault
fullNoReturn the full description instead of the compact summary
nameYesRegistered tool name to describe
sessionIdNoOptional task-scoped tool session id; requires the tool to be in the session allowlist

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYes
titleNo
exposedYes
readOnlyNo
sensitiveNo
descriptionNo
destructiveNo
descriptionDetailYes

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ToolsA
Read-onlyIdempotent

Search available tools by keyword. Returns matching tools with descriptions.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results (default 20)
queryYesSearch query — e.g. 'calendar', 'send email', 'music playback'
sessionIdNoOptional task-scoped tool session id; limits matches to the session allowlist

Output Schema

ParametersJSON Schema
NameRequiredDescription
hintNo
queryYes
totalNo
methodNo
matchesYes

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 SessionA
Idempotent

End a tool session before its TTL expires.

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionIdYesSession id returned by start_tool_session

Output Schema

ParametersJSON Schema
NameRequiredDescription
endedYes
sessionIdYes

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ClipboardA
Read-onlyIdempotent

Read the current text content of the system clipboard.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
lengthYes
contentYes
truncatedYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 WeatherA
Read-onlyIdempotent

Get current weather conditions for a location using coordinates.

ParametersJSON Schema
NameRequiredDescriptionDefault
latitudeYesLatitude coordinate
longitudeYesLongitude coordinate

Output Schema

ParametersJSON Schema
NameRequiredDescription
unitsYesUnits for numeric values
humidityYesRelative humidity percentage
feelsLikeYesApparent temperature in Celsius
windSpeedYesWind speed in km/h
cloudCoverYesCloud cover percentage
temperatureYesCurrent temperature in Celsius
weatherCodeYesWMO weather code
precipitationYesPrecipitation in mm
windDirectionYesWind direction in degrees
weatherDescriptionYesHuman-readable weather description

TDQS

A3.6/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 ForecastB
Read-onlyIdempotent

Get daily weather forecast for a location.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoNumber of forecast days (default: 7)
latitudeYesLatitude coordinate
longitudeYesLongitude coordinate

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 WorkflowA
Read-onlyIdempotent

Retrieve a registered MCP prompt by name and return its workflow instructions as text.

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNoPrompt arguments as key-value pairs
nameYesPrompt name (e.g. 'daily-briefing', 'dev-session')

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 PackA
Destructive

Install, repair, update, or uninstall one AirMCP add-on package after explicit user confirmation. Use dryRun first to preview the npm command.

ParametersJSON Schema
NameRequiredDescriptionDefault
packYesNon-core module pack name, for example productivity, communications, media, or spatial
actionNoinstall repairs or updates the exact matching add-on version; uninstall removes it
dryRunNoPreview the npm command and config change without writing anything
confirmNoRequired true for real install/uninstall because this runs npm and edits AirMCP config

Output Schema

ParametersJSON Schema
NameRequiredDescription
packYes
actionYes
dryRunYes
commandYes
messageYes
skippedYes
confirmedYes
configPathYes
activePacksYes
installSpecYes
packageNameYes
restartRequiredYes

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 DirectoryA
Read-onlyIdempotent

List files and folders in a directory with metadata (kind, size, modification date).

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesAbsolute directory path
limitNoMax items to return (default: 100)

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
totalYes
returnedYes

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 EventsA
Read-onlyIdempotent

List events within a date range. Requires startDate and endDate (ISO 8601). Optionally filter by calendar name. Supports limit/offset pagination.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax events to return (default: 100)
offsetNoNumber of events to skip (default: 0)
endDateYesEnd of range (ISO 8601, e.g. '2026-03-31T23:59:59Z')
calendarNoFilter by calendar name
startDateYesStart of range (ISO 8601, e.g. '2026-03-01T00:00:00Z')

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYes
eventsYes
offsetYes
returnedYes

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 PacksA
Read-onlyIdempotent

List DLC-like AirMCP module packs and whether each pack is available in the current runtime configuration.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
packsYes
activeYes
configuredYes

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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 NotesA
Read-onlyIdempotent

List all notes with title, folder, and dates. Optionally filter by folder name. Supports pagination via limit/offset.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax number of notes to return (default: 200)
folderNoFilter by folder name
offsetNoNumber of notes to skip for pagination (default: 0)

Output Schema

ParametersJSON Schema
NameRequiredDescription
notesYes
totalYes
offsetYes
returnedYes

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 ProfilesA
Read-onlyIdempotent

List AirMCP runtime profiles. Profiles choose which modules load; toolExposure chooses how much of that surface appears in tools/list.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
activeYes
profilesYes
toolExposureYes

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 RemindersA
Read-onlyIdempotent

List reminders. Optionally filter by list name and/or completion status. Supports pagination via limit/offset.

ParametersJSON Schema
NameRequiredDescriptionDefault
listNoFilter by list name
limitNoMax number of reminders to return (default: 200)
offsetNoNumber of reminders to skip for pagination (default: 0)
completedNoFilter by completed status (true/false). Omit to list all.

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYes
offsetYes
returnedYes
remindersYes

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 ShortcutsA
Read-onlyIdempotent

List all available Siri Shortcuts on this Mac.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYes
shortcutsYes

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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 ActionA
Read-onlyIdempotent

Dry-run governance preview of a tool call WITHOUT executing it.

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNoArguments you would pass. Validated against the tool's real input schema; never executed.
toolYesTool name to preview, for example delete_reminder or move_note.

Output Schema

ParametersJSON Schema
NameRequiredDescription
toolYes
existsYes
exposedNo
argsValidNo
hitlLevelYes
rateLimitYes
sideEffectYes
annotationsNo
auditPreviewNo
requiredScopeNo
validationErrorNo
wouldRequireApprovalNo

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 ContextA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
timeContextYes
suggestedToolsYes
suggestedWorkflowsYes

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 StatusA
Read-onlyIdempotent

Show the active AirMCP profile, module set, tool exposure mode, exposed tool count, and total registered tool count.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
profileYes
toolExposureYes
toolsExposedYes
frontDoorToolsYes
harnessAdapterYes
modulesEnabledYes
modulesDisabledYes
toolsRegisteredYes
workflowReadinessYes
requireToolSessionYes
toolSessionsActiveYes
modulesMissingPacksYes
modulePacksAvailableYes
modulePacksConfiguredYes
missingPackInstallHintsYes
modulePackInstallIssuesYes
modulesMissingAddonPackagesYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 NoteA
Read-onlyIdempotent

Read the full content of a specific note by its ID. Returns HTML body and plaintext.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesNote ID (x-coredata:// format)

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
bodyYes
nameYes
folderYes
sharedYes
plaintextYes
creationDateYes
modificationDateYes
passwordProtectedYes

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ShortcutA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesShortcut name (exact match)
inputNoOptional text input for the shortcut

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNoTool arguments as a JSON object
nameYesRegistered tool name to run
sessionIdNoOptional task-scoped tool session id

TDQS

A3.8/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 NotesA
Read-onlyIdempotent

Search notes by keyword in title and body. Returns matching notes with a 200-char preview.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results to return (default: 50)
queryYesSearch keyword
offsetNoNumber of matching results to skip (for pagination)

Output Schema

ParametersJSON Schema
NameRequiredDescription
notesYes
totalYes
offsetYes
returnedYes
totalMatchedYes

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 ClipboardA
Idempotent

Write text to the system clipboard, replacing its current content.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesText to copy to the clipboard

Output Schema

ParametersJSON Schema
NameRequiredDescription
setYes
lengthYes

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
labelNoOptional human-readable task label
toolsYesRegistered tool names allowed in this session
ttlSecondsNoSession lifetime in seconds (default 900, max 3600)

Output Schema

ParametersJSON Schema
NameRequiredDescription
labelNo
createdAtYes
expiresAtYes
sessionIdYes
allowedToolsYes
remainingSecondsYes

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 ToolsA
Read-onlyIdempotent

Rank the tools that most often followed a given tool in this install's local call history.

ParametersJSON Schema
NameRequiredDescriptionDefault
afterYesTool name to get suggestions for — e.g. 'today_events'
limitNoMax suggestions (default 5)

Output Schema

ParametersJSON Schema
NameRequiredDescription
hintNo
afterYes
totalCallsYes
suggestionsYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 EventsA
Read-onlyIdempotent

Get all calendar events for today.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYes
eventsYes
returnedYes

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 StatusA
Read-onlyIdempotent

Inspect one active tool session by id without listing other clients' sessions.

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionIdYesSession id returned by start_tool_session

Output Schema

ParametersJSON Schema
NameRequiredDescription
labelNo
createdAtYes
expiresAtYes
sessionIdYes
allowedToolsYes
remainingSecondsYes

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ReadinessA
Read-onlyIdempotent

Explain whether curated AirMCP workflows are ready in the active runtime, including missing modules, add-ons, tools, and write opt-ins.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoOptional workflow id, for example daily-briefing or meeting-prep

Output Schema

ParametersJSON Schema
NameRequiredDescription
summaryYes
workflowsYes
toolExposureYes
activeProfileYes

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

  1. 28 tool updatesv2.16.5
    • Changeddescribe_tool2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changeddiscover_tools2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedend_tool_session2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_clipboard2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_current_weather2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_daily_forecast1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_workflow1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedinstall_module_pack2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_directory2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_events2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_module_packs2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_notes2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_profiles2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_reminders2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_shortcuts2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedpreview_action2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedproactive_context2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedprofile_status2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedread_note2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedrun_shortcut1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedrun_tool1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedsearch_notes2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedset_clipboard2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedstart_tool_session2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedsuggest_next_tools2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtoday_events2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtool_session_status2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedworkflow_readiness2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  2. 1 tool updatev2.16.3
    • Changedtoday_events2 fields changed
      • addedOutput schema / properties / returned
        Added value: +{
        +  "type": "number"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "total",
        -  "events"
        -]New value: +[
        +  "total",
        +  "returned",
        +  "events"
        +]
  3. 4 tool updatesv2.16.2
    • Changeddescribe_tool1 field changed
      • addedOutput schema / properties / sensitive
        Added value: +{
        +  "type": "boolean"
        +}
    • Addedpreview_action
    • Changedprofile_status2 fields changed
      • addedOutput schema / properties / workflowReadiness
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "blocked": {
        +      "type": "number"
        +    },
        +    "partial": {
        +      "type": "number"
        +    },
        +    "ready": {
        +      "type": "number"
        +    },
        +    "total": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "total",
        +    "ready",
        +    "partial",
        +    "blocked"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / required
        Previous 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"
        +]
    • Addedworkflow_readiness
  4. 5 tool updatesv2.14.1
    • Addeddescribe_tool
    • Addedinstall_module_pack
    • Addedlist_module_packs
    • Changedprofile_status9 fields changed
      • addedOutput schema / properties / harnessAdapter
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / missingPackInstallHints
        Added 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"
        +}
      • addedOutput schema / properties / modulePackInstallIssues
        Added 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"
        +}
      • addedOutput schema / properties / modulePacksAvailable
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / modulePacksConfigured
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / modulesMissingAddonPackages
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / modulesMissingPacks
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / requireToolSession
        Added value: +{
        +  "type": "boolean"
        +}
      • changedOutput schema / required
        Previous 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"
        +]
    • Changedsearch_notes4 fields changed
      • addedOutput schema / properties / notes / items / properties / shared
        Added value: +{
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / notes / items / required
        Previous value: -[
        -  "id",
        -  "name",
        -  "folder",
        -  "preview",
        -  "creationDate",
        -  "modificationDate"
        -]New value: +[
        +  "id",
        +  "name",
        +  "folder",
        +  "preview",
        +  "creationDate",
        +  "modificationDate",
        +  "shared"
        +]
      • addedOutput schema / properties / totalMatched
        Added value: +{
        +  "type": "number"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "total",
        -  "returned",
        -  "offset",
        -  "notes"
        -]New value: +[
        +  "total",
        +  "totalMatched",
        +  "returned",
        +  "offset",
        +  "notes"
        +]
  5. 113 tool updatesv2.14.0
    • Removedbulk_move_notes
    • Removedcalendar_week_view
    • Removedcapture_screenshot
    • Removedcloud_sync_status
    • Removedcompare_notes
    • Removedcomplete_reminder
    • Removedcreate_directory
    • Removedcreate_event
    • Removedcreate_folder
    • Removedcreate_note
    • Removedcreate_recurring_event
    • Removedcreate_recurring_reminder
    • Removedcreate_reminder
    • Removedcreate_reminder_list
    • Removedcreate_shortcut
    • Removeddelete_event
    • Removeddelete_note
    • Removeddelete_reminder
    • Removeddelete_reminder_list
    • Removeddelete_shortcut
    • Changeddiscover_tools2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / sessionId
        Added 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"
        +}
    • Removedduplicate_shortcut
    • Removededit_shortcut
    • Addedend_tool_session
    • Removedevent_status
    • Removedevent_subscribe
    • Removedexport_shortcut
    • Removedfind_related
    • Removedget_battery_status
    • Removedget_brightness
    • Changedget_current_weather1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_daily_forecast1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Removedget_file_info
    • Removedget_frontmost_app
    • Removedget_hourly_forecast
    • Removedget_screen_info
    • Removedget_shortcut_detail
    • Removedget_upcoming_events
    • Removedget_volume
    • Removedget_wifi_status
    • Changedget_workflow2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / args / propertyNames
        Added value: +{
        +  "type": "string"
        +}
    • Removedimport_shortcut
    • Removedis_app_running
    • Removedlaunch_app
    • Removedlist_all_windows
    • Removedlist_bluetooth_devices
    • Removedlist_calendars
    • Changedlist_directory1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedlist_events2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / offset / maximum
        Added value: +9007199254740991
    • Removedlist_folders
    • Changedlist_notes2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / offset / maximum
        Added value: +9007199254740991
    • Addedlist_profiles
    • Removedlist_reminder_lists
    • Changedlist_reminders4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / offset / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / reminders / items / properties / dueDate / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / reminders / items / properties / dueDate / type
        Removed value: -[
        -  "string",
        -  "null"
        -]
    • Removedlist_running_apps
    • Removedlist_triggers
    • Removedlocal_llm_generate
    • Removedlocal_llm_status
    • Removedminimize_window
    • Removedmove_file
    • Removedmove_note
    • Removedmove_window
    • Removedprevent_sleep
    • Addedprofile_status
    • Removedquit_app
    • Removedread_event
    • Changedread_note1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Removedread_reminder
    • Removedrecent_files
    • Removedresize_window
    • Changedrun_shortcut1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Addedrun_tool
    • Removedscan_notes
    • Removedsearch_events
    • Removedsearch_files
    • Changedsearch_notes2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / offset / maximum
        Added value: +9007199254740991
    • Removedsearch_reminders
    • Removedsearch_shortcuts
    • Removedsemantic_clear
    • Removedsemantic_index
    • Removedsemantic_search
    • Removedsemantic_status
    • Removedset_brightness
    • Changedset_clipboard1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Removedset_file_tags
    • Removedset_volume
    • Removedsetup_permissions
    • Removedshow_notification
    • Removedskill_calendar-alert
    • Removedskill_clipboard-url-to-reading
    • Removedskill_daily-journal
    • Removedskill_evening-winddown
    • Removedskill_focus-block-planner
    • Removedskill_focus-guardian
    • Removedskill_inbox-triage
    • Removedskill_project-digest
    • Removedskill_sender-to-tasks
    • Removedspotlight_clear
    • Removedspotlight_sync
    • Addedstart_tool_session
    • Changedsuggest_next_tools1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Removedsummarize_context
    • Removedsystem_power
    • Removedsystem_sleep
    • Removedtimeline_today
    • Removedtoggle_dark_mode
    • Removedtoggle_focus_mode
    • Removedtoggle_wifi
    • Addedtool_session_status
    • Removedtrash_file
    • Removedupdate_event
    • Removedupdate_note
    • Removedupdate_reminder
  6. 111 tool updatesv2.12.0
    • Addedbulk_move_notes
    • Addedcalendar_week_view
    • Addedcapture_screenshot
    • Addedcloud_sync_status
    • Addedcompare_notes
    • Addedcomplete_reminder
    • Addedcreate_directory
    • Addedcreate_event
    • Addedcreate_folder
    • Addedcreate_note
    • Addedcreate_recurring_event
    • Addedcreate_recurring_reminder
    • Addedcreate_reminder
    • Addedcreate_reminder_list
    • Addedcreate_shortcut
    • Addeddelete_event
    • Addeddelete_note
    • Addeddelete_reminder
    • Addeddelete_reminder_list
    • Addeddelete_shortcut
    • Addeddiscover_tools
    • Addedduplicate_shortcut
    • Addededit_shortcut
    • Addedevent_status
    • Addedevent_subscribe
    • Addedexport_shortcut
    • Addedfind_related
    • Addedget_battery_status
    • Addedget_brightness
    • Addedget_clipboard
    • Addedget_current_weather
    • Addedget_daily_forecast
    • Addedget_file_info
    • Addedget_frontmost_app
    • Addedget_hourly_forecast
    • Addedget_screen_info
    • Addedget_shortcut_detail
    • Addedget_upcoming_events
    • Addedget_volume
    • Addedget_wifi_status
    • Addedget_workflow
    • Addedimport_shortcut
    • Addedis_app_running
    • Addedlaunch_app
    • Addedlist_all_windows
    • Addedlist_bluetooth_devices
    • Addedlist_calendars
    • Addedlist_directory
    • Addedlist_events
    • Addedlist_folders
    • Addedlist_notes
    • Addedlist_reminder_lists
    • Addedlist_reminders
    • Addedlist_running_apps
    • Addedlist_shortcuts
    • Addedlist_triggers
    • Addedlocal_llm_generate
    • Addedlocal_llm_status
    • Addedminimize_window
    • Addedmove_file
    • Addedmove_note
    • Addedmove_window
    • Addedprevent_sleep
    • Addedproactive_context
    • Addedquit_app
    • Addedread_event
    • Addedread_note
    • Addedread_reminder
    • Addedrecent_files
    • Addedresize_window
    • Addedrun_shortcut
    • Addedscan_notes
    • Addedsearch_events
    • Addedsearch_files
    • Addedsearch_notes
    • Addedsearch_reminders
    • Addedsearch_shortcuts
    • Addedsemantic_clear
    • Addedsemantic_index
    • Addedsemantic_search
    • Addedsemantic_status
    • Addedset_brightness
    • Addedset_clipboard
    • Addedset_file_tags
    • Addedset_volume
    • Addedsetup_permissions
    • Addedshow_notification
    • Addedskill_calendar-alert
    • Addedskill_clipboard-url-to-reading
    • Addedskill_daily-journal
    • Addedskill_evening-winddown
    • Addedskill_focus-block-planner
    • Addedskill_focus-guardian
    • Addedskill_inbox-triage
    • Addedskill_project-digest
    • Addedskill_sender-to-tasks
    • Addedspotlight_clear
    • Addedspotlight_sync
    • Addedsuggest_next_tools
    • Addedsummarize_context
    • Addedsystem_power
    • Addedsystem_sleep
    • Addedtimeline_today
    • Addedtoday_events
    • Addedtoggle_dark_mode
    • Addedtoggle_focus_mode
    • Addedtoggle_wifi
    • Addedtrash_file
    • Addedupdate_event
    • Addedupdate_note
    • Addedupdate_reminder

TDQS

A3.5/5.0

Scored across 28 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count2/5

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.

Completeness2/5

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

ActivityActive
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    MCP server for privacy-gated local Apple data access including Mail, Messages, Notes, Calendar, Contacts, Photos, Reminders, Voice Memos, and iCloud Drive.
    30
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    A 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 npm
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    MCP server that enables AI to fully control macOS — mouse, keyboard, terminal, screenshots, window management, UI element detection, and provides AI-optimized information reporting.
    36
    22 npm
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enterprise-grade macOS MCP server that gives AI agents eyes, hands, and a terminal, enabling screen capture, mouse/keyboard control, shell commands, and file operations.
    -