local-gmb-visibility — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited local-gmb-visibility (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
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.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.