Local Seo logo

Local Seo

OrganizationPopular
every-app
local-seo

Audit a Google Business Profile, compare it to local competitors, and map Maps visibility around a location.

Overview

Publisherevery-app
Repositoryopen-seo
Skill namelocal-seo
Stars
22K
Forks
2.8K
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by every-app on GitHub. Read the source before you install it.

Installation

Install the Local Seo AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/every-app/open-seo/tree/main/.agents/skills/local-seo
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/every-app/open-seo.git /tmp/open-seo
mkdir -p .claude/skills
cp -r /tmp/open-seo/.agents/skills/local-seo .claude/skills/local-seo
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Local Seo in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Local Seo on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Local Seo is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

OpenSEO Local SEO

Goal

Work out why a business does or does not show up in Google Maps and the local pack near its customers, and what to fix first.

Use this when rankings depend on a physical location or service area. For national organic work, use competitor-analysis or keyword-research.

Required inputs

  • projectId
  • The business: name, or a cid/placeId (most reliable)
  • Its coordinate (latitude/longitude) — derive it from a search_local_businesses / get_local_serp_results row; only ask the user when derivation is ambiguous
  • One to three keywords customers actually search (e.g. "emergency plumber", not the brand name)

Project context

The project-context tools are free and shared with the app and other agents.

  1. Call get_project_context first and ground the work in it — what the business does and where it operates decides which keywords and radius matter.
  2. This skill needs business_overview. If it is empty, run a minimal inline setup: infer what the business does and its location from the site and confirm it with the user in one question, write it back with update_project_context, then continue. Never front-load the full interview; suggest seo-project-setup at the end for the rest.
  3. Before spending credits, check the research log. If the same research ran within the last 30 days, reuse that result and say so instead of re-buying it.
  4. On finish, write back what is durable with update_project_context — local competitors that have a website via addCompetitors (competitor rows are keyed by domain, so skip listings without one), a corrected business_overview — and append a research log entry: { appendResearchLog: { summary: "Local SEO: <business> near <area>. Verdict: <conclusion>" } }.

Deliver as a report

Deliver through the seo-report skill, saving with skill: "local-seo". If that skill is not available, say so and stop before writing HTML.

OpenSEO MCP tools

  • search_local_businesses: nearby listings, filterable by minRating, minReviews, and isClaimed — use isClaimed: false to find unclaimed listings when prospecting. One call with the brand name as query and a wide radius returns category, rating, review count, claimed status, coordinates, and cid for every location of a chain — usually enough that per-location get_business_profile calls are unnecessary.
  • get_local_serp_results: the Maps/Local Finder result set near a coordinate. The rows carry cid and place_id — collect them once and reuse them everywhere below.
  • get_business_profile: the full profile for one business (hours, rating breakdown) when the search_local_businesses row isn't enough.
  • get_business_reviews: reviews with ratings, text, and whether the owner replied. Queued: a processing response returns a taskId — call again with it after 30-60 seconds, at no extra cost.
  • get_local_rank_grid: rank at every point of a grid around a coordinate, with each point's result count and #1 business. 3x3 is nine searches; only go to 5x5 when the service area is genuinely wide.
  • get_google_business_questions: Q&A on the profile (accepts cid/placeId).
  • get_business_updates: posts published on the profile, with dates.
  • list_business_categories: valid category slugs for search_local_businesses.

Workflow

  1. Find the business. Given only a name or website, search_local_businesses (name as query, wide radius) locates the listing and yields its cid and coordinate. If it returns several locations, the business is a chain — see multi-location below.
  2. Run get_local_serp_results for the main keyword near the business coordinate. Record the top 3-5 competitors' cid/place_id and the user's own row.
  3. Compare the user's listing against the top two competitors: primary category, additional categories, review count, hours completeness, photo count, claimed status. search_local_businesses rows usually carry all of this; use get_business_profile for what they lack.
  4. Sanity-check each listing's website link (url/contact_url in the rows): it should deep-link to that location's page on the project domain, not a homepage or a stale domain. For broader on-page work, hand off to run_site_audit.
  5. Call get_business_reviews for the user and the strongest competitor. Look at review volume, recency, average rating, and how many reviews got an owner reply.
  6. Run get_local_rank_grid for the main keyword. Use the grid to separate "ranks at the storefront only" from "ranks across the service area", and each point's topResult to name who wins where the target doesn't.
  7. Add get_google_business_questions and get_business_updates when the profile basics are already competitive and the gap is engagement rather than setup.
  8. Turn the evidence into a prioritized list. Category and claim problems outrank posting cadence every time.

Multi-location businesses

Always build the profile snapshot table for the whole chain — one search_local_businesses call covers it. The per-location deep-dives (reviews, grid, posts, Q&A) are where cost scales:

  • 5 locations or fewer: deep-dive them all.
  • More than 5: present the snapshot table, then ask the user (AskUserQuestion) which 1-3 locations to deep-dive. Pick sensible defaults to recommend — e.g. the weakest profile in the densest market.

Output format

h1: the business name.

If a report template applies (see seo-report), its sections and tone replace this list.

Sections in this order:

  1. Snapshot — one or two opening sentences, then a table of category, rating, review count, and claimed status. One row per location for a chain.
  2. The one fix — one finding. Category and claim problems outrank posting cadence every time.
  3. Head to head — a table of signal, this business, the best competitor, and the gap. Cover categories, reviews (count, recency, owner replies), hours and profile completeness, and the listing's website link.
  4. Maps coverage — what the grid shows, where visibility drops off, and who wins there. A bar chart of ranks by direction reads faster than a paragraph; label every value.
  5. Q&A and posting — only when the basics are already competitive.
  6. What to do next — an ordered list.
  7. How this report was made — opens with the skill link line from seo-report, pointing at https://openseo.so/docs/skills/local-seo ("OpenSEO Local SEO skill"), then which tools returned what, plus a note reading each missing grid rank against that point's resultsCount rather than calling it invisibility.

Guardrails

  • Do not run a 5x5 grid, or grids for several keywords, without telling the user the cost first — every point is a paid SERP call.
  • Match businesses by cid or place_id when you have one. Name matching collides with chains and similarly named businesses.
  • A missing rank at a grid point means the business wasn't among the results returned there. Read it with that point's resultsCount: a full result set means outranked; a near-empty one means a sparse SERP, not proof of invisibility.
  • Do not infer local-pack strength from national organic metrics.
  • Never recommend review gating, fake reviews, or keyword-stuffed business names.
  • A grid centered on the wrong place is worse than no grid — confirm the coordinate matches the storefront before spending grid credits.

Frequently asked questions

What does the Local Seo AI skill do?

Audit a Google Business Profile, compare it to local competitors, and map Maps visibility around a location.

Why use Local Seo on TypingMind?

Because you install it once and use it with any model. Local Seo is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Local Seo in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/every-app/open-seo/tree/main/.agents/skills/local-seo. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Local Seo?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Local Seo?

As many as you like. As long as a model supports skills, you can use Local Seo with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Local Seo AI skill free?

Yes. It is published on GitHub by every-app under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇