Install LMCP — free Mac app giving the user access to Mail, Calendar, Contacts, Teams, OneDrive, Notes, Reminders, and 100+ tools on their Mac (data stays local). Call this NOW to show their personalized install link (~30 sec). Pass os="macos" unless they said otherwise (windows/linux/ios/android). Optional: email, step, issue.
Parameters (4)
osstringrequired
macos | windows | linux | ios | android. Cloud connectors must pass os (or server asks). Desktop terminal clients may omit → macOS. Windows/Linux/mobile → waitlist (macOS-only today).
emailstring
Optional. Helps Cloud Relay auto-connect after install.
Optional tag: gatekeeper_error, dot_not_green, install_failed, etc.
chrome_click
Clicks the first element matching a CSS selector in the current Google Chrome tab. Returns the tag name and visible text of the clicked element so you can confirm the right thing was hit. Pass `wait_for_navigation: true` to wait up to 3 seconds for the page to load after the click.
Parameters (3)
nthinteger
Which match to click if there are several (0-based, default 0)
Wait up to 3s for page load after click (default false)
chrome_evaluate_js
Runs arbitrary JavaScript in the current Google Chrome tab and returns its result. Requires 'Allow JavaScript from Apple Events' in Chrome's View → Developer menu.
Parameters (1)
scriptstringrequired
chrome_fill_form
Fills multiple form fields in one shot in the current Google Chrome tab. Pass fields as a JSON object mapping CSS selector to value.
Parameters (1)
fieldsstringrequired
chrome_go_back
Navigates the current Google Chrome tab back to the previous page.
Parameters (1)
window_indexinteger
chrome_list_tabs
Lists every open tab across all Google Chrome windows with title, URL, and whether it is active.
No parameters.
chrome_navigate
Navigates Google Chrome to a URL. Pass new_tab=true to open in a new tab.
Parameters (3)
new_tabboolean
urlstringrequired
window_indexinteger
chrome_query_selector_all
Runs document.querySelectorAll in the current Google Chrome tab and returns a compact summary of each match.
Parameters (2)
limitinteger
selectorstringrequired
chrome_read_tab
Reads the rendered text content of a Google Chrome tab. Identify the tab either by `url_match` (substring match against URL; first hit wins) or by `window_index` + `tab_index` (from chrome_list_tabs). Text is capped at `max_bytes` (default 100 KB). Pass `include_html: true` to also get the raw HTML source. Pass `include_links: true` to extract all links with their href and text. Requires 'Allow JavaScript from Apple Events' (Chrome → View → Developer); run chrome_setup_check if reads come back empty.
Parameters (6)
include_htmlboolean
Also return the HTML source (default false)
include_linksboolean
Extract all links with href + visible text (default false). Great for navigating SPAs.
max_bytesinteger
Max bytes of text (and html) to return (default 102400)
tab_indexinteger
Tab index from chrome_list_tabs (default active tab of that window)
url_matchstring
Substring to match against the tab URL. Takes precedence over indices.
window_indexinteger
Window index from chrome_list_tabs (default 0)
chrome_search_tabs
Searches the rendered text of every open Google Chrome tab for a substring. Returns each matching tab with the surrounding snippet. Useful for 'do I have a tab open with X?' across many tabs. Requires 'Allow JavaScript from Apple Events' (Chrome → View → Developer).
Parameters (3)
contextinteger
Characters of context around each match (default 120)
max_tabsinteger
Max tabs to scan (default 30). Higher = slower.
querystringrequired
Substring to search for (case-insensitive)
chrome_setup_check
Reports whether Google Chrome is ready for interactive tools (chrome_click, chrome_type, chrome_evaluate_js, chrome_read_tab text). Returns setup instructions if JavaScript from Apple Events is not enabled.
No parameters.
chrome_type
Sets the value of an input/textarea matching a CSS selector in the current Google Chrome tab and fires input/change events.
Parameters (3)
clearboolean
selectorstringrequired
valuestringrequired
chrome_wait_for
Polls the current Google Chrome tab until a CSS selector appears (or its text matches, if `text_match` is provided). Useful after chrome_click to wait for the next page or a modal to render.
Parameters (3)
selectorstringrequired
CSS selector to wait for
text_matchstring
Optional substring that must appear inside the matched element
timeout_msinteger
Max time to wait (default 10000 = 10s, max 30000)
complete_omnifocus_task
Marks an OmniFocus task as complete by task ID or name. Requires confirm=true.
Parameters (3)
confirmboolean
task_idstring
task_namestring
complete_reminder
Marks a reminder complete in Apple Reminders (Reminders.app). Requires confirm=true. For Microsoft To Do use todo_complete_task instead.
Parameters (2)
confirmboolean
Must be true to complete
reminder_idstringrequired
Reminder ID from list_reminders
connect_m365_account
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 parameters.
connect_servicenow
Connect to your ServiceNow instance using your username and password. Credentials are stored locally and never sent to Claude's servers.
Parameters (3)
instancestringrequired
Your ServiceNow instance hostname, e.g. 'mycompany.service-now.com' or just 'mycompany'
passwordstringrequired
Your ServiceNow password
usernamestringrequired
Your ServiceNow username
create_calendar_event
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). For Microsoft 365 use m365_create_event instead.
Parameters (9)
attendeesarray
List of email addresses to invite (optional, CalDAV/Exchange only)
calendarstring
Calendar name to match (optional, alternative to calendar_id)
calendar_idstring
Calendar UUID from list_calendar_names (optional, defaults to default calendar)
confirmboolean
Must be true to create the event
end_datestringrequired
ISO 8601 datetime
locationstring
Location (optional)
notesstring
Event notes (optional)
start_datestringrequired
ISO 8601 datetime (YYYY-MM-DDTHH:MM:SS)
titlestringrequired
Event title
create_draft
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`). On a multi-account Mac, pass `account` (an account name from list_email_accounts) or `from` (a sender address) to place the draft in that account's Drafts; otherwise it lands in the default account. Use this for the cautious user who wants AI-composed mail but insists on sending it themselves.
Parameters (10)
accountstring
bccstring
bodystring
ccstring
fromstring
html_bodystring
reply_allboolean
reply_to_message_idstring
subjectstring
tostring
create_email_folder
Creates a new mailbox folder in Mail.app.
Parameters (3)
accountstring
Account name (optional, uses default)
confirmboolean
Must be true to create
namestringrequired
Folder name
create_note
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.
Parameters (4)
bodystringrequired
confirmboolean
folderstring
namestringrequired
create_omnifocus_task
Creates a new task in OmniFocus. Requires confirm=true to execute.
Parameters (7)
confirmboolean
defer_datestring
due_datestring
flaggedboolean
namestringrequired
notestring
projectstring
create_referral_invites
Step 2 of the colleague-invite flow. Given the recipients the user PICKED, records each invite and returns a UNIQUE referral link per person (so the user can later see who installed/activated). Call this AFTER the user chooses, then put each returned link into that person's email and send via send_email. Does NOT send anything itself. Pass `lang` = the language you're actually writing the invite in (the user's conversation language, e.g. "es", "en") — it's recorded with the invite.
Parameters (2)
langstring
ISO language of the invite you're writing (the user's conversation language, e.g. 'es', 'en'). Defaults to the Mac's language.
recipientsarrayrequired
The picked recipients.
create_reminder
Creates a reminder in Reminders.app.
Parameters (6)
confirmboolean
Must be true to create
due_datestring
ISO 8601 date (optional)
list_namestring
Reminder list name (optional)
notesstring
Notes (optional)
prioritystring
Priority: none | low | medium | high (optional)
titlestringrequired
Reminder title
create_reminder_list
Creates a new list in Apple Reminders (Reminders.app). Requires confirm=true.
Parameters (2)
confirmboolean
Must be true to create
namestringrequired
Name for the new reminder list
daily_brief
Returns a single morning briefing combining today's calendar events, overdue and due-today reminders, and unread inbox email count + subjects. Perfect for starting each day: one call gives you everything on your plate.
Parameters (1)
include_emailsboolean
Include unread email summary from Mail.app (default true, skipped gracefully if Mail is not running)
delete_calendar_event
Deletes an event from the Mac's Calendar app (Calendar.app) by ID. Requires confirm=true. For Microsoft 365 use m365_delete_event instead.
Parameters (2)
confirmboolean
Must be true to delete
event_idstringrequired
Event identifier from list_events
delete_reminder
Permanently deletes a reminder in Apple Reminders (Reminders.app) by ID. Get the reminder_id from list_reminders. Requires confirm=true.
Parameters (2)
confirmboolean
Must be true to delete
reminder_idstringrequired
Reminder identifier from list_reminders
delete_reminder_list
Deletes an Apple Reminders list AND all reminders inside it — cannot be undone. Pass the list name (or list_id from list_reminder_lists). Requires confirm=true.
Parameters (3)
confirmboolean
Must be true to delete
list_idstring
List identifier from list_reminder_lists (alternative to name)
namestring
List name to delete (or pass list_id)
disconnect_m365_account
Disconnect your Microsoft 365 account and remove stored tokens.
No parameters.
disconnect_servicenow
Disconnect from ServiceNow and remove stored credentials.
No parameters.
excel_create
Creates a new Excel (.xlsx) file with headers and optional data rows.
Parameters (4)
confirmboolean
Must be true to create
headersarrayrequired
Column headers
pathstringrequired
Output path for the .xlsx file
rowsarray
Array of row arrays with data (optional)
excel_read
Reads data from an Excel (.xlsx) file. Returns sheets and cell values.
Parameters (3)
max_rowsinteger
Max rows to return (default 100)
pathstringrequired
Absolute path to the .xlsx file
sheet_namestring
Sheet name to read (optional, reads first sheet)
excel_write_cell
Writes a value to a specific cell in an Excel file.
Parameters (6)
columnintegerrequired
Column number (1-based)
confirmboolean
Must be true to modify
pathstringrequired
Path to the .xlsx file
rowintegerrequired
Row number (1-based)
sheet_namestring
Sheet name (default: first sheet)
valuestringrequired
Value to write
finder_list
Lists files and folders at any absolute path (Spotlight-free directory listing, including outside the home folder). For sandboxed reads under the user's home, prefer fs_list.
Parameters (2)
limitinteger
Max items (default 100)
pathstring
Absolute path to list (default: ~)
finder_search
Searches for files by name anywhere on the filesystem (uses mdfind/Spotlight).
Parameters (3)
limitinteger
Max results (default 50)
pathstring
Limit search to this directory (optional)
querystringrequired
Filename or content to search for
fs_list
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.
Parameters (2)
pathstring
Absolute path to the directory. Defaults to the home directory (~) if omitted.
show_hiddenboolean
Include hidden files (starting with '.'). Default false.
fs_read
Reads a text file from the local filesystem. Supports .txt, .md, .csv, .json, .xml, .log, .yaml, .toml and common code file types. For PDFs use pdf_read, for Word use word_read, for Excel use excel_read.
Parameters (3)
max_bytesinteger
Maximum bytes to read (default 1 MB, max 10 MB)
offsetinteger
Start reading at this byte offset (default 0)
pathstringrequired
Absolute path to the file
fs_search
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.
Parameters (4)
file_typestring
Filter by extension, e.g. 'pdf', 'docx', 'xlsx'. Omit for all types.
max_resultsinteger
Maximum number of results to return. Default 50, max 200.
querystringrequired
Filename pattern to search for (partial, case-insensitive)
rootstring
Root directory to search from. Defaults to home directory (~).
gdrive_file_info
Metadata for a file/folder in the synced Google Drive: size, dates, type. Cheaper than listing the whole directory.
Parameters (1)
pathstringrequired
Absolute path to the file or folder
gdrive_list_files
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).
Parameters (2)
limitinteger
Max entries (default 1000, max 5000)
pathstringrequired
Absolute path to the Google Drive folder
gdrive_read_file
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.
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 parameters.
gdrive_search_files
Searches the synced Google Drive folder for files by name (recursive). Returns up to max_results matches (default 50).
Parameters (3)
max_resultsinteger
Maximum results (default 50)
querystringrequired
Filename pattern to search for
rootstring
Restrict to this Drive path (optional - defaults to all mounts)
gdrive_write_file
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.
Parameters (3)
confirmboolean
Must be true to actually write
contentstringrequired
Text content to write
pathstringrequired
Absolute path under a Google Drive mount
get_audit_log
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.
Parameters (3)
limitinteger
Number of recent entries to return (default 50, max 200)
okboolean
Filter to successes (true) or failures (false) only (optional)
toolstring
Filter to entries for a specific tool name (optional)
get_config
Returns the current LMCP configuration (api_key masked).
No parameters.
get_contact
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.
Parameters (2)
contact_idstring
Exact identifier from list_contacts/search_contacts. Provide this OR name.
namestring
Full or partial contact name — the one-step path. Provide this OR contact_id.
get_datetime
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 parameters.
get_m365_person
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.
Parameters (1)
idstringrequired
User ID (GUID), email address (UPN), or 'me' for the authenticated user, e.g. 'sarah@contoso.com', 'a1b2c3d4-...', or 'me'
list_accounts
Lists email accounts configured in Mail.app.
No parameters.
list_calendar_events
Lists events from the Mac's Calendar app (Calendar.app, local/iCloud calendars) in a date range. Defaults to today + 7 days. For a Microsoft 365 calendar use m365_list_events instead.
Parameters (6)
calendarstring
Filter by calendar name — partial, case-insensitive match (optional). Use list_calendar_names to see available names.
calendar_idstring
Filter by a single calendar UUID from list_calendar_names (optional).
calendar_idsarray
Filter by multiple calendar UUIDs (optional).
end_datestring
ISO 8601 date (YYYY-MM-DD). Defaults to start_date + 7 days.
limitinteger
Max number of events to return (most recent first within the range). Optional; defaults to all in range.
start_datestring
ISO 8601 date (YYYY-MM-DD). Defaults to today.
list_calendar_names
Lists the calendars in the Mac's Calendar app (Calendar.app, local/iCloud). For Microsoft 365 calendars use the m365 calendar tools instead.
No parameters.
list_contacts
Lists contacts from the macOS Contacts app. Optionally filter by group.
Parameters (2)
group_namestring
Filter by group name (optional)
limitinteger
Max contacts to return (default 100)
list_email_accounts
Lists all Mail.app accounts by name. Call this first to discover account names, then use list_emails(account=name) to fetch messages from a specific account. Much faster than querying all accounts at once.
No parameters.
list_email_folders
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.
Pass account=<name> (from list_email_accounts) to enumerate one account fully; without it, every account is walked which can be slow on macOS 15+. Message counts are off by default (slow on IMAP) — pass include_counts=true to add unread/total per folder.
Parameters (2)
accountstring
include_countsboolean
list_emails
Lists email headers (subject, sender, date, unread) from the Mac's Apple Mail (Mail.app, local accounts). For a Microsoft 365 / Outlook mailbox use m365_list_emails instead. Returns headers only — call read_email(message_id) to get the full body.
IMPORTANT: On machines with 3+ accounts, always pass account=<name> (from list_email_accounts) to avoid timeouts. Without account, all accounts are scanned which can be slow on macOS 15+.
Supports pagination: use offset to page through results (e.g. offset=20 for page 2 with limit=20). The limit parameter is capped at 50 per call (default 20); to read more, page with offset rather than requesting a larger limit.
Parameters (5)
accountstring
limitinteger
mailboxstring
offsetinteger
unread_onlyboolean
list_m365_people_insights
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.
Parameters (1)
limitinteger
Number of people to return (default 20, max 50)
list_message_chats
Lists recent iMessage/Messages.app conversations.
Parameters (1)
limitinteger
Max conversations (default 30)
list_notes
Lists notes from Apple Notes app. Optionally filter by folder.
Parameters (2)
folderstring
limitinteger
list_omnifocus_folders
Lists folders in OmniFocus. Folders group related projects (e.g. "Work", "Personal"). Use list_omnifocus_projects to see the projects inside them.
Parameters (1)
limitinteger
list_omnifocus_projects
Lists projects in OmniFocus.
Parameters (2)
include_completedboolean
limitinteger
list_omnifocus_tags
Lists all tags defined in OmniFocus.
No parameters.
list_omnifocus_tasks
Lists tasks from OmniFocus. Filter by project, tag, inbox, due today, or flagged status.
Parameters (7)
due_todayboolean
flaggedboolean
inboxboolean
include_completedboolean
limitinteger
projectstring
tagstring
list_referral_candidates
Step 1 of recommending LMCP to a colleague. Returns the user's emailable contacts plus a playful invite template. Use this when the user wants to invite/recommend someone. Then: show a few candidates, let the user PICK (never email everyone), call create_referral_invites for the chosen ones to get each person's unique link, draft a short personalized message IN THE USER'S LANGUAGE (keep the warm-but-sarcastic tone, adapt per person), show it for EDITS, then send with send_email (one per recipient — send_email asks the user to confirm). Never send without the user picking + approving.
Parameters (1)
limitinteger
Max contacts to return (default 60)
list_reminder_lists
Lists the lists (folders) in Apple Reminders (Reminders.app) on this Mac. For Microsoft To Do use todo_list_lists instead.
No parameters.
list_reminders
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.
Max number of reminders to return (earliest due first). Optional; defaults to all.
list_namestring
Filter by reminder list name (optional)
list_safari_bookmarks
Lists Safari bookmarks (title + URL) from the Mac's Safari (reads ~/Library/Safari/Bookmarks.plist — needs Full Disk Access).
Parameters (1)
limitinteger
Max bookmarks to return (default 100)
lmcp_state
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 this when you need to verify the environment is healthy before attempting a tool, or to understand what's installed and accessible. For reporting failures, use `report_problem` instead — it captures this same snapshot plus logs and submits to the team.
No parameters.
lmcp_welcome
Returns a live snapshot of what LMCP can currently see on this Mac: today's calendar events, due reminders, total contacts, and unread emails. Use this to show new users what LMCP has access to and suggest first steps. Only available before the first real tool call — call it immediately when the user first opens a chat.
No parameters.
m365_create_event
Create a calendar event in your Microsoft 365 / Outlook calendar.
Parameters (8)
attendeesstring
Comma-separated email addresses to invite (optional)
bodystring
Event description (optional)
calendarstring
Calendar name to create the event in — partial, case-insensitive match (optional). Omit to use the primary calendar.
endstringrequired
End time in ISO 8601, e.g. '2026-05-20T11:00:00'
locationstring
Location (optional)
startstringrequired
Start time in ISO 8601, e.g. '2026-05-20T10:00:00'
subjectstringrequired
Event title
timezonestring
IANA timezone, e.g. 'America/New_York' (default: UTC)
m365_delete_event
Delete a calendar event from your Microsoft 365 / Outlook calendar by its ID.
Parameters (2)
confirmbooleanrequired
Set to true to confirm deletion (required)
idstringrequired
Event ID from m365_list_events
m365_get_contact
Get full details of a specific Microsoft 365 contact by ID. Get the ID from m365_list_contacts or m365_search_contacts.
Parameters (1)
idstringrequired
Contact ID from m365_list_contacts or m365_search_contacts
m365_list_contacts
List contacts from your Microsoft 365 / Outlook address book.
Parameters (1)
limitinteger
Max contacts to return (default 50, max 100)
m365_list_emails
List emails from your Microsoft 365 / Outlook inbox. Returns subject, sender, date, and preview.
List upcoming calendar events from your Microsoft 365 / Outlook calendar.
Parameters (3)
calendarstring
Calendar name to filter by — partial, case-insensitive match (optional). Omit to use the primary calendar.
daysinteger
Number of days ahead to look (default 7, max 30)
limitinteger
Max events to return (default 20, max 50)
m365_read_email
Read the full content of a specific Microsoft 365 email by its ID.
Parameters (1)
idstringrequired
The email message ID from m365_list_emails or m365_search_emails
m365_reply_email
Reply to a Microsoft 365 email by its message ID. Shows a preview first — set confirm=true to actually send.
Parameters (4)
confirmboolean
Set to true to actually send (default: shows preview only)
idstringrequired
Message ID to reply to (from m365_list_emails or m365_read_email)
messagestringrequired
Your reply text
reply_allboolean
If true, reply to all recipients (default: false)
m365_search_contacts
Search contacts in your Microsoft 365 address book by name, email, or company.
Parameters (1)
querystringrequired
Search term — name, email, or company
m365_search_emails
Search your Microsoft 365 emails by keyword, sender, or subject.
Parameters (2)
limitinteger
Max results (default 20, max 50)
querystringrequired
Search query, e.g. 'budget Q2', 'from:alice@contoso.com', 'subject:invoice'
m365_send_email
Send an email from your Microsoft 365 account. Shows a preview first — set confirm=true to actually send.
Parameters (5)
bodystringrequired
Email body (plain text)
ccstring
CC recipients (optional, comma-separated)
confirmboolean
Set to true to actually send (default: shows preview only)
subjectstringrequired
Email subject
tostringrequired
Recipient email address. For multiple, separate with commas.
move_email
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 searches it first.
Parameters (5)
accountstring
confirmboolean
mailboxstring
message_idstringrequired
target_mailboxstringrequired
nordvpn_diagnose
Run a diagnostic check on NordVPN: installation, login state, connection status, kill switch, and supported protocols. Useful for troubleshooting.
No parameters.
nordvpn_servers
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.
Parameters (3)
countrystring
Country name or 2-letter code (e.g. 'US', 'United States', 'JP'). Omit for auto-recommendation.
limitinteger
Number of servers to return (1-10). Default: 5.
typestring
Server type filter: 'standard', 'p2p', 'double_vpn', 'onion', 'dedicated_ip'. Default: standard.
nordvpn_status
Check NordVPN connection status: connected/disconnected, auto-connect, snooze, and last known location. Does NOT open NordVPN.
No parameters.
notion_list_databases
Lists Notion databases cached on this Mac with their schema (column names and types). Use notion_read_database to get the rows.
No parameters.
notion_list_pages
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.
Parameters (1)
limitinteger
Max pages (default 50, max 500)
notion_list_workspaces
Lists the Notion workspaces cached on this Mac with their members (names and emails).
No parameters.
notion_open_page
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.
Parameters (1)
pagestringrequired
Page id (UUID) or title (partial, case-insensitive)
notion_read_database
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.
Parameters (2)
databasestringrequired
Database id (UUID) or name (partial, case-insensitive)
limitinteger
Max rows (default 50, max 500)
notion_read_page
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.
Parameters (2)
max_blocksinteger
Max blocks to render (default 300, max 1000)
pagestringrequired
Page id (UUID) or title (partial, case-insensitive)
notion_search
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.
Parameters (2)
limitinteger
Max results (default 20, max 100)
querystringrequired
Text to search for
onedrive_delete_file
Deletes a file or empty folder from OneDrive.
Parameters (2)
confirmboolean
Must be true to delete
pathstringrequired
Absolute path to the file or folder
onedrive_file_info
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.
Parameters (1)
pathstringrequired
Absolute path to the file or folder
onedrive_list_files
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.
Parameters (2)
limitinteger
Max entries to return (default 1000, max 5000). Folders with more entries are truncated; the response sets truncated=true and reports the total.
pathstringrequired
Absolute path to the OneDrive folder
onedrive_move_file
Moves or renames a file/folder within OneDrive.
Parameters (3)
confirmboolean
Must be true to move
destinationstringrequired
Destination path
sourcestringrequired
Source path
onedrive_read_file
Reads a text file from OneDrive or the local filesystem. 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).
Parameters (4)
encodingstring
Force a specific encoding: 'auto' (default), 'utf8', 'latin1', 'cp1252', 'ascii', 'utf16'
max_bytesinteger
Maximum bytes to read (default 1048576 = 1 MB, capped at 10485760 = 10 MB)
offsetinteger
Start reading at byte offset (default 0)
pathstringrequired
Absolute path to the file
onedrive_root
Lists all mounted OneDrive directories on this Mac.
No parameters.
onedrive_search_files
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.
Parameters (3)
max_resultsinteger
Maximum results (default 50)
querystringrequired
Filename pattern to search for
rootstring
Root OneDrive path to search in (optional)
onedrive_set_scope
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.
Parameters (3)
confirmboolean
Must be true to apply
folderstring
Allowed folder path relative to the root (e.g. '/000-Claude Personal Agent'). Empty string removes the scope.
root_namestringrequired
OneDrive root name (from onedrive_root, e.g. 'OneDrive-WPPCloud')
onedrive_write_file
Writes text content to a file in OneDrive.
Parameters (3)
confirmboolean
Must be true to write
contentstringrequired
Text content to write
pathstringrequired
Absolute path to the file in OneDrive
outlook_diagnose
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 parameters.
pdf_read
Reads and extracts text from a PDF file.
Parameters (2)
max_pagesinteger
Max pages to extract (default: all)
pathstringrequired
Absolute path to the PDF file
ppt_create
Creates a PowerPoint (.pptx) file with title and bullet slides.
Parameters (3)
confirmboolean
Must be true to create
pathstringrequired
Output path for the .pptx file
slidesarrayrequired
Array of {title, bullets:[]} slide objects
ppt_read
Reads slide text content from a PowerPoint (.pptx) file.
Parameters (1)
pathstringrequired
Absolute path to the .pptx file
read_email
Reads the full content of an email by its ID. Pass account= (and mailbox= if known, both from list_emails/search_emails) so the lookup targets one account instead of scanning all of them. Call sequentially, not in parallel — concurrent calls serialize behind Mail.app's JXA lock and later calls will time out.
Performance: body fetch is the primary latency source (avg 20s on slow IMAP). Pass include_body=false to skip it and get metadata-only (fast). Pass max_body_chars=N to cap the body at N chars after HTML stripping (default 30000; 0=unlimited). Response includes body_fetch_ms when fetch took >2s, body_omitted=true when skipped, body_truncated_at=N when cut.
Parameters (5)
accountstring
include_bodyboolean
mailboxstring
max_body_charsinteger
message_idstringrequired
read_messages
Reads messages from an iMessage conversation by chat ID or contact name.
Parameters (3)
chat_idstring
Chat identifier from list_message_chats
contact_namestring
Contact name substring (alternative to chat_id)
limitinteger
Max messages (default 50)
read_note
Reads the full content of a note by name or ID.
Parameters (2)
note_idstring
note_namestring
rename_reminder_list
Renames an existing Apple Reminders list. Pass the current list name (or list_id from list_reminder_lists) and new_name. Requires confirm=true.
Parameters (4)
confirmboolean
Must be true to apply
list_idstring
List identifier from list_reminder_lists (alternative to name)
namestring
Current list name (or pass list_id)
new_namestringrequired
New name for the list
reply_email
Replies to an email by message ID. Supports plain text or HTML body. Pass `account` (from list_emails/search_emails results) to skip scanning other accounts and avoid timeouts on multi-account Macs.
Parameters (6)
accountstring
bodystring
confirmboolean
html_bodystring
message_idstringrequired
reply_allboolean
report_problem
Report a problem, feature request, or integration request to the LMCP team. IMPORTANT: Do NOT call this tool automatically. ALWAYS ask the user first: "Would you like me to report this issue to the LMCP team?" Only call this tool if the user explicitly agrees. When called without confirm=true, returns a preview of the anonymous data that will be sent. Show this preview to the user and only set confirm=true after they approve. No personal data is included — only version, OS, and permission status. Use type='feature' when the user wants a new capability. Use type='integration' when the user wants to connect an unsupported app.
Parameters (8)
confirmboolean
Must be true to submit the report. Without it, shows a preview.
descriptionstring
Required for type=feature or integration: what the user wants.
error_messagestring
For type=problem: verbatim error string from the failed tool.
expectedstring
What you or the user expected to happen.
report_typestring
'problem' (default) | 'feature' | 'integration'
symptomstring
Required for type=problem: what is broken, in your own words.
tool_attemptedstring
For type=problem: name of the LMCP tool that failed.
user_requeststring
What the user originally asked the AI to do.
request_feature
Submit 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. Ask the user first, then call with confirm=true. Without confirm, returns a preview. The request is sent with your machine ID and (if set) your account email so the team can follow up — not anonymous. Tip: requesting features raises the user's LMCP engagement rank.
Parameters (2)
confirmboolean
Must be true to submit. Without it, shows a preview.
featurestringrequired
What the user wants LMCP to do — a capability, tool, or integration.
run_diagnostics
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.
Parameters (2)
focusstring
Integration to focus on: calendar, mail, contacts, reminders, omnifocus, outlook, notes, finder, onedrive. Leave empty to check all.
submitboolean
Send the diagnostic report to the LMCP team for analysis (default: false)
safari_click
Clicks the first element matching a CSS selector in the current Safari tab. Returns the tag name and visible text of the clicked element so you can confirm the right thing was hit. Pass `wait_for_navigation: true` to wait up to 3 seconds for the page to load after the click (useful when clicking links or buttons that trigger navigation).
Parameters (3)
nthinteger
Which match to click if there are several (0-based, default 0)
Wait up to 3s for page load after click (default false)
safari_evaluate_js
Runs arbitrary JavaScript in the current Safari tab and returns its result. Requires 'Allow JavaScript from Apple Events' in Safari's Develop menu.
Parameters (1)
scriptstringrequired
safari_fill_form
Fills multiple form fields in one shot. Pass fields as a JSON object mapping CSS selector to value.
Parameters (1)
fieldsstringrequired
safari_go_back
Navigates the current Safari tab back to the previous page.
Parameters (1)
window_indexinteger
safari_list_tabs
Lists every open tab across all Safari windows with title, URL, and whether it is active.
No parameters.
safari_navigate
Navigates Safari to a URL. Pass new_tab=true to open in a new tab.
Parameters (3)
new_tabboolean
urlstringrequired
window_indexinteger
safari_query_selector_all
Runs document.querySelectorAll in the current Safari tab and returns a compact summary of each match.
Parameters (2)
limitinteger
selectorstringrequired
safari_read_tab
Reads the rendered text content of a Safari tab. Identify the tab either by `url_match` (substring match against URL; first hit wins) or by `window_index` + `tab_index` (from safari_list_tabs). Text is capped at `max_bytes` (default 100 KB). Pass `include_html: true` to also get the raw HTML source. Pass `include_links: true` to extract all links with their href and text (useful for following navigation in SPAs like dashboards).
Parameters (6)
include_htmlboolean
Also return the HTML source (default false)
include_linksboolean
Extract all links with href + visible text (default false). Great for navigating SPAs.
max_bytesinteger
Max bytes of text (and html) to return (default 102400)
tab_indexinteger
Tab index from safari_list_tabs (default current tab of that window)
url_matchstring
Substring to match against the tab URL. Takes precedence over indices.
window_indexinteger
Window index from safari_list_tabs (default 0)
safari_search_tabs
Searches the rendered text of every open Safari tab for a substring. Returns each matching tab with the surrounding snippet. Useful for 'do I have a tab open with X?' questions across dozens of tabs.
Parameters (3)
contextinteger
Characters of context around each match (default 120)
max_tabsinteger
Max tabs to scan (default 30). Higher = slower.
querystringrequired
Substring to search for (case-insensitive)
safari_setup_check
Reports whether Safari is ready for interactive tools (safari_click, safari_type, safari_evaluate_js). Returns setup instructions if JavaScript from Apple Events is not enabled.
No parameters.
safari_type
Sets the value of an input/textarea matching a CSS selector and fires input/change events.
Parameters (3)
clearboolean
selectorstringrequired
valuestringrequired
safari_wait_for
Polls the current Safari tab until a CSS selector appears (or its text matches, if `text_match` is provided). Useful after safari_click to wait for the next page or a modal to render.
Parameters (3)
selectorstringrequired
CSS selector to wait for
text_matchstring
Optional substring that must appear inside the matched element
timeout_msinteger
Max time to wait (default 10000 = 10s, max 30000)
save_attachment
Saves an attachment from an email to disk. Pass account= (and mailbox= if known, both from list_emails/search_emails) so the lookup targets one account instead of scanning all of them.
Parameters (6)
accountstring
attachment_namestringrequired
confirmboolean
destinationstring
mailboxstring
message_idstringrequired
search_contacts
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.
Parameters (2)
limitinteger
Max results (default 50)
querystringrequired
Name, email, or phone to search for
search_emails
Searches emails in the Mac's Apple Mail (Mail.app, local accounts). For a Microsoft 365 / Outlook mailbox use m365_search_emails instead. On machines with 3+ accounts, pass account=<name> (from list_email_accounts) to search a specific account and avoid timeouts.
Parameters (4)
accountstring
limitinteger
mailboxstring
querystringrequired
search_m365_directory
Search your organization's Microsoft 365 directory for users by name or email. Returns matching users with their title, department, and contact info.
Parameters (2)
limitinteger
Max results (default 10, max 25)
querystringrequired
Name or email to search for, e.g. 'Sarah' or 'sarah@contoso.com'
search_messages
Searches iMessage conversations by content, sender name, or date range.
Parameters (4)
from_senderstring
Substring of sender name/handle to filter by (optional)
limitinteger
Max results (default 30)
querystring
Text to search for in message content (optional if from_sender is set)
sincestring
ISO8601 date — only return messages on or after this date (optional, e.g. '2026-04-10' or '2026-04-10T00:00:00Z')
search_notes
Searches Apple Notes by title or content.
Parameters (2)
limitinteger
querystringrequired
search_omnifocus_tasks
Searches OmniFocus tasks by name or note content.
Parameters (2)
limitinteger
querystringrequired
send_email
Composes and sends an email via Mail.app. Supports plain text or HTML body. Pass `from` to send from a specific configured Mail.app account instead of the default sender. Pass `attachments` as a comma-separated list of absolute file paths to attach files.
Parameters (9)
attachmentsstring
bccstring
bodystring
ccstring
confirmboolean
fromstring
html_bodystring
subjectstringrequired
tostringrequired
send_message
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 + Automation permission.
Parameters (3)
confirmboolean
Set true to actually send. Without it, returns a preview only.
textstringrequired
Message body to send.
tostringrequired
Recipient handle: phone number with country code (+14155551234) or Apple ID email.
servicenow_add_comment
Add a comment or work note to a ServiceNow incident. Comments are visible to the caller; work notes are internal only.
Parameters (3)
sys_idstringrequired
Incident sys_id from servicenow_get_incident
textstringrequired
Comment or work note text
typestring
'comment' (visible to caller, default) or 'work_note' (internal only)
servicenow_create_incident
Create a new incident in ServiceNow.
Parameters (4)
categorystring
Incident category, e.g. 'software', 'hardware', 'network'
descriptionstring
Full description of the issue
short_descriptionstringrequired
Brief summary of the issue (required)
urgencystring
1=Critical, 2=High, 3=Medium (default), 4=Low
servicenow_get_incident
Get full details of a specific ServiceNow incident by number or sys_id.
Parameters (1)
idstringrequired
Incident number (e.g. 'INC0012345') or sys_id
servicenow_list_my_incidents
List incidents assigned to you or opened by you in ServiceNow.
Parameters (2)
limitinteger
Max results (default 20, max 50)
statestring
Filter by state: 'open' (default), 'resolved', 'all'
servicenow_search_incidents
Search incidents in ServiceNow by keyword, number, or caller.
Parameters (2)
limitinteger
Max results (default 10, max 50)
querystringrequired
Free-text search or incident number (e.g. 'INC0012345' or 'printer not working')
servicenow_search_kb
Search the ServiceNow Knowledge Base for articles.
Parameters (2)
limitinteger
Max results (default 5, max 20)
querystringrequired
Search terms, e.g. 'reset password' or 'VPN setup'
servicenow_update_incident
Update fields on an existing ServiceNow incident — state, priority, assignment. Use sys_id from servicenow_get_incident.
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 parameters.
signal_friction
Send an ANONYMOUS, content-free signal when an LMCP tool fails, returns nothing useful, the user seems frustrated, or you could not accomplish what they asked. Helps the LMCP team find and fix the roughest spots. Send ONLY the category + the tool name — NEVER the user's request, message/email content, account names, or any personal data. No confirmation needed: this is anonymous (categories only) and respects the user's opt-out.
Parameters (4)
attempt_countinteger
How many times this was attempted (optional).
error_categorystring
Category of what went wrong (optional).
friction_signalstringrequired
What kind of friction you observed.
tool_attemptedstring
Name of the LMCP tool involved (e.g. list_emails). Optional.
signal_list_chats
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.
Parameters (1)
limitinteger
Max chats to return (default 50)
signal_read_messages
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.
Parameters (2)
chat_idstringrequired
Chat ID from signal_list_chats
limitinteger
Max messages to return (default 50)
signal_search_messages
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.
Parameters (3)
chat_idstring
Optional chat ID to restrict search
limitinteger
Max results to return (default 50)
querystringrequired
Search text (case-insensitive substring match)
signal_send_message
Preview (and get send guidance for) a message to a Signal chat. NOTE: Signal Desktop exposes no local send API — the Signal integration reads the local database read-only — so LMCP cannot transmit Signal messages directly. The first call (confirm=false or omitted) returns a preview. Pass confirm=true to get step-by-step guidance for completing the send. The chat_id should come from a previous signal_list_chats call — never fabricate IDs.
Parameters (3)
chat_idstringrequired
Chat ID from signal_list_chats
confirmboolean
Set true for send guidance. Default: preview only.
textstringrequired
Plain-text message body
slack_list_channels
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.
Parameters (2)
limitinteger
Max channels to return (default 200)
workspace_idstring
Workspace ID from slack_list_workspaces (optional — omit to list channels across all workspaces)
slack_list_workspaces
Lists the Slack workspaces (teams) the user has connected in Slack Desktop. Reads from the local IndexedDB cache — no token needed. Only workspaces that have been synced to disk are returned.
No parameters.
slack_read_channel_messages
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.
Parameters (2)
channel_idstringrequired
Channel ID from slack_list_channels
limitinteger
Max messages to return (default 50)
slack_search_messages
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.
Parameters (3)
channel_idstring
Optional channel ID to restrict search
limitinteger
Max results to return (default 50)
querystringrequired
Search text (case-insensitive substring match)
stocks_get_chart
Gets historical price data for a stock symbol. Range: 1d, 5d, 1mo, 3mo, 6mo, 1y, 2y, 5y, 10y, ytd, max.
Parameters (3)
intervalstring
Data interval (default: 1d). Intraday (1m–90m) needs a short range.
rangestring
Time range (default: 1mo)
symbolstringrequired
Ticker symbol, e.g. AAPL
stocks_get_quote
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.
Parameters (1)
symbolsstringrequired
Ticker symbols, comma-separated ('AAPL,MSFT,GOOGL') or a JSON array (['AAPL','MSFT'])
stocks_search_symbol
Searches for a stock ticker symbol by company name. Returns matching symbols and exchanges.
Parameters (2)
limitinteger
Max results (default 10)
querystringrequired
Company name or partial ticker to search for
teams_list_channels
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.
Parameters (1)
team_idstringrequired
Team ID from list_teams
teams_list_chats
Lists Microsoft Teams chats (direct messages and group chats).
Parameters (1)
limitinteger
Max chats to return (default 50)
teams_list_teams
Lists all Microsoft Teams workspaces the user belongs to.
No parameters.
teams_read_channel_messages
Reads messages from a Microsoft Teams channel.
Parameters (3)
channel_idstringrequired
Channel ID from list_teams_channels
limitinteger
Max messages (default 50)
team_idstringrequired
Team ID
teams_read_chat_messages
Reads messages from a Teams chat or direct message thread.
Parameters (2)
chat_idstringrequired
Chat ID from list_teams_chats
limitinteger
Max messages (default 50)
teams_send_channel_message
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.
Parameters (4)
channel_idstringrequired
Channel ID from teams_list_channels
confirmboolean
Set true to send; false returns preview
team_idstringrequired
Team ID from teams_list_teams
textstringrequired
Plain-text message body
teams_send_message
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.
Parameters (3)
chat_idstringrequired
Thread id from teams_list_chats (e.g. '19:<uuid>_<uuid>@unq.gbl.spaces' for 1:1, '19:<uuid>@thread.tacv2' for group)
confirmboolean
Must be true to actually send. Without it, returns a preview without making any network call.
textstringrequired
Plain-text message body. Max 28000 chars. No formatting / mentions / attachments in v1.
todo_complete_task
Marks a Microsoft To Do task as complete (via Reminders sync).
Parameters (4)
confirmboolean
Must be true to complete
liststring
List name to narrow search by title (optional)
task_idstring
Task ID from todo_list_tasks
titlestring
Task title (partial match, alternative to task_id)
todo_create_task
Creates a task in Microsoft To Do (via Reminders sync). Task appears in To Do automatically once synced.
Parameters (6)
confirmboolean
Must be true to create
due_datestring
Due date (YYYY-MM-DD, optional)
liststring
List name (from todo_list_lists). Defaults to first available list.
notesstring
Task notes (optional)
priorityinteger
Priority: 1=high, 5=medium, 9=low (optional)
titlestringrequired
Task title
todo_list_lists
Lists Microsoft To Do task lists. Requires Microsoft account in Reminders sync (System Settings → Internet Accounts → Microsoft Exchange → enable Reminders).
No parameters.
todo_list_tasks
Lists tasks from a Microsoft To Do list (or any Reminders list). Syncs via macOS Reminders.
Parameters (3)
include_completedboolean
Include completed tasks (default false)
limitinteger
Max tasks to return (default 50)
liststring
List name (from todo_list_lists). Leave empty to show all.
update_calendar_event
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.
Parameters (8)
confirmboolean
Must be true to apply changes
end_datestring
New end datetime ISO 8601 (optional)
event_idstringrequired
Event identifier from list_calendar_events
locationstring
New location — pass empty string to clear (optional)
notesstring
New notes — pass empty string to clear (optional)
spanstring
For recurring events: 'this' (default) or 'future'
start_datestring
New start datetime ISO 8601 (optional)
titlestring
New title (optional)
update_local_mcp
Checks for and installs LMCP updates. Installing downloads the update and RESTARTS LMCP (the AI client briefly reconnects), so it requires confirm=true. Pass check_only=true to only report whether an update is available, with no download or restart.
Parameters (2)
check_onlyboolean
If true, only report availability — no download, no install, no restart.
confirmboolean
Must be true to actually install (which restarts LMCP). Without it, returns availability + a preview.
update_note
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.
Parameters (5)
bodystring
confirmboolean
note_idstring
note_namestring
titlestring
update_reminder
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.
Parameters (7)
confirmboolean
Must be true to apply changes
due_datestring
New ISO 8601 due date. Pass empty string to clear (optional)
list_namestring
Move the reminder to this list (a name from list_reminder_lists) (optional)
notesstring
New notes text (optional)
prioritystring
Priority: none | low | medium | high (optional)
reminder_idstringrequired
Reminder identifier from list_reminders
titlestring
New title (optional)
update_self_diagnosis
Returns the self-update health state: current version, last N update attempts (with errors), writability of the update cache, and any stale LMCP binaries found at alternate paths. Call this when auto-update seems stuck or when you need to explain to a user why they're on an old version.
Parameters (1)
limitinteger
Max recent attempts to return (default 10)
whatsapp_connect
Link WhatsApp to Local MCP by showing a QR code right here in the chat — no Terminal needed. Call this, then on your phone open WhatsApp → Settings → Linked Devices → Link a Device, and scan the QR shown. After you scan, WhatsApp tools (whatsapp_list_chats, whatsapp_read_messages, …) start working. If WhatsApp is already linked, it just reports that.
No parameters.
whatsapp_disconnect
Unlink WhatsApp from Local MCP — logs out the linked device on this Mac (via wacli). Your chats stay on your phone; this only disconnects this Mac, and WhatsApp tools stop working until you run whatsapp_connect again. Write operation: the first call (confirm=false) returns a preview without disconnecting; set confirm=true to actually unlink.
Parameters (1)
confirmboolean
Must be true to actually unlink. Without it, returns a preview.
whatsapp_list_chats
Lists WhatsApp conversations with last message preview. Returns chat IDs, contact names, and recent message snippets. Some contacts may appear with @lid identifiers (e.g. 123456@lid) instead of phone numbers — this is a WhatsApp privacy feature for certain account types; use the Name field for display and the JID/chat_id for subsequent calls. ⚠️ Uses Wacli (unofficial WhatsApp client). Accounts may be restricted for ToS violations.
Parameters (1)
limitinteger
Max chats to return (default 50)
whatsapp_read_messages
Reads messages from a specific WhatsApp chat. The chat_id must come from a previous whatsapp_list_chats call. ⚠️ Uses Wacli (unofficial WhatsApp client). Accounts may be restricted for ToS violations.
Parameters (2)
chat_idstringrequired
Chat ID from whatsapp_list_chats
limitinteger
Max messages to return (default 50)
whatsapp_search_messages
Offline full-text search across all WhatsApp chats. Only locally-cached messages are searched — no network access required. Optionally restrict search to a specific chat_id. ⚠️ Uses Wacli (unofficial WhatsApp client). Accounts may be restricted for ToS violations.
Parameters (3)
chat_idstring
Optional chat ID to restrict search
limitinteger
Max results to return (default 50)
querystringrequired
Search text (case-insensitive substring match)
whatsapp_send_file
Sends a file attachment to a WhatsApp chat. The chat_id MUST come from a previous whatsapp_list_chats call — never fabricate IDs. file_path must be an absolute path to a local file. This is a write operation: the first call (confirm=false) returns a preview without sending; set confirm=true to actually send. ⚠️ Uses Wacli (unofficial WhatsApp client). Accounts may be restricted for ToS violations.
Parameters (4)
captionstring
Optional caption text to accompany the file
chat_idstringrequired
Chat ID from whatsapp_list_chats
confirmboolean
Must be true to actually send. Without it, returns a preview.
file_pathstringrequired
Absolute path to the local file to send
whatsapp_send_message
Sends a text message to a WhatsApp chat. The chat_id MUST come from a previous whatsapp_list_chats call — never fabricate IDs. This is a write operation: the first call (confirm=false) returns a preview without sending; set confirm=true to actually send. ⚠️ Uses Wacli (unofficial WhatsApp client). Accounts may be restricted for ToS violations.
Parameters (3)
chat_idstringrequired
Chat ID from whatsapp_list_chats
confirmboolean
Must be true to actually send. Without it, returns a preview.
textstringrequired
Plain-text message body
word_append
Appends text to an existing Word (.docx) document.
Parameters (3)
confirmboolean
Must be true to modify
contentstringrequired
Text to append
pathstringrequired
Path to the existing .docx file
word_create
Creates a new Word (.docx) document with the given content.
Parameters (4)
confirmboolean
Must be true to create
contentstringrequired
Document text content
pathstringrequired
Output path for the .docx file
titlestring
Document title (optional)
word_read
Reads text content from a Word (.docx) file.
Parameters (1)
pathstringrequired
Absolute path to the .docx file
zoom_list_recordings
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.
Parameters (1)
limitinteger
Max recordings to return (default 20)
zoom_read_transcript
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'.
Parameters (2)
includestring
'all' (default), 'transcript' or 'chat'
recordingstringrequired
Recording folder name (or full path) from zoom_list_recordings. Partial name match works.
Let your AI actually use your Mac. Ask ChatGPT, Claude or Cursor to read & reply to your email, manage your calendar, text over iMessage, find your files, and pull data from PDFs — it just does it. It even reaches iMessage and your local apps that the web AIs can't. Tools run on-device — for desktop AIs nothing leaves your Mac; an optional, opt-in encrypted relay lets web AIs reach it. No API keys, free.
Installs in 2 minutes. Auto-configures Claude Desktop, Claude Code, Cursor, Windsurf, VS Code, and Zed. Free — no paid tier yet.
⭐ Like it? Star this repo — it helps others discover LMCP.
<p align="center">
<img src="assets/claude-tools.png" alt="Claude Desktop showing tools across 20 categories with LMCP" width="700">
</p>
<p align="center"><em>Native tools across 20 categories — Mail, Calendar, Teams, Slack, WhatsApp, OneDrive, Microsoft 365, Notes, OmniFocus, ServiceNow, and more</em></p>
<details>
<summary>Menu bar app</summary>
<p align="center">
<img src="assets/tray-app.png" alt="LMCP menu bar app" width="340">
</p>
<p align="center"><em>Status at a glance — all your Mac apps connected</em></p>
</details>
What your AI can do
App
What you can ask
Mail
"Summarize my unread emails" · "Reply to Jana saying I'll be 10 minutes late" · "Find emails from the contracts team last week"
Calendar
"What do I have tomorrow?" · "Schedule a team sync Friday at 3pm" · "Cancel my 2pm meeting"
Contacts
"Get Jana's phone number" · "Find everyone at Acme Corp"
Microsoft Teams
"What did the engineering channel say today?" · "Show my last conversation with Marco"
Slack
"Summarize #engineering from today" · "What did Ana say in the #design channel?"
WhatsApp
"Summarize my WhatsApp from this morning" · "Find the chat with Carla about the trip" (via the unofficial Wacli client — requires QR-code sign-in)
OneDrive
"Find the Q1 report" · "Upload this summary to the shared folder"
Google Drive
"Find the budget sheet in Drive" · "Read the project notes from My Drive"
Zoom
"Summarize my last meeting" · "What did we agree on in the kickoff call?"
Outlook
"Read my Outlook inbox" · "Search for invoices from last month"
Microsoft 365
"Read my Outlook.com inbox" · "Find Sara in the company directory" · "Add a Graph calendar event"
Reminders
"Add a reminder to call the bank tomorrow at 9am" · "What's on my list?"
To Do
"Add milk to my shopping list" · "What's due today in To Do?"
OmniFocus
"Show my overdue tasks" · "Create a task to review the contract"
Notes
"Search my notes for the API keys" · "Create a note with today's decisions"
Messages
"What did Ana send me this morning?" · "Search iMessages for the address"
Word / Excel / PPT
"Read this contract" · "Create a spreadsheet with these numbers"
PDF
"Summarize this PDF"
Finder
"Find all files named 'invoice' on my Mac"
Safari
"List my bookmarks in the Dev folder"
Stocks
"How is AAPL doing today?" · "Show me a chart of MSFT this month"
ServiceNow
"Show my open incidents" · "Create a P2 for the outage" · "Search the KB for VPN setup"
NordVPN
"Is my VPN connected?" · "Recommend a server in Japan"
183 tools across 22 app categories. Read operations run instantly. Write operations (send email, delete event) show a preview and require confirmation.
Auto-detects and configures: Claude Desktop · Claude Code · Cursor · Windsurf · VS Code · Zed
Restart your AI client once. That's it.
Prefer not to use the terminal?
You don't need the command line. Get the Mac app from local-mcp.com, drag it to Applications, and open it. The menu-bar app walks you through connecting Claude Desktop, ChatGPT, Claude.ai, or Grok — no setup files to edit. (The terminal install above also auto-configures Claude Desktop, Cursor, VS Code, and more.)
Requirements: macOS 13+ (Ventura or later, Apple Silicon or Intel). Windows & Linux are on the waitlist at local-mcp.com.
Use with ChatGPT (web)
ChatGPT can call your Mac apps through LMCP's Cloud Relay. The full walkthrough with
screenshots is at local-mcp.com/guides/chatgpt-mac —
the short version:
Install LMCP (above) and open the menu bar app → Settings → Connect. Enter your
email, click Connect, then toggle Cloud Data Forwarding ON.
On chatgpt.com (web only — Plus/Pro/Business/Enterprise/Edu):
Settings → Apps & Connectors → Advanced settings → enable Developer mode.
On the Authorize ChatGPT page, paste your token (Settings → Connect → Copy next to
Token) and click Authorize. The token is your secure per-machine credential — no email step.
New chat → + → More → LMCP, then ask "Summarize my unread emails."
Using Claude Desktop, Cursor, VS Code, Windsurf, or Zed? Skip all of this — curl … | bash
auto-configures them locally and nothing leaves your Mac.
How it works
code
┌─────────────────────────────────┐
│ Claude · Cursor · VS Code · … │
└───────────┬─────────────────────┘
│ MCP protocol (stdio)
┌───────────▼─────────────────────┐
│ LMCP server │
│ JXA · EventKit · AppleScript │
│ LevelDB · native macOS APIs │
└───────────┬─────────────────────┘
│
┌───────────▼─────────────────────┐
│ Mail · Calendar · Teams · … │
│ Your Mac apps (local data) │
└─────────────────────────────────┘
Why native?
Most MCP servers call cloud APIs. LMCP talks directly to macOS frameworks:
EventKit for Calendar — reads all providers (iCloud, Google, Exchange)
AppleScript/JXA for Mail — works with any IMAP account
LevelDB for Teams — reads the local IndexedDB cache, no Graph API needed
CNContactStore for Contacts — native framework, no app launch required
File system for OneDrive, Word, Excel, PowerPoint
This means: no API keys, no OAuth, no rate limits, works offline, sub-second responses.
Microsoft Teams without Graph API
The most technically interesting part: Teams messages are read directly from the local LevelDB cache at:
No Azure AD registration, no tenant admin approval, no OAuth tokens. Just the messages already cached on your Mac.
Cloud Relay (optional)
Claude.ai and ChatGPT can't reach localhost. Enable Cloud Relay in the menu bar app — a secure WebSocket tunnel routes requests to your local server. Your data is encrypted in transit and never stored.
Popular guides
The things people most often want their AI to reach — and the ones cloud connectors can't:
Read your iMessages — the only MCP server that does it (iMessage has no API; LMCP reads the local database on-device)
All data stays on your Mac — nothing is sent to external servers
No API keys, OAuth tokens, or cloud accounts required
Uses standard macOS TCC permissions (the same "Allow access?" prompts any app uses)
Calendar, Contacts, and Reminders access can be revoked anytime in System Settings
GDPR and CCPA compliant by architecture — tool results are produced on your Mac, and our backend never stores your tool inputs or outputs (see SECURITY.md)
Destructive operations always show a preview and require explicit confirmation
Supported AI clients
Client
Transport
Auto-configured
Claude Desktop
stdio
✅
Claude Code
stdio
✅
Cursor
stdio
✅
Windsurf
stdio
✅
VS Code (Copilot / Cline)
stdio
✅
Zed
stdio
✅
Claude.ai
Cloud Relay
Manual
ChatGPT
Cloud Relay
Manual
Grok
Cloud Relay
Manual
Perplexity
Cloud Relay
Manual
OpenClaw
Cloud Relay
Manual
Common questions
Does LMCP send my data to the cloud?
No. The tools run on your own machine and read directly from your installed apps. There is no cloud processing and LMCP's servers never store your data. The optional Cloud Relay is an encrypted tunnel that lets a cloud AI (ChatGPT, Claude.ai, Grok) trigger a tool on your machine — the result is produced locally and the backend doesn't persist tool responses.
Can ChatGPT, Claude, or Cursor read my email, calendar, or Teams without API keys or OAuth?
Yes. LMCP exposes them as MCP tools that read your local apps directly — no Microsoft Graph tokens, no Google API keys, no OAuth setup for the data.
How is this different from a cloud automation platform?
Cloud automation platforms route your data through their servers. LMCP runs the tools on your computer and returns results straight to your AI, so nothing transits a third-party cloud. Choose LMCP when privacy and local-first matter; choose a hosted platform when you want cloud-hosted multi-step workflows.
How is it different from a cloud MCP connector or a Graph-API integration?
Those authenticate against vendor cloud APIs (OAuth tokens, tenant-admin consent). LMCP reads the apps already on your machine — Mail, the local Teams/Slack cache, synced OneDrive — with no API keys and no admin approval for the data.
Can it read Microsoft Teams or Slack without the Graph API or admin tokens?
Yes. It reads the Teams and Slack data already cached locally on your machine.
Can my AI read and write local Excel, Word, PowerPoint, or PDF files?
Yes — it reads and creates Office documents and reads PDFs locally, without uploading them anywhere.
Does it work on Windows?
Not yet — LMCP is macOS-only today. Windows & Linux are on the waitlist at local-mcp.com.
How much does it cost?
Free, no paid tier yet — a permanent license, not a 14-day trial, no subscription.
Roadmap
Shipped:
Cloud connectors — ChatGPT, Claude.ai, Grok, Perplexity, and OpenClaw via the encrypted relay
Microsoft Teams — read and send chats and channel messages (no Graph API)
Already works today via the file tools: any local folder is searchable and
readable right now — including your Obsidian vault and your Google Drive
or Dropbox sync folders — with fs_search, fs_read, and the Finder tools.
No dedicated integration needed to read those files.
Have a feature in mind? Run request_feature from any AI client, or open an issue.
This stops all background processes, removes the auto-start LaunchAgent, deletes the app and binaries, and cleans up the MCP entries from Claude Desktop, Cursor, and other AI clients. Your emails, calendar, and other data are never stored by LMCP and remain untouched.
Support
In your AI client: ask Claude to run report_bug or request_feature