Local SEO by WorkPods

ai.workpods由 workpods.ai 发布v1.0.1更新于 Nov 7, 2026

Audit Google Business Profiles, reviews and Maps rankings, and check a site's NAP and schema.

发布方自己的服务:Agent Ready Website Audit

概览

AI 生成的概览

通过配套的 Chrome 扩展审计 Google 商家资料、评论、帖子和地图排名,并检查网站 NAP 与结构化数据。

可以做什么
  • 在 Google 地图上查找商家,取得 placeId 或 cid 供其他工具使用
  • 审计 Google 商家资料并给出 0-100 评分,对比历史快照查看变化
  • 读取并分析评论和帖子,包括发帖频率与评论趋势
  • 读取某次搜索的地图结果,并排比较 2 至 10 个商家,推荐类目
  • 检查单个地点的排名,或围绕中心点按网格检查一片区域的排名
  • 核对网站上的名称、地址、电话、营业时间与商家资料是否一致,并检查 LocalBusiness 结构化数据、一键拨号和嵌入地图
适用场景
适合本地 SEO 工作:审计 Google 商家资料、诊断商家在某个地点为何搜不到、与竞争对手对比,或核对网站与商家资料的 NAP 一致性。它只读取数据,不会向 Google 发布更改。
运行要求
需要 Node.js 22 或更高版本,通过 npx 以 stdio 运行。多数工具需要安装 Local SEO Chrome 扩展并与本地桥接配对,且保持 Chrome 打开;网站检查也可在 Node 中不依赖扩展运行。无需 WorkPods 账号。可选的付费数据源使用用户自己的账号,密钥保存在扩展中。
安装前请注意
部分工具会通过用户自己的 DataForSEO 账号产生费用,例如每 10 条评论约 0.0015 美元、每个网格点约 0.002 美元。扩展配对码应妥善保密。基于浏览器的读取可能不完整,结果中会说明这些限制。AI 可见性工具会在用户已登录的浏览器会话中提问。与 Google 无关联。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Local SEO by WorkPods,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

@workpods/local-seo

Local MCP server and CLI that pairs with the Local SEO browser extension to audit Google Business Profiles and check Google Maps rankings.

Install the extension

Install Local SEO from the Chrome Web Store.

Profile, review, post, and Maps ranking tools need the extension. The website check can also run in Node without it.

Quick start

Requires Node.js 22 or later. Print the installed package version:

bash
npx -y @workpods/local-seo --version

Check a website against a business's name, address, and phone:

bash
npx -y @workpods/local-seo audit-website https://example.com/ \  --name "Example Business" --phone "+1 415-555-0100" --address "123 Example St"

The command prints a Markdown report and exits with code 1 if a high-severity check fails or partly fails. Facts you leave out are not compared. Running npx -y @workpods/local-seo without a subcommand prints usage and exits with code 2.

Use from an AI agent

For Claude Code:

bash
claude mcp add local-seo -- npx -y @workpods/local-seo mcp

For Cursor (~/.cursor/mcp.json) or Claude Desktop (claude_desktop_config.json), add this to the client's MCP settings:

json
{  "mcpServers": {    "local-seo": {      "command": "npx",      "args": ["-y", "@workpods/local-seo", "mcp"]    }  }}

Pair the extension with this computer's bridge:

bash
npx -y @workpods/local-seo pair

Enter the code in the extension's Settings → Agent connection, and enable Connect to the local bridge when it runs. Keep Chrome open while the agent works. The client starts the local server over stdio. Keep the pairing code private.

See agent setup for Codex, skills, and Firefox origin configuration.

What it can do

  • Profiles: audit a Google Business Profile and report findings and suggested fixes.
  • Reviews and posts: read reviews and posts, then summarize review trends and posting activity. Browser reads can be incomplete; the result reports those limits.
  • Local competitors: read Maps search results and compare businesses and categories.
  • Rankings: check a business's position from one point or across a grid of locations.
  • Website checks: compare the site's name, address, and phone with the profile, and inspect LocalBusiness schema, a click-to-call link, and an embedded map.
  • AI answers: collect answers about local businesses from supported assistants through the extension, using browser tabs or an optional provider.
  • Categories and history: suggest categories and compare saved profile snapshots to show what changed. The tools read profiles; they do not publish changes to Google.

No WorkPods account is required. Optional providers use your own accounts and may charge for usage. Keys stay in the extension; the MCP server returns results and does not receive those keys.

Links

Local SEO by WorkPods · Source code · Privacy policy · CLI documentation · Apache-2.0 license

Built by WorkPods. Written by Shefali Munjal. See LICENSE and NOTICE for licensing and attribution. Not affiliated with or endorsed by Google.

来源:bridge/README.md,提交 035d49d

工具

12

find_business

Find a business

Searches Google Maps for a business by name, or for a kind of business, and lists the places Maps shows. Use it first when the user names a business, to get an exact placeId or cid to pass as business to the other tools; if several candidates fit, ask the user which one. It works in the user's own Chrome through the Local SEO extension, opening Google Maps in a background tab, and fails with a message saying how to connect when the extension is not connected. Nothing is written to Google. Returns query, from (the point searched from, null when Maps chose) and candidates. Each result has position (1-based, ads not counted), sponsored, name, ids (placeId, cid, kgId, featureId, each null when Maps did not expose it), primaryCategory, rating, reviewCount, address and location (the place pin {lat, lng}), each null when the list did not show it.

输入参数nearquery必填

audit_profile

Audit a Business Profile

Audits one Google Business Profile against every Local SEO check: profile basics, categories, description, services and attributes, photos, reviews, posts, the linked website and trust signals, with a 0-100 score. Use it for a profile audit or to confirm a fix. include picks what is read beyond the profile; keyword adds the relevance checks and is the competitor search. It works in the user's own Chrome through the Local SEO extension, opening Google Maps in a background tab, and fails with a message saying how to connect when the extension is not connected. Nothing is written to Google. It can take a few minutes. Returns business (the full profile record), findings, score (an object: score, 0-100, or null when no check could be judged; judged, the number of checks judged; untested, the number not_applicable), fixes (checkId, title, severity, fix; most important first), reportMarkdown (the whole audit as a readable report) and notes on what was not read, including when Maps showed the page in a language other than English, which leaves some fields missing. The audit reads posts in the browser, which sees only the newest one, so the posting checks (L26 to L29) are not_applicable with the reason; read_posts with source dataforseo reads them all. When Maps keeps its own "Most relevant" review order, a note says so and the recency checks (L22 recent reviews, L24 reply speed, L25 recent unanswered negatives unless one was found) are not_applicable. Each finding has checkId (a Local SEO check id such as L7), group, status (pass, partial, fail or not_applicable), severity (high, medium or low on a fail or partial, null otherwise), a one-sentence summary and evidence (url, value, note). not_applicable means the check could not be judged, never that it passed or failed. A profile field the page or provider did not give is {missing: true, reason}; with absent: true it means Google was read and lists nothing there (no phone on the profile), which is a real gap, while without i

输入参数includekeywordbusiness必填

read_reviews

Read reviews

Reads a business's Google reviews and analyses them. Use it for review strategy, reply drafting or to judge review velocity. source picks free browser reading or paid DataForSEO, which is faster for large reads: about $0.0015 per 10 reviews. With source dataforseo it spends from the user's own DataForSEO account inside the extension, within the monthly cap set there; a call over the cap, or with no cap set, is refused with an error saying so, and the same request within the cache window the user set in the extension (7 days unless changed) is served from the cache for nothing. spend says what was charged (null when nothing paid was called). The agent never sees the key. Returns business (name, source, readAt, placeId, cid, primaryCategory, address, phone, website, rating, reviewCount; each null when unknown); reviews, one page of at most 100 (id, rating, text, publishedAt ISO or null, relativeAge as shown, ownerReply or null, authorReviewCount, photoCount); analytics over every review read (count, averageRating, distribution by star, monthly trend, velocity in the last 30, 90 and 365 days or null when no review is dated, responses with reply rate and median reply days, unansweredNegatives, photoShare and themes); read (how many were read); order (newest: newest first; most_relevant: the browser could not set Maps' Newest sort, so the reviews are Maps' "Most relevant" sample, which can skip recent ones; do not judge velocity, reply speed or recent negatives from it); truncated (true when the read holds fewer than the profile has, or stopped at max when the profile count is unknown); notes (why fewer were read or why the order is not newest, such as Google's signed-out view showing about five, only the Overview's reviews when the Reviews tab did not open, or Maps shown in a language other than English, which can leave the order unset; empty when nothing to say); and nextCursor: when not null, call again with it as cursor for the next page of the same read. A null rate

输入参数maxcursorsourcebusiness必填

read_posts

Read posts

Reads a business's Google posts (Updates, offers and events), newest first, and analyses how often the owner posts. Use it to judge posting cadence or before planning posts. source picks free browser reading, which sees only the newest post Maps shows on the profile's Overview, or paid DataForSEO, which reads the full list: about $0.003 per read plus $0.0015 per 10 posts. With source dataforseo it spends from the user's own DataForSEO account inside the extension, within the monthly cap set there; a call over the cap, or with no cap set, is refused with an error saying so, and the same request within the cache window the user set in the extension (7 days unless changed) is served from the cache for nothing. spend says what was charged (null when nothing paid was called). The agent never sees the key. Returns business (name, source, readAt, placeId, cid, primaryCategory, address, phone, website, rating, reviewCount; each null when unknown); posts (text, publishedAt or null, relativeAge, hasMedia, link, kind: update, offer, event or unknown); analytics (count, lastPostAgeDays, last30, last90, medianIntervalDays, gaps of over 30 days, mediaShare, linkShare, kinds; a null figure means no dated post supports it); truncated (always true from the browser); and unknown. unknown is null only when the full list was read (source dataforseo), and then an empty list is a real finding: the profile has no posts. From the browser unknown is always a sentence saying why (only the newest post was seen, or Google's signed-out view hid them): how often the business posts is unknown, not zero; say so, and offer source dataforseo.

输入参数maxsourcebusiness必填

local_scan

Scan local results

Reads the Google Maps results for a search from a point and lays them out side by side, with how often each category is used. Use it to see who wins a local search and why, or to find competitors. withDetails opens each profile for the fields the result list does not show. It works in the user's own Chrome through the Local SEO extension, opening Google Maps in a background tab, and fails with a message saying how to connect when the extension is not connected. Nothing is written to Google. Returns results (surface, query, from, readAt and the ranked list), rows (position, sponsored, name, ids, primaryCategory, secondaryCategories, rating, reviewCount, photoCount, website, phone, claimed, address, distanceKm from the point searched from, straight line to one decimal; each null when not read or not known), categoryFrequency (category, usedBy, asPrimary, share 0-1 of rows with known categories), detailsRead and truncated (stopped at max while Maps had more). Each result has position (1-based, ads not counted), sponsored, name, ids (placeId, cid, kgId, featureId, each null when Maps did not expose it), primaryCategory, rating, reviewCount, address and location (the place pin {lat, lng}), each null when the list did not show it.

输入参数maxnearquery必填withDetails

rank_at

Rank from a point

Runs one Maps search as if the customer stood at a point (Teleport) and says where the business ranks there. Use it to check one location, such as a customer complaint ("I can't find you from the station"); use geo_grid for an area. It works in the user's own Chrome through the Local SEO extension, opening Google Maps in a background tab, and fails with a message saying how to connect when the extension is not connected. Nothing is written to Google. Returns at, zoom, rank and results, the top 20 at that point. A rank is {kind: "ranked", rank}, {kind: "not_found", depth} (the list was read to depth organic results, as many as Maps listed up to the cap, and the business was not there, which is not rank 0), or {kind: "unknown", reason} (the point could not be read, or Maps cut its list short, so the business may sit just past it). Each result has position (1-based, ads not counted), sponsored, name, ids (placeId, cid, kgId, featureId, each null when Maps did not expose it), primaryCategory, rating, reviewCount, address and location (the place pin {lat, lng}), each null when the list did not show it.

输入参数at必填zoomquery必填business必填

geo_grid

Geo-grid rank map

Maps where a business ranks across an area: a size x size grid of points spacingKm apart around center, one Maps search from each. Use it for rank diagnosis by distance. The browser source is free but slow and capped at 5x5; dataforseo allows up to 13x13 at $0.002 per point (a 7x7 grid is about $0.10). Call it first with estimateOnly true to get the price for the user to approve. With source dataforseo it spends from the user's own DataForSEO account inside the extension, within the monthly cap set there; a call over the cap, or with no cap set, is refused with an error saying so, and the same request within the cache window the user set in the extension (7 days unless changed) is served from the cache for nothing. spend says what was charged (null when nothing paid was called). The agent never sees the key. A large browser grid can take 10 minutes. Returns source, depth (results read at each point), cells (point with row, col, lat, lng; and rank), summary (points, ranked, notFound, unknown, averageRank over ranked points or null, top3Share of read points or null, best), estimatedCostUsd (null for browser) and spend. With estimateOnly, cells is empty and summary null. A rank is {kind: "ranked", rank}, {kind: "not_found", depth} (the list was read to depth organic results, as many as Maps listed up to the cap, and the business was not there, which is not rank 0), or {kind: "unknown", reason} (the point could not be read, or Maps cut its list short, so the business may sit just past it).

输入参数size必填zoomquery必填center必填sourcebusiness必填spacingKm必填estimateOnly

category_ideas

Category ideas

Finds the Google Business Profile categories that the top-ranking competitors use, how often, and which of them the business lacks. Use it to choose a primary category and secondary categories. Give business, query or both: with only a business, its primary category is the search. The top 8 competitors' profiles are opened one at a time in a background tab for their secondary categories, so it takes about a minute. It works in the user's own Chrome through the Local SEO extension, opening Google Maps in a background tab, and fails with a message saying how to connect when the extension is not connected. Nothing is written to Google. The category counts are read from Maps for free; searchVolumes adds paid DataForSEO search volumes for each category name (one keyword task, about $0.012 plus $0.00012 per category). With source dataforseo it spends from the user's own DataForSEO account inside the extension, within the monthly cap set there; a call over the cap, or with no cap set, is refused with an error saying so, and the same request within the cache window the user set in the extension (7 days unless changed) is served from the cache for nothing. spend says what was charged (null when nothing paid was called). The agent never sees the key. Returns query, competitorsRead, categories (category, usedBy, asPrimary, share 0-1), missing (null when no business was given), volumes (category, monthlySearches or null when unknown, in the business's country, or the United States when its address names no country or no business was given; volumes itself is null unless searchVolumes was asked for and a key is set) and spend.

输入参数nearquerybusinesssearchVolumes

check_website_nap

Check website NAP

Checks whether a business's website states the same name, address, phone and hours as its Google profile, and whether it has LocalBusiness schema, a click-to-call link and an embedded map. Use it for NAP consistency or to check a location page. With business, the extension reads the profile from Maps and checks the website it links unless url is given. Without the extension, pass url and profile (name, and phone and address if known) and the page is fetched from this computer instead, without running its JavaScript. Returns website (url; name, address, phone and hours each with status match, mismatch, not_found (the site does not state it) or profile_missing (nothing to compare), the profile value and what the site states; localSchema with types and missing fields, or null when the page has no LocalBusiness schema; telLinks; embeddedMap), findings (checks L30 to L35), profileFrom (maps or arguments) and notes. Each finding has checkId (a Local SEO check id such as L7), group, status (pass, partial, fail or not_applicable), severity (high, medium or low on a fail or partial, null otherwise), a one-sentence summary and evidence (url, value, note). not_applicable means the check could not be judged, never that it passed or failed.

输入参数urlprofilebusiness

compare_businesses

Compare businesses

Lays 2 to 10 Google Business Profiles side by side and measures how far the first falls behind the rest. Use it when the user names their competitors; use local_scan to find who actually ranks. keyword adds each business's Maps rank. It works in the user's own Chrome through the Local SEO extension, opening Google Maps in a background tab, and fails with a message saying how to connect when the extension is not connected. Nothing is written to Google. Returns rows in the order given (position is that order; name, ids, categories, rating, reviewCount, photoCount, website, phone, claimed, address; each null when unknown), gap (competitors, missingCategories, primarySharedBy, and reviews, rating and photos each as target, competitorMedian, difference and known, null where a side is unknown; and summary sentences) and ranks (null without keyword). A rank is {kind: "ranked", rank}, {kind: "not_found", depth} (the list was read to depth organic results, as many as Maps listed up to the cap, and the business was not there, which is not rank 0), or {kind: "unknown", reason} (the point could not be read, or Maps cut its list short, so the business may sit just past it).

输入参数keywordbusinesses必填

profile_history

Profile history

Lists what the extension saved each time it read this profile in the past, and what changed between reads: name, categories, address, phone, website, hours, description, rating, review and photo counts, claimed state and closure. Use it to spot a suspended or edited profile, or a competitor changing its name or category. History comes from the extension storage, so a profile never read before has none. An id or link this device has seen answers without reading Google; given {name, city}, a short link, or an id the extension has not seen, Maps is opened once to learn the business's ids first. Returns snapshots (readAt and a summary, oldest first) and changes (field, before, after, from, to). A profile field the page or provider did not give is {missing: true, reason}; with absent: true it means Google was read and lists nothing there (no phone on the profile), which is a real gap, while without it the value is simply unknown. Never treat either as 0.

输入参数business必填

local_ai_visibility

Local AI visibility

Asks AI assistants a local buyer question, "best <query> in <city>", and reads whether each answer names the business. Use it to measure local AI visibility against competitors. source assist (the default, free) asks in the user's own signed-in browser sessions, and an engine the user is not signed in to comes back missing. source cloro asks ChatGPT, Gemini and AI Mode unattended through the user's Cloro key: about $0.014 for chatgpt and $0.012 each for gemini and ai_mode; call it first with estimateOnly true to get the price for the user to approve. A cloro run over the monthly cap, or with no key or cap set, is refused with an error saying so. Perplexity is always asked in assist mode. It works in the user's own Chrome through the Local SEO extension, opening Google Maps in a background tab, and fails with a message saying how to connect when the extension is not connected. Nothing is written to Google. Returns prompt, source, estimatedCostUsd (null for assist) and answers (empty with estimateOnly), one per engine: engine, and answer, either {missing: true, reason} or verdict (recommended when among the first three businesses named, named when later, absent), position (1-based among businesses named, null when absent), excerpt (the passage naming it, or the opening when absent), businessesNamed, competitorsNamed and citedUrls. One run is one sample; answers change between runs.

输入参数city必填query必填sourceenginescompetitorsbusinessName必填estimateOnly

版本历史

1
  1. v1.0.1最新Nov 6, 2026

评分

已满足适用检查项的 90%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分
  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分

其他 Workpods 集成