WEBVTT - Agents shouldn't need to scrape your blog

1
00:00:00.000 --> 00:00:03.264
Agents shouldn't need to scrape your blog

2
00:00:03.264 --> 00:00:06.527
I shipped two MCP tools to mondello.

3
00:00:06.527 --> 00:00:09.325
dev this morning: list_skills and get_skill_preview.

4
00:00:09.325 --> 00:00:15.386
The skills marketplace I launched three days ago already had four agent-facing surfaces.

5
00:00:15.386 --> 00:00:17.717
/skills is the HTML storefront.

6
00:00:17.717 --> 00:00:18.183
/skills.

7
00:00:18.183 --> 00:00:20.514
json is a machine-readable manifest.

8
00:00:20.514 --> 00:00:22.845
/skills/&lt;slug&gt;/raw is the x402-gated download.

9
00:00:22.845 --> 00:00:25.176
/skills/&lt;slug&gt;/install is the bash installer.

10
00:00:25.176 --> 00:00:27.974
What it didn't have was MCP.

11
00:00:27.974 --> 00:00:40.562
Without MCP, an agent installing a skill had to either fetch and parse a JSON endpoint it had to already know about, or scrape the HTML storefront.

12
00:00:40.562 --> 00:00:41.494
Both work.

13
00:00:41.494 --> 00:00:44.758
Neither is how agents should discover anything.

14
00:00:44.758 --> 00:00:46.157
What was broken

15
00:00:46.157 --> 00:00:50.819
The /skills page read, in its "how installation works" section:

16
00:00:50.819 --> 00:01:00.144
Any MCP agent that speaks x402 can pay directly against /skills/&lt;slug&gt;/raw. See /skills.json for the full catalog with payment metadata.

17
00:01:00.144 --> 00:01:02.008
That's half the story.

18
00:01:02.008 --> 00:01:06.205
An agent connected over MCP has a typed protocol.

19
00:01:06.205 --> 00:01:09.468
It shouldn't need to know that /skills.

20
00:01:09.468 --> 00:01:10.401
json exists.

21
00:01:10.401 --> 00:01:19.259
It shouldn't need to fetch an HTTP URL, parse JSON, map fields, and then compose its own install command.

22
00:01:19.259 --> 00:01:24.854
It should ask the MCP server for the catalog and the prices.

23
00:01:24.854 --> 00:01:26.719
The server should answer.

24
00:01:26.719 --> 00:01:29.982
Before this morning, that conversation couldn't happen.

25
00:01:29.982 --> 00:01:39.773
/api/mcp exposed fourteen tools — posts, cues, changelog entries, site stats — and zero tools about the marketplace one directory away.

26
00:01:39.773 --> 00:01:42.104
The other fourteen didn't fit.

27
00:01:42.104 --> 00:01:43.503
Skills aren't posts.

28
00:01:43.503 --> 00:01:50.496
They have prices, payment metadata, and a paid/preview split that list_posts and get_post_markdown don't model.

29
00:01:50.496 --> 00:01:51.895
What I shipped

30
00:01:51.895 --> 00:01:56.091
Two tools. About 165 lines of TypeScript in src/pages/api/mcp.ts.

31
00:01:56.091 --> 00:01:58.422
list_skills returns the full catalog.

32
00:01:58.422 --> 00:02:03.551
Every published skill, with title, excerpt, price, and the install one-liner.

33
00:02:03.551 --> 00:02:14.274
It also returns currency: "USDC" and network: "eip155:8453" at the top level so an x402-aware agent can budget the round-trip before fetching anything:

34
00:02:14.274 --> 00:02:18.936
get_skill_preview returns the free preview for one skill by slug.

35
00:02:18.936 --> 00:02:25.463
Not the body — the body is behind x402 at /raw and stays there.

36
00:02:25.463 --> 00:02:37.119
The preview comes from a dedicated preview portableText field I author in the admin UI alongside the paid body, with the excerpt as a fallback.

37
00:02:37.119 --> 00:02:47.376
A few paragraphs that demonstrate the shape of the skill so an agent (or a human) can decide if it's worth buying.

38
00:02:47.376 --> 00:03:01.363
Both wire into the existing JSON-RPC 2.0 dispatcher alongside search_cues, list_posts, get_post_markdown, and the rest. No special-casing, no new auth, no new routes. Two more entries in the tool catalog.

39
00:03:01.363 --> 00:03:03.694
The walk, end to end

40
00:03:03.694 --> 00:03:10.221
Here's what an MCP-connected agent does now to discover, preview, and install a skill:

41
00:03:10.221 --> 00:03:10.688
1.

42
00:03:10.688 --> 00:03:16.749
tools/list — sees list_skills and get_skill_preview in the catalog alongside the content tools.

43
00:03:16.749 --> 00:03:17.215
2.

44
00:03:17.215 --> 00:03:25.607
list_skills — gets the eight skills, picks the one that matches the task at hand, notes the price.

45
00:03:25.607 --> 00:03:26.073
3.

46
00:03:26.073 --> 00:03:30.735
get_skill_preview(slug) — reads the preview, decides the skill is relevant.

47
00:03:30.735 --> 00:03:31.202
4.

48
00:03:31.202 --> 00:03:35.398
GET /skills/&lt;slug&gt;/raw with x402 payment header — settles $0.

49
00:03:35.398 --> 00:03:38.661
10 USDC on Base, receives the markdown.

50
00:03:38.661 --> 00:03:39.128
5.

51
00:03:39.128 --> 00:03:40.526
Writes to ~/.

52
00:03:40.526 --> 00:03:40.992
claude/skills/&lt;slug&gt;/skill.

53
00:03:40.992 --> 00:03:46.587
md and the skill is live for the rest of the session.

54
00:03:46.587 --> 00:03:47.986
Five HTTP requests.

55
00:03:47.986 --> 00:03:48.918
One payment.

56
00:03:48.918 --> 00:03:50.783
No HTML in sight.

57
00:03:50.783 --> 00:03:59.642
The win isn't raw latency — a single curl of a well-structured index beats five round-trips on the stopwatch.

58
00:03:59.642 --> 00:04:01.507
The win is stability.

59
00:04:01.507 --> 00:04:06.169
Every step returns a typed payload with a stable schema.

60
00:04:06.169 --> 00:04:07.101
Nothing renders.

61
00:04:07.101 --> 00:04:08.034
Nothing lazy-loads.

62
00:04:08.034 --> 00:04:12.696
The CSS can change tomorrow and this flow is unaffected.

63
00:04:12.696 --> 00:04:14.095
Why this matters

64
00:04:14.095 --> 00:04:21.088
Yes, "build an API, not a scraper" is a fifteen-year-old argument with a new acronym.

65
00:04:21.088 --> 00:04:23.419
What's new isn't the principle.

66
00:04:23.419 --> 00:04:37.406
It's that MCP is a single client-side protocol the biggest agent clients already speak, so "ship an API" no longer means "and convince every consumer to integrate with it separately."

67
00:04:37.406 --> 00:04:39.737
That asymmetry is the unlock.

68
00:04:39.737 --> 00:04:44.866
Most sites that say "agents welcome" mean "we won't block you."

69
00:04:44.866 --> 00:04:48.596
They ship HTML and hope the scraper holds.

70
00:04:48.596 --> 00:04:55.589
It holds until the layout shifts, an ad renders mid-content, or a component loads async.

71
00:04:55.589 --> 00:05:02.583
Well-structured semantic HTML is a real contract — I'm not pretending otherwise — and /skills.

72
00:05:02.583 --> 00:05:10.975
json is a legitimate middle ground for any agent that'd rather fetch a typed manifest than speak RPC.

73
00:05:10.975 --> 00:05:18.901
But scrapers are still a hack we tolerate because writing an API felt like too much work.

74
00:05:18.901 --> 00:05:21.232
MCP makes the alternative easy.

75
00:05:21.232 --> 00:05:23.097
The protocol is small.

76
00:05:23.097 --> 00:05:24.962
The transport is HTTP.

77
00:05:24.962 --> 00:05:30.556
The tool shape is a name, a description, and a JSON schema.

78
00:05:30.556 --> 00:05:37.083
If a site already has an MCP server, a new tool is fifty lines.

79
00:05:37.083 --> 00:05:39.415
An agent interacting with mondello.

80
00:05:39.415 --> 00:05:43.611
dev doesn't need to know what a blog is.

81
00:05:43.611 --> 00:05:47.807
It doesn't need to know what HTML looks like.

82
00:05:47.807 --> 00:05:54.334
It needs to know MCP and x402, both documented in under ten pages each.

83
00:05:54.334 --> 00:06:06.922
Everything else is the site telling the agent, in the protocols the agent already understands, exactly what's for sale, what it costs, and how to buy it.

84
00:06:06.922 --> 00:06:09.253
The missing piece is discovery.

85
00:06:09.253 --> 00:06:14.848
An agent only calls list_skills if someone first registers the MCP server.

86
00:06:14.848 --> 00:06:15.314
/.

87
00:06:15.314 --> 00:06:21.375
well-known/mcp and agent-side registries are what solves that, and neither is solved today.

88
00:06:21.375 --> 00:06:30.234
Until they are, MCP discovery is an out-of-band step — somebody has to tell the agent where to look.

89
00:06:30.234 --> 00:06:32.098
That's the live problem.

90
00:06:32.098 --> 00:06:33.497
The bigger pattern

91
00:06:33.497 --> 00:06:36.295
Same pattern, everywhere on this blog:

92
00:06:36.295 --> 00:06:42.356
Posts are served as Markdown with YAML frontmatter at /&lt;slug&gt;.md, not just HTML.

93
00:06:42.356 --> 00:06:52.146
Search results come back with audio-timestamped deep-links in /api/search/cues.json, not embedded in a page that you have to render and click.

94
00:06:52.146 --> 00:07:00.072
The full archive is one MCP call (get_archive) away, returning every post as one concatenated Markdown document.

95
00:07:00.072 --> 00:07:10.329
Even the visual stuff — the OG cards with per-post audio waveforms, the social share previews — are SVG files served directly.

96
00:07:10.329 --> 00:07:13.593
The blog is the UI for humans.

97
00:07:13.593 --> 00:07:16.856
The protocols are the UI for agents.

98
00:07:16.856 --> 00:07:20.120
Same content, same database, same authoring workflow.

99
00:07:20.120 --> 00:07:21.053
Nothing duplicated.

100
00:07:21.053 --> 00:07:22.917
Nothing "adapted for AI."

101
00:07:22.917 --> 00:07:24.316
Posts are posts.

102
00:07:24.316 --> 00:07:25.715
Skills are skills.

103
00:07:25.715 --> 00:07:33.641
MCP and x402 just mean both audiences can consume them without one pretending to be the other.

104
00:07:33.641 --> 00:07:38.303
If you want to see it from the agent side:

105
00:07:38.303 --> 00:07:50.891
Register the server, ask Claude for the skills catalog, and it has a typed tool that fits — it'll reach for list_skills before it reaches for fetch.

106
00:07:50.891 --> 00:07:54.621
Five round-trips, one payment, no HTML in sight.

107
00:07:54.621 --> 00:07:57.418
The discovery is still on you.

108
00:07:57.418 --> 00:07:58.817
The rest isn't.

109
00:07:58.817 --> 00:08:09.074
The build-and-ship ritual that deploys this post — Astro build, post-build hook patching, wrangler deploy — is itself a skill at /skills/emdash-deploy.

110
00:08:09.074 --> 00:08:15.135
Same pattern: one curl command, x402 USDC, the recipe lives in your ~/.

111
00:08:15.135 --> 00:08:17.000
claude/skills/ directory after payment.
