shapeless
ShapelessAI's MCP server lets an agent run a social-media account end to end: research, create media, draft/schedule/publish posts, manage Brand Memory/assets/agents, and run durable jobs.
Read account identity, plan, credit balance, capability catalog, and request notification when planned capabilities ship.
Inspect live studio tools, platform limits/settings, connected social accounts, actors/characters, media library, Brand Memory, and agents.
Generate and edit images, AI video, footage, thumbnails, carousels, speech, subtitles, and music; probe/transcribe media.
Research with web/news/semantic search, X trends and pulse, evidence search, high-performing post references, page reading/screenshots/recordings, and asset fetching.
Manage social posts: create, schedule, queue, publish now, approve, dismiss, list/read queue, add first comments, and use per-platform settings.
Run durable jobs: create, list, read briefs/full transcripts, watch events, continue with files/media, run plans, and stop runs.
Read/write/import Brand Memory and complete onboarding questions.
List/upload assets; list/create/edit/wake standing agents, including optional auto-publish.
Connect social accounts via one-click OAuth links.
Many actions publish content or spend credit; relevant tools are marked destructive and require write/publish scopes.
Publishes posts to Bluesky via the posts create tool, with support for text content, media attachments, scheduling at a time or in the next queue slot, and an optional first comment.
Publishes video posts to a connected YouTube account, accepting a media key for the clip along with a title and platform-specific settings such as privacyStatus.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@shapeless schedule a post about our beta launch for tomorrow at 9am"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 PATHNode 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 keyConfig 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 connectionsMCP 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/mcpThe 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_getstill gives the full transcript.jobs_listanswers 200 jobs at a time, newest first, with anextCursor; pass it back asbeforeto 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_createandjobs_continuetake files:files(absolute local paths -.md/.txtride inline, images, video, audio and PDF are uploaded here) andmediaKeys(anything already in the account, e.g. whatassets_uploadreturned). 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 mcpClaude 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/shapelessaiClaude 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@shapelessThen 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:
MCP: Official MCP Registry (
com.shapelessai/shapeless), Glama, LobeHub, ModelScopeApps, plugins and skills: ChatGPT, cursor.directory, ClawHub, skills.sh, claude-plugins.dev, ModelScope skills, 360 SkillHub
Packages: Docker Hub, conda, Snap, Chocolatey, npm (AI SDK tools: shapelessai-ai-sdk), Rust crate, Ruby gem, Swift Package Index, CocoaPods
Workflow platforms and API hubs: Dify Marketplace, Open WebUI, Postman, RapidAPI, APIs.io
Docs for coding agents: Context7
Product directories: Twelve Tools, Product Watch, Lifto, Dynamite AI, LibHunt, Startup Fame, Saaspa.ge
Company: The Org
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 |
Start here: key, MCP URL, CLI, the three moves | |
Create, schedule, queue, media, first comment, every refusal | |
Limits and rules per platform, live from | |
Every route a key opens, and the scope it needs | |
The | |
The hosted MCP server and its tools | |
Durable runs | |
The account's durable knowledge | |
Keys, scopes, OAuth, rate limits |
Support and privacy
Support: hello@shapelessai.com, or open an issue. The CLI is developed against the contract above; this repo is where it ships.
Privacy policy: shapelessai.com/privacy
Terms: shapelessai.com/terms
Available Tools
65 toolsagents_listList agentsARead-onlyInspect
The agent roster (the API calls them strategies). Needs the read scope.
Inputs: no named parameters. Returns: strategies
agents_saveCreate or edit an agentADestructiveInspect
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 agentADestructiveInspect
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 libraryARead-onlyInspect
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 openARead-onlyInspect
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 MemoryBRead-onlyInspect
Read one Brand Memory file. Needs the read scope.
Inputs: path (required). Returns: path, content, updatedAt
brain_treeBrand Memory filesBRead-onlyInspect
Brand Memory's file list with the completion ring. Needs the read scope.
Inputs: no named parameters. Returns: files, completion
brain_writeWrite Brand MemoryBDestructiveInspect
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 doARead-onlyInspect
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 actorsARead-onlyInspect
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 voiceADestructiveInspect
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 upvotesARead-onlyInspect
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
concept_searchSearch by meaningARead-onlyInspect
Semantic search for pages and LinkedIn or X posts that mean what you describe rather than match its words: describe a persona saying or feeling something and get real, dated posts and articles. 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: query (required), budgetUsd, within_days. Returns: tool, media, output, chargedUsd
connections_linkConnect an account (link for the human)AInspect
The one URL the human clicks to connect a social account on a platform (connections_list already carries one per missing platform). Lasts 15 minutes, works only signed in as this account; the platform's own OAuth follows in the browser, then the account shows in connections_list. Needs the write scope.
Inputs: platform (required). Returns: url, platform, expiresAt
connections_listConnected accountsARead-onlyInspect
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 XADestructiveInspect
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 evidenceARead-onlyInspect
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 videoADestructiveInspect
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 imageADestructiveInspect
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 styleARead-onlyInspect
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 briefARead-onlyInspect
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 jobARead-onlyInspect
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 jobsARead-onlyInspect
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 jobADestructiveInspect
Stop a running job. Needs the write scope.
Inputs: id (required). Returns: stopped
jobs_tailWatch a jobARead-onlyInspect
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 tagARead-onlyInspect
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 videosARead-onlyInspect
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 IARead-onlyInspect
Who this credential belongs to: email, plan, credit balance. Needs the read scope.
Inputs: no named parameters. Returns: plan, user, entitled, accountId, +2 more
news_searchSearch the newsADestructiveInspect
Fresh, dated journalism on a query from a curated news index, press-release wires filtered out. within_days narrows the window. SPENDS CREDIT: about $0.01 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, within_days. Returns: tool, media, output, chargedUsd
plan_musicGenerate a music bedADestructiveInspect
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 settingsARead-onlyInspect
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 postsADestructiveInspect
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 postADestructiveInspect
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 postsADestructiveInspect
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 postARead-onlyInspect
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 postsARead-onlyInspect
The post queue: proposed drafts, scheduled posts, published history. Needs the read scope.
Inputs: status. Returns: posts
posts_publishPublish nowADestructiveInspect
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 fileARead-onlyInspect
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 pageARead-onlyInspect
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 performedARead-onlyInspect
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
reference_searchSearch posts that performedARead-onlyInspect
Search our judged library of real posts and videos that already performed: give the intent (topic and angle) and get a ranked shortlist with numbers, hook and format. Read the ones you want with reference_read. Costs a fraction of a cent (about $0.00001) from credit; budgetUsd (default 2, max 10) caps it and chargedUsd says what it cost. Needs the write scope.
Inputs: sort, limit, intent, platform, +5 more. Returns: tool, media, output, chargedUsd
render_carouselRender a carouselADestructiveInspect
Render your own HTML and CSS slides to a PDF (a LinkedIn document post) plus one PNG per slide (an Instagram carousel), each a media key. Slides are 1080x1350 unless you pass page; self-contained HTML only, no scripts or external URLs; src="media:" places a library image. A render with clipped or unreadable text is refused with a per-element audit. SPENDS CREDIT: about $0.02 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: css (required), title (required), slides (required), page, +1 more. 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 speechADestructiveInspect
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 toolsARead-onlyInspect
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
web_searchSearch the webADestructiveInspect
Search the web for current facts, stats or trends. Returns hits (title, url, snippet) and, when available, a synthesized answer grounded in them. SPENDS CREDIT: about $0.015 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, max_results. Returns: tool, media, output, chargedUsd
x_pulseAsk what X is sayingADestructiveInspect
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
Scored across 65 tools
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.
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.
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.
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
Related MCP Connectors
Agent-first social media publishing, scheduling, analytics, and unified inbox API + 16-tool MCP server across 18 social platforms (X, LinkedIn, Instagram, YouTube, TikTok, Threads, Bluesky, Reddit, Telegram, Discord, Mastodon, Facebook, Pinterest).
Run social media with agents. Connect over MCP to plan, write, and post to every network.
Create, schedule, and publish social posts, manage accounts, and read analytics as MCP tools.
Create, schedule, and publish social posts through the hosted SocialSpool MCP connector.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceExposes 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 PyPIAGPL 3.0
- AlicenseBqualityBmaintenanceEnables 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.15MIT

RepeatPost MCP Serverofficial
AlicenseNot gradedqualityBmaintenanceEnables 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- AlicenseNot gradedqualityCmaintenanceConnects 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