Skip to main content

MCP for AI assistants

Naqood can talk to Claude and ChatGPT. You add one connection URL, sign in to Naqood in the browser, and choose what the assistant may do. It then acts as you in every workspace you can access. In each workspace it cannot do more than your role there allows.

You do not need an API secret for this. Disconnect any time from User Settings → AI assistants.

Connection URL

https://app.naqood.ae/mcp

In the Naqood app, User Settings → AI assistants shows this URL with copy buttons and click-by-click steps.

Connect Claude

Works on claude.ai, Claude Desktop, and Cowork. Custom connectors on the mobile app are in beta. Free plans can add one custom connector. On Team or Enterprise, an owner must add Naqood first (Organization settings → Connectors → Add → Custom → Web), then each person connects their own account.

  1. Open Claude and go to Customize → Connectors.
  2. Click + next to Connectors, then Add custom connector.
  3. Name it Naqood and paste https://app.naqood.ae/mcp.
  4. Click Add, then Connect on the Naqood connector.
  5. Sign in to Naqood, choose what it can do, and click Allow access.
  6. In a chat, click + → Connectors, turn Naqood on, and ask something like “What invoices are overdue at Acme Trading?”

Direct link: claude.ai/settings/connectors.

Connect ChatGPT

You need ChatGPT Plus, Pro, Business, Enterprise, or Education on the web. Custom connectors are not on the free plan.

  1. Open ChatGPTSettings → Security and login.
  2. Turn on Developer mode.
  3. Go to ChatGPT Plugins and click +.
  4. Name it Naqood, add a short description, and set the MCP server URL to https://app.naqood.ae/mcp.
  5. Click Create, then sign in to Naqood, choose what it can do, and Allow access.
  6. In a new chat, open +, choose Developer mode, enable Naqood, and ask about invoices, profit, or VAT.

What the assistant can do

The assistant is the signed-in user. You pick a subset of capabilities at connect time. Those are a ceiling. Each tool call still checks your role in that workspace.

Read:

  • Workspaces you can access, customers, suppliers, products, invoices, purchases, documents
  • Invoice and purchase details (including attachments), P&L, aged debtors, VAT summary
  • Unmatched bank transactions
  • Draft journal entries on the accounting worksheet

Write (drafts and records):

  • Create a customer or supplier
  • Create a catalog product or service
  • Upload a file and attach it to an invoice, purchase, or journal entry
  • Create a draft invoice (it is not posted or emailed)
  • Create a draft purchase / supplier bill (it is not posted)
  • Save bank rec match suggestions you chose, for a human to review in Naqood
  • Save draft journal entries on the worksheet (they are not posted)

Write (posting — separate permission):

  • Approve a draft invoice so it is posted to the ledger (it is numbered and marked sent; it is not emailed)
  • Approve a draft purchase so it is posted to the ledger
  • Post journal entries to the ledger

The assistant cannot email invoices, record bank payments, run payroll, or delete records. Posting to the ledger is bookkeeping; it does not move money.

Money and currencies

Every workspace has a base currency (baseCurrency / currency on the organization). That is the ledger. Invoices and purchases can still be booked in another document currency.

  • Unprefixed header fields (total, remainder, subtotal, vat) are in baseCurrency.
  • original* fields (originalTotal, originalRemainder, originalSubtotal, originalVat) are in currency, the document's originally booked currency.
  • exchangeRate: 1 unit of document currency = exchangeRate units of baseCurrency. So originalTotal × exchangeRate = total.
  • When currency equals baseCurrency, the original and unprefixed amounts match and exchangeRate is 1.
  • Invoice/purchase line unitPrice, line total, and purchase line cost are in the document currency (same as original*), not in baseCurrency.
  • P&L and VAT reports are in baseCurrency. Aged debtors are in each invoice's original booked currency.
  • Bank lines use the bank account currency. When matching, payment.amount is in the document currency (originalRemainder); payment.transactionAmount is in the bank line currency.
  • Journal line amount is in line.currency (defaults to baseCurrency). If they differ, amount × exchangeRate is the ledger amount.

If you belong to many companies (for example an accountant), name the client in the question. The assistant looks up the workspace, then works only there.

Try asking:

  • “What invoices are overdue at Acme Trading?”
  • “List unpaid invoices at Acme Trading”
  • “Suggest matches for unmatched bank lines at Acme”
  • “Show this month’s profit and loss for Acme”
  • “Who are my top unpaid customers?”
  • “Draft an invoice for Acme Trading”
  • “Draft a bill from Desert Supplies for Acme”
  • “Upload this receipt and attach it to that bill”
  • “Approve that draft invoice for Acme”
  • “Post these worksheet entries for Acme”

Tools

Read:

  • list_organizations — workspaces the user can access, with availableScopes per workspace. Call this first.
  • get_organization — workspace name, baseCurrency (ledger), VAT, fiscal year
  • search_accounts — resolve a posting account by name, code, or type. Requires accounts:read, or an invoice, purchase, line-item, or bank scope.
  • search_contacts — resolve a customer or supplier by name
  • search_line_items — resolve a product or service by name or code
  • list_invoices — invoices in a workspace, with optional payment status, customer, number, and date filters. total/remainder are ledger (baseCurrency); originalTotal/originalRemainder are the booked document currency.
  • list_overdue_invoices — unpaid invoices past due
  • list_invoices_for_contact — invoices for one customer
  • get_invoice — one invoice, including line items and attached files. Header totals in baseCurrency; original* and line prices in document currency.
  • list_purchases — bills and purchases, with optional payment status, supplier, and date filters. Same amount convention as invoices.
  • get_purchase — one purchase, including lines and attached files. Same amount convention as invoices.
  • list_docs — uploaded files in a workspace
  • get_doc — one file, including contents so the assistant can read receipts and PDFs
  • get_profit_and_loss — P&L for a date range
  • get_aged_debtors — outstanding customer balances
  • get_vat_summary — UAE VAT totals by code
  • list_unmatched_bank_transactions — bank lines not yet reconciled
  • get_worksheet — draft journal entries on the accounting worksheet. Nothing here is posted yet.

Write (drafts and records):

  • create_contact — create a customer or supplier (idempotent)
  • create_line_item — create a catalog product or service (idempotent). Requires accountId from search_accounts
  • draft_invoice — create a draft only; it is not posted or emailed. Ad-hoc lines need accountId; catalog lines use lineItemId. Optional vatAmountMode: exclusive (default) or inclusive. Optional docIds to attach files.
  • draft_purchase — create a draft supplier bill; it is not posted. Lines need accountId from search_accounts. Optional vatAmountMode: inclusive (default) or exclusive. Optional docIds to attach files.
  • upload_doc — upload a file (base64). Optional attachTo an invoice, purchase, or journal entry
  • attach_docs — attach existing files to an invoice, purchase, or journal entry
  • update_doc — rename a file or change its note
  • suggest_bank_rec_matches — save match suggestions the assistant chose (invoice, purchase, transfer, or journal entry) for review in Naqood. Naqood does not auto-match.
  • save_worksheet — replace the draft journal entries on the worksheet. Drafts only; nothing is posted.

Write (posting — separate permission):

  • approve_invoice — post a draft invoice to the ledger. Assigns an invoice number and marks it sent; it is not emailed.
  • approve_purchase — post a draft supplier bill to the ledger.
  • post_journal_entries — post journal entries to the ledger. Optional docIds attach files.

Every tool except list_organizations takes a slug. Creates that mint a new record (create_contact, create_line_item, draft_invoice, draft_purchase, upload_doc) require an idempotencyKey.

Scopes

ScopeTools
org:readlist_organizations, get_organization
accounts:readsearch_accounts
contacts:readsearch_contacts
contacts:writecreate_contact
invoices:readinvoice list/get tools
invoices:writedraft_invoice
invoices:approveapprove_invoice
line_items:readsearch_line_items
line_items:writecreate_line_item
purchases:readlist_purchases, get_purchase
purchases:writedraft_purchase
purchases:approveapprove_purchase
docs:readlist_docs, get_doc
docs:writeupload_doc, attach_docs, update_doc
reports:readP&L, aged debtors, VAT
worksheet:readget_worksheet
worksheet:writesave_worksheet
journal:writepost_journal_entries
bank:readunmatched bank transactions
bank:writebank rec suggestions

Token scopes are the maximum the user granted. A tool still fails in a workspace where the user's role lacks the matching permission. A sales user who only has invoice permission will not get report or bank tools, even if the client requested them.

Any MCP client that supports remote HTTP and OAuth can use the same URL. Do not paste an API secret.

OAuth details

Naqood is both the resource server (/mcp) and the authorization server. Assistants connect with OAuth 2.1 (PKCE, public clients, short-lived access tokens). Access tokens are bound to the user, not to a single workspace.

The client discovers authorization at:

https://app.naqood.ae/.well-known/oauth-protected-resource/mcp
https://app.naqood.ae/.well-known/oauth-authorization-server
EndpointPurpose
GET /mcp/authorizeUser consent (browser)
POST /mcp/registerDynamic client registration (RFC 7591)
POST /mcp/tokenAuthorization code and refresh token grants
POST /mcp/revokeRefresh token revocation

Access tokens last one hour. Refresh tokens last 30 days. PKCE S256 is required. Clients are public (token_endpoint_auth_method: none).

Do not use GraphQL API secrets against /mcp. That flow is separate from partner OAuth.