seranking/local-gmb-visibility
> 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. Use this skill whenever the user wants to grow a business's presence in a specific city or cities and pair it with local social, or says things like "track our rankings in [city]", "set up local rank tracking", "we want to show up in local search", "create Google Business Profile posts", "local SEO plus social for our locations", or "how are we ranking city by city and what should we post locally". Always activate for local/multi-location visibility work that combines SE Ranking rankings with Planable local/GMB content.
npx skills add https://github.com/seranking/seo-skills --skill local-gmb-visibility
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.Take seranking/local-gmb-visibility from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.