Discovery¶
Goal: a ranked list of AI agents that are getting popular, not merely popular.
Sources¶
| Source | Tool | Signal |
|---|---|---|
| GitHub | gh_search (topics ai-agent, mcp-server, llm-agent, ai-agents; pushed in last 30 days; ≥20 stars) |
stars, forks, homepage |
| Hacker News | hn_search (Algolia API; last 14 days, >5 points) |
points, comments |
| SearXNG | searx_search (templated queries) and count_mentions |
URLs, and number of distinct other domains mentioning a product |
All collectors are ordinary AAA @tools running as nodes of one WorkflowGraph. Each has on_error="continue": in the first live run a source can
fail (rate limit, outage) and the others still land. Signals are stored as dated rows and never overwritten, which is what makes velocity possible.
Scoring¶
Pure functions in discovery/scoring.py:
pop = log1p(stars)vel = Δstars over 7 days / sqrt(max(stars, 50)). The square root damps giants, so a 3k-star project gaining 500 stars outranks a 100k-star one gaining 500.hn = log1p(points) + 0.5·log1p(comments)mentions = log1p(distinct other domains)(corroboration, not raw hit counts)
Each component is converted to a percentile within the current pool, weighted (default 0.30 / 0.35 / 0.15 / 0.20), multiplied by
time decay (half-life 14 days) and a corroboration bonus of 1 + 0.15 × (sources − 1).
Entity resolution¶
A repo, its website and a Hacker News post should become one candidate.
- Canonical keys.
gh:owner/repofor repositories,web:hostfor product sites; aggregator hosts (Medium, Reddit, YouTube, ...) are ignored. - Rule merge. A repo and a site merge when the normalised names match and the host root equals the name.
- Embedding tie-break (sqlite-vec). A repo and a site merge only if cosine similarity ≥ 0.90 and names match and their kinds differ.
Two repos or two sites are different products until proven otherwise. Every merge is recorded in
mergeswith its reason.
The bias is deliberate: prefer a duplicate over a wrong merge.
Classification¶
For candidates with a worthwhile score, one cheap structured call asks "is this an AI agent / MCP server / agent product, and which of 12 categories?".
Output is JSON validated against a Pydantic model (GenerateTestRepair); confidence between 0.4 and 0.6 triggers a three-sample SelfConsistency vote on the label.
Run it¶
uv run botshub discover # collect, score, merge, classify (about 2.5 minutes for 266 signals)
uv run botshub status # ranked candidates
In our first live run this produced 221 candidates from 266 signals; 32 of the 40 highest-scored were classified as agents.