Add SEO skills 19-28, 31-32 with full Python implementations

12 new skills: Keyword Strategy, SERP Analysis, Position Tracking,
Link Building, Content Strategy, E-Commerce SEO, KPI Framework,
International SEO, AI Visibility, Knowledge Graph, Competitor Intel,
and Crawl Budget. ~20K lines of Python across 25 domain scripts.
Updated skill 11 pipeline table and repo CLAUDE.md.
Enhanced skill 18 local SEO workflow from jamie.clinic audit.

Note: Skill 26 hreflang_validator.py pending (content filter block).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-13 12:05:59 +09:00
parent 159f7ec3f7
commit a3ff965b87
125 changed files with 25948 additions and 173 deletions

View File

@@ -2,109 +2,253 @@
## Overview
Local SEO auditor for businesses with physical locations: NAP consistency, Google Business Profile optimization, local citations, and LocalBusiness schema validation.
## Quick Start
This skill primarily uses MCP tools (Firecrawl, Perplexity) for data collection. Scripts are helpers for validation.
```bash
# NAP consistency check (manual data input)
python scripts/nap_checker.py --business "Business Name" --address "123 Main St" --phone "555-1234"
# LocalBusiness schema validation
python scripts/local_schema_validator.py --url https://example.com
```
## Audit Components
### 1. NAP Consistency
**Name, Address, Phone** consistency across:
- Website (header, footer, contact page)
- Google Business Profile
- Local directories (Yelp, Yellow Pages, etc.)
- Social media profiles
### 2. Google Business Profile (GBP)
Optimization checklist:
- [ ] Business name matches website
- [ ] Address is complete and accurate
- [ ] Phone number is local
- [ ] Business hours are current
- [ ] Categories are appropriate
- [ ] Photos uploaded (exterior, interior, products)
- [ ] Posts are recent (within 7 days)
- [ ] Reviews are responded to
### 3. Local Citations
Priority directories to check:
- Google Business Profile
- Apple Maps
- Bing Places
- Yelp
- Facebook Business
- Industry-specific directories
### 4. LocalBusiness Schema
Required properties:
- @type (LocalBusiness or subtype)
- name
- address (PostalAddress)
- telephone
- openingHours
Local SEO auditor for Korean-market businesses with physical locations. Covers business identity extraction, GBP optimization, Naver Smart Place, Kakao Map, NAP consistency, local citations, and LocalBusiness schema validation.
## Workflow
### Step 0: Business Identity (MANDATORY FIRST STEP)
Before any audit work, establish the official business identity.
**Sources (in priority order):**
1. Website schema markup (JSON-LD `Organization`, `Hospital`, `LocalBusiness`) — the `name` field is authoritative
2. Contact page / About page
3. Footer (address, phone, social links)
4. User-provided information (known GBP URL, Naver Place URL, etc.)
**Data to collect:**
| Field | Example |
|-------|---------|
| Official name (Korean) | 제이미성형외과의원 |
| Official name (English) | Jamie Plastic Surgery Clinic |
| Brand/display name | Jamie Clinic |
| Website URL | https://www.jamie.clinic |
| Address (Korean) | 서울특별시 강남구 ... |
| Phone | 02-XXX-XXXX |
| Known GBP URL | (if available) |
| Known Naver Place URL | (if available) |
| Known Kakao Map URL | (if available) |
**How to extract:**
```
1. Collect NAP from client
2. Scrape website for NAP mentions
3. Search citations using Perplexity
4. Check GBP data (manual or API)
5. Validate LocalBusiness schema
6. Generate consistency report
WebFetch homepage → parse JSON-LD script tags → extract name, address, telephone, sameAs
WebFetch /contact or /about → extract NAP from page content
Check footer for social links, map embeds, place listing URLs
```
Look specifically for these URL patterns in `sameAs`, footer links, or embedded iframes:
- GBP: `maps.app.goo.gl/*`, `google.com/maps/place/*`, `g.page/*`
- Naver Place: `naver.me/*`, `map.naver.com/*/place/*`, `m.place.naver.com/*`
- Kakao Map: `place.map.kakao.com/*`, `kko.to/*`
### Step 1: Website NAP Extraction
Scrape header, footer, contact page, about page for NAP mentions. Cross-reference with schema markup. Establish the **canonical NAP** baseline (the single source of truth for this audit).
### Step 2: GBP Verification & Audit
**Layered discovery (try in order, stop when found):**
1. Use provided GBP URL (from Step 0 or user input)
2. Check website for GBP link (footer, contact page, schema `sameAs`, embedded Google Maps iframe with Place ID)
3. WebSearch: `"[Korean Name]" "[City/District]" Google Maps`
4. WebSearch: `"[English Name]" Google Maps [City]`
5. WebSearch: `"[exact phone number]" site:google.com/maps`
**Important**: Google Maps is JS-rendered — WebFetch cannot extract business data from the listing page itself. Use WebSearch to find the listing URL, then verify details via search result snippets.
**If found — audit checklist (score /10):**
- [ ] Business name matches canonical NAP
- [ ] Address is complete and accurate
- [ ] Phone number matches
- [ ] Business hours are current
- [ ] Primary + secondary categories are appropriate
- [ ] Business description is complete
- [ ] 10+ photos uploaded (exterior, interior, products/services)
- [ ] Posts are recent (within 7 days)
- [ ] Reviews are responded to
- [ ] Q&A section is active
**If NOT found after all attempts:** Report as **"not discoverable via web search"** — this is distinct from "does not exist." The listing may exist but be unfindable through non-JS search methods.
### Step 3: Naver Smart Place Verification & Audit
**Layered discovery (try in order, stop when found):**
1. Use provided Naver Place URL (from Step 0 or user input)
2. Check website for Naver Place link (footer, contact page, schema `sameAs`, `naver.me/*` or `map.naver.com/*/place/*` patterns)
3. WebSearch: `"[Korean Name]" site:map.naver.com`
4. WebSearch: `"[Korean Name]" 네이버 지도 [district]`
5. WebSearch: `"[Korean Name]" 네이버 스마트플레이스`
6. WebSearch: `"[exact phone number]" site:map.naver.com`
**Important**: Naver Map is JS-rendered — WebFetch cannot extract data from the listing page. Use WebSearch for discovery, verify via search result snippets.
**If found — audit checklist (score /10):**
- [ ] Business name matches canonical NAP
- [ ] Address is complete and accurate
- [ ] Phone number matches
- [ ] Business hours are current
- [ ] Place is "claimed" (owner-managed / 업주 등록)
- [ ] Keywords/tags are set
- [ ] Booking/reservation link present
- [ ] Recent blog reviews linked
- [ ] Photos uploaded and current
- [ ] Menu/service/price information present
**If NOT found after all attempts:** Report as **"not discoverable via web search"** (not "does not exist" or "not registered").
### Step 4: Kakao Map Verification
**Discovery:**
1. Use provided Kakao Map URL (from Step 0)
2. Check website for Kakao Map link (`place.map.kakao.com/*`, `kko.to/*`)
3. WebSearch: `"[Korean Name]" site:place.map.kakao.com`
4. WebSearch: `"[Korean Name]" 카카오맵 [district]`
**If found:** Verify NAP consistency against canonical NAP.
### Step 5: Citation Discovery
**Korean market platform priorities:**
| Platform | Priority | Market |
|----------|----------|--------|
| Google Business Profile | Critical | Global |
| Naver Smart Place (네이버 스마트플레이스) | Critical | Korea |
| Kakao Map (카카오맵) | High | Korea |
| Industry-specific directories | High | Varies |
| Apple Maps | Medium | Global |
| Bing Places | Low | Global |
**Korean medical/cosmetic industry directories:**
- 강남언니 (Gangnam Unni)
- 바비톡 (Babitalk)
- 성예사 (Sungyesa)
- 굿닥 (Goodoc)
- 똑닥 (Ddocdoc)
- 모두닥 (Modoodoc)
- 하이닥 (HiDoc)
**Discovery methods:**
- Phone number search across platforms
- Korean business name + district search
- English business name search
- Address search
### Step 6: NAP Consistency Report
Cross-reference all discovered sources against the canonical NAP from Step 1.
**Common inconsistency points to check:**
- Building/landmark names (e.g., "EHL빌딩" vs "엔와이빌딩") — the authoritative source is the **business registration certificate** (사업자등록증), not the website alone
- Phone format variations (02-XXX-XXXX vs +82-2-XXX-XXXX vs 02XXXXXXX)
- Address format (road-name vs lot-number / 도로명 vs 지번)
- Korean vs English name spelling variations
- Suite/floor number omissions
### Step 7: LocalBusiness Schema Validation
Validate JSON-LD completeness:
- @type (LocalBusiness, Hospital, or appropriate subtype)
- name (Korean and/or English)
- address (PostalAddress with Korean format)
- telephone
- openingHours / openingHoursSpecification
- geo (GeoCoordinates — latitude, longitude)
- sameAs (should include GBP, Naver Place, Kakao Map, social profiles)
- url
- image
Use schema generator skill (17) for creating/fixing markup.
## Scoring
| Component | Weight | Max Score |
|-----------|--------|-----------|
| Business Identity completeness | 5% | /10 |
| NAP Consistency | 20% | /10 |
| GBP Optimization | 20% | /10 |
| Naver Smart Place | 20% | /10 |
| Kakao Map presence | 10% | /10 |
| Citations (directories) | 10% | /10 |
| LocalBusiness Schema | 15% | /10 |
**Overall Local SEO Score** = weighted average, normalized to /100.
## Output Format
```markdown
## Local SEO Audit: [Business Name]
**Date**: YYYY-MM-DD
**Website**: [URL]
### NAP Consistency Score: X/10
### Business Identity
| Field | Value |
|-------|-------|
| Korean Name | ... |
| English Name | ... |
| Brand Name | ... |
| Address | ... |
| Phone | ... |
### NAP Consistency: X/10
| Source | Name | Address | Phone | Status |
|--------|------|---------|-------|--------|
| Website | ✓ | ✓ | ✓ | Match |
| GBP | ✓ | ✗ | ✓ | Mismatch |
| Website | OK/Issue | OK/Issue | OK/Issue | Match/Mismatch |
| GBP | OK/Issue | OK/Issue | OK/Issue | Match/Mismatch |
| Naver Place | OK/Issue | OK/Issue | OK/Issue | Match/Mismatch |
| Kakao Map | OK/Issue | OK/Issue | OK/Issue | Match/Mismatch |
### GBP Optimization: X/10
- [ ] Issue 1
- [x] Completed item
- [x] Completed items
- [ ] Missing items
**GBP URL**: [URL or "not discoverable"]
### Citation Audit
- Found: X citations
- Consistent: X
- Needs update: X
### Naver Smart Place: X/10
- [x] Completed items
- [ ] Missing items
**Naver Place URL**: [URL or "not discoverable"]
### Recommendations
1. Fix address mismatch on GBP
2. Add LocalBusiness schema
### Kakao Map: X/10
**Status**: Found/Not discoverable
**Kakao Map URL**: [URL or "not discoverable"]
### Citations: X/10
| Platform | Found | NAP Match |
|----------|-------|-----------|
| 강남언니 | Yes/No | OK/Issue |
| ... | | |
### LocalBusiness Schema: X/10
- Present: Yes/No
- Valid: Yes/No
- Missing fields: [list]
### Overall Score: XX/100 (Grade)
### Priority Actions
1. [Highest impact recommendation]
2. ...
```
## Common Issues
| Issue | Impact | Fix |
|-------|--------|-----|
| NAP inconsistency | High | Update all directories |
| Missing GBP categories | Medium | Add relevant categories |
| No LocalBusiness schema | Medium | Add JSON-LD markup |
| Outdated business hours | Medium | Update GBP hours |
| No review responses | Low | Respond to all reviews |
| NAP inconsistency | High | Update all directories to match canonical NAP |
| Missing Naver Smart Place | Critical | Register and claim via smartplace.naver.com |
| Unclaimed Naver Place | High | Claim ownership via 네이버 스마트플레이스 |
| Missing GBP listing | Critical | Create via business.google.com |
| Building name mismatch | Medium | Align to business registration certificate |
| No LocalBusiness schema | Medium | Add JSON-LD markup with sameAs links |
| Missing GeoCoordinates | Medium | Add lat/lng to schema |
| No sameAs in schema | Medium | Add GBP, Naver, Kakao, social URLs |
## Notes
- GBP API requires enterprise approval (use manual audit)
- Citation discovery limited to public data
- Use schema generator skill (14) for creating LocalBusiness markup
- GBP and Naver Map are JS-rendered — WebFetch cannot extract listing data directly. Always use WebSearch for discovery.
- "Not discoverable via web search" != "does not exist." Always use this precise language.
- For Korean businesses, Naver Smart Place is as important as GBP (often more so for domestic traffic).
- Citation discovery is limited to publicly searchable data.
## Notion Output (Required)
@@ -123,20 +267,13 @@ Required properties:
|----------|------|-------------|
| Issue | Title | Report title (Korean + date) |
| Site | URL | Audited website URL |
| Category | Select | Technical SEO, On-page SEO, Performance, Schema/Structured Data, Sitemap, Robots.txt, Content, Local SEO |
| Category | Select | Local SEO |
| Priority | Select | Critical, High, Medium, Low |
| Found Date | Date | Audit date (YYYY-MM-DD) |
| Audit ID | Rich Text | Format: [TYPE]-YYYYMMDD-NNN |
| Audit ID | Rich Text | Format: LOCAL-YYYYMMDD-NNN |
### Language Guidelines
- Report content in Korean (한국어)
- Keep technical English terms as-is (e.g., SEO Audit, Core Web Vitals, Schema Markup)
- Keep technical English terms as-is (e.g., SEO Audit, GBP, NAP, Schema Markup)
- URLs and code remain unchanged
### Example MCP Call
```bash
mcp-cli call notion/API-post-page '{"parent": {"database_id": "2c8581e5-8a1e-8035-880b-e38cefc2f3ef"}, "properties": {...}}'
```