Agent tools
Built-in tools, custom webhook tools, and MCP server tools — let your agents take actions during conversations.
Agents can call tools mid-conversation to take actions: end the call, look up data in your CRM, query a knowledge base, send a rich card to the chat widget, integrate with an MCP server, or hit any HTTP endpoint you own. The LLM decides when to call a tool based on its system prompt and the conversation context.
Three kinds of tools:
| Type | Lives in | Configuration |
|---|---|---|
| Built-in | Nerva | Toggle on/off in the agent editor |
| Webhook | Your servers | Define URL, method, parameters, auth |
| MCP | Any MCP server | Point at an MCP HTTP endpoint, optionally filter tools |
Mix and match — an agent can have any combination active at once.
Built-in tools
Pre-implemented tools shipped with Nerva. Toggle them on per-agent.
Voice + Chat
| Tool | What it does |
|---|---|
end_call | Ends the call/session gracefully with a configurable goodbye and reason. |
kb_query | Searches a knowledge base attached to the agent and returns relevant chunks for grounding. |
request_lead_capture | (Chat) Renders the lead-capture form in the widget. Useful for "let me get your details first" flows. |
send_sms | Sends an SMS from the agent's phone number to the contact (e.g., "I'll text you the booking confirmation"). |
Voice-only
| Tool | What it does |
|---|---|
dtmf | Sends DTMF tones — press_digits("123#"). Used to navigate IVRs or enter codes on a transferred line. |
human_handoff | Warm-transfers the call to a configured human number. The agent introduces the caller before transferring. |
voicemail | Detects voicemail / leaves a configured message and ends the call. |
otp | Sends a one-time passcode to the caller for verification. |
Chat-only
| Tool | What it does |
|---|---|
send_ui | Renders a rich UI element (carousel, card, quick replies, form) in the chat widget. The agent decides when to show what. |
get_page_context | Reads the current page URL, referrer, and visitor locale — useful when the agent's behavior depends on which page the visitor is on. |
CRM-attached tools
When you attach a CRM integration to an agent, additional tools become available. For GoHighLevel:
lookup_contact— search contacts by phone or emailcheck_availability— list free calendar slotsbook_appointment— book a confirmed slotget_pipelines— list opportunity pipelines
See CRM integrations for details.
Webhook tools
Webhook tools are custom HTTP calls your agent can make. You define the URL, HTTP method, request shape, and how the response should be parsed; the LLM decides when to call it based on the description you give.
This is the most powerful tool type — it's how you connect agents to your own backends, third-party APIs, or any HTTP service.
Configuring a webhook tool
Dashboard → Agents → your agent → Tools → Add webhook tool:
| Field | What it does |
|---|---|
| Name | Function name the LLM sees (e.g., lookup_order). Use snake_case. |
| Description | Tell the LLM when to call this. Be specific — this is the most important field. |
| URL | Full URL. Supports {{parameter}} templating to insert extracted parameters. |
| Method | GET, POST, PUT, PATCH, or DELETE. |
| Headers | Static headers (e.g., Authorization: Bearer xxx). |
| Auth | None / Bearer / Basic / API key — separate from headers, gets the right shape automatically. |
| Parameters | The arguments the LLM extracts from the conversation. Each has a name, type, description, and where it goes (URL path, query, body, header). |
| Body template | (For POST/PUT/PATCH) JSON template using {{parameter}} syntax. |
| Timeout | 1–60 seconds. Default 10. |
| Output schema | (Optional) Tell the agent what shape to expect back so it can use specific fields. |
Use case 1 — Order status lookup
A support agent looks up order status mid-call.
The agent now responds naturally: "Let me check that for you... your order is shipped and should arrive by Friday."
Use case 2 — Trigger an n8n / Zapier workflow
Fire a complex multi-step automation from inside a call.
The agent: "Great — I'll send that quote to your inbox right now." Make runs the workflow (lookup customer in HubSpot, generate PDF, attach, send via Gmail), and the agent gets a 200 OK to confirm.
Use case 3 — Stripe payment link
Generate a one-time payment link during the call.
Combine with send_sms: "I've sent the link to your phone. It's $49.99 for
the premium plan."
Use case 4 — Internal sales lookup
Read your CRM/ERP to personalize the call.
The agent uses this for context: "Hi Sarah, I see you're on our Pro plan and have one open ticket about billing — is that what you're calling about?"
Use case 5 — Real-time inventory
Check live stock before promising delivery.
Webhook tool best practices
- Write the description for the LLM, not for humans. Be specific about when to call it ("when the customer asks about X", not "this gets X").
- Name parameters clearly.
customer_emailbeatsemailif there could be more than one email in the conversation. - Use output schemas so the agent can refer to specific response fields without guessing JSON keys.
- Keep timeouts short. 5–10s is plenty for most APIs. Long timeouts block the conversation.
- Authenticate via the
Authfield, not custom headers. That way Nerva redacts secrets from logs automatically. - Test with
Send test eventbefore pointing real traffic at it.
MCP tools
Model Context Protocol (MCP) is an open standard for connecting LLMs to external systems. Many SaaS products and internal services expose an MCP server that handles auth, schemas, and tool discovery automatically — point Nerva at the URL and your agent gets all those tools at once.
Configuring an MCP tool
Dashboard → Agents → your agent → Tools → Add MCP server:
| Field | What it does |
|---|---|
| Name | Internal label. |
| Server URL | The MCP server endpoint (Streamable HTTP transport). |
| Headers | Auth headers required by the server (e.g., Authorization: Bearer xxx). |
| Selected tools | (Optional) Allowlist specific tools from the server. Leave blank to expose all. |
Nerva connects to the server, fetches its tool catalog, and registers each tool with the LLM. The LLM sees them like any other tool.
Use case 1 — Notion workspace
Let the agent read and create pages in your team's Notion workspace.
The agent can now: "Let me find that runbook... [searches Notion]... here's the relevant section." Or: "I've created a Notion page with the action items from this call."
Use case 2 — GitHub repo access
A dev-tools support agent can search code, read PRs, file issues.
Use case: developer support agent that can answer "where is the auth middleware defined?" by searching code, then file a GitHub issue describing the bug the user reported.
Use case 3 — Linear / Jira / Asana
Let the agent file tickets directly from a support call.
"I've filed Linear ticket ENG-1234 with the steps you described. Engineering will follow up by tomorrow."
Use case 4 — Slack notifications
Notify a channel from inside a call.
"I'm escalating this to our on-call engineer right now... done, they'll ping you in the next 5 minutes."
Use case 5 — Internal company MCP
Build your own MCP server exposing your specific business operations (create user, refund order, escalate ticket) and point your agents at it.
This is the cleanest way to expose a suite of related tools without configuring each one as a webhook tool. Build the server once with your auth + schemas; every agent attaches with a single URL.
MCP best practices
- Restrict scope. Use the
selected_toolsallowlist to only expose tools the agent actually needs. Don't give a customer-support agent access to yourdelete_accounttool. - One MCP server per concern. Notion + Linear + GitHub as three separate MCP entries is cleaner than one mega-server.
- Auth happens at the server. MCP servers handle their own auth — you pass a token in headers and the server scopes the operations. No need to repeat auth config per tool.
- Test with a short prompt. After adding an MCP server, verify the agent can list its tools with a prompt like "what tools do you have for Linear?" before relying on them in production.
How the agent decides which tool to call
The LLM sees all enabled tools as function-calling candidates. It picks based on:
- Conversation context — what the user just said.
- Tool descriptions — short, specific descriptions guide the LLM toward the right tool. Be intentional.
- System prompt — your top-level instructions shape tool-selection bias ("always look up the contact first before answering pricing questions").
Multiple tools can be called in a single turn — the agent might
lookup_contact then immediately book_appointment based on the
returned data, all before responding to the user.
Webhooks vs webhook tools — clarifying the names
Nerva uses "webhook" for two distinct things:
| Term | Direction | Trigger | Configured at |
|---|---|---|---|
| Webhooks (docs) | Outbound (Nerva → you) | Events: call.ended, chat.lead.captured, etc. | Org level (Integrations) |
| Webhook tools (this page) | Outbound (your agent → your API) | LLM tool call mid-conversation | Per-agent (Tools tab) |
Both are HTTP POSTs from Nerva to your URLs, but they fire at different times for different reasons. Webhooks are about what just happened; webhook tools are about what the agent wants to do right now.
See also
- Voice agents — voice-specific tool considerations
- Chat agents — chat-specific tool considerations
- CRM integrations — managed tools shipped via CRM connections
- Webhooks — outbound event delivery (different concept)