flayr
social.flayr/flayrflayr.socialstreamable-httpv1.2.0Scanned
Create, schedule and publish social posts to 13 platforms for your brands.
57 tools: 18 can delete or cancel things, 11 change things and 28 only read.
- Reads private data · 1
- Reads text others write · 26
- Can send data out · 8
- No findings
Anlyon alternative
29 of these tools change something. Run those as governed actions.
Declare what an action changes, and Anlyon puts it under a shared limit, binds every approval to the exact request, and grades the outcome. It works on any HTTPS API you can describe as an action.
Anlyon does not run, proxy or govern this MCP server. A tool your own code calls directly is not routed through Anlyon and is not governed by it.
Import an OpenAPI spec →Tools
Grouped by what each tool does, most consequential first. Open one for its reasons and full description; descriptions are the publisher's own words.
57 tools
Deletes or cancels 18Claude Code: deny
act_on_publish_action[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 sto…Reads text others writeCan send data outNo findings
Why it is in this group
- The name "act_on_publish_action" says "publish": a word for a change that another call does not undo.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
- outboundThe name "act_on_publish_action" says "publish": it sends or publishes something to other people.
Description, as the server wrote it [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}.)
Annotations the server declares
- title: Approve, reject, retry or cancel a reshare / comment
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
add_post_comments[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:<pos…Reads text others writeCan send data outNo findings
Why it is in this group
- The name "add_post_comments" says "add": a word for a change.
- The description's first verb is "publish": a word for a change that another call does not undo.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
- outboundThe name "add_post_comments" says "add" and "post": it writes something other people read.
Description, as the server wrote it [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.)
Annotations the server declares
- title: Add comments after publish to a post
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
add_queue_items[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.Reads text others writeNo findings
Why it is in this group
- The name "add_queue_items" says "add": a word for a change.
- The description's first verb is "publish": a word for a change that another call does not undo.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it [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.)
Annotations the server declares
- title: Add drafts to a queue
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
cancel_scheduled_post[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).Reads text others writeNo findings
Why it is in this group
- The name "cancel_scheduled_post" says "cancel": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it [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}.)
Annotations the server declares
- title: Cancel a scheduled post
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: true
create_queue[PUBLISHES to social accounts · `publish` scope] Creates a posting queue.Reads text others writeNo findings
Why it is in this group
- The name "create_queue" says "create": a word for a change.
- The description's first verb is "publish": a word for a change that another call does not undo.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it [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.)
Annotations the server declares
- title: Create a posting queue
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
decide_approval[PUBLISHES to social accounts · `publish` scope] Same rules as the dashboard: only the assigned approver may decide.Reads text others writeCan send data outNo findings
Why it is in this group
- The description's first verb is "publish": a word for a change that another call does not undo.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
- outboundThe description's first verb is "publish": it sends or publishes something to other people.
Description, as the server wrote it [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. 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}.)
Annotations the server declares
- title: Approve or reject held content
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
decide_review[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 i…Reads text others writeCan send data outNo findings
Why it is in this group
- The description's first verb is "publish": a word for a change that another call does not undo.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
- outboundThe description's first verb is "publish": it sends or publishes something to other people.
Description, as the server wrote it [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}.)
Annotations the server declares
- title: Approve or hold a scheduled post
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
delete_content[DESTRUCTIVE] DESTRUCTIVE: permanently deletes a content item from the library.No findings
Why it is in this group
- The name "delete_content" says "delete": a word for removing or ending something.
- The description says "permanently deletes".
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it [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}.)
Annotations the server declares
- title: Delete a content item
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: false
delete_experiment[DESTRUCTIVE] DESTRUCTIVE: deletes the experiment record (content keeps its labels).No findings
Why it is in this group
- The name "delete_experiment" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it [DESTRUCTIVE] DESTRUCTIVE: deletes the experiment record (content keeps its labels). Ask the user before calling. (Wraps DELETE /api/v2/experiments/{id}.)
Annotations the server declares
- title: Delete an experiment
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: false
delete_queue[DESTRUCTIVE] DESTRUCTIVE: deletes the queue (its drafts stay in the library).No findings
Why it is in this group
- The name "delete_queue" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it [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}.)
Annotations the server declares
- title: Delete a posting queue
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: false
delete_text_template[DESTRUCTIVE] DESTRUCTIVE: deletes a format (drafts started from it keep their text).No findings
Why it is in this group
- The name "delete_text_template" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it [DESTRUCTIVE] DESTRUCTIVE: deletes a format (drafts started from it keep their text). Ask the user before calling. (Wraps DELETE /api/v2/text-templates/{id}.)
Annotations the server declares
- title: Delete a format
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: false
publish[PUBLISHES to social accounts · `publish` scope] PUBLISHES TO REAL SOCIAL ACCOUNTS.Reads text others writeCan send data outNo findings
Why it is in this group
- The name "publish" says "publish": a word for a change that another call does not undo.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
- outboundThe name "publish" says "publish": it sends or publishes something to other people.
Description, as the server wrote it [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. `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. Then call get_content to see the live URLs. (Wraps POST /api/v2/publish.)
Annotations the server declares
- title: Publish or schedule a post (goes live)
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
queue_item_action[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…Reads text others writeCan send data outNo findings
Why it is in this group
- The description's first verb is "publish": a word for a change that another call does not undo.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
- outboundThe description's first verb is "publish": it sends or publishes something to other people.
Description, as the server wrote it [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}.)
Annotations the server declares
- title: Skip, retry, unschedule, retitle or move a queue item
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: true
remove_queue_item[DESTRUCTIVE] DESTRUCTIVE: removes an item (the draft stays in the library).No findings
Why it is in this group
- The name "remove_queue_item" says "remove": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it [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}.)
Annotations the server declares
- title: Remove an item from a queue
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: false
reorder_queue_items[PUBLISHES to social accounts · `publish` scope] Send every waiting (queued) item id exactly once, in the new order.Reads text others writeCan send data outNo findings
Why it is in this group
- The description's first verb is "publish": a word for a change that another call does not undo.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
- outboundThe description's first verb is "publish": it sends or publishes something to other people.
Description, as the server wrote it [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.)
Annotations the server declares
- title: Reorder waiting queue items
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
update_queue[PUBLISHES to social accounts · `publish` scope] `status: "paused"` stops new bookings (already-booked posts stay booked); "active" resumes.Reads text others writeNo findings
Why it is in this group
- The name "update_queue" says "update": a word for a change.
- The description's first verb is "publish": a word for a change that another call does not undo.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it [PUBLISHES to social accounts · `publish` scope] `status: "paused"` stops new bookings (already-booked posts stay booked); "active" resumes. Other fields (platforms, cadenceHours, timeOfDay, lookahead, startsAt, name) apply from the next booking. Needs the `publish` scope (or admin) on the Agency plan or higher. (Wraps PATCH /api/v2/queues/{id}.)
Annotations the server declares
- title: Update, pause or resume a queue
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: true
update_scheduled_post[PUBLISHES to social accounts · `publish` scope] CHANGES WHAT A SCHEDULED POST WILL PUBLISH on real accounts, keeping its slot, accounts, options, labels and draft.Reads text others writeCan send data outNo findings
Why it is in this group
- The name "update_scheduled_post" says "update": a word for a change.
- The description's first verb is "publish": a word for a change that another call does not undo.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
- outboundThe name "update_scheduled_post" says "update" and "post": it writes something other people read.
Description, as the server wrote it [PUBLISHES to social accounts · `publish` scope] CHANGES WHAT A SCHEDULED POST WILL PUBLISH on real accounts, keeping its slot, accounts, options, labels and draft. `firstComment` sets per-platform first comments (linkedin, facebook, instagram, threads, youtube; null removes; X/Bluesky have none); `text` / `platformText` change the caption; `applyAutoFirstComment: true` adds the brand's auto first comment where none is set; `removePlatforms` drops platforms from this booking (e.g. a duplicate TikTok). Updated in place when the platform scheduler allows it, otherwise re-booked at the same slot (status "rebooked", new postId). Refused within 5 minutes of the slot. Repeating the same edit returns "unchanged". 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 the new text with the user first. (Wraps PATCH /api/v2/posts/{id}.)
Annotations the server declares
- title: Edit a scheduled post (caption, first comments, platforms)
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: true
Changes things 11Claude Code: ask
apply_frame[writes flayr data · `write` scope] Draws a frame over an image and returns a new image URL (the original is untouched).No findings
Why it is in this group
- The name "apply_frame" says "apply": a word for a change.
Description, as the server wrote it [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.)
Annotations the server declares
- title: Frame an image
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: false
combine_clips[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 br…No findings
Why it is in this group
- The description's first verb is "write": a word for a change.
Description, as the server wrote it [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.)
Annotations the server declares
- title: Combine clips into a finished video
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: false
create_content[writes flayr data · `write` scope] Creates a DRAFT content item.No findings
Why it is in this group
- The name "create_content" says "create": a word for a change.
Description, as the server wrote it [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.)
Annotations the server declares
- title: Create a draft
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: false
create_experiment[writes flayr data · `write` scope] Creates an A/B experiment.No findings
Why it is in this group
- The name "create_experiment" says "create": a word for a change.
Description, as the server wrote it [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.)
Annotations the server declares
- title: Create an experiment
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: false
create_frame[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 …No findings
Why it is in this group
- The name "create_frame" says "create": a word for a change.
Description, as the server wrote it [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.)
Annotations the server declares
- title: Add a frame to the library
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: false
create_text_template[writes flayr data · `write` scope] Creates a reusable format (text template) in a brand.No findings
Why it is in this group
- The name "create_text_template" says "create": a word for a change.
Description, as the server wrote it [writes flayr data · `write` scope] Creates a reusable format (text template) in a brand. (Wraps POST /api/v2/text-templates.)
Annotations the server declares
- title: Create a format
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: false
update_content[writes flayr data · `write` scope] Edits a draft in place; only the fields you pass change.No findings
Why it is in this group
- The name "update_content" says "update": a word for a change.
Description, as the server wrote it [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` and `videoWatermarked` may be changed on published items too. 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}.)
Annotations the server declares
- title: Edit a draft
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
update_experiment[writes flayr data · `write` scope] Changes an experiment's fields (e.g.No findings
Why it is in this group
- The name "update_experiment" says "update": a word for a change.
Description, as the server wrote it [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}.)
Annotations the server declares
- title: Update an experiment
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
update_frame_settings[writes flayr data · `write` scope] Frame every image posted to a platform automatically (frameRef), or stop (frameRef null).No findings
Why it is in this group
- The name "update_frame_settings" says "update": a word for a change.
Description, as the server wrote it [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.)
Annotations the server declares
- title: Set auto-frame for a platform
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: false
update_text_template[writes flayr data · `write` scope] Changes a format; only the fields you pass change.No findings
Why it is in this group
- The name "update_text_template" says "update": a word for a change.
Description, as the server wrote it [writes flayr data · `write` scope] Changes a format; only the fields you pass change. `archived: true` hides it. (Wraps PATCH /api/v2/text-templates/{id}.)
Annotations the server declares
- title: Update a format
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
upload_media[writes flayr data · `write` scope] Step 1 of attaching a LOCAL file (video or image) to a draft.No findings
Why it is in this group
- The name "upload_media" says "upload": a word for a change.
Description, as the server wrote it [writes flayr data · `write` scope] Step 1 of attaching a LOCAL file (video or image) to a draft. Returns a single-use, short-lived `uploadUrl`. Step 2: POST the raw file bytes to it with the file's Content-Type, e.g. `curl -X POST -H "Content-Type: video/mp4" --data-binary @clip.mp4 "<uploadUrl>"` — the JSON response has a `storageId`. Step 3: pass it as `videoStorageId` or `imageStorageId` on create_content or update_content. For media already on the web, skip this and pass `videoUrl` / `imageUrl` instead. Returns 413 when the account's storage is full. (Wraps POST /api/v2/media/upload-url.)
Annotations the server declares
- title: Get a media upload URL
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: false
Only reads 28Show 28 read-only tools
compare_labels[read-only] Splits every labelled post by the values of one label key (e.g.Reads text others writeNo findings
Why it is in this group
- The name "compare_labels" says "compare": a word for reading.
What it can reach
- untrusted-inputThe description's first sentence says "read" and "post": it reads posts, which other people can write.
Description, as the server wrote it [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.)
Annotations the server declares
- title: Compare posts by a label (A/B)
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
get_analytics[read-only] Engagement overview for the last 7, 30 or 90 days.No findings
Why it is in this group
- The name "get_analytics" says "get": a word for reading.
Description, as the server wrote it [read-only] Engagement overview for the last 7, 30 or 90 days. Pro plan or higher. (Wraps GET /api/v2/analytics.)
Annotations the server declares
- title: Analytics overview
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
get_content[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 …Reads text others writeNo findings
Why it is in this group
- The name "get_content" says "get": a word for reading.
What it can reach
- untrusted-inputThe description's first sentence says "read" and "post": it reads posts, which other people can write.
Description, as the server wrote it [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}.)
Annotations the server declares
- title: Get a content item and its post status
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
get_experiment[read-only] One experiment: hypothesis, variants, compareKey, window and status.No findings
Why it is in this group
- The name "get_experiment" says "get": a word for reading.
Description, as the server wrote it [read-only] One experiment: hypothesis, variants, compareKey, window and status. (Wraps GET /api/v2/experiments/{id}.)
Annotations the server declares
- title: Get an experiment
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
get_experiment_results[read-only] The experiment's posts split by its compareKey, with the leading variant by its primary metric and n per arm.Reads text others writeNo findings
Why it is in this group
- The name "get_experiment_results" says "get": a word for reading.
What it can reach
- untrusted-inputThe description's first sentence says "read" and "post": it reads posts, which other people can write.
Description, as the server wrote it [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.)
Annotations the server declares
- title: Experiment results
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
get_frame[read-only] One library frame with its sizes and content areas.No findings
Why it is in this group
- The name "get_frame" says "get": a word for reading.
Description, as the server wrote it [read-only] One library frame with its sizes and content areas. (Wraps GET /api/v2/frames/{id}.)
Annotations the server declares
- title: Get a frame
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
get_frame_settings[read-only] Which frame each platform's images get automatically when a post is published or scheduled.Reads text others writeNo findings
Why it is in this group
- The name "get_frame_settings" says "get": a word for reading.
What it can reach
- untrusted-inputThe description's first sentence says "read" and "post": it reads posts, which other people can write.
Description, as the server wrote it [read-only] Which frame each platform's images get automatically when a post is published or scheduled. (Wraps GET /api/v2/frames/settings.)
Annotations the server declares
- title: Get auto-frame settings
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
get_job_status[read-only] Status of an async job (combine_clips, or an API video generation): pending, processing, completed or failed.No findings
Why it is in this group
- The name "get_job_status" says "get": a word for reading.
Description, as the server wrote it [read-only] Status of an async job (combine_clips, or an API video generation): pending, processing, completed or failed. For a combine, `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}.)
Annotations the server declares
- title: Get a render/generation job status
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
get_post[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 publi…Reads text others writeNo findings
Why it is in this group
- The name "get_post" says "get": a word for reading.
What it can reach
- untrusted-inputThe name "get_post" says "get" and "post": it reads posts, which other people can write.
- untrusted-inputThe description's first sentence says "read" and "post": it reads posts, which other people can write.
Description, as the server wrote it [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}.)
Annotations the server declares
- title: Get a scheduled post's first comments
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
get_queue[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.No findings
Why it is in this group
- The name "get_queue" says "get": a word for reading.
Description, as the server wrote it [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}.)
Annotations the server declares
- title: Get a posting queue
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
get_text_template[read-only] One format (text template) with its full structure and example.No findings
Why it is in this group
- The name "get_text_template" says "get": a word for reading.
Description, as the server wrote it [read-only] One format (text template) with its full structure and example. (Wraps GET /api/v2/text-templates/{id}.)
Annotations the server declares
- title: Get a format
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
list_approvals[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 …Reads text others writeNo findings
Why it is in this group
- The name "list_approvals" says "list": a word for reading.
What it can reach
- untrusted-inputThe description's first sentence says "read" and "post": it reads posts, which other people can write.
Description, as the server wrote it [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". Needs the explicit `approve` scope (admin does not include it). Agency plan. (Wraps GET /api/v2/approvals.)
Annotations the server declares
- title: List content waiting for your approval
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
list_attribution_rules[read-only] The brand's "posts like this must carry a credit" rules and its mode (flag / push_down).Reads text others writeNo findings
Why it is in this group
- The name "list_attribution_rules" says "list": a word for reading.
What it can reach
- untrusted-inputThe description's first sentence says "read" and "post": it reads posts, which other people can write.
Description, as the server wrote it [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.)
Annotations the server declares
- title: List creator-credit rules
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
list_brands[read-only] Lists the brands this connection can file content into and publish through.Reads private dataNo findings
Why it is in this group
- The name "list_brands" says "list": a word for reading.
What it can reach
- private-dataThe description's first sentence says "read" and "file": it reads files.
Description, as the server wrote it [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). (Wraps GET /api/v2/brands.)
Annotations the server declares
- title: List brands
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
list_connected_accounts[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…Reads text others writeNo findings
Why it is in this group
- The name "list_connected_accounts" says "list": a word for reading.
What it can reach
- untrusted-inputThe description's first sentence says "read" and "post": it reads posts, which other people can write.
Description, as the server wrote it [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.)
Annotations the server declares
- title: List connected social accounts
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
list_content[read-only] Lists content items (drafts), newest first.No findings
Why it is in this group
- The name "list_content" says "list": a word for reading.
Description, as the server wrote it [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.)
Annotations the server declares
- title: List content
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
list_experiments[read-only] A/B experiments.No findings
Why it is in this group
- The name "list_experiments" says "list": a word for reading.
Description, as the server wrote it [read-only] A/B experiments. Content joins one by carrying the label `experiment:<id>` plus `<compareKey>:<variant>`. (Wraps GET /api/v2/experiments.)
Annotations the server declares
- title: List experiments
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
list_frames[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.No findings
Why it is in this group
- The name "list_frames" says "list": a word for reading.
Description, as the server wrote it [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.)
Annotations the server declares
- title: List frames
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
list_pinterest_boards[read-only] Boards of the Pinterest account(s) a brand publishes to.No findings
Why it is in this group
- The name "list_pinterest_boards" says "list": a word for reading.
Description, as the server wrote it [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.)
Annotations the server declares
- title: List Pinterest boards
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
list_post_comments[read-only] A post's comments-after-publish and reshares, with status (waiting, needs_approval, sent, failed) and the resolved text.Reads text others writeNo findings
Why it is in this group
- The name "list_post_comments" says "list": a word for reading.
What it can reach
- untrusted-inputThe name "list_post_comments" says "list" and "post": it reads posts, which other people can write.
- untrusted-inputThe description's first sentence says "read" and "post": it reads posts, which other people can write.
Description, as the server wrote it [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.)
Annotations the server declares
- title: List a post's comments after publish
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
list_publish_actions[read-only] Pending, sent and failed comments-after-publish and reshares of the brand (filter by `status`, e.g.Reads text others writeNo findings
Why it is in this group
- The name "list_publish_actions" says "list": a word for reading.
What it can reach
- untrusted-inputThe description's first sentence says "read" and "comment": it reads comments, which other people can write.
Description, as the server wrote it [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.)
Annotations the server declares
- title: List comments after publish and reshares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
list_queues[read-only] Posting (drip) queues of one brand.No findings
Why it is in this group
- The name "list_queues" says "list": a word for reading.
Description, as the server wrote it [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.)
Annotations the server declares
- title: List posting queues
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
list_reviews[read-only] Scheduled posts waiting for (or given) a human sign-off, oldest slot first.Reads text others writeNo findings
Why it is in this group
- The name "list_reviews" says "list": a word for reading.
What it can reach
- untrusted-inputThe name "list_reviews" says "list" and "review": it reads comments, which other people can write.
- untrusted-inputThe description's first sentence says "read" and "post": it reads posts, which other people can write.
Description, as the server wrote it [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.)
Annotations the server declares
- title: List scheduled-post reviews
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
list_text_templates[read-only] Reusable text shapes per brand: sections, length targets, hook patterns, CTA slots and guardrails.No findings
Why it is in this group
- The name "list_text_templates" says "list": a word for reading.
Description, as the server wrote it [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.)
Annotations the server declares
- title: List formats (text templates)
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
list_youtube_playlists[read-only] Playlists of the YouTube channel(s) a brand publishes to.No findings
Why it is in this group
- The name "list_youtube_playlists" says "list": a word for reading.
Description, as the server wrote it [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.)
Annotations the server declares
- title: List YouTube playlists
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
query_insights[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, post…Reads text others writeNo findings
Why it is in this group
- The name "query_insights" says "query": a word for reading.
What it can reach
- untrusted-inputThe description's first sentence says "read" and "post": it reads posts, which other people can write.
Description, as the server wrote it [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.)
Annotations the server declares
- title: Run a custom insight query
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
whoami[read-only] Returns who this connection (an OAuth sign-in or an API key) belongs to: userId, the account's current plan tier, and brandId/brandName when the connection is bound to …No findings
Why it is in this group
- The name "whoami" says "whoami": a word for reading.
Description, as the server wrote it [read-only] Returns who this connection (an OAuth sign-in or an API key) belongs to: userId, the account's current plan tier, and brandId/brandName when the connection is bound to one brand (null = account-wide). Call this first to learn what the connection can reach. (Wraps GET /api/v2/ping.)
Annotations the server declares
- title: Check this connection
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Exfil surface
Which tools read private data, which read text someone else can write, and which can send data out. One of each is a path a prompt injection can use.
208 paths in this server alone from private data, through text someone else wrote, to a way out. Denying 1 private-data tool breaks every one.
- Reads private data1
- Reads files, mail, messages, databases, secrets, calendars or repositories.
- Reads text others write26
- Brings in text someone else can write: web pages, inbound email, messages, issues and comments.
- Can send data out8
- Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.
{
"permissions": {
"deny": [
"mcp__flayr__list_brands"
]
}
}Other servers in the same agent add their own tools to these paths. Audit your whole setup to see them together.
Findings
Matches of fixed checks, with the text they matched.
No check matched anything in these tool definitions. That is not a safety guarantee.
History
Changes to its tool definitions and to its remote endpoint, newest first.
No change seen yet. Its tools are rescanned every day, and a remote endpoint is looked at once a week.
Install
Pinned to version 1.2.0. Values in angle brackets are yours to fill in.
claude mcp add --transport http flayr https://flayr.social/api/mcpclaude mcp add --transport http flayr https://flayr.social/api/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change or a way out, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__flayr__whoami",
"mcp__flayr__list_brands",
"mcp__flayr__list_connected_accounts",
"mcp__flayr__list_youtube_playlists",
"mcp__flayr__list_pinterest_boards",
"mcp__flayr__list_content",
"mcp__flayr__get_content",
"mcp__flayr__get_job_status",
"mcp__flayr__get_post",
"mcp__flayr__list_reviews",
"mcp__flayr__list_approvals",
"mcp__flayr__list_queues",
"mcp__flayr__get_queue",
"mcp__flayr__get_analytics",
"mcp__flayr__query_insights",
"mcp__flayr__compare_labels",
"mcp__flayr__list_experiments",
"mcp__flayr__get_experiment",
"mcp__flayr__get_experiment_results",
"mcp__flayr__list_text_templates",
"mcp__flayr__get_text_template",
"mcp__flayr__list_attribution_rules",
"mcp__flayr__list_share_rules",
"mcp__flayr__list_publish_actions",
"mcp__flayr__list_post_comments",
"mcp__flayr__list_frames",
"mcp__flayr__get_frame",
"mcp__flayr__get_frame_settings"
],
"ask": [
"mcp__flayr__upload_media",
"mcp__flayr__create_content",
"mcp__flayr__update_content",
"mcp__flayr__combine_clips",
"mcp__flayr__create_experiment",
"mcp__flayr__update_experiment",
"mcp__flayr__create_text_template",
"mcp__flayr__update_text_template",
"mcp__flayr__create_frame",
"mcp__flayr__apply_frame",
"mcp__flayr__update_frame_settings"
],
"deny": [
"mcp__flayr__delete_content",
"mcp__flayr__publish",
"mcp__flayr__update_scheduled_post",
"mcp__flayr__cancel_scheduled_post",
"mcp__flayr__decide_review",
"mcp__flayr__decide_approval",
"mcp__flayr__create_queue",
"mcp__flayr__update_queue",
"mcp__flayr__delete_queue",
"mcp__flayr__add_queue_items",
"mcp__flayr__queue_item_action",
"mcp__flayr__remove_queue_item",
"mcp__flayr__reorder_queue_items",
"mcp__flayr__delete_experiment",
"mcp__flayr__delete_text_template",
"mcp__flayr__create_share_rule",
"mcp__flayr__act_on_publish_action",
"mcp__flayr__add_post_comments"
]
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. A read that can send data out (it takes a URL, say) asks first too. It assumes the server is installed as flayr. Review it before you use it.
Capability tags behind 27 rules
- mcp__flayr__list_brands private-data
- mcp__flayr__list_connected_accounts untrusted-input
- mcp__flayr__get_content untrusted-input
- mcp__flayr__publish untrusted-input, outbound
- mcp__flayr__get_post untrusted-input
- mcp__flayr__update_scheduled_post untrusted-input, outbound
- mcp__flayr__cancel_scheduled_post untrusted-input
- mcp__flayr__list_reviews untrusted-input
- mcp__flayr__decide_review untrusted-input, outbound
- mcp__flayr__list_approvals untrusted-input
- mcp__flayr__decide_approval untrusted-input, outbound
- mcp__flayr__create_queue untrusted-input
- mcp__flayr__update_queue untrusted-input
- mcp__flayr__add_queue_items untrusted-input
- mcp__flayr__queue_item_action untrusted-input, outbound
- mcp__flayr__reorder_queue_items untrusted-input, outbound
- mcp__flayr__query_insights untrusted-input
- mcp__flayr__compare_labels untrusted-input
- mcp__flayr__get_experiment_results untrusted-input
- mcp__flayr__list_attribution_rules untrusted-input
- mcp__flayr__list_share_rules untrusted-input
- mcp__flayr__create_share_rule untrusted-input
- mcp__flayr__list_publish_actions untrusted-input
- mcp__flayr__act_on_publish_action untrusted-input, outbound
- mcp__flayr__add_post_comments untrusted-input, outbound
- mcp__flayr__list_post_comments untrusted-input
- mcp__flayr__get_frame_settings untrusted-input
Pin
Keep the decision: fail CI when the tools change, follow every change, or show a badge.
Pin in CI
Fail a build when the tools you reviewed are not the tools the server serves today.
curl -s "https://anlyon.dev/api/v1/servers/social.flayr/flayr/verify?hash=c47d5ddd7b1cefa791524dc8c5c11405556ad6807f6c1b0f3d0063625e71fd42" | jq -e '.changed == false'Pinned hash c47d5ddd7b1c, from Oct 29, 2026, 18:31 UTC.
Watch
Get told when its tools change: a new tool, a new description, a new class.
https://anlyon.dev/servers/social.flayr/flayr/changes.xmlAn Atom feed. Works in any feed reader or Slack's RSS app.
Badge
[](https://anlyon.dev/servers/social.flayr/flayr)Source: MCP Registry. Synced Oct 29, 2026, 18:31 UTC.