Skip to content

Assistant tools

Every tool the AI assistant can call, whether it writes, and the permission it needs. Tools run as the signed-in user, who also needs permission to use chat; a missing permission comes back to the assistant as an error, and the turn carries on. Writes stop for the user to Confirm or Reject before they run.

<!-- source: services/api/src/chat/tools.ts (buildChatToolset), services/api/src/public/routes.ts, services/api/src/chat/*-tools.ts -->

Data Models

From the public API routes marked for MCP exposure, so external MCP clients get the same tools. A route tool writes when its HTTP method isn't GET. A record permission is met by the model-wide grant (data-models.record-read) or the per-model one (data-models.<model>-record-read); the same goes for write and delete.

ToolWritesPermissionDoes
monark_whoaminononeReturns the user id and organization the assistant acts in.
monark_list_modelsnodata-models.read-schemaLists the organization's data models.
monark_get_modelnodata-models.read-schemaGets one model by key.
monark_list_model_fieldsnodata-models.read-schemaLists a model's fields.
monark_list_recordsnodata-models.read-schema + record readLists a model's records: limit up to 100, cursor, search.
monark_get_recordnorecord readGets one record by id. A record hidden from the user's roles is not found.
monark_create_recordyesdata-models.read-schema + record writeCreates a record in a model.
monark_update_recordyesrecord writeChanges a record's slug or data.
monark_delete_recordyesrecord deleteDeletes a record; hard deletes it permanently.

Automations

In-app only: not on the public API or MCP.

ToolWritesPermissionDoes
automation_listnoautomation.viewLists automations (id, name, on or off, description, trigger); search, limit up to 100.
automation_getnoautomation.viewGets one automation with its whole graph.
automation_list_node_typesnoautomation.viewLists the node types a graph can use, with their config fields.
automation_list_trigger_eventsnoautomation.viewLists the events an event trigger can fire on, with their payload fields.
automation_createyesautomation.view + automation.createCreates an automation, turned off, from a whole graph. The graph is validated first.
automation_updateyesautomation.create (+ automation.view with a graph)Replaces the name, description or whole graph; a new graph is validated first.
automation_enableyesautomation.manageTurns an automation on or off.
automation_testyesautomation.runRuns an automation now, real actions included, and returns a run id.
automation_get_runnoautomation.viewGets a run's status and per-step results.

Wiki

In-app only. The assistant reads page content but doesn't edit it.

ToolWritesPermissionDoes
wiki_list_pagesnowiki.readLists every page as a tree (id, title, icon, parent).
wiki_get_pagenowiki.readGets one page with its content and breadcrumb.
wiki_searchnowiki.readSearches page titles and content (at least 2 characters).
wiki_create_pageyeswiki.createCreates an empty page, at the top level or under a parent.
wiki_update_pageyeswiki.updateChanges a page's title or icon.
wiki_move_pageyeswiki.updateMoves or reorders a page; a move that would create a cycle is refused.
wiki_delete_pageyeswiki.deleteDeletes a page and everything under it; recoverable.

Navigation

In-app only. Neither tool has a server effect.

ToolWritesPermissionDoes
list_destinationsnononeLists the app's top-level sections and what each holds.
navigatenononeShows the user a Go to {label} button for an in-app path; nothing happens until they click it.

navigate accepts / and relative paths under /calendar, /kanban, /data, /wiki, /automation, /admin and /account. It refuses //, any scheme (http:, javascript:) and any other prefix. The target page checks permissions when it loads.

Rules for every tool

RuleBehaviour
Unknown tool nameTreated as a write, so it can't run without the user's approval.
Invalid input or denialComes back to the assistant as an error result; the turn doesn't fail.
Rejected writeComes back as "The user declined to run this action."
Record of each callInput, status and result are stored on the conversation.
Label in the threadEach tool's phrase under chat.toolActions in the web messages; unlisted tools show a generated label.

How the tools are used: How the AI assistant works. To add one: Give the assistant a new tool.