{"name":"Spaceback MCP Server","version":"1.0.0","transport":"StreamableHTTP","auth":"oauth","endpoints":{"mcp":"/mcp","health":"/health","skills":"/skills/"},"profile":"full","profileHint":"Append ?profile=streamlined to the /mcp URL for the streamlined toolset (default: full).","docsUrl":"https://spaceback.rembrand.com/tools/mcp-setup","skillsUrl":"https://spaceback-mcp.rembrand.com/skills/","skillsCatalogUrl":"https://spaceback-mcp.rembrand.com/skills/skills.json","skillsInstallCommand":"curl -fsSL https://spaceback-mcp.rembrand.com/skills/install.sh | SPACEBACK_SKILLS_BASE_URL=https://spaceback-mcp.rembrand.com/skills bash","skillsPackPath":"skills-pack","setup":{"claudeDesktop":{"file":"claude_desktop_config.json","config":{"mcpServers":{"spaceback":{"command":"npx","args":["-y","mcp-remote","https://spaceback-mcp.rembrand.com/mcp"]}}}},"nativeHttp":{"file":".mcp.json","config":{"mcpServers":{"spaceback":{"type":"http","url":"https://spaceback-mcp.rembrand.com/mcp"}}}}},"instructions":"Spaceback MCP helps agents work with Spaceback brands, social posts, and video creatives.\nEvery workspace action happens inside one organization. When the user names a workspace, call list-organizations with q set to that name and pass the matching id as organizationId (the list is capped and disclosed as truncated for accounts with many orgs — filter, do not scan). When they do not, the server uses their workspace preference: a pinned default org when set, the sole accessible org when they have exactly one, or needsOrganization when multiple orgs are ambiguous — never brand-history or list-order guessing. If a tool returns needsOrganization, ask the user to choose or point them to the MCP Setup page to pin a default.\nStart by calling list-brands, then choose existing media-ready source content with list-brand-recommended-posts. Unless the user names a post, URL, platform, or theme, you MUST use briefing.lead from list-brand-recommended-posts and present its rationale. If leadSource is composite_fallback, disclose that the briefing is not ready and you are using the top composite-scored fallback.\nUse list-brand-posts only as a chronological/browse inventory, not as a ranking or \"best post\" selector.\nNew brand from a domain: create-brand with brandUrl (SPA create path — Brandfetch/scrape identity + handles + eager hydrate). Poll show-brand until scrape_pending is false; if jobIds were returned poll show-import-job, else when social_handles appear call hydrate-brand-posts. Empty library on an existing brand: show-brand → hydrate-brand-posts when handles exist, else resolve-social-profile → browse-social-profile → import-social-post. Do not invent a source post.\nIf a client reports \"No approval received\" for browse/list tools, the human missed or declined the tool-approval prompt; ask them to approve and retry instead of treating it as an outage or routing around it.\nHydrates and imports are async. Poll show-import-job every 15–30s until done/failed, then list posts. For a chosen post, poll show-social-post until summary.mediaReady is true (can take several minutes).\nIf show-social-post reports mediaStatus.likelyStalled, stop polling that post and choose existing media-ready content instead.\nFor create-creative, omit brand-fit overrides and mediaKind unless you have explicit user input; the server inherits brand identity and derives mediaKind from source-post media.\nCustom / AI backdrops: list-ad-backgrounds, upload-ad-background (public image URL), or generate-ad-background (pass heroSourcePostId — server ffmpeg samples the durable hero; prefer this over the Ad Builder AI tab for TikTok heroes that time out in the browser). Poll get-ad-background until ready=true. Optional animate-ad-background (POST :id/video) for an MP4 — poll until videoReady. Pass adBackgroundId for the main plate and/or endCardAdBackgroundId for an end-card-only plate (generate/upload with slot:end_card). Omitting either id on update clears that plate. Pass endCardDurationSec for the end-card tail (default ~4.1s); it must leave the template at least 2s, so its cap is durationSec−2 — 13 on a default 15s ad.\ncreate-creative makes VIDEO creatives in two formats: \"vertical\" (9:16 social, layouts V01–V07) and \"horizontal\" (16:9 YouTube-style, layouts H01–H08). Default is vertical; pass format:\"horizontal\" for landscape. The variant must match the format. For DISPLAY (HTML5 banner) creatives use create-display-creative instead.\nAd LENGTH is durationSec on create-creative / update-creative — total seconds, default 15, same range as the app's own picker (6 / 15 / 30 or any custom length up to 120). socialDuration is only the engagement loop inside the ad and never changes how long the ad is. An ad under 3s cannot carry an end card at all — pass endCard:\"NONE\" for those.\ndurationSec sets how long the AD is; it does NOT shorten the hero. When the source post is longer than the ad, the hero is simply cut off mid-sentence — use Smart Clip: plan-clip (sourcePostId + targetDurationSec, returns trim strategies and a recommendedStrategyId; can take up to ~2 minutes), render-clip, poll get-clip until ready, then pass clipJobId to create-creative alongside the same durationSec. Keep sourcePostId set too — it still supplies caption/handle/counts. plan-clip tells you when the source already fits and no clip is needed. Prefer 15s or 30s ads: they carry the most CTV/OLV inventory, and Smart Clip is what makes a standard length work with an odd-length source.\nCreate video drafts with create-creative. Drafts are immediately reviewable through editInBuilder and are not rendered automatically.\nRevise a video draft with update-creative — it rebuilds the draft content in place (same id, still no render), so iterate for free until the user approves. Pass the full desired content each call, not just the changed field. It only works on never-rendered drafts; rendered creatives need a new draft or a render-creative re-render.\nOnly call render-creative after the user confirms the draft is ready to render.\nAfter render-creative, poll get-creative about every 30 seconds until status is done.\nNEVER hand out a rendered-file URL, and none of the tools return one: a presigned asset link needs no login, lasts 7 days and cannot be revoked. To let a human see a finished creative, share shareUrl (the revocable /p/share/c/ page — mint it with create-share-link) or point them at viewInUI / editInBuilder, where the download sits behind their own session. Display ZIPs are downloaded from viewInUI only.\ncreate-display-creative makes DISPLAY (HTML5 banner) creatives in every IAB preset size (300x250 default, 300x600, 320x480, 970x250, 336x280, 728x90, 250x250, 320x50, 160x600, 300x50 via the size arg — each builds its canonical Spaceback template on Instagram chrome). UNLIKE video, there is NO draft step: submitting enqueues the ad-server ZIP build immediately, so only call it once the user has confirmed the copy and brand fit. Then poll get-display-creative until status is \"done\" (packageReady true) and send the user to viewInUI to download the ad-server ZIP with their own session; editInBuilder is the live preview. Browse display creatives with list-creatives (kind \"display\"), and re-build one in place (retry a failed/stale build, or after source media changed) with update-display-creative. To change a display ad's copy or brand fit, open its editInBuilder in the Ad Builder.\nShare a finished creative with create-share-link: it returns a public /p/share/c/ preview URL that needs no login (the same link the Creatives UI copies). The page plays the watermarked render, so render first — on an unrendered draft the link resolves to an empty preview. The link is stable — calling it again returns the same URL; revoking or rotating a shared link is done in the app, not through MCP. Use resolve-share-link to check what an existing link points at, or to get the creative id back from a link.\nManage existing creatives with rename-creative (sets the display title) and delete-creative (removes it from the library — archives it). Both work for video and display creatives. Only call delete-creative after the user explicitly confirms; verify the id with list-creatives first.\nUse ids returned by this server. Resources from other workspaces are rejected or hidden.\nTeams organize creatives within an org: discover them with list-teams, pass teamId on create-creative when the org has multiple teams (or pin a default team on the MCP Setup page). A sole team resolves without asking; never invent a team from list order when multiple exist — if a tool returns needsTeam, ask the user. editInBuilder opens the creative in its team context.\nManual import (last resort, operator-driven): when import-social-post fails because a post needs a signed-in browser (private, login-walled, age-gated, region-blocked, a LinkedIn ad-review URL, or a Facebook Dynamic Creative URL — any facebook.com host carrying a dco_ad_token param, not just business.facebook.com) — capture it yourself and use the 3-step ladder: start-manual-social-upload, PUT the parts straight to S3 yourself, finish-manual-social-upload, then create-manual-social-post. Do NOT reach for it for ordinary imports. Media is required: a post with no importable media is terminal, so report it to the user instead of retrying. Unlike URL imports, create-manual-social-post BLOCKS until media is ready; a timeout returns a postId to poll and is not a failure.\nHuman setup docs are available at https://spaceback.rembrand.com/tools/mcp-setup.\nOptional agent skills (spaceback-router, onboard-brand, draft-creative, duplicate-creative, draft-display) cover brand cold-start, video ads (vertical and horizontal), duplicating an existing creative with a new hero, and display banner creatives. Install from MCP Setup.","tools":["create-creative","update-creative","render-creative","get-creative","list-creatives","rename-creative","delete-creative","create-share-link","resolve-share-link","create-display-creative","get-display-creative","update-display-creative","list-ad-backgrounds","get-ad-background","generate-ad-background","upload-ad-background","animate-ad-background","plan-clip","render-clip","get-clip","list-organizations","list-teams","list-brands","show-brand","show-brand-assets","create-brand","import-social-post","start-manual-social-upload","finish-manual-social-upload","create-manual-social-post","show-social-post","list-brand-posts","list-brand-recommended-posts","hydrate-brand-posts","show-import-job","link-social-post-brand","redetect-social-post-brand","resolve-social-profile","browse-social-profile"]}