Skip to content

Agent tools

Every tool Computer adds to the harness, with parameters and per-runner limits

Under Claude Code these tools are one MCP server named calvin; approval prompts show the full id, mcp__calvin__<name>.

Availability

ToolOne-machine mode (npm start)Self-hosted gateway and hostHosted
send_fileyesyesyes
post_cardyesyesyes
checkout_reponowhen the host has a workspace definitionyes
spawn_threadnoyesyes
read_threadnoyesyes
post_threadnoyesyes
request_secretnoyes; fails unless the gateway has SP_STORE_KEYyes
preview, unpreviewnooffered, but the gateway refuses the call (see preview)yes

“Per runner” counts reset when the session’s runner restarts.

send_file

Posts a file into the session’s Slack thread. PNG, JPEG, GIF and WebP images render inline.

ParameterTypeRequiredMeaning
pathstringyesAbsolute, or relative to the session directory.
commentstring, up to 3,000 charactersnoMessage posted with the file.
titlestring, up to 200 charactersnoDefaults to the file name.
alt_textstring, up to 1,000 charactersnoImage description for screen readers.
RuleValue
FileRegular, non-empty, at most 100 MiB, inside the session directory or the system temp directory
Count50 files per runner
SecretsA file that contains the value of one of the session’s secrets is refused
Slack scopefiles:write
From a scriptcalvin-send-file <path> [comment], on the runner’s PATH, same limits

post_card

Posts a card (key facts, a table, charts, link buttons) into the session’s thread as Slack blocks.

ParameterTypeRequiredMeaning
specobjectyesThe card.
spec.rootstringyesId of the root element, a Card.
spec.elementsmapyesId to {type, props, children}.
spec.stateobjectno
RuleValue
TableOne; 100 rows, 20 columns
ChartsTwo; title up to 50 characters, 12 series, 20 points, labels up to 20 characters
Fields10
Slack blocks50
ButtonsLinks only
Invalid specRefused with the list of problems
Count50 cards per runner
SecretsAs for send_file

checkout_repo

Adds workspace repositories to the session directory, each as a git worktree on the session’s branch, cloning first if needed. A repository already checked out is returned as it is. See Repositories.

ParameterTypeRequiredMeaning
reposarray of 1 to 10 stringsyesRepository names from the definition, or owner/name (case-insensitive).
ErrorCause
no repository <x> in this workspace; the list is in AGENTS.mdNot in the definition
<x> is not published yetThe repository is marked unpublished

spawn_thread

Starts a session in a new Slack thread, with the same owner and permission mode. The gateway posts the task and a link to the brief as a top-level message in the parent’s channel, or in the owner’s direct messages when the parent is a code channel. See Linked and spawned threads.

ParameterTypeRequiredMeaning
taskstring, 3 to 150 characters, one lineyesWhat the new thread should do.
briefstringyesPath of a .md file inside the session directory, relative to it, with an optional #anchor. Must be on the fetched default branch of its repository.
modelsmart, fast or defaultnoModel tier. Omitted: the parent’s model.

Limit: 8 per runner.

read_thread

Returns a Slack thread’s first message, its latest replies (at most 40, 16,000 characters in all, 4,000 per message) and how many were left out, marked as data, not instructions. See Linked and spawned threads.

ParameterTypeRequiredMeaning
urlstringurl, or channel with tsThe thread’s Slack link.
channelstringChannel id (C… or G…).
tsstringTimestamp of a message in the thread, for example 1700000000.000100.
RuleValue
Count40 per runner
ApprovalNever asked
Readable conversationsThe bot is in it, and the session’s owner and everyone who can read the session’s own conversation can see it. Otherwise the tool returns the reason.

post_thread

Posts a reply inside another Slack thread, never at the channel’s top level.

ParameterTypeRequiredMeaning
url, or channel with tsas for read_threadyesThe thread to post into.
textstring, 1 to 4,000 charactersyesSlack mrkdwn.
RuleValue
Count20 per runner
ApprovalAsked outside bypassPermissions mode (see Permission modes)
Channel-wide mentions (@channel, @here, @everyone, user groups)Become plain text
AttributionThe gateway appends a Posted for line naming the session’s owner and linking the session’s thread

request_secret

Posts a button; the person types the secret into a private Slack form. The agent ends its turn and is told when the secret is set; the value is then in the environment of the session’s next shell commands. See Secrets and variables.

ParameterTypeRequiredMeaning
namestring, an environment variable nameyesFor example STRIPE_API_KEY.
reasonstring, 3 to 200 charactersyesOne line shown to the person.
filebooleannoStore the secret as a file; $NAME holds its path.

Limit: 10 per runner. Fails when a secret of that name is already set, or when a self-hosted gateway has no SP_STORE_KEY.

preview

Not in the public code yet: launch blocker 5 (Preview URLs on a self-hosted instance). The self-hosted gateway will serve previews on a wildcard domain the operator points at it, and the runner will not offer preview and unpreview until a domain is set. Today the runner offers both tools and the self-hosted gateway refuses every call.

Gives an HTTP server listening on a port of the computer a public URL. Anyone with the URL can open it. Plain HTTP on that port only; the URL works while the server runs. See Preview URLs.

ParameterTypeRequiredMeaning
portinteger, 1 to 65535yesThe port the server listens on, on localhost.
namestring, one DNS label (lowercase letters, digits, hyphens; up to 63 characters)noOmitted: a generated name, or the port’s existing one.

Returns the URL, the name, and whether something was listening on the port.

unpreview

Takes down a preview URL.

ParameterTypeRequiredMeaning
namestringyesThe preview’s name, the label at the start of its URL.