internkim
Tools

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

ToolEffectApprovalWhat the model reads
task_addworkspace_writenot requiredCreate a new workspace task with typed task fields.
task_listreadnot requiredList workspace tasks with optional filters.
task_board_getreadnot requiredGet one task board week: its visible cards, including undated and overdue carry-over work, with direct-child progress across all weeks.
task_updateworkspace_writenot requiredUpdate explicit fields on an existing task, including who takes part in it, when canUpdate in task_list says the caller may change it.
task_deletedestructiverequiredPermanently delete a task.
task_vocabulary_setworkspace_writenot requiredSet 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

ToolEffectApprovalWhat the model reads
person_listreadnot requiredEveryone 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_updateworkspace_writenot requiredChange 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_inviteworkspace_writerequiredInvite 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_withdrawdestructiverequiredWithdraw 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_resetdestructiverequiredReset one person's password: their old password stops working and they get a temporary password to sign in with once.
person_message_deletedestructiverequiredDelete 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

ToolEffectApprovalWhat the model reads
event_addworkspace_writenot requiredCreate a calendar event with a concrete time range.
event_listreadnot requiredList calendar entries in a concrete time window.
event_updateworkspace_writenot requiredUpdate explicit fields on a calendar event.
event_deletedestructiverequiredPermanently delete a calendar event.
calendar_subscription_getreadnot requiredWhether the company calendar has a subscription address, the .ics feed a calendar app such as Google Calendar or Apple Calendar subscribes to.
calendar_subscription_addworkspace_writerequiredMake a new subscription address for the company calendar and answer it.
calendar_subscription_deletedestructiverequiredRevoke 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

ToolEffectApprovalWhat the model reads
leave_listreadnot requiredList leave in the record.
leave_balancereadnot requiredRead how much leave is left for a year.
leave_requestworkspace_writenot requiredFile a leave request.
leave_updateworkspace_writerequiredCorrect a leave that was filed wrong: its days, its kind, how much entitlement it consumes, or the note.
leave_deletedestructiverequiredTake a leave back out of the record entirely, as though it was never filed.
leave_decideworkspace_writerequiredApprove or reject a leave request.
leave_grant_setworkspace_writerequiredSet how much leave one person is entitled to in a year.
leave_return_earlyworkspace_writenot requiredReturn 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

ToolEffectApprovalWhat the model reads
attendance_listreadnot requiredList clock-ins and clock-outs as the record holds them.
attendance_addworkspace_writenot requiredWrite one attendance record, a clock-in or clock-out, at the moment it actually happened.
attendance_updateworkspace_writerequiredCorrect the day, the time, or the work location of attendance records that were written wrong, all in one call.
attendance_deletedestructiverequiredRemove an attendance record that should never have been there.
attendance_work_policy_getreadnot requiredThe 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_setworkspace_writerequiredSet the hours this company works, which attendance is judged against, from today on.
attendance_leave_policy_getreadnot requiredThe 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_setworkspace_writerequiredSet 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

ToolEffectApprovalWhat the model reads
crm_organization_listreadnot requiredThe organizations this company sells to, partners with or buys from, with who owns each relationship — 'who are our customers'.
crm_organization_addworkspace_writenot requiredAdd an organization this company deals with, after crm_organization_list shows it is not one already held.
crm_organization_updateworkspace_writenot requiredChange what this company holds about an organization; only the fields the call names change.
crm_organization_archivedestructiverequiredPut an organization away, so it leaves the CRM screens while its people, its deals and everything recorded against it stay.
crm_contact_listreadnot requiredThe 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_addworkspace_writenot requiredAdd a contact, a person at an organization this company already holds, which crm_organization_add creates when it does not.
crm_contact_updateworkspace_writenot requiredChange what this company holds about a contact, including moving that person to another organization; only the fields the call names change.
crm_contact_archivedestructiverequiredPut a contact away, so that person leaves the CRM screens while everything recorded against them stays, as when somebody leaves the organization.
crm_opportunity_listreadnot requiredThe 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_addworkspace_writenot requiredOpen a deal with an organization this company already holds.
crm_opportunity_updateworkspace_writenot requiredChange what a deal is worth, who it is with, or when it should close; only the fields the call names change.
crm_opportunity_moveworkspace_writerequiredMove a deal to another stage, or reorder it within the one it stands at.
crm_opportunity_archivedestructiverequiredPut a deal away, so it leaves the pipeline while everything recorded against it stays.
crm_activity_listreadnot requiredThe 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_saveworkspace_writenot requiredRecord work against an organization or a deal, or change work already recorded.
crm_vocabulary_getreadnot requiredThe 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_setworkspace_writenot requiredSet the CRM vocabulary: the organization types and pipelines this company runs its CRM in.
crm_record_importworkspace_writerequiredImport 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

ToolEffectApprovalWhat the model reads
message_contextreadnot requiredReturn the conversation the message arrived in, exactly as the messenger holds it, with its thread, requester, and bot identities.
message_searchreadnot requiredFind messages in an exact conversation scope, or read known ones in full.
message_sendexternal_sendrequiredSend a message to a direct message, channel, or the current conversation after approval.
message_updateexternal_writenot requiredChange a message the assistant or the requester wrote.
message_deletedestructiverequiredPermanently delete exact message IDs from message_search after approval.
message_reaction_addexternal_writenot requiredAdd an emoji reaction to a message as the requester, the way their messenger screen does.
message_reaction_deleteexternal_writenot requiredTake back a reaction the requester left on a message.
conversation_hideexternal_writenot requiredHide the requester's direct conversation with one person from their own conversation list.
conversation_revealexternal_writenot requiredShow 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

ToolEffectApprovalWhat the model reads
channel_addexternal_writenot requiredCreate a group channel in the company messenger with the requester as its owner, and add the members named.
channel_joinexternal_writenot requiredJoin an open channel the requester is not in yet.
channel_leaveexternal_writenot requiredLeave a channel the requester is in.
channel_deletedestructiverequiredPermanently delete a channel for everyone in it.
channel_member_addexternal_writenot requiredAdd company members to a channel the requester is in.
channel_member_deleteexternal_writenot requiredRemove one member from a channel.
channel_owner_addexternal_writenot requiredMake a member of a channel a co-owner beside the requester.
channel_owner_updateexternal_writerequiredHand 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

ToolEffectApprovalWhat the model reads
team_listreadnot requiredEvery 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_addworkspace_writenot requiredCreate one team, an organization on the chart, optionally under another one.
team_updateworkspace_writenot requiredRename one team, move that organization under another one, or change where it sits among its siblings.
team_deletedestructiverequiredRemove 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

ToolEffectApprovalWhat the model reads
company_document_listreadnot requiredList registered company documents newest first, with their numbers, counterparts, file paths, summaries, and where each sits in the data room.
company_document_registerworkspace_writenot requiredRegister 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_searchreadnot requiredSearch registered company documents by a natural-language question ('the terms of the agreement with ABC').
company_document_updateworkspace_writenot requiredUpdate 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_uploadworkspace_writenot requiredAsk for a place in the company data room to put one file of a registered document.
company_image_uploadworkspace_writenot requiredAsk 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_downloadreadnot requiredFetch a company document's original, or one of the files derived from it, out of the data room.
company_info_getreadnot requiredRead the company master profile (name, representative, address, contact, bank account, country-specific legal attributes such as a business registration number).
company_info_setworkspace_writenot requiredSave or update the company master profile.
company_metric_listreadnot requiredList recorded company metrics sorted by period.
company_metric_recordworkspace_writenot requiredRecord or correct one company metric value for a period — annual revenue, operating profit, MAU, employee count, GMV and similar time-series numbers.
company_record_addworkspace_writenot requiredAdd one company history/asset record: milestones, funding rounds, products, patents, certifications, awards, client references, government grants.
company_record_deletedestructiverequiredDelete a company record named by recordHint from a prior company_record_list result.
company_record_listreadnot requiredList company history/asset records, newest first.
company_record_updateworkspace_writenot requiredUpdate fields on an existing company record named by recordHint from a prior company_record_list result.
company_equity_addworkspace_writenot requiredAdd 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_listreadnot requiredList the company's equity ledger and what each holder holds as of a day, with their share of the total.
company_equity_deletedestructiverequiredDelete one wrong line of the company's equity ledger named by its entryID from company_equity_list.
company_document_classifycomputationnot requiredClassify a document against the company data room taxonomy in one model request.
company_settings_getreadnot requiredThe 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_updateworkspace_writerequiredChange the company settings.
company_holiday_listreadnot requiredThe days this company is closed, earliest first.
company_holiday_addworkspace_writenot requiredAdd a day the company is closed.
company_holiday_updateworkspace_writenot requiredChange the day, the name, or the yearly recurrence of a holiday the company already holds.
company_holiday_deletedestructiverequiredTake 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.

Mail

ToolEffectApprovalWhat the model reads
mail_connection_startconnectrequiredStart the mail account connection flow and return setup instructions for the requester.
mail_connection_statusreadnot requiredCheck the mail connection: whether the requester's email account is connected.
mail_mailbox_listreadnot requiredList the requester's mail folders with their unread and total counts.
mail_message_listreadnot requiredList the mail in a mailbox folder, one page of messages at a time.
mail_message_markworkspace_writenot requiredSet the read (seen) or starred (flagged) status of one mail message.
mail_message_moveworkspace_writenot requiredMove one mail message to a different mailbox folder (e.g.
mail_message_readreadnot requiredFetch the full content of a single mail message by its mailbox name and UID.
mail_message_searchreadnot requiredSearch mail messages by keyword, sender, or subject.
mail_message_sendexternal_sendrequiredSend 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

ToolEffectApprovalWhat the model reads
host_diagnostics_getreadnot requiredRead 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_getreadnot requiredRead 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_updatedestructiverequiredUpdate 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

ToolEffectApprovalWhat the model reads
schedule_listreadnot requiredList scheduled tasks created by the current requester.
schedule_createworkspace_writenot requiredSchedule a reminder or a recurring alert: work the agent does later, once at a time you name or on a repeat.
schedule_updateworkspace_writenot requiredChange explicit fields on a reminder or recurring alert the requester set up, including how often it repeats and when it next arrives.
schedule_cancelworkspace_writenot requiredStop a reminder or recurring alert the requester set up, so it stops arriving.
ToolEffectApprovalWhat the model reads
notification_settings_getreadnot requiredThe notification settings: what the requester is told about, category by category, and the conversations they have muted.
notification_settings_setworkspace_writenot requiredChange the notification settings: which categories of notice the requester is told about at all, and which conversations are muted.
conversation_muteworkspace_writenot requiredStop telling the requester about a conversation.
conversation_unmuteworkspace_writenot requiredTell the requester about a conversation again.

A schedule is work the agent does later or on repeat. Notifications says what each setting controls.

Web

ToolEffectApprovalWhat the model reads
web_searchreadnot requiredSearch the public web and return ranked result snippets.
web_fetchreadnot requiredFetch 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

ToolEffectApprovalWhat the model reads
browser_openconnectnot requiredOpen an exact HTTP or HTTPS URL in the browser and return the resulting page identity and initial structure.
browser_snapshotreadnot requiredRead the current browser page structure and return stable interactive references for inspection and control.
browser_screenshotreadnot requiredCapture the visible browser page as a PNG attachment for visual inspection.
browser_clickexternal_writenot requiredClick one exact target from the current browser snapshot and return the completed action.
browser_fillexternal_writenot requiredFill text into a target on the current browser page.
browser_pressexternal_writenot requiredPress a key on the current browser page.
browser_selectexternal_writenot requiredSelect a value in a target on the current browser page.
browser_waitreadnot requiredWait 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

ToolEffectApprovalWhat the model reads
artifact_reviewreadnot requiredReview 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.

On this page