API v1 · MCP — agents
MCP tool catalogue
The Scripe MCP server lists 35 tools for 116 operations: the 8 planning operations as tools of their own, 26 domain tools carrying the other 108, and describe_actions. A domain tool takes the operation as action and its arguments in arguments:
json
{ "name": "ideas_write", "arguments": { "action": "create_idea", "arguments": { "title": "Why most carousels fail" } } }Each operation keeps the name, arguments, scopes, rate bucket and behaviour of the flat tool of the same name — see MCP tools & contracts for every contract, and MCP §1.1 for how the catalogue is served. describe_actions returns an operation's full description and JSON input schema.
Tools listed by name
| Tool | Annotations | Summary |
|---|---|---|
get_planning_overview | readOnlyHint, idempotentHint | START HERE to plan Scripe content: the whole workspace calendar in ONE call. |
get_profile_planning_context | readOnlyHint, idempotentHint | everything you need to write good ideas and posts for Scripe profiles, in ONE bounded call: pass profileIds (up to 10 per call — every profile you are planning for, e.g. all with open slots from get_planning_overview) or one… |
preview_plan | readOnlyHint | step 1 of planning Scripe content into calendar slots, for one or many profiles in ONE call. |
commit_plan | idempotentHint | step 2 of Scripe planning: write a plan preview_plan returned, in ONE call, once the user has seen the plan and said yes (unless they asked you to plan without asking). |
draft_planned_posts | idempotentHint | step 3 of Scripe planning: turn ideas planned into slots into DRAFT posts in those same slots, many at once (up to 20). |
request_review | idempotentHint | send Scripe posts for REVIEW and assign the reviewer, many at once (up to 50): each post moves into the workspace's review stage with a pending review for that person, and the reviewer gets ONE notification for the whole batch. |
list_waiting_for_me | readOnlyHint, idempotentHint | what waits on YOU in this Scripe workspace: posts you are the assigned reviewer of (still in review, not yet on LinkedIn) and content questions sent to you that nobody has answered yet. |
get_planning_signals | readOnlyHint, idempotentHint | what is HAPPENING around Scripe profiles, for planning from evidence, in ONE bounded call (up to 10 profiles; omit profileIds for every profile you can reach). |
Domain tools
| Tool | Annotations | Operations |
|---|---|---|
workspace_read | readOnlyHint, idempotentHint | get_workspace, list_workspaces, list_projects, get_project, list_jobs, get_job, list_company_pages, get_workspace_context, list_team, get_usage |
workspace_write | openWorldHint | switch_workspace, create_upload_url, cancel_job |
posts_read | readOnlyHint, idempotentHint | list_posts, get_post, list_post_statuses, get_post_engagements |
posts_write | openWorldHint | create_post_draft, update_post, schedule_post, generate_post, attach_media_to_post, publish_post |
posts_delete | destructiveHint | delete_post, update_post_engagements |
ideas_read | readOnlyHint, idempotentHint | list_ideas, get_idea, list_for_you_ideas, get_for_you_idea |
ideas_write | create_idea, update_idea, schedule_idea, attach_media_to_idea, generate_post_ideas, save_for_you_idea, dismiss_for_you_idea | |
ideas_delete | destructiveHint | delete_idea |
calendar_read | readOnlyHint | list_notes, get_note, get_posting_times, list_calendar, get_next_free_slot, get_goals, list_calendar_slots |
calendar_write | create_note, update_note, update_posting_schedule, fill_calendar_slot | |
calendar_delete | destructiveHint, idempotentHint | delete_note |
knowledge_read | readOnlyHint, idempotentHint | get_source, list_knowledge, get_knowledge_doc, list_sources, search_knowledge, read_knowledge_document |
knowledge_write | openWorldHint | create_source_text, create_source_file, add_to_knowledge_base |
knowledge_delete | destructiveHint, idempotentHint | delete_knowledge_doc, delete_source |
media_read | readOnlyHint, idempotentHint | search_media |
media_write | create_media_asset, generate_image, generate_carousel | |
media_delete | destructiveHint, idempotentHint | delete_media_asset |
analytics_read | readOnlyHint, idempotentHint | get_analytics_overview, list_post_analytics, search_viral_posts, get_analytics_report, get_cross_workspace_analytics_overview, get_cross_workspace_analytics_report |
brand_read | readOnlyHint, openWorldHint | get_settings, get_engagement_policy, get_positioning, draft_positioning_from_website, get_personal_dna, list_content_topics |
brand_write | update_tone_of_voice, update_engagement_policy, update_positioning, update_global_tone_of_voice, update_personal_dna, create_content_topic, assign_content_topic | |
brand_delete | destructiveHint, idempotentHint | unassign_content_topic |
organize_read | readOnlyHint, idempotentHint | list_labels, list_posts_with_label, list_campaigns, get_campaign, list_content_questions, get_content_question |
organize_write | openWorldHint | create_label, update_label, update_post_labels, create_campaign, update_campaign, set_post_campaign, create_content_question, update_content_question, send_content_question, nudge_content_question, answer_content_question |
organize_delete | destructiveHint | delete_label, delete_campaign, delete_content_question |
community_read | readOnlyHint, idempotentHint | list_profile_lists, get_profile_list |
community_write | idempotentHint, openWorldHint | add_profile_to_list |
workspace_read
| Operation | Summary |
|---|---|
get_workspace() | the Scripe workspace this connection is currently acting against, including plan and the principal envelope (OAuth client + acting user, or API key). |
list_workspaces() | every Scripe workspace this connection can reach; for an OAuth connection, every workspace the consenting user belongs to plus every client workspace billed to an agency they own. |
list_projects(cursor?: string, limit?: int) | the Scripe projects (LinkedIn accounts, company pages and amplifiers) in the connected workspace, newest first. |
get_project(projectId?: string) | one Scripe project (a LinkedIn account, company page or amplifier) by id. |
list_jobs(type?: oneOrMany<POST_GENERATION|KB_INGEST_TEXT|KB_INGEST_FILE|KB_INGEST_URL|KB_INGEST_YOUTUBE|SOURCE_INGEST_FILE|IMAGE_GENERATION|CAROUSEL_GENERATION>, status?: oneOrMany<QUEUED|RUNNING|DONE|FAILED|CANCELLED>, dateFrom?: date, dateTo?: date, cursor?: string, limit?: int) | async Scripe jobs (generation, ingest, indexing) in the workspace, newest first. |
get_job(jobId: string) | one async Scripe job by id, including a live progress snapshot (percent + stage label) when the worker has reported one. |
list_company_pages() | every LinkedIn company page discovered or activated in the active Scripe workspace; the delta over list_projects: activation status, stored admin token health (as of last validation, never a live probe), follower count, and the activated… |
get_workspace_context() | one-call overview of the active Scripe workspace: plan + feature flags, whether the review workflow is required, and up to 25 projects with display name, type, stored LinkedIn connection health, and posting streak. |
list_team() | the active Scripe workspace's team members: display name, email, role (the label the dashboard shows: "Admin", "Member" or "Client"), avatar, join date, and the projects each member is individually assigned to. |
get_usage(projectId?: string) | what this Scripe workspace has used of its limits, and whether the next AI job would be accepted. |
workspace_write
| Operation | Summary |
|---|---|
switch_workspace(workspaceId: string) | change the active Scripe workspace for this connection. |
create_upload_url(contentType: string, maxSizeBytes?: int) | mint a presigned PUT URL for uploading bytes into Scripe directly. |
cancel_job(jobId: string) | cancel a queued Scripe job. |
posts_read
| Operation | Summary |
|---|---|
list_posts(projectId?: string, status?: oneOrMany<waitingProcessing|draft|waitingApproval|approved|rejected|published|scheduled|suggested>, statusCategory?: oneOrMany<suggested|draft|inProgress|review|scheduled|published>, statusId?: oneOrMany<string>, delivery?: oneOrMany<not_scheduled|scheduled|due|missed|published>, review?: oneOrMany<not_requested|pending|approved|rejected>, dateFrom?: date, dateTo?: date, publishedFrom?: date, publishedTo?: date, q?: string, content?: preview|full|none, cursor?: string, limit?: int) | the LinkedIn posts and drafts in a Scripe project, newest first. |
get_post(postId: string) | one Scripe post (a LinkedIn post or draft) by id — the full content, which list_posts only excerpts — including the media it will publish with — read that before attach_media_to_post, which is a full-state write — and the workspace… |
list_post_statuses(projectId?: string) | a Scripe project's content pipeline: every kanban column (draft / inProgress / review / scheduled / published categories) with postCount, how many posts sit in it right now. |
get_post_engagements(postId: string) | a Scripe post's team engagement timeline: the likes, comments and reposts queued to fire under OTHER brands' LinkedIn identities after the post goes live, plus availableActors — the workspace brands and company pages this post could… |
posts_write
| Operation | Summary |
|---|---|
create_post_draft(idempotencyKey?: string, projectId?: string, content?: string, title?: string, contentType?: PERSONAL|BUSINESS_INTERNAL|BUSINESS_EXTERNAL|EDUCATIONAL|UNKNOWN, scheduledFor?: string|null) | save the user's own text as a real LinkedIn post in a Scripe project: it lands with the project's posts (NOT on the idea board), ready to edit, schedule and publish. |
update_post(postId: string, content?: string, title?: string, contentType?: PERSONAL|BUSINESS_INTERNAL|BUSINESS_EXTERNAL|EDUCATIONAL|UNKNOWN, statusCategory?: suggested|draft|inProgress|review|scheduled|published, statusId?: string, scheduledFor?: string|null, autoLike?: bool, autoComment?: bool) | edit an existing Scripe LinkedIn post's content/title/contentType, change its custom status (by statusCategory or statusId), and/or UNSCHEDULE it via scheduledFor: null. |
schedule_post(postId: string, confirmationToken?: string, scheduledFor: string, autoLike?: bool, autoComment?: bool) | put an existing Scripe post on the calendar to go live on LinkedIn. |
generate_post(idempotencyKey?: string, projectId?: string, source: {type: text|note|topic|idea, text?: string, noteId?: string, topicId?: string, ideaId?: string}, scheduledFor?: string|null, options?: {language?: string, contentType?: PERSONAL|BUSINESS_INTERNAL|BUSINESS_EXTERNAL|EDUCATIONAL|UNKNOWN}, wait_for_completion?: bool) | THE way to write a LinkedIn post for the user ("write me a post about X"): Scripe drafts it in the profile's own voice — tone, voice samples, knowledge base — and saves it as a draft, from a brief (source.type: "text"), a note, a board idea or a source topic. Returns a Job to poll. |
attach_media_to_post(postId: string, media: {kind: images, images: ({source: key, key: string, alt?: string, name?: string}|{source: library, assetId: string, alt?: string})[]}|{kind: video, video: {key: string, alt?: string, name?: string, thumbnailKey?: string, title?: string}}|{kind: document, document: {key: string, alt?: string, name?: string, title?: string}}|{kind: none}) | set a Scripe post's media in one FULL-STATE write: it replaces whatever the post carried, so to add a second image read media from get_post first and send the existing entries alongside the new one. |
publish_post(projectId: string, postId: string, confirmationToken?: string) | publish a Scripe post to LinkedIn immediately. |
posts_delete
| Operation | Summary |
|---|---|
delete_post(postId: string, confirmationToken?: string) | PERMANENTLY delete a Scripe post — TWO-PHASE by design, and the only way to remove a post the user did not want. |
update_post_engagements(postId: string, add?: ({actorProjectId?: string, actorCompanyPageId?: string, engagementType: LIKE|COMMENT|REPOST, content?: string, reactionType?: LIKE|CELEBRATE|SUPPORT|LOVE|INSIGHTFUL|FUNNY, delayMinutes?: int})[], modify?: ({engagementId: string, actorProjectId?: string, actorCompanyPageId?: string, engagementType: LIKE|COMMENT|REPOST, content?: string, reactionType?: LIKE|CELEBRATE|SUPPORT|LOVE|INSIGHTFUL|FUNNY, delayMinutes?: int})[], remove?: string[]) | edit a Scripe post's team engagement timeline (add / modify / remove queued likes, comments and reposts), exactly what the post editor's team engagement panel does. |
ideas_read
| Operation | Summary |
|---|---|
list_ideas(projectId?: string, status?: inbox|in_production|review|done, limit?: int, cursor?: string) | a Scripe project's idea board, newest first: title, brief fields (pillar, post format, hook), the DERIVED workflow status (inbox | in_production | review | done), calendar placement, and whether the idea is waiting on someone's input. |
get_idea(projectId?: string, ideaId: string) | one idea from a Scripe idea board, in full: the creative brief (pillar, format, hook, topic), the capture evidence (angle, proven-idea stats, reference posts, origin), the idea's media (attached images / a carousel cover with img_…… |
list_for_you_ideas(projectId?: string, lane?: REACH|TRUST|CONVERT, sourceType?: topic|rss|youtube|website|linkedin_profile|chat_input, postType?: string, query?: string, saved?: all|unsaved|saved, limit?: int, cursor?: string) | the Scripe "For you" suggested post ideas (Explore → For you): ideas Scripe generated for a profile from trending LinkedIn topics, followed sources, the client's own results and knowledge base. |
get_for_you_idea(ideaId: string) | one Scripe "For you" idea in full: title, hook, angle, lane and format, the ARGUMENT for it with numbered markers, and every SOURCE it was built on — the origin item (article, video, followed profile, knowledge document) and each cited… |
ideas_write
| Operation | Summary |
|---|---|
create_idea(projectId?: string, title: string, content?: string, status?: inbox|in_production, pillar?: string, postType?: string, assetFormat?: string, hook?: string, topic?: string) | add an idea to a Scripe project's idea board, at the top of its column — exactly like creating a card on the board. |
update_idea(projectId?: string, ideaId: string, title?: string, content?: string, status?: inbox|in_production, pillar?: string|null, postType?: string|null, assetFormat?: string|null, hook?: string|null, topic?: string|null) | edit an idea's brief on a Scripe idea board: title, body, pillar, post format, visual format, hook, topic, and/or its workflow status. |
schedule_idea(projectId?: string, ideaId: string, scheduledFor: string|null) | place an idea on a DAY of a Scripe idea board's content calendar (or remove it with null) — planning only, fully reversible, no confirmation. |
attach_media_to_idea(projectId?: string, ideaId: string, media: {kind: images, images: {assetId: string}[]}|{kind: none}) | set a Scripe board idea's media in one FULL-STATE write: it replaces whatever the idea carried, so to add an image read media from get_idea first and send the existing img_… ids alongside the new one. |
generate_post_ideas(idempotencyKey?: string, projectId?: string, request: string, text?: string, knowledgeDocumentId?: string, count?: int, funnelStage?: REACH|TRUST|CONVERT) | turns material into LinkedIn post ideas in Scripe — the same suggested ideas the Scripe dashboard shows: each is saved to the brand's idea pool ("Suggested ideas for you" → "Your files") with a title, a hook, an angle and a brief that… |
save_for_you_idea(ideaId: string, projectId?: string, forAllSuitedProfiles?: bool) | the "Save" on a Scripe "For you" card: puts the idea on a profile's idea board with its brief, sources and template, exactly as the dashboard does. |
dismiss_for_you_idea(ideaId: string, restore?: bool) | "Not interested" on a Scripe "For you" card: hides the idea for EVERY profile it suits and teaches Scripe to stop suggesting similar ideas. |
ideas_delete
| Operation | Summary |
|---|---|
delete_idea(projectId?: string, ideaId: string, confirmationToken?: string) | PERMANENTLY delete an idea from a Scripe idea board, and everything attached to it (assignments, sources, activity, labels, post links, input requests — recipients' public answer links stop working). |
calendar_read
| Operation | Summary |
|---|---|
list_notes(projectId?: string, folderId?: string|null, dateFrom?: date, dateTo?: date, q?: string, cursor?: string, limit?: int) | the notes in a Scripe project, newest first. |
get_note(noteId: string) | one Scripe note by id (the short-form thoughts that seed LinkedIn posts). |
get_posting_times(projectId: string, days?: int, timeZone?: string) | when this Scripe project's LinkedIn posts perform best: the user's OWN posting-time buckets (per hour of day and per weekday×hour) with post counts, impressions, and engagement, aggregated over a lookback window. |
list_calendar(projectId: string, from: date, to: date, timeZone?: string) | a Scripe project's LinkedIn content calendar for a date range: scheduled and planned posts (with workflow status and any last publish error), note slots, idea placements, and the recurring posting-time template. |
get_next_free_slot(projectId: string) | the next free LinkedIn posting slot for a Scripe project, from its posting-time template (falls back to 09:00 on the first open day when no template is configured). |
get_goals(projectId?: string, period?: previous|current|next) | Scripe's posting GOALS and progress, as the dashboard's goal tile shows them: per profile the goal period (the workspace's planning cycle, 1–12 weeks), the weekly post goal, the lane mix, and per lane (REACH / TRUST / CONVERT) the target,… |
list_calendar_slots(projectId?: string, from?: date, to?: date, days?: int, period?: previous|current|next, weeksAhead?: int, onlyEmpty?: bool) | a Scripe profile's PLANNED posting slots ahead, by day: every posting time of its schedule with the content lane the posting goal gives it (REACH / TRUST / CONVERT), the time in the profile's zone, a pillar hint, and its state — empty,… |
calendar_write
| Operation | Summary |
|---|---|
create_note(idempotencyKey?: string, projectId?: string, content?: string, folderId?: string|null, date?: string, contentType?: PERSONAL|BUSINESS_INTERNAL|BUSINESS_EXTERNAL|EDUCATIONAL|UNKNOWN) | add a note to a Scripe project. |
update_note(noteId: string, content?: string, folderId?: string|null) | edit an existing Scripe note's body and/or folder. |
update_posting_schedule(projectId: string, confirmationToken?: string, slots: ({time: string, days: (sunday|monday|tuesday|wednesday|thursday|friday|saturday)[]})[], timeZone?: string, weekStartsOn?: sunday|monday) | set a Scripe project's RECURRING LinkedIn posting-time template - the weekly slots get_next_free_slot suggests from and the calendar draws as open. |
fill_calendar_slot(projectId?: string, slotAt: string, content?: string, title?: string, postId?: string, ideaId?: string, forYouIdeaId?: string, campaignId?: string) | put a post into one planned Scripe posting slot as a DRAFT (never scheduled to LinkedIn). |
calendar_delete
| Operation | Summary |
|---|---|
delete_note(noteId: string, permanent?: bool, confirmationToken?: string) | remove a Scripe note. |
knowledge_read
| Operation | Summary |
|---|---|
get_source(sourceId: string) | one Scripe source (a transcribed long-form input for LinkedIn drafting) by id. |
list_knowledge(projectId?: string, folderId?: string, cursor?: string, limit?: int) | the Scripe knowledge-base documents visible to a project, newest first: the project's own documents plus workspace-wide documents (0 assignments = visible to all projects). |
get_knowledge_doc(projectId?: string, documentId: string) | one Scripe knowledge document: metadata, processing status, tags, the chunk count, and a text preview capped at 2,000 characters — the full body is never returned over the API. |
list_sources(projectId?: string, cursor?: string, limit?: int) | a Scripe project's sources (transcribed long-form inputs for LinkedIn drafting), newest first: name, status, duration, and a 2 KB transcript preview per row. |
search_knowledge(query: string, projectId?: string, folderId?: string, documentIds?: string[], limit?: int) | search a Scripe profile's knowledge base by MEANING: the passages most relevant to a topic, from uploaded documents, synced Drive / GitHub files, Granola meeting notes and the profile's own post history. |
read_knowledge_document(documentId: string, projectId?: string, maxCharacters?: int) | read ONE Scripe knowledge-base document in full (a Granola meeting, an uploaded file, a synced Drive or GitHub file), in order, up to maxCharacters (default 12,000, at most 24,000). |
knowledge_write
| Operation | Summary |
|---|---|
create_source_text(idempotencyKey?: string, projectId?: string, text: string, name?: string|null) | create a Scripe source (long-form input for LinkedIn drafting) directly from caller-supplied text. |
create_source_file(idempotencyKey?: string, projectId?: string, uploadId?: string, content_base64?: string, sha256?: string, mimeType?: string, filename?: string, name?: string|null) | asynchronous ingest of an audio / video / pdf / image / docx file into Scripe as a source for LinkedIn drafting. |
add_to_knowledge_base(idempotencyKey?: string, type: text|file|url|youtube, projectId?: string|null, name?: string, text?: string, uploadId?: string, content_base64?: string, sha256?: string, mimeType?: string, filename?: string, url?: url) | asynchronous ingest into the Scripe knowledge base. |
knowledge_delete
| Operation | Summary |
|---|---|
delete_knowledge_doc(projectId: string, documentId: string, confirmationToken?: string) | PERMANENTLY delete a Scripe knowledge-base document. |
delete_source(sourceId: string, confirmationToken?: string) | PERMANENTLY delete a Scripe source (a transcribed long-form input) — TWO-PHASE by design. |
media_read
| Operation | Summary |
|---|---|
search_media(projectId?: string, query?: string, source?: UPLOAD|LINKEDIN_SYNC|GENERATED, cursor?: string, limit?: int) | search a Scripe project's reachable media-library images (owned or profile-assigned), READY only, newest first. |
media_write
| Operation | Summary |
|---|---|
create_media_asset(projectId?: string, content_base64?: string, sha256?: string, uploadId?: string, fileName?: string, mimeType?: string, alt?: string, title?: string) | add the user's OWN image to a Scripe project's media library — send the bytes inline as content_base64 (small files only, ~3 MB decoded max — larger requests die at the platform edge as a bare 413), or pass an uploadId from… |
generate_image(idempotencyKey?: string, projectId: string, kind: PHOTO|PHOTO_EDIT|IMAGE_EDIT, promptAsset?: string, subject?: string, steer?: string, referenceMode?: style|replicate, referenceMediaIds?: string[], subjectMediaIds?: string[], baseMediaId?: string, wait_for_completion?: bool) | AI-generate a raster image into a Scripe project's media library. |
generate_carousel(idempotencyKey?: string, projectId: string, topic: string, steer?: string, outline?: string, templateId?: string, wait_for_completion?: bool) | AI-generate a multi-slide LinkedIn carousel into a Scripe project's media library: the model storyboards the deck, writes every slide in the project's own voice, generates any imagery the design calls for, stamps the project's brand… |
media_delete
| Operation | Summary |
|---|---|
delete_media_asset(mediaId: string, confirmationToken?: string) | remove an image from a Scripe project's media library — TWO-PHASE by design, and the undo for a create_media_asset or generate_image the user did not want. |
analytics_read
| Operation | Summary |
|---|---|
get_analytics_overview(projectId?: string, dateFrom?: date, dateTo?: date) | current vs previous-period LinkedIn analytics rollup for one or more Scripe projects: post count, impressions, engagement rate, follower growth, and posting activity. |
list_post_analytics(projectId?: string, postId?: oneOrMany<string>, dateFrom?: date, dateTo?: date, limit?: int, offset?: int, sort?: recent|impressions|engagement, content?: preview|full|none) | per-post LinkedIn analytics (views, likes, comments, shares, engagement rate) for posts already LIVE on LinkedIn, for one or more Scripe projects. |
search_viral_posts(projectId?: string, query: string, sortBy?: relevance|engagement|recent, language?: all|english|german, minEngagement?: int, minOutlierMultiplier?: number, mediaFormats?: (carousel|multi_image|image|video|text|article|other)[], publishedWithinDays?: int, limit?: int) | semantic search over Scripe's inspiration feed for high-performing LinkedIn posts relevant to a topic. |
get_analytics_report(projectId?: string, dateFrom?: date, dateTo?: date, currency?: USD|EUR|GBP, cpm?: number) | the full LinkedIn analytics report for one or more Scripe projects over a date range: executive summary (posts, impressions, likes/comments/shares, engagement rate, follower growth, earned media value), per-author performance, the top… |
get_cross_workspace_analytics_overview(workspaceId?: oneOrMany<string>, dateFrom?: date, dateTo?: date) | the Scripe LinkedIn analytics rollup (posts, impressions, engagement rate, follower growth, posting activity) for EVERY workspace this connection can reach, in ONE call. |
get_cross_workspace_analytics_report(workspaceId?: oneOrMany<string>, dateFrom?: date, dateTo?: date, currency?: USD|EUR|GBP, cpm?: number) | the full Scripe LinkedIn analytics report (executive summary, earned media value, per-author performance, top posts, daily engagement series, follower timeline) for every workspace this connection can reach, one report per workspace under… |
brand_read
| Operation | Summary |
|---|---|
get_settings(projectId?: string) | a Scripe project's curated settings: generation-context knobs (language, formality, post length / formatting / emoji preferences), the project tone-of-voice fields (custom instructions, CTAs, footer, emoji + bullet symbols), the… |
get_engagement_policy(projectId?: string) | a Scripe project's engagement-policy defaults (auto-like / comment / reshare: OFF | REQUEST | ON), per-requester overrides, whether engagement CAN be enabled (stored LinkedIn-connection state — no live probe), and the plan-lock state. |
get_positioning(workspaceId?: string) | reads a Scripe workspace's Positioning: the COMPANY document (what the company does and for whom, mission, vision, core statements, promised results, and the website it was synced from), the TARGET-AUDIENCE document, and the GLOBAL… |
draft_positioning_from_website(workspaceId?: string, url: string, language?: english|german) | is Scripe's website sync: it reads a company's own website and DRAFTS the workspace's positioning from it — company description, mission, vision, core statements, audience line, promised results, and the target-audience document. |
get_personal_dna(projectId?: string) | reads a Scripe profile's positioning — the PERSON document of the content strategy (dashboard: knowledge base → profile folder → Positioning; "You" on the Strategy card): who the author is (intro), their credibility points, their… |
list_content_topics(workspaceId?: string, profileId?: string) | lists a Scripe workspace's content topics (the dashboard calls them TOPIC GROUPS / Themen — the list under Settings → Organization → Positioning) and, for each, the people/brands it is assigned to. |
brand_write
| Operation | Summary |
|---|---|
update_tone_of_voice(projectId: string, confirmationToken?: string, language?: string, germanFormality?: du|sie, postLengthPreference?: short|standard|long|1|2|3, formattingPreference?: short|standard|long|3|0|2, emojiPreference?: none|moderate|frequent|1|3|5, customInstructions?: string, customInstructionsEnabled?: bool, ctas?: string, footer?: string, footerEnabled?: bool, emojis?: string[], bulletSymbols?: string[]) | update a Scripe project's PROJECT-LEVEL tone-of-voice and generation settings - TWO-PHASE by design. |
update_engagement_policy(projectId: string, confirmationToken?: string, likeDefault: OFF|REQUEST|ON, commentDefault: OFF|REQUEST|ON, reshareDefault: OFF|REQUEST|ON) | set a Scripe project's engagement-policy defaults (auto-like / comment / reshare) - TWO-PHASE by design, and DIRECTION-RESTRICTED: this surface can set OFF or REQUEST only; turning a policy fully ON (autonomous engagement under this… |
update_positioning(workspaceId?: string, companyDescription?: string, mission?: string, vision?: string, statements?: string, audienceLine?: string, results?: string, websiteUrl?: string, targetAudience?: string, overwrite?: bool, confirmationToken?: string) | writes a Scripe workspace's Positioning documents (company description, mission, vision, statements, audience line, results, website; and the separate target-audience document). |
update_global_tone_of_voice(workspaceId?: string, customInstructions?: string, customInstructionsEnabled?: bool, footer?: string, footerEnabled?: bool, allowPersonalBrandCustomInstructions?: bool, overwrite?: bool, confirmationToken?: string) | writes a Scripe workspace's organization-wide tone of voice (custom instructions, footer, per-brand instruction policy). |
update_personal_dna(projectId: string, intro?: string, credibility?: string, opinions?: string, stories?: string, overwrite?: bool, confirmationToken?: string) | writes a Scripe profile's positioning (the person document: intro, credibility, opinions, stories — list sections one entry per line). |
create_content_topic(idempotencyKey?: string, workspaceId?: string, title: string, searchTerm?: string|null, profileIds?: string[]) | adds a content topic (the Scripe dashboard calls it a TOPIC GROUP) to a Scripe workspace — one of the themes the workspace wants to be known for on LinkedIn, which Scripe mines the LinkedIn corpus around and builds post ideas from. |
assign_content_topic(workspaceId?: string, topic: string, profiles: string[]) | assigns an existing Scripe content topic (the dashboard's TOPIC GROUP / Thema, Settings → Organization → Positioning) to one or more people/brands, so Scripe builds their post ideas around it. |
brand_delete
| Operation | Summary |
|---|---|
unassign_content_topic(workspaceId?: string, topic: string, profiles: string[]) | removes a Scripe content topic (the dashboard's TOPIC GROUP / Thema) from one or more people/brands, so it no longer steers their post ideas. |
organize_read
| Operation | Summary |
|---|---|
list_labels(workspaceId?: string) | list every label of the Scripe workspace (the post labels managed under Settings → Labels), with each label's colour, description and label group. |
list_posts_with_label(workspaceId?: string, labelId: string, projectId?: string, limit?: int, cursor?: string) | list the Scripe posts that carry one label, newest first, across every profile the user can access (or one profile with projectId). |
list_campaigns(workspaceId?: string, status?: (draft|active|completed|archived)[]) | list the Scripe workspace's campaigns (the Campaigns page): title, emoji, status, start and end dates, the profiles each is narrowed to (none = workspace-wide), labels and post count. |
get_campaign(workspaceId?: string, campaignId: string) | one Scripe campaign in full: its brief (summary + description), dates, status, labels, the profiles it is narrowed to with each profile's progress as the home page's campaign tile shows it (posted / scheduled / in progress / no post yet),… |
list_content_questions(projectId?: string, ideaId: string) | the content questions of one Scripe idea (the idea page's Questions rail): each question's text, status (draft / scheduled / sent / answered) and who it is for. |
get_content_question(projectId?: string, ideaId: string, questionId: string) | one content question of a Scripe idea in full: text, why it is asked, status, assignment, every recipient with their status (pending / answered …, and when they were last reminded) and every answer. |
organize_write
| Operation | Summary |
|---|---|
create_label(workspaceId?: string, title: string, color?: string, description?: string, labelGroupId?: string) | create a new label in the Scripe workspace, the same label the dashboard's Settings → Labels page creates. |
update_label(workspaceId?: string, labelId: string, title?: string, color?: string, description?: string, labelGroupId?: string|null) | rename, recolour or re-describe a Scripe label, or move it into (or out of, with labelGroupId: null) a label group. |
update_post_labels(workspaceId?: string, postIds: string[], add?: string[], remove?: string[], replace?: string[]) | apply labels to Scripe posts or take them off, on ONE or MANY posts in one call (up to 50). |
create_campaign(workspaceId?: string, title: string, emoji?: string, summary?: string, description?: string, status?: draft|active|completed|archived, startDate: string, endDate: string, profileIds?: string[], labelIds?: string[]) | create a campaign in the Scripe workspace: a title, start and end date, and optionally an emoji, a one-line summary, the brief (description — what the posts should say), a status (default draft), the profiles it is for (profileIds;… |
update_campaign(workspaceId?: string, campaignId: string, title?: string, emoji?: string, summary?: string, description?: string, status?: draft|active|completed|archived, startDate?: string, endDate?: string, profileIds?: string[], labelIds?: string[]) | change a Scripe campaign: title, emoji, summary, brief (description), status, dates, the profiles it is narrowed to (profileIds REPLACES the set; [] = workspace-wide) or its labels (labelIds REPLACES the set). |
set_post_campaign(workspaceId?: string, postIds: string[], campaignId: string|null) | put one or many Scripe posts (up to 50) into a campaign, or take them out with campaignId: null. |
create_content_question(projectId?: string, ideaId: string, question: string, why?: string, placeholder?: string, profileIds?: string[], respondentUserIds?: string[], addToCheckIn?: bool) | add a content question to a Scripe idea: something the post needs from a person (a detail, a number, a story). |
update_content_question(projectId?: string, ideaId: string, questionId: string, question?: string, why?: string|null, placeholder?: string|null, profileIds?: string[], respondentUserIds?: string[]) | edit a Scripe content question's text, why, placeholder, or who it is for (profileIds / respondentUserIds REPLACE the assignment). |
send_content_question(projectId?: string, ideaId: string, questionId: string, when: now|next_check_in|at, sendAt?: datetime, timezone?: string, confirmationToken?: string) | send a Scripe content question to the people it is assigned to: when: "next_check_in" adds it to the next content check-in, "at" schedules it (sendAt + timezone), "now" sends it immediately by the people's channels (app, email …). |
nudge_content_question(projectId?: string, ideaId: string, questionId: string, recipientId: string) | remind a person who has not answered a Scripe sent content question; the reminder re-sends their open check-in. |
answer_content_question(projectId?: string, ideaId: string, questionId: string, answer: string, recipientId?: string) | answer a Scripe content question that was sent to the signed-in user THEMSELF (only the respondent can answer; nobody answers on someone else's behalf). |
organize_delete
| Operation | Summary |
|---|---|
delete_label(workspaceId?: string, labelId: string, confirmationToken?: string) | PERMANENTLY delete a Scripe label. |
delete_campaign(workspaceId?: string, campaignId: string, confirmationToken?: string) | PERMANENTLY delete a Scripe campaign with its attachments and comments. |
delete_content_question(projectId?: string, ideaId: string, questionId: string, confirmationToken?: string) | delete a content question from a Scripe idea. |
community_read
| Operation | Summary |
|---|---|
list_profile_lists(projectId?: string, includeArchived?: bool) | returns the Scripe community profile lists of one brand — the named watchlists of LinkedIn people whose posts Scripe collects, shown under Community → Profiles in the Scripe dashboard. |
get_profile_list(listId: string) | returns one Scripe community profile list with the LinkedIn people on it — name, headline, profile URL, the note whoever added them left, and whether Scripe has collected any of their posts yet. |
community_write
| Operation | Summary |
|---|---|
add_profile_to_list(idempotencyKey?: string, listId: string, profile: string, note?: string|null) | adds one LinkedIn person to a Scripe community profile list, so Scripe starts collecting their posts for the customer to read and engage with under Community → Profiles. |