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.
- Open Claude and go to Customize → Connectors.
- Click + next to Connectors, then Add custom connector.
- Name it
Naqoodand pastehttps://app.naqood.ae/mcp. - Click Add, then Connect on the Naqood connector.
- Sign in to Naqood, choose what it can do, and click Allow access.
- 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.
- Open ChatGPT → Settings → Security and login.
- Turn on Developer mode.
- Go to ChatGPT Plugins and click +.
- Name it
Naqood, add a short description, and set the MCP server URL tohttps://app.naqood.ae/mcp. - Click Create, then sign in to Naqood, choose what it can do, and Allow access.
- 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 incurrency, the document's originally booked currency.exchangeRate: 1 unit of document currency =exchangeRateunits ofbaseCurrency. SooriginalTotal × exchangeRate = total.- When
currencyequalsbaseCurrency, the original and unprefixed amounts match andexchangeRateis1. - Invoice/purchase line
unitPrice, linetotal, and purchase linecostare in the documentcurrency(same asoriginal*), not inbaseCurrency. - 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.amountis in the document currency (originalRemainder);payment.transactionAmountis in the bank line currency. - Journal line
amountis inline.currency(defaults tobaseCurrency). If they differ,amount × exchangeRateis 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, withavailableScopesper workspace. Call this first.get_organization— workspace name, baseCurrency (ledger), VAT, fiscal yearsearch_accounts— resolve a posting account by name, code, or type. Requiresaccounts:read, or an invoice, purchase, line-item, or bank scope.search_contacts— resolve a customer or supplier by namesearch_line_items— resolve a product or service by name or codelist_invoices— invoices in a workspace, with optional payment status, customer, number, and date filters.total/remainderare ledger (baseCurrency);originalTotal/originalRemainderare the booked document currency.list_overdue_invoices— unpaid invoices past duelist_invoices_for_contact— invoices for one customerget_invoice— one invoice, including line items and attached files. Header totals inbaseCurrency;original*and line prices in documentcurrency.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 workspaceget_doc— one file, including contents so the assistant can read receipts and PDFsget_profit_and_loss— P&L for a date rangeget_aged_debtors— outstanding customer balancesget_vat_summary— UAE VAT totals by codelist_unmatched_bank_transactions— bank lines not yet reconciledget_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). RequiresaccountIdfromsearch_accountsdraft_invoice— create a draft only; it is not posted or emailed. Ad-hoc lines needaccountId; catalog lines uselineItemId. OptionalvatAmountMode:exclusive(default) orinclusive. OptionaldocIdsto attach files.draft_purchase— create a draft supplier bill; it is not posted. Lines needaccountIdfromsearch_accounts. OptionalvatAmountMode:inclusive(default) orexclusive. OptionaldocIdsto attach files.upload_doc— upload a file (base64). OptionalattachToan invoice, purchase, or journal entryattach_docs— attach existing files to an invoice, purchase, or journal entryupdate_doc— rename a file or change its notesuggest_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. OptionaldocIdsattach 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
| Scope | Tools |
|---|---|
org:read | list_organizations, get_organization |
accounts:read | search_accounts |
contacts:read | search_contacts |
contacts:write | create_contact |
invoices:read | invoice list/get tools |
invoices:write | draft_invoice |
invoices:approve | approve_invoice |
line_items:read | search_line_items |
line_items:write | create_line_item |
purchases:read | list_purchases, get_purchase |
purchases:write | draft_purchase |
purchases:approve | approve_purchase |
docs:read | list_docs, get_doc |
docs:write | upload_doc, attach_docs, update_doc |
reports:read | P&L, aged debtors, VAT |
worksheet:read | get_worksheet |
worksheet:write | save_worksheet |
journal:write | post_journal_entries |
bank:read | unmatched bank transactions |
bank:write | bank 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
| Endpoint | Purpose |
|---|---|
GET /mcp/authorize | User consent (browser) |
POST /mcp/register | Dynamic client registration (RFC 7591) |
POST /mcp/token | Authorization code and refresh token grants |
POST /mcp/revoke | Refresh 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.