Universal SEO Analysis
AgriciDaniel/claude-seo
Hub for site-wide SEO work: audits, technical checks, schema, content quality, local, hreflang and AI-search readiness, run through slash commands.
Search-visibility and crawlability reference for web output: canonical URL discipline, per-page title and meta description uniqueness, robots.txt and sitemap.xml as host-derived artifacts, JSON-LD…
$ npx skills add modu-ai/moai-adk --skill moai-ref-seo -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install modu-ai/moai-adk moai-ref-seo --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/modu-ai/moai-adk.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/moai-ref-seo .claude/skills/moai-ref-seo && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "moai-ref-seo" agent skill from https://github.com/modu-ai/moai-adk/tree/main/.claude/skills/moai-ref-seo into .claude/skills/moai-ref-seo/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "moai-ref-seo", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/modu-ai/moai-adk/tree/main/.claude/skills/moai-ref-seoType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add modu-ai/moai-adk --skill moai-ref-seo -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install modu-ai/moai-adk moai-ref-seo --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/modu-ai/moai-adk.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/moai-ref-seo .agents/skills/moai-ref-seo && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "moai-ref-seo" agent skill from https://github.com/modu-ai/moai-adk/tree/main/.claude/skills/moai-ref-seo into .agents/skills/moai-ref-seo/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "moai-ref-seo", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add modu-ai/moai-adk --skill moai-ref-seo -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install modu-ai/moai-adk moai-ref-seo --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/modu-ai/moai-adk.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/moai-ref-seo .cursor/skills/moai-ref-seo && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "moai-ref-seo" agent skill from https://github.com/modu-ai/moai-adk/tree/main/.claude/skills/moai-ref-seo into .cursor/skills/moai-ref-seo/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "moai-ref-seo", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/modu-ai/moai-adk.git --path .claude/skills/moai-ref-seo--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add modu-ai/moai-adk --skill moai-ref-seo -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install modu-ai/moai-adk moai-ref-seo --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/modu-ai/moai-adk.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/moai-ref-seo .gemini/skills/moai-ref-seo && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "moai-ref-seo" agent skill from https://github.com/modu-ai/moai-adk/tree/main/.claude/skills/moai-ref-seo into .gemini/skills/moai-ref-seo/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "moai-ref-seo", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install modu-ai/moai-adk moai-ref-seoInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add modu-ai/moai-adk --skill moai-ref-seo -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/modu-ai/moai-adk.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/moai-ref-seo .github/skills/moai-ref-seo && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "moai-ref-seo" agent skill from https://github.com/modu-ai/moai-adk/tree/main/.claude/skills/moai-ref-seo into .github/skills/moai-ref-seo/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "moai-ref-seo", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add modu-ai/moai-adk --skill moai-ref-seo -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install modu-ai/moai-adk moai-ref-seo --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/modu-ai/moai-adk.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/moai-ref-seo .opencode/skills/moai-ref-seo && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "moai-ref-seo" agent skill from https://github.com/modu-ai/moai-adk/tree/main/.claude/skills/moai-ref-seo into .opencode/skills/moai-ref-seo/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "moai-ref-seo", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
moai-ref-seoSearch-visibility and crawlability reference for web output: canonical URL discipline, per-page title and meta description uniqueness, robots.txt and sitemap.xml as host-derived artifacts, JSON-LD…
Moai Ref SEO is an agent skill from modu-ai/moai-adk. Search-visibility and crawlability reference for web output: canonical URL discipline, per-page title and meta description uniqueness, robots.txt and sitemap.xml as host-derived artifacts, JSON-LD structured data with entity consistency, and the document-semantics rules that decide whether a machine can read a page at all. Agent-extending skill that amplifies web-output implementation and pre-ship review with production-grade indexing and structured-data patterns. NOT for: keyboard operability, visible focus…
Its SKILL.md is about 3.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Marketing & SEO, covering Schema markup, Technical SEO and UI design. The repository describes itself as: Agentic development harness for Claude Code — SPEC-driven plan/run/sync, TRUST 5 quality gates, model+effort routing, and Claude×GLM multi-LLM cost control. Single Go binary, 16… The licence is Apache-2.0.
Read from SKILL.md and the folder at commit 2aab5f7. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md.
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Moai Ref SEO loads about 3.3k tokens when it runs. Until then it costs about 227 tokens; SKILL.md has 1,687 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from modu-ai/moai-adk at commit 2aab5f7, republished under its Apache-2.0 licence (© modu-ai). 1,687 words, ~3,347 tokens.
.claude/skills/moai-ref-seo/SKILL.md (or your agent's skills folder).manager-develop — applies these rules while implementing pages, routes, and serialized metadata output/moai review — pre-ship indexing review surface; equivalently available as a per-spawn Agent(general-purpose) with web-output review instructionsA page is indexed on what a machine can fetch and parse, not on what a person sees once everything has finished loading. Two failures dominate everything below: the same content reachable at more than one address, and a claim asserted in serialized data that nothing on the page corroborates. Every rule here is a specialization of one of those two.
Figures that engines publish and then quietly revise — truncation widths, ranking weights, crawl allowances — are deliberately absent. Where a limit matters, this reference gives the decision rule and the measurement to take, so the guidance outlives the figure.
The structure a parser reads before it reaches any content signal. Cheapest class of defect to introduce, and the cheapest to detect.
| Rule | How to check it | Failure it prevents |
|---|---|---|
Exactly one h1 per document | Count h1 elements in the rendered output of each page | Competing topic signals leave the subject ambiguous |
| No skipped heading level | Walk the heading sequence; each descent moves by at most one level | Section nesting a parser cannot reconstruct |
Every image carries alt text | Each image element has a non-empty alt attribute, or an empty one paired with an explicit decorative marker | Meaning locked inside a binary the parser cannot open |
| Anchor text names its destination | Read each link's text with the surrounding sentence hidden, then ask where it goes | Instruction-shaped link text carries no signal about the target |
| Fragment targets resolve | For each in-page fragment link, confirm a matching identifier exists in the same rendered output | Navigation that silently lands nowhere |
Derive alt text from what the image depicts, never from its file name. Where an
image genuinely adds nothing a reader needs, mark it decorative on purpose instead
of inventing a description for it.
One resource, one address; everything else redirects to it.
| Decision | Rule |
|---|---|
| Which address is canonical | Pick one form per resource and declare it. The declared value must equal the address actually served |
| Trailing-slash variants | Choose one form and redirect the other permanently. Serving both splits one resource across two addresses |
| Case, query parameters, tracking suffixes | Normalize before serving. A parameter that does not change the response must not mint a second address |
| Parameterized routes | Build the declared value from the resolved parameters, never from a fixed string shared across the whole route |
| Retiring an address | Redirect permanently from the old form and update the declaration in the same change |
A declaration pointing at an address that redirects, errors, or serves different content is worse than no declaration at all: it actively steers the reader away from the page it appears on.
| Field | Rule | Recurring defect |
|---|---|---|
title | Unique per page, composed from a page-specific part plus a stable identifier for the site | The scaffold's default survives to production on every route |
| meta description | Unique per page, written for a person reading a result snippet | One description copied everywhere, or prose that describes nothing |
| Indexing directive | Set a default for public pages, then narrow per page class. Authenticated areas and internal tools are excluded deliberately, not merely left unlinked | A private surface gets indexed because nothing declared otherwise |
| Social preview fields | Present and absolute. A relative address in a field a third party fetches resolves against the wrong host | A share card that renders blank off-site |
Length budgets are a decision rule, not a constant: draft the text, observe where the consuming surface truncates it, then cut to what you observed. Placeholder detection belongs in the pre-ship check — scan the emitted output for the scaffold's own default strings and fail when one survives.
Serialized JSON-LD states what a page is. Its one hard constraint is correspondence with the visible page.
| Decision | Rule |
|---|---|
| Which types to emit | Derive them from the page's actual role — an organization, a product, a piece of software, a place, an article. Emit the site-level type everywhere and the page-specific type only where it applies |
| Required fields | Each type has a small mandatory core. Emit that core completely rather than emitting several types partially |
| Addresses inside the data | Absolute, and resolving. Relative values are discarded without a warning |
| Several entities on one page | Emit one block holding all of them, give each a stable identifier, and cross-reference by identifier instead of nesting duplicate copies |
| Placement | Keep each type on the page it describes. A type repeated site-wide dilutes rather than reinforces |
Mirroring rule — every claim in the serialized data needs a visible counterpart on the same page. A name, a description, a rating, or a question-and-answer pair that exists only in the markup is an assertion the reader cannot check, and it is now scored as a negative signal rather than a neutral one.
Structured data identifies an entity. Consistency is what makes that identity hold across independent sources.
| Surface | Requirement |
|---|---|
| Canonical name | One spelling, one casing, one suffix — the same in the serialized data, the page copy, and the headings |
| Owned profile links | Restricted to accounts this entity itself administers, each confirmed to resolve rather than bounce to a sign-in wall |
| Contact details | Name, address, and contact number identical across the serialized data, the visible page, and any third-party listings |
| Omission over approximation | A field with no accurate value is left out. A partial or invented one fragments the identity it was meant to establish |
Formatting differences that read as trivial to a person are distinct values to a matcher. Fix one format per field and hold it everywhere the entity appears.
robots.txt and sitemap.xml are output the site serves, not files carried between
environments.
| Artifact | Rule |
|---|---|
robots.txt | Derive the absolute addresses it contains from the incoming request's host, so every environment serves a correct description of itself |
sitemap.xml | Enumerate the addresses actually served. An entry for a removed page spends crawl attempts and signals staleness |
| Staying in sync | Adding or removing a route updates the enumeration in the same change. A hand-maintained list drifts within one iteration |
| Per-entry hints | Freshness and weighting hints attached to entries are advisory and widely discounted. Correctness of the address set matters far more than the hints on it |
Hardcoding one environment's host into either artifact is the defect that keeps recurring, because it passes review while being correct in exactly one place.
| Concern | Rule |
|---|---|
| Response headers | Apply them at a single wrapping point every response passes through, error and redirect responses included. A header set only on the success path is missing exactly when a reader is most likely to be misled |
| Rendering mode | Treat "what does a reader receive in the first response?" as a question the project answers explicitly. Content that appears only after client-side work is content a non-executing reader may never see |
| Redirect chains | One hop to the canonical address. Each extra hop is another opportunity to lose the reader |
| Third-party origins | Connection hints for origins the page depends on belong ahead of the resources that use them. Measure the effect on this project's own pages rather than assuming one |
<!-- moai:evolvable-start id="rationalizations" -->
| Rationalization | Reality |
|---|---|
| "The framework already sets sensible metadata defaults" | A default is identical on every route by construction. Uniqueness is the entire purpose of the field, so it cannot be inherited. |
| "Both address forms serve the same page, so it makes no difference" | Two addresses serving one resource are two resources to a crawler. Which one survives is guessed unless a declaration and a redirect settle it deliberately. |
| "Serialized data may say more than the page shows — it is extra context" | Data with no visible counterpart is an unverifiable claim, and it is scored as one. |
"Heading structure and alt text belong to accessibility, not to indexing" | They are the parse structure a machine uses to segment and describe a page. Sharing a mechanism with accessibility is not a reason to defer them. |
| "The address enumeration can be updated in a follow-up change" | A list maintained apart from the routes drifts immediately and then silently. Deriving it from the routes is the only version that stays true. |
| "The staging host in the artifact is fine, we swap it at deploy" | A hardcoded host is right in one environment and wrong in every other, including the one that gets indexed. |
<!-- moai:evolvable-end -->
<!-- moai:evolvable-start id="red-flags" -->
h1 elements on one page, or a heading sequence that skips a leveltitle or meta description reused across more than one routealt attribute, or alt text that repeats the file namerobots.txt or sitemap.xml carrying a hardcoded host instead of one derived from the request<!-- moai:evolvable-end -->
<!-- moai:evolvable-start id="verification" -->
h1 and a heading sequence with no skipped level — report the counts observed, not the intenttitle and meta description were collected across all routes; no duplicates and no scaffold default strings remainalt attribute, and decorative images are marked as such on purposerobots.txt and sitemap.xml were fetched from the deployed host and every address in them resolves — quote the address set observed<!-- moai:evolvable-end -->
© modu-ai, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/moai-ref-seo of modu-ai/moai-adk.
Open the folder on GitHubat commit 2aab5f7
Moai Ref SEO next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Moai Ref SEO this skillmodu-ai/moai-adk | 1.2k | — | ~3.3k | Automated safety check: Pass | Apache-2.0 | |
| Universal SEO AnalysisAgriciDaniel/claude-seo | 19k | — | ~4.9k | Automated safety check: Pass | MIT | |
| Generative Engine Optimizationtech-leads-club/agent-skills | 7k | — | ~2.5k | Automated safety check: Pass | MIT | |
| SEO Geoericrisco/rsc-harness | 174 | — | ~2.8k | Automated safety check: Pass | MIT | |
| SEO AI Optimizerluongnv89/skills | 131 | — | ~2.7k | Automated safety check: Pass | MIT | |
| GEO-First SEO Audit Toolzubair-trabzada/geo-seo-claude | 11k | — | ~2.8k | Automated safety check: Notes | MIT |
AgriciDaniel/claude-seo
Hub for site-wide SEO work: audits, technical checks, schema, content quality, local, hreflang and AI-search readiness, run through slash commands.
tech-leads-club/agent-skills
Makes a page or site easier for AI answer engines to find, understand, trust and quote, using metadata, structured data, an llms.txt file and clear page structure.
ericrisco/rsc-harness
A skill your agent uses when one existing page needs to rank in Google AND get cited by AI answer engines — auditing a URL for on-page SEO, structured-data JSON-LD, GEO citation levers, Core Web…
luongnv89/skills
Audit and optimize websites for technical SEO, content SEO, and AI bot accessibility.
zubair-trabzada/geo-seo-claude
Audits a website for AI search visibility across ChatGPT, Claude, Perplexity and Google AI Overviews while checking traditional SEO, schema and E-E-A-T content quality.
ailabs-393/ai-labs-claude-skills
This skill should be used when analyzing HTML/CSS websites for SEO optimization, fixing SEO issues, generating SEO reports, or implementing SEO best practices.
modu-ai/moai-adk
Builds hand-editable SVG diagrams from computed layout coordinates, lints the source and renders a 2x PNG, with rules for when mermaid is the better choice.
modu-ai/moai-adk
Reference for MoAI-ADK's core development principles: TRUST 5 quality gates, SPEC-first domain-driven workflow, agent delegation and token budgeting.
modu-ai/moai-adk
Manages SPEC documents for MoAI-ADK development, with GEARS or EARS requirement notation, acceptance criteria and a link into the Plan-Run-Sync workflow.
modu-ai/moai-adk
Drives test-first development through the RED, GREEN, REFACTOR cycle, with a config switch that selects between TDD and a DDD workflow for existing code.
modu-ai/moai-adk
Gives each SPEC its own Git worktree with a registry of active workspaces, base-branch sync and cleanup of merged ones, inside the MoAI-ADK workflow.
modu-ai/moai-adk
Watches a pull request's CI checks after creation, separates required from auxiliary failures, applies limited safe fixes and escalates anything semantic to you.
Categories
Search-visibility and crawlability reference for web output: canonical URL discipline, per-page title and meta description uniqueness, robots.txt and sitemap.xml as host-derived artifacts, JSON-LD…. Moai Ref SEO is an agent skill from modu-ai/moai-adk.xml as host-derived artifacts, JSON-LD structured data with entity consistency, and the document-semantics rules that decide whether a machine can read a page at all.
Moai Ref SEO fits situations like: tasks that involve Schema markup; tasks that involve Technical SEO; tasks that involve UI design.
Run `npx skills add modu-ai/moai-adk --skill moai-ref-seo -a claude-code`. Or copy the skill folder (.claude/skills/moai-ref-seo in modu-ai/moai-adk) into .claude/skills/moai-ref-seo in your project. Claude Code loads it when a task matches its description.
Run `npx skills add modu-ai/moai-adk --skill moai-ref-seo -a codex`. Or copy the skill folder (.claude/skills/moai-ref-seo in modu-ai/moai-adk) into .agents/skills/moai-ref-seo in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add modu-ai/moai-adk --skill moai-ref-seo -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/moai-ref-seo, .gemini/skills/moai-ref-seo, .github/skills/moai-ref-seo and .opencode/skills/moai-ref-seo in your project.
SKILL.md names no scripts, command-line tools or credentials: Moai Ref SEO is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Moai Ref SEO is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.3k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Moai Ref SEO: Universal SEO Analysis (AgriciDaniel/claude-seo, 19k stars), Generative Engine Optimization (tech-leads-club/agent-skills, 7k stars), SEO Geo (ericrisco/rsc-harness, 174 stars) and SEO AI Optimizer (luongnv89/skills, 131 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
modu-ai (a GitHub organization) maintains it in modu-ai/moai-adk, which has 1,232 GitHub stars. The repository holds 48 skills in this directory. The repository was last updated on October 9, 2026.
Source: modu-ai/moai-adk on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.