MCP server
The hosted MCP server at shapelessai.com/mcp, the tools it serves, and how each agent host adds it.
https://shapelessai.com/mcpThe hosted MCP server is https://shapelessai.com/mcp. Add that URL to any host that speaks
remote MCP and it opens a Shapeless tab to sign in and allow. OAuth, no API key, revocable by the
human. A client that cannot open a browser (the Agent SDK, a CI job, a self-hosted agent) sends an
API key from Settings → API keys as Authorization: Bearer slk_... to the same URL instead.
It is the same operations as the API and the CLI, discovered as tools - so an agent host learns the surface instead of reading this page.
Add it
| Host | How to add it | Steps with screenshots |
|---|---|---|
| Claude | Settings → Connectors → Add custom connector → paste the URL → Connect. | /connect/claude |
| ChatGPT | Open the ShapelessAI plugin in ChatGPT (chatgpt.com/plugins → search ShapelessAI) → add it → sign in. By hand: Developer mode on (Settings → Security and login) → chatgpt.com/plugins → + → paste the URL, OAuth. | /connect/chatgpt |
| Claude Code | claude mcp add --transport http --scope user shapeless https://shapelessai.com/mcp, then /mcp → Authenticate. | /connect/claude-code |
| Cursor | One-click install link, or add the URL to ~/.cursor/mcp.json → Needs login → sign in. | /connect/cursor |
| Codex | codex mcp add shapeless --url https://shapelessai.com/mcp, then codex mcp login shapeless. | /connect/codex |
| VS Code | One-click install link, or MCP: Add Server → HTTP → paste the URL → start it and sign in. | /connect/vscode |
| Gemini CLI | gemini mcp add --transport http shapeless https://shapelessai.com/mcp, then /mcp auth shapeless. | /connect/gemini-cli |
| Antigravity | Add "shapeless": { "serverUrl": "https://shapelessai.com/mcp" } under mcpServers in ~/.gemini/config/mcp_config.json, then Authenticate. | /connect/antigravity |
| Grok | grok.com/connectors, New Connector, Custom, paste https://shapelessai.com/mcp, sign in. | /connect/grok |
| Gemini | gemini.google.com, Settings, Connected Apps, Add a custom app, paste https://shapelessai.com/mcp. | /connect/gemini |
| Perplexity | Account settings, Connectors, + Custom connector, Remote, paste https://shapelessai.com/mcp, OAuth, Streamable HTTP. | /connect/perplexity |
| Muse | Ask Muse to create a custom connector to https://shapelessai.com/mcp and follow its sign-in steps. | /connect/muse |
| OpenClaw | openclaw mcp add shapeless --url https://shapelessai.com/mcp --transport streamable-http --auth oauth, then openclaw mcp login shapeless. | /connect/openclaw |
| Hermes Agent | hermes mcp add shapeless --url https://shapelessai.com/mcp --auth oauth, then hermes mcp login shapeless. | /connect/hermes |
Any other host that speaks remote MCP takes the same URL: https://shapelessai.com/mcp.
Every step above was read from the vendor's own documentation; the dated sources are on shapelessai.com/connect.
The handshake, for an agent adding it itself
- Transport: streamable HTTP at
https://shapelessai.com/mcp - Auth: OAuth 2.1, dynamic client registration, PKCE
- Protected-resource metadata:
https://shapelessai.com/.well-known/oauth-protected-resource/mcp - Scopes:
read,write,publish,offline_access - Instructions: the initialize result carries a short brief for the model (what Shapeless is for,
where to start, the approval rule, that the live docs are at
/llms-full.txtand the playbook at/skill.md), so a host knows when to reach for these tools before it has read a page.meanswersnext: the moves worth making on this account now.
An unauthenticated call answers 401 with WWW-Authenticate: Bearer resource_metadata="..."
pointing at that document. The server is stateless - one server per request, no session id - so
nothing breaks when the next request lands on another instance.
The tools
Every tool's description names the scope its credential needs. Tools that put content out say so in capitals and carry a destructive annotation, so a host asks the human first. Read-only tools are annotated read-only and run freely.
| Tool | Scope | What it does |
|---|---|---|
me | read | Who am I, plan, credit balance. Call it first to check the credential. |
connections_list | read | The connected accounts and their ids, plus a clickable connect link per platform not yet connected. |
connections_link | write | The one URL the human opens to connect a social account on a platform; the OAuth click stays theirs. |
tools_list | read | The live catalog of the studio tools below, each with its input schema and default price. |
capabilities_list | none | Everything Shapeless can do, live or planned, with the route and tool for each. |
capabilities_want | any | Ask to be told when a planned capability ships. Ask the human first. |
instagram_audio_search | read | Sounds an Instagram account may attach to a Reel (Meta's Audio API): search by title or artist, empty for trending. Pass an id as posts_create audio.audioId. Needs the account connected through Facebook Login; otherwise 409 with the connect link. |
platforms_list | none | Limits, media rules, whether a title is required, first-comment support and the settings schema per platform. Read it before posts_create. |
posts_create | publish | PUBLISHES. Put a post you wrote on one connected account: now, at a time, or in the account's next free queue slot. |
posts_list | read | The queue: proposed, scheduled, published. sort: "views" ranks your best posts across all history (platform, connectionId, minViews, since); fresh re-reads stale numbers first. |
posts_get | read | One post's live state, what it was made from, how it did. |
posts_approve | publish | PUBLISHES. Proposals to the schedule. |
posts_dismiss | write | Reject proposals. Nothing goes out. |
posts_publish | publish | PUBLISHES. Push a queued post out now. |
jobs_create | write | Start a durable run from a goal. referenceId + mode work from one of your references. |
jobs_list / jobs_get / jobs_brief / jobs_tail | read | Find, read, digest and follow runs. |
jobs_continue | write | Another turn on a job - resumes a stuck one. |
jobs_run | write | Press Run on a job's waiting plan, the approval click a headless caller has nobody to make. Drafts still land as proposals. |
jobs_stop | write | Stop a running job. |
panel_open / panel_update / panel_close | write | Open, change or close a tab on the panel beside the chat (a calendar, search hits, a teleprompter, media, a graph node, a plan as a flow graph of nodes with their costs, your own HTML). |
panel_ask | write | Put a question with options on the panel and wait up to 25 seconds for the person's press. |
panel_watch | read | Read the panel, or wait up to 25 seconds for it to change: every tab and every answered question. |
characters_list | read | The actor roster and how each voice was made. |
characters_voice | write | Design or clone a voice. Spends credit. |
brain_tree / brain_read | read | Brand Memory's file tree and one file. |
brain_onboarding | read | What is still open in Brand Memory, as questions with hints; answer with brain_write. |
brain_write | write | Edit Brand Memory. |
assets_list | read | The asset library. |
agents_list | read | The standing agents. |
agents_save | write, or publish when armed to autopublish | Create or edit one. |
agents_wake | publish | PUBLISHES. Run an agent now. |
references_list | read | Your reference sets: the creators, competitors and peers you work from, with member ids. |
references_add | write | Add a person by handle and platform or profile URL, as creator, competitor or peer; suggestionId accepts a suggestion. |
references_remove | write | Remove a member (memberId, with a reason) or dismiss a suggestion (suggestionId). |
references_suggest | read | People we suggest, each with the reasons behind it. |
references_browse | read | Search your set and how many other workspaces picked a handle (counts of 3 or more, never who). Counted per day by plan. |
identity_search | read | People, accounts and organizations Shapeless Graph already knows, by name or handle. Free. |
identity_node | read | One node in full: fields, edges with evidence, pulls, freshness, metric history. |
identity_people | read | Everyone in the graph, sorted and filtered; scope: "mine" is what you track. |
identity_similar | read | People like one person, each with a why. |
identity_library | read | Posts held for a person or an account, sorted by views or multiplier. |
identity_tracked | read, write to change | What you track (me, competitor, reference, watch); node + role tracks one, remove stops. |
identity_estimate | read | What a pull would cost before it runs, and what is already held. |
identity_resolve | write | SPENDS CREDIT. Resolve a handle, profile URL or domain into a person or organization. |
identity_expand | write | SPENDS CREDIT. Pull one more ring: profile, posts, sponsors, ads, creators, metrics, labels. See Identity. |
Studio tools
Every tool our own studio agent holds is also its own MCP tool, under the same name, with the
engine's JSON Schema as its input: images, AI video, video edits, carousels, speech, subtitles,
web pages, X and news research. Each is POST /api/tools/{name} in tool clothing and takes the
write scope. A call holds budgetUsd of credit (default 2, max 10) while it runs and settles at
what it really cost; one with a price spends credit and is annotated destructive, so the host
asks first. Every one answers {tool, output, media: [{key, url}], chargedUsd}, where media
lists each file it made; put a key in posts_create's mediaKeys to publish it.
| Tool | What it does | Default call | Runs |
|---|---|---|---|
generate_image | Generate an image | ~$0.016 | spends |
generate_footage | Generate AI video | ~$0.18 | spends |
clone_reel | Remake a reel with the account owner | ~$9.3 | spends, web |
edit_footage | Edit a video | free | files media |
render_thumbnail | Render a video thumbnail | free | files media |
demo_page | Record a product demo | free | files media, web |
render_carousel | Render a carousel | ~$0.02 | spends |
speak | Turn text into speech | ~$0.03 | spends |
caption_file | Make a subtitle file | free | files media |
plan_music | Generate a music bed | ~$0.06 | spends |
write_song | Write a song with vocals | ~$0.08 | spends |
probe_media | Inspect a video or audio file | free | reads |
measure_reel | Measure a reference reel | ~$0.053 | spends, web |
find_photo | Find a real photo | free | files media, web |
find_footage | Find stock footage | free | files media, web |
find_face | Find a person's photo | ~$0.007 | files media, web |
brand_mark | Find a brand's logo | ~$0.007 | files media, web |
web_search | Search the web | ~$0.015 | spends, web |
read_page | Read a web page | ~$0.006 | reads, web |
screenshot_page | Screenshot a web page | free | files media, web |
record_page | Film a web page | free | files media, web |
capture_tweet | Capture a post from X | free | files media, web |
list_page_assets | List a page's images and videos | free | reads, web |
inspect_page_style | Read a site's brand style | free | reads, web |
fetch_asset | Import a file from a URL | free | files media, web |
x_pulse | Ask what X is saying | ~$0.25 | spends, web |
news_search | Search the news | ~$0.01 | spends, web |
concept_search | Search by meaning | ~$0.007 | reads, web |
community_hot | What a community upvotes | free | reads, web |
current_pulse | Measure talk on X | ~$0.06 | spends, web |
related_trends | Find related trends | ~$0.00001 | reads |
find_evidence | Find research evidence | ~$0.001 | reads, web |
reference_search | Search posts that performed | ~$0.00001 | reads |
reference_read | Read a post that performed | free | reads |
linkedin_org_lookup | Find a LinkedIn company tag | free | reads |
The prices are a default call's engine cost before the plan's margin; premium image quality and
longer or voiced footage cost more. tools_list reads the same catalog live.
posts_create is POST /api/posts in tool clothing: connectionId, text (the route's
postText), mediaKeys, title (the route's documentTitle; YouTube requires one),
scheduledAt or queue: true, settings, firstComment, audio (an Instagram Reel's sound,
from instagram_audio_search). Read platforms_list first - it
carries the limits and the settingsSchema to fill. On the Free plan the eleventh post for one UTC
day answers 402 free_daily_cap, which names the day and when it resets. See
Posts.
References
A reference set is the people an account works from: creator, competitor, or peer (creators
like me). Add someone with references_add ({handle, platform} or {url}); adding the same
person twice answers the member already there. Then start a job from them:
jobs_create {goal, referenceId: <member id>, mode: "clone" | "format" | "inspiration"}. The post
it makes carries inspiration {kind: "reference-post", memberId, mode}, so its result can be read
against the account's own baseline and against posts made from Brand Memory alone.
references_suggest returns {suggestionId, platform, handle, kind, reasons: [{code, evidence}], rank};
show the reasons to the human, then accept with references_add {suggestionId} or dismiss with
references_remove {suggestionId}. The list is empty, with a note, until the suggestion job has
run for the account.
Picks are private to the account: nobody is told they were picked, and references_browse shows
other workspaces only as a count of how many picked a handle, and only at 3 or more. With
platform and an exact handle it also answers what those workspaces picked beside it. Browsing is
counted per UTC day: Free 5, Spark 50, Growth 500, Studio unlimited. The answer says what is left
(remaining); past the limit it is 402 reference_browse_limit with the reset time and the
upgrade links.
Two tools exist only on the local stdio server, because they read your disk: assets_upload,
brain_import, and the files argument on a job message. Run it with shapeless mcp - see
CLI.
Eight Shapeless Directory tools need no key and no account: directory_requirements,
directory_preview, directory_submit, directory_verify, directory_stats,
directory_search, directory_get and directory_alternatives. They are served by shapeless mcp and alone on the keyless endpoint
https://shapelessai.com/mcp/ai-tools, never on this OAuth server. See
Shapeless Directory.
Work passes both ways
- Every job result carries
url-https://shapelessai.com/studio/c/<id>- the conversation the human opens.jobs_create,jobs_list,jobs_getandagents_wakeall decorate. jobs_briefis the token-compact read before replying: the last 30 messages clipped, reasoning and tool-activity dropped, an artifact inventory, post counts per queue status. Deterministic, no model in the loop.jobs_listpages 200 at a time with anextCursorthe tool takes back asbefore.jobs_tailreplays from a cursor and follows live, returning when the run ends, 60 seconds pass or 200 events arrive. A run with no stream answers{live: false}rather than erroring.
The panel: show the person things, and ask them
On the Ask page the chat has a panel beside it: a read-only document of tabs the person looks at while the conversation goes on. The browser draws it; the chat's own agent and you, from a terminal, write it, and both see the same panel because it is stored with the conversation.
- No id needed. Leave
conversation_idout and the panel tools use the conversation the person opened last in the browser, the one they are most likely looking at. panel_opentakeskind,titleand the kind's fields flat:calendar(ids,highlight,mode),search(query,hits,groupBy,orderBy),prompter(sections),media(items),node(node),performance,agent,people,brain,plan,choices, andcustom(html, drawn in a sandboxed frame), andflow(nodes,edges,estimateUsd,approve: a plan as a graph, one node per choice with its cost and what it was built from). The sameidreplaces a tab in place.panel_askis the one way the person answers you there: two or more options, one press. Withwait_secondsit returnspicked: {optionId, label, at};nullmeans not yet, so keep waiting withpanel_watchandafter_rev.panel_watchwithafter_revandwait_secondsholds up to 25 seconds and returns the moment the panel changes. Itstextis one plain line per tab, itspicksevery answer.
The same panel is plain HTTP: GET /api/conversations/{id}/panel (?after=<rev>&wait=<s>),
POST /api/conversations/{id}/panel with {ops: [...]} (an edit op there is the person's hand
edit of one flow node: {id, node, patch {text?, sub?, media?}}), and GET /api/conversations/current/panel.
From a shell: shapeless panel show | open | update | close | ask | watch.
There is one prompt, continue (argument: id), which a host like 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.
Claude Code plugin
The public repo is also a plugin marketplace. The plugin wires up the hosted server and ships a skill that teaches Claude the ropes:
Then run /mcp, pick shapeless and choose Authenticate.
Other servers
We keep a measured survey of every MCP server that posts to social networks, ours included, at shapelessai.com/best-social-media-mcp-servers: endpoint, auth, which tools publish, networks, and the free tier's honest limit, each read from the vendor's own page.
Questions
Is there a free social media MCP server?
Yes, this one. https://shapelessai.com/mcp is on the Free plan: OAuth, no API key, 10 posts a day across nine networks, no card. The same tools run on every paid plan.
Can Claude post to social media?
Through a server that exposes a publishing tool, yes. Add this server as a custom connector, connect an account under Accounts, and ask. posts_create publishes or schedules; it is annotated destructive, so Claude asks you before it runs.
Does it work in ChatGPT, Cursor and Codex too?
Yes. In ChatGPT, Shapeless is a published plugin: open the Shapeless plugin while signed in, add it and sign in. Any other MCP host that speaks streamable HTTP with OAuth 2.1 can add the server by its URL; the host table above lists the ones we have verified step by step. Claude Code also has a plugin, and the shapelessai CLI runs the same tools over stdio for hosts that cannot reach a hosted server.
What happens when the free plan's daily cap is hit?
posts_create answers with the free_daily_cap error, the limit and the time it resets, so an agent can wait rather than retry blindly. Nothing is dropped silently. A post that failed still holds its slot on that day, so retry it with posts_publish on the same id rather than calling posts_create again.
