Skip to content

MCP Tools

All internal file and asset interactions must use MCP tools: do not use HTTP endpoints for Runnit files or assets.

Two user-scoped credential types work with every tool: short-lived MCP session tokens (mcps_...) from Agent Connectivity, and long-lived per-user API keys (rnk_...) from Admin → API Keys. See API Keys & Authentication.

Runnit supports two ways to present the credential:

  1. External MCP clients (Claude Code, Codex CLI, Gemini CLI, Cursor, VS Code Copilot Agent mode, generic streamable HTTP clients) send it once as an Authorization: Bearer ... header. In this mode, tool calls omit apiKey.
  2. Payload-based workflows that cannot set per-server MCP headers. In this mode, every tool call must include the apiKey argument taken from the workflow input payload.

The credential is an opaque string prefixed with mcps_ (session token) or rnk_ (API key). Treat it as a secret: do not parse or split it. It reflects the owning user’s permissions, resolved live on every call. Session tokens are short-lived, so payload-based workflows should always read the current apiKey from this run’s input rather than reusing a previous token.

Given this input:

{
"apiKey": "mcps_9f2c8a1b...",
"jobCollectionId": "91c52864-fd2b-4732-9f53-fd6d28606482"
}

A payload-based tool call must include the actual token value:

{
"tool": "read_file",
"arguments": {
"apiKey": "mcps_9f2c8a1b...",
"collectionId": "3e7c3220-7f08-4754-8f8c-d93ca946eb3d",
"fileName": "brand_guidelines.md"
}
}

A read may legitimately return fewer items, or an empty/forbidden result, if the connected user lacks permission. That is expected behaviour, not an error to retry.

  • Project management (read): projects, tasks, comments, schedules, milestones, costs, clients, users, jobs, briefs, project history. See Reading Data.
  • Write tools: create and update projects, tasks, milestones, briefs, staff, clients, rate cards, and collections. See the write tools section below.
  • Files & assets: create, update, read, list, link, unlink, search, delete.
  • DAM discovery: search_assets (hybrid semantic + structured search) and find_similar_clients (brand/tone-of-voice similarity).
  • Generation: image and video generation/editing.
  • Web: scrape_url, crawl_website.
  • Complete REST API coverage: call_public_api for documented /api/v1 operations that do not have a dedicated MCP tool.

User-authored components run in a sandbox and may call only a read-only subset of tools; they cannot use write, generation, scraping, build, or conversation tools.

Use call_public_api when you need a documented public API operation that has no dedicated MCP tool. This includes operations such as board and workflow stage management, report exports, closure dates, master project changes, saved views, permission administration, asset folders, tags and versions, and user imports.

Prefer a named MCP tool when one exists. Named tools have smaller schemas and responses designed for AI clients. call_public_api is the complete-coverage fallback and follows the relevant REST API reference.

ArgumentUse
methodGET, POST, PUT, PATCH, or DELETE. It defaults to GET.
pathThe path after /api/v1, beginning with one slash. For example, /organizations/<organisation-id>/boards.
queryOptional query values. Arrays create repeated query parameters.
bodyOptional JSON request body. Do not use it with multipart.
multipartOptional form fields and base64-encoded files for upload endpoints. Do not use it with body.
acceptOptional response media type.
confirmRequired as true for every non-GET request.

For example, list an organisation’s boards:

{
"method": "GET",
"path": "/organizations/<organisation-id>/boards"
}

To change data, review the matching API reference first and confirm the call:

{
"method": "PATCH",
"path": "/projects/<project-id>",
"body": {
"name": "Updated project name"
},
"confirm": true
}

The result includes the HTTP status and response body. JSON is returned in data, text and CSV in text, and other binary content in bodyBase64 with encoding: "base64". Request and response bodies are limited to 25 MiB, and the request times out after 60 seconds. Redirects are returned without being followed.

The public API still applies the connected user’s current permissions, organisation binding, client assignments, resource grants, validation, rate limit, and audit attribution. An MCP session token cannot authenticate the REST API directly. The tool performs the authorised bridge call on its behalf.

Omit the model argument from generate_image, edit_image, generate_video, and generate_video_from_image unless you have a specific supported model ID. Runnit selects the configured model for that capability and normalises supported friendly names.

Generation follows the active organisation’s AI billing mode. A credit organisation needs enough balance for the estimated request. An own-key organisation needs its fal.ai credential under Admin → AI API Keys and never falls back to a platform key. See AI Credits for the organisation workflow.

Collections can organise files into folders. File tools address folders with a folderPath argument: a slug path such as /campaign-assets/q3. Display names also work ("Campaign Assets/Q3" is normalised to the same path), and paths are matched case-insensitively.

  • list_files returns folders (the file’s folder paths) and primaryFolder for every file (folders is empty for files at the collection root), and accepts an optional folderPath argument to list only that folder.
  • read_file accepts an optional folderPath to pick the right file when the same name exists in more than one folder. Without it, the most recently updated match anywhere in the collection is returned; the response includes folders and primaryFolder so you can see which one you got.
  • create_or_update_file accepts an optional folderPath to file the document into a folder, creating missing folders automatically. With a folderPath, only a same-named file in that folder is updated; same-named files elsewhere in the collection are left alone.
  • save_asset_to_collection accepts an optional folderPath to file the copy into a folder of the target collection.

Results only include files the connected user can read: private files never appear in listings.

The server exposes write tools that create and change Runnit data. Every write tool enforces the connected user’s live permissions, so a call fails when the user lacks the required access in the app.

ToolPurposeRequired access
create_projectCreate a project. Optional workflowStage (stage id or name, draft-category only) chooses the entry stage, for example a pipeline’s Enquiry. A successful result contains a read-after-write verified project and canonical projectUrl. Use projectUrl verbatim in user-facing links. If verification fails, do not invent a URL and retry only when retryable is true.Project creation
update_projectUpdate a project’s fields. Cannot set the status to archived (archiving happens in the app), and archived projects reject writes.Project update
delete_projectDelete a project and everything in it. Destructive.Project deletion
create_milestone / update_milestone / delete_milestoneManage project milestones. update_milestone also takes an achieved flag: true marks the milestone achieved and stops its due and overdue notifications, false reopens it. You do not need to do this before closing a project, because moving a project to done or completed closes out its open milestones for you. delete_milestone is destructive.Project update
ToolPurposeRequired access
create_taskCreate a task in a project. Only name is required; assignment, estimate, and planned start are optional. A schedule is built only when plannedStartDate is supplied. Dependencies are validated before the task is saved. A dependency or schedule failure does not retain the new task, so the call can be retried without creating a duplicate.Task creation; task assignment when choosing an assignee; task-wide update plus schedule management when adding dependencies
update_taskUpdate task fields. A start creates or rebuilds the schedule and moves a pending backlog task to scheduled. An estimate change on a task with a day-by-day breakdown keeps the planned window and rescales the daily hours when the new total fits it; otherwise the schedule rebuilds from the start. An estimate-only or assignment-only change keeps an undated task unscheduled; reassignment moves any existing schedule ownership. The result includes task and its pre-change previousTask snapshot for follow-up edits or reversals.Assigned-task or task-wide update for general fields; task assignment for reassignment; task-wide update plus schedule management for dates and estimates
update_task_statusChange status and optional whole-number progress using the same start, completion, reset, cancellation, and reopen rules as the app. Completion can include actual hours and notes. The result includes task and its pre-change previousTask snapshot.Assigned-task update, project ownership, or task-wide update access
delete_taskDelete a task. Destructive.Task deletion or project owner/admin override
create_task_commentAdd a comment to a task. Comments post into the task’s chat thread, so they notify the assignee, project owner, and other participants, and can be replied to in the app.Task comments
involve_userPull a person into a task or project: posts a message into its chat thread with an @mention of them, so they are notified with a link and can reply there. Provide exactly one of taskId or projectId. Fails if the person cannot already see the work.Task comments (tasks) or project view (projects); the mentioned person needs access to the project
post_project_notePost a note into a project’s chat thread authored as Ru rather than as the acting user. Meant for a durable record of assumptions, decisions, and trade-offs made while working on the user’s behalf. Fails on archived projects.Project view; the acting user must be able to post in the project’s chat
set_task_table_valuesSet custom table-column values on a task. Values are validated against the project’s effective columns; use list_table_columns first for keys, types, and dropdown option keys.Project owner, project admin, or organisation manager
create_table_columnCreate a custom table column on a project, or at client/organisation scope so it appears on every matching project. Supports all eight column types and the optional settings.ai block that makes it an AI-filled column.Project owner, project admin, or organisation manager; shared scopes also need the shared table columns permission
fill_table_columnRun the AI fill for a column with an enabled ai block. Targets specific taskIds, only empty cells (onlyEmpty), only cells whose task inputs and instruction changed (onlyStale), or every task (max 100). Values are validated like manual input and stamped with per-cell provenance.Project owner, project admin, or organisation manager
set_task_allocationsReplace a task’s day-by-day hour breakdown (manual schedule mode). Sets the planned window to the allocation dates and rebuilds schedule segments. Prefer create_task or update_task with estimatedHours for automatic scheduling.Task-wide update plus schedule management, or project owner/admin override
set_task_dependenciesReplace a task’s finish-to-start dependency list (same project, max 25, cycles rejected). The task and its transitive dependents are forward-shifted through the scheduler; returns the cascade summary. create_task also accepts dependsOn directly.Task-wide update plus schedule management, or project owner/admin override

plannedEndDate is calculated from planned start and estimated hours. Do not send it to update_task.

When a scheduled create_task call omits estimatedHours, Runnit uses one day from the organisation’s Daily capacity setting, with 8 hours as the fallback. Name-only tasks return an empty scheduleSegments array.

ToolPurposeRequired access
block_out_datesMark a date range (inclusive, up to 366 days) as unavailable for a user, with an optional type (leave, appointment, other) and reason. Optional hoursUnavailable (greater than 0, less than 24) makes the block partial: that many hours per day are unavailable and the scheduler books at most the remaining capacity; omit it for whole days. Partial blocks on the same day stack, and hours at or above the organisation’s daily capacity block the whole day. To express “hours available”, subtract from the daily capacity first. When conflicting work is booked on the dates, resolution decides the outcome: flag (the default) leaves the bookings in place and raises conflict warnings; replan refits work to the remaining hours and moves the excess to the next available working days, cascading dependants. The response includes the conflict or replan report; surface it to the user, and never choose replan without their explicit confirmation.Own dates: any member. Another user’s dates: schedule management
update_blocked_datesChange an existing blocked-dates entry by blockId: move or resize the range, change the type or reason, or adjust hoursUnavailable (a number sets partial hours, null converts the entry to whole days, omitting leaves it unchanged). Only days the change makes stricter (newly covered, newly whole-day, or increased partial hours) re-run the conflict flow with the same resolution choice; loosening or shrinking never moves scheduled work. Never choose replan without the user’s explicit confirmation.Own entries: any member. Another user’s entries: schedule management
remove_blocked_datesDelete a blocked-dates entry by blockId, freeing that capacity. Removing a block never pulls already-scheduled work earlier; replan tasks explicitly if the freed days should be used.Own entries: any member. Another user’s entries: schedule management

The matching read tool is get_blocked_dates. See Reading Data.

ToolPurposeRequired access
update_brief_draftReplace the draft markdown of a Brief Builder session. The new draft appears in the owner’s open Brief Builder tab.Brief editing; session owner or organisation admin
ToolPurposeRequired access
list_boardsList visible kanban boards with their columns and stage mappings.Organisation membership
list_workflow_stagesList the organisation’s workflow stages and categories.Organisation membership
create_boardCreate a board from named columns; missing stages are created with a category in the same step. Optional members (ids or emails) and memberGroups (group ids, slugs, or exact names) limit the board to those people and groups. Optional taskTableColumns sets the default task-table columns for projects on the board. Optional recordFormId sets the board’s details form, and records ({"newCardWorkspaceMode": "lean"}) makes projects created through the board open as lean records.Kanban management
update_boardRename a board, change its client scope, replace its columns, replace its audience (members and memberGroups form one audience; [] for both reopens it to everyone), set taskTableColumns (the default task-table columns for projects on the board; null reverts to the organisation default, and the default board always follows the organisation setting), set recordFormId, or set records ({"newCardWorkspaceMode": "lean"} for lean records; null reverts to full projects).Kanban management
list_user_groupsList the organisation’s user groups with member counts, for resolving memberGroups references.Organisation membership
manage_workflow_stagesAdd, rename, or delete workflow stages. Deletions are destructive and require confirmation with a reassignment stage.Kanban management
delete_boardDelete a board (a view; projects and stages are untouched). Destructive; requires confirmation.Kanban management

Board and stage writes are not available to client-scoped sessions, and list_boards shows a client-scoped session only the default board plus that client’s boards.

ToolPurposeRequired access
invite_staffInvite a person to the organisation. Returns the invitation token, URL, and emailSent. Non-production datasets create the invitation without sending email.Member management
update_staff_roleChange a member’s organisation role. Requires confirmation.Role management
archive_staffArchive an organisation membership. It does not delete the user account or revoke a pending invitation. The result reports the exact membership effect. Destructive.Role management
update_staff_profileUpdate a member’s profile.Member management
add_staff_history_entry / update_staff_history_entry / delete_staff_history_entryManage a member’s work-history entries.Member management

An invitation remains valid when invite_staff returns emailSent: false. Use its returned invitation URL if the user wants to share the link manually.

ToolPurposeRequired access
create_client / update_clientCreate or update a client relationship.Client management
remove_clientRemove a client relationship. Destructive.Client management
ToolPurposeRequired access
list_rate_card_roles / list_client_rate_cardsRead rate-card data.Financial reporting
create_rate_card_role / update_rate_card_role / archive_rate_card_roleManage rate-card roles.Organisation settings management
create_client_rate_card / update_client_rate_cardManage client rate cards.Organisation settings management
ToolPurposeRequired access
create_collection / update_collectionCreate or update an asset collection.Asset upload
delete_collectionDelete an asset collection. Destructive.Asset upload

delete_project, delete_task, delete_milestone, archive_staff, remove_client, delete_collection, and update_staff_role require a confirm: true argument. Called without it, the tool does not act: it returns a preview describing what would happen so the agent can check with the user first, then call again with confirm: true.

For archive_staff, a successful confirmation reports the previous and resulting membership status, whether a pending invitation remains, userAccountDeleted: false, and a plain-language effect. Use those fields literally. Archiving a membership is not deletion of the user account.