SkillsRank a page

Move one page up for one search, with your agent

An agent skill for a site’s own repository. It sets an aim for one page and one search, takes the page through five gates in order, each opened only when a read of the live site proves it, and keeps a weekly read-out beside the page’s place and a clock: the days it took to reach the aim. It never promises a place: Google decides that6, and the log never says a gate caused it.

An illustration, from the skill’s worked example: the shop and its places are a sample, made up.

Version 1.2.1Updated October 23, 2026

Install itSKILL.md

What it does

Five gates in order, because work on a page that is stuck at an earlier gate is wasted. Each says what to look at, how to decide, what to change and what opens it.

  1. 1Clean upMake the page and the paths to it work before anything else.
    Call
    mttr_page({ site, path })
  2. 2One intentA page ranks for what it is plainly about. Make it about one thing: the search.
    Call
    mttr_queries({ site, page })
  3. 3SubstanceGive the page what the pages above it give a reader, and what only this site can.
    Call
    mttr_competitors({ site })
  4. 4Links insideThe site's own strongest pages should point here, in words that say what the page is.
    Call
    mttr_links({ site, show: "content", q: "<the page's path>" })
  5. 5Links from outsideEarn links from sites that would point a reader here anyway.
    Call
    mttr_backlinks({ site })

mttr_queries({ site: "example.com", page: "https://example.com/hiking-boots" })the searches the page shows for, and its place in each

When to use it

Reach for it when

  • A page that matters ranks on page two, or nowhere, for the search it is for.
  • You want an agent to work a page up gate by gate, and a read-out of what it did each week.
  • You want each gate proved on the live site, not ticked off by the one who did it, and the days to the aim counted honestly.

Leave it when

  • You want links bought or swapped: the skill refuses, as Google’s spam policies do.4
  • The whole site needs work first: the page system skill covers every page.

Your agent loads it when a request matches the description in SKILL.md, or when you call it by name. A request like this one does:

A request that loads it
Rank our /hiking-boots page for “waterproof hiking boots”, aiming for top 3, and keep a weekly read-out.
The description your agent matches

Runs a campaign to move one page of a site up for one search, toward an aim set at the start (such as top 3), through five gates in order (clean up, one intent, substance, links inside, links from outside), each opened only by a proof from a read of the live site, and keeps a log, a weekly read-out and the campaign's time to rank. Use when asked to rank a page, get a page to page one, move up for a keyword, or run an SEO campaign on one page; or when a page ranks on page two for a search that matters. Works with mttr connected, which reads the site and checks each gate, or alone with a campaign.md kept in the repository. Not for buying links or promising a place.

What it calls

The 18 mttr tools its files call over MCP, in the order they first appear. Each links to its entry in the API reference.

And one address on mttr.si an agent can reach with no key:

  • /mcp

Install it

The skill is a folder, mttr-rank-a-page, with nine files. Run the commands from the top of the site's repository, so everyone who works in it gets the skill. Your agent also needs mttr connected over MCP for the calls above: connecting an agent shows how.

Claude Code

Loads skills from .claude/skills/ in the repository, for everyone who works in it, or ~/.claude/skills/ for every project on your machine. Claude uses it when a request matches its description, or type /mttr-rank-a-page.

Terminal, for Claude Code
mkdir -p .claude/skills/mttr-rank-a-page/references
curl -fsSL https://mttr.si/skills/rank-a-page/SKILL.md -o .claude/skills/mttr-rank-a-page/SKILL.md
curl -fsSL https://mttr.si/skills/rank-a-page/references/tracking.md -o .claude/skills/mttr-rank-a-page/references/tracking.md
curl -fsSL https://mttr.si/skills/rank-a-page/references/report.md -o .claude/skills/mttr-rank-a-page/references/report.md
curl -fsSL https://mttr.si/skills/rank-a-page/references/choosing-the-search.md -o .claude/skills/mttr-rank-a-page/references/choosing-the-search.md
curl -fsSL https://mttr.si/skills/rank-a-page/references/the-page.md -o .claude/skills/mttr-rank-a-page/references/the-page.md
curl -fsSL https://mttr.si/skills/rank-a-page/references/links-inside.md -o .claude/skills/mttr-rank-a-page/references/links-inside.md
curl -fsSL https://mttr.si/skills/rank-a-page/references/search-console.md -o .claude/skills/mttr-rank-a-page/references/search-console.md
curl -fsSL https://mttr.si/skills/rank-a-page/references/timelines-and-stopping.md -o .claude/skills/mttr-rank-a-page/references/timelines-and-stopping.md
curl -fsSL https://mttr.si/skills/rank-a-page/references/troubleshooting.md -o .claude/skills/mttr-rank-a-page/references/troubleshooting.md
PowerShell, for Claude Code
New-Item -ItemType Directory -Force .claude\skills\mttr-rank-a-page\references | Out-Null
Invoke-WebRequest https://mttr.si/skills/rank-a-page/SKILL.md -OutFile .claude\skills\mttr-rank-a-page\SKILL.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/rank-a-page/references/tracking.md -OutFile .claude\skills\mttr-rank-a-page\references\tracking.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/rank-a-page/references/report.md -OutFile .claude\skills\mttr-rank-a-page\references\report.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/rank-a-page/references/choosing-the-search.md -OutFile .claude\skills\mttr-rank-a-page\references\choosing-the-search.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/rank-a-page/references/the-page.md -OutFile .claude\skills\mttr-rank-a-page\references\the-page.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/rank-a-page/references/links-inside.md -OutFile .claude\skills\mttr-rank-a-page\references\links-inside.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/rank-a-page/references/search-console.md -OutFile .claude\skills\mttr-rank-a-page\references\search-console.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/rank-a-page/references/timelines-and-stopping.md -OutFile .claude\skills\mttr-rank-a-page\references\timelines-and-stopping.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/rank-a-page/references/troubleshooting.md -OutFile .claude\skills\mttr-rank-a-page\references\troubleshooting.md -UseBasicParsing

Puts the files in .claude/skills/mttr-rank-a-page/.

Codex

Loads skills from .agents/skills/ in the repository and its parent folders, or ~/.agents/skills/ for every project. Codex uses it when a task matches its description, or mention it as $mttr-rank-a-page; /skills lists them.

Terminal, for Codex
mkdir -p .agents/skills/mttr-rank-a-page/references
curl -fsSL https://mttr.si/skills/rank-a-page/SKILL.md -o .agents/skills/mttr-rank-a-page/SKILL.md
curl -fsSL https://mttr.si/skills/rank-a-page/references/tracking.md -o .agents/skills/mttr-rank-a-page/references/tracking.md
curl -fsSL https://mttr.si/skills/rank-a-page/references/report.md -o .agents/skills/mttr-rank-a-page/references/report.md
curl -fsSL https://mttr.si/skills/rank-a-page/references/choosing-the-search.md -o .agents/skills/mttr-rank-a-page/references/choosing-the-search.md
curl -fsSL https://mttr.si/skills/rank-a-page/references/the-page.md -o .agents/skills/mttr-rank-a-page/references/the-page.md
curl -fsSL https://mttr.si/skills/rank-a-page/references/links-inside.md -o .agents/skills/mttr-rank-a-page/references/links-inside.md
curl -fsSL https://mttr.si/skills/rank-a-page/references/search-console.md -o .agents/skills/mttr-rank-a-page/references/search-console.md
curl -fsSL https://mttr.si/skills/rank-a-page/references/timelines-and-stopping.md -o .agents/skills/mttr-rank-a-page/references/timelines-and-stopping.md
curl -fsSL https://mttr.si/skills/rank-a-page/references/troubleshooting.md -o .agents/skills/mttr-rank-a-page/references/troubleshooting.md
PowerShell, for Codex
New-Item -ItemType Directory -Force .agents\skills\mttr-rank-a-page\references | Out-Null
Invoke-WebRequest https://mttr.si/skills/rank-a-page/SKILL.md -OutFile .agents\skills\mttr-rank-a-page\SKILL.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/rank-a-page/references/tracking.md -OutFile .agents\skills\mttr-rank-a-page\references\tracking.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/rank-a-page/references/report.md -OutFile .agents\skills\mttr-rank-a-page\references\report.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/rank-a-page/references/choosing-the-search.md -OutFile .agents\skills\mttr-rank-a-page\references\choosing-the-search.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/rank-a-page/references/the-page.md -OutFile .agents\skills\mttr-rank-a-page\references\the-page.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/rank-a-page/references/links-inside.md -OutFile .agents\skills\mttr-rank-a-page\references\links-inside.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/rank-a-page/references/search-console.md -OutFile .agents\skills\mttr-rank-a-page\references\search-console.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/rank-a-page/references/timelines-and-stopping.md -OutFile .agents\skills\mttr-rank-a-page\references\timelines-and-stopping.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/rank-a-page/references/troubleshooting.md -OutFile .agents\skills\mttr-rank-a-page\references\troubleshooting.md -UseBasicParsing

Puts the files in .agents/skills/mttr-rank-a-page/.

Cursor

Loads skills from .cursor/skills/ or .agents/skills/ in the repository, or ~/.cursor/skills/ for every project. It also reads .claude/skills/, so one copy there serves both. The agent uses it when it is relevant, or type / in Agent chat and pick it.

Terminal, for Cursor
mkdir -p .cursor/skills/mttr-rank-a-page/references
curl -fsSL https://mttr.si/skills/rank-a-page/SKILL.md -o .cursor/skills/mttr-rank-a-page/SKILL.md
curl -fsSL https://mttr.si/skills/rank-a-page/references/tracking.md -o .cursor/skills/mttr-rank-a-page/references/tracking.md
curl -fsSL https://mttr.si/skills/rank-a-page/references/report.md -o .cursor/skills/mttr-rank-a-page/references/report.md
curl -fsSL https://mttr.si/skills/rank-a-page/references/choosing-the-search.md -o .cursor/skills/mttr-rank-a-page/references/choosing-the-search.md
curl -fsSL https://mttr.si/skills/rank-a-page/references/the-page.md -o .cursor/skills/mttr-rank-a-page/references/the-page.md
curl -fsSL https://mttr.si/skills/rank-a-page/references/links-inside.md -o .cursor/skills/mttr-rank-a-page/references/links-inside.md
curl -fsSL https://mttr.si/skills/rank-a-page/references/search-console.md -o .cursor/skills/mttr-rank-a-page/references/search-console.md
curl -fsSL https://mttr.si/skills/rank-a-page/references/timelines-and-stopping.md -o .cursor/skills/mttr-rank-a-page/references/timelines-and-stopping.md
curl -fsSL https://mttr.si/skills/rank-a-page/references/troubleshooting.md -o .cursor/skills/mttr-rank-a-page/references/troubleshooting.md
PowerShell, for Cursor
New-Item -ItemType Directory -Force .cursor\skills\mttr-rank-a-page\references | Out-Null
Invoke-WebRequest https://mttr.si/skills/rank-a-page/SKILL.md -OutFile .cursor\skills\mttr-rank-a-page\SKILL.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/rank-a-page/references/tracking.md -OutFile .cursor\skills\mttr-rank-a-page\references\tracking.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/rank-a-page/references/report.md -OutFile .cursor\skills\mttr-rank-a-page\references\report.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/rank-a-page/references/choosing-the-search.md -OutFile .cursor\skills\mttr-rank-a-page\references\choosing-the-search.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/rank-a-page/references/the-page.md -OutFile .cursor\skills\mttr-rank-a-page\references\the-page.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/rank-a-page/references/links-inside.md -OutFile .cursor\skills\mttr-rank-a-page\references\links-inside.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/rank-a-page/references/search-console.md -OutFile .cursor\skills\mttr-rank-a-page\references\search-console.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/rank-a-page/references/timelines-and-stopping.md -OutFile .cursor\skills\mttr-rank-a-page\references\timelines-and-stopping.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/rank-a-page/references/troubleshooting.md -OutFile .cursor\skills\mttr-rank-a-page\references\troubleshooting.md -UseBasicParsing

Puts the files in .cursor/skills/mttr-rank-a-page/.

Any other agent

An agent that does not load skills can still follow the file. Save the folder in the repository and point its standing instructions at it, with a line in AGENTS.md, which many agents read. The agent reads AGENTS.md when it starts, and follows the file when the task matches.

Terminal, for Any other agent
mkdir -p docs/mttr-rank-a-page/references
curl -fsSL https://mttr.si/skills/rank-a-page/SKILL.md -o docs/mttr-rank-a-page/SKILL.md
curl -fsSL https://mttr.si/skills/rank-a-page/references/tracking.md -o docs/mttr-rank-a-page/references/tracking.md
curl -fsSL https://mttr.si/skills/rank-a-page/references/report.md -o docs/mttr-rank-a-page/references/report.md
curl -fsSL https://mttr.si/skills/rank-a-page/references/choosing-the-search.md -o docs/mttr-rank-a-page/references/choosing-the-search.md
curl -fsSL https://mttr.si/skills/rank-a-page/references/the-page.md -o docs/mttr-rank-a-page/references/the-page.md
curl -fsSL https://mttr.si/skills/rank-a-page/references/links-inside.md -o docs/mttr-rank-a-page/references/links-inside.md
curl -fsSL https://mttr.si/skills/rank-a-page/references/search-console.md -o docs/mttr-rank-a-page/references/search-console.md
curl -fsSL https://mttr.si/skills/rank-a-page/references/timelines-and-stopping.md -o docs/mttr-rank-a-page/references/timelines-and-stopping.md
curl -fsSL https://mttr.si/skills/rank-a-page/references/troubleshooting.md -o docs/mttr-rank-a-page/references/troubleshooting.md
echo "For moving one page up for one search, follow docs/mttr-rank-a-page/SKILL.md." >> AGENTS.md
PowerShell, for Any other agent
New-Item -ItemType Directory -Force docs\mttr-rank-a-page\references | Out-Null
Invoke-WebRequest https://mttr.si/skills/rank-a-page/SKILL.md -OutFile docs\mttr-rank-a-page\SKILL.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/rank-a-page/references/tracking.md -OutFile docs\mttr-rank-a-page\references\tracking.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/rank-a-page/references/report.md -OutFile docs\mttr-rank-a-page\references\report.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/rank-a-page/references/choosing-the-search.md -OutFile docs\mttr-rank-a-page\references\choosing-the-search.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/rank-a-page/references/the-page.md -OutFile docs\mttr-rank-a-page\references\the-page.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/rank-a-page/references/links-inside.md -OutFile docs\mttr-rank-a-page\references\links-inside.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/rank-a-page/references/search-console.md -OutFile docs\mttr-rank-a-page\references\search-console.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/rank-a-page/references/timelines-and-stopping.md -OutFile docs\mttr-rank-a-page\references\timelines-and-stopping.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/rank-a-page/references/troubleshooting.md -OutFile docs\mttr-rank-a-page\references\troubleshooting.md -UseBasicParsing
Add-Content AGENTS.md "For moving one page up for one search, follow docs/mttr-rank-a-page/SKILL.md."

Puts the files in docs/mttr-rank-a-page/.

What is inside

Every file in the folder, as it is served at https://mttr.si/skills/rank-a-page/, so an agent can fetch any one again to update it.

mttr-rank-a-page/

  • SKILL.md167 lines18.9 KB

    The words it uses, setting up a campaign and its aim, the five gates with what to look at, how to decide, what to change and what opens each, reaching the aim, the rules it keeps, and a worked example.

  • references/

    • tracking.md106 lines5.8 KB

      The campaign log, with mttr’s work log or as campaign.md without it, what a gate’s states and a campaign’s status mean, and keeping a person’s mttr, with a worked log eight weeks in.

    • report.md93 lines4.8 KB

      The weekly read-out: the place against the aim and the start, the status, what was done and proved, what is next, what needs the person, and the days so far, with worked weeks: a slip, the aim reached, a stall and the end.

    • choosing-the-search.md63 lines6.1 KB

      Where candidate searches come from, reading the intent from the live results, checking another page of the site is not the better one, and setting an aim the evidence supports.

    • the-page.md93 lines7.9 KB

      The brief to write first, a worked before and after of the title, first heading and opening, answers under the reader’s questions, the rules that bear on them, and the traps that trip agents.

    • links-inside.md54 lines5.0 KB

      Finding the site’s pages that should link here, a worked link in a sentence, the traps, and checking the links in the HTML the server sends.

    • search-console.md64 lines7.3 KB

      Reading the Performance report for one page and one search, with mttr or by hand, what average position means, honest weekly figures with their impressions, URL Inspection, and troubleshooting the figures.

    • timelines-and-stopping.md53 lines5.1 KB

      What Google says about timing, what to tell the person, the campaign’s own pacing, and when to raise ending or changing target, which is always a new campaign.

    • troubleshooting.md34 lines4.0 KB

      Symptoms in gates and reads, the place, and the work, each with its likely cause and the fix.

  • CHANGELOG.md30 lines2.5 KB

    Every release and what it changed, newest first. Not installed: the changes, for you.

Its references

SKILL.md sends your agent to these files when a step needs them, so the main file stays short. Open the sections to see what each holds, or copy a request that points your agent at one.

references/tracking.md106 lines5.8 KBsix sections

The campaign log, with mttr’s work log or as campaign.md without it, what a gate’s states and a campaign’s status mean, and keeping a person’s mttr, with a worked log eight weeks in.

Open the file

Its six sections
  1. L5
    With mttrEvery change goes to mttr_log_work({ site, step, did }): planned before you start on a gate, changed once it ships, checked once a read proved…
  2. L9
    Without mttrKeep campaign.md at the top of the repository.
  3. L44
    A gate's states**closed:** no proof yet.
  4. L52
    A campaign's statusSetting up, Climbing, Stalled, Holding or Ended, as SKILL.md defines them.
  5. L56
    A worked log, eight weeks inAn illustration, not a real site's results.
  6. L104
    A person's mttrAcross campaigns, keep campaigns.md beside them, one line each: the page, the search, the aim, the start, the status, and the time to rank once…
references/report.md93 lines4.8 KBfour sections

The weekly read-out: the place against the aim and the start, the status, what was done and proved, what is next, what needs the person, and the days so far, with worked weeks: a slip, the aim reached, a stall and the end.

Open the file

Its four sections
  1. L5
    What it holds**The place now against the aim and the start,** with the source, the dates it covers and the impressions behind it.
  2. L15
    How it readsSay what was done and what was proved, and the place Google gave, side by side.
  3. L30
    More weeks, as they readIllustrations of the same campaign as tracking logs it, each for a different kind of week.
  4. L88
    What a read-out never saysThat a change caused the place.
references/choosing-the-search.md63 lines6.1 KBfive sections

Where candidate searches come from, reading the intent from the live results, checking another page of the site is not the better one, and setting an aim the evidence supports.

Open the file

Its five sections
  1. L5
    Where candidate searches come fromIn order of how much they can be trusted:
  2. L16
    Is it the right page for the search?Before committing, check that the page you were given is the one the site should rank:
  3. L24
    Reading the intent from the live resultsGoogle's results for a search are the best record of what people typing it want.
  4. L44
    When the search and the page do not fit
  5. L54
    Setting an aim the evidence supportsThese are the skill's own rules of thumb, not Google's: Google publishes no timeline for a place.
references/the-page.md93 lines7.9 KBfive sections

The brief to write first, a worked before and after of the title, first heading and opening, answers under the reader’s questions, the rules that bear on them, and the traps that trip agents.

Open the file

Its five sections
  1. L5
    The brief, before any changeWrite it in the log, short, before touching the page.
  2. L24
    Title, first heading, opening: before and afterThe title leads with the search and says what the page is.
  3. L53
    Substance: answers under the reader's questionsAdd what the brief says is missing, each under a heading that is the reader's question:
  4. L76
    Edge cases that trip agents
  5. L88
    Verifying gates two and three**Gate two, with mttr:** after the rescan, mttr_page({ site, path }) shows the title and first heading, and no title or one-h1 finding.
references/links-inside.md54 lines5.0 KBfour sections

Finding the site’s pages that should link here, a worked link in a sentence, the traps, and checking the links in the HTML the server sends.

Open the file

Its four sections
  1. L5
    Find the pages that should link here**The site's strongest pages.** With mttr, mttr_structure({ site }) and mttr_pages({ site }) show how the site hangs together and its pages;…
  2. L14
    Write the link: before and afterBefore, on the guide /guides/layering-for-wet-weather:
  3. L39
    Edge cases
  4. L50
    Verifying the gate**With mttr:** after the rescan, mttr_links({ site, show: "content", q: "<the page's path>" }) lists the new links, from the pages you chose.
references/search-console.md64 lines7.3 KBsix sections

Reading the Performance report for one page and one search, with mttr or by hand, what average position means, honest weekly figures with their impressions, URL Inspection, and troubleshooting the figures.

Open the file

Its six sections
  1. L5
    With mttrmttr has Search Console figures only for sites whose owner added mttr in Search Console, and gives them only for a site the person has claimed.
  2. L15
    Without mttr: the Performance report, by handAsk the person to open Search Console, the property for the site, then Performance, Search results, and set:
  3. L30
    What the figures meanFrom Google's own help (What are impressions, position, and clicks?
  4. L40
    Reading a week's figure honestly**Few impressions, a jumpy average.** A place from 20 impressions can move several places on no change at all.
  5. L47
    Checking the page Google hasThe URL Inspection tool in Search Console says how Google holds the page (URL Inspection tool).
  6. L56
    Troubleshooting the figures
references/timelines-and-stopping.md53 lines5.1 KBfive sections

What Google says about timing, what to tell the person, the campaign’s own pacing, and when to raise ending or changing target, which is always a new campaign.

Open the file

Its five sections
  1. L5
    What Google says about timingEverything below is quoted or taken from Google's own pages, each fetched for this skill:
  2. L16
    What to tell the person at the startSay it once, plainly, and write it in the log under the aim:
  3. L22
    The campaign's own pacingThese are the skill's rules, not Google's, chosen so a campaign neither gives up early nor runs on without a question:
  4. L31
    When to stop or change targetAsk the person, never decide alone.
  5. L45
    Changing target is a new campaignAn aim, a search or a page is never changed inside a running campaign:
references/troubleshooting.md34 lines4.0 KBthree sections

Symptoms in gates and reads, the place, and the work, each with its likely cause and the fix.

Open the file

Its three sections
  1. L5
    Gates and reads
  2. L17
    The place
  3. L27
    The person and the work

Version and changes

Version 1.2.1, October 23, 2026. The version is in SKILL.md under metadata, where the Agent Skills format keeps what it does not define, and follows semantic versioning: a new major version changes what the skill asks of you or your agent.

  1. 1.2.1October 23, 2026Current

    • The page's rules are read with mttr_rules(), the call an agent has, not a command line.
    • Week 2's read-out gives its place with the window and impressions, as every read-out must, and the same start as the log.
  2. 1.2.0October 18, 2026

    • Choosing the search: where candidate searches come from, reading the intent from the live results, checking another page of the site is not the better one, and an aim the evidence supports.
    • What the page must answer: the brief, a worked before and after of the title, first heading and opening, answers under the reader's questions, and the traps that trip agents.
    • Links inside: finding the pages that should link here, a worked link, and how to check it in the HTML the server sends.
    • Measuring with Search Console: reading the Performance report for one page and one search, what average position means, honest weekly figures with their impressions, and URL Inspection for gate one.
    • Timelines and stopping: what Google says about timing, the campaign's own pacing, and when to raise ending or changing target, which is always a new campaign.
    • Troubleshooting for gates, reads, the place and the work; a worked log eight weeks in; worked read-outs for a slip, the aim reached, a stall and the end.
    • Eight new sources from Google, each fetched.
  3. 1.1.0October 18, 2026

    • Words of its own, each in one sense: a campaign has an aim, five gates opened only by a proof, slips, a weekly read-out and a status (Setting up, Climbing, Stalled, Holding, Ended).
    • Time to rank: the days from the start to the first read-out at the aim or better, and mttr, the mean time to rank across a person's campaigns, said with how many reached their aim.
    • Reaching the aim: when the clock stops, when a campaign is holding, and why a campaign that missed stays in the count.
  4. 1.0.0October 18, 2026

    • First release: one page and one search, five steps in order (clean up, one intent, substance, links inside, links from outside), each with what to look at, how to decide, what to change and what proves it.
    • A log kept with mttr's work log, or in campaign.md without mttr, and a weekly check-in of the same shape every week.
    • A worked example, an outdoor shop's boots page, said to be an illustration.

The skill in full

This is the file the commands above fetch, as it is served at /skills/rank-a-page/SKILL.md.

mttr-rank-a-page/SKILL.md
---
name: mttr-rank-a-page
description: Runs a campaign to move one page of a site up for one search, toward an aim set at the start (such as top 3), through five gates in order (clean up, one intent, substance, links inside, links from outside), each opened only by a proof from a read of the live site, and keeps a log, a weekly read-out and the campaign's time to rank. Use when asked to rank a page, get a page to page one, move up for a keyword, or run an SEO campaign on one page; or when a page ranks on page two for a search that matters. Works with mttr connected, which reads the site and checks each gate, or alone with a campaign.md kept in the repository. Not for buying links or promising a place.
metadata:
  author: subinternal
  version: "1.2.1"
---

<!-- subinternal:header -->
```
╭─────────────────────────────────────────────────────────────────╮
│        ▄                                                        │
│      ▄ █    mttr                                                │
│    ▄ █ █    rank a page                                         │
│  ▄ █ █ █                                                        │
│                                                                 │
│  skill 1.2.1  ·  by subinternal  ·  mttr.si/skills/rank-a-page  │
╰─────────────────────────────────────────────────────────────────╯
```

Print this header once, exactly as it is, in a code block, as the first thing you show when this skill starts. Then go on.
<!-- /subinternal:header -->

# Rank a page

Move one page up for one search, toward an aim. You work in the site's own repository, on one campaign at a time, through five gates in order. A gate opens only on a proof, a read of the live site or the person's check, and you never open one yourself.

What this does not do: it does not promise a place. Google decides where a page shows. The log says what was done and what a proof showed, and shows the place Google gave beside it; it never says one caused the other.

## The words it uses

Use these words, and only in these senses, in the log, the read-out and the conversation, so the person and any agent after you read them the same way.

- **Campaign:** one page, one search, one aim. Nothing else is worked on under it.
- **Aim:** the place the page should reach for the search, set with the person at the start, such as top 3. One number, never a range.
- **Gate:** one of the five steps below. A gate is closed until a proof opens it.
- **Proof:** the read that opened a gate, with what it counted: "Proof: mttr's read on 2026-10-25, 6 of the 10 most linked pages link here, up from 1."
- **Slip:** a gate that was open and fails at a later read. It closes again, and the work goes back to it before any later gate.
- **Read-out:** the weekly check-in, written the same way every week ([the read-out](references/report.md)).
- **Time to rank:** the days from the campaign's start to the first read-out that finds the page at its aim or better. It measures how long the page took. It does not say what moved it.
- **mttr, mean time to rank:** the mean time to rank across a person's campaigns that reached their aim, always said with how many reached it of how many run: "mttr 41 days, 3 of 5 campaigns".

A campaign has one status at a time, always written as the word:

| Status | When |
|---|---|
| Setting up | The page, search, aim or starting place is not written down yet. |
| Climbing | Work is under way and a gate opened in the last three weeks. |
| Stalled | No gate opened, and the place did not reach the aim, for three weeks. Say so in the read-out and ask the person whether to go on. |
| Holding | The page has been at its aim or better for two read-outs in a row. Time to rank stopped at the first of them. |
| Ended | The person ended it, or it held for eight weeks and they moved on. |

## Before you start

1. Ask the person, once: the page (its path on the live site), the search it should rank for, in the words people type, the aim, and whether you may deploy or only open a pull request. Write all four at the top of the log ([tracking](references/tracking.md)).
2. One page and one search. If the person names several searches, ask which one matters most; the others wait for their own campaign. Check the search fits the page: where candidates come from, reading the intent from the live results, and whether another page of the site is the better one are in [choosing the search](references/choosing-the-search.md).
3. An aim the evidence supports. From place 40, top 3 is a long campaign; say so and offer top 10 first. Never raise or lower the aim later without the person, and never to make time to rank look better. Tell the person once that changes reach Google over days to weeks and no place or date is promised ([timelines and stopping](references/timelines-and-stopping.md)).
4. Connect to mttr over MCP at `https://mttr.si/mcp` with the person's key (`mttr_signup` gives one). Without mttr, every gate below still works from the site's own files and a browser, and the log is kept by hand in `campaign.md`.
5. Find the place it starts at. With mttr and a claimed site, call `mttr_queries({ site, page: "<the page's full address>" })` for the searches the page shows for and its average position for each. Without it, ask the person for Search Console's Performance report for that page and search, or write "place unknown" rather than guess. How to read it for one page and one search, and what its average means, is in [measuring with Search Console](references/search-console.md).
6. Write the starting place, the date, the window, the impressions and the source in the log. The date is the campaign's start, where time to rank counts from. A place from a person's own search in a browser is personalised; say so if that is all there is.

The status moves from Setting up to Climbing. Then work the gates in order. Work on a gate past one that is closed is wasted.

## 1. Clean up

Make the page and the paths to it work before anything else.

- **Look at:** with mttr, `mttr_page({ site, path })` for the page's findings, and `mttr_links({ site, show: "broken" })` for broken links on the site. Without mttr, load the page, follow every link on it, and check its status and its canonical in the HTML.
- **Decide:** fix anything on this page first, then anything that leads to it: links to it that redirect or break, copies of it at other addresses (with and without a trailing slash, with filters or tracking in the address), and a canonical that points elsewhere.
- **Change:** one address for the page, every internal link pointing straight at it, a canonical to itself, and a 200 for the page with its words in the HTML before any script.
- **Opens when:** mttr's next read fails no access rule on the page and finds no broken link or duplicate touching it. Without mttr: the page answers 200 at one address, its canonical is itself, and no link to it on the site redirects. Where the person has Search Console, the URL Inspection tool's Google-selected canonical is the page's own address too ([measuring with Search Console](references/search-console.md)).

## 2. One intent

A page ranks for what it is plainly about. Make it about one thing: the search.

- **Look at:** the searches the page already shows for (`mttr_queries({ site, page })`, or Search Console). Sort them by what the person wants: to buy, to compare, a use, a place, an answer to a question.
- **Decide:** the campaign's search sets the intent. Searches of the same intent stay; a search of another intent belongs to another page. If no page answers it, list it for the person as a page to write, and a campaign of its own, and leave this one alone.
- **Change:** a title that leads with the search and says what the page is, a first heading that does the same in words a person reads, and an opening that answers the intent in the first lines. Cut from the title what belongs to other pages. See [title links](https://developers.google.com/search/docs/appearance/title-link) for what Google shows, and [what the page must answer](references/the-page.md) for a worked before and after.
- **Opens when:** the title and first heading carry the search, and none of the searches the page earns is for a different kind of page. Without Search Console data, the title and heading alone, and say the rest is unchecked.

## 3. Substance

Give the page what the pages above it give a reader, and what only this site can.

- **Look at:** the three pages that rank above it for the search. With mttr, `mttr_competitors({ site })` and `mttr_gaps({ site })` show sites near it and the subjects they cover that it does not. Read the rivals' pages yourself: what questions do they answer, how deep, with what proof?
- **Decide:** write a short brief before changing anything ([what the page must answer](references/the-page.md) has its shape and a worked one): the questions a reader of this search has, which the page answers, which it misses, and what the site knows that the rivals do not (its own products, prices, places, people, results). Do not copy a rival's structure or words.
- **Change:** add what is missing in the site's own voice: answers under headings that are the reader's questions, the real details (sizes, prices, steps, places), why to choose this site, and proof a reader can check. Keep it as long as it needs to be and no longer. See [helpful, people-first content](https://developers.google.com/search/docs/fundamentals/creating-helpful-content).
- **Opens when:** the page passes the content rules mttr checks on it (for any it fails, `mttr_examples({ site, path, rule })` shows passages that pass it, to write from), and covers the subjects the rivals cover, or has fewer than two left. Without mttr: the brief's questions each have an answer on the page, checked by the person.

## 4. Links inside

The site's own strongest pages should point here, in words that say what the page is.

- **Look at:** with mttr, `mttr_links({ site, show: "content", q: "<the page's path>" })` for the links to the page from inside other pages' text, and the site's most linked pages. Without mttr, the navigation, the home page, and the guides or categories most people land on.
- **Decide:** pick pages where a link reads naturally: a guide on the same subject, a parent category, a page that mentions the thing by name. Three good links from strong pages beat thirty from a footer.
- **Change:** a sentence on each that links to the page with words describing it, close to the search but written for a reader. Not the exact search on every link. See [link best practices](https://developers.google.com/search/docs/crawling-indexing/links-crawlable), and [links inside](references/links-inside.md) for finding the pages, a worked link and how to check it.
- **Opens when:** at least three of the site's ten most linked pages link to the page from their text, or the page is among the site's twenty most linked.

## 5. Links from outside

Earn links from sites that would point a reader here anyway.

- **Look at:** who links to the rivals above it. With mttr, `mttr_backlinks({ site })` for the sites mttr has read that link to this one. Note that mttr counts only links from sites it has read; it is not a full index.
- **Decide:** list sites that link to the rivals' pages and would gain from linking here: clubs, guides, suppliers, local groups, writers who cover the subject. Next to each, what this page gives their readers that the rival page does not.
- **Change:** nothing on the site. Write the person a short list of who to ask and what to offer, and a draft note for each. Never buy links, swap them, or ask for exact search words in the link: those are [link spam](https://developers.google.com/search/docs/essentials/spam-policies), and a page caught at it falls.
- **Opens when:** the page has as many linking sites, among those mttr has read, as the middle rival above it. Until then the list of who to ask is the work.

## Prove, log, repeat

After each change ships:

1. With mttr, log it with `mttr_log_work({ site, step: "changed", did })`, then `mttr_rescan({ site, reason })` and, once the read is done, `mttr_changes({ site })` for what it moved. A read that opens the gate is logged with `step: "checked"` and its proof. A read that does not is logged with `step: "stuck"` and why, and the gate stays closed.
2. Without mttr, write the change in `campaign.md` with the date and the address, and what the person checked.
3. Never open a gate yourself. A read opens it, or the person does, and the log says which.
4. At each read, check the open gates too. One that fails again has slipped: close it, say so in the log, and go back to it.

The log's shape is in [tracking](references/tracking.md), with a worked log eight weeks in, and the read-out in [the read-out](references/report.md), with worked weeks: a slip, the aim reached, a stall, the end. Write the read-out each week the same way, even when nothing moved, and set the campaign's status in it. When a read or a figure does not behave, see [troubleshooting](references/troubleshooting.md).

## Reaching the aim

1. The first read-out that finds the page at its aim or better stops the clock: write the time to rank in days, from the start date, with the dates and the source.
2. The status stays Climbing until a second read-out in a row finds it there; then it is Holding. If the second does not, the clock does not restart: the time to rank stands, and the read-out says the place fell back.
3. While it holds, keep reading the site and keep the gates open. A slip while holding is worked on before anything new.
4. When the person ends it, or after eight weeks holding, write the campaign's last read-out and set it to Ended. Their mttr is the mean time to rank of the campaigns that reached their aim, said with how many reached it of how many were run.

## Stopping or changing target

Raise it with the person, never decide alone, when the read-out shows any of these: Stalled twice in a row; all five gates open for eight read-outs with the place no better than the start; the page still not shown for the search after gates one to three opened; another page of the site shown for the search more often; the results changed kind since the start. A new search, page or aim is a new campaign with its own start; this one ends and stays in the count. The signals, what each suggests and what to offer are in [timelines and stopping](references/timelines-and-stopping.md).

## Rules you keep

- One page, one search, one aim, five gates in order.
- Never promise a place or a date. Google decides both.
- Never claim a place moved because of a gate. Say what was done, what was proved, and the place Google gave, side by side. Time to rank measures; it never credits.
- Never change the aim without the person, and never leave a campaign that missed its aim out of their mttr's count.
- Never buy links, swap them, or ask for keyword-rich link text.
- Never fill a page with the search repeated, or with text a reader does not need.
- Ask before deploying unless the person said you may.

## A worked example, an illustration

This shows the method, not a real site's results. An outdoor shop's category page, `/hiking-boots`, for the search "waterproof hiking boots", with an aim of top 3, from place 14.

1. **Clean up:** two links to retired products return 404, and a filtered copy of the page has no canonical; both are fixed, and the next read opens the gate.
2. **One intent:** the title read "Hiking Boots for Men, Women & Kids | Best Waterproof Boots for Winter". Winter boots and kids' boots are other searches with other pages; the title becomes "Waterproof Hiking Boots | Shop Men's and Women's", and the winter page takes the rest.
3. **Substance:** the three pages above it each explain sizing, what waterproof means in practice, and care. The page gains a short guide to each, a paragraph on why buy here (fitting help, free returns), and the range named.
4. **Links inside:** the shop's guides to trails and to layering, its most linked pages, each gain a sentence linking to the page with the words "waterproof hiking boots".
5. **Links from outside:** two trail clubs and a gear blog link to rivals' sizing guides. The shop's new sizing guide is offered to them as the better page.

If the read-out of week 7 finds it at place 3, and week 8 does again, its time to rank is the days from the start to week 7's read-out, and the campaign is Holding.

## Sources

- [Spam policies for Google web search](https://developers.google.com/search/docs/essentials/spam-policies): why links are earned, never bought or swapped, at gate five.
- [Creating helpful, reliable, people-first content](https://developers.google.com/search/docs/fundamentals/creating-helpful-content): what substance means at gate three.
- [Influencing your title links in search results](https://developers.google.com/search/docs/appearance/title-link): how the title at gate two is shown.
- [Link best practices for Google](https://developers.google.com/search/docs/crawling-indexing/links-crawlable): link text at gate four.
- [How to specify a canonical URL with rel="canonical" and other methods](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls): one address for the page at gate one.
- [Performance report (Search results): Overview and basic setup](https://support.google.com/webmasters/answer/7576553): where the page's place, and so its time to rank, comes from without mttr; results differ by person, newest data is preliminary, and the chart and table count differently.
- [Performance report (Search results): Advanced filtering and comparison](https://support.google.com/webmasters/answer/17011165): filtering to one page and comparing two windows, and why filtered totals leave out anonymized queries.
- [What are impressions, position, and clicks?](https://support.google.com/webmasters/answer/7042828): position as the topmost place held, averaged, and recorded only when the page was shown.
- [URL Inspection tool](https://support.google.com/webmasters/answer/9012289): whether the page is on Google, and the declared canonical against the one Google selected, at gate one.
- [Ask Google to recrawl your URLs](https://developers.google.com/search/docs/crawling-indexing/ask-google-to-recrawl): asking for a crawl after a change, and that it takes days to weeks.
- [SEO Starter Guide: The Basics](https://developers.google.com/search/docs/fundamentals/seo-starter-guide): that changes take hours to months to show, to wait a few weeks before judging, and that there is no preferred word count.
- [Debugging drops in Google Search traffic](https://developers.google.com/search/docs/monitor-debug/debugging-search-traffic-drops): that small moves in position happen at any time, and that no change is sure to have an effect.
- [Do you need an SEO?](https://developers.google.com/search/docs/fundamentals/do-i-need-seo): that no one can guarantee a first place, so the campaign never promises one.

Sources

17 pages

Each is in a ## Sources list in the file that cites it, by the page’s own title.

Google Search Central

  1. 1Influencing your title links in search results, Google Search Central. How the title at gate two is shown.
  2. 2Creating helpful, reliable, people-first content, Google Search Central. What substance means at gate three.
  3. 3Link best practices for Google, Google Search Central. Link text at gate four.
  4. 4Spam policies for Google web search, Google Search Central. Why links are earned, never bought or swapped, at gate five.
  5. 5How to specify a canonical URL with rel="canonical" and other methods, Google Search Central. One address for the page at gate one.
  6. 6Performance report (Search results): Overview and basic setup, Search Console Help. Where the page's place, and so its time to rank, comes from without mttr; results differ by person, newest data is preliminary, and the chart and table count differently.
  7. 7Performance report (Search results): Advanced filtering and comparison, Search Console Help. Filtering to one page and comparing two windows, and why filtered totals leave out anonymized queries.
  8. 8What are impressions, position, and clicks?, Search Console Help. Position as the topmost place held, averaged, and recorded only when the page was shown.
  9. 9URL Inspection tool, Search Console Help. Whether the page is on Google, and the declared canonical against the one Google selected, at gate one.
  10. 10Ask Google to recrawl your URLs, Google Search Central. Asking for a crawl after a change, and that it takes days to weeks.
  11. 11SEO Starter Guide: The Basics, Google Search Central. That changes take hours to months to show, to wait a few weeks before judging, and that there is no preferred word count.
  12. 12Debugging drops in Google Search traffic, Google Search Central. That small moves in position happen at any time, and that no change is sure to have an effect.
  13. 13Do you need an SEO?, Google Search Central. That no one can guarantee a first place, so the campaign never promises one.

Agent skills format and clients

  1. 14Extend Claude with skills, Anthropic, Claude Code docs. Where Claude Code loads skills from, and how one is called.
  2. 15Build skills, OpenAI, ChatGPT Learn. Where Codex loads skills from, and how one is called.
  3. 16Agent Skills, Cursor docs. Where Cursor loads skills from, and how one is called.
  4. 17Specification, Agent Skills. The format every skill here keeps: the folder, the frontmatter and its limits.