<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Local-MCP</title>
    <description>The latest articles on DEV Community by Local-MCP (@local-mcp).</description>
    <link>https://dev.to/local-mcp</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4152404%2F0aba9e8c-1538-4f40-85da-c50eb53cc23a.png</url>
      <title>DEV Community: Local-MCP</title>
      <link>https://dev.to/local-mcp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/local-mcp"/>
    <language>en</language>
    <item>
      <title>Letting your agent read your WhatsApp, and what to watch out for</title>
      <dc:creator>Local-MCP</dc:creator>
      <pubDate>Wed, 21 Oct 2026 14:24:45 +0000</pubDate>
      <link>https://dev.to/lmcp/letting-your-agent-read-your-whatsapp-and-what-to-watch-out-for-8hb</link>
      <guid>https://dev.to/lmcp/letting-your-agent-read-your-whatsapp-and-what-to-watch-out-for-8hb</guid>
      <description>&lt;p&gt;WhatsApp is where a lot of real coordination happens, and there's no official API for personal accounts. So when people ask "can my agent just summarize the family group?", the honest answer has two parts: yes, and here's the catch.&lt;/p&gt;

&lt;p&gt;I work on LMCP, a free MCP server for Mac, and this is how its WhatsApp tools work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The catch first
&lt;/h2&gt;

&lt;p&gt;LMCP talks to WhatsApp through wacli, an open-source unofficial client that links to your account as a device, the same way WhatsApp Web does. Every WhatsApp tool in LMCP carries the same warning in its description: it uses an unofficial client, and accounts may be restricted for violating WhatsApp's terms. That's a real risk, not a formality, so decide with it in mind.&lt;/p&gt;

&lt;h2&gt;
  
  
  Linking
&lt;/h2&gt;

&lt;p&gt;Ask your agent to run &lt;code&gt;whatsapp_connect&lt;/code&gt;. It shows a QR code right in the chat (an image in desktop apps, text in a terminal). On your phone, go to Settings → Linked Devices → Link a Device and scan it. The code expires in about a minute; if you miss it, just ask again.&lt;/p&gt;

&lt;p&gt;The messages are stored locally on your Mac, and LMCP treats that store like credentials: its own file tools refuse to read it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reading and summarizing
&lt;/h2&gt;

&lt;p&gt;The flow the agent follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;whatsapp_list_chats&lt;/code&gt; to find the chat and its id (groups included)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;whatsapp_read_messages&lt;/code&gt; with that id, 50 messages by default&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;whatsapp_search_messages&lt;/code&gt; to search across chats, offline, over what's stored on the Mac&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So "summarize what the family group decided about Sunday" becomes: find the group, read the recent messages, summarize. There are no date filters on reads, so for "since yesterday" the agent reads enough recent messages and filters them itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that surprises people: history is partial
&lt;/h2&gt;

&lt;p&gt;WhatsApp history reaches the Mac gradually, and LMCP is upfront about it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reads trigger a short background sync, at most once every ten minutes per account. Aggressive automated syncing is the kind of pattern that can get a linked device logged out, so this is deliberate.&lt;/li&gt;
&lt;li&gt;The first read after new activity can be a bit stale. Reading again a few seconds later picks up what arrived.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;whatsapp_sync&lt;/code&gt; starts a full sync and returns immediately; &lt;code&gt;whatsapp_diagnose&lt;/code&gt; tells you when it's done. After linking, the first one can take minutes.&lt;/li&gt;
&lt;li&gt;If your phone shows more unread messages in a chat than the Mac has, the read result says the list is incomplete instead of pretending it isn't.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sending
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;whatsapp_send_message&lt;/code&gt; and &lt;code&gt;whatsapp_send_file&lt;/code&gt; return a preview first, showing who receives it and the text, and only send when called again with &lt;code&gt;confirm: true&lt;/code&gt;. If the chat's name can't be resolved, the preview says so rather than guessing. For an agent that runs unattended, the safer move is not giving it the send tools at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;It's free:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; &lt;span class="s1"&gt;'https://local-mcp.com/install?ref=devto-t4'&lt;/span&gt; | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Would you let an agent read your WhatsApp, or is that a line you don't cross?&lt;/p&gt;




</description>
      <category>mcp</category>
      <category>ai</category>
      <category>hermes</category>
      <category>openclaw</category>
    </item>
    <item>
      <title>Turning a logged-in dashboard into an Excel file with Claude Code</title>
      <dc:creator>Local-MCP</dc:creator>
      <pubDate>Thu, 15 Oct 2026 13:54:38 +0000</pubDate>
      <link>https://dev.to/lmcp/turning-a-logged-in-dashboard-into-an-excel-file-with-claude-code-54ff</link>
      <guid>https://dev.to/lmcp/turning-a-logged-in-dashboard-into-an-excel-file-with-claude-code-54ff</guid>
      <description>&lt;p&gt;Everyone has one of these: a dashboard behind a login, no export button worth using, and a weekly ritual of copying a table into Excel. This is how we'd hand that ritual to Claude Code with LMCP, a free MCP server for Mac I work on, including the parts that aren't obvious from the tool names.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: log in once
&lt;/h2&gt;

&lt;p&gt;The browser tools run in LMCP's own window, not your Safari or Chrome. Ask your agent to call &lt;code&gt;web_login&lt;/code&gt; with a session name and the URL, log in yourself (2FA included), and the session is saved for every run after that. The password never goes through the AI. (More on that in &lt;a href="https://dev.to/lmcp/letting-claude-code-drive-a-browser-youve-logged-into-once-2c3b"&gt;our previous post&lt;/a&gt;.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: actually getting the table
&lt;/h2&gt;

&lt;p&gt;This is the part people get wrong, including us at first. &lt;code&gt;web_extract&lt;/code&gt; takes a map of field names to CSS selectors, but it returns the &lt;strong&gt;first&lt;/strong&gt; match for each one. It's great for "the account balance" or "the report date", not for a table with 200 rows.&lt;/p&gt;

&lt;p&gt;For full tables there are two good options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;web_read&lt;/code&gt; in &lt;code&gt;text&lt;/code&gt; mode.&lt;/strong&gt; It returns the page's visible text and the model builds the rows from it. Simple, and fine for small or medium tables.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;web_eval&lt;/code&gt;.&lt;/strong&gt; It runs JavaScript in the page and returns the result as JSON, so you can ask for the table directly:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;table tbody tr&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cells&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's a power-user tool: it doesn't await async code, and it's disabled in read-only mode.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pagination isn't automatic.&lt;/strong&gt; If the table has pages, the agent clicks "Next" with &lt;code&gt;web_click&lt;/code&gt;, waits with &lt;code&gt;web_wait_for&lt;/code&gt;, and reads again. If that button submits a form, &lt;code&gt;web_click&lt;/code&gt; asks for &lt;code&gt;confirm: true&lt;/code&gt; first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: writing the Excel file
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;excel_create&lt;/code&gt; takes &lt;code&gt;headers&lt;/code&gt; and &lt;code&gt;rows&lt;/code&gt; and writes a real &lt;code&gt;.xlsx&lt;/code&gt;, natively, no Excel installed needed. A few behaviors worth knowing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It previews before writing.&lt;/strong&gt; The first call shows what will be created; the agent calls again with &lt;code&gt;confirm: true&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It won't silently overwrite.&lt;/strong&gt; If the file exists, it needs &lt;code&gt;overwrite: true&lt;/code&gt; as well, and refuses otherwise. Losing last week's file by accident isn't on the menu.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Numbers stay numbers&lt;/strong&gt;, so &lt;code&gt;SUM()&lt;/code&gt; and charts work. Strings stay text even if they look numeric, and very long numbers (IDs, phone numbers) stay text too.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One sheet, no formatting.&lt;/strong&gt; It always creates &lt;code&gt;Sheet1&lt;/code&gt;, with no styling options.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Formulas go through &lt;code&gt;excel_write_cell&lt;/code&gt;&lt;/strong&gt;, one cell per call, and anything that reaches outside the file (&lt;code&gt;WEBSERVICE&lt;/code&gt;, external links) is rejected.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you save to Desktop, Documents or Downloads, LMCP needs Full Disk Access; without it the tool tells you how to grant it instead of quietly writing somewhere else.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making it repeatable
&lt;/h2&gt;

&lt;p&gt;LMCP has recipes: you save the sequence of tool calls once, with parameters, and run it again with &lt;code&gt;recipe_run&lt;/code&gt;. One catch we'd rather you hear from us: &lt;strong&gt;a recipe step can't confirm itself&lt;/strong&gt;. Starting a recipe that changes things takes one confirmation, but individual steps that need &lt;code&gt;confirm&lt;/code&gt; (like &lt;code&gt;excel_create&lt;/code&gt;) return their preview instead of running.&lt;/p&gt;

&lt;p&gt;The pattern that works unattended is appending to a CSV with &lt;code&gt;file_write&lt;/code&gt;, which doesn't need confirmation to create a file or add rows to one. Excel opens it fine, and you get a growing history instead of a weekly overwrite.&lt;/p&gt;

&lt;p&gt;LMCP doesn't schedule anything itself. For "every Monday at 9", use your client's scheduled tasks or whatever already runs your jobs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits, honestly
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Extraction calls time out after 10 seconds, so very heavy pages may need to be read in parts.&lt;/li&gt;
&lt;li&gt;"Sign in with Google" doesn't work in LMCP's browser window.&lt;/li&gt;
&lt;li&gt;The LMCP menu bar app has to be running for the browser tools to work.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;It's free:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; &lt;span class="s1"&gt;'https://local-mcp.com/install?ref=devto-t3'&lt;/span&gt; | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or &lt;code&gt;npx -y local-mcp@latest setup&lt;/code&gt;. Restart Claude Code afterwards.&lt;/p&gt;

&lt;p&gt;What's the table you copy by hand every week?&lt;/p&gt;




</description>
      <category>ai</category>
      <category>mcp</category>
      <category>claude</category>
      <category>automation</category>
    </item>
    <item>
      <title>Giving Hermes Agent or OpenClaw access to your Mac, without handing it the keys</title>
      <dc:creator>Local-MCP</dc:creator>
      <pubDate>Tue, 13 Oct 2026 14:17:28 +0000</pubDate>
      <link>https://dev.to/lmcp/giving-hermes-agent-or-openclaw-access-to-your-mac-without-handing-it-the-keys-35o4</link>
      <guid>https://dev.to/lmcp/giving-hermes-agent-or-openclaw-access-to-your-mac-without-handing-it-the-keys-35o4</guid>
      <description>&lt;p&gt;Claude Code works when you talk to it. Hermes Agent and OpenClaw are different: they keep running, sit in Telegram or Discord, and can act on a schedule. Give one of them access to your Mail, Calendar, files and browser, and it stops being a chat window and starts being something that does work while you're away.&lt;/p&gt;

&lt;p&gt;That's also exactly the setup where you want to think about permissions before anything else. I work on LMCP, a free MCP server for Mac with 190+ tools, and this is how I'd wire it into either agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Connecting Hermes
&lt;/h2&gt;

&lt;p&gt;If Hermes was installed with its official installer, the LMCP installer configures it for you: it adds a &lt;code&gt;local-mcp&lt;/code&gt; entry under &lt;code&gt;mcp_servers&lt;/code&gt; in &lt;code&gt;~/.hermes/config.yaml&lt;/code&gt;. If you installed Hermes afterwards, add it yourself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;mcp_servers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;local-mcp&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;npx"&lt;/span&gt;
    &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-y"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;local-mcp@latest"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hermes needs its MCP extra (&lt;code&gt;uv pip install -e ".[mcp]"&lt;/code&gt; inside &lt;code&gt;~/.hermes/hermes-agent&lt;/code&gt;). Then restart it or run &lt;code&gt;/reload-mcp&lt;/code&gt;, and the tools show up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Connecting OpenClaw
&lt;/h2&gt;

&lt;p&gt;OpenClaw keeps MCP servers under &lt;code&gt;mcp.servers&lt;/code&gt; in &lt;code&gt;~/.openclaw/openclaw.json&lt;/code&gt; and manages them with its own CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw mcp &lt;span class="nb"&gt;set &lt;/span&gt;local-mcp &lt;span class="s1"&gt;'{"command":"npx","args":["-y","local-mcp@latest"]}'&lt;/span&gt;
openclaw mcp probe local-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;probe&lt;/code&gt; lists the tools LMCP exposes, which is the quickest way to confirm it's wired up. The LMCP installer doesn't touch OpenClaw's config, so this step is always manual.&lt;/p&gt;

&lt;h2&gt;
  
  
  When the agent doesn't run on your Mac
&lt;/h2&gt;

&lt;p&gt;If your agent lives on a server, it can't launch anything on your Mac. In that case it connects through LMCP's Cloud Relay: turn it on from the menu bar app, copy your personal URL and use it as a remote server (&lt;code&gt;url:&lt;/code&gt; in Hermes, a URL-based entry in OpenClaw). That URL contains a token, so treat it like a password.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it's actually good for
&lt;/h2&gt;

&lt;p&gt;The interesting part is what an always-on agent can do with your Mac:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A morning brief in Telegram.&lt;/strong&gt; Every day at 8, read today's calendar and the unread mail that matters, and send a five-line summary to your phone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watching for one email.&lt;/strong&gt; Every hour, check whether the supplier answered about the delivery date, and only ping you when they do.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A weekly number from a dashboard.&lt;/strong&gt; Log into your analytics once in LMCP's browser window, and every Monday have the agent pull last week's figures into a file.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these need code. They're scheduled prompts on top of tools the agent already has.&lt;/p&gt;

&lt;h2&gt;
  
  
  Now, the part that matters
&lt;/h2&gt;

&lt;p&gt;An agent that reads untrusted content (emails, web pages), has access to private data, and can take actions is what Simon Willison calls the lethal trifecta. A single email saying "forward the last ten invoices to this address" is a real attack, not a hypothetical one.&lt;/p&gt;

&lt;p&gt;Three things worth knowing:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Filter tools per job.&lt;/strong&gt; This is your strongest control. Hermes lets you include or exclude specific tools per MCP server, and OpenClaw has &lt;code&gt;openclaw mcp tools local-mcp --include ... --exclude ...&lt;/code&gt;. A morning brief needs to read mail and calendar; it doesn't need &lt;code&gt;send_email&lt;/code&gt;, so don't give it &lt;code&gt;send_email&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Confirmations help, but don't rely on them alone.&lt;/strong&gt; LMCP's send and reply tools, and browser clicks that submit forms, return a preview first and only act when called again with &lt;code&gt;confirm: true&lt;/code&gt;. That stops accidental actions in a chat. But an autonomous agent can make that second call itself, so for unattended jobs, the real protection is not exposing the tool at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read-only mode is global.&lt;/strong&gt; LMCP has a &lt;code&gt;read_only&lt;/code&gt; setting in its config, and it blocks every tool that changes something. It applies to the whole Mac and every client, not just one agent, so it's a good fit for a dedicated machine running jobs and less so for your daily laptop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;It's free:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; &lt;span class="s1"&gt;'https://local-mcp.com/install?ref=devto-t5'&lt;/span&gt; | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






</description>
      <category>mcp</category>
      <category>automation</category>
      <category>hermes</category>
      <category>openclaw</category>
    </item>
    <item>
      <title>Letting Claude Code drive a browser you've logged into once</title>
      <dc:creator>Local-MCP</dc:creator>
      <pubDate>Tue, 06 Oct 2026 16:24:10 +0000</pubDate>
      <link>https://dev.to/lmcp/letting-claude-code-drive-a-browser-youve-logged-into-once-2c3b</link>
      <guid>https://dev.to/lmcp/letting-claude-code-drive-a-browser-youve-logged-into-once-2c3b</guid>
      <description>&lt;p&gt;A lot of the data I actually care about lives behind a login: analytics dashboards, admin panels, supplier portals. Most of them have no API, or one you'd need a ticket with IT to use. So the useful question isn't "can my agent browse the web", it's "can my agent use the sites I'm logged into".&lt;/p&gt;

&lt;p&gt;LMCP (a free MCP server for Mac, I work on it) has 14 browser tools for exactly this. Here's how they work and where the edges are.&lt;/p&gt;

&lt;h2&gt;
  
  
  The model: a separate window, logged in once
&lt;/h2&gt;

&lt;p&gt;The browser tools don't touch your Safari or Chrome. LMCP runs its own browser window (WebKit), and that window starts signed out on purpose, so your real browser's cookies are never used.&lt;/p&gt;

&lt;p&gt;Sessions are named. The first time, your agent calls &lt;code&gt;web_login&lt;/code&gt; with a name like &lt;code&gt;analytics&lt;/code&gt; and the URL. A window opens on your Mac and you log in yourself, password and 2FA included. The password never goes through the tool or the AI. From then on, that session is saved to disk and survives restarts, and every other tool can reuse it by name.&lt;/p&gt;

&lt;h2&gt;
  
  
  A real flow from Claude Code
&lt;/h2&gt;

&lt;p&gt;First run:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Use LMCP to log me into analytics.example.com in a session called "analytics".&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You log in in the window that pops up. After that, the actual work:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In the "analytics" session, go to the weekly report page, extract the table with date, visits and signups, and save it as a CSV on my Desktop.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Under the hood that's roughly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;web_navigate&lt;/code&gt; to the page, reusing the saved login&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;web_read&lt;/code&gt; with &lt;code&gt;mode: "a11y"&lt;/code&gt; to get a compact map of links, buttons and fields, which is much cheaper than raw HTML&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;web_extract&lt;/code&gt; with a field-to-CSS-selector map to pull the rows as structured data&lt;/li&gt;
&lt;li&gt;Claude Code writes the CSV itself&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next week you just ask again. No login, no copy-paste.&lt;/p&gt;

&lt;p&gt;The other tools fill in the gaps: &lt;code&gt;web_find&lt;/code&gt; locates elements by selector or visible text, &lt;code&gt;web_click&lt;/code&gt; and &lt;code&gt;web_type&lt;/code&gt; interact, &lt;code&gt;web_wait_for&lt;/code&gt; polls until something appears instead of sleeping blindly, &lt;code&gt;web_screenshot&lt;/code&gt; gives the model a look, and &lt;code&gt;web_session_list&lt;/code&gt; shows what's saved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Guardrails worth knowing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Submitting is gated.&lt;/strong&gt; If &lt;code&gt;web_click&lt;/code&gt; hits a button that submits a form, it returns a preview and asks the agent to call again with &lt;code&gt;confirm: true&lt;/code&gt;. &lt;code&gt;web_type&lt;/code&gt; never submits on its own.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read-only mode.&lt;/strong&gt; Set &lt;code&gt;LMCP_READ_ONLY=1&lt;/code&gt; (or &lt;code&gt;read_only&lt;/code&gt; in the config) and every tool that can change something is blocked, &lt;code&gt;web_eval&lt;/code&gt; included. Nice for unattended jobs that should only read.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deleting a session&lt;/strong&gt; wipes its cookies and site data, and also asks for confirmation first.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The honest limitations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"Sign in with Google" doesn't work in this window.&lt;/strong&gt; Google blocks its sign-in flow in embedded browsers. LMCP detects it and suggests the email + one-time code option instead, if the site has one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Captchas and 2FA are yours.&lt;/strong&gt; The agent calls &lt;code&gt;web_show&lt;/code&gt;, the window comes to the front, you solve it, and the agent carries on with the session intact.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One tab per session.&lt;/strong&gt; Pop-ups and new tabs load in the same view.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The LMCP menu bar app has to be running&lt;/strong&gt;, since that's where the browser lives.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Terms of service.&lt;/strong&gt; Automating some sites (LinkedIn, Instagram) can break their rules. That risk is on you, and the tool says so.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;It's free:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; &lt;span class="s1"&gt;'https://local-mcp.com/install?ref=devto-t2'&lt;/span&gt; | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or &lt;code&gt;npx -y local-mcp@latest setup&lt;/code&gt;. Restart Claude Code afterwards. One tip from testing: if you also have other browser tools connected, say "use LMCP" in the prompt, otherwise the model may quietly pick a different one.&lt;/p&gt;

&lt;p&gt;What's the site you'd automate first?&lt;/p&gt;




</description>
      <category>mcp</category>
      <category>claude</category>
      <category>automation</category>
      <category>ai</category>
    </item>
    <item>
      <title>We built a free MCP server that lets Claude Code use the apps on your Mac</title>
      <dc:creator>Local-MCP</dc:creator>
      <pubDate>Fri, 02 Oct 2026 14:49:07 +0000</pubDate>
      <link>https://dev.to/lmcp/we-built-a-free-mcp-server-that-lets-claude-code-use-the-apps-on-your-mac-k0l</link>
      <guid>https://dev.to/lmcp/we-built-a-free-mcp-server-that-lets-claude-code-use-the-apps-on-your-mac-k0l</guid>
      <description>&lt;p&gt;Quick version: LMCP is a Mac app that turns the apps you already use into tools your AI can call. Install it once and Claude Desktop, Claude Code, Cursor, Codex and other MCP clients can work with Mail, Calendar, Teams, Slack, WhatsApp, iMessage, Outlook, OneDrive, Google Drive, Zoom, Office files, your browser and your terminal. That's 190+ tools, and most of them work without connecting a single account.&lt;/p&gt;

&lt;p&gt;Why we built it&lt;/p&gt;

&lt;p&gt;If you've wired MCP servers by hand, you know the drill. One server per app, an API key here, an OAuth app registration there, and for anything Microsoft, a trip to your IT admin for consent. Meanwhile all that data is already sitting on your machine, inside apps you're logged into.&lt;/p&gt;

&lt;p&gt;So we built one install that reaches what's already there.&lt;/p&gt;

&lt;p&gt;How it works, briefly&lt;/p&gt;

&lt;p&gt;The MCP server runs on your Mac and the tools execute there. Where it can, LMCP uses what the apps already keep locally instead of going through cloud APIs. Teams is the fun example: instead of Microsoft Graph, we read the local cache the Teams app keeps on disk, so there's no Azure app to register and no admin consent to chase.&lt;/p&gt;

&lt;p&gt;The installer finds the AI apps you have and configures them for you. If you use Claude Code, it's just there the next time you start a session.&lt;/p&gt;

&lt;p&gt;What people actually do with it&lt;/p&gt;

&lt;p&gt;A few things that work well from Claude Code or Codex:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Open our analytics dashboard, grab this week's numbers and put them in a spreadsheet." The browser tools use your existing logged-in sessions, so no credentials to hand over.&lt;/li&gt;
&lt;li&gt;"Summarize what happened in the #launch Slack channel since Monday."&lt;/li&gt;
&lt;li&gt;"Find last week's invoice PDF in my Downloads and pull the totals into an Excel file."&lt;/li&gt;
&lt;li&gt;"What's on my calendar tomorrow, and is there anything in my inbox I should read before those meetings?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The fun part is chaining. Once your agent can read mail, check your calendar and drive the browser, small workflows you'd never bother scripting become one prompt.&lt;/p&gt;

&lt;p&gt;Turning it into automations&lt;/p&gt;

&lt;p&gt;Where it gets interesting is when you stop typing the prompt every time.&lt;/p&gt;

&lt;p&gt;LMCP has recipes: you save a multi-step workflow once ("every morning, pull new orders from the dashboard, add them to the sheet, flag anything unusual") and run it again whenever you want. And since Claude Code and Codex can run without you sitting there, you can hook those workflows into a script or a scheduled job. Your Mac does the clicking, the agent does the thinking.&lt;/p&gt;

&lt;p&gt;Some of the heaviest setups we've seen look less like "a person chatting with Claude" and more like small pipelines running on their own: scraping a few sites, checking a couple of inboxes, writing the results somewhere useful.&lt;/p&gt;

&lt;p&gt;What it doesn't do&lt;/p&gt;

&lt;p&gt;Worth being upfront about this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tools run on your Mac, but your AI provider still sees whatever you ask it to read. LMCP doesn't make Claude or ChatGPT local.&lt;/li&gt;
&lt;li&gt;It doesn't bypass app permissions or company policies.&lt;/li&gt;
&lt;li&gt;Web AIs like claude.ai or ChatGPT can use it through an optional cloud connector, which is off by default. Desktop and CLI clients don't need it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Try it&lt;/p&gt;

&lt;p&gt;It's free. If you're comfortable with a shell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; &lt;span class="s1"&gt;'https://local-mcp.com/install?ref=devto-g1'&lt;/span&gt; | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or &lt;code&gt;npx -y local-mcp@latest setup&lt;/code&gt;, or the signed installer at &lt;a href="https://local-mcp.com/download?ref=devto-g1" rel="noopener noreferrer"&gt;local-mcp.com&lt;/a&gt;. Restart your AI client afterwards, since MCP tools load at startup.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>claude</category>
      <category>swift</category>
    </item>
    <item>
      <title>How we read Microsoft Teams messages without touching the Graph API</title>
      <dc:creator>Local-MCP</dc:creator>
      <pubDate>Wed, 30 Sep 2026 13:41:15 +0000</pubDate>
      <link>https://dev.to/lmcp/how-we-read-microsoft-teams-messages-without-touching-the-graph-api-2ff9</link>
      <guid>https://dev.to/lmcp/how-we-read-microsoft-teams-messages-without-touching-the-graph-api-2ff9</guid>
      <description>&lt;p&gt;Quick context if you haven't played with MCP yet: MCP (Model Context Protocol) is the standard that lets AI assistants like Claude use tools, things like "search my email" or "read this file". An MCP server is the thing that exposes those tools. I work on LMCP, a free MCP server for Mac that connects Claude, Cursor, Codex and friends to the apps you already use.&lt;/p&gt;

&lt;p&gt;Teams was the integration that gave us the most headaches, and the way we ended up solving it is kind of fun, so here it goes.&lt;/p&gt;

&lt;p&gt;The annoying part about Graph&lt;/p&gt;

&lt;p&gt;If you want Teams data in an AI assistant, the "official" way is Microsoft Graph. Which means: register an app in Entra ID, get admin consent, deal with OAuth tokens, respect rate limits.&lt;/p&gt;

&lt;p&gt;That's fine if you run the tenant. But if you're just a regular person at a company where IT owns everything? You're stuck at "please ask your administrator" and that's the end of it.&lt;/p&gt;

&lt;p&gt;The trick: Teams is secretly a website&lt;/p&gt;

&lt;p&gt;New Teams isn't really a native app. It's a web app running inside WebView2, which is basically Microsoft's embedded Edge. And like any website running in a Chromium browser, it saves its data in IndexedDB. Chromium stores IndexedDB on disk as LevelDB.&lt;/p&gt;

&lt;p&gt;So all your synced chats are already sitting on your Mac, here:&lt;/p&gt;

&lt;p&gt;~/Library/Containers/com.microsoft.teams2/Data/Library/Application Support/Microsoft/MSTeams/EBWebView/WV2Profile_tfw*/IndexedDB/https_teams.microsoft.com_0.indexeddb.leveldb&lt;/p&gt;

&lt;p&gt;Heads up if you go digging: lots of older posts point to &lt;code&gt;EBWebView/Default/&lt;/code&gt;. That's outdated. Current builds create one folder per profile. The &lt;code&gt;tfw&lt;/code&gt; ones are work/school accounts, and there's a &lt;code&gt;tfl&lt;/code&gt; one for personal Teams that we just skip.&lt;/p&gt;

&lt;p&gt;Actually reading the thing&lt;/p&gt;

&lt;p&gt;LevelDB full of V8-serialized JavaScript objects is not something you want to parse by hand. Luckily there's &lt;a href="https://github.com/cclgroupltd/ccl_chromium_reader" rel="noopener noreferrer"&gt;ccl_chromium_reader&lt;/a&gt;, a Python library that comes from the digital forensics world (yes, the people who pull evidence out of browsers). It walks the LevelDB files, decodes the V8 objects and rebuilds the IndexedDB records. From there we grab chats, channels, messages and people.&lt;/p&gt;

&lt;p&gt;Some stuff we learned the hard way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Teams locks the database while it's running.&lt;/strong&gt; We read the table files directly without grabbing the lock, so you don't have to close Teams.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Some records just refuse to decode.&lt;/strong&gt; We skip them and keep a count, instead of blowing up the whole read.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Big accounts, big databases.&lt;/strong&gt; The first read can take a bit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiple work profiles?&lt;/strong&gt; We read all of them and merge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The schema moves around between Teams versions.&lt;/strong&gt; Honestly this is the real pain. Every update might shuffle something and we have to go chase it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What it looks like in practice&lt;/p&gt;

&lt;p&gt;You ask Claude "what happened in #engineering today?" or "find the message where someone shared the deploy checklist", and it answers from what's already on your machine. No Graph permissions, no Microsoft login dance.&lt;/p&gt;

&lt;p&gt;One thing people always ask: sending messages is a different story. That part does go through Graph, so you need to connect your Microsoft 365 account for it.&lt;/p&gt;

&lt;p&gt;The honest limitations&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It only sees what your Teams client has already synced. If Teams didn't pull a chat down, we can't see it either.&lt;/li&gt;
&lt;li&gt;It depends on an undocumented format, so a Teams update can break it until we catch up.&lt;/li&gt;
&lt;li&gt;You need the Teams desktop app installed and signed in.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Wanna try it?&lt;/p&gt;

&lt;p&gt;It's free:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; &lt;span class="s1"&gt;'https://local-mcp.com/install?ref=devto'&lt;/span&gt; | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or &lt;code&gt;npx -y local-mcp@latest setup&lt;/code&gt; if you prefer npm. There's a longer walkthrough &lt;a href="https://local-mcp.com/guides/claude-teams-no-api?ref=devto" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you've tried reading other Electron or WebView apps this way, I'd love to hear how it went. Happy to answer questions in the comments.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>claude</category>
      <category>ai</category>
      <category>swift</category>
    </item>
  </channel>
</rss>
