MCP server for interacting with your LINE Official Account
Local Mcp is installed from its publisher's own source and answers where it runs, so this marketplace is not in the path of a single call. There is no address here to send one to, and a panel that pretended otherwise would be showing you an answer we made up. Install it and call it from your own client — the Installation tab has the entry for each one.
What it does
180 local tools from ChatGPT, Claude.ai & desktop AIs: Mail, iMessage, Teams, files. Local, free.
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user --transport http local-mcp-com-local-mcp https://local-mcp.com/mcp
# 2 — ask your agent for something these tools do
# setup_install, complete_omnifocus_task, complete_reminder and 197 more
Local Mcp costs nothing on mcprush: there is no plan to choose here, no cap to set and nothing mcprush can bill you for.
Collected from a public index. Nobody has claimed this account, so nothing here was written by its author — claim it if it is yours.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. Nothing here runs on your machine and nothing runs on ours: this server answers at its publisher’s own address, and what you install is the connection straight to it.
This is a public server: it answers at its publisher’s own address and this marketplace is not in the path. Claude Code registers it in one command; --scope user makes it available in every project. The transport below is http, read from the address; if the publisher says otherwise, swap that one word.
claude mcp add --scope user --transport http local-mcp-com-local-mcp https://local-mcp.com/mcpReconnect, or start a new session, and the tools appear in the model’s tool list.
One config entry pointing straight at the publisher’s own address — this marketplace is not in the path, and nothing from this listing executes on your machine.
200 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
Returns a personalized LMCP install link and setup steps (~30 sec to install). LMCP is a free Mac app that gives access to Mail, Calendar, Contacts, Teams, OneDrive, Notes, Reminders, and 100+ tools on the user's Mac (data stays local). A user would invoke this to install LMCP or reconnect it. Pass os ("macos", or windows/linux/ios/android). Optional: email, step, issue.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| os | string | yes | macos | windows | linux | ios | android. Cloud connectors must pass os (or server asks). Desktop terminal clients may omit → macOS. macOS and Windows both get real install steps. Linux/mobile → waitli |
| string | no | Optional. Helps Cloud Relay auto-connect after install. | |
| step | string | no | If stuck: connector | install | email | connecting_stuck | server_down. |
| issue | string | no | Optional tag: gatekeeper_error, dot_not_green, install_failed, etc. |
Marks an OmniFocus task as complete by task ID or name. Requires confirm=true.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| confirm | boolean | no | Must be true to complete; called without it, returns a preview. |
| task_id | string | no | Exact task id from list_omnifocus_tasks (preferred). Provide this OR task_name. |
| task_name | string | no | Task title to match when you don't have the id. |
Marks a reminder complete in Apple Reminders (Reminders.app). Requires confirm=true. For Microsoft To Do use todo_complete_task instead.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| confirm | boolean | no | Must be true to complete |
| reminder_id | string | yes | Reminder ID from list_reminders |
Adds Local MCP to the config of installed MCP-capable AI clients on this Mac (Claude Desktop, Claude Code, Cursor, Windsurf, VS Code, Zed) so they can use LMCP's tools — no manual JSON editing. Read-only PREVIEW unless confirm:true. Optionally pass a single client id to configure just that one. Returns which clients it set up, which already had Local MCP, which aren't installed, and the restart
| Parameter | Type | Required | Notes |
|---|---|---|---|
| client | string | no | Optional: configure only this client — one of claude, claude-code, cursor, windsurf, vscode, zed. Omit to do all installed ones. |
| confirm | boolean | no | Must be true to write the config. Without it, returns a preview of what would change. |
Connect your Microsoft 365 account. Call once to get a login code, then call again after you've authenticated at microsoft.com/devicelogin to confirm the connection.
No parameter schema on file.
Connect Todoist. For security your API token is entered directly in Local MCP's own settings window — never passed through the AI. Call this to get the instructions, or to check whether Todoist is already connected.
No parameter schema on file.
Creates an event in the Mac's Calendar app (Calendar.app). Requires title, start_date, end_date. Optionally invite attendees by email (CalDAV/Exchange calendars only), or make it a repeating event with recurrence (daily/weekly/monthly/yearly). For Microsoft 365 use m365_create_event instead.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| attendees | array | no | List of email addresses to invite (optional, CalDAV/Exchange only) |
| calendar | string | no | Calendar name to match (optional, alternative to calendar_id) |
| calendar_id | string | no | Calendar UUID from list_calendar_names (optional, defaults to default calendar) |
| confirm | boolean | no | Must be true to create the event |
| end_date | string | yes | ISO 8601 date or datetime, same timezone rules as start_date. For an all-day event pass a bare date (end is inclusive: same date as start = a one-day all-day event; a later date spans through that day |
| location | string | no | Location (optional) |
| notes | string | no | Event notes (optional) |
| recurrence | string | no | Make it a repeating event: 'daily', 'weekly', 'monthly', or 'yearly' (optional; omit for a one-time event). |
| recurrence_count | integer | no | Total number of occurrences (optional). Mutually exclusive with recurrence_until; if neither is given the event repeats indefinitely. |
| recurrence_interval | integer | no | Repeat every N periods (optional, default 1 — e.g. recurrence='weekly' + recurrence_interval=2 = every 2 weeks). |
| recurrence_until | string | no | ISO 8601 date the repetition stops on (optional; takes precedence over recurrence_count). |
| start_date | string | yes | ISO 8601 date or datetime. With a time (2026-06-27T09:00:00) the event is timed; a time with NO timezone is read in the Mac's LOCAL zone, append Z or an offset (2026-06-27T09:00:00Z, or +02:00) to pin |
| title | string | yes | Event title |
Saves an email to the Mail.app Drafts folder for the user to review and send manually — never sends. Composes a new draft (pass to/subject/body), or a reply draft (pass reply_to_message_id plus body). A reply draft's response includes threaded: true means the saved draft was read back and its headers reference the source message (it will appear inside the conversation); false means it
| Parameter | Type | Required | Notes |
|---|---|---|---|
| account | string | no | Account name (from list_email_accounts) whose Drafts folder receives the draft. Alternative to from. |
| attachments | string | no | Files to attach, as comma-separated absolute paths (e.g. a PDF). |
| bcc | string | no | BCC address(es), comma-separated. |
| body | string | no | Plain-text body of the draft. |
| cc | string | no | CC address(es), comma-separated. |
| confirm | boolean | no | Must be true to actually save the draft. Without it, returns a preview of the recipient/sender, subject, and that the body will be saved. |
| from | string | no | Sender address — on a multi-account Mac, selects which account's Drafts to use. Alternative to account. |
| html_body | string | no | HTML body of the draft. Takes precedence over body when both are given. |
| reply_all | boolean | no | For a reply draft, include all original recipients (reply-all) instead of just the sender. |
| reply_to_message_id | string | no | Message id (from list_emails/search_emails) to draft a reply to, instead of a new message. |
| subject | string | no | Subject line for a new draft. Ignored for reply drafts (they inherit the original subject). |
| to | string | no | Recipient address(es) for a new draft, comma-separated. Omit for a reply draft (uses reply_to_message_id). |
Creates a new mailbox folder in Mail.app.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| account | string | no | Account name (optional, uses default) |
| confirm | boolean | no | Must be true to create |
| name | string | yes | Folder name |
Creates a new note in Apple Notes. The body accepts Markdown (headings, bold/italic, bullet/numbered lists, links, inline code) — it's converted to Apple Notes' native formatting. Requires confirm=true to execute.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| body | string | yes | — |
| confirm | boolean | no | — |
| folder | string | no | — |
| name | string | yes | — |
Creates a new task in OmniFocus. Requires confirm=true to execute.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| confirm | boolean | no | Must be true to create; called without it, returns a preview. |
| defer_date | string | no | Defer/start date, ISO 8601 — the task stays hidden until then. |
| due_date | string | no | Due date, ISO 8601 (YYYY-MM-DD or full timestamp). |
| flagged | boolean | no | Create the task flagged. |
| name | string | yes | The task title. |
| note | string | no | Longer note/body for the task. |
| project | string | no | Project to file the task under (name). Omit for the inbox. |
Records referral invites for the colleagues a user chose to invite and returns a unique referral link per person, so the user can later see who installed or activated LMCP. It does not send anything itself — each returned link can be included in an email or message to that person. lang records the language the invite is written in (e.g. "es", "en").
| Parameter | Type | Required | Notes |
|---|---|---|---|
| lang | string | no | ISO language of the invite you're writing (the user's conversation language, e.g. 'es', 'en'). Defaults to the Mac's language. |
| recipients | array | yes | The picked recipients. |
Creates a reminder in Reminders.app.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| confirm | boolean | no | Must be true to create |
| due_date | string | no | ISO 8601 date (optional) |
| list_name | string | no | Reminder list name (optional) |
| notes | string | no | Notes (optional) |
| priority | string | no | Priority: none | low | medium | high (optional) |
| title | string | yes | Reminder title |
Creates a new list in Apple Reminders (Reminders.app). Requires confirm=true.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| confirm | boolean | no | Must be true to create |
| name | string | yes | Name for the new reminder list |
Returns a single morning briefing combining today's calendar events, overdue and due-today reminders, unread inbox email count + subjects, and — when a location is provided — today's weather. Perfect for starting each day: one call gives you everything on your plate.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| include_emails | boolean | no | Include unread email summary from Mail.app (default true, skipped gracefully if Mail is not running) |
| location | string | no | Optional city name or 'lat,lon' to include today's weather in the brief (e.g. 'London', 'San Francisco'). Omitted if not provided. |
Deletes an event from the Mac's Calendar app (Calendar.app) by ID. Requires confirm=true. For a repeating event, pass span='future' to delete the whole series (this and all following occurrences); the default deletes only the single occurrence. For Microsoft 365 use m365_delete_event instead.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| confirm | boolean | no | Must be true to delete |
| event_id | string | yes | Event identifier from list_calendar_events |
| span | string | no | For a recurring event: 'this' (default — only this occurrence) or 'future' (this and all following occurrences). Ignored for non-recurring events. |
Permanently deletes a reminder in Apple Reminders (Reminders.app) by ID. Get the reminder_id from list_reminders. Requires confirm=true.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| confirm | boolean | no | Must be true to delete |
| reminder_id | string | yes | Reminder identifier from list_reminders |
Deletes an Apple Reminders list AND all reminders inside it — cannot be undone. Pass the list name (or list_id from get_reminder_folders). Requires confirm=true.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| confirm | boolean | no | Must be true to delete |
| list_id | string | no | List identifier from get_reminder_folders (alternative to name) |
| name | string | no | List name to delete (or pass list_id) |
Disconnect your Microsoft 365 account and remove stored tokens.
No parameter schema on file.
Disconnect Todoist and remove the stored API token.
No parameter schema on file.
Creates a new Excel spreadsheet (.xlsx file) with headers and optional data rows.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| confirm | boolean | no | Must be true to create |
| headers | array | yes | Column headers |
| path | string | yes | Output path for the .xlsx file |
| rows | array | no | Array of row arrays with data (optional) |
Reads data from an Excel spreadsheet (.xlsx file). Returns the first row as headers and the remaining data rows as rows — mirroring excel_create's headers/rows params, so a read→create round-trip needs no manual row-0 handling.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| max_rows | integer | no | Max rows to return (default 100) |
| path | string | yes | Absolute path to the .xlsx file |
| sheet_name | string | no | Sheet name to read (optional, reads first sheet) |
Writes a value to a specific cell in an Excel file. Address the cell either with cell in A1 notation (e.g. "B2") or with row+column as 1-based integers.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| cell | string | no | Cell in A1 notation, e.g. "B2" (alternative to row+column) |
| column | integer | no | Column number (1-based) — use with row, or use cell instead |
| confirm | boolean | no | Must be true to modify |
| path | string | yes | Path to the .xlsx file |
| row | integer | no | Row number (1-based) — use with column, or use cell instead |
| sheet_name | string | no | Sheet name (default: first sheet) |
| value | string | yes | Value to write |
Lists files and folders in a local directory. Defaults to the user's home directory. Returns name, path, type (file/directory), size, and modification date for each item. Sorted: directories first, then files, both alphabetically.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| path | string | no | Absolute path to the directory. Defaults to the home directory (~) if omitted. |
| show_hidden | boolean | no | Include hidden files (starting with '.'). Default false. |
Reads a plain text file from the local filesystem by its absolute path — the primary, default tool for reading a local text file (use this unless the file is a PDF, Word, Excel, or PowerPoint document, which have their own readers). The path must be inside an allowed folder — the same allowlist as file_write (the home directory by default; extend via Settings → Advanced → Allowed folders). A path
| Parameter | Type | Required | Notes |
|---|---|---|---|
| max_bytes | integer | no | Maximum bytes to read (default 1 MB, max 10 MB) |
| offset | integer | no | Start reading at this byte offset (default 0) |
| path | string | yes | Absolute path to the file |
Searches for files and folders by name (case-insensitive, partial match) starting from a root directory. Defaults to the home directory. Returns matching items with path, type, and size.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| file_type | string | no | Filter by extension, e.g. 'pdf', 'docx', 'xlsx'. Omit for all types. |
| max_results | integer | no | Maximum number of results to return. Default 50, max 200. |
| query | string | yes | Filename pattern to search for (partial, case-insensitive) |
| root | string | no | Root directory to search from. Defaults to home directory (~). |
Writes text to a local file — create, overwrite, or append. For .txt/.md/.csv/.json/.log and any plain-text or code file. (For Word use word_create, Excel excel_create, PowerPoint ppt_create.) The path must be inside an allowed folder — the same allowlist as file_read (home directory by default; extend via Advanced Settings → Allowed folders). Overwriting an existing file requires confirm=true (th
| Parameter | Type | Required | Notes |
|---|---|---|---|
| append | boolean | no | Append to the end instead of overwriting (default false) |
| confirm | boolean | no | Required (true) to OVERWRITE an existing file. Not needed to create a new file or to append. |
| content | string | yes | Text content to write |
| path | string | yes | Absolute path to the file to write |
Lists files and folders in a directory (Spotlight-free). The path must be inside an allowed folder — the same allowlist as file_read/file_write (the home directory by default; extend via Settings → Advanced → Allowed folders). A path outside the allowlist returns an actionable 'access denied' naming the allowed folders.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Max items (default 100) |
| path | string | no | Absolute path to list (default: ~) |
Searches for files by name within the allowlist (uses mdfind/Spotlight). Scoped to the allowed folders — the home directory by default (extend via Settings → Advanced → Allowed folders); pass path= to search a specific allowed folder. A path outside the allowlist returns an actionable 'access denied'.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Max results (default 50) |
| path | string | no | Limit search to this directory (optional) |
| query | string | yes | Filename or content to search for |
Metadata for a file/folder in the synced Google Drive: size, dates, type. Cheaper than listing the whole directory.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| path | string | yes | Absolute path to the file or folder |
Lists files and folders in a Google Drive path (the locally-synced folder). Use gdrive_root first for valid roots — 'My Drive' and 'Shared drives' live inside each mount. Returns up to limit entries (default 1000).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Max entries (default 1000, max 5000) |
| path | string | yes | Absolute path to the Google Drive folder |
Reads a text file from the synced Google Drive folder (.txt, .md, .csv, .json, code files...). Note: native Google Docs/Sheets/Slides sync as .gdoc/.gsheet pointers, not real files — export them from Drive or read Office/PDF copies instead. Auto-detects UTF-8 with Latin-1/CP1252 fallback. For files outside Google Drive, use file_read.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| encoding | string | no | 'auto' (default), 'utf8', 'latin1', 'cp1252', 'ascii', 'utf16' |
| max_bytes | integer | no | Max bytes (default 1MB, cap 10MB) |
| offset | integer | no | Start byte offset (default 0) |
| path | string | yes | Absolute path to the file |
Lists the Google Drive folders synced on this Mac (My Drive, Shared drives, per-account mounts). Start here to get valid paths for the other gdrive_* tools. Reads the folder Google Drive for Desktop already syncs — no Google API, no OAuth.
No parameter schema on file.
Searches the synced Google Drive folder for files by name (recursive). Returns up to max_results matches (default 50).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| max_results | integer | no | Maximum results (default 50) |
| query | string | yes | Filename pattern to search for |
| root | string | no | Restrict to this Drive path (optional - defaults to all mounts) |
Writes or overwrites a text file in the synced Google Drive folder — it uploads automatically via the official client. First call returns a preview; pass confirm=true to write.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| confirm | boolean | no | Must be true to actually write |
| content | string | yes | Text content to write |
| path | string | yes | Absolute path under a Google Drive mount |
Returns recent LMCP tool call history from the local audit log. Each entry shows timestamp, tool name, call source (local/cloud), success status, and duration. Useful for GDPR Article 30 compliance reporting and debugging.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Number of recent entries to return (default 50, max 200) |
| ok | boolean | no | Filter to successes (true) or failures (false) only (optional) |
| tool | string | no | Filter to entries for a specific tool name (optional) |
Returns the current LMCP configuration (api_key masked).
No parameter schema on file.
Gets a contact from the Mac's Contacts app (Contacts.app) by name or ID. Pass name to look up directly by name (no need to search_contacts first — if several people match it returns a compact list to choose from), or contact_id for an exact lookup. For Microsoft 365 use m365_get_contact instead.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| contact_id | string | no | Exact identifier from list_contacts/search_contacts. Provide this OR name. |
| name | string | no | Full or partial contact name — the one-step path. Provide this OR contact_id. |
Get the current date and time of the machine where LMCP runs — with timezone and UTC offset. Call this whenever you need the real 'now' on the user's computer: before creating calendar events or reminders, resolving relative dates like 'today'/'tomorrow'/'next Friday', or timestamping. Takes no arguments.
No parameter schema on file.
Get detailed information about a specific person in your Microsoft 365 directory by their user ID or email address. Use 'me' to get the currently authenticated user's profile.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | User ID (GUID), email address (UPN), or 'me' for the authenticated user, e.g. 'sarah@contoso.com', 'a1b2c3d4-...', or 'me' |
Lists the lists (folders) in Apple Reminders (Reminders.app) on this Mac. For Microsoft To Do use todo_get_folders instead.
No parameter schema on file.
Gets the current weather and a short daily forecast for a location. Pass a city name ('London', 'San Francisco', 'Tokyo,JP') or 'lat,lon' coordinates. Uses Open-Meteo — no API key required. Location must be provided (there is no device-location access).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| days | integer | no | Number of forecast days, 1-7 (default 3) |
| location | string | yes | City name (e.g. 'London', 'Buenos Aires', 'Tokyo,JP') or 'lat,lon' coordinates (e.g. '40.71,-74.01') |
Lists Mail.app email accounts WITH each account's email addresses and type (imap/pop/iCloud). Slower — queries Mail directly. For just the account NAMES (to pass to list_emails(account=...)), prefer list_email_accounts: it's faster (cached, no Mail lock). Use list_accounts only when you specifically need the addresses or account type.
No parameter schema on file.
Lists events from the Mac's Calendar app (Calendar.app, local/iCloud calendars) in a date range, or reads ONE event in full via event_id. List entries preview notes (200 chars, notes_truncated flag) and cap attendees; pass event_id to get the complete notes and full roster. Defaults to today + 7 days. For a Microsoft 365 calendar use m365_list_events instead.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| calendar | string | no | Filter by calendar name — partial, case-insensitive (optional). To pick one of several same-titled calendars, qualify it as "Account/Calendar" (e.g. "Exchange/Calendario") using the source from list_c |
| calendar_id | string | no | Filter by a single calendar UUID from list_calendar_names (optional). |
| calendar_ids | array | no | Filter by multiple calendar UUIDs (optional). |
| end_date | string | no | ISO 8601 date (YYYY-MM-DD). Defaults to start_date + 7 days. |
| event_id | string | no | Read exactly ONE event by its id (from a previous list) with FULL notes and the complete attendee roster — required before editing notes of an event whose list entry says notes_truncated. When set, al |
| limit | integer | no | Max number of events to return (most recent first within the range). Optional; defaults to all in range. |
| start_date | string | no | ISO 8601 date (YYYY-MM-DD). Defaults to today. |
Lists the calendars in the Mac's Calendar app (Calendar.app, local/iCloud). For Microsoft 365 calendars use the m365 calendar tools instead.
No parameter schema on file.
Lists contacts from the macOS Contacts app. Optionally filter by group.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| group_name | string | no | Filter by group name (optional) |
| limit | integer | no | Max contacts to return (default 100) |
Lists connected displays with bounds (global space, top-left origin, points), backing scale_factor, and which is main. display_id is the CGDirectDisplayID — the SAME value list_windows reports for each window's display_id, so you can map a window to its display. Stable for the session. No permission required.
No parameter schema on file.
Lists all Mail.app account NAMES (fast — cached, no Mail lock). This is the preferred way to get account names: call it first to discover them, then use list_emails(account=name) to fetch messages from a specific account. If you also need each account's email addresses or type (imap/pop/iCloud), use list_accounts instead.
No parameter schema on file.
Lists the full folder (mailbox) tree for Apple Mail (Mail.app) accounts, including nested subfolders. Use this to discover the exact folder names that move_email(target_mailbox=...) and list_emails(mailbox=...) expect. Outlook.com, Exchange, Gmail, iCloud and IMAP accounts added to Mail.app are all included. For a Graph-only Microsoft 365 mailbox not added to Mail.app, use m365_list_emails instead
| Parameter | Type | Required | Notes |
|---|---|---|---|
| account | string | no | — |
| include_counts | boolean | no | — |
Use this when the user wants to see or triage their inbox on this Mac (Apple Mail — any account added to Mail.app: iCloud, Gmail, IMAP, Exchange). Lists email headers (subject, sender, date, unread); call read_email(message_id) for the full body. For a Microsoft 365 mailbox NOT added to Mail.app, use m365_list_emails. IMPORTANT: On machines with 3+ accounts, always pass account=<name> (from list_
| Parameter | Type | Required | Notes |
|---|---|---|---|
| account | string | no | — |
| limit | integer | no | — |
| mailbox | string | no | — |
| offset | integer | no | — |
| unread_only | boolean | no | — |
List the people most relevant to you in Microsoft 365 — based on your communication patterns, collaboration history, and org chart. Useful for meeting prep and contact enrichment.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Number of people to return (default 20, max 50) |
Lists recent iMessage / Messages.app conversations (chat id, name, service). Start here for Messages — the chat id it returns is what read_messages / search_messages / send_message need.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Max conversations (default 30) |
Returns the macOS privacy (TCC) permissions Local MCP needs that are NOT granted yet, each with a one-click open_url that opens the exact System Settings → Privacy & Security pane. Read-only and passive (never prompts). Use it during setup or before a workflow to tell the user precisely which "Allow" clicks remain (Calendar, Contacts, Reminders, Mail Automation, Full Disk Access, Screen Recordin
No parameter schema on file.
Lists notes from Apple Notes app. Optionally filter by folder. Paginated: limit is capped at 500 per call, so page with offset (offset=500 returns notes 501-1000) instead of asking for a bigger limit. The response carries total (how many notes match in all) and has_more (whether anything is left past this page), so you never have to guess whether you got everything — page until has_more
| Parameter | Type | Required | Notes |
|---|---|---|---|
| folder | string | no | — |
| limit | integer | no | Notes per page (default 50, capped at 500). To get more, page with offset. |
| offset | integer | no | How many notes to skip (default 0). offset=500 with limit=500 returns notes 501-1000. An offset past the end returns an empty page with has_more=false, not an error. |
| order | string | no | order: "modified" (default) sorts newest-modified first — what you want to SHOW someone, but NOT safe for paging: modification date changes, so a note edited between two calls jumps to the front and a |
Lists folders in OmniFocus. Folders group related projects (e.g. "Work", "Personal"). Use list_omnifocus_projects to see the projects inside them.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Max folders to return (default 100). |
Lists projects in OmniFocus. Start here for OmniFocus (alongside list_omnifocus_folders) — the project name it returns feeds list_omnifocus_tasks / create_omnifocus_task / search_omnifocus_tasks.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| include_completed | boolean | no | Include completed/dropped projects (default excludes them). |
| limit | integer | no | Max projects to return (default 100). |
Lists all tags defined in OmniFocus.
No parameter schema on file.
Lists tasks from OmniFocus. Filter by project, tag, inbox, due today, or flagged status.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| due_today | boolean | no | Only tasks due today or overdue. |
| flagged | boolean | no | Only flagged tasks. |
| inbox | boolean | no | Only unfiled inbox tasks. |
| include_completed | boolean | no | Include completed tasks (default excludes them). |
| limit | integer | no | Max tasks to return (default 50). |
| project | string | no | Only tasks in this project (name, case-insensitive). |
| tag | string | no | Only tasks carrying this tag. |
Returns the user's emailable contacts plus an invite template, for recommending LMCP to a colleague. A user would invoke this when they want to invite or recommend someone. Returns a list of candidate contacts and a message template; create_referral_invites then generates each chosen person's unique invite link.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Max contacts to return (default 60) |
Lists reminders from Apple Reminders (Reminders.app) on this Mac. Optionally filter by completion status or list name. For Microsoft To Do use todo_list_tasks instead.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| completed | boolean | no | false or omitted = incomplete (the default). true = completed. There is no 'both': ask twice if you need them. |
| limit | integer | no | Max number of reminders to return (earliest due first). Optional; defaults to all. |
| list_name | string | no | Filter by reminder list name (optional) |
Lists on-screen windows of any app with window_id, owning app bundle id + name, title, bounds (global space, top-left, points), display_id (the CGDirectDisplayID — matches list_displays, so you can look up which display a window is on), and is_focused. Window TITLES require Screen Recording permission — without it this returns an explicit permission_required error rather than a title-less result.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| app_bundle_id | string | no | Only return windows owned by this app bundle id. |
| on_screen_only | boolean | no | Only on-screen windows (default true). |
Checks for and installs a newer LMCP version — a self-upgrade of the LMCP app itself (not editing any of your data). Installing downloads the new version and RESTARTS LMCP (the AI client briefly reconnects), so it requires confirm=true. Pass check_only=true to only report whether a newer version is available, with no download or restart.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| check_only | boolean | no | If true, only report availability — no download, no install, no restart. |
| confirm | boolean | no | Must be true to actually install (which restarts LMCP). Without it, returns availability + a preview. |
Returns a structured snapshot of the LMCP environment: server/tray/teams-proxy versions, detected AI client, cloud relay state, TCC permission states (Calendar/Reminders/Contacts), and a compact summary of which services (Mail/Calendar/Contacts/Teams/OneDrive/Reminders/Notes) are reachable. Fast (<500ms), passive — never prompts the user, never opens app windows, never touches the network. Call th
No parameter schema on file.
Returns LMCP's self-upgrade health (the LMCP app upgrading itself, not editing your data): current version, the last N app-version upgrade attempts with any errors, whether the upgrade cache dir is writable, and any stale LMCP binaries at alternate paths. Call this when the app's auto-upgrade seems stuck, or to explain why a user is on an old version.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Max recent attempts to return (default 10) |
Create a calendar event in your Microsoft 365 / Outlook calendar.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| attendees | string | no | Comma-separated email addresses to invite (optional) |
| body | string | no | Event description (optional) |
| calendar | string | no | Calendar name to create the event in — partial, case-insensitive match (optional). Omit to use the primary calendar. |
| end | string | yes | End time in ISO 8601, e.g. '2026-05-20T11:00:00' |
| location | string | no | Location (optional) |
| start | string | yes | Start time in ISO 8601, e.g. '2026-05-20T10:00:00' |
| subject | string | yes | Event title |
| timezone | string | no | IANA timezone, e.g. 'America/New_York' (default: UTC) |
Delete a calendar event from your Microsoft 365 / Outlook calendar by its ID.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| confirm | boolean | yes | Set to true to confirm deletion (required) |
| id | string | yes | Event ID from m365_list_events |
Get full details of a specific Microsoft 365 contact by ID. Get the ID from m365_list_contacts or m365_search_contacts.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Contact ID from m365_list_contacts or m365_search_contacts |
List contacts from your Microsoft 365 / Outlook address book.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Max contacts to return (default 50, max 100) |
Use this when the user wants their Microsoft 365 / Outlook / Exchange inbox via the cloud — requires a connected M365 account (connect_m365_account). Returns subject, sender, date, and preview. For mail already in the Mac's Mail.app (including an Exchange account added there), use list_emails.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| folder | string | no | Folder name: inbox (default), sentitems, drafts, deleteditems |
| limit | integer | no | Number of emails to return (default 20, max 50) |
| unread_only | boolean | no | If true, return only unread emails |
List upcoming calendar events from your Microsoft 365 / Outlook calendar.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| calendar | string | no | Calendar name to filter by — partial, case-insensitive match (optional). Omit to use the primary calendar. |
| days | integer | no | Number of days ahead to look (default 7, max 30) |
| limit | integer | no | Max events to return (default 20, max 50) |
Use this when the user wants the full content of a Microsoft 365 email (message ID from m365_list_emails/m365_search_emails). Requires a connected M365 account. For a message found via list_emails/search_emails (Apple Mail), use read_email.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | The email message ID from m365_list_emails or m365_search_emails |
Use this when the user wants to reply to a Microsoft 365 email (message ID from m365_list_emails). Requires a connected M365 account. Shows a preview first — set confirm=true to actually send. For replying to a message found in Apple Mail, use reply_email.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| confirm | boolean | no | Set to true to actually send (default: shows preview only) |
| id | string | yes | Message ID to reply to (from m365_list_emails or m365_read_email) |
| message | string | yes | Your reply text |
| reply_all | boolean | no | If true, reply to all recipients (default: false) |
Search contacts in your Microsoft 365 address book by name, email, or company.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| query | string | yes | Search term — name, email, or company |
Use this when the user wants to find emails in their Microsoft 365 / Outlook mailbox via the cloud — requires a connected M365 account. By default searches sender, subject, AND body (Microsoft Graph's own $search default). Pass scope="metadata" to search only sender/subject (faster, no body scan), or scope="body" to search only the message body. For accounts added to the Mac's Mail.app, use search
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Max results (default 20, max 50) |
| query | string | yes | Search query, e.g. 'budget Q2', 'from:alice@contoso.com', 'subject:invoice' |
| scope | string | no | "all" (default — sender+subject+body, today's behavior), "metadata" (sender+subject only), or "body" (body only). |
Use this when the user wants to send from their Microsoft 365 / Outlook account via the cloud — requires a connected M365 account. Shows a preview first — set confirm=true to actually send. For sending from an account configured in the Mac's Mail.app, use send_email.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| body | string | yes | Email body (plain text) |
| cc | string | no | CC recipients (optional, comma-separated) |
| confirm | boolean | no | Set to true to actually send (default: shows preview only) |
| subject | string | yes | Email subject |
| to | string | yes | Recipient email address. For multiple, separate with commas. |
Reports duration_ms, width, height, fps, whether it has audio, and file size for a video/audio file. Call it before editing to reason about the footage (compute trim ranges, pick a reframe crop). No permission required.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| path | string | yes | Path to the media file. |
Moves an email to another mailbox (nested target folders are found by name). Pass account= (returned by list_emails/search_emails) so the message lookup targets one account instead of scanning all of them — without it, multi-account Macs are slow and can time out on bulk moves. If you know the folder the message is in, also pass mailbox= (the mailbox field from the listing) so the lookup searche
| Parameter | Type | Required | Notes |
|---|---|---|---|
| account | string | no | — |
| confirm | boolean | no | — |
| mailbox | string | no | — |
| message_id | string | yes | — |
| target_mailbox | string | yes | — |
Run a diagnostic check on NordVPN: installation, login state, connection status, kill switch, and supported protocols. Useful for troubleshooting.
No parameter schema on file.
Get recommended NordVPN servers by country or specialty. Uses NordVPN public API (no account needed). Returns server name, hostname, country, city, load %, and supported technologies.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| country | string | no | Country name or 2-letter code (e.g. 'US', 'United States', 'JP'). Omit for auto-recommendation. |
| limit | integer | no | Number of servers to return (1-10). Default: 5. |
| type | string | no | Server type filter: 'standard', 'p2p', 'double_vpn', 'onion', 'dedicated_ip'. Default: standard. |
Check NordVPN connection status: connected/disconnected, auto-connect, snooze, and last known location. Does NOT open NordVPN.
No parameter schema on file.
Lists Notion databases cached on this Mac with their schema (column names and types). Use notion_read_database to get the rows.
No parameter schema on file.
Lists Notion pages cached on this Mac (titles, last edited, hierarchy), newest first. Reads the Notion desktop app's local cache — no Notion API, no integration token. Note: only pages visited in Notion (or marked Available offline) are cached.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Max pages (default 50, max 500) |
Lists the Notion workspaces cached on this Mac with their members (names and emails). Start here for Notion — its output feeds notion_list_databases / notion_list_pages / notion_search.
No parameter schema on file.
Opens a Notion page in the desktop app (deep link). Accepts a page id or title. Useful to let the user view or edit a page, or to pull an uncached page into the local cache.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| page | string | yes | Page id (UUID) or title (partial, case-insensitive) |
Reads the cached rows of a Notion database with their properties mapped through the schema. Accepts the database id or name (partial match). Only locally-cached rows are returned.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| database | string | yes | Database id (UUID) or name (partial, case-insensitive) |
| limit | integer | no | Max rows (default 50, max 500) |
Reads a Notion page from the local cache and returns its content as markdown (headings, lists, to-dos, code, files, subpage links). Accepts a page id or a title (partial match). If parts of the page aren't cached yet, says so — open the page in Notion or mark it Available offline for full content.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| max_blocks | integer | no | Max blocks to render (default 300, max 1000) |
| page | string | yes | Page id (UUID) or title (partial, case-insensitive) |
Searches cached Notion content (page titles and block text) for a phrase, case-insensitive. Returns matching blocks with the page they belong to. Only locally-cached content is searched — pages never opened in Notion won't match.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Max results (default 20, max 100) |
| query | string | yes | Text to search for |
Deletes a file or empty folder from OneDrive.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| confirm | boolean | no | Must be true to delete |
| path | string | yes | Absolute path to the file or folder |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| path | string | yes | Absolute path to the file or folder |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | 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 |
Moves or renames a file/folder within OneDrive.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| confirm | boolean | no | Must be true to move |
| destination | string | yes | Destination path |
| source | string | yes | Source path |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| encoding | string | no | Force a specific encoding: 'auto' (default), 'utf8', 'latin1', 'cp1252', 'ascii', 'utf16' |
| max_bytes | integer | no | Maximum bytes to read (default 1048576 = 1 MB, capped at 10485760 = 10 MB) |
| offset | integer | no | Start reading at byte offset (default 0) |
| path | string | yes | Absolute path to the file |
Lists all mounted OneDrive directories on this Mac. Start here for OneDrive — the mount paths it returns are what the other onedrive_* tools (onedrive_list_files, onedrive_read_file, onedrive_search_files) need.
No parameter schema on file.
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| max_results | integer | no | Maximum results (default 50) |
| query | string | yes | Filename pattern to search for |
| root | string | no | Root OneDrive path to search in (optional) |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| confirm | boolean | no | Must be true to apply |
| folder | string | no | 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') |
Writes text content to a file in OneDrive.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| confirm | boolean | no | Must be true to write |
| content | string | yes | Text content to write |
| path | string | yes | Absolute path to the file in OneDrive |
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.
No parameter schema on file.
Reads and extracts text from a PDF document (.pdf file).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| max_pages | integer | no | Max pages to extract (default: all) |
| path | string | yes | Absolute path to the PDF file |
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.
No parameter schema on file.
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 {creat
| Parameter | Type | Required | Notes |
|---|---|---|---|
| confirm | boolean | no | Must be true to create |
| path | string | yes | Output path for the .pptx file |
| slides | array | yes | Array of {title, bullets:[]} slide objects |
Reads slide text content from a PowerPoint presentation (.pptx file).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| path | string | yes | Absolute path to the .pptx file |
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 — concurre
| Parameter | Type | Required | Notes |
|---|---|---|---|
| account | string | no | — |
| force_download | boolean | no | — |
| include_body | boolean | no | — |
| mailbox | string | no | — |
| max_body_chars | integer | no | — |
| message_id | string | yes | — |
Reads messages from an iMessage conversation by chat ID or contact name.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| chat_id | string | no | Chat identifier from list_message_chats |
| contact_name | string | no | Contact name substring (alternative to chat_id) |
| limit | integer | no | Max messages (default 50) |
Reads the full content of a note by name or ID.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| note_id | string | no | — |
| note_name | string | no | — |
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).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| confirm | boolean | no | Must be true to actually delete. Without it, returns a preview. |
| name | string | yes | Recipe name (from recipe_list). |
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).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| category | string | no | Optional filter hint shown to the user; the catalog is small so all skills are returned. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Name of the saved skill to export (see recipe_list). |
Returns the full manifest of a recipe by name. recipe_not_found if unknown.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | — |
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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| skill | string | no | A skill_token from recipe_export, or a raw recipe manifest JSON string. |
| skill_token | string | no | Alias for skill — the exact field name recipe_export returns. |
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}.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | integer | yes | The community skill id from recipe_discover. |
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.
No parameter schema on file.
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| confirm | boolean | no | Set true to execute a recipe that has state-changing steps; read-only recipes ignore it. |
| name | string | yes | — |
| params | object | no | Param overrides (merged over the recipe defaults). |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Max runs to return (default 20). |
| name | string | no | Recipe name; omit for runs across all recipes. |
| run_id | string | no | Return this one run in full detail (requires name). |
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 manifes
| Parameter | Type | Required | Notes |
|---|---|---|---|
| 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), "out |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| bounds | object | no | Optional {x,y,w,h} global points to zoom toward. |
| name | string | yes | Marker name, e.g. open_tray, act2_calendar_create. |
| note | string | no | Free text → caption source. |
| session_id | string | no | — |
Renames an existing Apple Reminders list. Pass the current list name (or list_id from get_reminder_folders) and new_name. Requires confirm=true.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| confirm | boolean | no | Must be true to apply |
| list_id | string | no | List identifier from get_reminder_folders (alternative to name) |
| name | string | no | Current list name (or pass list_id) |
| new_name | string | yes | New name for the list |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| account | string | no | Account (from the listing) the message is in — pass it to skip scanning other accounts and avoid multi-account timeouts. |
| body | string | no | Plain-text reply body. |
| confirm | boolean | no | Consent gate: the first call previews the reply; call again with confirm=true to actually SEND it. |
| html_body | string | no | HTML reply body. Takes precedence over body when both are given. |
| message_id | string | yes | Id of the message to reply to (from list_emails/search_emails). |
| reply_all | boolean | no | Reply to all original recipients instead of just the sender. |
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)
| Parameter | Type | Required | Notes |
|---|---|---|---|
| attempt_count | integer | no | How many times this was attempted (optional). |
| error_category | string | no | Category of what went wrong (optional). |
| friction_type | string | yes | What kind of friction you observed. |
| tool_attempted | string | no | Name of the LMCP tool involved (e.g. list_emails). Optional. |
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, permission status, and recent tool names / error-type codes — never arguments, messages or persona
| Parameter | Type | Required | Notes |
|---|---|---|---|
| confirm | boolean | no | Must be true to submit the report. Without it, shows a preview. |
| description | string | no | Required for type=feature or integration: what the user wants. |
| error_message | string | no | For type=problem: verbatim error string from the failed tool. |
| expected | string | no | What you or the user expected to happen. |
| report_type | string | no | 'problem' (default) | 'feature' | 'integration' |
| symptom | string | no | Required for type=problem: what is broken, in your own words. |
| tool_attempted | string | no | For type=problem: name of the LMCP tool that failed. |
| user_request | string | no | What the user originally asked the AI to do. |
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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| confirm | boolean | no | 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. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| focus | string | no | Integration to focus on: calendar, mail, contacts, reminders, omnifocus, outlook, notes, finder, onedrive, screen_recording, accessibility. Leave empty to check all. |
| submit | boolean | no | Send the diagnostic report to the LMCP team for analysis (default: false) |
Saves an attachment from an email to disk. Requires confirm=true; without it you get a preview of where the file would be written. Pass account= (and mailbox= if known, both from list_emails/search_emails) so the lookup targets one account instead of scanning all of them.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| account | string | no | — |
| attachment_name | string | yes | — |
| confirm | boolean | no | — |
| destination | string | no | — |
| mailbox | string | no | — |
| message_id | string | yes | — |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| fps | integer | no | Frames per second (default 60). |
| output_path | string | no | Where to write the .mov (default: temp file, returned by stop). Missing parent folders are created. |
| show_cursor | boolean | no | Default true. |
| target | object | yes | What to capture. |
Reports whether a recording is active, with the session_id, elapsed_ms, output path, and marker_count.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| session_id | string | no | — |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| session_id | string | no | Optional; the single active session is used if omitted. |
Captures a single frame of a display, window, or region to a PNG. Requires Screen Recording permission; without it returns an explicit permission_required, never a blank image.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| output_path | string | no | Where to write the PNG (default: temp file). Missing parent folders are created. |
| target | object | yes | — |
Searches the Mac's Contacts app (Contacts.app, local/iCloud) by name, email, or phone number. For a Microsoft 365 directory use m365_search_contacts or search_m365_directory instead.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Max results (default 50) |
| query | string | yes | Name, email, or phone to search for |
Use this when the user wants to find specific emails on this Mac (Apple Mail — any account added to Mail.app). Searches subject and sender by default; pass scope="body" or scope="all" to also search the message body (see search_coverage in the response — a body search can be partial while its local index is still building). For a Microsoft 365 mailbox NOT added to Mail.app, use m365_search_emails.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| account | string | no | — |
| limit | integer | no | — |
| mailbox | string | no | — |
| query | string | yes | — |
| scope | string | no | "metadata" (default, subject+sender — fast, unchanged behavior), "body" (message body only, via a local index — see search_coverage in the response), or "all" (subject+sender+body). |
Search your organization's Microsoft 365 directory for users by name or email. Returns matching users with their title, department, and contact info.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Max results (default 10, max 25) |
| query | string | yes | Name or email to search for, e.g. 'Sarah' or 'sarah@contoso.com' |
Searches iMessage conversations by content, sender name, or date range.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| from_sender | string | no | Substring of sender name/handle to filter by (optional) |
| limit | integer | no | Max results (default 30) |
| query | string | no | Text to search for in message content (optional if from_sender is set) |
| since | string | no | ISO8601 date — only return messages on or after this date (optional, e.g. '2026-04-10' or '2026-04-10T00:00:00Z') |
| until | string | no | ISO8601 date — only return messages on or before this date (optional). Combine with 'since' to search a date range with no text query. |
Searches Apple Notes by title or content. Paginated: limit is capped at 100 per call, so page with offset instead of asking for a bigger limit. The response carries total (how many notes match the query in all) and has_more, so a capped page is never mistaken for the complete answer — page until has_more is false, which is exact even when total_is_estimated says the count is only a lo
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Matches per page (default 20, capped at 100). To get more, page with offset. |
| offset | integer | no | How many matches to skip (default 0). An offset past the end returns an empty page with has_more=false, not an error. |
| order | string | no | order: "modified" (default) sorts newest-modified first — what you want to SHOW someone, but NOT safe for paging: modification date changes, so a note edited between two calls jumps to the front and a |
| query | string | yes | — |
Searches OmniFocus tasks by name or note content.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Max matches to return (default 30). |
| query | string | yes | Text to match against task names and notes (case-insensitive). |
Use this when the user wants to send an email from an account configured in the Mac's Apple Mail. Composes and sends via Mail.app; supports plain text or HTML body. For sending from a Microsoft 365 account NOT added to Mail.app, use m365_send_email. Pass from to send from a specific configured Mail.app account instead of the default sender. Pass attachments as a comma-separated list of absolut
| Parameter | Type | Required | Notes |
|---|---|---|---|
| attachments | string | no | Files to attach, as comma-separated absolute paths (e.g. a PDF). |
| bcc | string | no | BCC address(es), comma-separated. |
| body | string | no | Plain-text body. Use this OR html_body; if both are given, html_body wins. |
| cc | string | no | CC address(es), comma-separated. |
| confirm | boolean | no | Safety gate: the call only PREVIEWS (nothing is sent) unless confirm:true. Set true to actually send. |
| from | string | no | Sender address — on a multi-account Mac, selects which configured Mail.app account sends. Omit to use Mail's default account. |
| html_body | string | no | HTML body. Takes precedence over body when both are set. |
| subject | string | yes | Subject line. |
| to | string | yes | Recipient address(es), comma-separated for multiple. |
Sends an iMessage via the Mac's Messages.app to a recipient handle (phone number with country code, e.g. +14155551234, or an Apple ID email). This is a write operation: the first call (without confirm) returns a preview; call again with confirm=true to actually send. Direct (1:1) iMessage only — sending into an existing group chat isn't supported yet. Requires Messages.app signed in to iMessage +
| Parameter | Type | Required | Notes |
|---|---|---|---|
| confirm | boolean | no | Set true to actually send. Without it, returns a preview only. |
| text | string | yes | Message body to send. |
| to | string | yes | Recipient handle: phone number with country code (+14155551234) or Apple ID email. |
Composes a Signal message and returns step-by-step guidance for the user to send it themselves. This tool does NOT send: Signal Desktop exposes no local send API and LMCP reads its database read-only, so it cannot transmit Signal messages. Call it when the user wants to message someone on Signal — it drafts the text and tells them how to deliver it. First call (show_send_steps=false or omitted) re
| Parameter | Type | Required | Notes |
|---|---|---|---|
| chat_id | string | yes | Chat ID from signal_list_chats |
| show_send_steps | boolean | no | Set true to get the send-it-yourself steps. Default: preview only. |
| text | string | yes | Plain-text message body |
Connect Signal to Local MCP. Reports whether Signal Desktop is installed and signed in, and tells you exactly what to do next — install Signal, or open it and link your phone. (Signal links inside its own desktop app, so the QR is shown there, not here.) Once you're signed in, signal_list_chats / signal_read_messages work. If Signal is already connected, it just reports that.
No parameter schema on file.
Lists Signal conversations (chats) with last-active timestamps. Reads from the local Signal Desktop database — no network access required. Returns chat IDs, contact names, and type (direct or group). Use the chat_id in subsequent signal_read_messages calls.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Max chats to return (default 50) |
Reads messages from a specific Signal chat. The chat_id must come from a previous signal_list_chats call. Returns messages in chronological order with sender phone numbers and body text. Only messages cached locally by Signal Desktop are available.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| chat_id | string | yes | Chat ID from signal_list_chats |
| limit | integer | no | Max messages to return (default 50) |
Full-text search across locally-cached Signal messages. Only messages Signal Desktop has stored on disk are searched — no network access required. Optionally restrict search to a specific chat_id.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| chat_id | string | no | Optional chat ID to restrict search |
| limit | integer | no | Max results to return (default 50) |
| query | string | yes | Search text (case-insensitive substring match) |
Lists channels in a Slack workspace, including public channels, private channels, and direct messages (DMs). Reads from the local IndexedDB cache — only channels that Slack Desktop has synced to disk are returned. Pass workspace_id from slack_list_workspaces to filter to a specific workspace.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Max channels to return (default 200) |
| workspace_id | string | no | Workspace ID from slack_list_workspaces (optional — omit to list channels across all workspaces) |
Lists the Slack workspaces (teams) the user has connected in Slack Desktop. Start here for Slack — the workspace id it returns is what slack_list_channels / slack_read_channel_messages / slack_search_messages need. Reads from the local IndexedDB cache — no token needed. Only workspaces that have been synced to disk are returned.
No parameter schema on file.
Reads recent messages from a Slack channel or DM. Reads from the local IndexedDB cache — only messages that Slack Desktop has synced to disk are available (typically the last few hundred messages for active channels). channel_id must come from slack_list_channels.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| channel_id | string | yes | Channel ID from slack_list_channels |
| limit | integer | no | Max messages to return (default 50) |
Searches Slack messages across locally-cached channels using full-text substring matching. Only messages that Slack Desktop has synced to disk are searched — this is not the Slack cloud search API. Optionally restrict search to a specific channel_id.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| channel_id | string | no | Optional channel ID to restrict search |
| limit | integer | no | Max results to return (default 50) |
| query | string | yes | Search text (case-insensitive substring match) |
Gets historical price data for a stock symbol. Range: 1d, 5d, 1mo, 3mo, 6mo, 1y, 2y, 5y, 10y, ytd, max.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| interval | string | no | Data interval (default: 1d). Intraday (1m–90m) needs a short range. |
| range | string | no | Time range (default: 1mo) |
| symbol | string | yes | Ticker symbol, e.g. AAPL |
Gets current stock price and market data for one or more symbols (e.g. AAPL, MSFT, BTC-USD). Uses Yahoo Finance — no API key required.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| symbols | string | yes | Ticker symbols, comma-separated ('AAPL,MSFT,GOOGL') or a JSON array (['AAPL','MSFT']) |
Searches for a stock ticker symbol by company name (e.g. "Apple" → AAPL). Start here for Stocks — the symbol it returns is what stocks_get_quote / stocks_get_chart need.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Max results (default 10) |
| query | string | yes | Company name or partial ticker to search for |
Shows or submits the short in-product survey Local MCP assigned to this machine. Called with NO arguments it returns the pending survey and, in clients that support MCP Apps, renders it as an interactive card the user answers directly — prefer this. To submit conversational answers instead, pass answers keyed by each question's id (single/scale = one value, multiple = an array of values): call
| Parameter | Type | Required | Notes |
|---|---|---|---|
| answers | object | no | Answers keyed by question id. Single/scale = a value; multiple = an array. |
| confirm | boolean | no | Set true to actually record the answers. Omit/false = preview only (nothing is stored). |
Skips the short in-product survey Local MCP showed the user, for now — use this when the user doesn't want to answer right now. They won't be asked again this session.
No parameter schema on file.
Reads Microsoft Teams call & meeting history from the Mac's local Teams cache — no Graph API, no token, no admin consent (the same local store the Teams Calls tab renders). Each call includes direction (incoming/outgoing/missed), participants (names + ids), start / answered / end times, duration, call type (1:1/group/meeting) and a stable call id. Optional since/until (YYYY-MM-DD) narrow the range
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Max calls to return (default 50), newest first |
| since | string | no | Only calls on/after this date, YYYY-MM-DD (optional) |
| until | string | no | Only calls on/before this date, YYYY-MM-DD (optional) |
Lists channels in a Microsoft Teams workspace. Returns channels that are cached in the local Teams client. If the result is empty, the channels have not been loaded into the local cache yet — ask the user to open Microsoft Teams and browse to the team's channels, then try again.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| team_id | string | yes | Team ID from teams_list_teams |
Lists Microsoft Teams chats (direct messages and group chats).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Max chats to return (default 50) |
Lists all the Microsoft Teams the user belongs to. Start here for Teams channels — the team id it returns feeds teams_list_channels / teams_read_channel_messages. (For 1:1 and group chats, list_message-style, use teams_list_chats.)
No parameter schema on file.
Reads messages from a Microsoft Teams channel.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| channel_id | string | yes | Channel ID from teams_list_channels |
| limit | integer | no | Max messages (default 50) |
| team_id | string | yes | Team ID |
Reads messages from a Teams chat or direct message thread.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| chat_id | string | yes | Chat ID from teams_list_chats |
| limit | integer | no | Max messages (default 50) |
Searches your Microsoft Teams chat and direct-message history (all conversations at once) by text, sender name, and/or date range. Use this to find where something was discussed in Teams without knowing which chat. Returns matching messages with the chat they came from. Provide at least one of query, from_sender, since, until.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| from_sender | string | no | Filter to a sender by display-name substring (optional) |
| limit | integer | no | Max results, newest first (default 50, max 200) |
| query | string | no | Text to find in message bodies (case-insensitive substring) |
| since | string | no | Only messages on/after this date, YYYY-MM-DD (optional) |
| until | string | no | Only messages on/before this date, YYYY-MM-DD (optional) |
Sends a text message to a Microsoft Teams channel via Graph API. Requires connect_m365_account with Chat.ReadWrite / ChannelMessage.Send permissions. team_id and channel_id must come from teams_list_teams / teams_list_channels. First call returns a preview; set confirm=true to send.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| channel_id | string | yes | Channel ID from teams_list_channels, or the channel's name |
| confirm | boolean | no | Set true to send; false returns preview |
| team_id | string | yes | Team ID from teams_list_teams, or the team's name |
| text | string | yes | Plain-text message body |
Sends a text message to a Microsoft Teams chat or channel. Requires Microsoft Teams to be running and signed in (token is read fresh from Teams' local cookies on each call). The chat_id MUST come from a previous teams_list_chats call — never fabricate ids. This is a write operation: the first call returns a preview, the second call (with confirm=true) actually sends. sent:true means the message wa
| Parameter | Type | Required | Notes |
|---|---|---|---|
| chat_id | string | yes | Thread id from teams_list_chats (e.g. '19:<uuid>_<uuid>@unq.gbl.spaces' for 1:1, '19:<uuid>@thread.tacv2' for group) |
| confirm | boolean | no | Must be true to actually send. Without it, returns a preview without making any network call. |
| text | string | yes | Plain-text message body. Max 28000 chars. No formatting / mentions / attachments in v1. |
Marks a Microsoft To Do task as complete (via Reminders sync).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| confirm | boolean | no | Must be true to complete |
| list | string | no | List name to narrow search by title (optional) |
| task_id | string | no | Task ID from todo_list_tasks |
| title | string | no | Task title (partial match, alternative to task_id) |
Creates a task in Microsoft To Do (via Reminders sync). Task appears in To Do automatically once synced.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| confirm | boolean | no | Must be true to create |
| due_date | string | no | Due date (YYYY-MM-DD, optional) |
| list | string | no | List name (from todo_get_folders). Defaults to first available list. |
| notes | string | no | Task notes (optional) |
| priority | integer | no | Priority: 1=high, 5=medium, 9=low (optional) |
| title | string | yes | Task title |
Lists Microsoft To Do task lists. Requires Microsoft account in Reminders sync (System Settings → Internet Accounts → Microsoft Exchange → enable Reminders).
No parameter schema on file.
Lists tasks from a Microsoft To Do list (or any Reminders list). Syncs via macOS Reminders.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| include_completed | boolean | no | Include completed tasks (default false) |
| limit | integer | no | Max tasks to return (default 50) |
| list | string | no | List name (from todo_get_folders). Leave empty to show all. |
Mark a Todoist task complete (closes it). Pass the task_id from todoist_list_tasks.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| task_id | string | yes | The task id to complete |
Create a Todoist task. Optionally set a project, a natural-language due date (due_string, e.g. 'tomorrow 5pm', 'every monday'), and priority (1=normal … 4=urgent).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| content | string | yes | The task text |
| due_string | string | no | Natural-language due date, e.g. 'tomorrow 5pm', 'next monday' |
| priority | integer | no | 1 (normal) to 4 (urgent). Todoist UI p1 = 4. |
| project_id | string | no | Project to add it to (default: Inbox) |
List your Todoist projects (id + name). Use a project's id to scope todoist_list_tasks or todoist_create_task.
No parameter schema on file.
List active (incomplete) Todoist tasks. Optionally scope to a project_id, or pass a Todoist filter (e.g. 'today', 'overdue', '#Work & p1').
| Parameter | Type | Required | Notes |
|---|---|---|---|
| filter | string | no | A Todoist filter query, e.g. 'today', 'overdue', 'p1' |
| limit | integer | no | Max results (default 50, max 200) |
| project_id | string | no | Only tasks in this project (from todoist_list_projects) |
Clicks an element (by element_ref, at its center) or a screen coordinate (by coords). button left|right, count 2 = double-click. Returns {clicked, at:{x,y}} — clicked means the click event was POSTED at those coordinates, NOT that the app acted on it: CGEvent carries no delivery confirmation, so a busy, modal or input-ignoring app reports exactly the same success. Confirm the effect with ui_wait
| Parameter | Type | Required | Notes |
|---|---|---|---|
| button | string | no | Default left. |
| by | string | no | Default element if element_ref given, else coords. |
| coords | object | no | {x,y} in global screen points. |
| count | integer | no | 1 (default) or 2 for double-click. |
| element_ref | string | no | — |
GUI automation — control a native app's interface. Finds an element (button, field, menu…) in an app's accessibility tree by role and/or label. Scope with app_bundle_id or window_id. Returns an opaque element_ref (usable by ui_click / ui_get_element this session) plus role, label, bounds, enabled, focused. found=false when the app is reachable but no element matches; app_not_found is an explicit e
| Parameter | Type | Required | Notes |
|---|---|---|---|
| app_bundle_id | string | no | Scope the search to this app. |
| index | integer | no | Which match to return if several (default 0). |
| label | string | no | AX title/description to match. |
| match | string | no | Default contains. |
| role | string | no | AX role, e.g. AXButton, AXMenuItem, AXTextField. |
| window_id | string | no | Alternatively scope by a window_id from list_windows. |
Re-resolves a previously returned element_ref (its bounds/state may have changed). Returns role, label, bounds, enabled, focused, value. stale_element if the handle is unknown or the element no longer exists.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| element_ref | string | yes | — |
Sends a key combination, e.g. "cmd+shift+5", "return", "cmd+,", "escape". Modifiers: cmd, shift, alt/option, ctrl, fn. The last token is the key. unknown_key if the key isn't recognized. Requires Accessibility permission.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| keys | string | yes | e.g. cmd+shift+5, return, cmd+, |
Clicks a status-bar (menu bar extra / NSStatusItem) item and optionally follows a nested menu path. Best-effort via the app's AX extras menu bar; apps that render fully custom (non-AX) menus may not be reachable (fall back to ui_click at known coords). Requires Accessibility permission.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| app_bundle_id | string | no | Owner of the status item. |
| label | string | no | Status item / menu item title. |
| path | array | no | Nested menu path, e.g. ["App","Settings…"]. |
Returns a COMPACT accessibility tree of a running native app's labeled + interactive elements (buttons, links, text fields, checkboxes, menus…) — the native equivalent of web_read's a11y mode. Use it to DISCOVER what to act on in an unfamiliar app when you don't already know an element's role/label (ui_find_element needs one up front). Each interactive node carries a ref you can pass straight to
| Parameter | Type | Required | Notes |
|---|---|---|---|
| app_bundle_id | string | no | Bundle id of a RUNNING app (e.g. com.apple.finder) |
| include_menu_bar | boolean | no | Include the app's macOS menu bar (hundreds of menu-item nodes). Default false. |
| max_depth | integer | no | Max tree depth to descend (default 12, max 20) |
| window_id | string | no | Alternative to app_bundle_id: a window id from list_windows (targets that window's app) |
Types text into the focused control (or focuses element_ref first, then types). Sends real key events so validation/handlers fire. Requires Accessibility permission.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| element_ref | string | no | Optional; focus this element first. |
| text | string | yes | The text to type. |
Deterministic synchronization — replaces all sleeps. Polls for an element until it reaches state (present|enabled|focused|absent) or times out. A timeout is an EXPLICIT error, never a false success. Returns {satisfied, waited_ms, element_ref?, bounds?}.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| app_bundle_id | string | no | — |
| label | string | no | — |
| match | string | no | — |
| poll_ms | integer | no | Default 150. |
| role | string | no | — |
| state | string | no | Default present. |
| timeout_ms | integer | no | Default 5000. |
| window_id | string | no | — |
Updates an existing event in the Mac's Calendar app (Calendar.app) by ID. Pass only the fields you want to change — unspecified fields are left as-is. Get the event_id from list_calendar_events. For Microsoft 365 use the m365 calendar tools instead.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| confirm | boolean | no | Must be true to apply changes |
| end_date | string | no | New end datetime ISO 8601 (optional). Same timezone rules as start_date. |
| event_id | string | yes | Event identifier from list_calendar_events |
| location | string | no | New location — pass empty string to clear (optional) |
| notes | string | no | New notes — pass empty string to clear (optional) |
| span | string | no | For recurring events: 'this' (default) or 'future' |
| start_date | string | no | New start datetime ISO 8601 (optional). No timezone = Mac's local time; append Z/offset to pin the zone. |
| title | string | no | New title (optional) |
Updates an existing note in Apple Notes. Change the title and/or body (the body accepts Markdown, converted to Apple Notes' native formatting). Find note_id with list_notes or search_notes. Requires confirm=true.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| body | string | no | — |
| confirm | boolean | no | — |
| note_id | string | no | — |
| note_name | string | no | — |
| title | string | no | — |
Updates an existing reminder in Reminders.app. Change the title, due date, notes, priority, or move it to another list (list_name). Get reminder_id from list_reminders. Requires confirm=true.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| confirm | boolean | no | Must be true to apply changes |
| due_date | string | no | New ISO 8601 due date. Pass empty string to clear (optional) |
| list_name | string | no | Move the reminder to this list (a name from get_reminder_folders) (optional). Moving to a list in ANOTHER account recreates the reminder and CHANGES its id — read the new one from reminder_id in the r |
| notes | string | no | New notes text (optional) |
| priority | string | no | Priority: none | low | medium | high (optional) |
| reminder_id | string | yes | Reminder identifier from list_reminders |
| title | string | no | New title (optional) |
Pixelates/blurs one or more rectangles over the video — the tool for redacting PII (an email pane, a name) before publishing a screen recording. Rects are in source pixels, top-left origin: [{x,y,w,h, start_ms?, end_ms?}] — omit the times to cover the whole clip. Great with a marker timeline's bounds. Returns the output path.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| input | string | yes | Path to the source video file. |
| output | string | no | Default: <input>_blurred.mov. Missing parent folders are created. |
| regions | array | yes | [{x,y,w,h, start_ms?, end_ms?}] in source pixels (top-left). |
Stitches multiple videos end-to-end, in order, into one NEW file (e.g. assemble separate acts). All inputs should share a resolution for a clean result. Returns the output path + duration.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| inputs | array | yes | Ordered list of video file paths. |
| output | string | no | Output path (default: <first-input>_joined.mov). Missing parent folders are created. |
Exports a video (or a [start_ms,end_ms] slice of it) to an optimized looping GIF — for README/social. fps (default 12) and width (default 640, height auto) control size. Returns the output path, frame count, and size.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| end_ms | integer | no | Slice end (default: end of video). |
| fps | integer | no | Frames per second in the GIF (default 12). |
| input | string | yes | Path to the source video. |
| output | string | no | Output path (default: <input>.gif). Missing parent folders are created. |
| start_ms | integer | no | Slice start (default 0). |
| width | integer | no | Output width in px, height scales to keep aspect (default 640). |
Crops a video to a target aspect ratio (e.g. "9:16" vertical, "1:1" square, "4:5") around a focus point — for social clips. Takes the LARGEST crop of that aspect that fits, centered on focus (x,y in source pixels, top-left origin; default = center) and clamped to the frame. Audio passes through. Returns the output path + new dimensions.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| aspect | string | yes | Target aspect "W:H", e.g. 9:16, 1:1, 4:5, 16:9. |
| focus | object | no | {x,y} center of interest in source pixels (top-left). Default: frame center. |
| input | string | yes | Path to the source video file. |
| output | string | no | Default: <input>_<aspect>.mov. Missing parent folders are created. |
Trims a video to one or more time ranges (milliseconds), concatenated in order into a NEW file — e.g. keep [{start_ms:0,end_ms:6000},{start_ms:126000,end_ms:223000}] to drop a dead segment. Audio is carried along. Returns the output path + duration. Never overwrites the input in place.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| input | string | yes | Path to the source video. |
| output | string | no | Output path (default: <input>_trimmed.mov). Missing parent folders are created. |
| ranges | array | yes | Ordered [{start_ms, end_ms}] to keep. |
Clicks an element on the current page. target is a CSS selector or visible text (resolved fresh each call). Clicks that SUBMIT a form preview first — call again with confirm:true to execute; plain links/buttons click directly. Returns the resulting URL/title.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| confirm | boolean | no | Required (true) to perform a click that submits a form. |
| session | string | no | Session name (default 'default'). |
| target | string | yes | CSS selector or visible text of the element to click. |
Scrapes structured data from the current page. Pass selectors = an object mapping field names to CSS selectors (e.g. {"title":"h1","price":".price"}); returns each field's first-match text/href, null when absent.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| selectors | object | yes | Field name → CSS selector map. |
| session | string | no | Session name (default 'default'). |
Finds elements on the current page of a web session so you can decide what to click or type into. query is a CSS selector OR visible text to match. Returns up to 30 matches with tag/text/name/type/href — never a silent empty.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| query | string | yes | A CSS selector (e.g. 'input[name=q]') or visible text (e.g. 'Sign in'). |
| session | string | no | Session name (default 'default'). |
Opens a real browser window on the Mac for the user to sign into a website themselves (you never handle their password). After they log in, the session is saved on this Mac and reused by web_navigate/web_read/web_screenshot — they won't need to log in again. Use a stable session name per site (e.g. 'linkedin'). NOTE: automating sites like Instagram/LinkedIn may violate their terms — the user acc
| Parameter | Type | Required | Notes |
|---|---|---|---|
| session | string | no | A stable name for this login profile, e.g. 'linkedin'. |
| url | string | yes | The site's login URL to open, e.g. https://www.linkedin.com/login |
Navigates a web session to a URL (using its saved login if any) and returns the resulting URL + page title. Opens the session if it doesn't exist. CHECK loaded before reading: when it is false the page did not load and message says why — reading the session then describes a blank document, not the site. Read the page with web_read.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| session | string | no | Session name (default 'default'). |
| timeout_seconds | integer | no | Max seconds to wait for load (default 25). |
| url | string | yes | URL to open (https). |
Reads the current page of a web session so you can reason over it. mode='text' (visible text, default), 'a11y' (compact accessible tree of links/buttons/fields — best for deciding what to click), or 'html' (raw DOM). Returns an explicit no_session error if the session isn't open, and no_page if it hasn't loaded a page — never a silent empty.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| mode | string | no | What to return (default text). |
| session | string | no | Session name (default 'default'). |
Captures a PNG screenshot of the current page of a web session (returned inline so web AIs can see it). Useful to ground what the page looks like before acting.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| session | string | no | Session name (a named login profile, e.g. 'linkedin'). Defaults to 'default'. |
Closes a web-automation session's window and frees it. The saved login stays on disk, so web_login/web_navigate can reopen it later without signing in again.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| session | string | no | Session name (a named login profile, e.g. 'linkedin'). Defaults to 'default'. |
Lists your web-automation login profiles: every SAVED login (persisted on disk, so web_login/web_navigate can reopen it without signing in again) plus which are currently OPEN. Each entry has saved (a persisted profile exists) and open (its window is live now, with url + title). Use it to check whether a login a recipe needs already exists before running it, instead of opening it and failing.
No parameter schema on file.
Brings a web session's browser window to the FRONT so the USER can take over directly — solve a CAPTCHA, complete 2FA, or make a choice the AI shouldn't. Local MCP never solves CAPTCHAs itself; this hands control to the user. Pair with web_screenshot first to show them what's on the page. After they finish, tell the agent to continue — the session keeps its state.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| reason | string | no | Short reason shown to the user, e.g. 'a CAPTCHA appeared' or 'confirm which account'. |
| session | string | no | Session name (default 'default'). |
Types text into a form field (input/textarea) on the current page. target is a CSS selector or the field's visible label/placeholder. Does NOT submit — use web_click on the submit button afterwards (that step is gated). SPECIAL CASE — file inputs: if target resolves to an <input type="file">, text is instead treated as a LOCAL FILE PATH on this Mac and the file is attached (JS can't set a fi
| Parameter | Type | Required | Notes |
|---|---|---|---|
| session | string | no | Session name (default 'default'). |
| target | string | yes | CSS selector or visible label/placeholder of the field. |
| text | string | yes | The text to type. For an input[type=file], this is instead the LOCAL FILE PATH to upload. |
Waits (polls, not a fixed sleep) until an element appears on the page, or times out. Use for SPA pages that hydrate after load. Prefer selector (a CSS selector, e.g. "input[name=password]"). condition also accepts the form "document.querySelector('...')"; any OTHER JavaScript condition runs arbitrary code on the page (same power as web_eval) and is disabled when LMCP is in read-only mode. Retu
| Parameter | Type | Required | Notes |
|---|---|---|---|
| condition | string | no | Alternative to selector: "document.querySelector('...')" is accepted as-is; any other JS expression runs arbitrary code on the page (same power as web_eval). |
| selector | string | no | CSS selector to wait for (preferred; treated as data, never executed). e.g. .feed |
| session | string | no | Session name (default 'default'). |
| timeout_seconds | integer | no | Max seconds to wait (default 15). |
Brings a window (by window_id from list_windows) to the front and activates its app. window_not_found if it can't be resolved. Requires Accessibility permission.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| window_id | string | yes | — |
Pins a window (by window_id) to fixed bounds {x,y,w,h} in global points, so every take is framed identically across runs. Returns the actual post-constraint bounds. Requires Accessibility permission.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| bounds | object | yes | {x,y,w,h} global points. |
| window_id | string | yes | — |
Appends text to the end of an existing Word (.docx) document at path, preserving the document's existing content and formatting. Requires confirm=true — called without it, returns a preview instead of modifying the file. Same file-access rules as word_create (Desktop/Documents/Downloads may need a Files-and-Folders grant). Returns {appended, chars_appended, path}. To create a new document use wo
| Parameter | Type | Required | Notes |
|---|---|---|---|
| confirm | boolean | no | Must be true to modify |
| content | string | yes | Text to append |
| path | string | yes | Path to the existing .docx file |
Creates a new Word (.docx) document at path with the given text content (and an optional title rendered as the heading). Requires confirm=true — called without it, returns a preview of what will be written instead of creating 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 → Fi
| Parameter | Type | Required | Notes |
|---|---|---|---|
| confirm | boolean | no | Must be true to create |
| content | string | yes | Document text content |
| path | string | yes | Output path for the .docx file |
| title | string | no | Document title (optional) |
Reads text content from a Word document (.docx file).
No parameter schema on file.
Lists Zoom meeting recordings saved locally on this Mac (~/Documents/Zoom), newest first: meeting name, date, and which artifacts exist (transcript, captions, saved chat, audio, video). Local recordings only — no Zoom API, no admin approval. Use zoom_read_transcript to read the text of a meeting.
No parameter schema on file.
Reads the text artifacts of a local Zoom recording: the transcript/captions (.vtt or closed_caption.txt, cleaned to readable 'Speaker: text' lines) and the saved in-meeting chat. Pass the recording name or path from zoom_list_recordings. Perfect for 'summarize my last meeting' or 'what did we agree on in the kickoff call'.
No parameter schema on file.
- Every tool — any call limit is its publisher’s, not ours
- No card, and mcprush charges nothing for it
- Runs at its publisher’s own address — this marketplace is not in the path
- Nothing to cap, because mcprush bills nothing
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
Nothing here is billable: mcprush charges nothing to install Local Mcp or to call it, at any volume.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
This listing is an address its publisher runs, and you connect to it directly — this marketplace is not in the path. The scanner reads packages and public source, and an address is neither. So there is no grade — not a withheld one, an unmeasured one.
Release history
No release history has been published for this listing yet.
This listing has published no versions to the marketplace yet.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish Local Mcp can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.