Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

flayr

REMOTE · FLAYR.SOCIAL

Create, schedule and publish social posts to 13 platforms for your brands.

Available components

+3 this week 78 Trust /100

Last scanned (4 hours ago)

Scores higher than 76% of remote servers

Reachable. Last reached 5 Nov 2026.

Category Marketing and SEO

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security97
Transport & Reachability100
Schema Quality & AI Usability54
  • AI-judged instruction clarity (good).Pass
  • Context-footprint check failed: tool/resource definitions use about 22443 tokens (~213/item across 105 items; 105 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management23
  • Stability observed for 7 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage85
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 55% of tool parameters carry a description.Partial
Tool Safety97
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 8 of 9 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "list_publish_actions" implies "publish" and declares readOnlyHint instead, contradicting what its own name says it does. See how to fix → Partial
  • An AI judge read all 106 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 5 Nov 26 0
    • New tool “decide_approval_group”, which the server declares destructive security
    • New tool “ad_cut_lint” functional
    • New tool “list_approval_groups” functional
  • 4 Nov 26 +1
    • The server rewrote its instructions, which are the text every model session reads security
    • New tool “decide_campaign_review_section”, which the server declares destructive security
    • New tool “delete_growth_trigger”, which the server declares destructive security
    • New tool “update_growth_trigger”, which the server declares destructive security
    • Tool “decide_approval” rewrote its description, which is the text the model reads security
    • Tool “get_job_status” rewrote its description, which is the text the model reads security
    • Tool “list_approvals” rewrote its description, which is the text the model reads security
    • Tool “list_brands” rewrote its description, which is the text the model reads security
    • Tool “publish” rewrote its description, which is the text the model reads security
    • Tool “update_content” rewrote its description, which is the text the model reads security
    • Schema quality: 236 → 211 ▲ functional
    • New tool “account_refresh” functional
    • New tool “ads_accounts_list” functional
    • New tool “ads_boost_candidates” functional
    • New tool “ads_campaign_get” functional
    • New tool “ads_campaign_pause” functional
    • New tool “ads_campaigns_list” functional
    • New tool “ads_insights” functional
    • New tool “ads_offer_update” functional
    • New tool “ads_offers_list” functional
    • New tool “ads_readiness” functional
    • New tool “bodies_map” functional
    • New tool “brand_business_details_get” functional
    • New tool “brand_business_details_update” functional
    • New tool “brand_profile_get” functional
    • New tool “brand_profile_update” functional
    • New tool “claims_check” functional
    • New tool “close_experiment_round” functional
    • New tool “create_growth_trigger” functional
    • New tool “cta_check” functional
    • New tool “cta_settings_get” functional
    • New tool “cta_settings_update” functional
    • New tool “ctas_create” functional
    • New tool “ctas_generate” functional
    • New tool “ctas_list” functional
    • New tool “ctas_update” functional
    • New tool “get_campaign_review” functional
    • New tool “get_experiment_readout” functional
    • New tool “get_experiment_rounds” functional
    • New tool “get_growth_trigger” functional
    • New tool “get_growth_trigger_stats” functional
    • New tool “group_campaign_review” functional
    • New tool “hooks_generate” functional
    • New tool “hooks_list” functional
    • New tool “hooks_update” functional
    • New tool “labels_bulk_edit” functional
    • New tool “list_growth_triggers” functional
    • New tool “offers_capture” functional
    • New tool “offers_list” functional
    • New tool “offers_update” functional
    • New tool “propose_repeat_winner” functional
    • New tool “render_motion_ad” functional
    • New tool “start_experiment_round” functional
    • “publish” added an optional parameter “strictMedia” cosmetic
    • “update_content” added an optional parameter “aiGenerated” cosmetic
    • “update_content” added an optional parameter “library” cosmetic
    • “decide_approval” reworded the description of “note” cosmetic
    • “publish” reworded the description of “instagram” cosmetic
    • “query_insights” reworded the description of “breakdown” cosmetic
  • 2 Nov 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 10 to 13. That category is still filling its 30-day observation window: 3 days of observed history at the previous scan, 4 at this one. The score rises as the window fills, whether or not the server changes.

  • 31 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.

  • 30 Oct 26 0
    • The server rewrote its instructions, which are the text every model session reads security
    • Stability: unverified → 0.03 ▲ functional
  • 29 Oct 26 75

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 5 Nov 2026 · Probed https://flayr.social/api/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=*.flayr.social CN=YR1,O=Let's Encrypt,C=US 19 Oct 2026 17 Jan 2027 RSA 2048 SHA256-RSA 50ffe3073c30fee8b02c831b5a54441e9eb
SANs: *.flayr.social, flayr.social
CN=YR1,O=Let's Encrypt,C=US (CA) CN=Root YR,O=ISRG,C=US 3 Sept 2025 2 Sept 2028 RSA 2048 SHA256-RSA a20253f15f2691c05dc1ce13b9bcca4e
CN=Root YR,O=ISRG,C=US (CA) CN=ISRG Root X1,O=Internet Security Research Group,C=US 13 May 2026 2 Sept 2032 RSA 4096 SHA256-RSA f24b6d17f9d9ad7cb1c9fea78782699f

Background: What to check on a remote MCP endpoint →

DNSSEC insecure

Validation of flayr.social. — Not signed

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
social. present 40816 8 Verified
flayr.social. absent Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation
Authentication Enforced and verified

The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.

Result Enforced and verified
Enforced On tool calls
HTTP status 200

WWW-Authenticate challenge Bearer resource_metadata="https://flayr.social/.well-known/oauth-protected-resource/api/mcp"

Bearer resource_metadata="https://flayr.social/.well-known/oauth-protected-resource/api/mcp"
Header Value
strict-transport-security max-age=63072000
x-content-type-options nosniff
x-frame-options DENY
referrer-policy strict-origin-when-cross-origin
permissions-policy camera=(self), microphone=(self), geolocation=()

Protected resource metadata

Document https://flayr.social/.well-known/oauth-protected-resource/api/mcp
Retrieved Yes
Resource https://flayr.social/api/mcp
Authorisation server https://clerk.flayr.social

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://flayr.social/api/mcp Verified 200
http (plaintext) http://flayr.social/api/mcp HTTPS enforced 308 https://flayr.social/api/mcp
MCP tools · 105 exposed · ~21,955 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
get_content ~126

[read-only] One content item plus its live posting status: `postState` and `posts[]` (up to 20, newest first) with each post's status (scheduled · publishing · published · partial · failed · review_held · held), scheduledAt, and per-platform status, live URL and error. The item's own `status` stays "draft" after publishing — read `posts` to know whether it is live. Use this to confirm a publish landed. (Wraps GET /api/v2/content/{id}.)

NameTypeReqDescription
idstringyes–

No output schema declared.

No examples provided.

get_experiment ~49

[read-only] One experiment: hypothesis, variants, compareKey, window and status. (Wraps GET /api/v2/experiments/{id}.)

NameTypeReqDescription
idstringyes–

No output schema declared.

No examples provided.

get_experiment_readout ~103

[read-only] n per arm, pooled reach engagement rate, a 90% interval and a hedged verdict (likely_winner, no_clear_winner or not_enough_data). Missing numbers are "not reported" (null), never 0. Say "likely", never "proven". (Wraps GET /api/v2/experiments/{id}/readout.)

NameTypeReqDescription
idstringyes–
windowstring––

No output schema declared.

No examples provided.

get_experiment_results ~84

[read-only] The experiment's posts split by its compareKey, with the leading variant by its primary metric and n per arm. Small samples: read medians with their n. (Wraps GET /api/v2/experiments/{id}/results.)

NameTypeReqDescription
idstringyes–
includestring––
windowstring––

No output schema declared.

No examples provided.

get_experiment_rounds ~78

[read-only] A version test's rounds: each closed round's frozen snapshot, the open round's live numbers (null = not reported), the winner if one was recorded, and any repeat-winner proposal. (Wraps GET /api/v2/experiments/{id}/rounds.)

NameTypeReqDescription
idstringyes–

No output schema declared.

No examples provided.

get_frame ~43

[read-only] One library frame with its sizes and content areas. (Wraps GET /api/v2/frames/{id}.)

NameTypeReqDescription
idstringyes–

No output schema declared.

No examples provided.

get_frame_settings ~41

[read-only] Which frame each platform's images get automatically when a post is published or scheduled. (Wraps GET /api/v2/frames/settings.)

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_growth_trigger ~99

[read-only] One trigger with its keywords, texts, link, cap and counts. (Wraps GET /api/v2/growth-triggers/{id}.)

NameTypeReqDescription
brandIdstring–A brand id (GET /api/v2/brands) or "personal"; default: the key owner's active brand. A brand-bound key is always pinned to its brand; any other value is 403.
idstringyes–

No output schema declared.

No examples provided.

get_growth_trigger_stats ~107

[read-only] Matched comments, unique commenters, replies, DMs and failures, in total and per day. (Wraps GET /api/v2/growth-triggers/{id}/stats.)

NameTypeReqDescription
brandIdstring–A brand id (GET /api/v2/brands) or "personal"; default: the key owner's active brand. A brand-bound key is always pinned to its brand; any other value is 403.
idstringyes–

No output schema declared.

No examples provided.

get_job_status ~106

[read-only] Status of an async job (combine_clips, render_motion_ad, or an API video generation): pending, processing, completed or failed. For a combine or a motion ad, `resultContentId` is the new draft once completed; a failed combine is refunded automatically. Poll every 10-30 s — renders take about a minute. (Wraps GET /api/v2/generate/status/{jobId}.)

NameTypeReqDescription
jobIdstringyes–

No output schema declared.

No examples provided.

get_post ~111

[read-only] A post (`id` = convexPostId from publish, or posts[].id from get_content): status, slot, platforms, and while it is scheduled the first comment each platform will publish and whether it can be changed now. (Wraps GET /api/v2/posts/{id}.)

NameTypeReqDescription
idstringyesThe post: `convexPostId` from POST /api/v2/publish, or `posts[].id` from GET /api/v2/content/{id}.

No output schema declared.

No examples provided.

get_queue ~114

[read-only] A queue and its items in order, with each item's state (queued · publishing · scheduled · posted · failed · skipped), booked or projected slot, and attribution status. (Wraps GET /api/v2/queues/{id}.)

NameTypeReqDescription
brandIdstring–Account-wide keys: "personal" or an id from GET /api/v2/brands (omitted → the brand last active in the dashboard). A brand-bound key always uses its own brand.
idstringyes–

No output schema declared.

No examples provided.

get_text_template ~48

[read-only] One format (text template) with its full structure and example. (Wraps GET /api/v2/text-templates/{id}.)

NameTypeReqDescription
idstringyes–

No output schema declared.

No examples provided.

group_campaign_review ~97

[writes flayr data · `write` scope] Puts the campaign's not-yet-sectioned pieces into review sections (groupBy: week, channel_set, variant_group, episode or phase; default the brand's setting). Existing sections and decisions are kept. (Wraps POST /api/v2/campaigns/{id}/review.)

NameTypeReqDescription
groupBystring––
idstringyesCampaign id.

No output schema declared.

No examples provided.

hooks_generate ~205

[writes flayr data · `write` scope] Writes a batch of draft hooks (on-screen card + spoken line) from the confirmed offers, claims-checked; blocked ones come back in `dropped`, unsaved. Charges Embers once per call (refunded when nothing usable comes back). Needs the Pro plan or higher. (Wraps POST /api/v2/hook-studio/hooks/generate.)

NameTypeReqDescription
anglesarray–e.g. pain, outcome, curiosity, proof.
bodyIdsarray–Bodies (from POST /api/v2/hook-studio/bodies/map) the hooks should lead into.
brandIdstring–A brand id from GET /api/v2/brands. Required for an account-wide key; a brand-bound key may omit it.
countinteger––
formatsarray–e.g. question, bold claim, number, POV.
topicsarray––

No output schema declared.

No examples provided.

hooks_list ~99

[read-only] The brand's hook bank (filter by status: draft, approved, retired), with each hook's claims result. Free. Needs the Pro plan or higher. (Wraps GET /api/v2/hook-studio/hooks.)

NameTypeReqDescription
brandIdstring–A brand id from GET /api/v2/brands. Required for an account-wide key; a brand-bound key may omit it.
statusstring––

No output schema declared.

No examples provided.

hooks_update ~166

[writes flayr data · `write` scope] Edits a hook or sets its status. New copy is claims-checked again; a hook whose claims block cannot be approved. Free. Needs the Pro plan or higher. (Wraps PATCH /api/v2/hook-studio/hooks.)

NameTypeReqDescription
anglestring––
brandIdstring–A brand id from GET /api/v2/brands. Required for an account-wide key; a brand-bound key may omit it.
cardstring––
fitarray––
formatstring––
idstringyes–
linestring––
statusstring––
stylestring––
topicsarray––

No output schema declared.

No examples provided.

labels_bulk_edit ~309

[writes flayr data · `write` scope] Adds and/or removes labels on up to 100 content items in one call: each item becomes (labels − remove) + add. Published items are fine (labels are metadata). Each item succeeds or fails on its own; read `results`. Removing `source:ai-generated` does not turn a post's AI label off: with no explicit toggle it follows how the media was made, and the result carries a `warning`. For real footage also call update_content with `aiGenerated: false` on each item. (Wraps POST /api/v2/content/labels.)

NameTypeReqDescription
addarray–Labels to add. Normalized "key:value" labels (keys and values are lower-cased, spaces become "-"). Linked keys: campaign:<media campaign id>, experiment:<experiment id> (+ variant:<name> or the exper…
idsarrayyesContent ids (GET /api/v2/content).
removearray–Labels to remove. Not also in `add`.

No output schema declared.

No examples provided.

list_approval_groups ~146

[read-only] The same held content as list_approvals, grouped by piece: the variants of one draft (or sharing a `group:<id>` label), with the axes they vary on (theme, hook, audio …), a tally (approved / redo / dropped / open) and each variant's state and slot time. `status` open (default) / redo / approved / dropped / all. Needs the explicit `approve` scope. Agency plan. (Wraps GET /api/v2/approval-groups.)

NameTypeReqDescription
brandstring–"personal" or a brand id (`brandId` is accepted too).
statusstring––

No output schema declared.

No examples provided.

list_approvals ~140

[read-only] Content held for approval that waits on the account owner's decision, newest first: posts filed with publish `requiresApproval: true`, drafts submitted for review, and workflow runs parked at an approval gate. `kind` is "manual" or "workflow". With status "rejected" it lists rejected content instead, with the reviewer's reason (`note`, `reasonChips`), who rejected it and when. Needs the explicit `approve` scope (admin does not include it). Agency plan. (Wraps GET /api/v2/approvals.)

NameTypeReqDescription
brandIdstring––
statusstring––

No output schema declared.

No examples provided.

list_attribution_rules ~121

[read-only] The brand's "posts like this must carry a credit" rules and its mode (flag / push_down). In push_down mode publish refuses or holds a post missing a required credit — add `credits` with update_content first. (Wraps GET /api/v2/attribution-rules.)

NameTypeReqDescription
brandIdstring–Account-wide keys: "personal" or an id from GET /api/v2/brands (omitted → the brand last active in the dashboard). A brand-bound key always uses its own brand.

No output schema declared.

No examples provided.

list_brands ~139

[read-only] Lists the brands this connection can file content into and publish through. Use an `id` as `brandId` on create_content, publish, queues and analytics tools; "personal" means the account owner's personal accounts. A connection bound to one brand sees only that brand (and personal is null). Each brand has its `website` and a `setup` checklist (hasBrandKey, hasWebsite, hasCtaGoal, adsConnected): set a missing website with brand_profile_update; a brand API key is created by the owner in Settings, never by an agent. (Wraps GET /api/v2/brands.)

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_connected_accounts ~152

[read-only] The social accounts a brand can post to — the same set publish would use for that `brandId`: platform, handle, display name, health (healthy, needs_reauth, disconnected) and whether flayr can post there right now (`postable`; Reddit is paused because Reddit closed its API to third-party apps). Call this before publish to pick platforms, and tell the user to reconnect any account that is not healthy at flayr.social/connect. (Wraps GET /api/v2/accounts.)

NameTypeReqDescription
brandIdstring–An id from GET /api/v2/brands, or "personal". Omitted → the key's bound brand, else the owner's personal accounts.

No output schema declared.

No examples provided.

list_content ~128

[read-only] Lists content items (drafts), newest first. Each carries `postState` ("posted" / "scheduled" / null) and `posts[]` (up to 5): where it went out, per platform, with status, live URL and failure reason. (Wraps GET /api/v2/content.)

NameTypeReqDescription
brandIdstring–A brand id from GET /api/v2/brands. Omitted: the key's brand (brand-bound key) or the owner's active brand.
includeArchivedboolean––
limitinteger––

No output schema declared.

No examples provided.

list_experiments ~125

[read-only] A/B experiments. Content joins one by carrying the label `experiment:<id>` plus `<compareKey>:<variant>`. (Wraps GET /api/v2/experiments.)

NameTypeReqDescription
allBrandsboolean–true: every brand of the organizations you own or administer, plus your personal brands. Refused (403) for a plain member and for a brand-bound key.
brandIdstring–A brand id, or "all" (default: every profile you can see). A brand-bound key is always its own brand.

No output schema declared.

No examples provided.

list_frames ~92

[read-only] The brand's frames (borders, overlays, lower thirds, corner tags, quote-card frames, ribbons) plus the built-in flayr frames in the brand colors. Each has a `ref` to pass to apply_frame. (Wraps GET /api/v2/frames.)

NameTypeReqDescription
aspectstring––
includeArchivedboolean––
kindstring––

No output schema declared.

No examples provided.

list_growth_triggers ~105

[read-only] The brand's keyword triggers: a comment matching a keyword gets a public reply and/or a DM. Shows whether each is active and its counts. (Wraps GET /api/v2/growth-triggers.)

NameTypeReqDescription
brandIdstring–A brand id (GET /api/v2/brands) or "personal"; default: the key owner's active brand. A brand-bound key is always pinned to its brand; any other value is 403.

No output schema declared.

No examples provided.

list_pinterest_boards ~125

[read-only] Boards of the Pinterest account(s) a brand publishes to. Use a board id as `pinterest.boardId` on publish. A board is required; the one you pick is remembered as the brand's default for next time, and a publish that uses the default says so (defaultBoardApplied). (Wraps GET /api/v2/pinterest/boards.)

NameTypeReqDescription
brandIdstring–An id from GET /api/v2/brands, or "personal". Omitted → the key's bound brand, else the owner's personal accounts.

No output schema declared.

No examples provided.

list_post_comments ~63

[read-only] A post's comments-after-publish and reshares, with status (waiting, needs_approval, sent, failed) and the resolved text. (Wraps GET /api/v2/posts/{id}/comments.)

NameTypeReqDescription
idstringyes–

No output schema declared.

No examples provided.

list_publish_actions ~116

[read-only] Pending, sent and failed comments-after-publish and reshares of the brand (filter by `status`, e.g. needs_approval or failed), with what each waits on. (Wraps GET /api/v2/automations/actions.)

NameTypeReqDescription
brandIdstring–Account-wide keys: "personal" or an id from GET /api/v2/brands (omitted → the brand last active in the dashboard). A brand-bound key always uses its own brand.
statusstring––

No output schema declared.

No examples provided.

list_queues ~108

[read-only] Posting (drip) queues of one brand. A queue posts one item every cadenceHours at timeOfDay in its timezone, keeping `lookahead` items booked at the platform. (Wraps GET /api/v2/queues.)

NameTypeReqDescription
brandIdstring–Account-wide keys: "personal" or an id from GET /api/v2/brands (omitted → the brand last active in the dashboard). A brand-bound key always uses its own brand.

No output schema declared.

No examples provided.

list_reviews ~75

[read-only] Scheduled posts waiting for (or given) a human sign-off, oldest slot first. `canApprove` tells whether THIS connection may approve each one. (Wraps GET /api/v2/reviews.)

NameTypeReqDescription
brandIdstring––
statusstring––
windowstring––

No output schema declared.

No examples provided.

list_share_rules ~115

[read-only] The brand's share rules: "when <account> publishes, reshare to <accounts> (or comment on it) after N minutes with text T", each with its approval mode. (Wraps GET /api/v2/automations/reshare-rules.)

NameTypeReqDescription
brandIdstring–Account-wide keys: "personal" or an id from GET /api/v2/brands (omitted → the brand last active in the dashboard). A brand-bound key always uses its own brand.

No output schema declared.

No examples provided.

list_text_templates ~120

[read-only] Reusable text shapes per brand: sections, length targets, hook patterns, CTA slots and guardrails. Use one to shape a draft's text before create_content. (Wraps GET /api/v2/text-templates.)

NameTypeReqDescription
brandIdstring–A brand id (GET /api/v2/brands), "personal", or "all" (default: everything the key owner can see). A brand-bound key is always pinned to its brand; any other value is 403.
includeArchivedboolean––

No output schema declared.

No examples provided.

list_youtube_playlists ~96

[read-only] Playlists of the YouTube channel(s) a brand publishes to. Use a playlist id as `youtube.playlistId` on create_content or publish. (Wraps GET /api/v2/youtube/playlists.)

NameTypeReqDescription
brandIdstring–An id from GET /api/v2/brands, or "personal". Omitted → the key's bound brand, else the owner's personal accounts.

No output schema declared.

No examples provided.

offers_capture ~157

[writes flayr data · `write` scope] Turns what the brand sells (pasted text, or answers to the offer interview) into draft offers in its offer bank, with prices from the plan catalog, Shopify or the text. Charges Embers once per call (refunded when nothing usable comes back). Needs the Pro plan or higher. (Wraps POST /api/v2/hook-studio/offers.)

NameTypeReqDescription
answersarray––
brandIdstring–A brand id from GET /api/v2/brands. Required for an account-wide key; a brand-bound key may omit it.
sourcestring––
textstring–What the brand sells, in any words.

No output schema declared.

No examples provided.

offers_list ~93

[read-only] The brand's offer bank (filter by status: draft, confirmed, retired). Free. Needs the Pro plan or higher. (Wraps GET /api/v2/hook-studio/offers.)

NameTypeReqDescription
brandIdstring–A brand id from GET /api/v2/brands. Required for an account-wide key; a brand-bound key may omit it.
statusstring––

No output schema declared.

No examples provided.

offers_update ~201

[writes flayr data · `write` scope] Edits an offer's fields or status; "confirmed" makes it usable for hooks and CTAs. Confirm changes with the person first. Free. Needs the Pro plan or higher. (Wraps PATCH /api/v2/hook-studio/offers.)

NameTypeReqDescription
audiencestring––
brandIdstring–A brand id from GET /api/v2/brands. Required for an account-wide key; a brand-bound key may omit it.
currencystring––
idstringyes–
namestring––
outcomesarray––
painsarray––
priceAmountnumber––
priceRefstring––
priceSourcestring––
proofarray––
proofUrlstring––
statusstring––
summarystring––

No output schema declared.

No examples provided.

propose_repeat_winner ~111

[writes flayr data · `write` scope] Proposes slots to post the winning version again (default 3 over 2 weeks). Only a proposal: nothing is booked or posted until the user confirms it in flayr, and then each post still goes through approval. (Wraps POST /api/v2/experiments/{id}/repeat-winner.)

NameTypeReqDescription
idstringyes–
platformsarray––
startAt––First slot; default now.

No output schema declared.

No examples provided.

publish ~2,313

[PUBLISHES to social accounts · `publish` scope] PUBLISHES TO REAL SOCIAL ACCOUNTS. Posts now, or at `scheduledAt` (ISO-8601, future). Prefer `contentId` (a draft from create_content: its text and media become the post) over inline `content`. The post goes out through the target brand's own connected accounts. Always pass an `idempotencyKey` so a retry never double-posts. The same safety gates as the dashboard apply: platform readiness/media rules are checked up front (422); if the brand requires scheduled-post review nothing is sent and you get { status: "pending-review", reviewId }; a missing required creator credit in a push-down brand is refused (422 attribution_missing) or held; the "Posted with flayr.social" caption watermark and video watermark follow the plan (409 watermark_pending means the watermarked video is still rendering — retry after retryAfterSeconds). `facebook: { contentType: "reel" }` posts a Facebook Reel (exactly one video), `"story"` a Story, `"feed"` a regular post; `instagram.contentType` works the same; omitted → the draft's saved post type. `instagram.trialReel: { enabled: true, graduation: "manual" | "auto" }` posts a Reel to non-followers first (Instagram Trial Reel; omitted graduation → admin default; ignored with a warning when not a Reel). `pinterest: { boardId, title, link }` picks the board (ids from list_pinterest_boards; required: omitted → the brand's last-picked board for that account, flagged as defaultBoardApplied, else 422 pinterest_board_required), pin title and destination link. `requiresApproval: true` files it for human approval instead of posting. A draft that is already scheduled on one of the platforms is refused (409 already_booked): change the booked post instead, or pass `allowDuplicateBooking: true` only when the user asked to post it again. Needs the `publish` scope (or admin) and the Pro plan or higher; each publish counts against the plan's direct posts for the month. Confirm with the user before posting now. T…

NameTypeReqDescription
aiGeneratedboolean–Label the post as AI-generated / synthetic media: YouTube containsSyntheticMedia, Instagram isAiGenerated, TikTok videoMadeWithAi, X madeWithAi, and the disclosure line (default "#AIgenerated") on pl…
allowDuplicateBookingboolean–A contentId that is already scheduled (a live booking still ahead) on one of these platforms is refused with 409 { code: "already_booked", bookedAt, bookedPlatforms }. Pass true only to book the same…
autoFirstCommentboolean–When the target brand has "Auto first comment" on (dashboard: Brand → First comment), LinkedIn, Instagram, Facebook, Threads and YouTube targets that have no first comment of their own get the brand'…
brandIdstring–An id from GET /api/v2/brands, or "personal". With contentId it must match the item's brand.
contentstring–Post text. Required unless contentId is given.
contentIdstring–An existing content item id (GET /api/v2/content/{id} access rules). Cannot be combined with imageUrl / videoUrl.
facebookobject–Facebook post type. "reel" posts a Reel (exactly one video, no images; anything else is a 422 with code content_type_invalid), "story" a Page Story, "feed" a regular post. Omitted → the content item'…
firstCommentobject–Explicit first comments per platform, posted right after the post goes out. Always wins over the brand's auto first comment. Threads: posted as a reply (it counts toward Threads' 250 posts/24h). Face…
followUpCommentsarray–Comments after publish, sent once each (Idempotency-Key) after the post is live on that platform and its tokens resolve: {{postUrl}}, {{postUrl:<platform>}}, {{parentPostUrl:<post or draft id>}}, {{y…
idempotencyKeystring–Unique per API key. A retry with the same key never posts twice.
imageUrlstring––
instagramobject–Instagram post type, same rules: "reel" (exactly one video — a single video is posted as a Reel), "story", or "feed". Omitted → the content item's stored platformSpecificData.instagram.contentType. `…
labelsarray–Labels for this post on top of the draft's own (the draft wins for type/cut/variant). Normalized "key:value" labels (keys and values are lower-cased, spaces become "-"). Linked keys: campaign:<media…
mediaCampaignIdstring–Link to a media campaign; with a brand target it must belong to that brand.
memoobject–"When it posts" memo: the people-steps after the post goes live (reply to a comment, share to a personal account, pin a link, add a first comment flayr can't). Saved on the draft (else the post). Whe…
onPublishTasksarray–Shorthand for memo.tasks (appended after them). Response: `memoId`; a memo that could not be saved is a `warnings` entry, never a failed publish.
pinterestobject–FFE-428: Pinterest pin options for every Pinterest target. Overrides the content item's stored platformSpecificData.pinterest field by field. A board is required. boardId omitted → the brand's last-p…
platformsarrayyes–
pollobject–A native poll. Only on twitter (X), linkedin and discord, and with no media: any other platform or media is a 422 (code poll_invalid), never a plain post. X: 2-4 choices of at most 25 characters, 5 m…
referralFooterboolean–Caption watermark: appends "Posted with flayr.social — try it: flayr.social/r/<code>/<ch>" to each platform's text (<code> is your referral code — your custom one if you claimed it; <ch> names the pl…
requiresApprovalboolean––
reshareobject–Share/repost another post: a flayr post id (`postId`) or a pasted link (`url`). Per platform: linkedin a native reshare with your text on top (not with media or a poll); twitter a quote of your own X…
scheduledAtstring–Must be in the future. Omitted → publish now.
strictMediaboolean–Refuse (422 media_fit) when the video does not fit a booked platform (length, shape, smallest frame, loudness) instead of posting with `warnings`.
videoUrlstring––
youtubeobject–Overrides the content item's stored YouTube options field by field. YouTube upload options, applied to YouTube targets only. madeForKids is always sent to YouTube (default false). A missing title is…

No output schema declared.

No examples provided.

query_insights ~706

[read-only] Read-only analytics query: one `metric` aggregated (median by default) over posts, broken down by up to a few dimensions (platform, weekday, hour, brand, campaign, postType, label:<key>, arm), at a fixed post age `window` (48h / 7d / 30d / lifetime) so posts are compared fairly. Every row carries its sample size n; platforms that do not report the metric are listed in `availability`, never counted as 0. Pro plan or higher. (Wraps POST /api/v2/insights/query.)

NameTypeReqDescription
aggregationstring–Default median; pooled for the rates engagementRate, ctr and completionRate. A rate is pooled (Σ numerator ÷ Σ denominator), mean, median or count, never sum or p90. Pooled applies to rates only.
brandIdstring–A brand id, or "all" (default: every profile you can see). A brand-bound key is always its own brand.
breakdownarray–Up to 2 of: platform, brand, campaign, experiment, arm, weekday, hour, postType, or label:<key> (e.g. label:cut, label:line, label:source, label:hook, label:series). The multi-valued format key also…
dateFromstring–ISO date or epoch ms (publish time). Default: 90 days ago; ranges are capped at 400 days.
dateTostring–ISO date or epoch ms. Default: now.
filtersobject––
formatstring–csv = the result as a spreadsheet-safe CSV attachment (UTF-8 BOM, CRLF, cells starting with = + - @ are prefixed with '). Without `format`, `Accept: text/csv` also selects CSV. Errors are always JSON.
formulaobject–Optional (needs the Advanced insights feature): combine up to three series. Each series is a metric + aggregation over the same breakdown, window, interval, filters and range. `expression` (≤ 80 char…
intervalstring–Adds a time series bucketed by publish date.
metricstring––
tzOffsetMinutesinteger–Offset from UTC for weekday / hour / day buckets (e.g. -300).
windowstring–Snapshot age: the metric as it stood 48h / 7d / 30d after publish, or the latest refresh.

No output schema declared.

No examples provided.

queue_item_action ~229

[PUBLISHES to social accounts · `publish` scope] `action`: "skip" passes over a queued item; "retry" puts a failed/skipped item back in line; "unschedule" deletes a booked platform post and puts the item back in line. Also `youtubeTitle`, per-item `platforms`, and `position` (0-based among waiting items). Needs the `publish` scope (or admin) on the Agency plan or higher. (Wraps PATCH /api/v2/queues/{id}/items/{itemId}.)

NameTypeReqDescription
actionstring––
brandIdstring––
idstringyes–
itemIdstringyes–
platformsarray|null–This item's own platforms, used when it is booked; null → back to the queue's. Only before the item is booked (queued / failed / skipped).
positioninteger–0-based index among the waiting (queued) items.
youtubeTitlestring|null–null or "" → back to the draft's stored title.

No output schema declared.

No examples provided.

remove_queue_item ~203

[DESTRUCTIVE] DESTRUCTIVE: removes an item (the draft stays in the library). A booked (`scheduled`) item is refused (409) unless `unschedule: true`, which deletes its platform post first. Needs the `publish` scope (or admin) on the Agency plan or higher. (Wraps DELETE /api/v2/queues/{id}/items/{itemId}.)

NameTypeReqDescription
brandIdstring–Account-wide keys: "personal" or an id from GET /api/v2/brands (omitted → the brand last active in the dashboard). A brand-bound key always uses its own brand.
idstringyes–
itemIdstringyes–
unscheduleboolean–true: delete the booked post at the platform first (the dashboard's "Unschedule"), then delete. Without it a booked post is a 409 — nothing is ever left booked at the platform without its queue item.

No output schema declared.

No examples provided.

render_motion_ad ~278

[writes flayr data · `write` scope] Turns one Library image (the card) into a 6-15 s motion ad: hook (push-in on the card), up to 3 body beats (pans with the text), then a CTA end card in the brand color with the CTA and the link host. 9:16 unless `aspect` is 1:1 or 16:9. The text is used exactly as given; it is not rewritten. Saves a new draft in the card's brand (labels format:motion-ad, source:template); nothing is posted and the card is unchanged. Free. Returns a jobId: poll get_job_status. (Wraps POST /api/v2/video-studio/templates/motion-ad-from-card/render.)

NameTypeReqDescription
aspectstring––
bodyarray–Up to 3 beats are used; blanks are dropped.
brandColorstring–#RRGGBB; defaults to the brand profile color.
contentIdstringyesThe card: a Library image.
ctastringyes–
ctaUrlstringyeshttp(s) link; its host is shown on the end card.
hookstringyes–
textColorstring–#RRGGBB.

No output schema declared.

No examples provided.

reorder_queue_items ~108

[PUBLISHES to social accounts · `publish` scope] Send every waiting (queued) item id exactly once, in the new order. Booked, posted, failed and skipped items keep their places. Needs the `publish` scope (or admin) on the Agency plan or higher. (Wraps POST /api/v2/queues/{id}/items/reorder.)

NameTypeReqDescription
brandIdstring––
idstringyes–
itemIdsarrayyes–

No output schema declared.

No examples provided.

start_experiment_round ~108

[writes flayr data · `write` scope] Files the round's versions into the approval queue on the given platforms, in spaced slots with UTM links. Nothing posts until a person approves each one. Round 2 re-tests the arms kept from round 1. (Wraps POST /api/v2/experiments/{id}/rounds.)

NameTypeReqDescription
idstringyes–
platformsarrayyes–
startAt––First slot; default now.

No output schema declared.

No examples provided.

update_content ~1,296

[writes flayr data · `write` scope] Edits a draft in place; only the fields you pass change. Any media field replaces the draft's media as a set (keeps the id, so queue items still point at it). Refused (409) for archived or already-published items, and a media swap is refused once a queue booked it. `labels`, `opus`, `videoWatermarked`, `library` and `aiGenerated` may be changed on published items too. `aiGenerated` is the post's AI label: false for real footage, null back to automatic. A video draft's custom thumbnail/cover: `thumbnailStorageId` (an image from upload_media) or `thumbnailUrl`, or `thumbnailFrameOffsetMs` for a frame of the video; `thumbnailUrl: null` clears it. It is sent to YouTube (long-form), Facebook, LinkedIn, Instagram Reels, TikTok and Pinterest at publish. (Wraps PATCH /api/v2/content/{id}.)

NameTypeReqDescription
aiGeneratedboolean|null–The post's "AI-generated" label toggle: false = real footage (no AI label), true = always label, null = automatic (on when flayr made the media). Metadata: allowed on published items. Removing the `s…
creditsarray|null–Creator credits for work this post uses. Added to the published caption above the flayr footer, one line each: model → "Print your own: <url> (model by <author>)"; other kinds → "Credit: <title> by <…
idstringyes–
imageStorageIdstring–Uploaded image storageId: the video's thumbnail, or on its own the post's single image. Not with imageUrl.
imageUrlstring–http(s) image URL: the video's thumbnail, or on its own the post's single image. Not with imageStorageId.
imagesarray–Carousel image URLs. Cannot be combined with the other media fields.
labelsarray|null–Replaces the labels ([] or null clears). Allowed on published items too. Normalized "key:value" labels (keys and values are lower-cased, spaces become "-"). Linked keys: campaign:<media campaign id>,…
libraryobject–The Library item's own title and description, searchable from the Library. null or "" clears one. Metadata: allowed on published items. Not the same as `title` (the YouTube video title).
opusobject|null–Link this row to an Opus Clip clip (owner only; allowed on published rows) so an Opus project import skips it instead of creating a duplicate. null unlinks.
platformTextobject|null–Per-platform captions: platform id → the caption that platform gets instead of `text`, e.g. { "twitter": "short version" }. Each must fit its platform: X 280 (a link counts 23, an emoji 2), Bluesky 3…
platformsarray––
textstring––
thumbnailFrameOffsetMsinteger–Use this frame of the video (ms from the start) as the cover. Instagram and TikTok get the offset; YouTube/Facebook/LinkedIn need an image, so pass the captured frame as thumbnailStorageId / thumbnai…
thumbnailStorageIdstring|null–Custom video thumbnail: an image storageId from POST /api/v2/media/upload-url. Not with thumbnailUrl. null clears.
thumbnailUrlstring|null–Custom video thumbnail: an http(s) image URL. Not with thumbnailStorageId. null clears.
titlestring–Shorthand for youtube.title (the video title). No < or >.
videoStorageIdstring–storageId from uploading to POST /api/v2/media/upload-url's uploadUrl. Not with videoUrl. Another account's upload is refused (422).
videoUrlstring–http(s) URL of the new video. Not with videoStorageId.
videoWatermarkedobject|null–The item's own video already has the "Posted by flayr.social" watermark: publish it as-is. null clears.
youtubeobject–Merged into the stored YouTube options. YouTube upload options, applied to YouTube targets only. madeForKids is always sent to YouTube (default false). A missing title is derived from the first sente…

No output schema declared.

No examples provided.

update_experiment ~141

[writes flayr data · `write` scope] Changes an experiment's fields (e.g. status "running" / "done", endAt, notes). Only the fields you pass change. (Wraps PATCH /api/v2/experiments/{id}.)

NameTypeReqDescription
compareKeystring––
endAtstring|null––
hypothesisstring––
idstringyes–
namestring––
notesstring––
primaryMetricstring––
startAtstring|null––
statusstring––
variantsarray––

No output schema declared.

No examples provided.

update_frame_settings ~91

[writes flayr data · `write` scope] Frame every image posted to a platform automatically (frameRef), or stop (frameRef null). Applies to posts published or scheduled from now on. Confirm with the user first. (Wraps POST /api/v2/frames/settings.)

NameTypeReqDescription
aspectstring––
frameRefstring|nullyes–
platformstringyes–

No output schema declared.

No examples provided.

update_growth_trigger ~434

[PUBLISHES to social accounts · `publish` scope] Changes a trigger; only the fields you pass change. `active: true` makes it reply to and DM real people from then on and needs the publish scope: confirm with the user first. `active: false` pauses it. (Wraps PATCH /api/v2/growth-triggers/{id}.)

NameTypeReqDescription
accountIdstring–A connected account id (GET /api/v2/accounts); omitted = every account of the brand.
activeboolean––
brandIdstring–A brand id (GET /api/v2/brands) or "personal"; default: the key owner's active brand. A brand-bound key is always pinned to its brand; any other value is 403.
campaignKeystring–utm_campaign for {{link}}, and the campaign column of the logs.
delaySecondsnumber–Wait before replying; capped at 20 at send time.
dmTextstring–Private reply (Instagram and Facebook only; refused on an account of another platform).
dmVariationsarray––
idstringyes–
keywordsarray–Case-insensitive. exact = the whole comment; startsWith = its start; contains = anywhere (substring, so "hi" also matches "this").
linkstring–http(s) URL behind {{link}}.
maxSendsinteger–After this many sends, reply only overCapText.
namestring––
overCapTextstring––
postIdsarray–Only comments on these posts; omitted = all posts.
prioritynumber–Higher is checked first; the first matching trigger wins.
repeatPolicystring––
replyTextstring–Public reply. {{name}} = the commenter, {{link}} = `link` with UTM tags. Must not contain a keyword (it would trigger itself).
replyVariationsarray–Alternatives picked at random with replyText.

No output schema declared.

No examples provided.

Install

How do I install the flayr MCP server?

flayr is a hosted endpoint at https://flayr.social/api/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · flayr.social

# add to Claude Code
claude mcp add --transport http social-flayr-flayr 'https://flayr.social/api/mcp'
Common questions

What is the flayr MCP server?

flayr is an MCP server listed in the public MCP registry as social.flayr/flayr. Create, schedule and publish social posts to 13 platforms for your brands. This page covers its hosted endpoint (https://flayr.social/api/mcp).

Is the flayr MCP server safe to use?

flayr scores 78 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the flayr MCP server expose?

flayr exposes 105 tools: whoami, list_brands, brand_profile_get, brand_profile_update, list_connected_accounts, and 100 more. Their descriptions and schemas cost roughly 21,955 tokens of context every time the server is loaded.

Does the flayr MCP server require authentication?

Yes. flayr asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

Is the flayr MCP server still maintained?

flayr is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.