---
key: connect-an-ai-agent
title: Connect an AI agent through MCP
audience: developer
section: api/agents
routes: []
since: 0.0.1
updated: 0.0.1
status: published
summary: Connect Claude, ChatGPT or any MCP-capable assistant to Nova, as a person or as an AI teammate, and what it can reach once connected.
keywords: [mcp, claude, chatgpt, agent, connector, tools, approvals]
related: [nova-mcp-tools, run-an-ai-teammate, wait-for-a-person-to-approve, api-authentication, api-overview, api-reference]
---

Nova speaks the Model Context Protocol. Point an assistant at the MCP
endpoint and it discovers how to sign in, which tools exist and where the
help articles are.

```
MCP endpoint:          https://app.novabmp.com/mcp
Resource metadata:     https://app.novabmp.com/.well-known/oauth-protected-resource/mcp
```

## Two ways an assistant can act

- **As a person.** In Claude or ChatGPT, add Nova as a custom connector with
  the endpoint above. The assistant registers itself, sends the person to
  Nova, the person presses **Allow**, and the assistant acts as that person
  with the scopes they approved. The person can disconnect it any time under
  **Profile › Connected apps**. On the same screen, under **Connect as**, a
  person who looks after an AI teammate (or an admin) can hand the assistant
  that teammate instead of themselves; it then acts under the teammate's name
  and roles.
- **As an AI teammate.** A person in the organization adds it under
  **Administration › Team & Access › AI Teammates**, gives it roles like any
  team member, and issues a secret. Your AI platform signs in with client
  credentials ([[run-an-ai-teammate]]). Everything it does is recorded under
  its own name, with its accountable person on record.

## What the assistant gets

- **Documented tools** with the same names as the operation ids in
  [[api-reference]]: `list_accounts`, `create_quote`, `send_invoice`,
  `search_help`, `get_help_article` and so on. A tool is listed only when the
  connection holds every permission it checks.
- **Everything else** through `find_operations` and `call_nova_operation`,
  which search and call any of Nova's operations the connection's grant
  covers.
- **Built-in tools:** `whoami` and `list_my_organizations`.
- **Resources:** every help article as `nova://help/<key>`, so the assistant
  can read how a screen works before it acts.
- **Prompts:** short recipes such as creating a quote for a customer.

The full list with examples: [[nova-mcp-tools]].

## Approvals

The few actions Nova guards with an identity check (payout accounts, role
changes and member removal, bulk exports) always wait for a person. When an
AI teammate signs in with its own credentials, the actions its organization
listed under **Ask a person first** wait too. A connector added in Claude or
ChatGPT has no such list of its own, including when it connects as a
teammate. When the assistant attempts one of these actions, the call returns
`403 approval_required` with an `approval_request_uid`. A person approves it
in Nova's **Approvals** inbox; the assistant then repeats exactly the same
call and it runs once. Approvals last 72 hours. Details:
[[wait-for-a-person-to-approve]].

## Limits that always apply

- A grant narrows, never widens: the assistant never does more than the
  person it acts as, or an AI teammate's roles, allow.
- Paused or retired AI teammates lose their tokens immediately.
- Per-minute limits per token and per organization: [[api-limits]]. Back
  off on `429`. An AI teammate's working hours apply however it connects; its
  daily cap applies when it signs in with its own credentials.
- A customer-facing AI teammate's texts and emails end with an AI disclosure
  line that Nova adds.
- Every call is in the audit log (**Administration › System › Audit Log**,
  the **API & Agents** view), and an AI teammate's own activity is on its
  card.

## Testing without an assistant

Use the same tools by hand:

```http
POST /mcp
Authorization: Bearer <token>
Content-Type: application/json

{"jsonrpc":"2.0","id":1,"method":"tools/list"}
```

Then call one:

```json
{"jsonrpc":"2.0","id":2,"method":"tools/call",
 "params":{"name":"list_accounts","arguments":{"q":"smith","limit":5}}}
```
