Skip to main content
Glama

ShapelessAI

ShapelessAI runs your social presence: it drafts, schedules, and publishes content across your connected platforms, holds your Brand Memory, and keeps standing agents working while you sleep.

This repo is the public home of the agent surface: the shapeless CLI, the MCP server, the Claude Code plugin, and the issue tracker. Your agent or script drives a ShapelessAI account: write and schedule posts, create jobs and resume stuck ones, approve and publish, edit Brand Memory, manage the standing agents.

The documentation lives at shapelessai.com/docs - routes, scopes, platform limits, refusal codes, one page per subject. Every page also answers raw Markdown: append .md to its path (https://shapelessai.com/docs/posts.md) or send Accept: text/markdown. An agent that wants all of it in one fetch should read shapelessai.com/llms-full.txt.

Install

npx shapelessai --help      # one-off
npm i -g shapelessai        # keeps `shapeless` on your PATH

Node 20 or newer.

Claude's directory

The connector Anthropic lists is https://shapelessai.com/mcp/social, the same account server without the media-generation tools (Anthropic's Software Directory Policy 4.B lists no software that generates images, video or audio with a model); its plugin bundle is plugins/shapeless-social. plugins/shapeless and https://shapelessai.com/mcp stay the full server, for this marketplace and every other host. Details: https://shapelessai.com/docs/mcp.

Related MCP server: fanfou-mcp

Authenticate

Mint a key in the studio: Settings -> API keys (/studio/api-keys). Give it only the scopes the caller needs - read, write, or publish. Only publish can put content out.

shapeless login             # paste the key; we verify it and store it 0600
export SHAPELESS_API_KEY=slk_...   # or: env var, beats the stored key

Config lives in ~/.config/shapeless/config.json. SHAPELESS_BASE_URL overrides the API host (default https://shapelessai.com). shapeless logout forgets the local copy; revoke the key itself in the studio.

Every command takes --json to print the raw API response, and --help.

Post

Write it yourself and put it on the rail - now, at a time, or in the account's next free queue slot. Needs the publish scope.

shapeless connections                     # the accounts and their ids
shapeless platforms                       # limits, media rules, settings schema (no key needed)

shapeless posts create --to <connectionId> --text "Shipping day."                       # now
shapeless posts create --to <connectionId> --text "..." --at 2026-09-21T09:00:00+03:00  # at a time
shapeless posts create --to <connectionId> --text "..." --queue                         # next free slot
shapeless posts create --to <connectionId> --text "..." --media k1,k2 \
  --first-comment "Link: https://..."      # LinkedIn, X, Bluesky
shapeless posts create --to <youtubeConnectionId> --text "..." --media <clip.mp4 key> \
  --title "The video title" --settings '{"privacyStatus":"unlisted"}'

The MCP tool is posts_create with the same arguments: connectionId, text, mediaKeys, title, scheduledAt or queue: true, settings, firstComment. Read platforms_list first for the platform's limits and its settingsSchema.

Free plan: ten posts a day on the rail, counted on the UTC day each post goes out on, so a week planned ahead is ten a day rather than ten in total. The eleventh answers 402 {code: "free_daily_cap", limit, day, resetsAt}, which names the day that is full. X bills per post, so Free posts to X once a day and without links (402 free_x_daily_cap, free_x_link); the $9 Scheduler plan lifts the daily cap and carries 150 X posts a month, and the agent plans have no cap. Composing, scheduling and publishing never spend credits, and Free also carries 125 credits a month for the agent team. Details: shapelessai.com/docs/posts.

Jobs: durable runs

A job is a run the server keeps going whether or not you stay connected - the right shape for agents and cron.

# Fire and forget
shapeless jobs create draft three posts about our beta launch

# Watch it live (tails the event stream, falls back to polling)
shapeless jobs create plan this week --label "Weekly plan" --budget 2.50 --watch

# Come back later
shapeless jobs list               # 200 newest; prints a cursor if older jobs exist
shapeless jobs list --before <cursor>   # the next page back
shapeless jobs show <id>          # transcript summary + outputs
shapeless jobs tail <id>          # re-attach to the live stream

# Put files on the message - the agent sees the image, not just its name
shapeless jobs create does this thumbnail work? --attach ./thumb.png --attach ./notes.md
shapeless jobs continue <id> and this one --media-key workspace-assets/<account>/logo.png

# Resume a stuck or failed run - history is rebuilt server-side
shapeless jobs continue <id> keep going, but make the second post shorter --watch

shapeless jobs stop <id>

Posts: the queue

shapeless posts list --status proposed
shapeless posts show <id>
shapeless posts approve <id> <id> <id>    # proposed -> scheduled  [publish]
shapeless posts dismiss <id>
shapeless posts publish <id>              # out, now  [publish]
shapeless posts mark-posted <id> --url https://...

Agents, Brand Memory, assets

shapeless agents list
shapeless agents create --name "Daily reach" --prompt "..." --days mon,thu --hours 9
shapeless agents edit <id> --status paused        # or: shapeless agents pause <id>
shapeless agents wake <id>                        # run it now  [publish]

shapeless brain ls
shapeless brain get positioning.md
shapeless brain put voice.md --file ./voice.md    # or pipe on stdin
shapeless brain import ./pitch-deck.pdf
shapeless brain export --out brain.zip

shapeless assets list
shapeless assets upload ./logo.png
shapeless connections

MCP server

The hosted server is https://shapelessai.com/mcp. Add that URL to any host that speaks remote MCP - Claude (Settings -> Connectors -> Add custom connector), ChatGPT (Developer mode), Claude Code, Cursor, Codex, VS Code, Gemini CLI - and it opens a ShapelessAI tab to sign in and allow. OAuth, no key. The steps for each host, in the vendor's words, are at shapelessai.com/connect.

A client that cannot open a browser (the Agent SDK, a CI job, a self-hosted agent) skips OAuth: send an API key from Settings -> API keys as Authorization: Bearer slk_... to the same URL. Any MCP client that sets a header works; the scope is the key's.

curl -s https://shapelessai.com/mcp -H "Authorization: Bearer $SHAPELESS_API_KEY" \
  -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
claude mcp add --transport http --scope user shapeless https://shapelessai.com/mcp   # then /mcp -> Authenticate
codex mcp add shapeless --url https://shapelessai.com/mcp && codex mcp login shapeless
gemini mcp add --transport http shapeless https://shapelessai.com/mcp

The same tools (posts_create, jobs_create, posts_approve, brain_write, ...) also run locally: shapeless mcp speaks MCP on stdio with the API key from shapeless login, and adds the tools that read your disk (assets_upload, brain_import, and files on a job message). Every tool carries a title and annotations - read-only tools run freely, anything that publishes, spends or overwrites is flagged destructive so a host asks you first - and each description names the scope it needs.

Beyond the account tools, every tool our own studio agent holds is its own MCP tool too: generate_image, generate_footage, edit_footage, render_carousel, speak, caption_file, web_search, x_pulse and the rest. Each answers the files it made as media keys you can publish with posts_create. The table with what each one costs is at shapelessai.com/docs/mcp; tools_list reads it live.

A job is a conversation, so work passes both ways between your terminal and the web app:

  • Every job result carries a url - https://shapelessai.com/studio/c/<id> - so an agent can hand the human back a link to what it just did.

  • jobs_brief <id> is the cheap read before replying: the last 30 messages clipped, reasoning and tool-activity dropped, an artifact inventory and post counts per queue status. Deterministic, no model in the loop. jobs_get still gives the full transcript.

  • jobs_list answers 200 jobs at a time, newest first, with a nextCursor; pass it back as before to walk further into the history.

  • jobs_tail <id> watches a job's run (60 seconds max, 200 events) and returns the events plus a cursor to resume from; a job with no run stream to attach to answers {live: false} instead of erroring.

  • jobs_create and jobs_continue take files: files (absolute local paths - .md/.txt ride inline, images, video, audio and PDF are uploaded here) and mediaKeys (anything already in the account, e.g. what assets_upload returned). Up to 6 per message. They land on the message the human sees in the studio, and the agent reads them for real - an image's pixels are inlined for that turn, not just its filename.

There is one prompt, continue (argument: id), which Claude Code surfaces as a slash command: it loads that conversation's brief and tells the agent to reply into the same thread with jobs_continue.

Running the stdio server instead of the hosted one - Claude Code:

claude mcp add shapeless -e SHAPELESS_API_KEY=slk_... -- npx shapelessai mcp

Claude Desktop (claude_desktop_config.json), and other stdio-only hosts:

{
  "mcpServers": {
    "shapeless": {
      "command": "npx",
      "args": ["shapelessai", "mcp"],
      "env": { "SHAPELESS_API_KEY": "slk_..." }
    }
  }
}

Without the env var the server uses the key stored by shapeless login.

Agent Plugins (Cursor, Kiro, Copilot, Codex) and Gemini CLI

plugins/shapeless is also an Agent Plugins 1.0 package (plugin.json, mcp.json, skills/), so any client that loads that format installs the hosted MCP server and the skill from this repo. Gemini CLI reads gemini-extension.json at the root:

gemini extensions install https://github.com/ShapelessAI/shapelessai

Claude Code plugin

This repo is also a plugin marketplace. The shapeless plugin wires up the hosted MCP server and ships a skill that teaches Claude the ropes - scopes, the post queue, when to touch Brand Memory:

/plugin marketplace add ShapelessAI/shapelessai
/plugin install shapeless@shapeless

Then run /mcp, pick shapeless and choose Authenticate - a browser tab signs you in once.

Where else ShapelessAI is listed

The same server and skill, installable from the registry your client already reads:

The API

Everything above rides one documented contract: shapelessai.com/docs/api - every route, the scope each needs, rate limits, and what deliberately refuses an API key. Machine-readable at /api/openapi.json.

Page

What it answers

/docs

Start here: key, MCP URL, CLI, the three moves

/docs/posts

Create, schedule, queue, media, first comment, every refusal

/docs/platforms

Limits and rules per platform, live from GET /api/platforms

/docs/api

Every route a key opens, and the scope it needs

/docs/cli

The shapeless command

/docs/mcp

The hosted MCP server and its tools

/docs/jobs

Durable runs

/docs/brand-memory

The account's durable knowledge

/docs/auth

Keys, scopes, OAuth, rate limits

Support and privacy

Available Tools

65 tools
agents_listList agentsA
Read-only
Inspect

The agent roster (the API calls them strategies). Needs the read scope.

Inputs: no named parameters. Returns: strategies

agents_saveCreate or edit an agentA
Destructive
Inspect

Create an agent (no id) or edit one (with id). Setting autoPublishPosts arms publishing without human approval and needs the publish scope; everything else needs write.

Inputs: id, name, prompt, status, +7 more. Returns: strategy

agents_wakeWake an agentA
Destructive
Inspect

PUBLISH-SCOPED: wake an agent now; it plans and proposes (or with auto-publish, posts) immediately. Returns the conversation it woke into and its web url. Needs the publish scope.

Inputs: id (required). Returns: url, runId, conversationId

assets_listMedia libraryA
Read-only
Inspect

The media library: brand uploads and generated media. Needs the read scope.

Inputs: no named parameters. Returns: uploads, generated

assets_uploadUpload mediaAInspect

Upload a local image, video, audio file or PDF to the brand library; returns its mediaKey. For a file the chat should see, attach it to jobs_create/jobs_continue instead. Needs the write scope.

Inputs: file (required). Returns: asset

brain_importImport into Brand MemoryAInspect

Import a local .md, .txt, .pdf or .docx document into Brand Memory. Needs the write scope.

Inputs: file (required). Returns: path, sizeBytes

brain_onboardingBrand Memory: what is still openA
Read-only
Inspect

What is still open in Brand Memory, as the questions a human answers, with hints. Ask the human, write the answers as markdown under the question headings with brain_write at the item's path, then call again until open is empty. Needs the read scope.

Inputs: no named parameters. Returns: how, done, open, percent

brain_readRead Brand MemoryB
Read-only
Inspect

Read one Brand Memory file. Needs the read scope.

Inputs: path (required). Returns: path, content, updatedAt

brain_treeBrand Memory filesB
Read-only
Inspect

Brand Memory's file list with the completion ring. Needs the read scope.

Inputs: no named parameters. Returns: files, completion

brain_writeWrite Brand MemoryB
Destructive
Inspect

Write one Brand Memory file (.md paths only) - the agent grounds future posts in it. Needs the write scope.

Inputs: path (required), content (required). Returns: path, content, updatedAt

brand_markFind a brand's logoAInspect

A company's or product's real logo, ready to place: pass the brand name, and its domain when known. Returns the brand: handle, which colour cuts exist and a PNG media key. Small brands are looked up on the web. Costs a fraction of a cent (about $0.007) from credit; budgetUsd (default 2, max 10) caps it and chargedUsd says what it cost. Needs the write scope.

Inputs: brand (required), about, domain, budgetUsd. Returns: tool, media, output, chargedUsd

capabilities_listWhat Shapeless can doA
Read-only
Inspect

Everything Shapeless can do, live or planned, with the REST routes, MCP tools and CLI lines for each and its page. A planned one says how to get the same outcome today and carries a want door; one with a route answers 501 there until it ships. Needs the read scope (over REST it needs no key).

Inputs: no named parameters. Returns: docs, live, planned, capabilities

capabilities_wantTell me when it shipsAInspect

Ask to be told the day a planned capability ships. Bound to this account's sign-in email; add an email or https webhookUrl to tell somewhere else. Ask the human first. Needs the read scope.

Inputs: id (required), note, email, webhookUrl. Returns: docs, status, capability

caption_fileMake a subtitle fileAInspect

Transcribe a video or audio file in the media library (up to 20 minutes) into a word-timed .srt or .vtt. Filed next to the source; the text also comes back inline. Free: budgetUsd (default 2, max 10) is held while it runs and released. Needs the write scope.

Inputs: media_key (required), names, format, budgetUsd. Returns: tool, media, output, chargedUsd

capture_tweetCapture a post from XAInspect

Draw a public x.com post the way X shows it (avatar, name, text, media still, date, counts) as a 1080px-wide PNG media key, dark or light, optionally under the post it replies to. Free: budgetUsd (default 2, max 10) is held while it runs and released. Needs the write scope.

Inputs: url (required), theme, thread, variant, +1 more. Returns: tool, media, output, chargedUsd

characters_listList actorsA
Read-only
Inspect

The account's actors: who they are, what their voice is, and which parts are locked. voiceDescription is the casting direction a designed voice was written from - read it before designing another one, and reuse the actor that already fits. Needs the read scope.

Inputs: no named parameters. Returns: characters

characters_voiceGive an actor a voiceA
Destructive
Inspect

SPENDS CREDIT: gives an actor a voice. description designs one from casting direction (kept on the character, so later runs can reuse the actor); sampleMediaKey clones a real voice and requires consent: true - the user's own attestation that they hold the rights. Returns the voice id, a preview clip and what it cost. Needs the write scope.

Inputs: character (required), consent, description, sampleMediaKey. Returns: costUsd, character

community_hotWhat a community upvotesA
Read-only
Inspect

The live top of Hacker News or of a subreddit's hot ranking, with scores. Free: budgetUsd (default 2, max 10) is held while it runs and released. Needs the write scope.

Inputs: community (required), budgetUsd. Returns: tool, media, output, chargedUsd

connections_listConnected accountsA
Read-only
Inspect

Connected social accounts (identity only, no tokens), plus connect: one clickable link per platform with no live account, and reconnect on an expired one. Hand the link to the human. Needs the read scope.

Inputs: no named parameters. Returns: connections

current_pulseMeasure talk on XA
Destructive
Inspect

How much X is talking about 2 to 6 short phrases right now: 7-day volume, per-day counts, velocity and sample posts for the loudest, with a wave flag when one is big. SPENDS CREDIT: about $0.06 of engine cost a default call, billed with the plan's margin; budgetUsd caps it (default 2, max 10) and chargedUsd says what it cost. Needs the write scope.

Inputs: phrases (required), budgetUsd. Returns: tool, media, output, chargedUsd

demo_pageRecord a product demoAInspect

A real browser opens a URL and performs the steps you name (type, click, hover, scroll, wait); returns an MP4 media key drawn like a screen-recorded demo, with a cursor and camera that follow each action. A page behind a login demos as its login wall. Free: budgetUsd (default 2, max 10) is held while it runs and released. Needs the write scope.

Inputs: url (required), name (required), steps (required), zoom, +4 more. Returns: tool, media, output, chargedUsd

edit_footageEdit a videoAInspect

Cut a video in the media library (an upload, a generated or found clip, a render) down to the moments that matter and get a new media key: keep beats or quoted words from probe_media's transcript (keep_text), or seconds (keep_ranges, remove_ranges). The same call reframes to 9:16, tightens pauses, burns in captions, lays music and places overlays, a logo and a look. Run probe_media first; plan: true reads the paper edit back before rendering. Free: budgetUsd (default 2, max 10) is held while it runs and released. Needs the write scope.

Inputs: name (required), media_key (required), fit, sfx, +29 more. Returns: tool, media, output, chargedUsd

fetch_assetImport a file from a URLAInspect

Pull an image, video, audio file or PDF at a public URL into the media library as a media key. A fetched file is reference material until you know you may republish it. Free: budgetUsd (default 2, max 10) is held while it runs and released. Needs the write scope.

Inputs: url (required), purpose, budgetUsd. Returns: tool, media, output, chargedUsd

find_evidenceFind research evidenceA
Read-only
Inspect

Semantic search over 322M scholarly works: a claim or topic in, works out with title, year, citation count, venue, url and abstract. Cite only what the abstract supports. Costs a fraction of a cent (about $0.001) from credit; budgetUsd (default 2, max 10) caps it and chargedUsd says what it cost. Needs the write scope.

Inputs: query (required), min_year, budgetUsd, max_results, +1 more. Returns: tool, media, output, chargedUsd

find_faceFind a person's photoAInspect

Fetch a real photograph of a named person into the media library: their freely licensed Wikipedia portrait first, else the photo they publish themselves. Pass about (company or role) so a common name lands on the right person. Static use only; credit it when attributionRequired is true. Costs a fraction of a cent (about $0.007) from credit; budgetUsd (default 2, max 10) caps it and chargedUsd says what it cost. Needs the write scope.

Inputs: person (required), about, variant, budgetUsd. Returns: tool, media, output, chargedUsd

find_footageFind stock footageAInspect

Fetch one licensed real video clip (stock, Pixabay, the Internet Archive, NASA, Wikimedia Commons, reaction GIFs) into the media library as a media key. Search in two to four concrete words. B-roll only: no recognizable faces, logos or branded property. Free: budgetUsd (default 2, max 10) is held while it runs and released. Needs the write scope.

Inputs: query (required), source, budgetUsd, orientation, +1 more. Returns: tool, media, output, chargedUsd

find_photoFind a real photoAInspect

Fetch one licensed real photograph (stock or Pixabay) or a blank meme template into the media library as a media key. Every result carries its licence; credit it when attributionRequired is true. Free: budgetUsd (default 2, max 10) is held while it runs and released. Needs the write scope.

Inputs: query (required), source, variant, budgetUsd, +1 more. Returns: tool, media, output, chargedUsd

generate_footageGenerate AI videoA
Destructive
Inspect

Generate one short AI video clip from a prompt: one continuous camera move over one subject, silent unless with_audio (more per second). The dearest asset there is; try find_footage first. The clip carries a SynthID watermark and needs an AI-generated label where the platform asks. Returns a media key. SPENDS CREDIT: about $0.18 of engine cost a default call, billed with the plan's margin; budgetUsd caps it (default 2, max 10) and chargedUsd says what it cost. Needs the write scope.

Inputs: name (required), prompt (required), aspect, budgetUsd, +3 more. Returns: tool, media, output, chargedUsd

generate_imageGenerate an imageA
Destructive
Inspect

Make one image from a prompt written as a scene in prose, in the aspect ratio of the platform it is for, optionally conditioned on up to 6 reference_keys from the media library (a logo, a product shot, an earlier image). quality "premium" is the dearer model. Returns the image as a media key with a URL; put the key in posts_create mediaKeys. SPENDS CREDIT: about $0.016 of engine cost a default call, billed with the plan's margin; budgetUsd caps it (default 2, max 10) and chargedUsd says what it cost. Needs the write scope.

Inputs: name (required), prompt (required), aspectRatio (required), size, +3 more. Returns: tool, media, output, chargedUsd

inspect_page_styleRead a site's brand styleA
Read-only
Inspect

A page's visual identity as design tokens: heading and body typefaces, the palette by role as hex, the button radius and its logo, measured as a visitor sees it. Free: budgetUsd (default 2, max 10) is held while it runs and released. Needs the write scope.

Inputs: url (required), viewport, budgetUsd. Returns: tool, media, output, chargedUsd

jobs_briefJob briefA
Read-only
Inspect

Compact context for continuing a conversation: the last messages clipped, an artifact inventory, post statuses, and the web url. Use jobs_get for the full transcript, jobs_continue to reply. Needs the read scope.

Inputs: id (required). Returns: id, url, live, title, +7 more

jobs_continueReply to a jobAInspect

Send another message to a job, optionally with files attached - also the way to resume a stuck or failed run with full history. Needs the write scope.

Inputs: id (required), text (required), files, model, +3 more. Returns: id, status

jobs_createStart a jobAInspect

Start a durable job from a goal, optionally with files attached. The run keeps going server-side; returns the job id and its web url to poll or continue. Needs the write scope.

Inputs: goal (required), files, label, model, +5 more. Returns: id, url, title, status

jobs_getRead a jobA
Read-only
Inspect

One job in full: transcript, running/idle status, outputs (posts with queue state, media) and its web url. Use jobs_brief when you only need enough to reply. Needs the read scope.

Inputs: id (required). Returns: job

jobs_listList jobsA
Read-only
Inspect

List jobs with liveness and the web url of each, 200 per page, newest first. A non-null nextCursor means older jobs exist: pass it back as before. Needs the read scope.

Inputs: before, origin. Returns: jobs, nextCursor

jobs_runRun a job's planAInspect

Press Run on the job's newest proposed plan - the approval click a headless caller has nobody to make. Use it after a turn ended with a plan waiting; deliverables still land as proposed drafts. Needs the write scope.

Inputs: id (required), budgetUsd. Returns: id, status

jobs_stopStop a jobA
Destructive
Inspect

Stop a running job. Needs the write scope.

Inputs: id (required). Returns: stopped

jobs_tailWatch a jobA
Read-only
Inspect

Watch a job's run: replays its events from the cursor, then follows live until the run ends, 60 seconds pass, or 200 events. Returns {live, cursor, events} - resume with that cursor. {live: false} means no run stream to attach to; the job may still have finished work, so read jobs_get. Needs the read scope.

Inputs: id (required), cursor, maxSeconds. Returns: object

linkedin_org_lookupFind a LinkedIn company tagA
Read-only
Inspect

The verified LinkedIn mention token for a large company, or the companies for a topic, like @Microsoft, ready to paste into a LinkedIn post. Tag only a company it returns. Free: budgetUsd (default 2, max 10) is held while it runs and released. Needs the write scope.

Inputs: query (required), budgetUsd. Returns: tool, media, output, chargedUsd

list_page_assetsList a page's images and videosA
Read-only
Inspect

The media a page renders (images, videos, logos, the social preview card), largest first, with real pixel sizes and what each is for. fetch_asset the one you want. Free: budgetUsd (default 2, max 10) is held while it runs and released. Needs the write scope.

Inputs: url (required), viewport, budgetUsd, max_assets. Returns: tool, media, output, chargedUsd

meWho am IA
Read-only
Inspect

Who this credential belongs to: email, plan, credit balance. Needs the read scope.

Inputs: no named parameters. Returns: plan, user, entitled, accountId, +2 more

plan_musicGenerate a music bedA
Destructive
Inspect

Generate an instrumental music bed from a style (genre, mood, instruments, tempo; never an artist) and get its media key with its beat grid (bpm, beat times), so a video can be cut on the beat. Pass the key as edit_footage's music. SPENDS CREDIT: about $0.06 of engine cost a default call, billed with the plan's margin; budgetUsd caps it (default 2, max 10) and chargedUsd says what it cost. Needs the write scope.

Inputs: style (required), budgetUsd, allow_vocals, duration_seconds. Returns: tool, media, output, chargedUsd

platforms_listPlatform limits and settingsA
Read-only
Inspect

Every platform the rail posts to: text limit, media rules, whether documentTitle is required, first-comment support, and the JSON Schema for its settings. Read it before posts_create. Works with any key (read scope or none).

Inputs: no named parameters. Returns: platforms

posts_approveApprove postsA
Destructive
Inspect

PUBLISHES CONTENT: approving moves proposals to the schedule, and they will go out. Needs the publish scope.

Inputs: ids (required). Returns: object

posts_createWrite and schedule a postA
Destructive
Inspect

PUBLISHES CONTENT: puts a post you wrote on the rail for one connected account (connections_list), at a time, in the account's next free queue slot, or now. Read platforms_list first for the platform's limits and settings schema. Free plan: 10 posts a day (402 free_daily_cap says when the day resets). Needs the publish scope.

Inputs: text (required), connectionId (required), queue, title, +4 more. Returns: id, url, error, status, +3 more

posts_dismissDismiss postsA
Destructive
Inspect

Cancel posts: proposed, scheduled, failed or handed-off. Nothing already publishing or published is touched. Pass the user's reason when they gave one; it teaches the agent their taste. Needs the write scope.

Inputs: ids (required), reason. Returns: resolved

posts_getRead a postA
Read-only
Inspect

One post's live state, with the url that opens it in the calendar for the human. Needs the read scope.

Inputs: id (required). Returns: post

posts_listList postsA
Read-only
Inspect

The post queue: proposed drafts, scheduled posts, published history. Needs the read scope.

Inputs: status. Returns: posts

posts_publishPublish nowA
Destructive
Inspect

PUBLISHES CONTENT NOW: pushes a queued post to the platform immediately. Needs the publish scope.

Inputs: id (required). Returns: id, error, status, handoffNote, +1 more

probe_mediaInspect a video or audio fileA
Read-only
Inspect

Look at a video or audio file in the media library: duration, size, frame rate, loudness, a filmstrip of timestamped frames, frames at chosen seconds, the waveform, and for speech every word with its time and the same words as numbered beats. Read it before edit_footage. Free: budgetUsd (default 2, max 10) is held while it runs and released. Needs the write scope.

Inputs: media_key (required), names, frames, waveform, +3 more. Returns: tool, media, output, chargedUsd

read_pageRead a web pageA
Read-only
Inspect

The full clean text of a URL, from a cached copy when the live page blocks robots. Costs a fraction of a cent (about $0.006) from credit; budgetUsd (default 2, max 10) caps it and chargedUsd says what it cost. Needs the write scope.

Inputs: url (required), budgetUsd, max_characters. Returns: tool, media, output, chargedUsd

record_pageFilm a web pageAInspect

A real browser opens a URL and scrolls it smoothly top to bottom; returns an MP4 media key plus its first frame. 8 to 15 seconds reads as one shot. Free: budgetUsd (default 2, max 10) is held while it runs and released. Needs the write scope.

Inputs: url (required), scroll, viewport, budgetUsd, +1 more. Returns: tool, media, output, chargedUsd

reference_readRead a post that performedA
Read-only
Inspect

Read 1 to 3 exemplars from reference_search in full: why they worked, their structure and beats, the transcript and on-screen text, and the recipe to rebuild the format for another brand. Free: budgetUsd (default 2, max 10) is held while it runs and released. Needs the write scope.

Inputs: ids (required), budgetUsd. Returns: tool, media, output, chargedUsd

render_thumbnailRender a video thumbnailAInspect

Package a finished video with its cover: one frame of it (frame_at, in seconds), three to five words, at most one picture. Filed beside the video as -thumbnail.jpg, so a post that carries the video key gets the cover. Free: budgetUsd (default 2, max 10) is held while it runs and released. Needs the write scope.

Inputs: frame_at (required), headline (required), video_key (required), accent, +5 more. Returns: tool, media, output, chargedUsd

screenshot_pageScreenshot a web pageAInspect

A real browser renders a URL (JavaScript runs, fonts load) and returns the picture as a media key: the viewport, the full page, or one element by CSS selector, on a phone or laptop viewport. Free: budgetUsd (default 2, max 10) is held while it runs and released. Needs the write scope.

Inputs: url (required), selector, viewport, budgetUsd, +1 more. Returns: tool, media, output, chargedUsd

speakTurn text into speechA
Destructive
Inspect

Read up to 2000 characters aloud into a WAV in the media library, in a preset voice (Sulafat, Charon, Kore, Achird, Erinome, Schedar) or a character's own voice id from characters_list, with an energy and a style line. Returns its media key. SPENDS CREDIT: about $0.03 of engine cost a default call, billed with the plan's margin; budgetUsd caps it (default 2, max 10) and chargedUsd says what it cost. Needs the write scope.

Inputs: text (required), name, style, voice, +2 more. Returns: tool, media, output, chargedUsd

tools_listShapeless toolsA
Read-only
Inspect

The live catalog of the Shapeless studio agent's tools, each with its JSON Schema input and default price. Every one is also its own MCP tool here (generate_image, generate_footage, edit_footage, render_carousel, web_search, x_pulse and the rest); this is the read for what the deployment serves right now. Needs the read scope.

Inputs: no named parameters. Returns: tools

x_pulseAsk what X is sayingA
Destructive
Inspect

An agent searches X live and answers what practitioners are saying about a topic right now, with per-claim citations and engagement evidence. Slow (about 60 seconds) and the dearest search: ask one sharp question. SPENDS CREDIT: about $0.25 of engine cost a default call, billed with the plan's margin; budgetUsd caps it (default 2, max 10) and chargedUsd says what it cost. Needs the write scope.

Inputs: query (required), budgetUsd. Returns: tool, media, output, chargedUsd

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.6/5.0

    Scored across 65 tools

    Disambiguation3/5

    Most tools have distinct resource+action targets, but the search/pulse family (web_search, news_search, concept_search, x_pulse, current_pulse, related_trends, community_hot, find_evidence, reference_search) overlaps heavily in purpose, and brain_*/jobs_* clusters have several near-neighbors (jobs_get vs jobs_brief vs jobs_tail). The rich descriptions help distinguish them, but an agent could easily misselect among the many semantic-search variants.

    Naming Consistency4/5

    Nearly everything is snake_case with two systematic patterns: resource_verb for scoped operations (posts_create, brain_read, jobs_get, characters_voice) and verb_noun for generic actions (generate_image, find_photo, edit_footage, render_carousel). Minor outliers like 'me', 'speak' and 'plan_music' break the pattern slightly, but the convention is largely predictable.

    Tool Count2/5

    65 tools is a very heavy surface, well past the point where an agent can hold the catalog in mind. Given the platform's breadth (generation, search, publishing, Brand Memory, jobs, agents) many tools do earn their place, but the count still demands excessive selection effort.

    Completeness5/5

    The surface covers full lifecycles across every domain: posts (list/get/create/approve/dismiss/publish), jobs (create/list/get/brief/tail/continue/run/stop), Brand Memory (read/write/tree/import/onboarding), agents and media assets, plus generation, editing, transcription and rich search. No obvious dead ends.

    Maintenance

    ActivityActive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      B
      maintenance
      Exposes a governed brand brain to any MCP-compatible agent over stdio or an OAuth 2.1-protected Streamable HTTP endpoint, letting agents read brand context (mission, voice, guidelines, personas, policy) and create or edit drafts, campaigns, records and connector jobs. Approving and publishing stay with a human operator.
      684 PyPI
      AGPL 3.0
    • A
      license
      B
      quality
      B
      maintenance
      Enables MCP clients such as Claude and Cursor to read timelines, search statuses, and look up users or conversations, plus optionally post, delete, favorite, and follow with explicit confirmation. It supports both local stdio launches and remote HTTP hosting with per-user authorization.
      15
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables Claude or any MCP client to schedule and publish social media posts across 15 platforms, write brand-voice captions, create branded graphics, and manage media and workspaces through a hosted remote server.
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Connects MCP clients to a local social engine that reads bounded posts, comments, replies, and feeds into local inboxes, turns source material into drafts and briefs, and publishes exact frozen jobs with recorded provider IDs and receipts across Instagram, Threads, and Substack.
      MIT