Tool catalog
Every capability tool, by namespace, generated from the canonical catalog.
The tables below are rendered at build time from the catalog the agent itself
reads (pkg/capabilityprotocol/generated/capability-tools.json, protocol
0.4.0), so they cannot drift from what is deployed. The
descriptions are the exact English sentences the model receives.
The approval column marks the tools that pause for
approval before running. It is read from the
catalog's own requiresApproval, so no list here can fall behind it.
Tasks
| Tool | Effect | Approval | What the model reads |
|---|---|---|---|
task_add | workspace_write | not required | Create a new workspace task with typed task fields. |
task_list | read | not required | List workspace tasks with optional filters. |
task_board_get | read | not required | Get one task board week: its visible cards, including undated and overdue carry-over work, with direct-child progress across all weeks. |
task_update | workspace_write | not required | Update explicit fields on an existing task, including who takes part in it, when canUpdate in task_list says the caller may change it. |
task_delete | destructive | required | Permanently delete a task. |
task_vocabulary_set | workspace_write | not required | Set the task vocabulary: the business and task type labels this company files work under. |
Answered on the central plane by
web/src/lib/server/public-api/record/task-tools.ts, against the record's own
task table, running as the calling member so row level security decides what
each call may see. Updates and deletes take a taskHint: the exact task ID or exact current title from a
task_list result. Dates are yyyy-mm-dd; the agent resolves "next Friday"
before calling.
task_list answers the current week when neither weekFrom nor weekTo is
given. Task status determines its listing week: tasks marked planned or
paused that have not started roll into the week being read, keeping upcoming
work visible. Tasks marked completed, rejected or stopped stay in the
week they ended in. query matches the
title, business, type, owner's name and status, ignoring case and spacing.
Adding the same title for the same owner twice within ten minutes updates the first task and answers with it. No second task is made.
People
| Tool | Effect | Approval | What the model reads |
|---|---|---|---|
person_list | read | not required | Everyone who works here, with their exact name, email and mention, and what the company directory holds about them: their job title, their organization, who they report to, and when they started. |
person_update | workspace_write | not required | Change what the company directory holds about one person: their name, their job title, their organization, who they report to, their phone number, the day they started, whether they administer the company, and whether they still work here. |
person_invite | workspace_write | required | Invite somebody to the company: it creates their account, gives them a temporary password to sign in with once, and puts them in the directory. |
person_withdraw | destructive | required | Withdraw one person from the company: their membership ends, they can no longer sign in, they leave the company messenger, and every screen stops showing them, while the attendance, leave and tasks they left behind still read. |
person_password_reset | destructive | required | Reset one person's password: their old password stops working and they get a temporary password to sign in with once. |
person_message_delete | destructive | required | Delete every message one person has written in the company messenger, in every conversation, for somebody leaving or asking to be forgotten. |
Answered on the central plane from the company's own member directory. It answers who a person is and who works here. It is not a step before a hint: a hint takes the fragment as it was written and the server resolves it, and this is what the agent reads when a hint comes back with candidates to choose between.
Withdrawing a person and resetting a password run the same function as the
members page in settings, web/src/lib/server/member-administration.ts, so the
administrator check is the page's. Deleting what a person wrote in the
messenger is answered by the company's host, which holds the key each message
was signed with.
Calendar
| Tool | Effect | Approval | What the model reads |
|---|---|---|---|
event_add | workspace_write | not required | Create a calendar event with a concrete time range. |
event_list | read | not required | List calendar entries in a concrete time window. |
event_update | workspace_write | not required | Update explicit fields on a calendar event. |
event_delete | destructive | required | Permanently delete a calendar event. |
calendar_subscription_get | read | not required | Whether the company calendar has a subscription address, the .ics feed a calendar app such as Google Calendar or Apple Calendar subscribes to. |
calendar_subscription_add | workspace_write | required | Make a new subscription address for the company calendar and answer it. |
calendar_subscription_delete | destructive | required | Revoke the company calendar subscription address, so no calendar app can read it any longer. |
Answered on the central plane by
web/src/lib/server/public-api/record/event-tools.ts; a calendar event is a
task with a time span. Times are ISO
timestamps with a time zone, answered where the company is,
and eventHint follows the same resolution rule as taskHint.
event_list answers what is coming when no window is given: from the start of
today where the company is, through the seven days after it. Given one end of a
window and not the other, the missing end is a day away. query matches the
title, note and location, whatever the case.
The default is the authenticated requester's schedule. scope: all explicitly
reads the visible company calendar. personHints reads those people's schedule: the events they
attend and the events open to the whole company, which name no attendees. Other
people's leave is left out.
everyoneAttends marks the event open to the whole company and leaves it with
no attendee list; it does not name every member. An open event's answer carries
isOpenToCompany: true, so an event whose attendees were all deleted reads as
personal, not as open. An event whose
attendees do not include the person asking for it is being asked of them, and
stands at requested until they answer. Adding an event the company already
holds — same title, same time, same people — is refused with
calendar_event_duplicate and the id of the event it clashed with, so the
caller can update that one instead. There is no way to ask for it twice.
The calendar_subscription_* tools answer from
web/src/lib/server/public-api/record/calendar-subscription.ts, and the
calendar settings sheet calls the same three. The company keeps only what its
subscription address hashes to, so calendar_subscription_get says whether an
address exists and only calendar_subscription_add ever shows one.
Leave
| Tool | Effect | Approval | What the model reads |
|---|---|---|---|
leave_list | read | not required | List leave in the record. |
leave_balance | read | not required | Read how much leave is left for a year. |
leave_request | workspace_write | not required | File a leave request. |
leave_update | workspace_write | required | Correct a leave that was filed wrong: its days, its kind, how much entitlement it consumes, or the note. |
leave_delete | destructive | required | Take a leave back out of the record entirely, as though it was never filed. |
leave_decide | workspace_write | required | Approve or reject a leave request. |
leave_grant_set | workspace_write | required | Set how much leave one person is entitled to in a year. |
leave_return_early | workspace_write | not required | Return to work early, before the leave was due to end. |
The central-plane handler in
web/src/lib/server/public-api/record/leave-tools.ts uses the record's
own leave table and its leave_in_full and member_leave_remaining
functions, running as the calling member so row level security decides what
each call may see. The quantity is days as a number and the type is the
company's own registered kind; whether a leave is paid and whether it consumes
the entitlement follow from that kind, so the agent names the kind and the
record decides the rest. leave_decide is gated, because approving is what
spends the entitlement.
Attendance
| Tool | Effect | Approval | What the model reads |
|---|---|---|---|
attendance_list | read | not required | List clock-ins and clock-outs as the record holds them. |
attendance_add | workspace_write | not required | Write one attendance record, a clock-in or clock-out, at the moment it actually happened. |
attendance_update | workspace_write | required | Correct the day, the time, or the work location of attendance records that were written wrong, all in one call. |
attendance_delete | destructive | required | Remove an attendance record that should never have been there. |
attendance_work_policy_get | read | not required | The hours this company works, which attendance is judged against: the policy in force and every earlier one with the day it took effect, so a past day is judged by the policy of that day. |
attendance_work_policy_set | workspace_write | required | Set the hours this company works, which attendance is judged against, from today on. |
attendance_leave_policy_get | read | not required | The leave policy this company offers, which attendance and time off are judged against: every type with whether it is paid, how much it grants and in what portions of a day it may be taken, and the day the leave year starts. |
attendance_leave_policy_set | workspace_write | required | Set the leave this company offers, which attendance and time off are judged against. |
The central-plane handler in
web/src/lib/server/public-api/record/attendance-tools.ts uses the
record's attendance table and its attendance_add, attendance_correct,
and attendance_remove functions, running as the calling member. Days are
yyyy-mm-dd, times are 24-hour HH:MM, and both are read in the company's
time zone. attendance_list covers the last thirty days unless from and
to say otherwise. The authenticated web request carries the user's session
JWT; a personal ik_ token is converted server-side to that member's JWT, so
the database call remains member-scoped and never writes with the service key.
For an ordinary self clock, omit personHint, date, and time from
attendance_add. One request writes the current moment and returns the existing
result fields status, eventID, and backdated, plus result.event
(id, personID, kind, occurredAt, and location). Historical and
administrator writes that save an event return the same result.event; the
asked response has no event. Use that recorded time and location in the UI;
there is no need to refresh with attendance_list. Notifications for this
live path start after the save in the background, so its response has no
notified field. Historical and administrator attendance writes retain their
existing notified response. A reason is optional and is kept when supplied.
A member writes, corrects, and removes their own records from the last three
days. Reaching further back, and touching anybody else's, is an administrator's:
asked by anybody else the call answers asked, the administrators are told what
was wanted, and nothing is written until one of them writes it.
A correction keeps what the record held before it, and a removal keeps who
removed it and why.
CRM
| Tool | Effect | Approval | What the model reads |
|---|---|---|---|
crm_organization_list | read | not required | The organizations this company sells to, partners with or buys from, with who owns each relationship — 'who are our customers'. |
crm_organization_add | workspace_write | not required | Add an organization this company deals with, after crm_organization_list shows it is not one already held. |
crm_organization_update | workspace_write | not required | Change what this company holds about an organization; only the fields the call names change. |
crm_organization_archive | destructive | required | Put an organization away, so it leaves the CRM screens while its people, its deals and everything recorded against it stay. |
crm_contact_list | read | not required | The contacts this company deals with at other organizations — the people it talks to — with how to reach them — 'who do we talk to at ABC'. |
crm_contact_add | workspace_write | not required | Add a contact, a person at an organization this company already holds, which crm_organization_add creates when it does not. |
crm_contact_update | workspace_write | not required | Change what this company holds about a contact, including moving that person to another organization; only the fields the call names change. |
crm_contact_archive | destructive | required | Put a contact away, so that person leaves the CRM screens while everything recorded against them stays, as when somebody leaves the organization. |
crm_opportunity_list | read | not required | The deals this company is working on, each with its stage, what it is worth and how much work has been recorded against it — 'what are we closing this month'. |
crm_opportunity_add | workspace_write | not required | Open a deal with an organization this company already holds. |
crm_opportunity_update | workspace_write | not required | Change what a deal is worth, who it is with, or when it should close; only the fields the call names change. |
crm_opportunity_move | workspace_write | required | Move a deal to another stage, or reorder it within the one it stands at. |
crm_opportunity_archive | destructive | required | Put a deal away, so it leaves the pipeline while everything recorded against it stays. |
crm_activity_list | read | not required | The activity recorded against the organizations and deals this company holds, newest first, with the labels and colours the CRM screens draw it in. |
crm_activity_save | workspace_write | not required | Record work against an organization or a deal, or change work already recorded. |
crm_vocabulary_get | read | not required | The CRM vocabulary, the words this company runs its CRM in: the organization types it sorts relationships by, the pipelines it runs deals through, and the stages a deal can stand at with what each one means. |
crm_vocabulary_set | workspace_write | not required | Set the CRM vocabulary: the organization types and pipelines this company runs its CRM in. |
crm_record_import | workspace_write | required | Import many organization or contact records from one CSV in one write: every record is written, or none is. |
Answered on the central plane by
web/src/lib/server/public-api/record/crm-tools.ts, against the record's
organization, contact and opportunity tables and its
crm_opportunity_close function, running as the calling member. An
organization, a person at one, and a deal are each named by a hint: an exact id,
or the name or current title a list result shows.
A deal stands at one of six stages: waiting, in_progress, review, done,
on_hold, lost. They are declared once as the record's crm_stage type,
which the catalog and the screens both read. crm_opportunity_move is the only
way a deal changes stage. A move into done or lost settles what the deal was
worth in the company's own currency, converting it when the deal is held in
another, and losing one needs a written reason. Naming a position and no stage
reorders the deal where it stands.
An activity is a task: task_add, task_update and task_list take
organizationHint and opportunityHint, so the work recorded against a deal is
the company's ordinary work. The screens and the API reach the same rows through
crm_activity_save and crm_activity_list, which are not offered to the model
and which write through the writers task_add and event_add already use.
crm_record_import writes many organizations or contacts in one transaction,
through web/src/lib/server/public-api/record/crm-import-tools.ts, the writer
the CRM screen's import uses. The screen reads the file in the browser and sends
its rows. The agent names a workspace CSV in attachments and says in columns
which column fills which field. Blueclaw reads the file as the person asking and
carries its content with the call, so the lines never enter the model's input
and nothing keeps the file once the call is answered. The approval question
shows how many records the import creates and updates, worked out by a dry run
of that file, and a file with a line that cannot be imported is refused before
anyone is asked.
Messages
| Tool | Effect | Approval | What the model reads |
|---|---|---|---|
message_context | read | not required | Return the conversation the message arrived in, exactly as the messenger holds it, with its thread, requester, and bot identities. |
message_search | read | not required | Find messages in an exact conversation scope, or read known ones in full. |
message_send | external_send | required | Send a message to a direct message, channel, or the current conversation after approval. |
message_update | external_write | not required | Change a message the assistant or the requester wrote. |
message_delete | destructive | required | Permanently delete exact message IDs from message_search after approval. |
message_reaction_add | external_write | not required | Add an emoji reaction to a message as the requester, the way their messenger screen does. |
message_reaction_delete | external_write | not required | Take back a reaction the requester left on a message. |
conversation_hide | external_write | not required | Hide the requester's direct conversation with one person from their own conversation list. |
conversation_reveal | external_write | not required | Show a direct conversation the requester hid with conversation_hide in their conversation list again. |
The handler lives in internal/capabilityd/platform_message_tool.go. message_search has two modes: keyword queries
return IDs with a preview around the match, and messageIDs returns those
messages complete. message_update changes a message the agent or the
requester wrote: oldText with newText corrects one exact span, which must
occur exactly once, and text replaces the whole message.
message_reaction_add, message_reaction_delete, conversation_hide and
conversation_reveal act as the requester through the same chatd person
capabilities as the messenger screen. message_send targets a direct message, a named
channel, or the current conversation; only the current-conversation targets
skip approval.
Channels
| Tool | Effect | Approval | What the model reads |
|---|---|---|---|
channel_add | external_write | not required | Create a group channel in the company messenger with the requester as its owner, and add the members named. |
channel_join | external_write | not required | Join an open channel the requester is not in yet. |
channel_leave | external_write | not required | Leave a channel the requester is in. |
channel_delete | destructive | required | Permanently delete a channel for everyone in it. |
channel_member_add | external_write | not required | Add company members to a channel the requester is in. |
channel_member_delete | external_write | not required | Remove one member from a channel. |
channel_owner_add | external_write | not required | Make a member of a channel a co-owner beside the requester. |
channel_owner_update | external_write | required | Hand a channel over: the person named becomes its owner and the requester stays as a plain member, which only another owner can undo. |
The handler lives in internal/capabilityd/channel_tool.go. Each call is made
as the requester through the same chatd person capability their messenger
screen uses (chatd/src/personal/capabilities.ts), so the relay and chatd
refuse a non-owner here exactly as they do on the screen. channelHint is the
exact channel ID or the channel's current name, and personHint names a
company member; both climb the resolver ladder and ask when a name is
ambiguous. Deleting a channel and handing it over wait for approval.
Teams
| Tool | Effect | Approval | What the model reads |
|---|---|---|---|
team_list | read | not required | Every team in the company — the organizations the organization chart holds — in the order it shows them, each with the organization it sits under and how many people belong to it. |
team_add | workspace_write | not required | Create one team, an organization on the chart, optionally under another one. |
team_update | workspace_write | not required | Rename one team, move that organization under another one, or change where it sits among its siblings. |
team_delete | destructive | required | Remove one team from the organization chart, so that organization is gone. |
The organization chart's teams: listing them, creating one under another, renaming, moving and removing.
Company records
| Tool | Effect | Approval | What the model reads |
|---|---|---|---|
company_document_list | read | not required | List registered company documents newest first, with their numbers, counterparts, file paths, summaries, and where each sits in the data room. |
company_document_register | workspace_write | not required | Register a company document in the document ledger and, for kind=issued, receive the official document number to print in the document plus the storage directory to save the final file in. |
company_document_search | read | not required | Search registered company documents by a natural-language question ('the terms of the agreement with ABC'). |
company_document_update | workspace_write | not required | Update a registered company document's file path, title, counterpart, summary, or where it sits in the data room: its categoryCode, date, period, status, tags, hash, and the document it supersedes. |
company_document_upload | workspace_write | not required | Ask for a place in the company data room to put one file of a registered document. |
company_image_upload | workspace_write | not required | Ask for a place to keep a new version of a company image, such as the seal stamped on forms or the letterhead logo. |
company_document_download | read | not required | Fetch a company document's original, or one of the files derived from it, out of the data room. |
company_info_get | read | not required | Read the company master profile (name, representative, address, contact, bank account, country-specific legal attributes such as a business registration number). |
company_info_set | workspace_write | not required | Save or update the company master profile. |
company_metric_list | read | not required | List recorded company metrics sorted by period. |
company_metric_record | workspace_write | not required | Record or correct one company metric value for a period — annual revenue, operating profit, MAU, employee count, GMV and similar time-series numbers. |
company_record_add | workspace_write | not required | Add one company history/asset record: milestones, funding rounds, products, patents, certifications, awards, client references, government grants. |
company_record_delete | destructive | required | Delete a company record named by recordHint from a prior company_record_list result. |
company_record_list | read | not required | List company history/asset records, newest first. |
company_record_update | workspace_write | not required | Update fields on an existing company record named by recordHint from a prior company_record_list result. |
company_equity_add | workspace_write | not required | Add one line to the company's equity ledger: shares or options a holder received or gave up on a date, as the shareholder register or a share issuance records it. |
company_equity_list | read | not required | List the company's equity ledger and what each holder holds as of a day, with their share of the total. |
company_equity_delete | destructive | required | Delete one wrong line of the company's equity ledger named by its entryID from company_equity_list. |
company_document_classify | computation | not required | Classify a document against the company data room taxonomy in one model request. |
company_settings_get | read | not required | The company settings: its name, country, language, time zone, base currency, the work locations attendance can be recorded at, the annual leave a person is granted, whether everybody may see the whole company's attendance, and the address of its picture. |
company_settings_update | workspace_write | required | Change the company settings. |
company_holiday_list | read | not required | The days this company is closed, earliest first. |
company_holiday_add | workspace_write | not required | Add a day the company is closed. |
company_holiday_update | workspace_write | not required | Change the day, the name, or the yearly recurrence of a holiday the company already holds. |
company_holiday_delete | destructive | required | Take a day off the company holiday list, so it counts as a working day again. |
The company's own ledger and settings: registered documents, recorded metrics, records, holidays and company information. Documents registered here are the ones the data room files.
The company picture goes up the way a seal does: company_image_upload with
image picture answers a place to PUT it, and company_settings_update's
profileImage keeps it, or takes it down when empty.
| Tool | Effect | Approval | What the model reads |
|---|---|---|---|
mail_connection_start | connect | required | Start the mail account connection flow and return setup instructions for the requester. |
mail_connection_status | read | not required | Check the mail connection: whether the requester's email account is connected. |
mail_mailbox_list | read | not required | List the requester's mail folders with their unread and total counts. |
mail_message_list | read | not required | List the mail in a mailbox folder, one page of messages at a time. |
mail_message_mark | workspace_write | not required | Set the read (seen) or starred (flagged) status of one mail message. |
mail_message_move | workspace_write | not required | Move one mail message to a different mailbox folder (e.g. |
mail_message_read | read | not required | Fetch the full content of a single mail message by its mailbox name and UID. |
mail_message_search | read | not required | Search mail messages by keyword, sender, or subject. |
mail_message_send | external_send | required | Send an email message from the requester's connected mail account. |
Mail is answered by the company's computer, which reads the requester's own mail account for each call, so no mail password is stored there.
The host
| Tool | Effect | Approval | What the model reads |
|---|---|---|---|
host_diagnostics_get | read | not required | Read host diagnostics through the same execution records, event ledger, model exchanges, turn inputs, connector events, service logs and request metrics as the work-history web page. |
host_version_get | read | not required | Read which version of internkim this company's host runs, the release channel it follows, how it is updated (apt, dnf, pacman or brew), and the latest stable release with its date and release notes, which says whether an update is available. |
host_update | destructive | required | Update this company's host to a stable release, or take it back to an older stable one. |
Answered by the admin gateway on the company's computer, which checks the requester's role against the company roster. Releases are read from the GitHub Releases the installer installs from. Running the host says what an update does and what its restart costs.
Schedules and notifications
| Tool | Effect | Approval | What the model reads |
|---|---|---|---|
schedule_list | read | not required | List scheduled tasks created by the current requester. |
schedule_create | workspace_write | not required | Schedule a reminder or a recurring alert: work the agent does later, once at a time you name or on a repeat. |
schedule_update | workspace_write | not required | Change explicit fields on a reminder or recurring alert the requester set up, including how often it repeats and when it next arrives. |
schedule_cancel | workspace_write | not required | Stop a reminder or recurring alert the requester set up, so it stops arriving. |
| Tool | Effect | Approval | What the model reads |
|---|---|---|---|
notification_settings_get | read | not required | The notification settings: what the requester is told about, category by category, and the conversations they have muted. |
notification_settings_set | workspace_write | not required | Change the notification settings: which categories of notice the requester is told about at all, and which conversations are muted. |
conversation_mute | workspace_write | not required | Stop telling the requester about a conversation. |
conversation_unmute | workspace_write | not required | Tell the requester about a conversation again. |
A schedule is work the agent does later or on repeat. Notifications says what each setting controls.
Web
| Tool | Effect | Approval | What the model reads |
|---|---|---|---|
web_search | read | not required | Search the public web and return ranked result snippets. |
web_fetch | read | not required | Fetch and return the text content of one or more public URLs. |
The handler lives in internal/capabilityd/web_tool.go and uses OpenRouter's
web search. Domain allowlists, language, and location narrow the query.
Reading files and attachments
The model reads with one built-in tool, read: a workspace path or an
attachment's exact url from the conversation. Text comes back as text,
documents (HTML, PDF, DOCX, PPTX, XLSX, and friends) as converted Markdown,
images as an image the model sees — the runtime picks the modality from the
content type, so there is nothing to choose. The converter adapter is in
internal/capabilityd/file_read_tool.go; it uses file_read_helper.py for
format extraction. The model calls the read tool, not either adapter
directly.
Browser
| Tool | Effect | Approval | What the model reads |
|---|---|---|---|
browser_open | connect | not required | Open an exact HTTP or HTTPS URL in the browser and return the resulting page identity and initial structure. |
browser_snapshot | read | not required | Read the current browser page structure and return stable interactive references for inspection and control. |
browser_screenshot | read | not required | Capture the visible browser page as a PNG attachment for visual inspection. |
browser_click | external_write | not required | Click one exact target from the current browser snapshot and return the completed action. |
browser_fill | external_write | not required | Fill text into a target on the current browser page. |
browser_press | external_write | not required | Press a key on the current browser page. |
browser_select | external_write | not required | Select a value in a target on the current browser page. |
browser_wait | read | not required | Wait for a browser target or a bounded interval. |
The handler lives in internal/capabilityd/browser_tool.go, and calls run in
the company computer's browser: a Moli per requester, each with its own
profile. Responses carry no cookies or profile paths, and browser_screenshot
returns the page as a PNG attachment. A page that shows a bot
check comes back as a refusal the agent reports to the person who asked.
Artifacts
| Tool | Effect | Approval | What the model reads |
|---|---|---|---|
artifact_review | read | not required | Review rendered artifact screenshots against a concrete intent and rubric, returning typed visual issues and suggested fixes. |
The handler lives in internal/capabilityd/artifact_review_tool.go. This is the
agent's own quality loop: it renders what it built, screenshots it, and asks
for typed visual issues against the stated intent before delivering.