Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

com.local-mcp/local-mcp

REMOTE · LOCAL-MCP.COM · 2 COMPONENTS · SCANNED SEP 20

Let ChatGPT, Claude & Cursor use your Mac: email, calendar, iMessage, Teams, files. Local, free.

−41 this week 39 Trust /100

Recent critical change

Authorization (16 Sept 2026). See the changelog before you install this server.

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security97
  • The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
  • The endpoint enforces authorisation, advertised via RFC 9728 protected-resource metadata. View diagnostics → Pass
  • HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
  • The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
  • DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
  • The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents. View diagnostics → Partial
Transport & Reachability0
Schema Quality & AI Usability0
  • Schema blocked by authentication: the endpoint requires auth we don't have to read it. See how to fix → Unverified
Stability & Change Management0
  • Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
Tool Coverage0
  • Tool coverage blocked by authentication: the endpoint requires auth we don't have to read its tools.Unverified
Tool Safety0
  • Tool safety blocked by authentication: the endpoint requires auth we don't have to read its tools.Unverified
Capabilities0
  • Capabilities blocked by authentication: the endpoint requires auth we don't have to read them. See how to fix → Unverified

Unverified: 6 categories

Categories scored 0 because we could not verify them: authentication we do not have, an unreachable endpoint, or not enough scan history. We only credit what we can confirm. Claim this server and supply a read-only token to verify it and lift the score.

Install

How do I install the com.local-mcp/local-mcp server?

com.local-mcp/local-mcp is a hosted endpoint at https://local-mcp.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · local-mcp.com

# add to Claude Code
claude mcp add --transport http com-local-mcp-local-mcp 'https://local-mcp.com/mcp'
// .cursor/mcp.json
{
  "mcpServers": {
    "com-local-mcp-local-mcp": {
      "url": "https://local-mcp.com/mcp"
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "com-local-mcp-local-mcp": {
      "type": "http",
      "url": "https://local-mcp.com/mcp"
    }
  }
}
# ~/.codex/config.toml
[mcp_servers.com-local-mcp-local-mcp]
url = "https://local-mcp.com/mcp"
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-local-mcp-local-mcp": {
      "type": "remote",
      "url": "https://local-mcp.com/mcp",
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add com-local-mcp-local-mcp --url 'https://local-mcp.com/mcp' --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  com-local-mcp-local-mcp:
    url: "https://local-mcp.com/mcp"
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "com-local-mcp-local-mcp": {
      "Transport": "http",
      "Url": "https://local-mcp.com/mcp"
    }
  }
}
# add to Vellum
assistant mcp add com-local-mcp-local-mcp -t streamable-http -u 'https://local-mcp.com/mcp'
// mcp.json
{
  "mcpServers": {
    "com-local-mcp-local-mcp": {
      "type": "http",
      "url": "https://local-mcp.com/mcp"
    }
  }
}

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 17 Sept 26 −41
    • Endpoint reachability: reachable → behind authorisation security
    • Stability: fail → unverified security
    • Tool safety: pass → unverified security
    • Transport: pass → unverified security
    • Authorization: fail → pass security
    • First check of Authorization: partial security
    • Tool coverage: 100 → unverified functional
    • Schema quality: 75 → unverified functional
    • Capabilities: pass → unverified functional
  • 16 Sept 26 0
    • Authorization: unverified → fail critical
  • 15 Sept 26 0
    • Authorization: fail → unverified security
  • 13 Sept 26 0
    • Authorization: unverified → fail critical
  • 12 Sept 26 0
    • Authorization: fail → unverified security
    • Tool “run_diagnostics” rewrote its description, which is the text the model reads security
    • Tool “configure_clients” rewrote its description, which is the text the model reads security
    • New tool “lmcp_doctor” functional
    • “configure_clients” reworded the description of “client” cosmetic
    • “run_diagnostics” reworded the description of “focus” cosmetic
  • 11 Sept 26 0
    • Tool “finder_list” rewrote its description, which is the text the model reads security
    • Tool “file_write” rewrote its description, which is the text the model reads security
    • Tool “file_read” rewrote its description, which is the text the model reads security
    • Tool “finder_search” rewrote its description, which is the text the model reads security
  • 8 Sept 26 +29
    • Authorization: unverified → fail critical
    • Injection markers: unverified → pass security
    • Tool “excel_write_cell” rewrote its description, which is the text the model reads security
    • Tool “excel_create” rewrote its description, which is the text the model reads security
    • Tool “reply_email” rewrote its description, which is the text the model reads security
    • Schema quality: unverified → fail functional
    • Schema quality: 223 → 127 functional
    • Schema quality: 223 → 125 functional
    • Tool coverage: unverified → 100 functional
    • Schema quality: good → excellent functional
    • This server's schema is too large to store in full, so we cannot compare its tools day to day functional
    • “excel_read” added an optional parameter “force_download” cosmetic
    • “pdf_read” added an optional parameter “force_download” cosmetic
    • “ppt_read” added an optional parameter “force_download” cosmetic
    • “reply_email” added an optional parameter “save_as_draft” cosmetic
    • “word_read” added an optional parameter “force_download” cosmetic
    • “reply_email” reworded the description of “confirm” cosmetic
  • 7 Sept 26 −27
    • Tool safety: pass → unverified security
    • Authorization: fail → unverified security
    • Schema quality: 125 → 223 functional
    • Tool coverage: 100 → unverified functional
    • Schema quality: fail → unverified functional
    • MCP protocol: fail → pass functional
    • Schema quality: excellent → good functional
    • Server version: e57f9d66-d10 → c2609ba9-0f4 functional
    • This server's schema is too large to store in full, so we cannot compare its tools day to day functional
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 20 Sept 2026 · Probed https://local-mcp.com/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=local-mcp.com CN=YE1,O=Let's Encrypt,C=US 16 Sept 2026 15 Dec 2026 ECDSA 256 ECDSA-SHA384 611e3e1599b7d3d83dea72ee1855d00484e
SANs: *.local-mcp.com, local-mcp.com
CN=YE1,O=Let's Encrypt,C=US (CA) CN=Root YE,O=ISRG,C=US 3 Sept 2025 2 Sept 2028 ECDSA 384 ECDSA-SHA384 5ddd70dd31f801c85c186a7a04b80afe
CN=Root YE,O=ISRG,C=US (CA) CN=ISRG Root X2,O=Internet Security Research Group,C=US 13 May 2026 2 Sept 2032 ECDSA 384 ECDSA-SHA384 872165fc34b6e5fba8add5b3705fb53a
CN=ISRG Root X2,O=Internet Security Research Group,C=US (CA) CN=ISRG Root X1,O=Internet Security Research Group,C=US 13 May 2026 2 Sept 2032 ECDSA 384 SHA256-RSA 6c8f1dc727c7117f7baf853ac980f9cd

Background: What to check on a remote MCP endpoint →

DNSSEC secure

Validation of local-mcp.com. Secure

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
com. present 19718 13 Verified
local-mcp.com. present 2371 13 Verified
local-mcp.com. Verified address RRset verified with the apex keys
Authentication Enforced and verified

The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.

Result Enforced and verified
Enforced On connection
HTTP status 401

WWW-Authenticate challenge Bearer realm="OAuth", resource_metadata="https://local-mcp.com/.well-known/oauth-protected-resource/mcp", error="invalid_token", error_description="Missing or invalid access token"

Bearer realm="OAuth", resource_metadata="https://local-mcp.com/.well-known/oauth-protected-resource/mcp", error="invalid_token", error_description="Missing or invalid access token"
Header Value
strict-transport-security max-age=15552000
content-security-policy default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' static.cloudflareinsights.com plausible.io https://*.clarity.ms https://www.googletagmanager.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https: blob:; font-src 'self' data:; connect-src 'self' https://www.local-mcp.com https://office-mcp-production.up.railway.app https://plausible.io https://static.cloudflareinsights.com https://cloudflareinsights.com https://api.npmjs.org https://*.clarity.ms https://*.google-analytics.com https://*.analytics.google.com https://www.googletagmanager.com https://cdn.growthbook.io; frame-ancestors 'none'; base-uri 'self'; form-action 'self' https://www.local-mcp.com https://chatgpt.com https://claude.ai
x-content-type-options nosniff
x-frame-options DENY
referrer-policy strict-origin-when-cross-origin
permissions-policy camera=(), microphone=(), geolocation=(), payment=()
www-authenticate Bearer realm="OAuth", resource_metadata="https://local-mcp.com/.well-known/oauth-protected-resource/mcp", error="invalid_token", error_description="Missing or invalid access token"

Protected resource metadata

Document https://local-mcp.com/.well-known/oauth-protected-resource/mcp
Retrieved Yes
Resource https://local-mcp.com/mcp
Authorisation server https://www.local-mcp.com

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://local-mcp.com/mcp Auth required 401
http (plaintext) http://local-mcp.com/mcp HTTPS enforced 301 https://local-mcp.com/mcp
MCP tools · 204 exposed · ~25,946 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
permissions_status ~79

Reports the TCC permission state (screen recording, accessibility, microphone) this app needs to capture the screen and drive other apps' UI. Call it before a capture/automation run and surface the grant hints instead of failing mid-sequence. Screen Recording / Accessibility are granted in System Settings (not a JIT dialog); the URLs open the exact pane.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

ppt_create ~145

Creates a PowerPoint presentation (.pptx) at `path` from an array of slides, each {title, bullets:[…]}. Requires confirm=true — called without it, returns a preview of the deck instead of writing the file. The path must be somewhere Local MCP can write; Desktop/Documents/Downloads may need a one-time Files-and-Folders grant (System Settings → Privacy & Security → Files and Folders). Returns {created, path, slides}.

NameTypeReqDescription
confirmbooleanMust be true to create
pathstringyesOutput path for the .pptx file
slidesarrayyesArray of {title, bullets:[]} slide objects
NameTypeReqDescription
createdbooleanyesTrue when the file was created
pathstringyesPath of the created .pptx file
slidesintegeryesNumber of slides created

No examples provided.

ppt_read ~97

Reads slide text content from a PowerPoint presentation (.pptx file).

NameTypeReqDescription
force_downloadbooleanIf the file is stored in the cloud and evicted from this Mac (dataless), request the download and wait for it instead of failing. Off by default: a download can take minutes and use metered data, so…
pathstringyesAbsolute path to the .pptx file
NameTypeReqDescription
countintegeryesNumber of slides
slidesarrayyesPer-slide structured content ({slide, title, bullets[]}), mirroring ppt_create

No examples provided.

read_email ~351

Use this when the user wants the full content of an email that lives in the Mac's Apple Mail (message ID from list_emails/search_emails). For a Microsoft 365 message ID from m365_list_emails, use m365_read_email. Pass account= (and mailbox= if known, both from list_emails/search_emails) so the lookup targets one account instead of scanning all of them. Call sequentially, not in parallel — concurrent calls serialize behind Mail.app's JXA lock and later calls will time out. Performance: body fetch is the primary latency source (avg 20s on slow IMAP). Pass include_body=false to skip it and get metadata-only (fast). Pass max_body_chars=N to cap the body at N chars after HTML stripping (default 30000; 0=unlimited). Response includes body_fetch_ms when fetch took >2s, body_omitted=true when skipped, body_truncated_at=N when cut. When a body isn't cached on this Mac, read_email returns metadata with body_omitted=true and body_omit_reason="not_downloaded" (iCloud/IMAP optimized storage) rather than making Mail fetch it (that can be slow and tie Mail up). If the user wants it anyway, retry with force_download=true to have Mail pull the body over IMAP now and return it (waits up to ~60s). Off by default; ignored while Mail is in a cooldown.

NameTypeReqDescription
accountstring
force_downloadboolean
include_bodyboolean
mailboxstring
max_body_charsinteger
message_idstringyes
NameTypeReqDescription
accountstring
bodystring
body_fetch_msinteger
body_omittedboolean
body_truncated_atinteger
ccstring
datestring
fromstring
idstring
mailboxstring
subjectstring
tostring
unreadboolean

No examples provided.

read_messages ~66

Reads messages from an iMessage conversation by chat ID or contact name.

NameTypeReqDescription
chat_idstringChat identifier from list_message_chats
contact_namestringContact name substring (alternative to chat_id)
limitintegerMax messages (default 50)
NameTypeReqDescription
chat_idstring
countinteger
messagesarray
notestring

No examples provided.

read_note ~165

Reads the full content of a note by name or ID. CHECK `body_format` BEFORE WRITING THE BODY BACK. "markdown" means the note's formatting (headings, bold/italic, bullet/numbered lists, checkboxes, links, monospaced) came through as Markdown and update_note takes it back as-is — literal `*`, backticks and brackets arrive backslash-escaped so they survive the round trip. "plain_text" means the formatting could NOT be recovered and `body` is flat text: writing it back REPLACES the note's structure with flat text, so edit the note by other means (or ask the user) instead of rewriting the whole body.

NameTypeReqDescription
note_idstring
note_namestring
NameTypeReqDescription
bodystring
body_formatstringWhat `body` actually is. "markdown": the note's formatting survived and update_note accepts this body back unchanged. "plain_text": the formatting could not be recovered — writing this body back flat…
folderstring
idstring
modifiedstring
namestring

No examples provided.

recipe_delete ~125

Use this when the user wants to remove one of THEIR saved recipes/skills (the manifests under ~/.local/share/local-mcp/recipes). Destructive with a preview gate: the first call (without confirm) shows what would be deleted; call again with confirm=true to actually delete. Bundled starter recipes can't be deleted. To modify a recipe instead, recipe_save with the same name overwrites it (upsert).

NameTypeReqDescription
confirmbooleanMust be true to actually delete. Without it, returns a preview.
namestringyesRecipe name (from recipe_list).
NameTypeReqDescription
deletedboolean
namestring
statusstring'preview' when confirm was not set.

No examples provided.

recipe_discover ~111

Browses installable community SKILLS — ready-made LMCP workflows other people published (a morning brief, inbox triage, a weekly report). A user would browse them to find a ready-made workflow for a repeatable multi-app task instead of building it from scratch. Returns a list of {id, title, category, description, steps, votes}; install one with recipe_install(id).

NameTypeReqDescription
categorystringOptional filter hint shown to the user; the catalog is small so all skills are returned.

No output schema declared.

No examples provided.

recipe_export ~108

Exports a saved SKILL (recipe) as a single portable token the user can send to someone else — paste it in a message, email, or doc. The recipient installs it with recipe_import and runs it with recipe_run. A user would export a skill to share it with a teammate (a handy brief, a report, a workflow). Returns {name, skill_token} plus the readable manifest.

NameTypeReqDescription
namestringyesName of the saved skill to export (see recipe_list).

No output schema declared.

No examples provided.

recipe_get ~31

Returns the full manifest of a recipe by name. recipe_not_found if unknown.

NameTypeReqDescription
namestringyes
NameTypeReqDescription
descriptionstring
namestring
paramsarray
stepsarray

No examples provided.

recipe_import ~144

Installs a SKILL someone shared with you — pass the skill_token from their recipe_export (or a raw recipe manifest JSON). Saves it to this Mac so recipe_run can use it. Safe: importing only stores the skill; when it's later run, any state-changing step (send/write/delete) previews first and needs confirmation. If a skill with the same name already exists, the import is saved under a non-colliding name. Returns {name, imported}.

NameTypeReqDescription
skillstringA skill_token from recipe_export, or a raw recipe manifest JSON string.
skill_tokenstringAlias for `skill` — the exact field name recipe_export returns.

No output schema declared.

No examples provided.

recipe_install ~101

Installs a community SKILL by id (from recipe_discover) onto this Mac so recipe_run can use it. Safe: installing only stores the skill; when it's later run, any state-changing step (send/write/delete) previews first and needs confirmation. If a skill with the same name already exists, it's saved under a non-colliding name. Returns {name, installed}.

NameTypeReqDescription
idintegeryesThe community skill id from recipe_discover.

No output schema declared.

No examples provided.

recipe_list ~82

Lists the user's reusable SKILLS — saved recipes (an ordered sequence of LMCP tool calls with parameters), plus bundled ones — each runnable with recipe_run. Skills turn a repeated LMCP workflow into one reusable command. A user would list them to find an existing skill for a task rather than rebuilding it from scratch. Returns each skill's name, description, and steps.

Input schema present but exposes no named parameters.

NameTypeReqDescription
recipesarray

No examples provided.

recipe_run ~133

Executes a recipe end to end: binds params, runs each step's tool in order via the registry, persists the run (see recipe_runs), and returns each step's result plus any markers_path. Recipes with state-changing steps (write/send/delete) PREVIEW first — call again with confirm:true to execute; read-only recipes run immediately. A step that errors stops the run and is reported.

NameTypeReqDescription
confirmbooleanSet true to execute a recipe that has state-changing steps; read-only recipes ignore it.
namestringyes
paramsobjectParam overrides (merged over the recipe defaults).

No output schema declared.

No examples provided.

recipe_runs ~128

Shows the history of past recipe runs and their results (recorded by recipe_run), so you can reuse, compare, or debug an automation. Pass `name` for one recipe's runs, or omit for a compact history across all recipes. Pass `run_id` (with `name`) to get that run in full detail. Newest first.

NameTypeReqDescription
limitintegerMax runs to return (default 20).
namestringRecipe name; omit for runs across all recipes.
run_idstringReturn this one run in full detail (requires name).
NameTypeReqDescription
countinteger
recipestring|nullRecipe name when scoped, null for the all-recipes history.
runsarray

No examples provided.

recipe_save ~325

Saves a reusable SKILL — a named recipe (an ordered sequence of LMCP tool calls with parameters) — to this Mac so the user can re-run it anytime with recipe_run. A user would save one to turn a multi-step LMCP workflow they repeat (a morning brief, inbox triage, a weekly report, a data pull) into a single reusable command. Saved skills can be shared with other people via recipe_export. The manifest must have a name and a non-empty steps array. Returns {name}.

NameTypeReqDescription
manifestobjectyesThe recipe manifest. Shape: {"name": string (required), "description": string, "params": [{"name": string, "type": "string"|"int"|"bool", "default": any}], "steps": [ ... ] (required, non-empty), "ou…

No output schema declared.

No examples provided.

record_marker ~124

Drops a named marker into the active recording's timeline. t_ms is elapsed ms since recording start. Provide bounds (global points, top-left) to zoom toward an element, or omit for full-frame. note becomes a caption source. Returns no_active_session if nothing is recording.

NameTypeReqDescription
boundsobjectOptional {x,y,w,h} global points to zoom toward.
namestringyesMarker name, e.g. open_tray, act2_calendar_create.
notestringFree text → caption source.
session_idstring

No output schema declared.

No examples provided.

rename_reminder_folder ~103

Renames an existing Apple Reminders list. Pass the current list name (or list_id from get_reminder_folders) and new_name. Requires confirm=true.

NameTypeReqDescription
confirmbooleanMust be true to apply
list_idstringList identifier from get_reminder_folders (alternative to name)
namestringCurrent list name (or pass list_id)
new_namestringyesNew name for the list

Structured output declared, but exposes no named fields.

No examples provided.

reply_email ~382

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 and previews before sending. To leave the reply in Drafts WITHOUT sending, pass `save_as_draft: true`: it builds the same native Mail reply (automatic quote of the original, correct thread, Reply/Reply-All recipients) and saves it instead of sending — `send` is never called on that path. `create_draft` with `reply_to_message_id` also leaves a draft, but composes it from scratch, so it has no automatic quote. 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.

NameTypeReqDescription
accountstringAccount (from the listing) the message is in — pass it to skip scanning other accounts and avoid multi-account timeouts.
bodystringPlain-text reply body.
confirmbooleanConsent gate: the first call previews the reply; call again with confirm=true to actually SEND it — or to save it when save_as_draft is set.
html_bodystringHTML reply body. Takes precedence over `body` when both are given.
message_idstringyesId of the message to reply to (from list_emails/search_emails).
reply_allbooleanReply to all original recipients instead of just the sender.
save_as_draftbooleanSave the native reply in Drafts instead of sending it. Keeps Mail's reply template: automatic quote of the original, the right thread, and the Reply/Reply-All recipients. Nothing is sent on this path.
NameTypeReqDescription
draft_mailboxstringWhere the draft was left, so the user knows where to look.
draft_subjectstringSubject of the draft that was created.
message_idstring
repliedboolean
saved_as_draftbooleanTrue when save_as_draft was used: the reply is in Drafts and nothing was sent.
sentbooleanFalse on the draft path — stated explicitly so 'no error' is never read as 'it went out'.

No examples provided.

report_friction ~171

Send an ANONYMOUS, content-free signal when an LMCP tool fails, returns nothing useful, the user seems frustrated, or you could not accomplish what they asked. Helps the LMCP team find and fix the roughest spots. Send ONLY the category + the tool name — NEVER the user's request, message/email content, account names, or any personal data. No confirmation needed: this is anonymous (categories only) and respects the user's opt-out.

NameTypeReqDescription
attempt_countintegerHow many times this was attempted (optional).
error_categorystringCategory of what went wrong (optional).
friction_typestringyesWhat kind of friction you observed.
tool_attemptedstringName of the LMCP tool involved (e.g. list_emails). Optional.

Structured output declared, but exposes no named fields.

No examples provided.

report_problem ~290

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 personal data); with confirm=true it submits and returns a case_id. type='problem' (default) reports a bug, type='feature' requests a new capability, type='integration' requests an unsupported app.

NameTypeReqDescription
confirmbooleanMust be true to submit the report. Without it, shows a preview.
descriptionstringRequired for type=feature or integration: what the user wants.
error_messagestringFor type=problem: verbatim error string from the failed tool.
expectedstringWhat you or the user expected to happen.
report_typestring'problem' (default) | 'feature' | 'integration'
symptomstringRequired for type=problem: what is broken, in your own words.
tool_attemptedstringFor type=problem: name of the LMCP tool that failed.
user_requeststringWhat the user originally asked the AI to do.

Structured output declared, but exposes no named fields.

No examples provided.

request_feature ~144

Submits a feature request to the LMCP team — a new capability, a tool that doesn't exist yet, or an app/integration the user wishes LMCP supported. A user would invoke this when they want to ask the team for something LMCP can't do yet. Without confirm=true it returns a preview; with confirm=true it submits. The request includes the machine ID and (if set) the account email so the team can follow up — it is not anonymous.

NameTypeReqDescription
confirmbooleanMust be true to submit. Without it, shows a preview.
featurestringyesWhat the user wants LMCP to do — a capability, tool, or integration.

Structured output declared, but exposes no named fields.

No examples provided.

run_diagnostics ~157

Runs a fast health check of all LMCP integrations on this machine, including the AI apps connected to LMCP (configured, never used, broken command, blocked config). Shows what works, what doesn't, and how to fix it. Optionally submits a report to the LMCP team.

NameTypeReqDescription
focusstringIntegration to focus on: calendar, mail, contacts, reminders, omnifocus, outlook, notes, finder, onedrive, screen_recording, accessibility — or `clients` for the AI apps connected to LMCP (or one app…
submitbooleanSend the diagnostic report to the LMCP team for analysis (default: false)
NameTypeReqDescription
integrationsarrayyes
ok_countintegeryesNumber of integrations working
problem_countintegeryesNumber of integrations with errors or missing permissions
reportstringFull formatted text report
submittedbooleanTrue when the report was sent to the LMCP team
summarystringyesPlain-language summary of overall health
warn_countintegeryesNumber of integrations with warnings / not running

No examples provided.

save_attachment ~111

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.

NameTypeReqDescription
accountstring
attachment_namestringyes
confirmboolean
destinationstring
mailboxstring
message_idstringyes
NameTypeReqDescription
attemptsinteger
destinationstring
namestring
savedboolean

No examples provided.

screen_record_start ~138

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.

NameTypeReqDescription
fpsintegerFrames per second (default 60).
output_pathstringWhere to write the .mov (default: temp file, returned by stop). Missing parent folders are created.
show_cursorbooleanDefault true.
targetobjectyesWhat to capture.

No output schema declared.

No examples provided.

screen_record_status ~39

Reports whether a recording is active, with the session_id, elapsed_ms, output path, and marker_count.

NameTypeReqDescription
session_idstring

No output schema declared.

No examples provided.

screen_record_stop ~75

Stops the active recording, finalizes the .mov, and writes the marker timeline JSON (§6) next to it. Returns the video path, duration, resolution, marker_count and markers_path. Returns no_active_session if nothing is recording.

NameTypeReqDescription
session_idstringOptional; the single active session is used if omitted.

No output schema declared.

No examples provided.

screenshot_capture ~174

Captures a single frame of a display, window, or region to a PNG. Returns {path, resolution (PIXELS), scale_factor, display_id} — scale_factor is the backing scale of the display that was ACTUALLY captured (the same value list_displays reports for that display_id, by construction: both read one function), so pixels = points x scale_factor when converting a coordinate from the image to ui_click. If the display could not be determined you get scale_factor_unknown instead of a guess; resolution is always there, so you can derive the ratio yourself. Requires Screen Recording permission; without it returns an explicit permission_required, never a blank image.

NameTypeReqDescription
output_pathstringWhere to write the PNG (default: temp file). Missing parent folders are created.
targetobjectyes

No output schema declared.

No examples provided.

search_contacts ~78

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.

NameTypeReqDescription
limitintegerMax results (default 50)
querystringyesName, email, or phone to search for
NameTypeReqDescription
contactsarrayyes
countintegeryes
querystringyes

No examples provided.

search_emails ~252

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. IMPORTANT: on machines with 2+ accounts, call with account=<name> (from list_email_accounts). Without it, and when the fast index can't answer, search_emails returns the account list instead of scanning all of them — scanning every account in one call has no time limit and can block Mail for other requests too. Exactly 1 account is unaffected.

NameTypeReqDescription
accountstring
limitinteger
mailboxstring
querystringyes
scopestring"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).
NameTypeReqDescription
countinteger
next_actionsarray
omitted_mailboxesarray
querystring
resultsarray
search_backendstring
search_coveragestring
search_scopestring
warningsarray

No examples provided.

search_m365_directory ~82

Search your organization's Microsoft 365 directory for users by name or email. Returns matching users with their title, department, and contact info.

NameTypeReqDescription
limitintegerMax results (default 10, max 25)
querystringyesName or email to search for, e.g. 'Sarah' or 'sarah@contoso.com'
NameTypeReqDescription
countinteger
querystring
usersarray

No examples provided.

search_messages ~162

Searches iMessage conversations by content, sender name, or date range.

NameTypeReqDescription
from_senderstringSubstring of sender name/handle to filter by (optional)
limitintegerMax results (default 30)
querystringText to search for in message content (optional if from_sender is set)
sincestringISO8601 date — only return messages on or after this date (optional, e.g. '2026-04-10' or '2026-04-10T00:00:00Z')
untilstringISO8601 date — only return messages on or before this date (optional). Combine with 'since' to search a date range with no text query.
NameTypeReqDescription
countinteger
from_senderstring
querystring
resultsarray
sincestring
untilstring

No examples provided.

search_notes ~370

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 lower bound. To walk every match, pass order="id" — see the order parameter.

NameTypeReqDescription
limitintegerMatches per page (default 20, capped at 100). To get more, page with offset.
offsetintegerHow many matches to skip (default 0). An offset past the end returns an empty page with has_more=false, not an error.
orderstringorder: "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…
querystringyes
NameTypeReqDescription
countintegerMatches in THIS page
has_morebooleanTrue when matches remain past this page — call again with offset = offset + count
next_actionsarray
offsetintegerWhere this page started
orderstringThe ordering actually applied (modified | id)
querystring
resultsarray
totalintegerMatches in total, ignoring limit/offset. A LOWER BOUND, not the exact figure, when total_is_estimated is true
total_is_estimatedbooleanTrue when the exact count could not be taken (the unbounded COUNT failed, or the JXA fallback answered) — total is then only a lower bound. has_more stays exact either way: page until it is false, ne…

No examples provided.

search_omnifocus_tasks ~56

Searches OmniFocus tasks by name or note content.

NameTypeReqDescription
limitintegerMax matches to return (default 30).
querystringyesText to match against task names and notes (case-insensitive).
NameTypeReqDescription
countinteger
querystring
resultsarray

No examples provided.

send_email ~282

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 absolute file paths to attach files.

NameTypeReqDescription
attachmentsstringFiles to attach, as comma-separated absolute paths (e.g. a PDF).
bccstringBCC address(es), comma-separated.
bodystringPlain-text body. Use this OR html_body; if both are given, html_body wins.
ccstringCC address(es), comma-separated.
confirmbooleanSafety gate: the call only PREVIEWS (nothing is sent) unless confirm:true. Set true to actually send.
fromstringSender address — on a multi-account Mac, selects which configured Mail.app account sends. Omit to use Mail's default account.
html_bodystringHTML body. Takes precedence over `body` when both are set.
subjectstringyesSubject line.
tostringyesRecipient address(es), comma-separated for multiple.
NameTypeReqDescription
fromstring
sentboolean
subjectstring
tostring

No examples provided.

send_message ~158

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.

NameTypeReqDescription
confirmbooleanSet true to actually send. Without it, returns a preview only.
textstringyesMessage body to send.
tostringyesRecipient handle: phone number with country code (+14155551234) or Apple ID email.
NameTypeReqDescription
errorstring
notestring
previewboolean
sentboolean
servicestring
textstring
tostring

No examples provided.

setup_install ~237

Returns a personalized LMCP install link and setup steps (~30 sec to install). LMCP is a free Mac and Windows app that gives access to Mail/Calendar/Contacts/Notes/Reminders on Mac, Outlook/Teams/OneDrive/Office on Windows, and 100+ tools on the user's machine (data stays local). A user would invoke this to install LMCP or reconnect it. Pass os ("macos" or "windows" for real install steps; linux/ios/android go to a waitlist). Optional: email, step, issue.

NameTypeReqDescription
emailstringOptional. Helps Cloud Relay auto-connect after install.
issuestringOptional tag: gatekeeper_error, dot_not_green, install_failed, etc.
osstringyesmacos | 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 → waitl…
stepstringIf stuck: connector | install | email | connecting_stuck | server_down.
NameTypeReqDescription
install_commandstringOne-line terminal command to install LMCP, when applicable to this OS/step.
instructionsstringyesFull human-readable, step-by-step install/setup text.
osstringTarget operating system the instructions are for, when known.

No examples provided.

signal_compose_guidance ~174

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) returns a preview; show_send_steps=true returns the send-it-yourself steps. chat_id should come from a previous signal_list_chats call — never fabricate IDs.

NameTypeReqDescription
chat_idstringyesChat ID from signal_list_chats
show_send_stepsbooleanSet true to get the send-it-yourself steps. Default: preview only.
textstringyesPlain-text message body

Structured output declared, but exposes no named fields.

No examples provided.

signal_connect ~89

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.

Input schema present but exposes no named parameters.

Structured output declared, but exposes no named fields.

No examples provided.

signal_list_chats ~75

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.

NameTypeReqDescription
limitintegerMax chats to return (default 50)
NameTypeReqDescription
chatsarrayyesSignal conversations
countintegerNumber of chats returned

No examples provided.

signal_read_messages ~84

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.

NameTypeReqDescription
chat_idstringyesChat ID from signal_list_chats
limitintegerMax messages to return (default 50)
NameTypeReqDescription
countintegerNumber of messages returned
messagesarrayyesMessages from the chat, chronological

No examples provided.

signal_search_messages ~89

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.

NameTypeReqDescription
chat_idstringOptional chat ID to restrict search
limitintegerMax results to return (default 50)
querystringyesSearch text (case-insensitive substring match)
NameTypeReqDescription
countintegerNumber of results returned
resultsarrayyesMatching messages

No examples provided.

slack_list_channels ~106

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.

NameTypeReqDescription
limitintegerMax channels to return (default 200)
workspace_idstringWorkspace ID from slack_list_workspaces (optional — omit to list channels across all workspaces)
NameTypeReqDescription
channelsarrayyesChannels and DMs synced to the local cache
countintegeryesNumber of channels returned

No examples provided.

slack_list_workspaces ~76

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.

Input schema present but exposes no named parameters.

NameTypeReqDescription
countintegeryesNumber of workspaces returned
workspacesarrayyesConnected Slack workspaces synced to the local cache

No examples provided.

slack_read_channel_messages ~88

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.

NameTypeReqDescription
channel_idstringyesChannel ID from slack_list_channels
limitintegerMax messages to return (default 50)
NameTypeReqDescription
countintegeryesNumber of messages returned
messagesarrayyesRecent messages from the channel, oldest first

No examples provided.

slack_search_messages ~150

Searches Slack messages. Optionally restrict to a specific channel_id. A hit whose `text` is the marker "[body not included in this search result]" (with `body_missing: true`) DID match — its body was lost by the reader, not empty. Read it with slack_read_channel_messages on its channel_id; never report it to the user as an empty message. Direct messages come back as an unresolved id rather than a name; slack_list_channels maps ids to names.

NameTypeReqDescription
channel_idstringOptional channel ID to restrict search
limitintegerMax results to return (default 50)
querystringyesSearch text (case-insensitive substring match)
NameTypeReqDescription
countintegeryesNumber of results returned
notestringPresent when something about the answer needs stating: bodies that did not survive the reader, unresolved channel names, or a genuine zero
resultsarrayyesMatching messages, most recent first

No examples provided.

stocks_get_chart ~121

Gets historical price data for a stock symbol. Range: 1d, 5d, 1mo, 3mo, 6mo, 1y, 2y, 5y, 10y, ytd, max.

NameTypeReqDescription
intervalstringData interval (default: 1d). Intraday (1m–90m) needs a short range.
rangestringTime range (default: 1mo)
symbolstringyesTicker symbol, e.g. AAPL
NameTypeReqDescription
candlesarray
change_pctnumber
currencystring
current_pricenumber
data_pointsinteger
intervalstring
namestring
rangestring
symbolstring

No examples provided.

stocks_get_quote ~79

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.

NameTypeReqDescription
symbolsstringyesTicker symbols, comma-separated ('AAPL,MSFT,GOOGL') or a JSON array (['AAPL','MSFT'])

Structured output declared, but exposes no named fields.

No examples provided.

stocks_search_symbol ~77

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.

NameTypeReqDescription
limitintegerMax results (default 10)
querystringyesCompany name or partial ticker to search for
NameTypeReqDescription
countinteger
querystring
resultsarray

No examples provided.

survey_respond ~174

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 once to PREVIEW, then again with confirm=true to record. Do NOT invent answers — if no human gave them (you're running autonomously), call survey_skip instead.

NameTypeReqDescription
answersobjectAnswers keyed by question id. Single/scale = a value; multiple = an array.
confirmbooleanSet true to actually record the answers. Omit/false = preview only (nothing is stored).
NameTypeReqDescription
messagestring
okboolean
previewboolean
surveyobjectThe pending survey (no-args call) — rendered by the MCP Apps card.

No examples provided.

Common questions

What is the com.local-mcp/local-mcp server?

com.local-mcp/local-mcp is listed in the public MCP registry as com.local-mcp/local-mcp. Let ChatGPT, Claude & Cursor use your Mac: email, calendar, iMessage, Teams, files. Local, free. This page covers its hosted endpoint (https://local-mcp.com/mcp).

Is the com.local-mcp/local-mcp server safe to use?

com.local-mcp/local-mcp scores 39 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the com.local-mcp/local-mcp server expose?

com.local-mcp/local-mcp exposes 204 tools: setup_install, complete_omnifocus_task, complete_reminder, configure_clients, connect_m365_account, and 199 more. Their descriptions and schemas cost roughly 25,946 tokens of context every time the server is loaded.

Does the com.local-mcp/local-mcp server require authentication?

Yes. com.local-mcp/local-mcp asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

Is the com.local-mcp/local-mcp server still maintained?

com.local-mcp/local-mcp is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.