OpenClawby the OpenClaw open-source project
Connect OpenClaw to your LinkedIn, X, Instagram and 9 more
About a minute, three moves. Then OpenClaw writes, designs, renders video, schedules and publishes for you, and you approve. Works in your OpenClaw gateway, and every chat it lives in: WhatsApp, Telegram, iMessage and more.
Which network?
Add ShapelessAI to OpenClaw
In OpenClaw, add ShapelessAI with the URL below. A ShapelessAI tab opens: sign in (or create an account) and allow. That is the whole install; nothing to download, no API key.
- 1Add the serverAdd the server
openclaw mcp add shapeless --url https://shapelessai.com/mcp --transport streamable-http --auth oauth - 2Sign in (stop the Gateway first: openclaw gateway stop; start it again after)Sign in (stop the Gateway first: openclaw gateway stop; start it again after)
openclaw mcp login shapeless - 3Or in ~/.openclaw/openclaw.json
{ mcp: { servers: { shapeless: { url: "https://shapelessai.com/mcp", transport: "streamable-http", auth: "oauth" } } } } - 4
Keep transport set: without it OpenClaw assumes SSE. The Control UI has the same form under Settings, MCP, Configured servers, Add server, and an admin can press Sign in there instead of running the login with the Gateway stopped.
Steps read from OpenClaw: MCP and OpenClaw: MCP transports on . Vendors move menus; if a step no longer matches, the source is the place to check and hello@shapelessai.com is where to tell us.
Connect your social accounts to ShapelessAI, once
In ShapelessAI, open Accounts and connect each account through the platform's own sign-in. ShapelessAI keeps that connection; OpenClaw never sees a password or token for it.
No account yet? The free plan is 10 posts a day through every interface, no card. Every tool the server exposes is in the MCP reference.
Ask OpenClaw in plain words
Ask OpenClaw from any channel it runs in. Every draft lands in your ShapelessAI queue for approval unless you say otherwise, and you are asked before anything goes out.
Write a LinkedIn post announcing our new pricing page. Founder voice, no hashtags, and make a 6-slide PDF carousel to go with it.Draft a thread on X about why we rebuilt onboarding, six posts, with the demo GIF on the first.Make an Instagram Reel from this feature: 20 seconds, captions on, our voice, vertical.
Questions
- Which OpenClaw plans can add ShapelessAI?
- Any OpenClaw install; it is open source and self-hosted.
- How do I use it once it is connected?
- Ask OpenClaw from any channel it runs in.
- Does OpenClaw ask before publishing?
- Not unless you set a standing agent to auto-publish. A job proposes drafts and waits for your approval in ShapelessAI or in the chat; the tools that approve, publish or spend are flagged, so OpenClaw asks you before running one.
- Do I need a developer app or API key for each network?
- No. You connect each account to ShapelessAI once, under Accounts, through the network's own sign-in. ShapelessAI holds those connections; OpenClaw signs in to ShapelessAI with OAuth and never sees a network token or password.
- How do I disconnect it?
- Settings → API keys → Connected apps in ShapelessAI lists OpenClaw with a Disconnect button; revoking there ends its access at once. OpenClaw also lets you remove the connector on its side.
For developers and agents: the MCP server, the tools, the CLI
https://shapelessai.com/mcpA remote MCP server over streamable HTTP. Sign-in is OAuth 2.1 with dynamic client registration and PKCE, so any host - OpenClaw or your own agent - registers itself and opens a ShapelessAI tab to sign in and allow; the resource metadata is at /.well-known/oauth-protected-resource. Read tools run freely; anything that publishes, spends or overwrites is flagged destructive so the host asks first. The token is revocable under Settings → API keys → Connected apps.
| Tool | What it does | Runs |
|---|---|---|
| me | Who this credential belongs to: email, plan, credit balance. | reads |
| capabilities_list | Everything ShapelessAI 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). | reads |
| capabilities_want | 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. | drafts |
| tools_list | The live catalog of the ShapelessAI 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. | reads |
| connections_link | 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. | drafts |
| connections_list | 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. | reads |
| references_list | The creators, competitors and peers ("creators like me") this account works from, by set, each with its member id, platform, handle and profile url. Pass a member id to jobs_create as referenceId to make a post from that person. | reads |
| references_add | Add one person to the account's reference set: a handle and platform, or a profile URL, tagged creator, competitor or peer ("creators like me"). Pass suggestionId to accept a references_suggest suggestion. Adding someone already there answers the member with created: false. Picks stay private to the account. | drafts |
| references_remove | Remove a member from the reference set (memberId), or dismiss a suggestion (suggestionId). The reason (not_similar, not_relevant, low_quality, other) teaches the next suggestions. | asks you first |
| references_suggest | People we suggest the account follow as references, best first, each with reasons [{code, evidence}] (same_niche, beats_baseline, co_selected, links_to_you, same_format...) to show the human. Accept with references_add {suggestionId}, dismiss with references_remove {suggestionId}. Empty with a note until the reference-suggest job has run for the account. | reads |
| references_browse | Search the reference graph: the account's own members matching q, how many other workspaces picked a matching handle (counts of at least k = 3, never who), and with platform plus an exact handle, what those workspaces picked beside it ("people who pick X also pick"). Counted per UTC day: Free 5, Spark 50, Growth 500, Studio unlimited; remaining says what is left, a 402 carries the upgrade links. | reads |
| identity_search | Find people, accounts and organizations the identity graph already knows, by name or handle, with their labels. Free. Use it before identity_resolve: a known node costs nothing to open. | reads |
| identity_node | One node in full: its fields, its edges with evidence, the pulls that fed it (vendor, cost, when), when each expansion was last pulled, the posts date ranges held, and metric history. Free. | reads |
| identity_people | Every person the graph holds, with labels, accounts and counts, sorted and filtered; scope mine is what this account tracks and the people one edge from them. Free. | reads |
| identity_similar | People like one person, each with the niches and organizations they share and why in one line. basis embedding, or labels with a note when the person has no embedding yet (run identity_expand with labels first). Free. | reads |
| identity_library | Every post held for a person or an account, sorted (multiplier is views against the account's own median) and faceted by platform and topic. Free; pull more with identity_expand posts. | reads |
| identity_tracked | What this account tracks (me, competitor, reference, watch) and those nodes. With node and role it tracks one or changes its role; with node and remove it stops. A resolve or an expand tracks its node as watch by itself. Free. Needs the read scope to list, write to change. | asks you first |
| identity_estimate | What identity_expand would cost before it runs, read from the price list and what the graph holds, never a vendor: estimateUsd, capUsd (the most it can spend at these settings), and for posts what the range already holds (alreadyHeld, coveredFrom, coveredTo) so only the gaps are paid for, its cadenceHours and nextRefreshAt, and sources: the vendor the pull asks first and every fallback behind it, each with its unit price and whether it reaches the range; for creators the priced steps. Engine USD: a paid plan is charged 3x, the free plan 1x. Free. | reads |
| identity_resolve | SPENDS CREDIT. Find who a seed is and land them in the identity graph: a person (handle, profile URL, personal site) or an organization (LinkedIn company URL, or a bare domain), then their accounts' profiles and labels. A seed already known opens for $0 unless force. budgetUsd 0.5 to 5 engine USD (default 2) is held on the wallet first; only what the pull cost is charged (holdUsd says what was held). Returns the anchor node, costUsd, the pulls and every node it showed. | asks you first |
| identity_expand | SPENDS CREDIT. Grow one node by one expansion: profile, posts, sponsors, ads, creators, metrics or labels. A fresh expansion answers costUsd 0 unless force. budgetUsd 0.01 to 2 engine USD (default 0.5) is held on the wallet first; only what the pull cost is charged. Price it first with identity_estimate. | asks you first |
| jobs_create | 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. | drafts |
| jobs_list | 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. | reads |
| jobs_get | One job in full: transcript, status (queued, running, idle, failed or stopped; lastRun.reason says why a run failed or stopped), outputs (posts with queue state, media) and its web url. Use jobs_brief when you only need enough to reply. | reads |
| jobs_brief | 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. | reads |
| jobs_tail | 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. | reads |
| jobs_continue | Send another message to a job, optionally with files attached - also the way to resume a stuck or failed run with full history. | drafts |
| jobs_run | 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. | drafts |
| jobs_stop | Stop a running job. | asks you first |
| panel_open | The panel is the document beside the chat on the ShapelessAI Ask page (shapelessai.com/studio): tabs the person looks at while you talk, and the place they answer a question with a press or edit a plan's node by hand. The browser, the chat's own agent and you (from a terminal) share one panel per conversation. The page draws it for the founder's account today (it is being rolled out); every account holds and can read its panel through these tools and the API. Opens one tab and brings it to the front; the same id replaces that tab in place, so re-open to refresh it rather than piling up copies. Kinds and their fields: node: a graph node (person, account, organization, post) with its connections: node (a node id like person:<uuid>). people: the account's people graph: no fields. plan: a chat turn's plan cards: messageId, blockIds. calendar: the post queue as a calendar: ids? (post ids, none = whole queue), highlight? (post ids to point at), from?, to?, mode? (week | month | list). performance: how posts performed: post? (one post id), days?. agent: a standing agent and its runs: strategyId?. choices: a question the person answers with one press: question, options [{id, label, sub?, media? {kind: image|video, src}}]; use panel_ask, which also waits for the pick. prompter: a teleprompter for recording: sections [{text, kind?, seconds?, cue?, wpm? (this section's pace, 60..260), tone? (warm, urgent, dry...)}], wordsPerMinute?; text may carry delivery marks: *words* land harder, / a breath, // a full stop, ^word lifts. search: search results the person can group and sort: query, hits [{id, title, sub?, kind?, node?, url?, thumb?, group? {facet: value}, metrics? {name: number}}], groupBy?, orderBy?. brain: the account's Brand Memory: no fields. media: images, videos or audio to look at: items [{kind: image|video|audio, src, title?}]. custom: your own HTML in a sandboxed frame, when no kind fits: html (at most 200 KB), height?. flow: a plan as a graph, one node per choice made for the person: nodes [{id, kind, title, sub?, status? (planned | new | changed | running | done | failed | waiting), costUsd?, text?, refs? [{title, url?, node?, why?}], media? {kind: image|video|audio, src, title?}, options? [string], was?}] (1 to 40, unique ids), edges [{from, to, label?}], estimateUsd?, approve? (the sentence the Approve press sends to the chat). story: one growing page of chapters in the order things happened, for a list of posts, a side by side, options, a comparison or a product walked: chapters [{id, kind, title, note?, ...}] (1 to 16, unique ids) where kind is references {refs [{node (a post on the graph, asset:...) or url (http(s), a page, product, repository or paper off the graph; exactly one), title, kind? (post | page | product | code | research; post with node, required with url), fit? (high | mid | low), why?, picked?, proof? [{value, label, source?, asOf?}] (at most 4 measured facts, e.g. {value: "41,237", label: "stars"}), excerpt? (at most 600 characters: a file snippet or a quoted claim), thumb? (a media key or an http(s) image)}] (1 to 30, one row per node or url), leftOut? [reason]} | frames {seconds [n] (1 to 8), rows [{id, label, sub?, node?, frames [{src?, badge?, note?}] (one per second; no src draws the planned frame with note), vs?, take?, you?}] (1 to 8)} | options {options [{id, label, sub?, text?, media? {kind, src}, refs? [asset node], chips? [string], count?}] (2 to 4), picked?, approve? (the sentence the Approve press sends)} | compare {sides [{label, node?, url?, ours?, median?}] (2 to 12; with two, theirs then the person's; at most one ours and one median), rows [{label, values [number | null] (one per side, null when unknown), unit?, better? (higher | lower)}] (1 to 24)} | shots {shots [{src, caption?, step?, flag?}], facts? [{value, label}]}; every src is a media key, a /path or an http(s) URL; add or replace one chapter later with panel_update's chapter. The person ticks references, picks an option and leaves one-line marks on any row, option, measure, frame or shot (marks [{chapter, target, text}]); read them back with panel_watch. Returns {conversation_id, id, panel, text}; text is one plain line per tab. | drafts |
| panel_update | The panel is the document beside the chat on the ShapelessAI Ask page (shapelessai.com/studio): tabs the person looks at while you talk, and the place they answer a question with a press or edit a plan's node by hand. The browser, the chat's own agent and you (from a terminal) share one panel per conversation. The page draws it for the founder's account today (it is being rolled out); every account holds and can read its panel through these tools and the API. Changes fields of an open tab (a new title, more search hits, the calendar's highlight); its kind never changes. On a story, chapter adds the next chapter or replaces the one with its id in place, so the page grows without resending it. An id not on the panel changes nothing. | drafts |
| panel_close | The panel is the document beside the chat on the ShapelessAI Ask page (shapelessai.com/studio): tabs the person looks at while you talk, and the place they answer a question with a press or edit a plan's node by hand. The browser, the chat's own agent and you (from a terminal) share one panel per conversation. The page draws it for the founder's account today (it is being rolled out); every account holds and can read its panel through these tools and the API. Closes one tab. | drafts |
| panel_ask | Asks the person a question they answer with one press: two or more options (a hook, a thumbnail, a time slot), shown on the panel; with wait_seconds it waits for the press. The panel is the document beside the chat on the ShapelessAI Ask page (shapelessai.com/studio): tabs the person looks at while you talk, and the place they answer a question with a press or edit a plan's node by hand. The browser, the chat's own agent and you (from a terminal) share one panel per conversation. The page draws it for the founder's account today (it is being rolled out); every account holds and can read its panel through these tools and the API. Returns {conversation_id, id, picked: {optionId, label, at} | null, panel_rev}; null means not answered yet, so call panel_watch with after_rev to keep waiting. Asking again with the same id replaces the question and clears its answer. | drafts |
| panel_watch | The panel is the document beside the chat on the ShapelessAI Ask page (shapelessai.com/studio): tabs the person looks at while you talk, and the place they answer a question with a press or edit a plan's node by hand. The browser, the chat's own agent and you (from a terminal) share one panel per conversation. The page draws it for the founder's account today (it is being rolled out); every account holds and can read its panel through these tools and the API. Reads the panel: every tab, which one is in front, and every answered question in picks. With after_rev (the panel.rev you last saw) and wait_seconds it waits until something changes, the way to hear the person's press. Returns {conversation_id, panel, text, picks: [{id, optionId, label, at}]}. | reads |
| posts_list | The post queue: proposed drafts, scheduled posts, published history, newest first. For "my best posts": sort views ranks every published post by views (metrics.latest.impressions) across the whole history, narrowed by platform, connectionId, minViews and since. Each reading carries its fetchedAt; fresh re-reads the listed posts' numbers older than 6h from the platforms first (slower, up to ~30s). | reads |
| posts_get | One post's live state, with the url that opens it in the calendar for the human. | reads |
| posts_approve | PUBLISHES CONTENT: approving moves proposals to the schedule, and they will go out. | asks you first |
| posts_dismiss | 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. | asks you first |
| posts_publish | PUBLISHES CONTENT NOW: pushes a queued post to the platform immediately. | asks you first |
| posts_create | 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, and X only once a day without links, because X bills per post (402 free_daily_cap / free_x_daily_cap / free_x_link carry the reset time, a one-line pitch and a checkout URL to hand the human). | asks you first |
| instagram_audio_search | Music or original sounds an Instagram account may attach to a Reel, from Meta's Audio API (audio Meta authorized for third-party use; the in-app catalogue can differ). Empty query = trending. Pass a result's id as posts_create audio.audioId; the sound is attached by Instagram, never burned into the video. Prefer isAdsEligible: true for a business promoting itself. Needs the Instagram account connected through Facebook Login; otherwise a 409 carries the connect link. | reads |
| platforms_list | 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). | reads |
| characters_list | 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. | reads |
| characters_voice | 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. | asks you first |
| brain_onboarding | 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. | reads |
| brain_tree | Brand Memory's file list with the completion ring. | reads |
| brain_read | Read one Brand Memory file. | reads |
| brain_write | Write one Brand Memory file (.md paths only) - the agent grounds future posts in it. | asks you first |
| assets_list | The media library: brand uploads and generated media. | reads |
| agents_list | The agent roster (the API calls them strategies). | reads |
| agents_save | 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. | asks you first |
| agents_wake | 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. | asks you first |
Studio tools: every tool our own agent uses, one call each. Images, AI video, video edits, carousels, speech, web and X research. Each takes the write scope; a priced one spends credit, so the host asks first.
| Tool | What it does | Runs |
|---|---|---|
| generate_image | Generate an image. About $0.016 a call. | asks you first |
| generate_footage | Generate AI video. About $0.18 a call. | asks you first |
| clone_reel | Remake a reel with the account owner. About $9.3 a call. | asks you first |
| edit_footage | Edit a video. Free. | drafts |
| render_thumbnail | Render a video thumbnail. Free. | drafts |
| demo_page | Record a product demo. Free. | drafts |
| render_carousel | Render a carousel. About $0.02 a call. | asks you first |
| speak | Turn text into speech. About $0.03 a call. | asks you first |
| caption_file | Make a subtitle file. Free. | drafts |
| plan_music | Generate a music bed. About $0.06 a call. | asks you first |
| write_song | Write a song with vocals. About $0.08 a call. | asks you first |
| probe_media | Inspect a video or audio file. Free. | reads |
| measure_reel | Measure a reference reel. About $0.053 a call. | asks you first |
| find_photo | Find a real photo. Free. | drafts |
| find_footage | Find stock footage. Free. | drafts |
| find_face | Find a person's photo. About $0.007 a call. | drafts |
| brand_mark | Find a brand's logo. About $0.007 a call. | drafts |
| web_search | Search the web. About $0.015 a call. | asks you first |
| read_page | Read a web page. About $0.006 a call. | reads |
| screenshot_page | Screenshot a web page. Free. | drafts |
| record_page | Film a web page. Free. | drafts |
| capture_tweet | Capture a post from X. Free. | drafts |
| list_page_assets | List a page's images and videos. Free. | reads |
| inspect_page_style | Read a site's brand style. Free. | reads |
| fetch_asset | Import a file from a URL. Free. | drafts |
| x_pulse | Ask what X is saying. About $0.25 a call. | asks you first |
| site_index | Count what a site publishes. Free. | reads |
| seo_profile | Measure a site in search and AI answers. About $0.081 a call. | asks you first |
| measure_text | Count copy against what already won. Free. | reads |
| read_repo | Read a GitHub repository. Free. | reads |
| product_hunt | Read a Product Hunt launch. Free. | reads |
| company_measures | Compare what we hold on companies. Free. | reads |
| company_pages | List a company's pages. Free. | reads |
| company_keywords | A company's keywords and AI prompts. Free. | reads |
| market_rank | Rank companies on a metric. Free. | reads |
| company_note_measures | Note what you measured about a company. Free. | drafts |
| news_search | Search the news. About $0.01 a call. | asks you first |
| concept_search | Search by meaning. About $0.007 a call. | reads |
| community_hot | What a community upvotes. Free. | reads |
| current_pulse | Measure talk on X. About $0.06 a call. | asks you first |
| related_trends | Find related trends. About $0.00001 a call. | reads |
| find_evidence | Find research evidence. About $0.001 a call. | reads |
| reference_search | Search posts that performed. About $0.00001 a call. | reads |
| reference_read | Read a post that performed. Free. | reads |
| linkedin_org_lookup | Find a LinkedIn company tag. Free. | reads |
The same account is driveable from a terminal or a script with a scoped API key: npx shapelessai --help, or the REST API documented in the public agent repo. Keys are minted under Settings → API keys.
