seo-local-business — Claude Code skill: what it does, how to install
Generates a complete local SEO package: <head> meta tags, JSON-LD LocalBusiness schema, robots.txt, and sitemap.xml for service-based websites.
npx skills add jezweb/claude-skills --skill seo-local-business -a claude-codeWhat seo-local-business does
The skill builds an SEO setup for neighborhood-serving businesses such as trade contractors or dental clinics. It starts by collecting business details: name, core service, location, phone number, website URL, and summary. You can also provide opening hours and coordinates. They help build precise local geo tags.
From these inputs, it outputs a <head> block with Open Graph, Twitter cards, and geo meta tags. It also generates JSON-LD structured data using LocalBusiness subtypes like Plumber or Restaurant. In addition, it writes standard robots.txt and sitemap.xml files.
Because the templates are tailored to Australian details like ABN tax identifiers, phone numbers and tax fields need manual adjustment for businesses in other countries.
What it helps with
- build
<head>meta tags with Open Graph and local geo coordinates - generates JSON-LD structured data with specific LocalBusiness subtypes
- create clean
robots.txtandsitemap.xmlfiles for local services - format title and description templates around a target city or suburb
Example prompts for the agent
- Generate a full local SEO package for an emergency plumbing service in Newcastle, including meta tags, JSON-LD, robots.txt, and sitemap.
- Create LocalBusiness JSON-LD schema and head tags for a dental practice.
- Set up meta tags, robots.txt, and sitemap.xml for an auto repair shop.
How to install seo-local-business
1Skills CLI (Vercel)
npx skills add jezweb/claude-skills --skill seo-local-business -a claude-code2Manually: put the files in place
~/.claude/skills/seo-local-business/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/seo-local-business/
1Skills CLI (Vercel)
npx skills add jezweb/claude-skills --skill seo-local-business -a codex2Manually: put the files in place
.agents/skills/seo-local-business/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add jezweb/claude-skills --skill seo-local-business -a cursor2Manually: put the files in place
.cursor/skills/seo-local-business/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install jezweb/claude-skills seo-local-business2Manually: put the files in place
.github/skills/seo-local-business/SKILL.md1Skills CLI (Vercel)
npx skills add jezweb/claude-skills --skill seo-local-business -a gemini-cli2Platform CLI
gemini skills install https://github.com/jezweb/claude-skills --path plugins/web-design/skills/seo-local-businessManually: put the files in place
.devin/skills/seo-local-business/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add jezweb/claude-skills --skill seo-local-business -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about seo-local-business
How do I install seo-local-business in Claude Code?
Run npx skills add jezweb/claude-skills --skill seo-local-business -a claude-code to install the skill.
What does seo-local-business generate?
It produces <head> meta tags with Open Graph and geo tags, JSON-LD LocalBusiness schema, robots.txt, and sitemap.xml.
What details are required before running the skill?
You need the business name, primary service, location, phone number, website URL, and description. Opening hours, coordinates, and social media links are optional.
Source text
SKILL.md · MIT
---
name: seo-local-business
description: "Generate complete SEO setup for local business websites — HTML head tags, JSON-LD LocalBusiness schema, robots.txt, sitemap.xml. Australian-optimised with +61 phone, ABN, suburb patterns. Use whenever the user wants SEO for a local business (tradesman, café, clinic, agency, retailer), needs JSON-LD structured data, asks for LocalBusiness schema, or wants meta tags / robots.txt / sitemap for a suburb-serving business."
---
# SEO Local Business
Generate a complete SEO package for local business websites. Produces meta tags, structured data, robots.txt, and sitemap.xml.
## What You Produce
1. Complete `<head>` section with meta tags, Open Graph, Twitter Cards
2. JSON-LD structured data (LocalBusiness + Service + FAQ schemas)
3. `robots.txt`
4. `sitemap.xml`
## Workflow
### Step 1: Gather Business Info
Ask for (or extract from existing site):
| Required | Optional |
|----------|----------|
| Business name | ABN |
| Primary service | Opening hours |
| Location (city/suburb) | Social media URLs |
| Phone number | Price range |
| Website URL | Service areas (suburbs) |
| Business description | GPS coordinates |
### Step 2: Generate Head Tags
Fill placeholders in this template:
```html
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Primary Meta Tags -->
<title>{{PAGE_TITLE}} | {{BUSINESS_NAME}}</title>
<meta name="title" content="{{PAGE_TITLE}} | {{BUSINESS_NAME}}">
<meta name="description" content="{{META_DESCRIPTION}}">
<!-- Canonical URL -->
<link rel="canonical" href="{{CANONICAL_URL}}">
<!-- Open Graph / Facebook -->
<meta property="og:type" content="website">
<meta property="og:url" content="{{CANONICAL_URL}}">
<meta property="og:title" content="{{PAGE_TITLE}} | {{BUSINESS_NAME}}">
<meta property="og:description" content="{{META_DESCRIPTION}}">
<meta property="og:image" content="{{OG_IMAGE_URL}}">
<!-- Twitter -->
<meta property="twitter:card" content="summary_large_image">
<meta property="twitter:url" content="{{CANONICAL_URL}}">
<meta property="twitter:title" content="{{PAGE_TITLE}} | {{BUSINESS_NAME}}">
<meta property="twitter:description" content="{{META_DESCRIPTION}}">
<meta property="twitter:image" content="{{OG_IMAGE_URL}}">
<!-- Geo Tags (Local SEO) -->
<meta name="geo.region" content="{{GEO_REGION}}">
<meta name="geo.placename" content="{{CITY}}">
<meta name="geo.position" content="{{LATITUDE}};{{LONGITUDE}}">
<meta name="ICBM" content="{{LATITUDE}}, {{LONGITUDE}}">
<!-- Favicons -->
<link rel="icon" type="image/svg+xml" href="favicon.svg">
<link rel="icon" type="image/png" sizes="32x32" href="favicon-32.png">
<link rel="apple-touch-icon" href="apple-touch-icon.png">
<!-- Structured Data -->
<script type="application/ld+json">
{{JSON_LD_SCHEMA}}
</script>
</head>
```
**Title tag patterns** (50-60 chars max):
| Page | Pattern | Example |
|------|---------|---------|
| Homepage | `Brand - Tagline` | `Newcastle Plumbing - 24/7 Emergency Service` |
| Service | `Service in Location \| Brand` | `Hot Water Repairs Newcastle \| ABC Plumbing` |
| About | `About Us \| Brand` | `About Us \| ABC Plumbing Newcastle` |
| Contact | `Contact \| Brand` | `Contact Us \| ABC Plumbing Newcastle` |
**Meta description patterns** (150-160 chars):
| Page | Pattern |
|------|---------|
| Homepage | `[USP]. [Service] in [Location]. [CTA]. Call [phone].` |
| Service | `Professional [service] in [location]. [Benefit]. [Trust signal]. Get a free quote today.` |
| About | `[X] years serving [location]. [Team info]. [Credentials]. Learn about [brand].` |
| Contact | `Contact [brand] for [service] in [location]. [Hours]. Call [phone] or request a quote online.` |
### Step 3: Generate Structured Data
**LocalBusiness** (homepage — always include):
Use `LocalBusiness` or a more specific subtype:
| Subtype | Use for |
|---------|---------|
| `Plumber` | Plumbing services |
| `Electrician` | Electrical services |
| `RoofingContractor` | Roofing |
| `HVACBusiness` | Air conditioning/heating |
| `AutoRepair` | Mechanics |
| `BeautySalon` | Hair/beauty |
| `Dentist` | Dental practices |
| `LegalService` | Law firms |
| `AccountingService` | Accountants |
| `RealEstateAgent` | Real estate |
| `Restaurant` | Restaurants/cafes |
| `BarOrPub` | Pubs/bars |
| `Hotel` | Accommodation |
| `Store` | Retail shops |
| `ProfessionalService` | Generic professional |
LocalBusiness schema properties:
| Property | Required | Notes |
|----------|----------|-------|
| `@type` | Yes | `LocalBusiness` or subtype from above |
| `name` | Yes | Business name as shown to customers |
| `image` | Yes | Primary business image or logo |
| `description` | Yes | 1-2 sentence business description |
| `@id` | Yes | Unique ID, use `{url}/#organization` |
| `url` | Yes | Website homepage URL |
| `telephone` | Yes | International format: `+61-2-4900-1234` |
| `address` | Yes | PostalAddress (see below) |
| `email` | Recommended | Primary contact email |
| `priceRange` | Recommended | `$` to `$$$$` |
| `geo` | Recommended | GeoCoordinates: latitude/longitude |
| `openingHoursSpecification` | Recommended | See hours format below |
| `areaServed` | Recommended | Cities/suburbs served |
| `sameAs` | Recommended | Social media profile URLs |
| `taxID` | Optional | ABN for Australian businesses |
| `logo` | Optional | Business logo URL |
| `foundingDate` | Optional | ISO 8601 date |
| `paymentAccepted` | Optional | e.g. "Cash, Credit Card, EFTPOS" |
| `currenciesAccepted` | Optional | `AUD` |
PostalAddress:
| Property | Example |
|----------|---------|
| `streetAddress` | `123 Hunter Street` |
| `addressLocality` | `Newcastle` |
| `addressRegion` | `NSW` |
| `postalCode` | `2300` |
| `addressCountry` | `AU` |
Example:
```json
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"name": "ABC Plumbing Newcastle",
"image": "https://www.abcplumbing.com.au/og-image.jpg",
"description": "Professional plumbing services in Newcastle and Lake Macquarie.",
"@id": "https://www.abcplumbing.com.au/#organization",
"url": "https://www.abcplumbing.com.au",
"telephone": "+61-2-4900-1234",
"email": "[email protected]",
"priceRange": "$$",
"address": {
"@type": "PostalAddress",
"streetAddress": "123 Hunter Street",
"addressLocality": "Newcastle",
"addressRegion": "NSW",
"postalCode": "2300",
"addressCountry": "AU"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": -32.9283,
"longitude": 151.7817
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "07:00",
"closes": "17:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Saturday"],
"opens": "08:00",
"closes": "12:00"
}
],
"areaServed": [
{ "@type": "City", "name": "Newcastle" },
{ "@type": "City", "name": "Lake Macquarie" }
],
"sameAs": [
"https://www.facebook.com/abcplumbing",
"https://www.instagram.com/abcplumbing"
]
}
```
**Service** (service pages — add per service):
| Property | Required | Notes |
|----------|----------|-------|
| `name` | Yes | Service name |
| `description` | Yes | What the service provides |
| `provider` | Yes | `{ "@id": "{url}/#organization" }` |
| `areaServed` | Recommended | City or region |
| `serviceType` | Recommended | Category of service |
| `offers` | Optional | Pricing/availability |
```json
{
"@context": "https://schema.org",
"@type": "Service",
"name": "Hot Water System Installation",
"description": "Professional hot water system installation and replacement in Newcastle.",
"provider": { "@id": "https://www.abcplumbing.com.au/#organization" },
"areaServed": { "@type": "City", "name": "Newcastle" },
"serviceType": "Plumbing",
"offers": {
"@type": "Offer",
"availability": "https://schema.org/InStock",
"priceRange": "$$"
}
}
```
**FAQ** (pages with FAQ sections):
```json
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "How much does a plumber cost in Newcastle?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Plumber callout fees in Newcastle typically range from $80-150."
}
}
]
}
```
### Step 4: Generate robots.txt and sitemap.xml
**robots.txt:**
```
User-agent: *
Allow: /
Sitemap: {{SITE_URL}}/sitemap.xml
```
**sitemap.xml:**
```xml
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>{{SITE_URL}}/</loc>
<lastmod>{{DATE}}</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>
<!-- Add one <url> per page. Priority: 1.0 homepage, 0.8 services, 0.6 others -->
</urlset>
```
### Step 5: Validate
Test structured data at: https://validator.schema.org/
Common validation errors:
- Missing `@context` — every JSON-LD block needs it
- Wrong phone format — must be international (`+61-...`)
- Missing `@id` — needed for cross-referencing between schemas
- Empty `areaServed` — include at least one city
## Australian-Specific Patterns
### Phone Numbers
```html
<!-- Link: international format. Display: local format. -->
<a href="tel:+61249001234">(02) 4900 1234</a>
```
Schema telephone: `"+61-2-4900-1234"`
| Prefix | International |
|--------|---------------|
| 02 | +612 |
| 04 | +614 |
| 1300 | Keep as-is |
### ABN
Add to LocalBusiness schema when available:
```json
{ "taxID": "12 345 678 901" }
```
### Australian State Codes
| State | Code | Geo Region |
|-------|------|------------|
| New South Wales | NSW | AU-NSW |
| Victoria | VIC | AU-VIC |
| Queensland | QLD | AU-QLD |
| South Australia | SA | AU-SA |
| Western Australia | WA | AU-WA |
| Tasmania | TAS | AU-TAS |
| Northern Territory | NT | AU-NT |
| ACT | ACT | AU-ACT |
### Service Areas
Use `areaServed` with Australian city and suburb names (see LocalBusiness example above).
© jezweb · MIT · jezweb/claude-skills