1仕組みと動作原理
GEOファーストの6次元加重スコアリングがツール全体の主軸です。AI引用性の重みが最も高く(25%)、ブランド権威性20%、コンテンツE-E-A-T 20%、従来のテクニカルSEOは15%、構造化データ10%、プラットフォーム面10%となっています。計算式、0〜100点のグレード分類、Critical/High/Medium/Lowの改修期限がスキルファイル内に明記されており、エージェントの裁量は「ルーブリックに従って6つのスコアを付与する」ことだけに絞り込まれています。
GEO_Score = (Citability * 0.25) + (Brand * 0.20) + (EEAT * 0.20) + (Technical * 0.15) + (Schema * 0.10) + (Platform * 0.10)
引用性(citability)は単なるスローガンではなく実行可能なコードとして実装されています。citability_scorer.pyは「AIは134〜167語で自己完結し、事実に基づく数値を含む段落を好む」という特性を5つの次元(回答チャンク30 / 自己完結性25 / 構造20 / 統計密度15 / 独自性10)の正規表現スコアラーに落とし込み、段落ごとに0〜100点で評価してA〜Fのグレードを判定します。
if 134 <= word_count <= 167:
サイト全体の監査は5つの並列サブエージェントに分担されます。geo/SKILL.md内のテーブルで各エージェントファイルと担当サブスキルが紐付けられており、メインスキルはPhase 1の探索、Phase 2の並行委譲、Phase 3の統合のみを担当します。
Launch these 5 subagents simultaneously:
AIクローラーのアクセス許可判定には具体的な根拠があります。fetch_page.py内に14種類のAI/検索クローラーのリストがハードコードされており、robots.txtを1行ずつ解析します。エージェント側では100点満点の減点ルール(主要クローラーのブロックは1件につき-15点、サブクローラーは各-5点、sitemap記載なしは-10点)を適用します。
ai_crawlers = [ "GPTBot", "OAI-SearchBot",
llms.txtの検証と生成の両方に対応しています。スクリプトは「H1タイトル / > 説明 / ## セクション / リンク項目」の4項目からformat_validを判定して個別の課題を出力します。generateモードではトップページと内部リンク(デフォルト30ページ)をクロールし、llms.txtおよびllms-full.txtを出力します。
result["format_valid"] = (
ブランド言及スキャンは「実API呼び出しと委譲のハイブリッド」です。WikipediaとWikidataは実際のAPIリクエストを行ってyes/noの判定を下しますが、YouTube、Reddit、LinkedIn、G2などのその他のプラットフォームはsearch_urlと確認チェックリストを生成するのみで、実際のコンテンツ取得はエージェントのWebFetch/検索機能に委ねられます。
api_url = f"https://en.wikipedia.org/w/api.php?action=query&list=search&srsearch={quote_plus(brand_name)}&format=json"
PDF納品物の生成にはPythonの依存関係が不要です。v2.0.0のgeo-report-pdfはpandocを使用してGEO-AUDIT-REPORT.mdを自己完結型HTML(表紙テンプレートおよびCSS内蔵)にレンダリングし、ローカルのGoogle Chrome headlessでPDFとして出力します。スコアや重大度に応じたカラーリングは印刷前にテンプレート内のインラインJSによって行われます。
No Python dependencies. No ReportLab. No JSON data wrangling.
/geo updateは自己更新機能を提供します。上流のmainブランチをクローン(--depth 1、コミット未固定、検証なし)し、diffを確認した上でgeo/、skills/、agents/、scripts/、schema/を~/.claude/に上書きし、pip install -rで依存関係を更新します。ローカルでカスタマイズされたファイルは削除されません。
git clone --depth 1 https://github.com/zubair-trabzada/geo-seo-claude.git "$TEMP_DIR/repo"
2コア機能
3外部依存関係
| Kind | Dependency / Endpoint |
|---|---|
| package | requests |
| package | beautifulsoup4 |
| package | lxml(BeautifulSoup 解析器) |
| package | playwright(可选,截图用;安装器会拉 Chromium 二进制) |
| package | flask(CRM Web 看板) |
| package | rich(终端 CRM 看板) |
| package | Pillow / urllib3 / validators(requirements 其余依赖,脚本中未直接调用点) |
| cli | pandoc |
| cli | Google Chrome(headless 打印 PDF) |
| cli | git(安装与 /geo update 拉取上游) |
| cli | uv(可选,加速 venv/依赖安装) |
| api | Wikipedia MediaWiki 搜索 API |
| api | Wikidata wbsearchentities API |
| network | 被审计目标站点本身(任意 http/https 主机,含 /robots.txt、/llms.txt、/llms-full.txt、/sitemap.xml、/sitemap_index.xml 及页面与页面内同域链接) |
| network | Google Fonts(PDF 样式表 @import,pandoc/Chrome 渲染时取字体) |
| network | Bootstrap 与 HTMX CDN(CRM Web 看板模板) |
| network | raw.githubusercontent.com 一键安装(curl 管道执行 install.sh,不进 skill 运行时) |
| api | GitHub REST stargazers API(仅 CI 生成星标图,不进 skill 运行路径) |
4推奨統制措置と判定根拠
- scripts/: ローカルスクリプトまたはコマンドの実行: インストール時(ユーザーによる明示的な実行):install.sh / install-win.sh によるディレクトリ作成、geo/、skills/*、agents/*、s のコピー
- scripts/ 或 SKILL.md: 外部言語パッケージ依存の動的インストールの宣言
- 网络端点: 外部ネットワークアクセスの宣言: 監査対象サイト自体:scripts/*.py 内の requests.get がユーザー入力の http/https URL を参照(fetch_page は非HTTPを明示的に拒否)
- 本地工作目录: ファイルの読み書きと成果物の出力: 監査成果物がカレントワーキングディレクトリに出力される:GEO-AUDIT-REPORT.md、GEO-PAGE-ANALYSIS.md、GEO-CITABILITY-SCORE.
5二重目の独立検証
- [ok] skill.path 定位 — 候选位置逐一排查:仓库根无 SKILL.md(git ls-tree 确认根目录只有 README/LICENSE/install*/uninstall/requirements 与各功能目录);`geo/SKILL.md` 是唯一带 `name: geo` 的路由入口,frontmatter 声明 17 条 /geo 命令并提供 sub-skill/agent 分工表;install.sh 把 `geo/` 装成 ~/.claude/skills/geo 并把 `$INSTALL_DIR/SKILL.md` 当作主技能文件(`INSTALL_DIR="${SKILLS_DIR}/geo"`),geo-update 亦称 Main skill = ~/.claude/skills/geo/;docs/architecture.md 与 README 同称 'geo/ # Main skill orchestrator'。skills/* 是子技能(无 flagship 地位,安装时被平铺到 ~/.claude/skills/geo-*)。故取 skill.path="geo"——仓库根不是 skill,子技能目录是下级组件。
- [discrepancy] README/docs 的 PDF 实现描述(generate_pdf_report.py + ReportLab) — README 架构图写 '│ ├── generate_pdf_report.py # PDF report generator (ReportLab)',docs/commands-reference.md 写 '- Calls `python3 ~/.claude/skills/geo/scripts/generate_pdf_report.py` (requires `pip install reportlab`).';但 71 个受管文件中并无该脚本,requirements.txt 没有 reportlab,现行 skills/geo-report-pdf/SKILL.md(version 2.0.0)明确 'No Python dependencies. No ReportLab.',改用 pandoc + Chrome headless + 仓内模板/CSS。结论:README 与 commands-reference 是未同步的旧文档,应以 geo-report-pdf v2.0.0 为准。
- [discrepancy] 子技能数量与实际目录数 — 三处口径互斥:README '├── skills/ # 13 specialized sub-skills'、docs/architecture.md 同写 13;geo/SKILL.md 标题 '## Sub-Skills (14 Specialized Components)' 且表格缺 geo-report-pdf;实际 `skills/` 下有 15 个目录(含 geo-report-pdf)。另外 router 命令表共 17 条命令,其中 `/geo page` 与 `/geo quick` 没有对应子技能目录(由其它技能组合实现)。用户按文档理解能力边界会有偏差。
- [discrepancy] 品牌提及『扫描 10+ 平台』的夸大检查 — README 称 'Scans YouTube, Reddit, Wikipedia, LinkedIn, and 7+ other platforms'。实读 scripts/brand_scanner.py:只有 Wikipedia API 与 Wikidata API 两处 requests.get 是真实网络判定;YouTube/Reddit/LinkedIn/Quora/Stack Overflow/GitHub/Crunchbase/Product Hunt/G2/Trustpilot 分支仅返回 search_url + check_instructions,并由代码注释明示 'Actual YouTube API would be used in production / This provides the framework for Claude Code to use WebFetch'。属能力边界夸大(真实核查转由 agent 的 WebFetch/搜索完成)。
- [discrepancy] 安装器『隔离 venv、不动系统 Python』承诺 — README 声明 'Python dependencies are installed into a dedicated virtual environment at `~/.claude/skills/geo/.venv/`. Your system Python is **not** touched',install.sh 确实如此(venv + `uv pip install --python "$VENV_PY"`/`$VENV_PY -m pip install` + 把脚本 shebang 与 SKILL.md 中 python3 调用 sed 成 venv 解释器)。但 install-win.sh 走的是 `$PYTHON_CMD -m pip install --user -r "$SOURCE_DIR/requirements.txt"`(写用户级 site-packages),与承诺不符;/geo update 也用 `python3 -m pip install -r ...`(非 venv 路径)。
- [ok] hooks 安装路径 — 两个安装器都 `mkdir -p "$INSTALL_DIR/scripts" "$INSTALL_DIR/schema" "$INSTALL_DIR/hooks"` 并在 `[ -d "$SOURCE_DIR/hooks" ]` 守卫下复制 hooks;仓库内确无 hooks/ 目录(本地 ls 报 No such file or directory,git ls-tree 亦无),故该分支在源码态为惰性空操作,不构成未列出的执行面。
- [ok] 全部 external_deps 二次定位 — 18 条依赖逐条回到调用点复核:requests 在 fetch_page.py/citability_scorer.py/brand_scanner.py/llmstxt_generator.py 四处 requests.get;beautifulsoup4+lxml 在 fetch_page/llmstxt 的 BeautifulSoup(..., "lxml");flask 在 webapp/app.py 顶层 import 且 `app.run(debug=debug, port=5050)`;rich 在 crm_dashboard.py import 块;playwright 由 install.sh 的 venv 内 `-m playwright install chromium` 触发(requirements 亦列 playwright>=1.56.0);pandoc/Chrome/git/uv 均为命令行调用点;Wikipedia/Wikidata/fonts.googleapis.com/jsdelivr/unpkg/api.github.com/raw.githubusercontent.com 均有原文出处。Pillow/urllib3/validators 仅见于 requirements.txt,仓内无直接调用点(已在条目 note 中标注)。
- [ok] 是否漏掉网络调用/隐藏脚本/混淆内容 — 全量 grep `requests\.|urllib|urlopen|getenv|environ|api_key|API_KEY|token|Authorization|https?://` 无遗漏命中:除已列条目外只剩示例/文档里的 schema.org、w3.org 等纯参考资料 URL,无上传/回传/统计端点;全文无 base64 长串、无 eval/exec、无 subprocess 拼装执行远端内容(webapp 与 crm_dashboard 只读写本地 JSON)。资产面 71 文件全部为文本,无二进制/压缩包。
6結論
3a969f95e983e9c4…