SEO Local
by agricidaniel / claude-seo
Audit local SEO, including Google Business Profile, NAP consistency, citations, reviews, local schema, location pages, and multi-location structure.
Build and track local search visibility with SE Ranking city-level rank tracking and turn it into local social content in Planable, including Google Business Profile posts.
Listed ·Updated
Install data from skills.sh
Local Gmb Visibility is a Local SEO skill for AI agents, published in the seoskills.sh catalog. Reach for it when your work involves Google Business Profile, local citations, and map-pack visibility. Install it with one command and it runs inside your own agent, so the work happens in your workflow, not a separate SEO tool.
Pair SE Ranking's city-level rank tracking with Planable's local content — including Google Business Profile posts — so a business can see how it ranks in each target city and publish location-relevant content against it.
Scope note. This skill covers city-level keyword rank tracking (SE Ranking projects with geo-targeted search engines) and local social/GMB content (Planable). SE Ranking's dedicated Local Marketing module — listings management, review monitoring, and the local rank grid/heatmap — is not exposed through the MCP, so those aren't part of this workflow. Set expectations accordingly.
list_pages and look for a page with type: "googleMyBusiness". If there isn't one, tell the user GMB isn't connected and fall back to other local social pages.Before doing anything else, verify both MCPs are reachable:
DATA_getSubscription. If it fails or returns an auth error, stop immediately and tell the user:
"The SE Ranking connector isn't responding — please reconnect it before we continue. Setup guide: https://seranking.com/api/integrations/mcp/"
list_workspaces. If it fails or returns an auth error, stop immediately and tell the user:
"The Planable connector isn't responding — please reconnect it before we continue. Setup guide: https://help.planable.io/hc/en-us/articles/27538577098780-How-to-connect-Planable-MCP-to-your-AI-tools"
Only continue to the process steps below once both calls return a successful response.
Confirm the cities, the local keywords per city, the business domain, and the Planable workspace + which pages (GMB and/or social). For multi-location, list each location explicitly. Rank tracking consumes plan quota (keywords × search engines) and search engines persist in the project — confirm scope before creating many, and offer to remove test engines afterwards.
PROJECT_createProject(url, title) → site_id (or reuse an existing project's site_id).PROJECT_getAvailableRegions(search: "<City, State, Country>") and take the canonical name string verbatim (abbreviated forms are rejected). A specific query returns one clean match.PROJECT_addSearchEngine(site_id, country_code, region_name, lang_code?) → returns site_engine_id. (The catalogue in PROJECT_getAvailableSearchEngines is only needed for niche regional engines.)PROJECT_addKeywords(site_id, keywords[]), attaching each to the right city engine via site_engine_ids.PROJECT_runPositionCheck) or let the project's schedule run. Results are not instant — a check is asynchronous and city rankings populate on the next cycle, so don't expect getPositionHistory to return data immediately after setup.PROJECT_getPositionHistory(site_id, type, site_engine_id?, date_from, date_to) — rankings over time, filterable to a single city engine. Use avg_pos and visibility.PROJECT_addCompetitor + PROJECT_getCompetitorPositions(competitor_id) — how local competitors rank for the same terms.DATA_getSerpLocations (to find the location_id) → DATA_getSerpResults(location_id=...). Heads-up: getSerpLocations can return a very large payload (hundreds of thousands of characters for a broad query). Pass a specific q (e.g. "Brooklyn" or "New York, NY"), and if the result is still huge it's written to a file — extract the one matching location_id with jq rather than loading the whole thing. For tracking setup you usually only need getAvailableRegions, so reserve getSerpLocations for when a live SERP read is essential.DATA_getDomainKeywordsComparison — local keyword gaps vs competitors.Translate the rankings + gaps into location-relevant content: service-area posts, local proof and reviews-style content (written as posts, since review data isn't pulled here), neighbourhood/landmark references, local offers, and answers to local intent. Tailor copy per city — generic content underperforms locally.
googleMyBusiness page exists, create_post(workspaceId, gmbPageId, text, scheduledAt?) on it.create_post per page, or create_grouped_post for synced copy. For multi-location, use a label per city (via list_labels / create_label) so each location's content is easy to filter.scheduledAt. Keep posts as proposed drafts — don't set publishAtScheduledDate — so nothing auto-publishes; only set it true if the user explicitly wants auto-publishing. Scheduled times are treated as UTC, so confirm the timezone or state that times are UTC.Re-read PROJECT_getPositionHistory per city on the next check cycle to see movement, and adjust the content plan toward the cities/terms with the most headroom.
Keep these in mind when creating local social and Google Business Profile content meant to target a specific keyword or close an AI-visibility gap:
site_engine_ids), and the keywords being tracked.PROJECT_getAvailableRegions — abbreviations fail.PROJECT_runPositionCheck and/or a narrow live DATA_getSerpResults localized view, and explain the difference.list_pages shows no googleMyBusiness page, you can't post to GMB via the connector — say so and use other local pages.PROJECT_deleteSearchEngine / PROJECT_deleteKeywords) for throwaway test setups.Not using the CLI? Copy the SKILL.md and paste it straight into ChatGPT, Claude, or any agent.