com.local-mcp/local-mcp
REMOTE · LOCAL-MCP.COM · 2 COMPONENTS · SCANNED AUG 3
Let ChatGPT, Claude & Cursor use your Mac: email, calendar, iMessage, Teams, files. Local, free.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score →
Endpoint Security66
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (create_omnifocus_task). See how to fix → View diagnostics → Fail
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability69
- 75% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Partial
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 23427 tokens (~103/item across 227 items; 226 tools + 1 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management11
- Stability check failed: schema churn in the 8 days we've observed: 38 tool removals, 0 breaking changes, 0 auth/transport breaks, 26 additions. See how to fix → Fail
Tool Coverage95
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 81% of tool parameters carry a description.Partial
- Structured output schemas are declared (84% of tools); any adoption earns full credit.Pass
Capabilities47
- Spec-recency check failed: implements MCP spec 2024-11-05; the latest is 2026-07-28. See how to fix → Fail
- Supports UI / widget rendering.Pass
Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.
remote · local-mcp.com
claude mcp add --transport http com-local-mcp-local-mcp https://local-mcp.com/mcp
[mcp_servers.com-local-mcp-local-mcp] url = "https://local-mcp.com/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"com-local-mcp-local-mcp": {
"type": "remote",
"url": "https://local-mcp.com/mcp",
"enabled": true
}
}
} openclaw mcp add com-local-mcp-local-mcp --url https://local-mcp.com/mcp --transport streamable-http
mcp_servers:
com-local-mcp-local-mcp:
url: "https://local-mcp.com/mcp" {
"mcpServers": {
"com-local-mcp-local-mcp": {
"type": "http",
"url": "https://local-mcp.com/mcp"
}
}
} The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 3 Aug 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 7 to 11.
- 2 Aug 26 0
- Tool “update_self_diagnosis” was removed ▼ security
- Tool “update_local_mcp” was removed ▼ security
- Tool “todo_list_lists” was removed ▼ security
- Tool “delete_reminder_list” was removed ▼ security
- Tool “signal_friction” was removed ▼ security
- Tool “rename_reminder_list” was removed ▼ security
- Tool “list_reminder_lists” was removed ▼ security
- New tool “delete_reminder_folder”, which the server declares destructive security
- Tool “word_append” rewrote its description, which is the text the model reads security
- Tool “word_create” rewrote its description, which is the text the model reads security
- Tool “file_read” rewrote its description, which is the text the model reads security
- Tool “ppt_create” rewrote its description, which is the text the model reads security
- Tool “safari_wait_for” rewrote its description, which is the text the model reads security
- Tool “chrome_wait_for” rewrote its description, which is the text the model reads security
- Schema quality: good → fair functional
- Server version: ff5a8769-3ea → 592a6ae2-fec functional
- Server version: 08fa612d-2a3 → ff5a8769-3ea functional
- New tool “todo_get_folders” functional
- New tool “report_friction” functional
- New tool “rename_reminder_folder” functional
- New tool “lmcp_upgrade_diagnostics” functional
- New tool “lmcp_install_upgrade” functional
- New tool “get_reminder_folders” functional
- New tool “todoist_create_task” functional
- New tool “connect_todoist” functional
- New tool “todoist_list_tasks” functional
- New tool “todoist_list_projects” functional
- New tool “survey_respond” functional
- New tool “disconnect_todoist” functional
- New tool “survey_skip” functional
- New tool “todoist_complete_task” functional
- “list_omnifocus_tasks” reworded the description of “include_completed” cosmetic
- “list_omnifocus_tasks” reworded the description of “inbox” cosmetic
- “list_omnifocus_tasks” reworded the description of “flagged” cosmetic
- “list_omnifocus_tasks” reworded the description of “due_today” cosmetic
- “list_omnifocus_projects” reworded the description of “limit” cosmetic
- “list_omnifocus_projects” reworded the description of “include_completed” cosmetic
- “list_omnifocus_folders” reworded the description of “limit” cosmetic
- “create_omnifocus_task” reworded the description of “name” cosmetic
- “create_omnifocus_task” reworded the description of “due_date” cosmetic
- “list_omnifocus_tasks” reworded the description of “limit” cosmetic
- “create_omnifocus_task” reworded the description of “flagged” cosmetic
- “complete_omnifocus_task” reworded the description of “confirm” cosmetic
- “complete_omnifocus_task” reworded the description of “task_id” cosmetic
- “complete_omnifocus_task” reworded the description of “task_name” cosmetic
- “create_omnifocus_task” reworded the description of “confirm” cosmetic
- “create_omnifocus_task” reworded the description of “defer_date” cosmetic
- “update_reminder” reworded the description of “list_name” cosmetic
- “todo_list_tasks” reworded the description of “list” cosmetic
- “todo_create_task” reworded the description of “list” cosmetic
- “create_omnifocus_task” reworded the description of “project” cosmetic
- “create_omnifocus_task” reworded the description of “note” cosmetic
- “list_omnifocus_tasks” reworded the description of “project” cosmetic
- “search_omnifocus_tasks” reworded the description of “query” cosmetic
- “search_omnifocus_tasks” reworded the description of “limit” cosmetic
- “list_omnifocus_tasks” reworded the description of “tag” cosmetic
- “safari_wait_for” reworded the description of “selector” cosmetic
- “safari_wait_for” reworded the description of “text_match” cosmetic
- “chrome_wait_for” reworded the description of “selector” cosmetic
- “chrome_wait_for” reworded the description of “text_match” cosmetic
- “safari_wait_for” made “selector” optional cosmetic
- “chrome_wait_for” made “selector” optional cosmetic
- 1 Aug 26 +1
- Server version: b4f82cea-409 → 08fa612d-2a3 functional
- 31 Jul 26 −4
- Tool “servicenow_get_incident” was removed ▼ security
- Tool “connect_servicenow” was removed ▼ security
- Tool “disconnect_servicenow” was removed ▼ security
- Tool “servicenow_add_comment” was removed ▼ security
- Tool “servicenow_create_incident” was removed ▼ security
- Tool “servicenow_list_my_incidents” was removed ▼ security
- Tool “servicenow_search_incidents” was removed ▼ security
- Tool “servicenow_search_kb” was removed ▼ security
- Tool “servicenow_update_incident” was removed ▼ security
- The server rewrote its instructions, which are the text every model session reads security
- Tool “create_calendar_event” rewrote its description, which is the text the model reads security
- Tool “create_referral_invites” rewrote its description, which is the text the model reads security
- Tool “delete_calendar_event” rewrote its description, which is the text the model reads security
- Tool “file_read” rewrote its description, which is the text the model reads security
- Tool “finder_list” rewrote its description, which is the text the model reads security
- Tool “finder_search” rewrote its description, which is the text the model reads security
- Tool “report_problem” rewrote its description, which is the text the model reads security
- Schema quality: pass → fail ▼ functional
- MCP protocol: pass → fail ▼ functional
- The server now declares the “prompts” capability functional
- The server now declares the “resources” capability functional
- First check of Schema quality: 75 functional
- New prompt “draft_email” functional
- New prompt “daily_briefing” functional
- New prompt “summarize_inbox” functional
- MCP protocol version: 2025-11-25 → 2024-11-05 functional
- New resource “welcome.html” functional
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- Server version: 1.0 → b4f82cea-409 functional
- “create_calendar_event” added an optional parameter “recurrence” cosmetic
- “create_calendar_event” added an optional parameter “recurrence_count” cosmetic
- “create_calendar_event” added an optional parameter “recurrence_interval” cosmetic
- “create_calendar_event” added an optional parameter “recurrence_until” cosmetic
- “delete_calendar_event” added an optional parameter “span” cosmetic
- 30 Jul 26 +6
- Stability: 0.10 → fail ▼ security
- Schema quality: fair → good functional
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 29 Jul 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.
- 28 Jul 26 −4
- Tool “lmcp_state” rewrote its description, which is the text the model reads security
- Schema quality: good → fair functional
- New tool “list_missing_permissions” functional
- New tool “configure_clients” functional
- 27 Jul 26 +1
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 3 Aug 2026 · Probed https://local-mcp.com/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=local-mcp.com | CN=YE2,O=Let's Encrypt,C=US | 19 Jul 2026 | 17 Oct 2026 | ECDSA 256 | ECDSA-SHA384 | 534465691c49f58d100f7c86d2438a66172 |
| SANs: *.local-mcp.com, local-mcp.com | ||||||
| CN=YE2,O=Let's Encrypt,C=US (CA) | CN=Root YE,O=ISRG,C=US | 3 Sept 2025 | 2 Sept 2028 | ECDSA 384 | ECDSA-SHA384 | 4df3b15dd6c0784c507cd37b58e6f115 |
| CN=Root YE,O=ISRG,C=US (CA) | CN=ISRG Root X2,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | ECDSA-SHA384 | 872165fc34b6e5fba8add5b3705fb53a |
| CN=ISRG Root X2,O=Internet Security Research Group,C=US (CA) | CN=ISRG Root X1,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | SHA256-RSA | 6c8f1dc727c7117f7baf853ac980f9cd |
DNSSEC secure
Validation of local-mcp.com. — Secure
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| com. | present | 19718 | 13 | Verified |
| local-mcp.com. | present | 2371 | 13 | Verified |
| local-mcp.com. | Verified address RRset verified with the apex keys |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=15552000 |
| content-security-policy | default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' static.cloudflareinsights.com plausible.io https://*.clarity.ms https://www.googletagmanager.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https: blob:; font-src 'self' data:; connect-src 'self' https://www.local-mcp.com https://office-mcp-production.up.railway.app https://plausible.io https://static.cloudflareinsights.com https://cloudflareinsights.com https://api.npmjs.org https://*.clarity.ms https://*.google-analytics.com https://*.analytics.google.com https://www.googletagmanager.com https://cdn.growthbook.io; frame-ancestors 'none'; base-uri 'self'; form-action 'self' https://www.local-mcp.com https://chatgpt.com https://claude.ai |
| x-content-type-options | nosniff |
| x-frame-options | DENY |
| referrer-policy | strict-origin-when-cross-origin |
| permissions-policy | camera=(), microphone=(), geolocation=(), payment=() |
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://local-mcp.com/mcp | Verified | 200 | |
| http (plaintext) | http://local-mcp.com/mcp | HTTPS enforced | 301 | https://local-mcp.com/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability.
onedrive_delete_file OneDrive Delete File ~47
Deletes a file or empty folder from OneDrive.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | — | Must be true to delete |
| path | string | yes | Absolute path to the file or folder |
| Name | Type | Req | Description |
|---|---|---|---|
| deleted | boolean | yes | — |
| path | string | yes | — |
No examples provided.
onedrive_file_info OneDrive File Info ~58
Returns metadata for a file or folder: size, modification date, type, and extension. Faster than listing the parent directory when you only need info about one item.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Absolute path to the file or folder |
| Name | Type | Req | Description |
|---|---|---|---|
| created | string | — | — |
| extension | string | — | — |
| modified | string | — | — |
| name | string | — | — |
| path | string | — | — |
| size | integer | — | — |
| size_human | string | — | — |
| type | string | — | file | directory |
No examples provided.
onedrive_list_files OneDrive List Files ~118
Lists files and folders in a OneDrive path. Use onedrive_root to find valid paths. Returns up to `limit` entries (default 1000, max 5000); large folders are truncated with a note — narrow the path for more specific results.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | — | Max entries to return (default 1000, max 5000). Folders with more entries are truncated; the response sets truncated=true and reports the total. |
| path | string | yes | Absolute path to the OneDrive folder |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | — | Entries returned in this response. |
| items | array | — | — |
| note | string | — | — |
| total | integer | — | Total entries in the folder. |
| truncated | boolean | — | True when total exceeds the limit. |
No examples provided.
onedrive_move_file OneDrive Move File ~53
Moves or renames a file/folder within OneDrive.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | — | Must be true to move |
| destination | string | yes | Destination path |
| source | string | yes | Source path |
| Name | Type | Req | Description |
|---|---|---|---|
| from | string | yes | — |
| moved | boolean | yes | — |
| to | string | yes | — |
No examples provided.
onedrive_read_file OneDrive Read File ~188
Reads a text file from your OneDrive synced folder. Supports .txt, .md, .csv, .json, .xml, .log and several code file types. Auto-detects UTF-8, falls back to Latin-1/Windows-1252 for legacy files (common in Latin American banking .TXT padrones). For files elsewhere on this Mac, use file_read.
| Name | Type | Req | Description |
|---|---|---|---|
| encoding | string | — | Force a specific encoding: 'auto' (default), 'utf8', 'latin1', 'cp1252', 'ascii', 'utf16' |
| max_bytes | integer | — | Maximum bytes to read (default 1048576 = 1 MB, capped at 10485760 = 10 MB) |
| offset | integer | — | Start reading at byte offset (default 0) |
| path | string | yes | Absolute path to the file |
| Name | Type | Req | Description |
|---|---|---|---|
| bytes | integer | yes | Total file size in bytes |
| bytes_read | integer | — | Number of bytes read in this slice |
| content | string | yes | Decoded file text content |
| encoding | string | — | Encoding used to decode (utf8 | cp1252 | latin1 | ascii | utf16) |
| offset | integer | — | Byte offset the read started at |
| path | string | yes | Absolute path of the file |
| truncated | boolean | — | True if more content remains beyond what was returned |
No examples provided.
onedrive_root OneDrive Root ~20
Lists all mounted OneDrive directories on this Mac.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| roots | array | — | — |
No examples provided.
onedrive_search_files OneDrive Search Files ~87
Searches for files by name in a OneDrive directory (recursive). Returns up to max_results matches (default 50); raise max_results or narrow the root for more.
| Name | Type | Req | Description |
|---|---|---|---|
| max_results | integer | — | Maximum results (default 50) |
| query | string | yes | Filename pattern to search for |
| root | string | — | Root OneDrive path to search in (optional) |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | — | — |
| query | string | — | — |
| results | array | — | — |
No examples provided.
onedrive_set_scope OneDrive Set Scope ~134
Restricts LMCP's OneDrive access to a specific folder. Once set, all OneDrive tools (read, write, list, search, delete, move) only work inside the allowed folder. Pass an empty folder to remove the restriction. Changes take effect immediately.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | — | Must be true to apply |
| folder | string | — | Allowed folder path relative to the root (e.g. '/000-Claude Personal Agent'). Empty string removes the scope. |
| root_name | string | yes | OneDrive root name (from onedrive_root, e.g. 'OneDrive-WPPCloud') |
| Name | Type | Req | Description |
|---|---|---|---|
| access | string | — | — |
| allowed_folder | string | — | — |
| effect | string | — | — |
| root | string | — | — |
| scope_removed | boolean | — | — |
| scope_set | boolean | — | — |
No examples provided.
onedrive_write_file OneDrive Write File ~59
Writes text content to a file in OneDrive.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | — | Must be true to write |
| content | string | yes | Text content to write |
| path | string | yes | Absolute path to the file in OneDrive |
| Name | Type | Req | Description |
|---|---|---|---|
| bytes | integer | yes | — |
| path | string | yes | — |
| written | boolean | yes | — |
No examples provided.
outlook_diagnose Outlook Diagnose ~48
Checks which email accounts are configured in Microsoft Outlook and compares them with Mail.app. If Outlook has accounts not in Mail.app, guides the user to add them so all email tools work seamlessly.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| installed | boolean | yes | True if Microsoft Outlook is installed |
| mail_app_accounts | array | — | — |
| missing_from_mail_app | array | — | Outlook account emails not present in Mail.app |
| note | string | — | Plain-language guidance |
| outlook_accounts | array | — | — |
| report | string | — | Full formatted text report |
No examples provided.
pdf_read PDF Read ~49
Reads and extracts text from a PDF document (.pdf file).
| Name | Type | Req | Description |
|---|---|---|---|
| max_pages | integer | — | Max pages to extract (default: all) |
| path | string | yes | Absolute path to the PDF file |
| Name | Type | Req | Description |
|---|---|---|---|
| chars | integer | yes | Number of characters in the extracted text |
| pages | integer | — | Total number of pages in the PDF |
| text | string | yes | Extracted text content |
No examples provided.
permissions_status Permissions Status ~79
Reports the TCC permission state (screen recording, accessibility, microphone) this app needs to capture the screen and drive other apps' UI. Call it before a capture/automation run and surface the grant hints instead of failing mid-sequence. Screen Recording / Accessibility are granted in System Settings (not a JIT dialog); the URLs open the exact pane.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
ppt_create PowerPoint Create ~145
Creates a PowerPoint presentation (.pptx) at `path` from an array of slides, each {title, bullets:[…]}. Requires confirm=true — called without it, returns a preview of the deck instead of writing the file. The path must be somewhere Local MCP can write; Desktop/Documents/Downloads may need a one-time Files-and-Folders grant (System Settings → Privacy & Security → Files and Folders). Returns {created, path, slides}.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | — | Must be true to create |
| path | string | yes | Output path for the .pptx file |
| slides | array | yes | Array of {title, bullets:[]} slide objects |
| Name | Type | Req | Description |
|---|---|---|---|
| created | boolean | yes | True when the file was created |
| path | string | yes | Path of the created .pptx file |
| slides | integer | yes | Number of slides created |
No examples provided.
ppt_read PowerPoint Read ~37
Reads slide text content from a PowerPoint presentation (.pptx file).
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Absolute path to the .pptx file |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | Number of slides |
| slides | array | yes | Per-slide structured content ({slide, title, bullets[]}), mirroring ppt_create |
No examples provided.
read_email Read Email ~351
Use this when the user wants the full content of an email that lives in the Mac's Apple Mail (message ID from list_emails/search_emails). For a Microsoft 365 message ID from m365_list_emails, use m365_read_email. Pass account= (and mailbox= if known, both from list_emails/search_emails) so the lookup targets one account instead of scanning all of them. Call sequentially, not in parallel — concurrent calls serialize behind Mail.app's JXA lock and later calls will time out. Performance: body fetch is the primary latency source (avg 20s on slow IMAP). Pass include_body=false to skip it and get metadata-only (fast). Pass max_body_chars=N to cap the body at N chars after HTML stripping (default 30000; 0=unlimited). Response includes body_fetch_ms when fetch took >2s, body_omitted=true when skipped, body_truncated_at=N when cut. When a body isn't cached on this Mac, read_email returns metadata with body_omitted=true and body_omit_reason="not_downloaded" (iCloud/IMAP optimized storage) rather than making Mail fetch it (that can be slow and tie Mail up). If the user wants it anyway, retry with force_download=true to have Mail pull the body over IMAP now and return it (waits up to ~60s). Off by default; ignored while Mail is in a cooldown.
| Name | Type | Req | Description |
|---|---|---|---|
| account | string | — | — |
| force_download | boolean | — | — |
| include_body | boolean | — | — |
| mailbox | string | — | — |
| max_body_chars | integer | — | — |
| message_id | string | yes | — |
| Name | Type | Req | Description |
|---|---|---|---|
| account | string | — | — |
| body | string | — | — |
| body_fetch_ms | integer | — | — |
| body_omitted | boolean | — | — |
| body_truncated_at | integer | — | — |
| cc | string | — | — |
| date | string | — | — |
| from | string | — | — |
| id | string | — | — |
| mailbox | string | — | — |
| subject | string | — | — |
| to | string | — | — |
| unread | boolean | — | — |
No examples provided.
read_messages Read Messages ~66
Reads messages from an iMessage conversation by chat ID or contact name.
| Name | Type | Req | Description |
|---|---|---|---|
| chat_id | string | — | Chat identifier from list_message_chats |
| contact_name | string | — | Contact name substring (alternative to chat_id) |
| limit | integer | — | Max messages (default 50) |
| Name | Type | Req | Description |
|---|---|---|---|
| chat_id | string | — | — |
| count | integer | — | — |
| messages | array | — | — |
| note | string | — | — |
No examples provided.
read_note Read Note ~36
Reads the full content of a note by name or ID.
| Name | Type | Req | Description |
|---|---|---|---|
| note_id | string | — | — |
| note_name | string | — | — |
| Name | Type | Req | Description |
|---|---|---|---|
| body | string | — | — |
| folder | string | — | — |
| id | string | — | — |
| modified | string | — | — |
| name | string | — | — |
No examples provided.
recipe_delete Recipe Delete ~125
Use this when the user wants to remove one of THEIR saved recipes/skills (the manifests under ~/.local/share/local-mcp/recipes). Destructive with a preview gate: the first call (without confirm) shows what would be deleted; call again with confirm=true to actually delete. Bundled starter recipes can't be deleted. To modify a recipe instead, recipe_save with the same name overwrites it (upsert).
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | — | Must be true to actually delete. Without it, returns a preview. |
| name | string | yes | Recipe name (from recipe_list). |
| Name | Type | Req | Description |
|---|---|---|---|
| deleted | boolean | — | — |
| name | string | — | — |
| status | string | — | 'preview' when confirm was not set. |
No examples provided.
recipe_discover Recipe Discover ~111
Browses installable community SKILLS — ready-made LMCP workflows other people published (a morning brief, inbox triage, a weekly report). A user would browse them to find a ready-made workflow for a repeatable multi-app task instead of building it from scratch. Returns a list of {id, title, category, description, steps, votes}; install one with recipe_install(id).
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | — | Optional filter hint shown to the user; the catalog is small so all skills are returned. |
No output schema declared.
No examples provided.
recipe_export Recipe Export ~108
Exports a saved SKILL (recipe) as a single portable token the user can send to someone else — paste it in a message, email, or doc. The recipient installs it with recipe_import and runs it with recipe_run. A user would export a skill to share it with a teammate (a handy brief, a report, a workflow). Returns {name, skill_token} plus the readable manifest.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Name of the saved skill to export (see recipe_list). |
No output schema declared.
No examples provided.
recipe_get Recipe Get ~31
Returns the full manifest of a recipe by name. recipe_not_found if unknown.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | — |
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | — | — |
| name | string | — | — |
| params | array | — | — |
| steps | array | — | — |
No examples provided.
recipe_import Recipe Import ~123
Installs a SKILL someone shared with you — pass the skill_token from their recipe_export (or a raw recipe manifest JSON). Saves it to this Mac so recipe_run can use it. Safe: importing only stores the skill; when it's later run, any state-changing step (send/write/delete) previews first and needs confirmation. If a skill with the same name already exists, the import is saved under a non-colliding name. Returns {name, imported}.
| Name | Type | Req | Description |
|---|---|---|---|
| skill | string | yes | A skill_token from recipe_export, or a raw recipe manifest JSON string. |
No output schema declared.
No examples provided.
recipe_install Recipe Install ~101
Installs a community SKILL by id (from recipe_discover) onto this Mac so recipe_run can use it. Safe: installing only stores the skill; when it's later run, any state-changing step (send/write/delete) previews first and needs confirmation. If a skill with the same name already exists, it's saved under a non-colliding name. Returns {name, installed}.
| Name | Type | Req | Description |
|---|---|---|---|
| id | integer | yes | The community skill id from recipe_discover. |
No output schema declared.
No examples provided.
recipe_list Recipe List ~82
Lists the user's reusable SKILLS — saved recipes (an ordered sequence of LMCP tool calls with parameters), plus bundled ones — each runnable with recipe_run. Skills turn a repeated LMCP workflow into one reusable command. A user would list them to find an existing skill for a task rather than rebuilding it from scratch. Returns each skill's name, description, and steps.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| recipes | array | — | — |
No examples provided.
recipe_run Recipe Run ~133
Executes a recipe end to end: binds params, runs each step's tool in order via the registry, persists the run (see recipe_runs), and returns each step's result plus any markers_path. Recipes with state-changing steps (write/send/delete) PREVIEW first — call again with confirm:true to execute; read-only recipes run immediately. A step that errors stops the run and is reported.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | — | Set true to execute a recipe that has state-changing steps; read-only recipes ignore it. |
| name | string | yes | — |
| params | object | — | Param overrides (merged over the recipe defaults). |
No output schema declared.
No examples provided.
recipe_runs Recipe Runs ~128
Shows the history of past recipe runs and their results (recorded by recipe_run), so you can reuse, compare, or debug an automation. Pass `name` for one recipe's runs, or omit for a compact history across all recipes. Pass `run_id` (with `name`) to get that run in full detail. Newest first.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | — | Max runs to return (default 20). |
| name | string | — | Recipe name; omit for runs across all recipes. |
| run_id | string | — | Return this one run in full detail (requires name). |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | — | — |
| recipe | string|null | — | Recipe name when scoped, null for the all-recipes history. |
| runs | array | — | — |
No examples provided.
recipe_save Recipe Save ~325
Saves a reusable SKILL — a named recipe (an ordered sequence of LMCP tool calls with parameters) — to this Mac so the user can re-run it anytime with recipe_run. A user would save one to turn a multi-step LMCP workflow they repeat (a morning brief, inbox triage, a weekly report, a data pull) into a single reusable command. Saved skills can be shared with other people via recipe_export. The manifest must have a name and a non-empty steps array. Returns {name}.
| Name | Type | Req | Description |
|---|---|---|---|
| manifest | object | yes | The recipe manifest. Shape: {"name": string (required), "description": string, "params": [{"name": string, "type": "string"|"int"|"bool", "default": any}], "steps": [ ... ] (required, non-empty), "ou… |
No output schema declared.
No examples provided.
record_marker Record Marker ~124
Drops a named marker into the active recording's timeline. t_ms is elapsed ms since recording start. Provide bounds (global points, top-left) to zoom toward an element, or omit for full-frame. note becomes a caption source. Returns no_active_session if nothing is recording.
| Name | Type | Req | Description |
|---|---|---|---|
| bounds | object | — | Optional {x,y,w,h} global points to zoom toward. |
| name | string | yes | Marker name, e.g. open_tray, act2_calendar_create. |
| note | string | — | Free text → caption source. |
| session_id | string | — | — |
No output schema declared.
No examples provided.
rename_reminder_folder Rename Reminder Folder ~103
Renames an existing Apple Reminders list. Pass the current list name (or list_id from get_reminder_folders) and new_name. Requires confirm=true.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | — | Must be true to apply |
| list_id | string | — | List identifier from get_reminder_folders (alternative to name) |
| name | string | — | Current list name (or pass list_id) |
| new_name | string | yes | New name for the list |
Structured output declared, but exposes no named fields.
No examples provided.
reply_email Reply Email ~138
Use this when the user wants to reply to an email that lives in the Mac's Apple Mail (message ID from list_emails/search_emails). Supports plain text or HTML body. For a Microsoft 365 message ID from m365_list_emails, use m365_reply_email. Pass `account` (from list_emails/search_emails results) to skip scanning other accounts and avoid timeouts on multi-account Macs.
| Name | Type | Req | Description |
|---|---|---|---|
| account | string | — | — |
| body | string | — | — |
| confirm | boolean | — | — |
| html_body | string | — | — |
| message_id | string | yes | — |
| reply_all | boolean | — | — |
| Name | Type | Req | Description |
|---|---|---|---|
| message_id | string | — | — |
| replied | boolean | — | — |
No examples provided.
report_friction Report Friction ~171
Send an ANONYMOUS, content-free signal when an LMCP tool fails, returns nothing useful, the user seems frustrated, or you could not accomplish what they asked. Helps the LMCP team find and fix the roughest spots. Send ONLY the category + the tool name — NEVER the user's request, message/email content, account names, or any personal data. No confirmation needed: this is anonymous (categories only) and respects the user's opt-out.
| Name | Type | Req | Description |
|---|---|---|---|
| attempt_count | integer | — | How many times this was attempted (optional). |
| error_category | string | — | Category of what went wrong (optional). |
| friction_type | string | yes | What kind of friction you observed. |
| tool_attempted | string | — | Name of the LMCP tool involved (e.g. list_emails). Optional. |
Structured output declared, but exposes no named fields.
No examples provided.
report_problem Report Problem ~279
Sends a problem report, feature request, or integration request to the LMCP team — for when a user wants to report a bug, ask for a new capability, or request support for an app LMCP doesn't cover yet. Without confirm=true it returns a preview of the anonymous payload that would be sent (version, OS, and permission status only — no personal data); with confirm=true it submits and returns a case_id. type='problem' (default) reports a bug, type='feature' requests a new capability, type='integration' requests an unsupported app.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | — | Must be true to submit the report. Without it, shows a preview. |
| description | string | — | Required for type=feature or integration: what the user wants. |
| error_message | string | — | For type=problem: verbatim error string from the failed tool. |
| expected | string | — | What you or the user expected to happen. |
| report_type | string | — | 'problem' (default) | 'feature' | 'integration' |
| symptom | string | — | Required for type=problem: what is broken, in your own words. |
| tool_attempted | string | — | For type=problem: name of the LMCP tool that failed. |
| user_request | string | — | What the user originally asked the AI to do. |
Structured output declared, but exposes no named fields.
No examples provided.
request_feature Request Feature ~144
Submits a feature request to the LMCP team — a new capability, a tool that doesn't exist yet, or an app/integration the user wishes LMCP supported. A user would invoke this when they want to ask the team for something LMCP can't do yet. Without confirm=true it returns a preview; with confirm=true it submits. The request includes the machine ID and (if set) the account email so the team can follow up — it is not anonymous.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | — | Must be true to submit. Without it, shows a preview. |
| feature | string | yes | What the user wants LMCP to do — a capability, tool, or integration. |
Structured output declared, but exposes no named fields.
No examples provided.
run_diagnostics Run Diagnostics ~108
Runs a fast health check of all LMCP integrations on this machine. Shows what works, what doesn't, and how to fix it. Optionally submits a report to the LMCP team.
| Name | Type | Req | Description |
|---|---|---|---|
| focus | string | — | Integration to focus on: calendar, mail, contacts, reminders, omnifocus, outlook, notes, finder, onedrive. Leave empty to check all. |
| submit | boolean | — | Send the diagnostic report to the LMCP team for analysis (default: false) |
| Name | Type | Req | Description |
|---|---|---|---|
| integrations | array | yes | — |
| ok_count | integer | yes | Number of integrations working |
| problem_count | integer | yes | Number of integrations with errors or missing permissions |
| report | string | — | Full formatted text report |
| submitted | boolean | — | True when the report was sent to the LMCP team |
| summary | string | yes | Plain-language summary of overall health |
| warn_count | integer | yes | Number of integrations with warnings / not running |
No examples provided.
safari_click Safari Click ~149
Clicks the first element matching a CSS selector in the current Safari tab. Returns the tag name and visible text of the clicked element so you can confirm the right thing was hit. Pass `wait_for_navigation: true` to wait up to 3 seconds for the page to load after the click (useful when clicking links or buttons that trigger navigation).
| Name | Type | Req | Description |
|---|---|---|---|
| nth | integer | — | Which match to click if there are several (0-based, default 0) |
| selector | string | yes | CSS selector (e.g. 'button.primary', '#save', '[data-testid=login]') |
| wait_for_navigation | boolean | — | Wait up to 3s for page load after click (default false) |
Structured output declared, but exposes no named fields.
No examples provided.
safari_fill_form Safari Fill Form ~37
Fills multiple form fields in one shot. Pass fields as a JSON object mapping CSS selector to value.
| Name | Type | Req | Description |
|---|---|---|---|
| fields | string | yes | — |
| Name | Type | Req | Description |
|---|---|---|---|
| ok | boolean | — | — |
| result | object | — | — |
No examples provided.
safari_go_back Safari Go Back ~29
Navigates the current Safari tab back to the previous page.
| Name | Type | Req | Description |
|---|---|---|---|
| window_index | integer | — | — |
| Name | Type | Req | Description |
|---|---|---|---|
| from | string | — | — |
| to | string | — | — |
| went_back | boolean | — | — |
No examples provided.
safari_history Safari History ~116
Lists or searches the user's Safari browsing history (local SQLite, read-only — no page is opened). Optional `query` matches the URL or page title (case-insensitive substring). Returns url, title, visit_count and last_visit (ISO), newest first. Requires Full Disk Access. For Chrome use chrome_history.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | — | Max entries to return (default 50, max 200). |
| query | string | — | Substring to match against the URL or page title. Omit to list the most recent history. |
No output schema declared.
No examples provided.
safari_list_tabs Safari List Tabs ~28
Lists every open tab across all Safari windows with title, URL, and whether it is active.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | — | — |
| tabs | array | — | — |
No examples provided.
safari_navigate Safari Navigate ~50
Navigates Safari to a URL. Pass new_tab=true to open in a new tab.
| Name | Type | Req | Description |
|---|---|---|---|
| new_tab | boolean | — | — |
| url | string | yes | — |
| window_index | integer | — | — |
| Name | Type | Req | Description |
|---|---|---|---|
| navigated | boolean | — | — |
| new_tab | boolean | — | — |
| url | string | — | — |
No examples provided.
safari_query_selector_all Safari Query Selector All ~43
Runs document.querySelectorAll in the current Safari tab and returns a compact summary of each match.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | — | — |
| selector | string | yes | — |
| Name | Type | Req | Description |
|---|---|---|---|
| ok | boolean | — | — |
| result | object | — | — |
No examples provided.
safari_read_tab Safari Read Tab ~236
Reads the rendered text content of a Safari tab. Identify the tab either by `url_match` (substring match against URL; first hit wins) or by `window_index` + `tab_index` (from safari_list_tabs). Text is capped at `max_bytes` (default 100 KB). Pass `include_html: true` to also get the raw HTML source. Pass `include_links: true` to extract all links with their href and text (useful for following navigation in SPAs like dashboards).
| Name | Type | Req | Description |
|---|---|---|---|
| include_html | boolean | — | Also return the HTML source (default false) |
| include_links | boolean | — | Extract all links with href + visible text (default false). Great for navigating SPAs. |
| max_bytes | integer | — | Max bytes of text (and html) to return (default 102400) |
| tab_index | integer | — | Tab index from safari_list_tabs (default current tab of that window) |
| url_match | string | — | Substring to match against the tab URL. Takes precedence over indices. |
| window_index | integer | — | Window index from safari_list_tabs (default 0) |
| Name | Type | Req | Description |
|---|---|---|---|
| html | string | — | — |
| html_bytes | integer | — | — |
| html_truncated | boolean | — | — |
| link_count | integer | — | — |
| links | array | — | — |
| links_error | string | — | — |
| text | string | — | — |
| text_bytes | integer | — | — |
| title | string | — | — |
| truncated | boolean | — | — |
| url | string | — | — |
No examples provided.
safari_search_tabs Safari Search Tabs ~102
Searches the rendered text of every open Safari tab for a substring. Returns each matching tab with the surrounding snippet. Useful for 'do I have a tab open with X?' questions across dozens of tabs.
| Name | Type | Req | Description |
|---|---|---|---|
| context | integer | — | Characters of context around each match (default 120) |
| max_tabs | integer | — | Max tabs to scan (default 30). Higher = slower. |
| query | string | yes | Substring to search for (case-insensitive) |
| Name | Type | Req | Description |
|---|---|---|---|
| hits | array | — | — |
| query | string | — | — |
| scanned | integer | — | — |
No examples provided.
safari_setup_check Safari Setup Check ~43
Reports whether Safari is ready for interactive tools (safari_click, safari_type, safari_evaluate_js). Returns setup instructions if JavaScript from Apple Events is not enabled.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| instructions | string | — | — |
| ready_for_js_tools | boolean | — | — |
| tabs_open | integer | — | — |
No examples provided.
safari_type Safari Type ~47
Sets the value of an input/textarea matching a CSS selector and fires input/change events.
| Name | Type | Req | Description |
|---|---|---|---|
| clear | boolean | — | — |
| selector | string | yes | — |
| value | string | yes | — |
| Name | Type | Req | Description |
|---|---|---|---|
| ok | boolean | — | — |
| result | object | — | — |
No examples provided.
safari_wait_for Safari Wait For ~152
Polls the current Safari tab until a CSS `selector` appears, or until `text_match` appears (anywhere on the page, or inside `selector` if you also pass one). Pass at least one of `selector`/`text_match`. Useful after safari_click to wait for the next page or a modal to render.
| Name | Type | Req | Description |
|---|---|---|---|
| selector | string | — | CSS selector to wait for (optional if text_match is given) |
| text_match | string | — | Text to wait for. With `selector`, must appear inside that element; without it, anywhere on the page. |
| timeout_ms | integer | — | Max time to wait (default 10000 = 10s, max 30000) |
Structured output declared, but exposes no named fields.
No examples provided.
save_attachment Save Attachment ~93
Saves an attachment from an email to disk. Pass account= (and mailbox= if known, both from list_emails/search_emails) so the lookup targets one account instead of scanning all of them.
| Name | Type | Req | Description |
|---|---|---|---|
| account | string | — | — |
| attachment_name | string | yes | — |
| confirm | boolean | — | — |
| destination | string | — | — |
| mailbox | string | — | — |
| message_id | string | yes | — |
| Name | Type | Req | Description |
|---|---|---|---|
| attempts | integer | — | — |
| destination | string | — | — |
| name | string | — | — |
| saved | boolean | — | — |
No examples provided.
screen_record_start Screen Record Start ~132
Begins a screen recording (ScreenCaptureKit) of a display, window, or region. Single active session in v1 — a second start returns already_recording. Returns a session_id used by record_marker and screen_record_stop. Requires Screen Recording permission; without it returns an explicit permission_required error, never a silent no-op.
| Name | Type | Req | Description |
|---|---|---|---|
| fps | integer | — | Frames per second (default 60). |
| output_path | string | — | Where to write the .mov (default: temp file, returned by stop). |
| show_cursor | boolean | — | Default true. |
| target | object | yes | What to capture. |
No output schema declared.
No examples provided.
screen_record_status Screen Record Status ~39
Reports whether a recording is active, with the session_id, elapsed_ms, output path, and marker_count.
| Name | Type | Req | Description |
|---|---|---|---|
| session_id | string | — | — |
No output schema declared.
No examples provided.
screen_record_stop Screen Record Stop ~75
Stops the active recording, finalizes the .mov, and writes the marker timeline JSON (§6) next to it. Returns the video path, duration, resolution, marker_count and markers_path. Returns no_active_session if nothing is recording.
| Name | Type | Req | Description |
|---|---|---|---|
| session_id | string | — | Optional; the single active session is used if omitted. |
No output schema declared.
No examples provided.