Agent View

The site as an AI agent gets it, beside the site as a person sees it. What it can read, what it has to cut away, and what it never sees.

askyourdatabase.com90 pages read on October 24, 2026
Full screen
askyourdatabase.com/seo/sql-dashboard/reference.sql
askyourdatabase.com/seo/sql-dashboard/reference.sql
No main heading

-- Synthetic reference only. Run in a fresh PostgreSQL test session. -- TEMP objects disappear with the session; never load this into production. CREATE TEMP TABLE dashboard_params ( start_date date, end_date date, refund_before date, tenant_id text, currency text ); INSERT INTO dashboard_params VALUES ('2026-09-01','2026-09-05','2026-09-05','A','USD'); CREATE TEMP TABLE dashboard_orders ( id integer PRIMARY KEY, tenant_id text, ordered_on date, status text, currency text, region text, gross_cents integer ); INSERT INTO dashboard_orders VALUES (101,'A','2026-09-01','paid','USD','North',12000), (102,'A','2026-09-02','paid','USD','North',8000), (103,'A','2026-09-02','paid','USD','South',6000), (104,'A','2026-09-03','cancelled','USD','South',9000), (105,'A','2026-09-03','paid','USD','North',4000), (106,'A','2026-10-01','paid','USD','North',50000), (107,'A','2026-09-01','paid','EUR','North',7000), (108,'B','2026-09-01','paid','USD','North',90000); CREATE TEMP TABLE dashboard_refunds ( id integer PRIMARY KEY, order_id integer, refunded_on date, amount_cents integer ); INSERT INTO dashboard_refunds VALUES (1,101,'2026-09-02',1000), (2,101,'2026-09-03',500), (3,103,'2026-09-03',600), (4,101,'2026-10-01',2000); CREATE TEMP VIEW dashboard_base AS WITH refunds_per_order AS ( SELECT r.order_id, SUM(r.amount_cents) AS refund_cents FROM dashboard_refunds r CROSS JOIN dashboard_params p WHERE r.refunded_on < p.refund_before GROUP BY r.order_id ) SELECT o.id, o.ordered_on, o.region, o.gross_cents - COALESCE(r.refund_cents,0) AS net_cents FROM dashboard_orders o CROSS JOIN dashboard_params p LEFT JOIN refunds_per_order r ON r.order_id = o.id WHERE o.tenant_id = p.tenant_id AND o.currency = p.currency AND o.status = 'paid' AND o.ordered_on >= p.start_date AND o.ordered_on < p.end_date; -- Q1: KPI cards: net_cents=27900, orders=4, average_order_cents=6975.00 SELECT COALESCE(SUM(net_cents),0) AS net_cents, COUNT(*) AS orders, ROUND(SUM(net_cents)::numeric / NULLIF(COUNT(*),0),2) AS average_order_cents FROM dashboard_base; -- Q2: Daily chart: Sep01=10500, Sep02=13400, Sep03=4000, Sep04=0 WITH calendar AS ( SELECT generate_series(p.start_date::timestamp, (p.end_date-1)::timestamp, interval '1 day')::date AS day FROM dashboard_params p ) SELECT c.day, COALESCE(SUM(b.net_cents),0) AS net_cents, COUNT(b.id) AS orders FROM calendar c LEFT JOIN dashboard_base b ON b.ordered_on = c.day GROUP BY c.day ORDER BY c.day; -- Q3: Regional table: North=22500/3 orders; South=5400/1 order SELECT region, SUM(net_cents) AS net_cents, COUNT(*) AS orders, ROUND(SUM(net_cents)::numeric / COUNT(*),2) AS average_order_cents FROM dashboard_base GROUP BY region ORDER BY region;

Drawn from the HTML mttr fetched, not a screenshot.
page.md248 words, about 670 tokens
-- Synthetic reference only. Run in a fresh PostgreSQL test session. -- TEMP objects disappear with the session; never load this into production. CREATE TEMP TABLE dashboard_params ( start_date date, end_date date, refund_before date, tenant_id text, currency text ); INSERT INTO dashboard_params VALUES ('2026-09-01','2026-09-05','2026-09-05','A','USD'); CREATE TEMP TABLE dashboard_orders ( id integer PRIMARY KEY, tenant_id text, ordered_on date, status text, currency text, region text, gross_cents integer ); INSERT INTO dashboard_orders VALUES (101,'A','2026-09-01','paid','USD','North',12000), (102,'A','2026-09-02','paid','USD','North',8000), (103,'A','2026-09-02','paid','USD','South',6000), (104,'A','2026-09-03','cancelled','USD','South',9000), (105,'A','2026-09-03','paid','USD','North',4000), (106,'A','2026-10-01','paid','USD','North',50000), (107,'A','2026-09-01','paid','EUR','North',7000), (108,'B','2026-09-01','paid','USD','North',90000); CREATE TEMP TABLE dashboard_refunds ( id integer PRIMARY KEY, order_id integer, refunded_on date, amount_cents integer ); INSERT INTO dashboard_refunds VALUES (1,101,'2026-09-02',1000), (2,101,'2026-09-03',500), (3,103,'2026-09-03',600), (4,101,'2026-10-01',2000); CREATE TEMP VIEW dashboard_base AS WITH refunds_per_order AS ( SELECT r.order_id, SUM(r.amount_cents) AS refund_cents FROM dashboard_refunds r CROSS JOIN dashboard_params p WHERE r.refunded_on < p.refund_before GROUP BY r.order_id ) SELECT o.id, o.ordered_on, o.region, o.gross_cents - COALESCE(r.refund_cents,0) AS net_cents FROM dashboard_orders o CROSS JOIN dashboard_params p LEFT JOIN refunds_per_order r ON r.order_id = o.id WHERE o.tenant_id = p.tenant_id AND o.currency = p.currency AND o.status = 'paid' AND o.ordered_on >= p.start_date AND o.ordered_on < p.end_date; -- Q1: KPI cards: net_cents=27900, orders=4, average_order_cents=6975.00 SELECT COALESCE(SUM(net_cents),0) AS net_cents, COUNT(*) AS orders, ROUND(SUM(net_cents)::numeric / NULLIF(COUNT(*),0),2) AS average_order_cents FROM dashboard_base; -- Q2: Daily chart: Sep01=10500, Sep02=13400, Sep03=4000, Sep04=0 WITH calendar AS ( SELECT generate_series(p.start_date::timestamp, (p.end_date-1)::timestamp, interval '1 day')::date AS day FROM dashboard_params p ) SELECT c.day, COALESCE(SUM(b.net_cents),0) AS net_cents, COUNT(b.id) AS orders FROM calendar c LEFT JOIN dashboard_base b ON b.ordered_on = c.day GROUP BY c.day ORDER BY c.day; -- Q3: Regional table: North=22500/3 orders; South=5400/1 order SELECT region, SUM(net_cents) AS net_cents, COUNT(*) AS orders, ROUND(SUM(net_cents)::numeric / COUNT(*),2) AS average_order_cents FROM dashboard_base GROUP BY region ORDER BY region;

No <main>: Wrap the page’s own content in <main>, so a reader knows where it starts and stops, and Clean can be measured. No h1: Give each one h1 that says what the page is.

The figures

90 pages, set against the 167,893 sites with figures.

See its rivals
Readablehigher is better
100%90 of 90 pages
All 167,893 sitesBetter than 47%

Pages whose own text is in the HTML the server sends, enough of it for their kind.

Cleanhigher is better
93%middle page
All 167,893 sitesBetter than 91%

Of the words before script, the share that are the page and not menus, footer and forms. 11 pages are not measured, with no <main> or no words.

Costshown, never scored
244,794tokens
About 2,720 a page

To read every page once. A long page that answers well is not worse for it. Tokens are estimated at about 4 characters each.

How its pages spread on Clean

Its middle, 93%

70 pages measured. Not measured: 11 with no <main> or no words.

Against its rivals

The sites nearest it by what they do, with figures. Close means similar work, not better.

Readinghigher is betterCostnot scored
SiteReadableCleanTokens a page
askyourdatabase.comThis site, 90 pages100%93%2,720
forem.com100 pages98%75%1,966
dqc.ai100 pages96%44%876
itpathsolutions.com100 pages98%96%6,200

First of 4 on Readable, second on Clean.

AI crawler access

What robots.txt says to each, as read on October 24, 2026. 8 of 8 may read the site.

Open robots.txt
Crawlerrobots.txt saysUsed forThe line that decides
GPTBotOpenAINot namedTraining modelsFalls to User-agent: *
OAI-SearchBotOpenAINot namedChatGPT searchFalls to User-agent: *
ChatGPT-UserOpenAINot namedA page a person asks aboutFalls to User-agent: *
ClaudeBotAnthropicNot namedTraining modelsFalls to User-agent: *
Claude-SearchBotAnthropicNot namedClaude’s searchFalls to User-agent: *
PerplexityBotPerplexityNot namedPerplexity searchFalls to User-agent: *
Google-ExtendedGoogleNot namedTraining GeminiFalls to User-agent: *
bingbotMicrosoftNot namedBing and CopilotFalls to User-agent: *

Every AI crawler mttr checks may read it. Not named means the rules for every crawler apply.

Every page

Worst first. Each opens in Agent View at the top.

19 pages of 81 lose something. Pick a loss to see what to do about it.Open the action plan

What an agent getshigher is betterSignalsCostnot scored
PageWordsCleanReadableMain headingTokensWhat it loses
/resources/sql-server-latest-status-example.sql142No <main>YesNone291No <main> and 1 more
/seo/ai-database-query/reference.sql243No <main>YesNone581No <main> and 1 more
/seo/crm-pipeline/reference.sql189No <main>YesNone349No <main> and 1 more
/seo/mysql-gui/session-timezone.sql115No <main>YesNone214No <main> and 1 more
/seo/natural-language-rollout/reference.sql144No <main>YesNone353No <main> and 1 more
/seo/postgresql-report/reference.sql142No <main>YesNone380No <main> and 1 more
/seo/sql-dashboard/reference.sql248No <main>YesNone670No <main> and 1 more
/seo/sql-query-generator/join-aggregation.sql143No <main>YesNone264No <main> and 1 more
/seo/text-to-sql-evaluation/fixture.sql95No <main>YesNone285No <main> and 1 more
/seo/text-to-sql/reference.sql95No <main>YesNone245No <main> and 1 more
/seo/warehouse-sql-routing/definition-change.sql145No <main>YesNone256No <main> and 1 more
/chatbot-pricing14153%YesNone280No h1
/desktop-pricing7953%YesNone127No h1
/docs/v1.1.13611063%YesNone281No h1
/docs/v1.1.13510764%YesNone265No h1
/docs/v1.1.12116671%YesNone304No h1
/docs/v1.1.12416672%YesNone337No h1
/docs/v1.1.1320473%YesNone446No h1
/docs/connect58389%YesNone1,370No h1
/business-info2817%YesYes54Nothing
/contact11251%YesYes203Nothing
/docs/sample-db9761%YesYes270Nothing
/about-us24767%YesYes517Nothing
/docs/webhook31082%YesYes628Nothing
/docs/chatbot-db-switching41284%YesYes982Nothing
The worst 25 of 81 pages.Show all 81

Show where it stands

A card, a badge and a line, each with the figures.

askyourdatabase.com in Agent View: 100% readable
1200 by 630, for linksDownload

A badge for the site

Agent View: 100% readable
<a href="https://mttr.si/agent-view/askyourdatabase.com"><img src="https://mttr.si/agent-view/askyourdatabase.com/badge.svg" alt="Agent View: 100% readable, 93% clean" height="20"></a>
Drawn again after every read

The figures in one line

askyourdatabase.com in Agent View: 100% of pages readable, better than 47% of sites; 93% clean; 244,794 tokens to read all 90 pages. mttr.si/agent-view/askyourdatabase.com

What to do next

Fix the pages, let an agent do it, and read the site again to see the figures move.

Fix what agents miss

19pages lose something
  • Give 19 pages a main headingClearer
  • Wrap 11 pages in <main>Clean measured
Open the action plan

Connect your agent

Claude Code, Codex or Cursor reads the site’s fixes over MCP, fixes a page in your code, has mttr read it again, and checks the fix landed.

https://mttr.si/mcp
Set up an agent

Claim the site

Prove it is yours with a DNS record or a file. Your agent can then reach its reads and jobs, and set each change to wait for your approval.

Claim the site

Drawn from the HTML mttr fetched on its read of October 24, 2026, not a screenshot, and only from the 90 pages read. An assistant’s own reader may differ. Tokens are estimated at about 4 characters each. A site an agent reads well is not a site an assistant cites.

Agent Viewaskyourdatabase.com Close Esc
askyourdatabase.com/seo/sql-dashboard/reference.sql
askyourdatabase.com/seo/sql-dashboard/reference.sql
No main heading

-- Synthetic reference only. Run in a fresh PostgreSQL test session. -- TEMP objects disappear with the session; never load this into production. CREATE TEMP TABLE dashboard_params ( start_date date, end_date date, refund_before date, tenant_id text, currency text ); INSERT INTO dashboard_params VALUES ('2026-09-01','2026-09-05','2026-09-05','A','USD'); CREATE TEMP TABLE dashboard_orders ( id integer PRIMARY KEY, tenant_id text, ordered_on date, status text, currency text, region text, gross_cents integer ); INSERT INTO dashboard_orders VALUES (101,'A','2026-09-01','paid','USD','North',12000), (102,'A','2026-09-02','paid','USD','North',8000), (103,'A','2026-09-02','paid','USD','South',6000), (104,'A','2026-09-03','cancelled','USD','South',9000), (105,'A','2026-09-03','paid','USD','North',4000), (106,'A','2026-10-01','paid','USD','North',50000), (107,'A','2026-09-01','paid','EUR','North',7000), (108,'B','2026-09-01','paid','USD','North',90000); CREATE TEMP TABLE dashboard_refunds ( id integer PRIMARY KEY, order_id integer, refunded_on date, amount_cents integer ); INSERT INTO dashboard_refunds VALUES (1,101,'2026-09-02',1000), (2,101,'2026-09-03',500), (3,103,'2026-09-03',600), (4,101,'2026-10-01',2000); CREATE TEMP VIEW dashboard_base AS WITH refunds_per_order AS ( SELECT r.order_id, SUM(r.amount_cents) AS refund_cents FROM dashboard_refunds r CROSS JOIN dashboard_params p WHERE r.refunded_on < p.refund_before GROUP BY r.order_id ) SELECT o.id, o.ordered_on, o.region, o.gross_cents - COALESCE(r.refund_cents,0) AS net_cents FROM dashboard_orders o CROSS JOIN dashboard_params p LEFT JOIN refunds_per_order r ON r.order_id = o.id WHERE o.tenant_id = p.tenant_id AND o.currency = p.currency AND o.status = 'paid' AND o.ordered_on >= p.start_date AND o.ordered_on < p.end_date; -- Q1: KPI cards: net_cents=27900, orders=4, average_order_cents=6975.00 SELECT COALESCE(SUM(net_cents),0) AS net_cents, COUNT(*) AS orders, ROUND(SUM(net_cents)::numeric / NULLIF(COUNT(*),0),2) AS average_order_cents FROM dashboard_base; -- Q2: Daily chart: Sep01=10500, Sep02=13400, Sep03=4000, Sep04=0 WITH calendar AS ( SELECT generate_series(p.start_date::timestamp, (p.end_date-1)::timestamp, interval '1 day')::date AS day FROM dashboard_params p ) SELECT c.day, COALESCE(SUM(b.net_cents),0) AS net_cents, COUNT(b.id) AS orders FROM calendar c LEFT JOIN dashboard_base b ON b.ordered_on = c.day GROUP BY c.day ORDER BY c.day; -- Q3: Regional table: North=22500/3 orders; South=5400/1 order SELECT region, SUM(net_cents) AS net_cents, COUNT(*) AS orders, ROUND(SUM(net_cents)::numeric / COUNT(*),2) AS average_order_cents FROM dashboard_base GROUP BY region ORDER BY region;

Drawn from the HTML mttr fetched, not a screenshot.
page.md248 words, about 670 tokens
-- Synthetic reference only. Run in a fresh PostgreSQL test session. -- TEMP objects disappear with the session; never load this into production. CREATE TEMP TABLE dashboard_params ( start_date date, end_date date, refund_before date, tenant_id text, currency text ); INSERT INTO dashboard_params VALUES ('2026-09-01','2026-09-05','2026-09-05','A','USD'); CREATE TEMP TABLE dashboard_orders ( id integer PRIMARY KEY, tenant_id text, ordered_on date, status text, currency text, region text, gross_cents integer ); INSERT INTO dashboard_orders VALUES (101,'A','2026-09-01','paid','USD','North',12000), (102,'A','2026-09-02','paid','USD','North',8000), (103,'A','2026-09-02','paid','USD','South',6000), (104,'A','2026-09-03','cancelled','USD','South',9000), (105,'A','2026-09-03','paid','USD','North',4000), (106,'A','2026-10-01','paid','USD','North',50000), (107,'A','2026-09-01','paid','EUR','North',7000), (108,'B','2026-09-01','paid','USD','North',90000); CREATE TEMP TABLE dashboard_refunds ( id integer PRIMARY KEY, order_id integer, refunded_on date, amount_cents integer ); INSERT INTO dashboard_refunds VALUES (1,101,'2026-09-02',1000), (2,101,'2026-09-03',500), (3,103,'2026-09-03',600), (4,101,'2026-10-01',2000); CREATE TEMP VIEW dashboard_base AS WITH refunds_per_order AS ( SELECT r.order_id, SUM(r.amount_cents) AS refund_cents FROM dashboard_refunds r CROSS JOIN dashboard_params p WHERE r.refunded_on < p.refund_before GROUP BY r.order_id ) SELECT o.id, o.ordered_on, o.region, o.gross_cents - COALESCE(r.refund_cents,0) AS net_cents FROM dashboard_orders o CROSS JOIN dashboard_params p LEFT JOIN refunds_per_order r ON r.order_id = o.id WHERE o.tenant_id = p.tenant_id AND o.currency = p.currency AND o.status = 'paid' AND o.ordered_on >= p.start_date AND o.ordered_on < p.end_date; -- Q1: KPI cards: net_cents=27900, orders=4, average_order_cents=6975.00 SELECT COALESCE(SUM(net_cents),0) AS net_cents, COUNT(*) AS orders, ROUND(SUM(net_cents)::numeric / NULLIF(COUNT(*),0),2) AS average_order_cents FROM dashboard_base; -- Q2: Daily chart: Sep01=10500, Sep02=13400, Sep03=4000, Sep04=0 WITH calendar AS ( SELECT generate_series(p.start_date::timestamp, (p.end_date-1)::timestamp, interval '1 day')::date AS day FROM dashboard_params p ) SELECT c.day, COALESCE(SUM(b.net_cents),0) AS net_cents, COUNT(b.id) AS orders FROM calendar c LEFT JOIN dashboard_base b ON b.ordered_on = c.day GROUP BY c.day ORDER BY c.day; -- Q3: Regional table: North=22500/3 orders; South=5400/1 order SELECT region, SUM(net_cents) AS net_cents, COUNT(*) AS orders, ROUND(SUM(net_cents)::numeric / COUNT(*),2) AS average_order_cents FROM dashboard_base GROUP BY region ORDER BY region;
Drawn from the HTML mttr fetched, not a screenshot. An assistant’s own reader may differ.Tokens are estimated at about 4 characters each.