Skip to content

Add /c/mcp and /c/workflows: eleven realtime lists, deduplicated - #139

Merged
ralyodio merged 1 commit into
mainfrom
mcp-and-workflows-collections
Sep 25, 2026
Merged

ralyodio merged 1 commit into
mainfrom
mcp-and-workflows-collections

Conversation

@ralyodio

Copy link
Copy Markdown
Contributor

Two new collections, from the r/ClaudeWorkflows library post: /c/mcp (every MCP server anyone has published) and /c/workflows (how people actually work with Claude and Claude Code).

Both 404 today. MCP servers currently live in /c/extensions beside Firefox add-ons, fed by one source.

Sources — eleven, all keyless

/c/mcp — six, each knowing something the others do not:

Source Rows measured 2026-09-25 What only it knows
Official registry (re-homed) 181 servers from 300 versions what was published, with which packages and remotes
Docker MCP catalogue 270 entries pull counts, category, licence, the tools each server exposes
Smithery 512 a run, 17,195 claimed how often a server is actually called
punkpeye / wong2 / appcypher / protocol repo 4,273 / 260 / 188 / 20 the long tail nobody published
aitmpl MCP configs 104 a ready-made config and an install count
GitHub topic search 400 a run, 30,246 matched what was tagged this morning

/c/workflows — five:

Source Rows What only it knows
r/ClaudeWorkflows via Arctic Shift 600 posts a run a workflow written out by whoever used it, rated by votes, with its template parsed into fields
awesome-claude-code 202 live of 212 a maintainer who re-checks links and marks the dead ones
Plugin marketplaces 117 across 3 manifests what a marketplace installs, declared for machines
aitmpl components 1,780 skills, subagents, commands, hooks, settings, loops, mods, with install counts
GitHub topic search 399 a run, 77,213 matched repos tagged before any list has them

Smoke-run against the live upstreams: 6,300 MCP rows and 3,100 workflow rows in one pass, zero malformed, zero without a URL.

GITHUB_TOKEN is optional everywhere and only raises rate limits (search 10/min → 30; the enricher 60/hr → 5,000). Reddit is read through Arctic Shift because reddit.com blocks this deployment on every road including a real browser.

The work is the deduplication

Both collections set dedupe_urls, which only helps if the URLs are comparable — the same server is written five ways. repoUrl folds them: owner and repo lowercased, .git and trailing slashes dropped, blob/tree unified, any ref to HEAD. It deliberately keeps the subpath: modelcontextprotocol/servers holds seven servers under src/ and awslabs/mcp a dozen, and folding those to the repo root would fuse distinct servers into one row. Measured: 4,761 list entries are 4,507 distinct servers; 82 of Docker's 270 entries share a repository with another.

First writer keeps the row, so registration order decides whose account of a duplicate survives: published → packaged → measured → curated → tagged.

Two traps fixed in the adapters, not in the dedupe:

  • The registry lists every published version as an entry, and some publishers name a repository that is not theirs — three agency.ottobot/* servers point at modelcontextprotocol/registry itself. Left alone, 300 entries deduplicated to 174 keys and 126 published servers would have vanished. collapse() keeps one row per server at its newest version, and a URL that several server names claim identifies none of them, so those fall back to their own registry page. After: 181 items, 181 keys.
  • aitmpl's 14 project templates are the only pathless components, so all 14 linked to one directory. Not ingested; 1,780 components, 1,780 keys.

Migration 0032

MCP servers leave /c/extensions the way weather left /c/alerts in 0010 — source, items and feed moved together, every statement conditional so a fresh database seeds to the same place. The feed keeps its slug, because /c/mcp/new-mcp-servers is a promise to whoever polls it. extensions stops claiming to hold MCP servers.

The github-repo enricher is now on by default for both collections, so a dead server shows up as archived without anyone re-checking a list by hand.

Checks

  • bun test: 1,991 pass, 0 fail (127 files), including 77 new tests across test/mcp.test.js, test/workflows.test.js and two migration tests in test/schema.test.js that run 0032 against a real Postgres via pglite.
  • biome check: clean on every file touched.
  • Each of the eleven sources run live against its upstream; the post this started from (1t5vxvq, "Claude Workflow Library — Start Here") lands as a workflow-index row, with all twelve category posts beside it.

Docs: docs/mcp-and-workflows.md, linked from the README table.

🤖 Generated with Claude Code

Two collections, from the r/ClaudeWorkflows library post: every MCP server
anyone has published, and how people actually work with Claude Code.

/c/mcp reads six sources that each know something the others do not: the
official registry (what was published, with which packages), Docker's
catalogue (what is packaged, with pull counts and the tools each exposes),
Smithery (how often a server is actually called), the punkpeye, wong2 and
appcypher lists plus the protocol repo (the servers nobody published),
aitmpl's ready-made configs, and GitHub topic search (what was tagged this
morning). /c/workflows reads five: the r/ClaudeWorkflows library through
Arctic Shift, awesome-claude-code from the CSV it is generated from,
.claude-plugin marketplace manifests, aitmpl's 1,780 components, and GitHub
topics. Everything keyless; GITHUB_TOKEN only raises rate limits.

Measured 2026-09-25: 6,300 MCP rows and 3,100 workflow rows in one pass.

The work is the deduplication. Both collections set dedupe_urls, which only
helps if URLs are comparable, so repoUrl folds them: owner and repo
lowercased, .git and trailing slashes dropped, blob and tree unified, any ref
to HEAD -- but never the subpath, because modelcontextprotocol/servers holds
seven servers under src/ and awslabs/mcp a dozen. 4,761 list entries are 4,507
distinct servers.

Two traps fixed in the adapters rather than in the dedupe: the registry lists
every published version as an entry and some publishers name a repository that
is not theirs (three agency.ottobot/* servers point at the registry itself),
which turned 300 entries into 174 keys and would have discarded 126 published
servers -- collapse() keeps one row per server at its newest version and sends
a URL that several names claim to each server's own registry page. And
aitmpl's 14 project templates are the only pathless components, so all 14
linked to one directory; they are not ingested.

MCP servers leave /c/extensions in migration 0032, source, items and feed
together, with the feed keeping its slug because /c/mcp/new-mcp-servers is a
promise to whoever polls it. The github-repo enricher is on for both, so a
dead server shows up as archived without anyone re-checking a list by hand.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@ralyodio
ralyodio merged commit 41d1592 into main Sep 25, 2026
3 checks passed
ralyodio added a commit that referenced this pull request Sep 25, 2026
…ugins /hooks (#140)

A subagent, a skill, a slash command, a hook and a plugin are five different
things to go looking for, so they are five collections rather than five kinds
inside one. Each is also a name at the site root, because a collection seeds a
niche and a niche's page is served from /: /workflows, /skills, /agents,
/commands, /plugins, /hooks.

MCP is the exception and stays at /c/mcp. `mcp` is a reserved niche slug --
/mcp is this site's own MCP endpoint -- so the servers cannot have a root page
without taking the protocol's. There is now a test saying so.

`workflows` keeps what is read rather than installed: the library posts, the
guides and CLAUDE.md files, settings bundles, agent loops, behaviour mods, and
the repositories tagged for all of it.

An adapter writes into exactly one collection, so aitmpl's components.json now
feeds six through a factory and awesome-claude-code's CSV feeds two. That is
deliberate rather than reluctant: a source is what a reader follows and what
the run log reports on, so "subagents from aitmpl" and "skills from aitmpl"
should be two rows on the sources page. The cost is re-fetching one file per
collection, which is why those cadences are slow and staggered.

New source while splitting: VoltAgent's README names its 165 subagents one by
one, where its marketplace manifest declares only the 10 bundles they ship in,
so /agents reads the README through the same list parser the MCP lists use.

This is migration 0033 rather than an edit to 0032, because 0032 shipped in
#139 and has run. Migrations are keyed by filename with no checksum, so an
edited one never runs again: the five collections would still have appeared,
because seeding creates them, but with dedupe_urls silently false, and a skill
would be stored once per list that carries it. 0033 also moves the plugin
marketplaces source and its items whole, and drops the rows that aitmpl and
awesome-claude-code wrote into workflows for kinds that have left -- dropped
rather than moved, because an item's collection comes from its source's, and a
moved row would sit in /skills owned by a workflows source and block the real
source from ever writing it.

Measured over a live pass of every source: mcp 5,782 distinct, workflows 1,309,
skills 894, agents 587, commands 288, plugins 117, hooks 62. Nothing malformed.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
@ralyodio ralyodio mentioned this pull request Sep 25, 2026
ralyodio added a commit that referenced this pull request Sep 25, 2026
Two releases' worth of collections since 0.29.0: parts (#137), MCP servers
and agent workflows (#139), and the split of the latter into skills,
subagents, commands, plugins and hooks (#140).

15 manifests plus the CLI's own VERSION const; bun.lock carries no version
lines to follow, and @profullstack/partners stays at 0.2.0.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant