
StoriesFly: Instagram and TikTok data
com.storiesfly由 storiesfly.com 发布官方发布者v1.0.0更新于 Oct 30, 2026
Live public Instagram and TikTok data for AI assistants: profiles, posts, stories, followers.
概览
远程 MCP 服务器,让助手获取 Instagram 和 TikTok 的公开实时数据:主页、帖子、快拍、粉丝、话题标签和媒体链接。
- 可以做什么
- 查询 Instagram 主页、简介信息、帖子、Reels、被标记和置顶帖子、快拍、精选以及店铺页面
- 读取帖子、评论、回复、点赞者、被标记用户和音乐,以及话题标签、地点和搜索结果
- 列出粉丝和关注列表,可在其中搜索,并获取推荐账号
- 获取 TikTok 主页、视频、快拍、粉丝、关注和转发
- 解析分享链接,并获取 Instagram 帖子、Reels 或 TikTok 视频的可下载文件链接
- 查看账户余额、免费额度和用量
- 适用场景
- 适合助手需要最新公开社交媒体数据的场景,例如调研、网红或竞品分析、内容监测,或从 Instagram 和 TikTok 链接提取媒体文件,且无需登录这两个平台。
- 运行要求
- 通过 streamable HTTP 连接 storiesfly.com 的远程端点,使用 OAuth 登录(README 描述为用 Telegram 登录)。需要预付费的 StoriesFly 账户和余额;新账户有 100 次免费请求。无需 Instagram 或 TikTok 登录、Cookie 或会话。
安装
在 SourceWeft 中
- 打开 控制台中的 StoriesFly: Instagram and TikTok data,将其添加到工作区。
- 连接 所需的 凭据。它们会被私密存储,绝不会在公开页面上展示。
- 为需要使用其工具的对话启用该服务。
Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。
交给智能体安装
把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。
阅读 https://sourceweft.com/mcp/com.storiesfly%2Fmcp/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。其他 MCP 客户端
把它添加到你客户端的 mcpServers 配置中。 客户端会在首次连接时完成 OAuth 登录。
{
"mcpServers": {
"storiesfly-instagram-and-tiktok-data": {
"type": "http",
"url": "https://storiesfly.com/mcp"
}
}
}README
storiesfly
TypeScript client for the StoriesFly API. It reads public Instagram and TikTok data over HTTP. For Instagram: profiles, stories, highlights, posts, reels, comments, followers, hashtags, places and search. For TikTok: profiles, videos, stories, followers and following lists, reposts, and video download without the watermark. You do not log in to Instagram or TikTok and you do not handle cookies or sessions. You send an API key and pay per request. The same data works inside ChatGPT and Claude through the StoriesFly MCP server: see Use it from ChatGPT and Claude (MCP).
The package has no runtime dependencies. It needs Node 18 or newer (it uses the global fetch), it is ESM only, and it ships its own types. The 46 data calls and the free account call each have a method, and every answer is typed.
Install
Get a key
- Sign in with Telegram at https://storiesfly.com/developers/dashboard.
- Create a key there. A new account gets 100 free requests, so you can try every call before you pay.
Keep the key on your server. Anyone who has it can spend your balance.
Quick start
The stories an account has up right now:
Things to know:
- An account is named by
{ username }or{ id }, never both. A post is named by{ url },{ code }or{ id }. The types enforce this. - Ids are strings. Instagram ids pass 2^53, and a JSON number would round them.
- Field names are
snake_case, as the API sends them. A value the answer does not carry isnull. It is never0or"". - Media links in answers are signed Instagram CDN links. They expire within days, so download what you need soon.
A post, with the links to its pictures and video:
A TikTok video without the watermark, and a TikTok account's followers:
Options
Every call also takes a last argument with signal (an AbortSignal), timeoutMs, maxRetries and withMeta.
Paging
A call that returns a list returns one page, with next_cursor and has_more. client.paginate follows the list for you. It is an async iterator that calls the method, yields the page, then calls it again with the next_cursor of the page before, until has_more is false:
- Every page is one call and is charged as one. A large account has many pages, so set
maxPagesunless you mean to read the whole list. paginatetakes the method itself (client.user.followers), its parameters, and options:maxPages,signalandwithMeta. Acursorin the parameters starts the walk from a page you already have.- Only methods that take
cursorcan be paginated, and the compiler refuses the rest. ThePagedcolumn of the methods table marks them, andENDPOINTS(exported) has apagedflag on each. - To page by hand, pass
next_cursorback ascursorand keep every other parameter the same. A cursor is opaque. A cursor the API did not return givesbad_request. - Page size follows Instagram and varies by endpoint. The spec fixes it for three:
user.postsreturns up to 9 items a page,user.followersanduser.followingup to 25. ThePagedcolumn of the methods table shows the size wherever the spec gives one.
TikTok
TikTok calls live under client.tiktok. An account is named by { username }.
videos,followers,followingandrepoststakecursorand returnnext_cursor, soclient.paginatefollows them. Page size follows TikTok and varies by endpoint.- An account that hides its followers or following list answers an empty page with
hidden: true. - A number is
nullwhen it is not exact. File links are temporary: save the files right away. - On a later page of
tiktok.user.videos,video_urlisnull. To get the file of one video, calltiktok.videoordownloadwith itsurl.
Download
client.download({ url }) takes the link of an Instagram post, reel or IGTV, or of a TikTok video or photo post (short links too), and returns the file links: the video (TikTok's without the watermark), every picture of a carousel or photo post, the cover, and for TikTok the soundtrack. It returns files only; for the numbers use post.get or tiktok.video. The price is fixed per call: $0.50 per 1,000 for an Instagram link and $0.20 per 1,000 for a TikTok link.
File links are temporary, so download them right away. client.account() also shows the download prices as download_price_usd.
Use it from ChatGPT and Claude (MCP)
The same data is available to AI assistants at https://storiesfly.com/mcp, with no code. Details: https://storiesfly.com/developers/mcp.
- In Claude Code:
claude mcp add --transport http storiesfly https://storiesfly.com/mcp - ChatGPT and Claude connect to the same address and sign in with Telegram.
What a call cost: response meta
A call resolves to the parsed body. To see the billing headers too, pass { withMeta: true } as the last argument and the call resolves to { data, meta }:
A header the answer did not carry is null. The meta is returned per call and not kept on the client (there is no lastResponse), so calls that run at the same time cannot overwrite each other's numbers. With paginate, { withMeta: true } yields { data, meta } for each page.
Errors and what is charged
Every call that does not return data throws StoriesFlyError. Test code, not message:
Other fields: fields (with bad_request, the names of the refused parameters), linkUrl (with telegram_required, the link that links your account to Telegram), url (the URL called; it holds no key) and body (the parsed error body).
You are charged for answers: a 200, not_found and private_account. A wrong parameter, a rate limit and an empty balance cost nothing, and a failure on our side is refunded. err.meta.unitsCharged and X-Units-Charged say what a call took.
The client adds three codes of its own, with status 0 when no answer came: timeout (no answer within timeoutMs), network_error (fetch failed; the error has the cause) and invalid_response (an answer that is not in the documented shape, such as a proxy's error page; the status and the body are kept).
Retries
- A
429is retried up tomaxRetriestimes (2 by default). The client waits for theRetry-Afterthe API sent, or half a second and then longer when it sent none. ARetry-Afterlonger than 30 seconds is not waited out: the error is thrown at once, withretryAfterMsset. - A
402is never retried: another call would not change it. - Other errors, timeouts and network errors are not retried. A
500or503is refunded, so you can retry it yourself.
Pricing
From $1.50 per 1,000 requests, prepaid. See https://storiesfly.com/developers/pricing.
One unit is one request. Every call takes 1 unit, a page of a list included. Resolving a share link takes 2, and account takes none. download is sold at a fixed price per call (see Download) and uses one free unit when you have any. Free units are spent before your balance. Requests per second are limited per account.
Methods
Each method is a call of API v1. This table is generated from the OpenAPI spec (openapi.json) and checked by the tests.
Parameters, in short:
- TikTok calls (
tiktok.user.*) take{ username }, andtiktok.videoanddownloadtake{ url }. The paged TikTok calls also takecursor. - Account calls (
user.*,shop.storefront) take{ username }or{ id }. The calls with a cursor also takecursor.user.followersSearchanduser.followingSearchalso takeq. - Post calls (
post.*) take{ url },{ code }(the part of the link after/p/or/reel/) or{ id }.post.commentstakescursor.post.commentRepliesalso takescomment_id. story.getandhighlight.gettake{ url }or{ id }.hashtag.poststakesname,sort(top,recentorreels; keep it the same from page to page) andcursor.location.poststakesid,sort(toporrecent) andcursor.location.searchtakesq, orlatandlng. Thesearch.*calls takeq, 1 to 100 characters.post.getreturns the whole post:media(the links to its pictures and video, one entry per slide of a carousel), caption, owner, time, and the numbers. It is the same shape as an item ofuser.posts,user.reels,hashtag.postsand the other lists of posts, andresolvereturns it for a post link.
Docs
- API docs, with a page for each endpoint: https://storiesfly.com/developers/docs
- OpenAPI 3.1 spec: https://storiesfly.com/openapi.json (this repository holds a copy as
openapi.jsonandopenapi.yaml) - API changelog: https://storiesfly.com/developers/changelog
- Changelog of this package: CHANGELOG.md
- Examples:
stories.mjs(stories of an account),followers.mjs(followers withpaginate) andpost.mjs(a post with its media links and numbers). Run them withSTORIESFLY_API_KEY=your_key node examples/stories.mjs instagram.
Migrating from 0.x
1.0 is a rewrite for API v1. The old methods are gone, the base URL changed, and the old plans and daily quotas do not exist in v1.
What else changed:
baseUrlnow defaults tohttps://storiesfly.com/api/v1. ThebearerTokenoption is gone: v1 takes the key inX-Api-Keyand nowhere else.- Methods are grouped by resource:
client.user.profile(),client.post.get(),client.search.users(). Every method takes one object of parameters. - Answers use the API's own
snake_casenames, andnullfor a value that is missing:fullNameis nowfull_name,profilePicUrlisprofile_pic_url,isPrivateisis_private,takenAtistaken_at. StoriesFlyErrorhascode,requestIdandretryAfterMs. The 0.x fieldsrateLimit,retryAfterSec,requiresUpgrade,isRateLimitedandmethodare gone. Compareerr.codewithrate_limited,credits_exhaustedand the rest. A429is now retried for you.- The old plans (DEV, Starter, Growth, Scale, and the Tracker plans), their daily quotas and the 60 requests a minute burst limit are gone. v1 bills from a prepaid balance, per request, with 100 free requests for a new account. See Pricing.
- A key from before works on v1 once the account behind it is linked to Telegram. Until then v1 answers
telegram_required, anderr.linkUrlhas the link. - The tracker, shadow ban and outbound analytics endpoints still answer over HTTP, but 1.0 does not wrap them. To keep using them, stay on
storiesfly@0or call them yourself. The older/api/stories,/api/profile,/api/highlights,/api/mediaand/api/downloadendpoints that 0.x calls keep working for existing free keys until 2026-12-31. Details: https://storiesfly.com/developers/docs/legacy.
FAQ
Does it need an Instagram or TikTok login? No. You send a StoriesFly API key and nothing else. There are no cookies or sessions to manage.
Can I get a TikTok account's followers list?
Yes. client.tiktok.user.followers({ username }) returns it page by page, and client.paginate follows the pages. An account that hides the list answers an empty page with hidden: true.
Can I download a TikTok video without the watermark?
Yes. client.tiktok.video({ url }) returns video_url without the watermark, and client.download({ url }) returns the file links for an Instagram or TikTok link.
Can I use it from ChatGPT or Claude?
Yes, through the MCP server at https://storiesfly.com/mcp. See Use it from ChatGPT and Claude (MCP).
How is it priced? Per request, from prepaid balance. A new account gets 100 free requests, once. See Pricing.
Not affiliated
This is a client for the StoriesFly API. It reads public data only, and a private account gives private_account. It is not an Instagram or Meta product and is not affiliated with or endorsed by them.
Development
To update the spec: replace openapi.json with the new file, run npm run openapi:sync and npm run readme:sync, and run the tests.
License
MIT. See LICENSE.
来源:README.md,提交 5a343ca
工具
0版本历史
1- v1.0.0最新Oct 30, 2026
评分
已满足适用检查项的 85%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
- 近 30 天内可连通必需25 分
- 已声明认证方式必需10 分
- 已列出工具15 分
请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。
- 描述必需15 分
- 图标10 分
- 文档15 分
- 许可证10 分