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.
Version 1.2.1Updated October 23, 2026
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.
- 1Clean upMake the page and the paths to it work before anything else.
Call mttr_page({ site, path }) - 2One intentA page ranks for what it is plainly about. Make it about one thing: the search.
Call mttr_queries({ site, page }) - 3SubstanceGive the page what the pages above it give a reader, and what only this site can.
Call mttr_competitors({ site }) - 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>" }) - 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:
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.
- mttr_signup
- mttr_queries
- mttr_page
- mttr_links
- mttr_competitors
- mttr_gaps
- mttr_examples
- mttr_backlinks
- mttr_log_work
- mttr_rescan
- mttr_changes
- mttr_similar
- mttr_compare
- mttr_rules
- mttr_structure
- mttr_pages
- mttr_traffic
- mttr_job
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.
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.mdNew-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 -UseBasicParsingPuts 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.
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.mdNew-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 -UseBasicParsingPuts 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.
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.mdNew-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 -UseBasicParsingPuts 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.
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.mdNew-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.md
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.md
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.md
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.md
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.md
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.md
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.md
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.md
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.md
Symptoms in gates and reads, the place, and the work, each with its likely cause and the fix.
- tracking.md
- CHANGELOG.md
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.
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.
Its six sections
- L5With mttrEvery change goes to
mttr_log_work({ site, step, did }):plannedbefore you start on a gate,changedonce it ships,checkedonce a read proved… - L9Without mttrKeep
campaign.mdat the top of the repository. - L44A gate's states**closed:** no proof yet.
- L52A campaign's statusSetting up, Climbing, Stalled, Holding or Ended, as SKILL.md defines them.
- L56A worked log, eight weeks inAn illustration, not a real site's results.
- L104A person's mttrAcross campaigns, keep
campaigns.mdbeside them, one line each: the page, the search, the aim, the start, the status, and the time to rank once…
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.
Its four sections
- L5What it holds**The place now against the aim and the start,** with the source, the dates it covers and the impressions behind it.
- L15How it readsSay what was done and what was proved, and the place Google gave, side by side.
- L30More weeks, as they readIllustrations of the same campaign as tracking logs it, each for a different kind of week.
- L88What a read-out never saysThat a change caused the place.
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.
Its five sections
- L5Where candidate searches come fromIn order of how much they can be trusted:
- L16Is it the right page for the search?Before committing, check that the page you were given is the one the site should rank:
- L24Reading the intent from the live resultsGoogle's results for a search are the best record of what people typing it want.
- L44When the search and the page do not fit
- L54Setting an aim the evidence supportsThese are the skill's own rules of thumb, not Google's: Google publishes no timeline for a place.
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.
Its five sections
- L5The brief, before any changeWrite it in the log, short, before touching the page.
- L24Title, first heading, opening: before and afterThe title leads with the search and says what the page is.
- L53Substance: answers under the reader's questionsAdd what the brief says is missing, each under a heading that is the reader's question:
- L76Edge cases that trip agents
- L88Verifying gates two and three**Gate two, with mttr:** after the rescan,
mttr_page({ site, path })shows the title and first heading, and notitleorone-h1finding.
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.
Its four sections
- L5Find the pages that should link here**The site's strongest pages.** With mttr,
mttr_structure({ site })andmttr_pages({ site })show how the site hangs together and its pages;… - L14Write the link: before and afterBefore, on the guide
/guides/layering-for-wet-weather: - L39Edge cases
- L50Verifying 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.
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.
Its six sections
- L5With 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.
- L15Without mttr: the Performance report, by handAsk the person to open Search Console, the property for the site, then Performance, Search results, and set:
- L30What the figures meanFrom Google's own help (What are impressions, position, and clicks?
- L40Reading a week's figure honestly**Few impressions, a jumpy average.** A place from 20 impressions can move several places on no change at all.
- L47Checking the page Google hasThe URL Inspection tool in Search Console says how Google holds the page (URL Inspection tool).
- L56Troubleshooting the figures
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.
Its five sections
- L5What Google says about timingEverything below is quoted or taken from Google's own pages, each fetched for this skill:
- L16What to tell the person at the startSay it once, plainly, and write it in the log under the aim:
- L22The 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:
- L31When to stop or change targetAsk the person, never decide alone.
- L45Changing target is a new campaignAn aim, a search or a page is never changed inside a running campaign:
Symptoms in gates and reads, the place, and the work, each with its likely cause and the fix.
Its three sections
- L5Gates and reads
- L17The place
- L27The 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.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.
- The page's rules are read with
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.
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.
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.mdwithout 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.
---
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
- 1Influencing your title links in search results, Google Search Central. How the title at gate two is shown.
- 2Creating helpful, reliable, people-first content, Google Search Central. What substance means at gate three.
- 3Link best practices for Google, Google Search Central. Link text at gate four.
- 4Spam policies for Google web search, Google Search Central. Why links are earned, never bought or swapped, at gate five.
- 5How to specify a canonical URL with rel="canonical" and other methods, Google Search Central. One address for the page at gate one.
- 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.
- 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.
- 8What are impressions, position, and clicks?, Search Console Help. Position as the topmost place held, averaged, and recorded only when the page was shown.
- 9URL Inspection tool, Search Console Help. Whether the page is on Google, and the declared canonical against the one Google selected, at gate one.
- 10Ask Google to recrawl your URLs, Google Search Central. Asking for a crawl after a change, and that it takes days to weeks.
- 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.
- 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.
- 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
- 14Extend Claude with skills, Anthropic, Claude Code docs. Where Claude Code loads skills from, and how one is called.
- 15Build skills, OpenAI, ChatGPT Learn. Where Codex loads skills from, and how one is called.
- 16Agent Skills, Cursor docs. Where Cursor loads skills from, and how one is called.
- 17Specification, Agent Skills. The format every skill here keeps: the folder, the frontmatter and its limits.