Skip to content

Aequo MCP server

Let Claude, Cursor or your own agent answer questions about your accounts payable: what is waiting for approval, which invoices have exceptions, how ready the month-end close is. The Aequo MCP server uses the Model Context Protocol over HTTP and the same scoped API keys as the REST API.

Endpoint
https://api.nexusap.com/v1/mcp
Transport
Streamable HTTP, stateless, JSON responses.
Auth
Bearer API key (nxs_live_...). Each tool needs its scope.

What an agent can and cannot do

  • It reads the workspace that owns the key, and can upload invoices for processing. Nothing else changes.
  • It cannot approve invoices, pay anyone, change vendor bank details, change settings or reveal tax IDs. People do those in the Aequo app.
  • A key never does more than the person who created it. A key created by a member who only sees some companies only reaches those companies, and does not get the workspace-wide close and duplicate tools.
  • The agent only sees the tools its key has scopes for. A key with documents:read sees the document tools and nothing more.
  • Invoice text, vendor names and notes come from documents other people wrote. The server tells agents to treat them as data, never as instructions.

Set it up

  1. 1. Create an API key

    In the Aequo app, open Settings → API Keys (workspace owners and admins, from the Growth plan). For an assistant that only answers questions, choose read. Add documents:write only if it should upload invoices. Use a separate key for each assistant so you can revoke one without the others.

  2. 2. Connect your client

    Claude Code

    Terminal
    claude mcp add --transport http aequo https://api.nexusap.com/v1/mcp \
      --header "Authorization: Bearer $AEQUO_API_KEY"

    Claude Desktop

    Add this to claude_desktop_config.json. It uses the mcp-remote bridge to send the key as a header; keep the key in env so it stays out of the command line.

    claude_desktop_config.json
    {
      "mcpServers": {
        "aequo": {
          "command": "npx",
          "args": [
            "-y", "mcp-remote", "https://api.nexusap.com/v1/mcp",
            "--header", "Authorization:${AEQUO_AUTH_HEADER}"
          ],
          "env": { "AEQUO_AUTH_HEADER": "Bearer nxs_live_..." }
        }
      }
    }

    Cursor

    ~/.cursor/mcp.json
    {
      "mcpServers": {
        "aequo": {
          "url": "https://api.nexusap.com/v1/mcp",
          "headers": { "Authorization": "Bearer nxs_live_..." }
        }
      }
    }

    OpenAI API (Responses)

    ChatGPT's own connectors sign in with OAuth, which the Aequo MCP server does not offer yet. From the OpenAI API you can pass the key as a header:

    Python
    from openai import OpenAI
    
    client = OpenAI()
    response = client.responses.create(
        model="gpt-5",
        tools=[{
            "type": "mcp",
            "server_label": "aequo",
            "server_url": "https://api.nexusap.com/v1/mcp",
            "headers": {"Authorization": f"Bearer {AEQUO_API_KEY}"},
            "require_approval": "always",
        }],
        input="Which invoices are waiting for my approval, and which are past SLA?",
    )
    print(response.output_text)
  3. 3. Check it works

    Ask your assistant “What is waiting for my approval in Aequo?” or list the tools directly:

    tools/list
    curl -X POST "https://api.nexusap.com/v1/mcp" \
      -H "Authorization: Bearer $AEQUO_API_KEY" \
      -H "Content-Type: application/json" \
      -H "Accept: application/json, text/event-stream" \
      -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Tools

A broad read key covers every read scope, and write every write scope. List results come in pages of up to 50, with a cursor for the next page.

Aequo MCP tools and the API key scopes they need
ToolWhat it doesScope
list_documentsList invoices, POs and delivery notes, with filters for type, status, review and date.documents:read
get_documentOne document, with the fields Aequo read from it.documents:read
upload_invoiceSend a PDF, PNG, JPEG or CSV (up to 5 MB) for reading and matching.Writes data.documents:write
list_purchase_ordersPurchase orders with status and billed-to-date amounts.purchase-orders:read
get_purchase_orderOne purchase order with its lines.purchase-orders:read
list_matches3-way match results and whether each cleared.matches:read
get_matchOne match result.matches:read
get_match_linesLine-by-line quantities, prices and variances for a match.matches:read
list_exceptionsPrice, quantity and missing-receipt exceptions and their status.exceptions:read
get_exceptionOne exception.exceptions:read
get_exception_historyStatus changes on an exception and who made them.exceptions:read
list_suppliersVendors, with search. Never returns tax IDs or bank details.suppliers:read
get_supplierOne vendor with its matching tolerances.suppliers:read
get_approval_queueInvoices waiting for the key creator’s approval, ordered by urgency.documents:read
get_close_statusMonth-end close checklist, blockers, readiness and AP KPIs.Not for company-restricted keys.documents:read, matches:read, exceptions:read
check_invoice_duplicatesLikely duplicates of an invoice and unusual amounts for that vendor.Not for company-restricted keys.documents:read

Requests share the API's rate limits. Questions or a tool you need? Contact us.