ReelsFarm

io.github.mateohysa由 GitHub 帳號 mateohysa 發布v2.0.1更新於 Oct 26, 2026

Create, manage, schedule, and publish short-form user-generated content through AI agents.

已驗證Streamable HTTP可網頁執行效率與工作流溝通與協作媒體與設計

概覽

AI 產生的概覽

ReelsFarm 是遠端 MCP 伺服器,讓 AI 助理建立、生成、排程並發佈短影音、圖文輪播與圖片等短內容。

可以做什麼
  • 生成並管理圖片、虛擬人物、產品場景與圖片範本,支援延續同一對話的後續生成
  • 製作圖文輪播與文字版面,支援 Look 樣式、成熟格式、圖片搜尋以及從 TikTok 連結重製
  • 以文字、首尾影格或參考素材生成影片,並產生開場鉤子片段與 AI Clone 語音
  • 瀏覽媒體合輯、社群圖片、圖庫項目與回收站內容
  • 對已連結的 TikTok、Instagram、YouTube、Facebook 帳號進行發佈預檢、排程、修改與發佈
  • 管理自動化流程,並查看帳號定價、任務與操作狀態
適用情境
適合需要讓助理製作短內容並發佈到已連結社群帳號的情境,也適合用代理以程式方式完成生成、排程與發佈,而不必手動操作 ReelsFarm 後台。
執行需求
遠端 MCP 端點 mcp.reelsfarm.com,使用 streamable HTTP;需要 OAuth 驗證,可使用 content:read、content:generate 等權限範圍。選用的 TypeScript SDK 與 CLI 為 npm 套件,支援 API key 或 OAuth。任何建立、修改、發佈或刪除操作都需要具備方案或試用期的 ReelsFarm 帳號。
安裝前請注意
發佈、排程、修改、刪除與自動化變更都會實際寫入已連結的社群帳號;Review 模式會回傳待確認的預備操作。Creator 與 Autopilot 連線策略可在沒有額外確認步驟下執行允許的操作。生成會消耗額度,影片尺寸越大費用越高。憑證與權杖屬敏感資訊;永久刪除以及憑證、webhook 變更僅能在後台進行。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 ReelsFarm,將其新增到工作區。
  2. 連接 所需的 憑證。它們會被私密儲存,絕不會在公開頁面上展示。
  3. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/io.github.mateohysa%2Freelsfarm/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。 客戶端會在首次連接時完成 OAuth 登入。

{
  "mcpServers": {
    "reelsfarm": {
      "type": "http",
      "url": "https://mcp.reelsfarm.com/mcp"
    }
  }
}

README

[ReelsFarm]

@reelsfarm/mcp-client

Typed TypeScript SDK and CLI for the ReelsFarm MCP server.

Version 3.11

SDK 3.11.0 matches ReelsFarm MCP server 3.11.0 and contract 2026-10-30.1. It tracks all 177 public tools. Mutation and generation results include explicit ReelsFarm provenance, execution state, and an assetCreated completion signal.

Server 3.11 lists the same tools in about a quarter of the old size. Confirmation tools take only confirmationId, so a dry-run client no longer calls them. Read MIGRATION.md for the other changes.

Version 3.9 confirms each prepared action with its own confirmation tool, because servers since 3.7 no longer accept reelsfarm_confirm_action from clients. Update from 3.6: its confirmations fail against the current server, and validateToolSurface: 'throw' refuses to connect. Read MIGRATION.md.

It also adds slideshow Looks (tweet, iMessage, notebook, magazine cover), proven formats, Recreate from a TikTok link, TikTok text fonts and modes with free text positions, photo search, saved formats and batches, the automation photo sources and AI pictures, hook reaction styles, and natural speech for Videos.

Publishing aliases from MCP 2.x are removed. Read MIGRATION.md before you update a publishing integration.

npm install @reelsfarm/mcp-client
import { ReelsFarmClient, ReelsFarmJob } from '@reelsfarm/mcp-client';
const rf = new ReelsFarmClient({  apiKey: process.env.REELSFARM_API_KEY,  validateToolSurface: 'throw',});
await rf.ready();
const avatar = await rf.avatars.generate({  prompt: 'Woman in her 30s, casual outfit, smartphone selfie style',  model: 'gpt-image-2.5-sunburst',  aspectRatio: '9:16',  quality: 'high',});
if ('confirmationId' in avatar) {  console.log('Review mode requires confirmation:', avatar);} else if (avatar instanceof ReelsFarmJob) {  const result = await avatar.wait();}

Review mode returns a PreparedAction by default. Its confirmationTool names the one tool that confirms it, such as reelsfarm_confirm_generate_avatar; call it with the confirmationId after the user approves. Trusted applications can set autoConfirm: true to confirm Review actions automatically. Creator and Autopilot connections execute the capabilities enabled by their server-owned connection policy without an extra SDK approval step.

Use nano-banana-2-1 for Nano Banana 2.1. The legacy nano-banana-2-pro key also uses 2.1. Use gpt-image-2.5-sunburst as the public GPT Image 2.5 model key. GPT Image 2 and GPT Image 2.5 accept low, medium, or high quality. Seedream 5.0 Pro accepts basic or high. FLUX 3 (flux-3) accepts basic (1K), high (about 2 megapixels), ultra (2K), or max (4K); bigger sizes cost more credits, and the prepared result's estimate follows the size. Omit quality for Nano Banana models.

Job waits and publishing discovery

All 13 generation, import, and export status methods accept { waitMs: 25000 }. Use an integer from 0 through 25000. Omit it or use 0 for an immediate snapshot. The server returns when recorded progress changes, the job ends, or the wait budget expires. This option does not apply to operation or publish status tools.

ts
const snapshot = await rf.avatars.getJobStatus(jobId, { waitMs: 25000 });// A ReelsFarmJob also supports job.getStatus({ waitMs: 25000 }).console.log(snapshot.jobProgress);

jobProgress contains step, terminal, nextPollAfterMs, and available batch counts. Inspect item results even when a batch completes; some items can fail. The SDK preserves these fields when unwrapping job results. job.wait() follows the server's suggested polling delay, with backoff for older responses.

Publishing preflight targets include settingsSchema (JSON Schema 2020-12 for one platforms entry), rules, and limits. Build settings from the exact account and media result. ready checks account and media readiness; required settings still need values. Missing limits are unknown. Integration targets can expose fewer settings than native connections. Run preflight again after changing the content, format, or account.

For a native Instagram video, set instagramShareToFeed: false to keep the Reel in the Reels tab only. Set it to true to also allow it on the profile grid. New native Reels default to false. This field is not available for Instagram integration accounts or photo posts. Check that the selected account's settingsSchema includes it before sending it. instagramTestReel is a separate setting.

Connected and social account lists mark an account managed: true when ReelsFarm connected the Instagram or Facebook account through its managed integration. Publish to it like any other integration account.

Conversational generation

Avatar and product-scene jobs return conversationId, parentGenerationId, and jobId. Pass the conversation and parent IDs into the next generation to continue the same branch. Read the complete branch through rf.imageGenerations.getConversation(conversationId).

const nextAvatar = await rf.avatars.generate({  prompt: 'Keep the same person and use a tighter crop',  sourceImageUrl: previousImageUrl,  conversationId,  parentGenerationId: previousJobId,});

Hook generation accepts customPrompt, all current Veo and Seedance models, duration, and optional spoken script settings. Slideshow generation accepts Max mode visual context. Use rf.slideshows.reviseText(...) to apply a natural language instruction to the complete current slide text state.

Slideshow text generation and revision accept the dashboard effort presets: light, low, medium, high, and extra_high. Higher effort uses more visual references (0, 2, 5, 10, or 20) and more model time. extra_high also reviews the rendered text layout and is the dashboard default. Without effort, Max mode accepts up to five visual references; with it, up to 20. Give each reference its slide aspectRatio, because layout checks assume 1:1 when it is missing.

const textJob = await rf.slideshows.generateText({  prompt: '8 slides about cold brew at home',  slideCount: 8,  maxMode: true,  effort: 'high',  visualContext: slideImages.map((imageUrl, order) => ({ order, imageUrl, aspectRatio: '9:16' })),});

Looks, formats, and Recreate

generateText takes a Look and a proven format. A designed slide comes back with a design object and no text items; pass it unchanged to create or update. An iMessage slide draws no photo, so it needs no imageUrl and no visual context. auto picks a designed look only when the prompt asks for one.

const chat = await rf.slideshows.generateText({  prompt: 'Texts with my mom when she finds out how much I spend on iced coffee',  slideCount: 4,  design: 'imessage',});
const picks = await rf.slideshows.generateText({  prompt: 'The 3 best cold brew makers under $50',  format: 'rated-picks',  design: 'classic',});

rf.slideshows.recreate(...) copies a public TikTok photo slideshow for your product: the same format and text looks, new words, and a photo for every slide. It takes about two minutes, and the finished status has the slideshowId.

const job = await rf.slideshows.recreate({  tiktokUrl: 'https://www.tiktok.com/@creator/photo/7550000000000000000',  productContextId,  instructions: 'Use a wedding cake instead of the birthday cake',});

Text items accept TikTok's textFont, textEffect (none, outline, background, translucent) and textColor, which win over textStyle, plus textX and textY (0 to 1) for a free position. searchPhotos(...) finds photos on Pinterest, Tumblr, or Pexels, and savePhotos(...) turns picks into ReelsFarm URLs a slide can use. saveFormat(...) and createBatch(formatId, count) make many slideshows from one format, as Make 10 now does in the app.

Videos workbench

rf.videos.generateVideo(...) starts the same job as the dashboard Videos workbench. It supports text-to-video, a start frame with an optional end frame, or up to three reference images. Seedance models also accept one reference video and one reference audio file. Do not combine frames with reference media. Use owned ReelsFarm asset URLs for frames and references. With a start frame of a person, motionPreset opens the video with a hook reaction such as shocked or grateful. With audio, naturalSpeech (on by default) makes spoken lines in quotes sound like a real person without changing the words; set it to false to send the prompt exactly as written.

const video = await rf.videos.generateVideo({  prompt: 'Slow push-in on a latte on a sunny cafe table',  model: 'seedance-2.5',  durationSeconds: 8,  aspectRatio: '9:16',  category: 'product',});
if (video instanceof ReelsFarmJob) {  const status = await video.wait();  console.log(status.video?.id); // Publish it with contentType UGC_VIDEO.}

The models are seedance-2.5 (the default), seedance-2, seedance-2-fast, veo-3.1, veo-3.1-fast, and gemini-omni-1.1-flash. Each model supports its own durations, aspect ratios, and resolutions. rf.account.getGenerationPricing() lists them with per-second prices under videoGeneration. Poll with rf.videos.getGenerationStatus(jobId, { waitMs: 25000 }). A completed job returns the finished library video in video.

One video job runs at a time per account, across hooks, AI Clone, and the Videos workbench. Another request fails with code VIDEO_JOB_IN_PROGRESS and names the active job. Wait for that job to finish, then retry with a new idempotency key. For an avatar-led hook clip, use rf.hooks.generate(...).

Image templates

rf.imageGenerations.listTemplates({ category }) returns the Product and Infographics templates from the dashboard Images workbench. Each template has a reference image, a prompt brief with [PLACEHOLDER] fields, and the generation tool to call. Replace the placeholders, remove lines you cannot fill, and start the prompt with the template categoryLine.

const { templates } = await rf.imageGenerations.listTemplates({ category: 'infographics' });const [template] = templates;if (template && !template.requiresProduct) {  await rf.avatars.generate({    mode: 'reference',    sourceImageUrl: template.referenceUrl,    prompt: `${template.categoryLine}\n${filledBrief}`,    model: template.model,    aspectRatio: template.aspectRatio,    quality: template.quality,  });}

For a template with requiresProduct: true, call rf.productScenes.generate(...) with sourceImageUrl set to referenceUrl and productImageUrl set to the product photo. peopleTemplate gives the brief and settings for the people reference images from rf.avatars.listTemplates().

The SDK also maps the web content library workflows directly:

const gallery = await rf.mediaCollections.listGallery({ kinds: ['COLLECTION', 'AVATAR'] });const collections = await rf.mediaCollections.list();const communityImages = await rf.community.listImages(collectionId, { random: true });const voices = await rf.aiClones.listVoices({ search: 'warm' });const importJob = await rf.hooks.importClips({  items: [{ url: youtubeUrl, start: "0", length: "5" }],});const infographics = await rf.mediaCollections.listGallery({  kinds: ['AVATAR', 'PRODUCT_PLACEMENT'],  imageCategory: 'infographics',  groupCollections: true,});const firstItems = await rf.mediaCollections.getItems(collectionId, 'all', { limit: 50 });const { totalCount } = await rf.videos.list({ category: 'people' });

imageCategory filters generated images only, so set kinds to return images only. groupCollections: true returns each collection as one item, as the dashboard gallery tabs do. Collection items arrive in one response unless you set limit or cursor; then follow nextCursor until hasMore is false. Video lists return totalCount, and the first asset page returns the category totalCount. Use these totals instead of counting a page.

The same MCP contracts now cover the unified gallery, personal media collections, community images, hook import health and jobs, AI Clone voice search, product-context URL suggestions, saved character identity extraction, and all eight creative Trash item types: avatars, product placements, videos, slideshows, stored assets, saved characters, drafts, and product contexts. Use the exact type and ID returned by rf.trash.list() when restoring. Permanent deletion remains dashboard-only.

Protocol and OAuth

The SDK uses the stable MCP TypeScript SDK v2. It probes for the 2026-07-28 protocol and falls back to the legacy 2025 handshake when required.

OAuth clients should request only the capabilities they need. The default remains mcp:full for compatibility:

const rf = new ReelsFarmClient({  oauth: {    redirectUri: 'http://127.0.0.1:3456/callback',    scopes: ['content:read', 'content:generate'],    onAuthorizationUrl: openInBrowser,  },});
await rf.raw.listTools();await rf.completeOAuthCallback(callbackUrl);

Pass the complete callback URL to completeOAuthCallback. The SDK validates the redirect URL, OAuth state, and authorization-server issuer before it redeems the code. The SDK does not expose a raw authorization-code completion method because that form cannot validate state by itself.

CLI

npm install -g @reelsfarm/mcp-clientreelsfarm login --api-key rfmcp_xxxreelsfarm whoamireelsfarm avatars listreelsfarm avatars generate --prompt "Creator selfie style" --model gpt-image-2.5-sunburst --aspect-ratio 9:16 --quality high --waitreelsfarm image-generations templates --category productreelsfarm account pricingreelsfarm videos generate --prompt "Slow push-in on a latte" --model seedance-2.5 --duration 8 --aspect-ratio 9:16 --waitreelsfarm videos list --category productreelsfarm media-collections gallery --kinds COLLECTION,AVATARreelsfarm ai-clones voices --search warmreelsfarm hooks import-capabilitiesreelsfarm posts preflight --content-type SLIDESHOW --content-id 11111111-1111-4111-8111-111111111111 --publish-format VIDEO --connection-ids 22222222-2222-4222-8222-222222222222 --agentreelsfarm posts list --json

Credentials are resolved in this order: constructor options, environment variables, then the CLI config file at ~/.reelsfarm/config.json. Set REELSFARM_CONFIG_DIR to use a different config directory.

Using ReelsFarm with AI Agents

ReelsFarm is safe for shell-capable agents when invoked in agent mode:

reelsfarm agent statusreelsfarm agent commandsreelsfarm social connected --agentreelsfarm posts schedule --content-type SLIDESHOW --content-id 11111111-1111-4111-8111-111111111111 --when 2026-09-01T15:00:00Z --platforms tiktok:22222222-2222-4222-8222-222222222222 --publish-format VIDEO --agentreelsfarm confirm conf_123 --tool reelsfarm_confirm_schedule_post --agent

Use --agent or set REELSFARM_AGENT_MODE=1 to receive strict JSON envelopes on stdout. Agent mode never mixes tables or human narration into command output. Errors are also JSON on stdout and use a non-zero exit code.

Prepared actions such as generation, scheduling, publishing, updating, and deleting return a confirmation payload in Review mode. Creator and Autopilot can execute allowed actions immediately; agent mode only controls output. When a confirmation is returned, review the summary, then run the nextStep it gives: reelsfarm confirm <confirmationId> --tool <confirmationTool> --agent. Pass --yes only when the application should automatically confirm Review-mode actions. --dry-run is sent to the server and cannot mutate in Review, Creator, or Autopilot, even when combined with --yes. reelsfarm confirm refuses --dry-run, because a confirmation always runs the prepared action.

The server connection policy is authoritative for direct writes. Creator may create and edit content but cannot publish or activate automations. Autopilot may publish and manage automations subject to account limits. Credential, connection-mode, webhook-security, and permanent-delete actions are dashboard-only and are not exposed by this package.

Idempotency and operation recovery

The SDK generates one UUID for every logical mutation and reuses it if the transport response is ambiguous. Supply idempotencyKey on a mutation input, or --idempotency-key <key> in the CLI, when retries must also survive process restarts. Never reuse a key with different arguments.

The SDK never automatically re-prepares an action after confirmation. It safely replays the same request once after an ambiguous transport failure and polls the original durable operation when the server returns one:

reelsfarm operations get --id op_123 --agentreelsfarm operations wait --id op_123 --timeout 30000 --agent

Structured errors distinguish authentication, insufficient scope, policy denial, rate limiting, idempotency conflict, operation-in-progress, and plan limits. An account without a plan or trial can connect and read; anything that creates, changes, publishes, or deletes throws a ReelsFarmPlanLimitError with code SUBSCRIPTION_REQUIRED and a dashboardUrl for choosing a plan. A rejected automation request is a ReelsFarmValidationError with code INVALID_AUTOMATION. An active video job conflict is a retryable ReelsFarmToolError with code VIDEO_JOB_IN_PROGRESS. OAuth profiles retain rotating refresh tokens in the existing protected profile token store until revoked or a security event requires authorization.

Endpoint

The default MCP endpoint is https://mcp.reelsfarm.com/mcp. Pass serverUrl in the SDK or --server-url in the CLI to target another deployment. The SDK rejects non-loopback plaintext HTTP by default. Set allowInsecureHttp: true or REELSFARM_ALLOW_INSECURE_HTTP=1 only for a trusted private development endpoint. The CLI also accepts --allow-insecure-http.

Development

npm installnpm run typechecknpm testnpm run check:manifestnpm run build

The checked-in tool manifest reflects the current discoverable ReelsFarm MCP surface. Dashboard-only credential, webhook, and permanent-delete tools stay out of the public SDK catalog. The manifest check compares the 177 public SDK tools with the app's generated public tool reference, and the release and contract versions with the app MCP server, when both repositories are adjacent. Use npm run generate:tools against an authenticated MCP endpoint when the server adds or removes tools.

Publishing preflight and platform settings

Run preflight before a schedule or publish call. The server repeats preflight before it creates or executes the action.

const readiness = await rf.posts.preflight({  contentType: 'SLIDESHOW',  contentId: slideshowId,  publishFormat: 'VIDEO',  connectionIds: [tiktokConnectionId, youtubeConnectionId],});
const scheduled = await rf.posts.schedule({  contentType: 'SLIDESHOW',  contentId: slideshowId,  publishFormat: 'VIDEO',  scheduledFor: '2026-09-01T15:00:00.000Z',  platforms: [{    platform: 'TIKTOK',    connectionId: tiktokConnectionId,    captionOverride: 'TikTok caption',    tiktokPublishMode: 'DIRECT',    tiktokPrivacyLevel: 'PUBLIC_TO_EVERYONE',    tiktokAllowComment: true,    tiktokCommercialContentEnabled: false,  }, {    platform: 'YOUTUBE',    connectionId: youtubeConnectionId,    youtubeTitle: 'Launch Short',    youtubePrivacyStatus: 'UNLISTED',    youtubeMadeForKids: false,    youtubeContainsSyntheticMedia: true,  }],});

The CLI accepts simple platform:connectionId pairs. Use --platforms-json when you need captions or platform settings.

Edit a post before it publishes with rf.posts.update(...). Name each existing destination by platform and connectionId (accountId in rf.posts.list(...)); omitted fields keep their saved values, and media and accounts cannot change. Switching TikTok to DIRECT needs tiktokPrivacyLevel and, for video, tiktokIsAigc. The edit fails once the post has started publishing.

await rf.posts.update(scheduledPostId, {  caption: 'New caption',  platforms: [{    platform: 'TIKTOK',    connectionId: tiktokConnectionId,    tiktokPublishMode: 'DIRECT',    tiktokPrivacyLevel: 'PUBLIC_TO_EVERYONE',    tiktokIsAigc: true,  }],});

On the CLI, use reelsfarm posts update --id <id> --platforms-json <json>.

Automations

Automation tiktokSettings accept the same settings as a TikTok publishing target, including tiktokPublishMode, tiktokPrivacyLevel, tiktokTitle, the interaction and disclosure flags, and the cover settings. tiktokPostMode remains a legacy alias; tiktokPublishMode and tiktokPrivacyLevel take priority over it.

An ACTIVE automation needs a tiktokTitle of 1 to 90 characters and either at least one image collection or a fixed image on every slide. Commercial content needs tiktokBrandOrganic, tiktokBrandedContent, or both, and branded content cannot use SELF_ONLY privacy. The server checks each request before approval.

To rotate captions across runs, put each caption in square brackets, for example [First caption][Second caption]. rf.automations.update(...) keeps omitted top-level fields, replaces images, and merges publishRules field by field. A new caption replaces a saved TikTok captionOverride.

await rf.automations.update(automationId, {  status: 'ACTIVE',  publishRules: {    caption: '[Morning tip][Evening tip]',    tiktokSettings: {      tiktokPublishMode: 'DIRECT',      tiktokPrivacyLevel: 'PUBLIC_TO_EVERYONE',      tiktokTitle: 'Daily skincare tip',    },  },});

來源:README.md,提交 0020b08

工具

0
該伺服器需要登入,因此 SourceWeft 無法在沒有帳號的情況下讀取其工具,也未收錄。已連接帳號所能看到的內容可能因帳號及其權限而異。

版本歷史

1
  1. v2.0.1最新Sep 16, 2026

評分

已滿足適用檢查項的 85%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分