# mttr

> Reads a site as search engines and AI assistants do, ranks its fixes, and checks them live.

- name: si.mttr/mttr
- version: 1.0.0
- connection class: R0 (autonomous)
- trust: 82/100 flags: no-repository
- quality: 82/100 (good)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/si.mttr%2Fmttr
- tools: https://api.protogrid.dev/v1/servers/si.mttr%2Fmttr/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "mttr": {
      "type": "http",
      "url": "https://mttr.si/mcp",
      "headers": {
        "Authorization": "Bearer ${MTTR_TOKEN}"
      }
    }
  }
}
```

Placeholders to fill: `${MTTR_TOKEN}`.

## Trust

- hygiene: 80
- liveness: 99
- freshness: 100
- provenance: 55
- drivers: +dns-namespace +website +reachable +uptime-98% +updated-20d-ago -no-repository
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 82/100 (good)

### protocol: 75 (weight 25)

- warn `protocol.modern`: newest supported version is 2025-06-18; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
- n/a `protocol.stateless`: only applies to 2026-07-28 servers
- pass `protocol.transport`: streamable HTTP
- n/a `protocol.list_ttl`: only applies to 2026-07-28 servers

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 88 (weight 30)

- pass `tools.descriptions`: every tool has a description
- pass `tools.description_length`: descriptions are concise
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 17 of 17 tools declare readOnlyHint or destructiveHint
- fail `tools.directory_hints`: no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: clickd_propose (idempotentHint); clickd_log_work (idempotentHint); clickd_todo (destructiveHint, idempotentHint); …
- pass `tools.token_cost`: about 4,596 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump
- pass `tools.hidden_text`: no hidden text in tool names, descriptions, schemas or annotations

### stability: 83 (weight 15)

- warn `stability.changes`: 99 tool changes in 30 days
- pass `stability.rug_pull`: no tool changed its meaning under the same name
- pass `stability.new_links`: no tool change named a new site

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 17, about 4,596 tokens to load them all
- tool set hash: 66facca9a0b6f24bca7f59a422d53992
- tools last changed: 2026-11-01T19:26:24.942Z
- badge: [![protogrid quality](https://protogrid.dev/badge/si.mttr/mttr.svg)](https://protogrid.dev/servers/si.mttr/mttr)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

- 2026-11-01 `mttr_events` removed
  - The newest things that happened: reads asked for, finished and failed, scores that moved, rules that were fixed.
- 2026-11-01 `mttr_changes` removed
  - What the latest run of a site changed against the run before it: the score, rules now passing, rules newly failing, and pages added and removed. Call it after a rescan is done. For a site whose server sends its own counts, "visits" sets people, people an assistant sent and crawler fetches in the week before the run against the week since.
- 2026-11-01 `mttr_market` removed
  - A site set against its market, or its nearest sites when it has none: its place by score, the median score, and for every rule the share of pages passing here against the market median and the best site, with the rules furthest behind first.
- 2026-11-01 `mttr_rules` removed
  - The rulebook: every rule clickd checks, with its stage, its weight and how to fix a failure.
- 2026-11-01 `mttr_structure` removed
  - How a site is put together: its sections, how many clicks each sits from the home page, how much of each is linked from page content, and the links between sections.
- 2026-11-01 `mttr_todo` removed
  - The person's work across their sites, as their progress page shows it: the next fix to make, with the words to work from, then every other fix by worth, what slipped back, what a read has checked fixed, and sites changed since their last read that need reading again. A fix counts as done only once a later read finds it passing.
- 2026-11-01 `mttr_product_check` removed
  - Checks one live product page's structured data the way the free schema checker does: each Product, ProductGroup and Offer field by field against the fields Google lists for merchant listings (name, image, offers, price above zero, priceCurrency in ISO 4217, availability, shipping, returns, brand, GTIN, variants, ratings), each present, missing or invalid with what to do, and a guess at whether a shopper can buy on the page. Use it on one product URL per template before and after a fix. It reads only what the page publishes; Merchant Center and Google decide eligibility for any Google feature.
- 2026-11-01 `mttr_queue` removed
  - What the person queued for you from their clickd, oldest first: each task with its id, its site, and the words to work from. Check it when you start, and whenever an answer says tasks are waiting.
- 2026-11-01 `mttr_near` removed
  - The sites closest in meaning to one site, closest first: the ones writing about the same work, which are its likeliest rivals. Read from one vector a site kept in the catalog, so both sites must have been embedded.
- 2026-11-01 `mttr_similar` removed
  - Pages of a site that mean nearly the same thing, grouped, which may compete for one search. With a path, the pages nearest that page, each with the two passages that come closest. Read from vectors of the page text, so the site must have been embedded. Passages come under "quoted".

Full history: https://api.protogrid.dev/v1/servers/si.mttr%2Fmttr/changes

## Remotes

- https://mttr.si/mcp (streamable-http, auth none, reachable true, uptime30d 0.97530866)

## Packages

_none_

## Tools (17)

- `clickd_brief`: Gets a site's fixes as a work order: what to fix, in what order, how, why and on which pages.
When: at the start of work on a site, and after clickd_changes says a read is done.
Instead: clickd_site for the score to tell a person; clickd_todo for the next fix across all the person's sites.
Inputs: `site` is a domain, like example.com. `format` is markdown (the default), the whole list, or steps: the four fixes worth the most as steps with pages and points, and words to hand another agent.
Returns: with markdown, the Markdown text alone; with steps, JSON with steps, prompt, report and caveat.
Fails: a site never read, or a draft, answers not found; clickd_rescan reads it. Works with no key.
- `clickd_changes`: Says what a site's latest read changed against the one before: score, rules fixed and newly failing, pages added and removed.
When: after clickd_rescan, every minute or two with its job until the read is done.
Instead: clickd_rescan to ask for the read; clickd_site for the report as it now stands.
Inputs: `site` is a domain, like example.com. `job` is the id clickd_rescan returned: the reply then says where that read stands, with changes only once it is done.
Returns: host, run, changes (null for a first read) and visits; with job, job ({ id, state, ahead }), changes null until done.
Fails: a site never read, or a job for another site, answers not found; a failed read says so in job. Needs a key.
- `clickd_check`: Checks one live address now, as the free tools do: product data, a page as an agent reads it, an X card, a certificate, or location pages.
When: before and after a fix to one page, link or host.
Instead: clickd_rescan and clickd_changes for every page of a site; clickd_pages for a page as last read.
Inputs: `kind` is product, agent, x_card, ssl or locations. `url` is the page's full address; for ssl, only its host is used; for locations, the brand's site.
Returns: the findings, each with its state in a word and what to do when it is wrong.
Fails: a private address is refused, and robots.txt is obeyed; the free tools' hourly allowance applies. Works with no key.
- `clickd_citations`: Lists what assistants were found to cite for a site, question by question, from lookups already made, and the credits left.
When: to tell a person whether assistants cite their site, at no cost.
Instead: clickd_site for how well formed the pages are, which is not whether they are cited.
Inputs: `site` is a domain, like example.com.
Returns: host, rows, credits, price, perDay and note.
Fails: rows is empty until a lookup is made. Needs a key and a claim.
- `clickd_claim`: Claims a site for the person: the TXT record or file that proves it is theirs, then the check that finds it.
When: to open a site's private parts, such as rivals, citations and proposals.
Instead: clickd_signup first for a key; clickd_site for a public report, which needs no claim.
Inputs: `site` is a domain, like example.com. `step` is start (the default), for the record and file, or check, to look for either and add the site.
Returns: with start, site, record, dns, file and note; with check, site, claimed and how.
Fails: check before the proof is up answers claimed false; a new DNS record can take minutes to be seen. Needs a person's key.
- `clickd_leaderboard`: Lists the public leaderboard: every ranked site by its latest score, the board of one crowd, or a record.
When: to show a person where a site places among every site, or sites like it.
Instead: clickd_site for one site's own place; clickd_rivals for the sites closest to one site.
Inputs: `in` (a line of work such as trades), `state` (two letters), `city` (needs state) and `size` narrow the board, together or alone. `record` gives one record in place of the places. `limit` and `offset` page it.
Returns: total, offset, limit, sites, tiers and note; with record, its sites and what it counted.
Fails: a crowd too small answers an empty board; drafts and closed sites are not ranked. Works with no key.
- `clickd_log_work`: Records a step of work on a site: what you planned, changed or checked, or where you got stuck.
When: after each step, including one that carries out a proposal or a queued task.
Instead: clickd_propose before deploying to a site set to approve; clickd_todo for tasks waiting.
Inputs: `site` is a domain, like example.com. `step` is planned, changed, checked or stuck; `did` says what. `found`, `files` and `rules` (comma separated) add detail. `proposal` names the proposal carried out, `task` the queued task finished. Never send private data.
Returns: kept, site, step and note, with proposal or task and left when given.
Fails: a proposal or task not the person's keeps nothing and says so. Needs a person's key.
- `clickd_pages`: Lists the pages of a site's latest read with status, depth, words and failing rules, or gives one page in full.
When: to find the pages behind a fix, or everything wrong with one page.
Instead: clickd_brief for the fixes in order; clickd_check for a page as it is live now.
Inputs: `site` is a domain, like example.com. `path`, such as /pricing, gives that page in full, and the rest is then ignored. `failing` (a rule id), `q`, `kind` and `section` narrow the list, `sort` and `dir` order it, `limit` and `offset` page it.
Returns: host, run, total and pages; one page as path, status, failing, needsAPerson, linkedFrom, linksTo and quoted.
Fails: a site or page not read answers not found. Needs a key; any key reads a public site.
- `clickd_proposals`: Lists the person's proposals and where each stands, or one by id, and whether a site is set to approve or automatic.
When: before work on a claimed site, and every few minutes after clickd_propose until it is answered.
Instead: clickd_propose to make one; clickd_todo for the work itself.
Inputs: `id` is one proposal from clickd_propose; deploy only once it says approved. `site` gives that site's proposals and its mode. Neither, every proposal; never both.
Returns: with id, proposal and promise; otherwise proposals and promise, and with site, site and mode.
Fails: id and site together are refused; one not the person's answers not found. Needs a person's key.
- `clickd_propose`: Proposes a change before you deploy it, emailing the person Approve and Decline links that lapse in 72 hours.
When: before each deploy to a site clickd_proposals says is set to approve.
Instead: clickd_proposals with the id to wait for the answer; clickd_log_work, naming it, once carried out.
Inputs: `site` is a domain, like example.com. `title` is the change in a few words; `summary` what it does and why; `rule` the rule id it answers; `pages` the paths it changes, comma separated; `diff` a unified diff, shown and never applied.
Returns: proposal ({ id, state, deploy, ... }), note and promise.
Fails: a site not claimed with this key answers not found; 20 proposals a site an hour at most. Needs a person's key.
- `clickd_rescan`: Puts a fresh read of a site in line and returns a job to follow.
When: once a fix is deployed, or for a site clickd has never read.
Instead: clickd_changes with the job to see what the read changed; clickd_check for one live page with no read.
Inputs: `site` is a domain, like example.com. `reason` says what was changed, in a few words.
Returns: job, added (false when a read was already in line), allowedAt and ahead.
Fails: a site read in the last ten minutes answers allowedAt, when to ask again; a private address is refused. Needs a key.
- `clickd_rivals`: Sets a site against its rivals from kept reads: who they are, how close, and where it is behind.
When: to pick the fixes that matter against the sites a buyer compares it with.
Instead: clickd_leaderboard for places among every site; clickd_site for its own score.
Inputs: `site` is a domain, like example.com. `view` is competitors (default: rivals doing similar work), near (closest in meaning), market (rule by rule), or rules or content (two sites side by side). `with` is the other site, for rules or content; alone, it means rules. `limit` is for near, 10 if left out.
Returns: host, then by view: local, nearby and elsewhere; sites; rules; ahead and behind; or pages.
Fails: a site with no meaning yet answers found or embedded false; rules or content with no with says to give it. Needs a key and a claim.
- `clickd_rules`: Lists the rulebook: every rule clickd checks, with its id, stage, weight and fix.
When: to explain a fix to a person, or to find a rule's id.
Instead: clickd_brief for the rules one site fails; clickd_pages with failing for the pages failing one.
Inputs: none.
Returns: rules, each with id, title, stage, weight and fix.
Fails: nothing to refuse. Works with no key.
- `clickd_schema_create`: Makes JSON-LD for one page from the fields given, ready to paste, and fetches nothing.
When: to write the structured data a fix asks for; call it with only type to see the fields.
Instead: clickd_check with kind product to check a live product page.
Inputs: `type` is one of the types offered; `as` a more exact one, such as Plumber; `fields` the values by field key, as text. Give only what the page shows.
Returns: jsonld, script (ready to paste), missing, problems, recommended and fields.
Fails: a type not offered says which are. Works with no key.
- `clickd_signup`: Gets a free key, shown once, with the command to connect with it: the person's by email, or a throwaway one.
When: when a call needs a key and there is none.
Instead: clickd_claim, with a person's key, to make a site theirs.
Inputs: `email` is the person's own address; leave it out for a throwaway key, which reads and asks for a few reads an hour.
Returns: key, connect and next, with email or anonymous.
Fails: an email already signed up, or not an email, says so; three an hour from one address. Needs no key.
- `clickd_site`: Gets a site's report from its latest read: score, grades, place among ranked sites, towns served, and every fix with its failing pages.
When: to tell a person how a site stands.
Instead: clickd_brief for the fixes as a work order; clickd_rivals for its rivals; clickd_check for one live page.
Inputs: `site` is a domain, like example.com. `view` is report (the default) or agent: the whole-site Agent View from the same read, with each AI crawler as robots.txt treats it.
Returns: host, score, grade, stages, grades, rank, served, fixes and card, a picture to send the person; with agent, the Agent View's figures.
Fails: a site never read, a draft or one kept unnamed answers not found. Works with no key.
- `clickd_todo`: Gets the person's work across all their sites: the next fix and every other by worth, or the tasks they queued for you.
When: when you start work for the person, and when a reply says tasks are waiting.
Instead: clickd_brief for every fix on one site; clickd_log_work with task to finish a queued task.
Inputs: `show` is board (the default): next, every fix by worth, what slipped and what is fixed; or queue: the person's tasks for you, oldest first.
Returns: with board, next, todo, slipped, fixed, waiting and note; with queue, tasks and note.
Fails: an account with no claimed site has an empty board. Needs a person's key.
