Allows searching and retrieving metadata for scientific papers from arXiv.
Enables retrieval of trending topics and hot searches from Baidu.
Allows interaction with Bilibili to access trending videos, search content, and retrieve video details and comments.
Provides access to trending content and posts on the Bluesky social network.
Enables fetching of top stories and popular technical posts from the dev.to community.
Allows access to trending content and hot topics on Douban.
Provides tools to track trending repositories and interact with GitHub content.
Enables access to trending search data via Google Trends.
Allows retrieval of popular and trending technical articles from Juejin.
Provides tools to browse hot stories and community discussions on Lobste.rs.
Enables searching for articles and fetching trending stories from Medium.
Allows access to ranking data and popular illustrations on Pixiv.
Provides tools to discover hot products and trending launches on Product Hunt.
Enables retrieval of information about top and popular Python packages on PyPI.
Allows searching content, fetching hot posts, and submitting comments on Reddit.
Provides access to hot and trending questions within the Stack Overflow community.
Enables tracking of top-selling games and trending content on the Steam store.
Allows for the programmatic publishing of articles via Telegra.ph.
Provides tools to browse hot topics and community discussions on the V2EX platform.
Enables searching for articles and accessing detailed content from the WeChat platform.
Allows retrieval of most-read articles and trending content from Wikipedia.
Provides comprehensive tools to browse hot notes, search content, view post details, and publish new notes.
Enables access to trending videos and content on YouTube.
Allows for searching, fetching hot topics, and viewing detailed question and comment data on Zhihu.
AI agents need to operate interfaces — read data, click buttons, fill forms, compose workflows. But AI is too slow, too expensive, and too unreliable to drive every interaction in real-time.
Tap solves this with a new paradigm: forging. AI analyzes a site once, creates a deterministic script, and that script runs forever — no AI, no tokens, no hallucinations.
forge_inspect → forge_verify → forge_save → tap.run
AI analyzes AI tests AI saves runs forever, zero AIOne agent forges a tap. Every agent benefits.
81 ready-to-use skills across 41 sites — X/Twitter, Reddit, GitHub, YouTube, Bilibili, Zhihu, Xiaohongshu, Weibo, Medium, arXiv, and many more. Uses your real Chrome session. No API keys needed.
The Core Idea
The insight behind Tap: operating an interface is a solved problem the moment you figure out how. The hard part is understanding the page — finding the API, locating the right selector, knowing what to click. That's what AI is good at. The easy part is executing the same steps again. That doesn't need AI at all.
So Tap separates the two:
Phase | Who does it | Cost | Happens |
Forge | AI agent | Tokens (once) | Once per site |
Run | Deterministic | $0.00 | Forever |
A forged tap is pure JavaScript. No LLM calls, no prompts, no API keys. It runs in < 1 second, returns structured data, and produces the same result every time.
The Protocol
Tap defines a minimal, complete contract for operating any interface.
8 kernel primitives — the irreducible atoms of all human-interface interaction:
eval · pointer · keyboard · nav · wait · screenshot · tap · capabilities16 stdlib operations — composed from the kernel, given to every runtime for free:
click · type · hover · scroll · pressKey · select · upload · dialog
fetch · find · cookies · download · waitFor · waitForNetwork · ssrState · storageThat's it. 8 + 16 = every interaction a human can perform on any interface.
A new runtime implements 8 methods — instantly gains 16 operations and every existing .tap.js script. Today it's Chrome and Playwright. Tomorrow: Android, iOS, desktop apps. Write a tap once, run it on every platform.
Install
# One-line install (macOS / Linux)
curl -fsSL https://raw.githubusercontent.com/LeonTing1010/tap/master/install.sh | shThen install the Chrome extension:
Download
tap-extension.zipfrom ReleasesUnzip, open
chrome://extensions/, enable Developer modeClick "Load unpacked" and select the unzipped folder
Connect to your AI agent (Claude Code, Cursor, Windsurf, OpenClaw, etc.):
{
"mcpServers": {
"tap": {
"command": "tap",
"args": ["mcp"]
}
}
}# From source (requires Deno)
git clone https://github.com/LeonTing1010/tap && cd tap
deno compile --allow-all --output tap src/cli.ts
# Via GitHub Packages
npx @LeonTing1010/tap-mcpInstall community skills:
tap install # Clone 81 skills from tap-skills repo
tap update # Update to latestQuick Start
CLI
tap list # See all 81 skills
tap github trending --limit 5 # Get GitHub trending repos
tap zhihu hot # Get Zhihu trending topicsAI Agent (MCP)
You: What's trending on GitHub and Hacker News today?
Agent: [calls tap.run("github", "trending") and tap.run("hackernews", "hot")]
Here are today's top repositories and stories...Chrome Address Bar
Type tap then Tab:
tap github/trending
tap weibo/hot
tap xiaohongshu/search?keyword=AIWeb Console
const data = await tap("github/trending", { limit: 5 })
console.table(data.rows)Forge Pipeline
Any AI agent can create new taps through a 3-step pipeline:
forge.inspect(url) → Detects framework, SSR state, APIs, generates strategy
forge.verify(url, expr) → Tests extraction logic live, validates output
forge.save(site, name) → Persists .tap.js to disk — done foreverExample:
You: forge.inspect https://news.ycombinator.com
AI: Found JSON API at /v0/topstories.json, recommends fetch strategy
You: forge.verify https://news.ycombinator.com "fetch('/v0/topstories.json')..."
AI: Returns 30 rows, columns: [title, score, author, url] ✓
You: forge.save hackernews hot
AI: Saved to hackernews/hot.tap.js ✓Now tap hackernews hot runs forever. No AI. No tokens. No maintenance until the site's API changes.
Skills
81 skills across 41 sites in tap-skills. API-first extraction where possible, DOM fallback when necessary.
Trending / Hot
Site | Tap | Strategy |
Hacker News |
| API |
| API | |
GitHub |
| DOM |
Product Hunt |
| DOM |
X / Twitter |
| DOM |
YouTube |
| DOM |
Bluesky |
| DOM |
Bilibili |
| API |
Zhihu |
| API |
| API | |
Xiaohongshu |
| SSR |
Douyin |
| API |
V2EX |
| DOM |
Juejin |
| DOM |
Lobsters |
| DOM |
Dev.to |
| DOM |
Stack Overflow |
| DOM |
Medium |
| DOM |
36Kr |
| DOM |
Toutiao |
| DOM |
Baidu |
| DOM |
SSPai |
| DOM |
Douban |
| DOM |
CoinGecko |
| DOM |
Steam |
| DOM |
Crates.io |
| DOM |
PyPI |
| DOM |
Pixiv |
| DOM |
Wikipedia |
| DOM |
Google Trends |
| DOM |
Xueqiu |
| DOM |
Search
Site | Tap | Strategy |
| API | |
arXiv |
| API |
X / Twitter |
| DOM |
Medium |
| DOM |
Zhihu |
| API |
| API | |
Xiaohongshu |
| SSR |
Bilibili |
| API |
Douyin |
| API |
| DOM | |
Dictionary |
| DOM |
Deep Read
Site | Taps |
Zhihu |
|
| |
Bilibili |
|
Xiaohongshu |
|
Douyin |
|
| |
WeRead |
|
Write
Tap | What it does |
| Post a tweet |
| Comment on a post |
| Publish a note with images |
| Publish an article |
| Generate AI images |
Architecture
┌─ Chrome Extension (kernel via CDP)
AI Agent ←→ MCP ←→ Deno Executor ─┤
CLI / MCP load + run └─ Playwright (kernel via pw API)~1,800 lines. Zero dependencies. The entire system — CLI, MCP server, executor, daemon, two runtimes — in under 2,000 lines of Deno. No frameworks. No build step. No node_modules.
Chrome extension — Runtime #1. Your real browser with real login sessions. No headless detection, no fingerprint spoofing.
Playwright — Runtime #2. Headless capable, no extension needed. Server-side automation.
.tap.js — Deterministic scripts. Pure JavaScript, zero AI, runs forever.
MCP server — 38 tools exposing the full protocol to any AI agent.
.tap.js Format
// API-first: fetch data directly
export default {
site: "bilibili", name: "hot",
description: "Bilibili trending videos",
health: { min_rows: 5, non_empty: ["title"] },
extract: async () => {
const res = await fetch('https://api.bilibili.com/x/web-interface/ranking/v2',
{ credentials: 'include' })
const data = await res.json()
return data.data.list.map(v => ({
title: v.title, author: v.owner.name,
views: String(v.stat.view),
url: 'https://bilibili.com/video/' + v.bvid
}))
}
}// Action: operate the interface via page API
export default {
site: "x", name: "post",
description: "Post a tweet",
args: { content: { type: "string" } },
async run(page, args) {
await page.nav('https://x.com/compose/post')
await page.type('[data-testid="tweetTextarea_0"]', args.content)
await page.click('[data-testid="tweetButton"]')
await page.wait(3000)
return [{ status: 'posted', url: await page.eval(() => location.href) }]
}
}MCP Tools
38 tools across 6 categories — the full interface protocol exposed as MCP:
Category | Tools |
tap. |
|
forge. |
|
page. |
|
inspect. |
|
intercept. |
|
tab. |
|
How Tap Compares
Your need | Best tool | Why |
Deterministic site operations for AI agents | Tap | 81 pre-built skills, zero LLM cost at runtime, MCP native |
General LLM-driven browsing | Browser-Use, Stagehand | LLM decides each step — flexible but slow and expensive |
Large-scale crawling | Crawl4AI, Scrapy | Purpose-built for throughput and scale |
CLI wrapper for websites | OpenCLI | Tool collection approach; Tap is a protocol |
E2E testing | Playwright, Cypress | Test frameworks, not agent protocols |
Building
deno test --no-check --allow-all src/test/ # Unit constraints
node extension/test/architecture.test.mjs # Architecture constraints
node extension/test/multi-tab.test.mjs # Multi-tab constraints
node extension/test/tap-format.test.mjs # Tap format constraints
deno compile --allow-all --output tap src/cli.ts # Compile binaryContributing
See CONTRIBUTING.md. The easiest way to contribute: forge a new tap. It's just a .tap.js file.
Roadmap
81 community skills —
tap installfrom tap-skillsPlaywright runtime — second kernel, headless capable
Android runtime — AccessibilityService-based kernel
Auto-healing — detect and regenerate broken taps
Tap registry — publish and discover taps like packages
Star History
License
AGPL-3.0 — see LICENSE. Commercial licensing available.