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

78 Trust /100

Last scanned (22 hours ago)

Scores higher than 76% of remote servers

Reachable. Last reached 4 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 21607 tokens (~211/item across 102 items; 102 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 Management20
  • Stability observed for 6 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
  • 54% 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 103 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.

  • 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 4 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 · 102 exposed · ~21,119 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
account_refresh ~141

[writes flayr data · `write` scope] Re-reads a connected account's handle, display name and avatar from the network (use after the user renames the account) and returns the stored values. Changes nothing else: no connect, disconnect or post. If the status is not `updated`, tell the user to reconnect the account at the returned `reconnectUrl`. (Wraps POST /api/v2/accounts/{id}/refresh.)

NameTypeReqDescription
brandIdstring–The brand the account is connected to, as for GET /api/v2/accounts.
idstringyesAn account id from GET /api/v2/accounts.

No output schema declared.

No examples provided.

act_on_publish_action ~112

[PUBLISHES to social accounts · `publish` scope] approve lets a rule's reshare / comment go out at its time; retry re-sends a failed one (same idempotency key); reject / cancel stop it. Confirm with the user before approving. Needs the `publish` scope (or admin) on the Agency plan or higher. (Wraps POST /api/v2/automations/actions/{id}.)

NameTypeReqDescription
idstringyes–
opstringyes–

No output schema declared.

No examples provided.

add_post_comments ~121

[PUBLISHES to social accounts · `publish` scope] Schedules comments on a post, sent once after it is live on that platform and its tokens resolve ({{postUrl}}, {{parentPostUrl:<post id>}}, {{youtubeUrl:<post id>}}), optionally at sendAt. Confirm with the user first. Needs the `publish` scope (or admin) on the Agency plan or higher. (Wraps POST /api/v2/posts/{id}/comments.)

NameTypeReqDescription
commentsarrayyes–
idstringyes–

No output schema declared.

No examples provided.

add_queue_items ~157

[PUBLISHES to social accounts · `publish` scope] Appends drafts (content ids) to the end of a queue — they will be BOOKED AND POSTED on the queue's schedule. Use `contentIds`, or `items` for a per-item YouTube title or platforms. Drafts of another brand, duplicates, archived drafts and drafts without a video for a video platform come back in `rejected`. Needs the `publish` scope (or admin) on the Agency plan or higher. (Wraps POST /api/v2/queues/{id}/items.)

NameTypeReqDescription
brandIdstring––
contentIdsarray––
idstringyes–
itemsarray––

No output schema declared.

No examples provided.

ads_accounts_list ~94

[read-only] The brand's ad account with its currency, spend limit, balance (minor units) and readiness. (Wraps GET /api/v2/ads/accounts.)

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.

ads_boost_candidates ~187

[read-only] The brand's published posts ranked for a boost (reach, engagement rate, link clicks, recency), with score parts, the call-to-action link found, and whether an ad account is connected for the network. Removed posts, posts with no call to action and networks a boost can't run on are left out. Read-only: nothing is boosted or charged. (Wraps GET /api/v2/ads/boost-candidates.)

NameTypeReqDescription
brandIdstring–A brand id from GET /api/v2/brands. Omitted: the key's brand (a brand-bound key) or the owner's active brand.
daysinteger–How many days back to read (clamped).
includestring–Also list posts on networks a boost can't run on.
limitinteger–How many candidates to return (clamped).

No output schema declared.

No examples provided.

ads_campaign_get ~103

[read-only] One ad campaign by its Flayr id, with its ad sets and ads. (Wraps GET /api/v2/ads/campaigns/{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.

ads_campaign_pause ~192

[writes flayr data · `write` scope] Pauses a live ad campaign on its ad network so it stops spending (`action: "pause"` or `"stop"`; both leave it paused). It cannot resume or activate a campaign; that is done in the Flayr app. Confirm with the user first. (Wraps POST /api/v2/ads/campaigns/{id}/pause.)

NameTypeReqDescription
actionstring–stop = a pause you mean as final; the network shows paused either way.
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–
idempotencyKeystring–Retrying with the same key never runs the change twice.

No output schema declared.

No examples provided.

ads_campaigns_list ~135

[read-only] The brand's ad campaigns with status, budget, start/end dates, max spend, spend to date, ad sets and ads. Filter by status or platform. (Wraps GET /api/v2/ads/campaigns.)

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.
platformstring–e.g. facebook, instagram
statusstring–e.g. active, paused

No output schema declared.

No examples provided.

ads_insights ~147

[read-only] Impressions, clicks, spend, link clicks and leads per campaign for a date range (default the last 30 days, at most 93), with totals per currency. (Wraps GET /api/v2/ads/insights.)

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.
fromstring–YYYY-MM-DD; default 30 days ago
levelstring––
tostring–YYYY-MM-DD; default today

No output schema declared.

No examples provided.

ads_offer_update ~162

[writes flayr data · `write` scope] Records the claim of one offer row (`claimId` = a row id from ads_offers_list): status, the date it was claimed, and notes. Owners and admins of the brand only. A record only: it never creates, turns on or funds an ad. (Wraps PATCH /api/v2/ads/offers/{claimId}.)

NameTypeReqDescription
brandIdstring–A brand id (GET /api/v2/brands). Required for an account-wide key.
claimIdstringyes–
claimedAtstring|null–YYYY-MM-DD (or ISO timestamp); null clears it.
notesstring|null––
statusstring––

No output schema declared.

No examples provided.

ads_offers_list ~122

[read-only] The brand's new-advertiser offers per ad network, one row per ad account (or a network not connected yet): status, spend so far, what is left to spend, the daily pace and the deadline, and how to claim. Read-only. (Wraps GET /api/v2/ads/offers.)

NameTypeReqDescription
brandIdstring–A brand id (GET /api/v2/brands). Required for an account-wide key; a brand-bound key is pinned to its brand and any other value is 403.

No output schema declared.

No examples provided.

ads_readiness ~92

[read-only] Whether each connected network and ad account can run ads, and what to fix first. (Wraps GET /api/v2/ads/readiness.)

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.

apply_frame ~272

[writes flayr data · `write` scope] Draws a frame over an image and returns a new image URL (the original is untouched). Use the URL in create_content, or pass contentId + platform so that post publishes the framed image on that platform. Free by default; the same inputs again are free. (Wraps POST /api/v2/frames/apply.)

NameTypeReqDescription
aspectstring–Default: nearest to the source image.
contentIdstring–A content id: its publish swaps this framed image in for `platform`.
fitstring––
frameRefstringyes`default:<key>` or `brand:<id>` from GET /api/v2/frames.
offsetXnumber––
offsetYnumber––
paletteOverrideobject–Colors that win over the brand kit.
platformstring–Platform this framed image is for ("all" by default).
slideIndexinteger–Image position in the post.
sourceUrlstringyeshttps image URL (flayr/Convex storage or a stock host).
textsobject–Texts some frames print (ribbon/tag label, lower-third title/subtitle).
zoomnumber––

No output schema declared.

No examples provided.

bodies_map ~160

[writes flayr data · `write` scope] Maps library clips, Shopify products, features or texts to draft bodies (what each shows and proves) so hooks can lead into them. Charges Embers once per call (refunded when nothing usable comes back). Needs the Pro plan or higher. (Wraps POST /api/v2/hook-studio/bodies/map.)

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

No output schema declared.

No examples provided.

brand_business_details_get ~124

[read-only] A brand's legal name, registered address, website, currency and timezone: what ad networks ask for when you open an ads account. `hasTaxId` says whether a tax id is on file; the tax id itself is never returned. Use an `id` from list_brands. (Wraps GET /api/v2/brands/{id}/business-details.)

NameTypeReqDescription
idstringyesA brand id from GET /api/v2/brands. A brand-bound key may only name its own brand (another brand → 403).

No output schema declared.

No examples provided.

brand_business_details_update ~193

[writes flayr data · `write` scope] Sets a brand's legal name, registered address, currency (ISO, like USD) and/or timezone (IANA, like America/New_York). Only the fields sent change; a brand with no details yet needs all four. Do not send a tax id: it is refused. A brand owner or admin adds it in flayr (Brand › Overview). (Wraps PATCH /api/v2/brands/{id}/business-details.)

NameTypeReqDescription
currencystring–3-letter ISO currency code.
idstringyesA brand id from GET /api/v2/brands. A brand-bound key may only name its own brand (another brand → 403).
legalNamestring––
registeredAddressobject–Replaced as a whole when sent.
timezonestring–IANA time zone.

No output schema declared.

No examples provided.

brand_profile_get ~123

[read-only] A brand's profile (website, companyName, tagline, industry, audience, values, pillars, hashtag sets), its default voice, colors and fonts. `brandId` comes from list_brands; a brand-bound connection may omit it. (Wraps GET /api/v2/brand/intelligence.)

NameTypeReqDescription
brandIdstring–A brand id from GET /api/v2/brands. A brand-bound key is pinned to its own brand (may be omitted; another brand → 403); an account-wide key must name one.

No output schema declared.

No examples provided.

brand_profile_update ~288

[writes flayr data · `write` scope] Fills in a brand's profile — e.g. `{ brandId, profile: { website: "https://…" } }`. Changes only the fields you send; the voice, colors and fonts stay as they are unless you pass them. Use it to clear list_brands setup items such as hasWebsite. Owners, admins and editors only; every change is audited against this connection. (Wraps PATCH /api/v2/brand/intelligence.)

NameTypeReqDescription
brandIdstring–A brand id from GET /api/v2/brands. A brand-bound key is pinned to its own brand (may be omitted; another brand → 403); an account-wide key must name one.
colorsobject–REPLACES the brand palette, the same as saving Brand → Overview → Brand Colors: the stored list is primary, secondary, then palette (duplicates dropped); primary and secondary are its top two. 6-digi…
fontsobject–Font family names. A role left out keeps its stored font. At least one is required.
profileobject–Only the fields sent are changed. Unknown fields are a 422.
voiceobject–The brand default voice. Created (as the default) when the brand has none.

No output schema declared.

No examples provided.

cancel_scheduled_post ~166

[PUBLISHES to social accounts · `publish` scope] Takes a SCHEDULED post off the platform schedule and marks it cancelled (the draft stays, so it can be published again). Safe to repeat. Refused within 5 minutes of the slot, and when the platform will not remove it (some YouTube uploads). 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 first. (Wraps DELETE /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.

claims_check ~132

[read-only] Checks a hook, CTA, caption or ad against the brand's claims sources (verified prices, banned phrases, competitors, destinations). No model call, nothing stored, free. Needs the Pro plan or higher. (Wraps POST /api/v2/hook-studio/claims/check.)

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

No output schema declared.

No examples provided.

close_experiment_round ~104

[writes flayr data · `write` scope] Freezes the open round's numbers and keeps the best arms for the next round. A winner is recorded only when the readout says likely_winner, or when `pick` names an arm the user chose. Ask the user before passing `pick`. (Wraps POST /api/v2/experiments/{id}/close-round.)

NameTypeReqDescription
idstringyes–
pickstring––

No output schema declared.

No examples provided.

combine_clips ~345

[writes flayr data · `write` scope] Extends a video draft (`id`) with more clips and image cards into ONE finished video, rendered by flayr and saved as a NEW linked draft (same brand, caption copied, credits merged, labelled variant:combined). Nothing is posted and the original is unchanged. Use it to show a finished print with painting/assembly clips before or after it. `segments` (2-8, in order) must include the video itself as { kind: "clip", contentId: id }; clips are Library videos (contentId) or uploads (storageId from upload_media) with inMs/outMs (or durationMs = the clip's full length); cards are images (contentId of a Library image or video thumbnail, or imageStorageId) with durationMs and optional text. `transition` cut|crossfade, `audio` keep|mute_extras|main_across. Max 60 min by default (long-form: cold open + trimmed recording + bumpers). Costs 25 Embers per started minute of output for the first 3 min, then 5 per further started minute by default (refunded on failure). Returns a jobId — poll get_job_status. (Wraps POST /api/v2/content/{id}/combine.)

NameTypeReqDescription
audiostring––
crossfadeMsinteger–Crossfade overlap per join.
idstringyesThe video to extend.
segmentsarrayyesIn playback order. Must include this video ({ "kind": "clip", "contentId": "<id>" }).
transitionstring––

No output schema declared.

No examples provided.

compare_labels ~156

[read-only] Splits every labelled post by the values of one label key (e.g. key "cut" → cut:opus vs cut:raw) and reports medians with n per group at the 48h / 7d snapshot. Descriptive, not a significance test. Pro plan or higher. (Wraps GET /api/v2/analytics/experiments.)

NameTypeReqDescription
brandIdstring–A brand id, or "all" (default: every profile you can see). A brand-bound key is always its own brand.
includestring––
keystring––
metricstring–Which metric "leading" ranks by.
windowstring––

No output schema declared.

No examples provided.

create_content ~1,124

[writes flayr data · `write` scope] Creates a DRAFT content item. Nothing is posted. Give `text` plus optional media (`videoUrl` / `imageUrl`, or `videoStorageId` / `imageStorageId` from upload_media), target `platforms`, `brandId` (from list_brands; omitted → the brand last active in the dashboard), per-platform captions (`platformText`), creator `credits`, `labels` and YouTube options. Returns the new `id` — pass it as `contentId` to publish or add_queue_items. (Wraps POST /api/v2/content.)

NameTypeReqDescription
brandIdstring–An id from GET /api/v2/brands, or "personal".
contentTypestring––
copyFromContentIdstring–COPY TO BRAND (staff and the Agency plan): the id of an existing item (GET /api/v2/content) to copy into `brandId` as a new draft. Images, video, slides, documents and thumbnails are copied into new…
creditsarray–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 <…
imageStorageIdstring––
imageUrlstring––
labelsarray–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 experiment's compare…
platformTextobject–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––
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…
sourceLabelstring––
textstring––
videoStorageIdstring––
videoUrlstring––
youtubeobject–Stored on the draft and used when it is published (POST /api/v2/publish with contentId). YouTube upload options, applied to YouTube targets only. madeForKids is always sent to YouTube (default false)…

No output schema declared.

No examples provided.

create_experiment ~163

[writes flayr data · `write` scope] Creates an A/B experiment. Then tag drafts with its `label` (experiment:<id>) and `<compareKey>:<variant>` via update_content `labels`, publish them, and read get_experiment_results. (Wraps POST /api/v2/experiments.)

NameTypeReqDescription
brandIdstring–A brand id, or "personal" (default).
compareKeystring––
endAtstring|null––
hypothesisstring––
namestringyes–
notesstring––
primaryMetricstring––
startAtstring|null––
statusstring––
variantsarray––

No output schema declared.

No examples provided.

create_frame ~193

[writes flayr data · `write` scope] Copy a flayr frame into the brand library (`defaultKey`, optional colors/texts), or add uploaded PNG/SVG art (upload_media first; `variants` of storageIds, the content area is detected from transparency). (Wraps POST /api/v2/frames.)

NameTypeReqDescription
defaultKeystring–A defaults[].ref without "default:".
kindstring–Default: guessed from the name.
namestring––
paletteOverrideobject–Colors that win over the brand kit.
rightsstring–Who holds the rights to the art. Optional; a frame without it shows a reminder.
tagsarray––
textsobject–Texts some frames print (ribbon/tag label, lower-third title/subtitle).
variantsarray–One per aspect ratio.

No output schema declared.

No examples provided.

create_growth_trigger ~365

[writes flayr data · `write` scope] Creates a keyword trigger, always INACTIVE: nothing is sent until a person turns it on. DMs work on Instagram and Facebook only; the reply text must not contain a keyword. (Wraps POST /api/v2/growth-triggers.)

NameTypeReqDescription
accountIdstring–A connected account id (GET /api/v2/accounts); omitted = every account of the brand.
brandIdstring––
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––
keywordsarrayyesCase-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.
namestringyes–
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.

create_queue ~411

[PUBLISHES to social accounts · `publish` scope] Creates a posting queue. Once items are added it BOOKS REAL POSTS on the given platforms on its cadence (default daily 19:00 America/Chicago, 2 booked ahead). Use `startsAt` to hold everything until a date. Needs the `publish` scope (or admin) on the Agency plan or higher. (Wraps POST /api/v2/queues.)

NameTypeReqDescription
brandIdstring––
cadenceHoursinteger–1, 2, 3, 4, 6, 8, 12, or whole days (24, 48, …, 720).
lookaheadinteger–How many upcoming items are scheduled at the platform at once.
namestringyes–
platformsarrayyes–
startsAtstring–ISO 8601 with an offset (or Z). Nothing is booked before it; the first slot is the first timeOfDay (in the queue's timezone) at or after it, so a startsAt that is itself a slot is the first slot. A p…
timeOfDaystring–24-hour "HH:MM" local time.
timezonestring–IANA timezone. Slots keep their local time across DST.
youtubeobject–Queue-wide YouTube defaults (a draft's own options win; titles are per item). YouTube upload options, applied to YouTube targets only. madeForKids is always sent to YouTube (default false). A missing…

No output schema declared.

No examples provided.

create_share_rule ~356

[PUBLISHES to social accounts · `publish` scope] Creates a rule that reshares (or comments on) every new post of the source accounts. Defaults to needs_approval: each fire waits for approve in act_on_publish_action. Only LinkedIn (native reshare) and X (quote own / retweet) really repost; other platforms get a link share. Confirm with the user first. Needs the `publish` scope (or admin) on the Agency plan or higher. (Wraps POST /api/v2/automations/reshare-rules.)

NameTypeReqDescription
approvalstring–`needs_approval` (default): each fire waits for a person (POST …/actions/{id} `approve`). `auto`: runs on its own.
brandIdstring––
delayMinutesinteger––
enabledboolean––
kindstring–`reshare`: share the post to `targets`. `comment`: comment on the post itself through the source account.
namestringyes–
sourceAccountIdsarrayyesFires when a post goes live through any of these connected accounts.
sourceLabelstring|null–Only posts carrying this label.
targetsarray––
templatestring–The reshare commentary or comment text. Tokens, resolved only once the URL exists: `{{postUrl}}` (this post, on the comment's platform), `{{postUrl:<platform>}}`, `{{parentPostUrl:<post or draft id>}…

No output schema declared.

No examples provided.

create_text_template ~239

[writes flayr data · `write` scope] Creates a reusable format (text template) in a brand. (Wraps POST /api/v2/text-templates.)

NameTypeReqDescription
brandIdstring––
ctaSlotsarray––
defaultLabelsarray–"key:value" labels every draft started from this format gets (plus the format's own `label`).
examplestring|null––
formatstringyes–
guardrailsarray––
hookPatternsarray–"[slot]" placeholders are kept as written.
lengthobjectyes–
maxHashtagsinteger|null––
namestringyes–
platformstring|null–e.g. "linkedin"; null = any platform.
sectionsarray–In order. "Start from a format" writes one `[you fill: Label — guidance]` placeholder per section.
sourcestring|null–Where the shape came from, e.g. an import path.
useForstring|null–One line: when to pick this format.

No output schema declared.

No examples provided.

cta_check ~237

[read-only] Checks whether a draft, post or link points at the brand's goal page (the same check the ad and boost routes run in paid mode; a block there refuses the ad). Run it before every boost or ad and paste the result. Nothing stored, free. Needs the Pro plan or higher. (Wraps POST /api/v2/cta-check.)

NameTypeReqDescription
adButtonstring–The ad button, e.g. LEARN_MORE.
brandIdstring–A brand id from GET /api/v2/brands. Required for an account-wide key; a brand-bound key may omit it.
captionstring–The caption, when it differs from the draft.
contentIdstring–A draft id.
linkUrlstring–The link the ad or post would use.
modestring–Default: paid.
objectivestring–The ad objective, e.g. traffic, link_clicks, engagement. Click objectives can block; others warn.
platformsarray––
postIdstring–A post id.

No output schema declared.

No examples provided.

cta_settings_get ~117

[read-only] The brand's goals (source tagged, implicit from the website, or none; the primary goal) and its CTA check settings (ctaLevel, ctaPaidLevel, organicSupportingHosts, autoApplyPrimaryCta). Free. Needs the Pro plan or higher. (Wraps GET /api/v2/hook-studio/cta-settings.)

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

No output schema declared.

No examples provided.

cta_settings_update ~237

[writes flayr data · `write` scope] Changes only the CTA check settings sent: ctaLevel (off, warn, block), ctaPaidLevel (warn or block), organicSupportingHosts and autoApplyPrimaryCta. Only the brand's owners and admins can change them. Confirm changes with the person first. Free. Needs the Pro plan or higher. (Wraps PATCH /api/v2/hook-studio/cta-settings.)

NameTypeReqDescription
autoApplyPrimaryCtaboolean–Studio adds the primary CTA to a post with none. Default: true.
brandIdstring–A brand id from GET /api/v2/brands. Required for an account-wide key; a brand-bound key may omit it.
ctaLevelstring–The CTA check on organic posts. Default: warn.
ctaPaidLevelstring–The CTA check on paid posts, never off. Default: block.
organicSupportingHostsarray–Hosts an organic post may link to besides a goal. Default: the website, youtube.com, youtu.be, github.com.

No output schema declared.

No examples provided.

ctas_create ~269

[writes flayr data · `write` scope] Adds a call to action written by the person, claims-checked, optionally tagged as a goal (goalKey; isPrimary makes it the brand's primary goal and demotes the previous one). Nothing here creates or runs an ad. Free. Needs the Pro plan or higher. (Wraps POST /api/v2/hook-studio/ctas.)

NameTypeReqDescription
adButtonstring–The ad button. Default: the ads config default CTA.
brandIdstring–A brand id from GET /api/v2/brands. Required for an account-wide key; a brand-bound key may omit it.
cardstringyes–
destinationstringyesAn https link, or "bio" for the link in bio.
goalKeystring–The goal this CTA serves, a short slug such as `tech-checkup`.
isPrimaryboolean–The brand's primary goal. Setting it demotes the previous primary.
linestringyes–
offerIdstring––
paidEligibleboolean–Ads may use this CTA. Default: true for a primary, false otherwise.
platformsarrayyes–
statusstring––

No output schema declared.

No examples provided.

ctas_generate ~162

[writes flayr data · `write` scope] Writes a batch of draft calls to action for the confirmed offers, claims-checked against where they point. Charges Embers once per call (refunded when nothing usable comes back). Needs the Pro plan or higher. (Wraps POST /api/v2/hook-studio/ctas/generate.)

NameTypeReqDescription
brandIdstring–A brand id from GET /api/v2/brands. Required for an account-wide key; a brand-bound key may omit it.
countinteger––
destinationstring–An https link every CTA may point at, or `bio` for link in bio.
offerIdsarray––
platformsarray––

No output schema declared.

No examples provided.

ctas_list ~117

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

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.

ctas_update ~274

[writes flayr data · `write` scope] Edits a CTA, its status or its goal fields (goalKey, isPrimary, paidEligible, adButton). New copy or a new destination is claims-checked again; a CTA whose claims block cannot be approved. Free. Needs the Pro plan or higher. (Wraps PATCH /api/v2/hook-studio/ctas.)

NameTypeReqDescription
adButtonstring–The ad button. Default: the ads config default CTA.
brandIdstring–A brand id from GET /api/v2/brands. Required for an account-wide key; a brand-bound key may omit it.
cardstring––
destinationstring–An https link, or "bio" for the link in bio.
goalKeystring–The goal this CTA serves, a short slug such as `tech-checkup`.
idstringyes–
isPrimaryboolean–The brand's primary goal. Setting it demotes the previous primary.
linestring––
offerIdstring––
paidEligibleboolean–Ads may use this CTA. Default: true for a primary, false otherwise.
platformsarray––
statusstring––

No output schema declared.

No examples provided.

decide_approval ~234

[PUBLISHES to social accounts · `publish` scope] Same rules as the dashboard: only the assigned approver may decide. On a "workflow" approval, decision "approve" resumes the parked run, whose next steps may publish (GOES LIVE); "reject" cancels it. On a "manual" approval, "approve" only marks the content approved — nothing is posted until you call publish with its contentId — and "reject" returns it to draft. On "reject", pass the reviewer's reason as `note` (the submitter is told it); it is optional unless the org requires one (then 422 without it). Needs the explicit `approve` scope (admin does not include it). Agency plan. Repeating the same decision is safe (alreadyDecided: true). Confirm with the user before approving a workflow approval. (Wraps POST /api/v2/approvals/{id}.)

NameTypeReqDescription
decisionstringyes–
idstringyesAn approval id.
notestring–On reject: the reason. Optional unless the org requires one.

No output schema declared.

No examples provided.

decide_campaign_review_section ~258

[PUBLISHES to social accounts · `publish` scope] action "approve" approves the section's pending pieces (or pieceIds) and their held posts GO LIVE at their slots — needs the explicit `review` scope (admin does not include it); QA-failed pieces are skipped unless overrideQa. "fix" sends the pieces back with a `note` (required): their posts are taken off the schedule and the section opens a new round; other sections are untouched. "drop" takes the posts off the schedule and drops the pieces. "ready" puts fixed pieces back up for review. fix/drop/ready need `review` or `publish`. Agency plan. Confirm with the user first. (Wraps POST /api/v2/campaigns/{id}/review/sections/{sectionId}.)

NameTypeReqDescription
actionstringyes–
idstringyesCampaign id.
notestring–Required for fix: what to change. Quoted in the next round.
overrideQaboolean–Approve pieces that failed QA anyway.
pieceIdsarray–Only these pieces ("approve selected"). Default: every eligible piece in the section.
sectionIdstringyes–

No output schema declared.

No examples provided.

decide_review ~262

[PUBLISHES to social accounts · `publish` scope] decision "approve" sends a held post to the platform for its slot (GOES LIVE) — needs the explicit `review` scope (admin does not include it) and never works on a post the same connection created. decision "hold" takes a scheduled post off the platform schedule — needs `review` or `publish`. Agency plan. `id` is a reviewId or a convexPostId. (Wraps POST /api/v2/reviews/{id}.)

NameTypeReqDescription
collabSidestring–FFE-501 collab posts only: which brand this decision is for ("owner" = the shared character's brand, "grantee" = the brand that made the post). Needed only when the key's owner approves for both bran…
decisionstringyes–
idstringyesA convexPostId or a review id.
notestring––
pastSlot––Only for a held post whose slot passed: "now", or { at: ISO-8601 future time }.

No output schema declared.

No examples provided.

delete_content ~69

[DESTRUCTIVE] DESTRUCTIVE: permanently deletes a content item from the library. Posts already live on a platform are not removed. Needs the `write` scope. Ask the user before calling. (Wraps DELETE /api/v2/content/{id}.)

NameTypeReqDescription
idstringyes–

No output schema declared.

No examples provided.

delete_experiment ~56

[DESTRUCTIVE] DESTRUCTIVE: deletes the experiment record (content keeps its labels). Ask the user before calling. (Wraps DELETE /api/v2/experiments/{id}.)

NameTypeReqDescription
idstringyes–

No output schema declared.

No examples provided.

delete_growth_trigger ~104

[DESTRUCTIVE] DESTRUCTIVE: deletes a trigger (its logs stay). Ask the user before calling. (Wraps DELETE /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.

delete_queue ~196

[DESTRUCTIVE] DESTRUCTIVE: deletes the queue (its drafts stay in the library). With posts booked at the platform it is refused (409) unless `unschedule: true`, which first deletes those platform posts. Needs the `publish` scope (or admin) on the Agency plan or higher. Ask the user before calling. (Wraps DELETE /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–
unscheduleboolean–true: delete every 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 ite…

No output schema declared.

No examples provided.

delete_text_template ~59

[DESTRUCTIVE] DESTRUCTIVE: deletes a format (drafts started from it keep their text). Ask the user before calling. (Wraps DELETE /api/v2/text-templates/{id}.)

NameTypeReqDescription
idstringyes–

No output schema declared.

No examples provided.

get_analytics ~51

[read-only] Engagement overview for the last 7, 30 or 90 days. Pro plan or higher. (Wraps GET /api/v2/analytics.)

NameTypeReqDescription
rangestring––

No output schema declared.

No examples provided.

get_campaign_review ~146

[read-only] A campaign's pieces grouped into review sections (episode, week, channel set, variant group or the creator's own). Each piece has preview URLs (video / images / audio), caption, labels, its bookings (channels, time, review state) and QA checks; each section has its status, round and every previous fix note. Share `reviewUrl` so a person can preview and decide in flayr. (Wraps GET /api/v2/campaigns/{id}/review.)

NameTypeReqDescription
idstringyesCampaign id.
piecesboolean–false = sections and counts only.
sectionIdstring–Only this section.

No output schema declared.

No examples provided.

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.

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 102 tools: whoami, list_brands, brand_profile_get, brand_profile_update, list_connected_accounts, and 97 more. Their descriptions and schemas cost roughly 21,119 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 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.