Modules
Live op list from GET /v1/catalog. Do not hand-maintain this page.
organisations
MCP pim_organisations. Org membership + invites + workspace access. No create/delete organisation.
{
"op": "list"
}list(read) — List orgs the key/user can seeget(read) — Get one organisationlist_members(read) — List org memberslist_invitations(admin) — List pending invitesinvite(admin) — Invite an emailcancel_invite(admin) — Cancel pending inviteremove_member(admin) — Remove an org memberget_workspace_access(admin) — Org workspace membership mapset_workspace_access(admin) — Replace-set member workspace roles
workspaces
MCP pim_workspaces. Workspaces + membership.
{
"op": "list"
}list(read) — List accessible workspacesget(read) — Get one workspacecreate(admin) — Create a workspacelist_members(read) — List workspace membersinvite_member(admin) — Invite a workspace memberremove_member(admin) — Remove a workspace member
skills
MCP pim_skills. Agent skills catalog.
{
"op": "list"
}list(read) — Search skill manifestget(read) — Load skill markdownfetch(write) — HTTPS fetch via helium-fetch
resources
MCP pim_resources. Resource types, list, grid, find-by-name, unique_values, query, create_type, create, update. Create seeds Resource.attrs JSON; published columns auto-enrich.
{
"op": "create",
"workspaceId": "<uuid>",
"resourceTypeKey": "blog",
"attrs": {
"title": "Hello",
"slug": "hello",
"body": "…"
}
}list_types(read) — List resource typeslist(read) — List resources (includes attrs)grid(read) — Grid rows with attrs + cells keyed by column keyfind(read) — Resolve names to idsunique_values(read) — Distinct attr/column valuesquery(read) — Filter + sort resourcescreate_type(write) — Create a workspace resource typecreate(write) — Create a resource with authored JSON attrsupdate(write) — Merge authored JSON attrs onto a resource
columns
MCP pim_columns. Prefer op=author (NL). Then publish/refresh. Use-case sets: namespaced keys ugc_video.script, ugc_video.video.
{
"op": "author",
"workspaceId": "<uuid>",
"resourceTypeId": "<uuid>",
"prompt": "SEO title from product title"
}list(read) — List columnsget(read) — Get one columnauthor(write) — NL draft a column. Namespaced keys for a use-case set: ugc_video.script.create(write) — Manual create escape hatchcreate_version(write) — Manual version escape hatchpublish(write) — Publish a draft versionrefresh(write) — Generate/refresh cells
jobs
MCP pim_jobs. Ops runs / progress / cancel / errors.
{
"op": "get_progress",
"workspaceId": "<uuid>",
"columnDefinitionId": "<uuid>"
}list_runs(read) — List column ops runsget_progress(read) — Poll fill progresscancel(write) — Cancel a running filllist_errors(read) — Failed cell errors
schedules
MCP pim_schedules. Workspace cron. column_refresh + meta.onlyMissing fills empty cells only (voice leads). Same as session /workspaces/:id/schedules.
{
"op": "create",
"workspaceId": "<uuid>",
"kind": "column_refresh",
"columnDefinitionId": "<uuid>",
"cron": "*/15 10-16 * * 1-5",
"timezone": "UTC",
"meta": {
"onlyMissing": true
}
}list(read) — List schedulesget(read) — Get one schedulecreate(write) — Create a scheduleupdate(write) — Update a scheduledelete(write) — Delete a schedule
cells
MCP pim_cells. Get or edit a cell. Edit only when the user asks.
{
"op": "get",
"workspaceId": "<uuid>",
"cellId": "<uuid>"
}get(read) — Read a celledit(write) — Manual cell override
assets
MCP pim_assets. Import HTTPS image to workspace CDN.
{
"op": "import",
"workspaceId": "<uuid>",
"sourceUrl": "https://example.com/a.png"
}import(write) — Import an image URL
connectors
MCP pim_connectors. Sources. Create/sync are writes.
{
"op": "list",
"workspaceId": "<uuid>"
}catalog(read) — Connector cataloglist(read) — List connectorsget(read) — Get one connectorcreate(admin) — Create a connectorshopify_status(read) — Shopify token readinesssync_runs(read) — List sync runsbindings(read) — List bindingssync(write) — Enqueue a synccancel(write) — Stop an in-flight sync
connector
MCP pim_connector. Live api/code/cdn on an active connector. list/describe are reads. api/code/cdn use the merchant token (write). Shopify + GitHub.
{
"op": "list",
"workspaceId": "<uuid>"
}list(read) — List agent-capable connectorsdescribe(read) — Describe surfaces, scopes, skillsapi(write) — Authenticated fetch (base URL + auth injected)code(write) — Codebase trees/list/read/write/search (GitHub also pr)cdn(write) — Upload to connector CDN
sandbox
MCP pim_sandbox. Named VM pim-ws-{workspaceId} with two GitHub remotes (/org + /workspace). Terminal exec, not fs_*. Helium site always in workspace/site. Hosting is optional Vercel Git deploy. One custom domain per workspace (op=domain, admin). Use hydrate/start to clone remotes (server injects git auth into that command). Never git clone via exec. Connector working copies: export_code onto /workspace/connectors/{id} (VM-only, gitignored). Flush via pim_connector code.
{
"op": "status",
"workspaceId": "<uuid>"
}status(read) — Sandbox + git remotes + preview/prod URLs + custom domain verificationstart(write) — getOrCreate VM, clone/pull remotes, npm install site/hydrate(write) — Clone/pull GitHub remotes with App token in git argv (not env). Start the VM if it is down. Do not git clone via exec.stop(write) — Stop the named VMexec(write) — Run a command jailed to /org or /workspace (mutating needs Approve)preview(read) — Sandbox next-dev preview URL for iframedeploy(admin) — Hydrate remotes, enable hosting, link Vercel Git, commit+push site/ (always Approve)domain(admin) — Add or replace the workspace custom hostname on the site Vercel project (omit/empty hostname to detach). Always Approve. Serves traffic only after a production Deploy.export_code(write) — Materialize a code-capable connector onto /workspace/connectors/{id} (always Approve). Gitignored. Flush via pim_connector code.
exports
MCP pim_exports. Output bindings. Flush is a write.
{
"op": "list",
"workspaceId": "<uuid>"
}list(read) — List bindingsget(read) — Get one bindingdeliveries(read) — Delivery logflush(admin) — Flush deliveries
generate
MCP pim_generate. Atomic text/json/image/video/audio/call/agent generations. workspaceId required. Optional resourceId for context only. call: template + phone, returns QUEUED immediately. audio: approved batch TTS/music model + prompt (never Bolna). Image knobs: aspectRatio, size, seed, count. list accepts q (label search). Never writes a cell.
{
"op": "image",
"workspaceId": "<uuid>",
"prompt": "Studio packshot on white",
"resourceId": "<uuid>",
"aspectRatio": "1:1"
}text(write) — Generate textjson(write) — Generate JSONimage(write) — Generate image(s)video(write) — Generate video (async)audio(write) — Generate batch audio / TTS (fal; never Bolna)call(write) — Queue a voice call (template + phone)agent(write) — Run a tool-loop agentlist(read) — List generationsget(read) — Get one generationcancel(write) — Cancel a running generation
voice_agents
MCP pim_voice_agents. Workspace-authored Bolna voice agents. Template for generate.call / column voiceTemplate is key or id (never Bolna agent id). Member/admin write; not available on generate_only keys.
{
"op": "create",
"workspaceId": "<uuid>",
"key": "demo_qualifier",
"name": "Demo qualifier",
"systemPrompt": "Qualify interest in a product demo."
}list(read) — List workspace VoiceAgentsget(read) — Get one by id or keycreate(write) — Create + provision on Bolnaupdate(write) — Update + re-provision when neededdelete(write) — Delete workspace VoiceAgent row
models
MCP pim_models. APPROVED catalog models + per-model invocation schema. Same data as session GET /accounts/:accountKey/models.
{
"op": "list",
"modality": "image"
}list(read) — List APPROVED modelsschema(read) — Safe invocation schema for one catalog entry
research
MCP pim_research. One-shot Apify runs (Pinterest / Meta ads / any actor). JSON items only — never writes a cell. Prefer this over skills.fetch for Apify (300s vs 30s).
{
"op": "pinterest",
"workspaceId": "<uuid>",
"queries": [
"niacinamide serum flat lay"
],
"limit": 12
}apify(write) — Run any Apify actorpinterest(write) — Pinterest search scrapermeta_ads(write) — Meta Ad Library scraper
keys
MCP pim_keys. Org API keys for /v1 (not /mcp). HTML mini-app: kind=publishable then pim_skills({ op: "get", skillId: "pim/js-client" }) — do not raw-fetch /v1. Curl: pim/http-api. create returns next hint + raw key once.
{
"op": "list",
"organisationId": "<id>"
}list(admin) — List org keysget(admin) — Get key metadatacreate(admin) — Mint a key (raw shown once). HTML: kind=publishable then load pim/js-client. Response includes next.revoke(admin) — Revoke a key