Skip to main content

Overview

Tools are capabilities the agent can invoke during a conversation. Some tools require your approval before executing (marked with πŸ”’). Some tool schemas are deferred. Deferred tools are known to the agent, but their full schemas are hidden until the agent calls load_tools. This keeps the prompt smaller and avoids carrying Gmail, calendar, Slack, MCP, automation, background, notification, and directive tools in every turn. Loading a tool only makes it callable on the next model step; it does not execute the tool or bypass approvals.

System & files

ToolDescriptionApproval
bashExecute shell commandsπŸ”’ Dangerous commands
read_file / list_files / find_files / search_textInspect local files without editing themβ€”
write_file / edit_fileCreate or modify local filesπŸ”’
current_timeGet current date and timeβ€”
researchSpawn a research agent with all read-only tools (depth: quick/normal/deep)β€”
backgroundSpawn an autonomous background agent for long-running tasksβ€”
render_htmlRender a sandboxed rich card in desktop chat (display or input mode)β€”
load_toolsLoad deferred tool schemas by group or exact nameβ€”
set_directivesSet persistent behavioral directives injected into the system promptπŸ”’
File write tools and set_directives are deferred. The background tool can start new background work immediately; the background deferred group is only for listing, reading, or canceling existing background tasks.

Email

Requires Gmail to be connected. Deferred group: email.
ToolDescriptionApproval
emailsSearch and list emailsβ€”
read_emailRead full email contentβ€”
send_emailSend an emailπŸ”’

Calendar

Requires Google Calendar to be connected. Deferred group: calendar.
ToolDescriptionApproval
calendarSearch and list eventsβ€”
create_calendar_eventCreate an eventπŸ”’
edit_calendar_eventEdit an eventπŸ”’
delete_calendar_eventDelete an eventπŸ”’

Memory

ToolDescriptionApproval
rememberStore a factπŸ”’
recallSearch stored knowledgeβ€”
forgetDelete facts by queryπŸ”’

Web

Web search uses WEB_SEARCH mode (auto, exa, ddgs, none). EXA_API_KEY is only required when mode resolves to Exa.
ToolDescriptionApproval
web_searchSearch the webβ€”
web_fetchFetch content from a URLβ€”

Slack

Requires Slack to be connected. Deferred group: slack.
ToolDescriptionApproval
slack_searchSearch Slack messagesβ€”
slack_channelRead recent channel historyβ€”
slack_threadRead a message threadβ€”
slack_channelsList accessible channelsβ€”
slack_dmsList open direct messagesβ€”
slack_dmRead a direct message conversationβ€”
slack_usersSearch workspace membersβ€”
slack_userRead a user profileβ€”
slack_post_messagePost a messageπŸ”’
slack_post_blocksPost Block Kit contentπŸ”’

Automations

Deferred group: automations.
ToolDescriptionApproval
create_automationSchedule a taskπŸ”’
create_loopStart an in-chat recurring loopπŸ”’
schedule_wakeupSchedule a one-off wakeup into the current sessionπŸ”’
list_automationsList all automationsβ€”
update_automationModify an automationπŸ”’
delete_automationRemove an automationπŸ”’
run_automationTrigger immediate runπŸ”’
get_automation_resultGet last run resultβ€”

Runtime state

ToolDescriptionApproval
update_todosUpdate the visible task list for complex workβ€”
get_goalRead the active durable session goalβ€”
complete_goalMark the active goal complete after verificationβ€”
block_goalMark the active goal blocked on missing inputβ€”
create_sessionCreate a new chat/channel sessionβ€”
list_recent_sessions / read_session / search_transcriptsInspect readable chat historyβ€”
These are mostly internal coordination tools. The desktop app exposes the visible results as todos, channels, session history, and status updates.

Background tasks

Deferred group: background.
ToolDescriptionApproval
cancel_background_taskCancel a running background task by IDπŸ”’
get_background_resultGet the output of a completed background taskβ€”
list_background_tasksList all running background tasksβ€”
Background tasks are spawned via the background tool. Results are delivered automatically via SSE when complete β€” use get_background_result to read the full output.

Notifications

Deferred group: notifications.
ToolDescriptionApproval
notifySend a notificationπŸ”’

MCP tools

Connected MCP server tools are deferred by server. Use load_tools(group="mcp:<server>"), for example load_tools(group="mcp:obsidian"). MCP tools still keep their own approval/mutation behavior after loading. MCP tools default to conservative external execution: approval required. Per-tool config can override that with tool_policies.<tool_name>. If a server is trusted, trust_tool_annotations=true lets ntrp use MCP Tool.annotations hints such as readOnlyHint and destructiveHint; explicit tool_policies still win.

Deferred loading examples

NeedLoad call
Search Gmailload_tools(group="email")
Read or edit calendarload_tools(group="calendar")
Search Slackload_tools(group="slack")
Manage automationsload_tools(group="automations")
Spawn or inspect background workload_tools(group="background")
Send a notificationload_tools(group="notifications")
Update standing directivesload_tools(group="directives")
Use an MCP serverload_tools(group="mcp:<server>")

Skills

ToolDescriptionApproval
use_skillActivate a skill for specialized instructionsβ€”
Obsidian should be connected as an MCP server and loaded with load_tools(group="mcp:obsidian") when needed.

Approval flow

When a tool requires approval, the desktop app shows an approval card with the tool name, arguments, preview, and options to approve or reject the call. Session/tool-specific policy overrides can skip repeated approvals when you explicitly configure them. Settings β†’ Tools can override individual tools:
OverrideBehavior
DefaultUse the tool’s policy
ApproveExpose the tool and skip approval
AskExpose the tool and require approval
DenyHide the tool from the agent and block execution

User-defined tools

Create custom tools in ~/.ntrp/tools/. Each file is a Python module that exports a tools mapping:
from pydantic import BaseModel, Field

from ntrp.tools.core import ToolAction, ToolPolicy, ToolResult, ToolScope, tool
from ntrp.tools.core.context import ToolExecution


class EchoInput(BaseModel):
    text: str = Field(description="Text to echo")


async def echo(execution: ToolExecution, args: EchoInput) -> ToolResult:
    return ToolResult(content=args.text, preview="Echoed")


tools = {
    "echo": tool(
        display_name="Echo",
        description="Echo text back to the user.",
        input_model=EchoInput,
        policy=ToolPolicy(action=ToolAction.READ, scope=ToolScope.INTERNAL),
        execute=echo,
    )
}
Use policy=ToolPolicy(..., requires_approval=True) plus an approval= function for tools that change source-of-truth state. Use permissions=frozenset({...}) to hide a tool unless a service is configured. Restart the server after adding or changing user tools.