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.
Available components
Recent critical change
Authorization (16 Sept 2026). See the changelog before you install this server.
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
- Transport blocked by authentication: the endpoint requires auth we don't have to verify streamable-http. See how to fix → View diagnostics → Unverified
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.
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
claude mcp add --transport http com-local-mcp-local-mcp 'https://local-mcp.com/mcp'
{
"mcpServers": {
"com-local-mcp-local-mcp": {
"url": "https://local-mcp.com/mcp"
}
}
} {
"servers": {
"com-local-mcp-local-mcp": {
"type": "http",
"url": "https://local-mcp.com/mcp"
}
}
} [mcp_servers.com-local-mcp-local-mcp] url = "https://local-mcp.com/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"com-local-mcp-local-mcp": {
"type": "remote",
"url": "https://local-mcp.com/mcp",
"enabled": true
}
}
} openclaw mcp add com-local-mcp-local-mcp --url 'https://local-mcp.com/mcp' --transport streamable-http
mcp_servers:
com-local-mcp-local-mcp:
url: "https://local-mcp.com/mcp" {
"McpServers": {
"com-local-mcp-local-mcp": {
"Transport": "http",
"Url": "https://local-mcp.com/mcp"
}
}
} assistant mcp add com-local-mcp-local-mcp -t streamable-http -u 'https://local-mcp.com/mcp'
{
"mcpServers": {
"com-local-mcp-local-mcp": {
"type": "http",
"url": "https://local-mcp.com/mcp"
}
}
} The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 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
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 |
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 →
permissions_status Permissions Status ~79
Reports the TCC permission state (screen recording, accessibility, microphone) this app needs to capture the screen and drive other apps' UI. Call it before a capture/automation run and surface the grant hints instead of failing mid-sequence. Screen Recording / Accessibility are granted in System Settings (not a JIT dialog); the URLs open the exact pane.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
ppt_create PowerPoint Create ~145
Creates a PowerPoint presentation (.pptx) at `path` from an array of slides, each {title, bullets:[…]}. Requires confirm=true — called without it, returns a preview of the deck instead of writing the file. The path must be somewhere Local MCP can write; Desktop/Documents/Downloads may need a one-time Files-and-Folders grant (System Settings → Privacy & Security → Files and Folders). Returns {created, path, slides}.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | – | Must be true to create |
| path | string | yes | Output path for the .pptx file |
| slides | array | yes | Array of {title, bullets:[]} slide objects |
| Name | Type | Req | Description |
|---|---|---|---|
| created | boolean | yes | True when the file was created |
| path | string | yes | Path of the created .pptx file |
| slides | integer | yes | Number of slides created |
No examples provided.
ppt_read PowerPoint Read ~97
Reads slide text content from a PowerPoint presentation (.pptx file).
| Name | Type | Req | Description |
|---|---|---|---|
| force_download | boolean | – | If 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… |
| path | string | yes | Absolute path to the .pptx file |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | Number of slides |
| slides | array | yes | Per-slide structured content ({slide, title, bullets[]}), mirroring ppt_create |
No examples provided.
read_email Read Email ~351
Use this when the user wants the full content of an email that lives in the Mac's Apple Mail (message ID from list_emails/search_emails). For a Microsoft 365 message ID from m365_list_emails, use m365_read_email. Pass account= (and mailbox= if known, both from list_emails/search_emails) so the lookup targets one account instead of scanning all of them. Call sequentially, not in parallel — concurrent calls serialize behind Mail.app's JXA lock and later calls will time out. Performance: body fetch is the primary latency source (avg 20s on slow IMAP). Pass include_body=false to skip it and get metadata-only (fast). Pass max_body_chars=N to cap the body at N chars after HTML stripping (default 30000; 0=unlimited). Response includes body_fetch_ms when fetch took >2s, body_omitted=true when skipped, body_truncated_at=N when cut. When a body isn't cached on this Mac, read_email returns metadata with body_omitted=true and body_omit_reason="not_downloaded" (iCloud/IMAP optimized storage) rather than making Mail fetch it (that can be slow and tie Mail up). If the user wants it anyway, retry with force_download=true to have Mail pull the body over IMAP now and return it (waits up to ~60s). Off by default; ignored while Mail is in a cooldown.
| Name | Type | Req | Description |
|---|---|---|---|
| account | string | – | – |
| force_download | boolean | – | – |
| include_body | boolean | – | – |
| mailbox | string | – | – |
| max_body_chars | integer | – | – |
| message_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| account | string | – | – |
| body | string | – | – |
| body_fetch_ms | integer | – | – |
| body_omitted | boolean | – | – |
| body_truncated_at | integer | – | – |
| cc | string | – | – |
| date | string | – | – |
| from | string | – | – |
| id | string | – | – |
| mailbox | string | – | – |
| subject | string | – | – |
| to | string | – | – |
| unread | boolean | – | – |
No examples provided.
read_messages Read Messages ~66
Reads messages from an iMessage conversation by chat ID or contact name.
| Name | Type | Req | Description |
|---|---|---|---|
| chat_id | string | – | Chat identifier from list_message_chats |
| contact_name | string | – | Contact name substring (alternative to chat_id) |
| limit | integer | – | Max messages (default 50) |
| Name | Type | Req | Description |
|---|---|---|---|
| chat_id | string | – | – |
| count | integer | – | – |
| messages | array | – | – |
| note | string | – | – |
No examples provided.
read_note Read Note ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| note_id | string | – | – |
| note_name | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| body | string | – | – |
| body_format | string | – | What `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… |
| folder | string | – | – |
| id | string | – | – |
| modified | string | – | – |
| name | string | – | – |
No examples provided.
recipe_delete Recipe Delete ~125
Use this when the user wants to remove one of THEIR saved recipes/skills (the manifests under ~/.local/share/local-mcp/recipes). Destructive with a preview gate: the first call (without confirm) shows what would be deleted; call again with confirm=true to actually delete. Bundled starter recipes can't be deleted. To modify a recipe instead, recipe_save with the same name overwrites it (upsert).
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | – | Must be true to actually delete. Without it, returns a preview. |
| name | string | yes | Recipe name (from recipe_list). |
| Name | Type | Req | Description |
|---|---|---|---|
| deleted | boolean | – | – |
| name | string | – | – |
| status | string | – | 'preview' when confirm was not set. |
No examples provided.
recipe_discover Recipe Discover ~111
Browses installable community SKILLS — ready-made LMCP workflows other people published (a morning brief, inbox triage, a weekly report). A user would browse them to find a ready-made workflow for a repeatable multi-app task instead of building it from scratch. Returns a list of {id, title, category, description, steps, votes}; install one with recipe_install(id).
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | – | Optional filter hint shown to the user; the catalog is small so all skills are returned. |
No output schema declared.
No examples provided.
recipe_export Recipe Export ~108
Exports a saved SKILL (recipe) as a single portable token the user can send to someone else — paste it in a message, email, or doc. The recipient installs it with recipe_import and runs it with recipe_run. A user would export a skill to share it with a teammate (a handy brief, a report, a workflow). Returns {name, skill_token} plus the readable manifest.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Name of the saved skill to export (see recipe_list). |
No output schema declared.
No examples provided.
recipe_get Recipe Get ~31
Returns the full manifest of a recipe by name. recipe_not_found if unknown.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | – | – |
| name | string | – | – |
| params | array | – | – |
| steps | array | – | – |
No examples provided.
recipe_import Recipe Import ~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}.
| Name | Type | Req | Description |
|---|---|---|---|
| skill | string | – | A skill_token from recipe_export, or a raw recipe manifest JSON string. |
| skill_token | string | – | Alias for `skill` — the exact field name recipe_export returns. |
No output schema declared.
No examples provided.
recipe_install Recipe Install ~101
Installs a community SKILL by id (from recipe_discover) onto this Mac so recipe_run can use it. Safe: installing only stores the skill; when it's later run, any state-changing step (send/write/delete) previews first and needs confirmation. If a skill with the same name already exists, it's saved under a non-colliding name. Returns {name, installed}.
| Name | Type | Req | Description |
|---|---|---|---|
| id | integer | yes | The community skill id from recipe_discover. |
No output schema declared.
No examples provided.
recipe_list Recipe List ~82
Lists the user's reusable SKILLS — saved recipes (an ordered sequence of LMCP tool calls with parameters), plus bundled ones — each runnable with recipe_run. Skills turn a repeated LMCP workflow into one reusable command. A user would list them to find an existing skill for a task rather than rebuilding it from scratch. Returns each skill's name, description, and steps.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| recipes | array | – | – |
No examples provided.
recipe_run Recipe Run ~133
Executes a recipe end to end: binds params, runs each step's tool in order via the registry, persists the run (see recipe_runs), and returns each step's result plus any markers_path. Recipes with state-changing steps (write/send/delete) PREVIEW first — call again with confirm:true to execute; read-only recipes run immediately. A step that errors stops the run and is reported.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | – | Set true to execute a recipe that has state-changing steps; read-only recipes ignore it. |
| name | string | yes | – |
| params | object | – | Param overrides (merged over the recipe defaults). |
No output schema declared.
No examples provided.
recipe_runs Recipe Runs ~128
Shows the history of past recipe runs and their results (recorded by recipe_run), so you can reuse, compare, or debug an automation. Pass `name` for one recipe's runs, or omit for a compact history across all recipes. Pass `run_id` (with `name`) to get that run in full detail. Newest first.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Max runs to return (default 20). |
| name | string | – | Recipe name; omit for runs across all recipes. |
| run_id | string | – | Return this one run in full detail (requires name). |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | – |
| recipe | string|null | – | Recipe name when scoped, null for the all-recipes history. |
| runs | array | – | – |
No examples provided.
recipe_save Recipe Save ~325
Saves a reusable SKILL — a named recipe (an ordered sequence of LMCP tool calls with parameters) — to this Mac so the user can re-run it anytime with recipe_run. A user would save one to turn a multi-step LMCP workflow they repeat (a morning brief, inbox triage, a weekly report, a data pull) into a single reusable command. Saved skills can be shared with other people via recipe_export. The manifest must have a name and a non-empty steps array. Returns {name}.
| Name | Type | Req | Description |
|---|---|---|---|
| manifest | object | yes | The recipe manifest. Shape: {"name": string (required), "description": string, "params": [{"name": string, "type": "string"|"int"|"bool", "default": any}], "steps": [ ... ] (required, non-empty), "ou… |
No output schema declared.
No examples provided.
record_marker Record Marker ~124
Drops a named marker into the active recording's timeline. t_ms is elapsed ms since recording start. Provide bounds (global points, top-left) to zoom toward an element, or omit for full-frame. note becomes a caption source. Returns no_active_session if nothing is recording.
| Name | Type | Req | Description |
|---|---|---|---|
| bounds | object | – | Optional {x,y,w,h} global points to zoom toward. |
| name | string | yes | Marker name, e.g. open_tray, act2_calendar_create. |
| note | string | – | Free text → caption source. |
| session_id | string | – | – |
No output schema declared.
No examples provided.
rename_reminder_folder Rename Reminder Folder ~103
Renames an existing Apple Reminders list. Pass the current list name (or list_id from get_reminder_folders) and new_name. Requires confirm=true.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | – | Must be true to apply |
| list_id | string | – | List identifier from get_reminder_folders (alternative to name) |
| name | string | – | Current list name (or pass list_id) |
| new_name | string | yes | New name for the list |
Structured output declared, but exposes no named fields.
No examples provided.
reply_email Reply Email ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| account | string | – | Account (from the listing) the message is in — pass it to skip scanning other accounts and avoid multi-account timeouts. |
| body | string | – | Plain-text reply body. |
| confirm | boolean | – | Consent 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_body | string | – | HTML reply body. Takes precedence over `body` when both are given. |
| message_id | string | yes | Id of the message to reply to (from list_emails/search_emails). |
| reply_all | boolean | – | Reply to all original recipients instead of just the sender. |
| save_as_draft | boolean | – | Save 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. |
| Name | Type | Req | Description |
|---|---|---|---|
| draft_mailbox | string | – | Where the draft was left, so the user knows where to look. |
| draft_subject | string | – | Subject of the draft that was created. |
| message_id | string | – | – |
| replied | boolean | – | – |
| saved_as_draft | boolean | – | True when save_as_draft was used: the reply is in Drafts and nothing was sent. |
| sent | boolean | – | False on the draft path — stated explicitly so 'no error' is never read as 'it went out'. |
No examples provided.
report_friction Report Friction ~171
Send an ANONYMOUS, content-free signal when an LMCP tool fails, returns nothing useful, the user seems frustrated, or you could not accomplish what they asked. Helps the LMCP team find and fix the roughest spots. Send ONLY the category + the tool name — NEVER the user's request, message/email content, account names, or any personal data. No confirmation needed: this is anonymous (categories only) and respects the user's opt-out.
| Name | Type | Req | Description |
|---|---|---|---|
| attempt_count | integer | – | How many times this was attempted (optional). |
| error_category | string | – | Category of what went wrong (optional). |
| friction_type | string | yes | What kind of friction you observed. |
| tool_attempted | string | – | Name of the LMCP tool involved (e.g. list_emails). Optional. |
Structured output declared, but exposes no named fields.
No examples provided.
report_problem Report Problem ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | – | Must be true to submit the report. Without it, shows a preview. |
| description | string | – | Required for type=feature or integration: what the user wants. |
| error_message | string | – | For type=problem: verbatim error string from the failed tool. |
| expected | string | – | What you or the user expected to happen. |
| report_type | string | – | 'problem' (default) | 'feature' | 'integration' |
| symptom | string | – | Required for type=problem: what is broken, in your own words. |
| tool_attempted | string | – | For type=problem: name of the LMCP tool that failed. |
| user_request | string | – | What the user originally asked the AI to do. |
Structured output declared, but exposes no named fields.
No examples provided.
request_feature Request Feature ~144
Submits a feature request to the LMCP team — a new capability, a tool that doesn't exist yet, or an app/integration the user wishes LMCP supported. A user would invoke this when they want to ask the team for something LMCP can't do yet. Without confirm=true it returns a preview; with confirm=true it submits. The request includes the machine ID and (if set) the account email so the team can follow up — it is not anonymous.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | – | Must be true to submit. Without it, shows a preview. |
| feature | string | yes | What the user wants LMCP to do — a capability, tool, or integration. |
Structured output declared, but exposes no named fields.
No examples provided.
run_diagnostics Run Diagnostics ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| focus | string | – | Integration 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… |
| submit | boolean | – | Send the diagnostic report to the LMCP team for analysis (default: false) |
| Name | Type | Req | Description |
|---|---|---|---|
| integrations | array | yes | – |
| ok_count | integer | yes | Number of integrations working |
| problem_count | integer | yes | Number of integrations with errors or missing permissions |
| report | string | – | Full formatted text report |
| submitted | boolean | – | True when the report was sent to the LMCP team |
| summary | string | yes | Plain-language summary of overall health |
| warn_count | integer | yes | Number of integrations with warnings / not running |
No examples provided.
save_attachment 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.
| Name | Type | Req | Description |
|---|---|---|---|
| account | string | – | – |
| attachment_name | string | yes | – |
| confirm | boolean | – | – |
| destination | string | – | – |
| mailbox | string | – | – |
| message_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| attempts | integer | – | – |
| destination | string | – | – |
| name | string | – | – |
| saved | boolean | – | – |
No examples provided.
screen_record_start Screen Record Start ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| fps | integer | – | Frames per second (default 60). |
| output_path | string | – | Where to write the .mov (default: temp file, returned by stop). Missing parent folders are created. |
| show_cursor | boolean | – | Default true. |
| target | object | yes | What to capture. |
No output schema declared.
No examples provided.
screen_record_status Screen Record Status ~39
Reports whether a recording is active, with the session_id, elapsed_ms, output path, and marker_count.
| Name | Type | Req | Description |
|---|---|---|---|
| session_id | string | – | – |
No output schema declared.
No examples provided.
screen_record_stop Screen Record Stop ~75
Stops the active recording, finalizes the .mov, and writes the marker timeline JSON (§6) next to it. Returns the video path, duration, resolution, marker_count and markers_path. Returns no_active_session if nothing is recording.
| Name | Type | Req | Description |
|---|---|---|---|
| session_id | string | – | Optional; the single active session is used if omitted. |
No output schema declared.
No examples provided.
screenshot_capture 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.
| Name | Type | Req | Description |
|---|---|---|---|
| output_path | string | – | Where to write the PNG (default: temp file). Missing parent folders are created. |
| target | object | yes | – |
No output schema declared.
No examples provided.
search_contacts 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.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Max results (default 50) |
| query | string | yes | Name, email, or phone to search for |
| Name | Type | Req | Description |
|---|---|---|---|
| contacts | array | yes | – |
| count | integer | yes | – |
| query | string | yes | – |
No examples provided.
search_emails 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.
| Name | Type | Req | Description |
|---|---|---|---|
| account | string | – | – |
| limit | integer | – | – |
| mailbox | string | – | – |
| query | string | yes | – |
| scope | string | – | "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). |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | – |
| next_actions | array | – | – |
| omitted_mailboxes | array | – | – |
| query | string | – | – |
| results | array | – | – |
| search_backend | string | – | – |
| search_coverage | string | – | – |
| search_scope | string | – | – |
| warnings | array | – | – |
No examples provided.
search_m365_directory Search Microsoft 365 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.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Max results (default 10, max 25) |
| query | string | yes | Name or email to search for, e.g. 'Sarah' or 'sarah@contoso.com' |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | – |
| query | string | – | – |
| users | array | – | – |
No examples provided.
search_messages Search Messages ~162
Searches iMessage conversations by content, sender name, or date range.
| Name | Type | Req | Description |
|---|---|---|---|
| from_sender | string | – | Substring of sender name/handle to filter by (optional) |
| limit | integer | – | Max results (default 30) |
| query | string | – | Text to search for in message content (optional if from_sender is set) |
| since | string | – | ISO8601 date — only return messages on or after this date (optional, e.g. '2026-04-10' or '2026-04-10T00:00:00Z') |
| until | string | – | ISO8601 date — only return messages on or before this date (optional). Combine with 'since' to search a date range with no text query. |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | – |
| from_sender | string | – | – |
| query | string | – | – |
| results | array | – | – |
| since | string | – | – |
| until | string | – | – |
No examples provided.
search_notes 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.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Matches per page (default 20, capped at 100). To get more, page with offset. |
| offset | integer | – | How many matches to skip (default 0). An offset past the end returns an empty page with has_more=false, not an error. |
| order | string | – | order: "modified" (default) sorts newest-modified first — what you want to SHOW someone, but NOT safe for paging: modification date changes, so a note edited between two calls jumps to the front and… |
| query | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | Matches in THIS page |
| has_more | boolean | – | True when matches remain past this page — call again with offset = offset + count |
| next_actions | array | – | – |
| offset | integer | – | Where this page started |
| order | string | – | The ordering actually applied (modified | id) |
| query | string | – | – |
| results | array | – | – |
| total | integer | – | Matches in total, ignoring limit/offset. A LOWER BOUND, not the exact figure, when total_is_estimated is true |
| total_is_estimated | boolean | – | True 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 Search OmniFocus Tasks ~56
Searches OmniFocus tasks by name or note content.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Max matches to return (default 30). |
| query | string | yes | Text to match against task names and notes (case-insensitive). |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | – |
| query | string | – | – |
| results | array | – | – |
No examples provided.
send_email 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.
| Name | Type | Req | Description |
|---|---|---|---|
| attachments | string | – | Files to attach, as comma-separated absolute paths (e.g. a PDF). |
| bcc | string | – | BCC address(es), comma-separated. |
| body | string | – | Plain-text body. Use this OR html_body; if both are given, html_body wins. |
| cc | string | – | CC address(es), comma-separated. |
| confirm | boolean | – | Safety gate: the call only PREVIEWS (nothing is sent) unless confirm:true. Set true to actually send. |
| from | string | – | Sender address — on a multi-account Mac, selects which configured Mail.app account sends. Omit to use Mail's default account. |
| html_body | string | – | HTML body. Takes precedence over `body` when both are set. |
| subject | string | yes | Subject line. |
| to | string | yes | Recipient address(es), comma-separated for multiple. |
| Name | Type | Req | Description |
|---|---|---|---|
| from | string | – | – |
| sent | boolean | – | – |
| subject | string | – | – |
| to | string | – | – |
No examples provided.
send_message 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.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | – | Set true to actually send. Without it, returns a preview only. |
| text | string | yes | Message body to send. |
| to | string | yes | Recipient handle: phone number with country code (+14155551234) or Apple ID email. |
| Name | Type | Req | Description |
|---|---|---|---|
| error | string | – | – |
| note | string | – | – |
| preview | boolean | – | – |
| sent | boolean | – | – |
| service | string | – | – |
| text | string | – | – |
| to | string | – | – |
No examples provided.
setup_install Install LMCP ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| string | – | Optional. Helps Cloud Relay auto-connect after install. | |
| issue | string | – | Optional tag: gatekeeper_error, dot_not_green, install_failed, etc. |
| os | string | yes | macos | windows | linux | ios | android. Cloud connectors must pass os (or server asks). Desktop terminal clients may omit → macOS. macOS and Windows both get real install steps. Linux/mobile → waitl… |
| step | string | – | If stuck: connector | install | email | connecting_stuck | server_down. |
| Name | Type | Req | Description |
|---|---|---|---|
| install_command | string | – | One-line terminal command to install LMCP, when applicable to this OS/step. |
| instructions | string | yes | Full human-readable, step-by-step install/setup text. |
| os | string | – | Target operating system the instructions are for, when known. |
No examples provided.
signal_compose_guidance 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.
| Name | Type | Req | Description |
|---|---|---|---|
| chat_id | string | yes | Chat ID from signal_list_chats |
| show_send_steps | boolean | – | Set true to get the send-it-yourself steps. Default: preview only. |
| text | string | yes | Plain-text message body |
Structured output declared, but exposes no named fields.
No examples provided.
signal_connect 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 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.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Max chats to return (default 50) |
| Name | Type | Req | Description |
|---|---|---|---|
| chats | array | yes | Signal conversations |
| count | integer | – | Number of chats returned |
No examples provided.
signal_read_messages 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.
| Name | Type | Req | Description |
|---|---|---|---|
| chat_id | string | yes | Chat ID from signal_list_chats |
| limit | integer | – | Max messages to return (default 50) |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | Number of messages returned |
| messages | array | yes | Messages from the chat, chronological |
No examples provided.
signal_search_messages 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.
| Name | Type | Req | Description |
|---|---|---|---|
| chat_id | string | – | Optional chat ID to restrict search |
| limit | integer | – | Max results to return (default 50) |
| query | string | yes | Search text (case-insensitive substring match) |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | Number of results returned |
| results | array | yes | Matching messages |
No examples provided.
slack_list_channels 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.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Max channels to return (default 200) |
| workspace_id | string | – | Workspace ID from slack_list_workspaces (optional — omit to list channels across all workspaces) |
| Name | Type | Req | Description |
|---|---|---|---|
| channels | array | yes | Channels and DMs synced to the local cache |
| count | integer | yes | Number of channels returned |
No examples provided.
slack_list_workspaces 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.
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | Number of workspaces returned |
| workspaces | array | yes | Connected Slack workspaces synced to the local cache |
No examples provided.
slack_read_channel_messages 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.
| Name | Type | Req | Description |
|---|---|---|---|
| channel_id | string | yes | Channel ID from slack_list_channels |
| limit | integer | – | Max messages to return (default 50) |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | Number of messages returned |
| messages | array | yes | Recent messages from the channel, oldest first |
No examples provided.
slack_search_messages 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.
| Name | Type | Req | Description |
|---|---|---|---|
| channel_id | string | – | Optional channel ID to restrict search |
| limit | integer | – | Max results to return (default 50) |
| query | string | yes | Search text (case-insensitive substring match) |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | Number of results returned |
| note | string | – | Present when something about the answer needs stating: bodies that did not survive the reader, unresolved channel names, or a genuine zero |
| results | array | yes | Matching messages, most recent first |
No examples provided.
stocks_get_chart Stocks Get Chart ~121
Gets historical price data for a stock symbol. Range: 1d, 5d, 1mo, 3mo, 6mo, 1y, 2y, 5y, 10y, ytd, max.
| Name | Type | Req | Description |
|---|---|---|---|
| interval | string | – | Data interval (default: 1d). Intraday (1m–90m) needs a short range. |
| range | string | – | Time range (default: 1mo) |
| symbol | string | yes | Ticker symbol, e.g. AAPL |
| Name | Type | Req | Description |
|---|---|---|---|
| candles | array | – | – |
| change_pct | number | – | – |
| currency | string | – | – |
| current_price | number | – | – |
| data_points | integer | – | – |
| interval | string | – | – |
| name | string | – | – |
| range | string | – | – |
| symbol | string | – | – |
No examples provided.
stocks_get_quote 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.
| Name | Type | Req | Description |
|---|---|---|---|
| symbols | string | yes | Ticker 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 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.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Max results (default 10) |
| query | string | yes | Company name or partial ticker to search for |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | – |
| query | string | – | – |
| results | array | – | – |
No examples provided.
survey_respond 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.
| Name | Type | Req | Description |
|---|---|---|---|
| answers | object | – | Answers keyed by question id. Single/scale = a value; multiple = an array. |
| confirm | boolean | – | Set true to actually record the answers. Omit/false = preview only (nothing is stored). |
| Name | Type | Req | Description |
|---|---|---|---|
| message | string | – | – |
| ok | boolean | – | – |
| preview | boolean | – | – |
| survey | object | – | The pending survey (no-args call) — rendered by the MCP Apps card. |
No examples provided.
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.