--- layout: tap site_name: juejin tap_name: post description: "Publish article on Juejin" intent: write columns: - status - url args: - name: title type: string description: "Article title" - name: body type: string description: "Article body (Markdown)" - name: category type: string description: "Category: Frontend/Backend/Android/iOS/AI/Tools" - name: tags type: string description: "Comma-separated tags (max 3)" args_json: | {"title":{"type":"string","description":"Article title"},"body":{"type":"string","description":"Article body (Markdown)"},"category":{"type":"string","description":"Category: Frontend/Backend/Android/iOS/AI/Tools"},"tags":{"type":"string","description":"Comma-separated tags (max 3)"}} health_json: | {"min_rows":1,"non_empty":[]} example_args: "" source_url: https://github.com/LeonTing1010/tap-skills/blob/main/community/juejin/post.plan.json license: MIT ---

What it does

Publish article on Juejin

Install Taprun once

Taprun ships as a single MCP server exposing a catalog of compiled taps. One-time setup on macOS / Linux:

brew install LeonTing1010/tap/taprun
tap mcp connect

Or drop this into your claude_desktop_config.json (works identically in Claude Code, Cursor, Cline, Windsurf — any MCP host):

{
  "mcpServers": {
    "tap": {
      "command": "tap",
      "args": ["mcp", "start"]
    }
  }
}

Call juejin/post

Terminal, once installed:

tap run juejin/post

From the MCP host — exact same compiled plan, deterministic replay, zero LLM tokens:

tap.run({ site: "juejin", name: "post" })

Why compile it once

This plan was forged once — the AI read juejin, picked stable structural addresses (JSON-LD, ARIA, RSS, or declared API endpoints, in that priority order), and saved them to a .plan.json. Every replay since then has used zero LLM tokens. When juejin ships a site change that breaks the extraction, tap verify surfaces it before your data goes stale — not after your pipeline silently writes garbage for a week.

Related juejin taps

tapdescription
juejin/hotJuejin trending articles