---
key: nova-mcp-tools
title: The tools an assistant gets over MCP
audience: developer
section: api/agents
routes: []
since: 0.0.1
updated: 0.0.1
status: published
summary: The tools, resources and prompts Nova's MCP server offers, including find_operations and call_nova_operation, which reach everything a connection's grant covers.
keywords: [mcp, tools, find_operations, call_nova_operation, whoami, search_help, resources, prompts, claude, chatgpt]
related: [connect-an-ai-agent, find-what-to-call, wait-for-a-person-to-approve, api-errors]
---

Once connected ([[connect-an-ai-agent]]), an assistant calls
`tools/list` and gets only the tools its connection can actually use.

## Built-in tools

| Tool | What it does |
|---|---|
| `whoami` | Who the connection acts as, which organization, and the permissions behind it. Call it first. |
| `list_my_organizations` | The organizations the person belongs to; a machine credential is bound to one. |
| `find_operations` | Search every operation this connection can call, by words, address or permission key. |
| `call_nova_operation` | Call any operation `find_operations` returned, by its `operation_id`. |

## Documented tools

The documented operations in the [[api-reference]] are tools with the same
names: `list_accounts`, `create_quote`, `send_invoice`,
`schedule_work_order`, `search_help`, `get_help_article` and so on. A tool is
listed only when the connection holds every permission it checks.

## Reaching everything else

An assistant cannot hold the roughly 3,200 operations Nova has, so it
searches for them:

```json
{"jsonrpc": "2.0", "id": 3, "method": "tools/call",
 "params": {"name": "find_operations",
            "arguments": {"query": "void agreement", "limit": 5}}}
```

```json
{"items": [{"operation_id": "post_agreements_by_agreement_void",
            "method": "POST",
            "path": "/v1/agreements/{agreement_uid}/void",
            "summary": "Void an agreement",
            "permissions": ["agreements.void"],
            "path_params": ["agreement_uid"],
            "read_only": false, "destructive": false}],
 "count": 1,
 "next_step": "Call one with call_nova_operation, passing its operation_id."}
```

Only operations the connection holds the permissions for are returned. Then:

```json
{"jsonrpc": "2.0", "id": 4, "method": "tools/call",
 "params": {"name": "call_nova_operation",
            "arguments": {"operation_id": "post_agreements_by_agreement_void",
                          "arguments": {"agreement_uid": "agr_5c2e9a0d1b7f4e36",
                                        "body": {"reason": "Customer cancelled"}}}}}
```

Inside `arguments`: address placeholders by name, filters as plain keys, the
request body under `body`. The operation runs its own permission checks, so
these two tools add reach, never rights. A connection with nothing granted is
not offered them.

## Resources and prompts

- **Resources:** every help article as `nova://help/<key>`. Read the article
  for a screen before acting on it.
- **Prompts:** `create_quote_for_customer`, `schedule_work_order` and
  `answer_with_help`.

## When a tool call fails

The result is marked `isError: true` and its text is Nova's error
([[api-errors]]). The ones an assistant meets most:

- `approval_required` — tell the person, then repeat the same call once they
  approve ([[wait-for-a-person-to-approve]]).
- A missing permission — say which one (`detail.missing_permissions`); a
  person can add it to the connection.
- `agent_outside_working_hours` — say when it may act next.
- `429` — slow down; wait the time the error gives.
