Douyin, Xiaohongshu, TikTok, YouTube, X links to text: transcript, screen text, viral breakdown
中文文档:README.zh-CN.md — 抖音、小红书链接转文本,MCP / Python SDK / 命令行,价格以人民币标注。
Turn a social media link into text a language model can read — transcript, on-screen text, image descriptions, caption and metadata.
Hosted, remote (streamable HTTP). Nothing to install or run. For stdio-only clients and scripts,
python/ adds a zero-dependency Python SDK, a linkdigest command line and a
linkdigest-mcp stdio server that forwards to the hosted endpoint.
Website: linkdigest.dev · Registry: dev.linkdigest/linkdigest
The open parts: the Python SDK, the linkdigest command line and the linkdigest-mcp stdio server
(python/, MIT), the Dify plugin source (dify/), the agent skill
(skills/), examples, and the official MCP registry entry (server.json).
The hosted service behind https://linkdigest.dev/mcp and the API is operated by LinkDigest; its
reading engine is not open source.
Fetching a social link yourself returns nothing useful. Share URLs are tokenised
(xsec_token, app_code_link), the content lives in video and images rather
than HTML, and the server sends an app-download shell or a login wall instead of
the post.
$ curl -sL 'https://xhslink.com/o/1WiQ1QI6Uc0' | grep -o '<title>.*</title>'
<title>小红书 - 你的生活兴趣社区</title>
That title belongs to a 36 KB app shell (checked 2026-10-04). No caption, no images, no text of the note.
Claude Code
claude mcp add --transport http linkdigest \
https://linkdigest.dev/mcp \
--header "Authorization: Bearer ld_live_..."
Cursor, as a plugin — this repo is a Cursor plugin (.cursor-plugin/plugin.json + mcp.json + skills/).
Install it from cursor.directory, then set the key once in your shell:
export LINKDIGEST_API_KEY=ld_live_...
The plugin's mcp.json reads ${LINKDIGEST_API_KEY}; no key is stored in the repo. Without it,
the tool still lists and tools/call returns a 401 that says where to get one.
Cursor, by hand — ~/.cursor/mcp.json
{
"mcpServers": {
"linkdigest": {
"url": "https://linkdigest.dev/mcp",
"headers": { "Authorization": "Bearer ld_live_..." }
}
}
}
stdio-only clients — through mcp-remote (Node.js):
{
"mcpServers": {
"linkdigest": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://linkdigest.dev/mcp", "--header", "Authorization:${AUTH_HEADER}"],
"env": { "AUTH_HEADER": "Bearer ld_live_..." }
}
}
}
or through this repo's Python server (needs uv and git). It is installed from this git repository because
it is not on PyPI yet; a linkdigest-mcp package on PyPI is not ours until this README says so:
{
"mcpServers": {
"linkdigest": {
"command": "uvx",
"args": ["--from", "git+https://github.com/jcaiagent7143-ui/linkdigest-mcp#subdirectory=python", "linkdigest-mcp"],
"env": { "LINKDIGEST_API_KEY": "ld_live_..." }
}
}
}
A key is issued at linkdigest.dev/app/keys. 10 free credits to start, once per account, no card. A post is one credit; video adds one per started minute; a viral breakdown or a translation adds one each. Then $5 once for 250 credits (Alipay accepted, settled as ¥36) or $9 a month for 500 (card).
digest_url(url, format, job_id, translate_to, breakdown, partial_ok) — only url is required.
| Argument | Notes |
|---|---|
url | The post URL, including any share tokens. |
format | markdown (default, best for reading) or json (structured). |
job_id | Collect a digest already running. Pass this instead of url — re-sending the url would start the work again. |
breakdown | true adds a viral breakdown (爆款拆解): the hook in its first seconds, the structure as timed beats, the title formula, cover text, call to action, audience and a reusable template. Quotes are checked word for word against the post; engagement and hashtags come from the platform. +1 credit. |
translate_to | An ISO 639-1 code (en, ja, zh-CN): adds a translation beside the original, and writes the breakdown in that language. +1 credit. |
partial_ok | true reads the opening minutes the budget affords instead of refusing a long video. |
You do not call it yourself. The tool description tells the agent to reach for it whenever it meets a social link it cannot read, so it happens mid-task without being asked.
A long video may not finish inside one call. When that happens the result names a
job id; call the tool again with that job_id and no url to collect it.
platform, author, title, posted_at, caption, transcript ({t, text}),
ocr_text, on_screen ({t, text}), images ({description, ocr}), key_points, stats
(likes, comments, saves, shares, plays), tags, raw_markdown, source_url, transcript_source,
degraded — plus breakdown and translation when asked for.
Two are worth knowing about:
transcript_source — native_captions, asr, gemini_video or none. Captions the
platform already published are exact; speech recognition is not. gemini_video
means a YouTube video without captions was watched by Gemini, which wrote the
transcript and its times. Treating them
identically eventually quotes a mis-heard number back at someone as fact.degraded — what did not fully work, in plain words, plus notes on how a
complete read was obtained (e.g. "read via oEmbed", "read by Gemini watching the
video directly").
It exists because a digest once returned a well-formed, completely empty result
during a provider outage and was cached for thirty days.Checked against real posts, not documentation.
| Platform | Status |
|---|---|
| Xiaohongshu 小红书 | Works — image notes and video notes, no login needed |
| Douyin 抖音 | Works — video posts and image notes (图文) |
| TikTok | Works — short links resolve. Rate-limits under load |
| YouTube | Works — native captions where published, otherwise a watched transcript |
| X | Works — posts with video or images |
| Web pages / articles | Works — readable article text, title, author, date |
| Bilibili | Not supported. Returns HTTP 412 to our server's address. Needs a proxy |
| Not verified. Wired, not confirmed end to end | |
| Not supported. Serves no post content to logged-out requests |
The rows that do not work are listed on purpose. Finding out after you have wired something in is worse than knowing now.
Measured, not estimated:
transcript is [{t, text}]. Platform captions are timed per line. Speech
recognition currently returns one segment per ~170 s of audio (a single
segment at t: 0 for a shorter clip); on_screen carries approximate,
keyframe-level times.In python/: MIT, Python 3.10+, standard library only.
pip install "git+https://github.com/jcaiagent7143-ui/linkdigest-mcp#subdirectory=python"
export LINKDIGEST_API_KEY=ld_live_...
linkdigest "https://v.douyin.com/xxxx/" --breakdown # Markdown to stdout
from linkdigest import LinkDigest
d = LinkDigest().digest("https://xhslink.com/o/xxxx", translate_to="en")
print(d.title, d.credits, d.cached)
print(d.markdown)
Long jobs are collected for you (GET /api/v1/digest/{jobId}?wait=20); errors are typed
(PaymentRequiredError carries buy_url). Examples — Dify, OpenAPI import for Coze-style
platforms, Feishu Bitable, links to CSV — are in examples/ (Chinese).
The same tool as a Dify plugin lives in dify/ — source, manifest and privacy policy. Install it from the Dify Marketplace and paste your API key into the provider credential.
A REST API (POST https://linkdigest.dev/api/v1/digest), a web app, and Apify
Store actors for bulk runs. See linkdigest.dev.
MIT — see LICENSE. Changes are listed in CHANGELOG.md.
This listing does not have a supported local package template. Use the maintainer’s documentation for its hosted endpoint, authentication, and client-specific setup. No install command has been inferred.