Built-in AI Tools
A Curiosity Workspace ships with a set of AI tools that are seeded into the graph on boot. They are
ordinary _ChatAITool nodes — they show up under Settings → AI → AI Tools, they are picked in the chat and
assistant tool pickers, and they are enforced against the calling user's permissions like any tool you
write yourself. What differs is where their code comes from and whether you may change it.
This section covers the tools an ordinary chat user ends up calling:
The search tool
How search turns a question into a real SearchRequest through the InterpretSearch agent, what it
returns, and which node types and filters an admin exposes to it.
The consult tool
How the assistant reads an item the user attached to a conversation — and how to write the per-node-type readers that decide what consulting a Person, an Invoice or a File returns.
The three kinds of built-in
| Kind | Where the code lives | Editable? |
|---|---|---|
| In-code | A compiled C# class in the product (search, chat-context, ask-user-question, the admin-assistant introspection tools). The node's Code field is a placeholder shown for inspection. |
No |
| Sample | A script stored on the node ("Search Files", "Search the Web", "Create an Image", "Memory", "Workspace Deep Research"). Seeded so you can read a working tool and clone it. | Yes — but see the version stamp below |
| Editable built-in | consult, whose stored code is only the per-node-type readers; the tool surface is generated around them. |
Yes, by design |
Every seeded tool carries a version stamp on its node. On boot the workspace skips a tool whose node
is already at the shipped version, so your edits survive restarts — and a release that bumps the stamp
re-seeds the tool and overwrites local edits. Clone a sample into a tool of your own when you want to
keep changes; the consult readers are the one place you are expected to edit in place.
Who can call what
Built-in tools carry an access mode. Most are AdminOnly — the introspection and propose/apply tools
belong to Sudo, the admin assistant, and never appear for an
ordinary user. The tools below are available to all users:
| Tool | Function name | What it does |
|---|---|---|
| Search | search |
Finds items in the workspace. See The search tool. |
| Consult | consult |
Reads one item the user attached to the conversation, in full. See The consult tool. |
| Chat Context | chat-context |
Lists what is attached to the conversation. |
| Ask User Question | ask-user-question |
Pauses the run and asks the user a multiple-choice question. |
| Workspace Deep Research | deep-research |
Starts a research run. See Deep research. |
| Interpret Search | consult-filters |
Reports the filters the search engine offers this user. Called by the InterpretSearch agent, not on its own. |
consult and chat-context are also auto-enabled: a chat that has items attached to it gets both,
whether or not they were picked in the tool picker, because the model has to be able to read what the
user just handed it.
Tool system prompts
A [Tool] description says what one call does; it is read when the model is choosing a call. Some tools
also need something said up front: a habit to keep across the whole conversation, a rule about how
their results must be presented, an order two of their functions have to be called in.
A tool can contribute an excerpt to the system prompt of every run it is offered in. Put it in a
class-level [ToolSystemPrompt("…")] on the class your tool code returns, and every chat or
agent run that offers the tool appends the excerpt to its system prompt:
[ToolSystemPrompt("""
When you cite a ticket, always give its number and its current status — a ticket referred to by
title alone is ambiguous, several are usually open with the same one.
""")]
public class TicketsTool
{
[Tool("Looks a ticket up by number.")]
public static async Task<string> GetTicket(ToolScope scope,
[Parameter("Ticket number", required: true)] string number)
{
// ...
}
}
return new TicketsTool();
The rule then travels with the tool: it does not have to be copied into the prompt of every assistant that enables the tool, and it cannot go stale when the tool changes.
What the runtime guarantees:
- Only tools the run actually offers contribute. Excerpts are read through the same cache the run's tool surface is built from — on the agent path, after the per-user accessibility filter — so the prompt can never describe a tool the model cannot call.
- Order is by tool UID, never the order the caller listed its tools in. The same set of tools produces the same prompt bytes on every turn, which is what lets the provider's prompt cache hit.
- The excerpts are laid out as one section: a
# Tool usage guidelinesheading, then a##subsection per tool named after it. Write your excerpt without a heading of its own. - The excerpt is read once, when the tool is compiled into the cache, and is replaced when an edit recompiles the tool.
It is paid for on every turn
The excerpt is in the system prompt of every turn of every chat the tool is enabled in, whether or not the tool is ever called. Keep it short, and keep it about that tool — anything that applies to the assistant as a whole belongs in the assistant's own prompt.
For a deep research tool the attribute goes on the IDeepResearcher implementation. Both shipped
researchers carry one, which is where the assistant is told not to summarise a report away and that the
chat takes no messages while a run is in flight.
Related
- AI Tools — writing a tool of your own.
- AI Tools Scope — the
ToolScopesurface every tool method receives. - AI Agents — packaging a prompt, a tool set and a model.