Connectors · Accounting & finance
NetSuite MCP server for AI agents.
actionlake is an MCP gateway: one remote MCP server that connects Claude and other MCP clients to NetSuite and the rest of your systems. It gives your agent 458 NetSuite actions (147 reads, 245 writes and 66 that wait for a confirmation) and holds the NetSuite credential itself, so the agent never does. It paces NetSuite's limits and records every call. Connecting NetSuite needs your own NetSuite OAuth app and one admin sign-in.
100,000 free calls a month. No card, no email, no password: press Start a free sandbox on the next screen and keep the key it shows you.
claude mcp add --transport http actionlake https://connect.actionlake.com/mcpdo { action: "netsuite.views.credit_memos", intent: "check which NetSuite account is connected"}# List credit memos with amounts · read · 1 upstream call- 458actionsin one signed file
- 147readlook, never change
- 245writecreate and update
- 66wait for a yesdestructive, confirmed first
Set up
Connect NetSuite in three steps.
- 01
Add actionlake to Claude.
Run the command once in Claude Code; its consent page can create a free sandbox: 100,000 calls a month, no card. In the Claude app, add a custom connector with the URL below and paste your key on the consent page. Creating a new sandbox from the Claude app is not yet tested by us.
https://connect.actionlake.com/mcp - 02
Connect NetSuite.
OAuth 2.0, authorization code with PKCE. You register your own OAuth app with NetSuite, an admin signs in once, and you paste the app's client id and secret and the tokens from that sign-in; actionlake renews the access token from then on. actionlake stores what you paste write-only, sealed under your tenant's key.
Before the first sign-in, NetSuite needs an OAuth app of your own, registered in its developer portal. actionlake has no NetSuite app to lend you.
access_tokenAccess token from one sign-in with your own OAuth apprefresh_tokenRefresh token from the same sign-in; the access token is renewed from itclient_idNetSuite integration record Client ID (Consumer Key)client_secretNetSuite integration record Client Secret (Consumer Secret)account_hostWhere your NetSuite lives: your account host
account { op: "connections.requirements", service: "netsuite" } # free: exactly what to paste, and what is found for you - 03
Make the first call. Check before a write.
Ask in plain words; Claude picks the action. Before anything changes,
checkvalidates the call and prices it, for free.do { action: "netsuite.views.credit_memos" }# list credit memos with amounts · read · 1 upstream callcheck { action: "netsuite.invoices.create", input: { … } }# free: inputs, permissions, cost and confirmations, nothing sent
NetSuite at a glance
- Sign-in
- OAuth 2.0, authorization code with PKCE. You register your own OAuth app with NetSuite, an admin signs in once, and you paste the app's client id and secret and the tokens from that sign-in; actionlake renews the access token from then on.
- You provide
access_tokenrefresh_tokenclient_idclient_secret- Setup fields
account_host- Limits we pace to
- 10 calls a second, per connection
- API covered
- Oracle NetSuite API v1, at your NetSuite instance's API base URL, which you enter when connecting (path /services/rest)
- Built from
- NetSuite's documentation, read 18 September 2026docs.oracle.com
- Service file
- Version 1.0.0, signed (Ed25519)
- Cached reads
- 147 of 147 reads, for up to an hour; a write clears what it affects
- Ready-made plans
- 10 in the store
- Shared entities
- 12, so ask can line NetSuite up with your other systems
- Data
- Processed and stored in Sydney, Australia. No US region yet
Capabilities
What an AI agent can do in NetSuite.
458 actions in 1 area. Every one carries its effect, so a key can allow the reads and hold the rest.
- 147readlook, never change
- 245writecreate and update
- 66destructivewait for a confirmation
ERP
458147 read · 245 write · 66 destructive
List credit memos with amounts · List subsidiaries · Create an invoice · Create a customer deposit
Top actions
The NetSuite API, shaped for agents.
The ids your agent types, what each does, and the one name it shares with other systems. 234 of NetSuite's 261 action names are shared with at least one other connector, so an agent learns them once.
| Action | What it does | Effect | Same name in |
|---|---|---|---|
netsuite.views.credit_memosList credit memos with amounts | List credit memos with amounts — a SuiteQL read returning real column values. | read | finance.credit_note.list33 connectors |
netsuite.views.subsidiariesList subsidiaries | List subsidiaries — a SuiteQL read returning real column values. | read | finance.tracking_category.list15 connectors |
netsuite.invoices.createCreate an invoice | POST a new invoice record. | write | finance.invoice.create74 connectors |
netsuite.vendor_payments.createCreate a vendor payment | POST a new vendor payment record. | write | finance.payment.create67 connectors |
netsuite.customer_deposits.createCreate a customer deposit | POST a new customer deposit record. | write | finance.payment.create67 connectors |
netsuite.views.invoicesList invoices with amounts and status | List invoices with amounts and status — a SuiteQL read returning real column values. | read | finance.invoice.query10 connectors |
netsuite.estimates.createCreate an estimate (quote) | POST a new estimate (quote) record. | write | finance.quote.create52 connectors |
netsuite.purchase_orders.createCreate a purchase order | POST a new purchase order record. | write | finance.purchase_order.create43 connectors |
netsuite.credit_memos.listList credit memos | List credit memo records, optionally filtered with the q grammar. | read | finance.credit_note.list33 connectors |
netsuite.accounts.createCreate a GL account | POST a new GL account record. | write | finance.ledger_account.create32 connectors |
netsuite.views.estimatesList estimates (quotes) with amounts | List estimates (quotes) with amounts — a SuiteQL read returning real column values. | read | finance.quote.query5 connectors |
netsuite.invoices.deleteDelete an invoice | DELETE a invoice record. | destructive | finance.invoice.delete56 connectors |
Try it
Prompts to paste into Claude.
Each one names the NetSuite actions it will call, so you know what it reads and what it changes before you send it.
- Readread
Which NetSuite invoices are more than 30 days overdue? Group them by customer with the total owed.
calls
netsuite.views.invoices - Planwrite
Run the month-end close readiness check in NetSuite. Ask me before anything is sent or changed.
calls
netsuite.accounting_periods.listnetsuite.journal_entries.listnetsuite.expense_reports.listnetsuite.subsidiaries.listnetsuite.suiteql.query+1 more - Planwrite
Convert a won opportunity into a sales order in NetSuite.
calls
netsuite.opportunities.getnetsuite.customers.listnetsuite.opportunities.updatenetsuite.transforms.opportunity_to_sales_ordernetsuite.views.opportunities - Writewrite
Create an invoice in NetSuite. Show me exactly what you will send before you save it.
calls
netsuite.invoices.create - Across systemsread
For each customer, how many invoices are in NetSuite and how many tickets in ConnectWise PSA?
calls
netsuite.views.invoicesconnectwise_manage.tickets.list
Across your systems
NetSuite, joined to the rest of your business.
One ask fetches from NetSuite and another system, joins the rows on the same customer on our side, and hands your agent the answer, not every row.
For each customer, how many invoices are in NetSuite and how many tickets in ConnectWise PSA?
netsuite.views.invoices+connectwise_manage.tickets.list, oncrm.company· ConnectWise PSAFor each customer, how many invoices are in NetSuite and how many tickets in HubSpot CRM?
netsuite.views.invoices+hubspot_crm.tickets.list, oncrm.company· HubSpot CRM
crm.contact 192finance.invoice 91hr.employee 63service.ticket 62finance.payment 53finance.quote 45crm.deal 43finance.purchase_order 35ask { intent: "for each customer, how many invoices are in NetSuite and how many tickets in ConnectWise PSA", steps: [ { action: "netsuite.views.invoices", as: "inv", input: {}, limit: 100, max_pages: 5 }, { action: "connectwise_manage.tickets.list", as: "tix", input: {}, limit: 100, max_pages: 5 }, { join: { left: "inv", right: "tix", on: "crm.company", group_by: "inv.company_name", select: ["inv.company_name", "count(inv.id) as invoices", "count(tix.id) as tickets"] } } ]}The plan store
Ready-made plans for NetSuite.
10 plans in the store. Install one and your agent runs it by name; the reply says which connections are still missing. A schedule can run a plan on a timetable. There are no triggers or webhooks, by design.
Build an accounts receivable ageing snapshot
Use it when Someone asks who owes money, how much is overdue, or wants an AR ageing summary out of NetSuite.
Convert an accepted estimate into an invoice after sign-off
Use it when A customer has accepted an estimate and finance wants it billed as an invoice once someone signs off.
A person decides
Convert estimate estimate id into a customer invoice in NetSuite.
Upsert a customer and its contacts from an external system
Use it when A customer and its contacts exist in another system and need to be created or refreshed in NetSuite without duplicating records.
Pay approved vendor bills in one run
Use it when Accounts payable wants to settle a batch of outstanding vendor bills after a person approves the run.
A person decides
Create vendor payments for the open vendor bills listed in this run.
Review low stock and raise a replenishment purchase order
Use it when Stock levels need checking and a replenishment purchase order should be raised for items under their reorder point.
A person decides
Raise a replenishment purchase order with vendor vendor id for the items below reorder point.
Convert a won opportunity into a sales order
Use it when A sales opportunity has been won and should become a real sales order in NetSuite.
Raise a fulfillment request for a sales order
Use it when A sales order is ready to ship and someone wants it pushed to the warehouse and watched until it is fulfilled.
Receive a transfer order and reconcile it against the purchase order
Use it when Stock has arrived against a purchase order or transfer order and needs receipting and referencing in NetSuite.
Run the month-end close readiness check
Use it when Month end or quarter end is due and someone needs to see what is outstanding before locking the accounting period.
A person decides
Close the accounting period despite the outstanding transactions listed above.
account { op: "plans.install", slug: "netsuite-ar-aging-report" }
# then ask for it by name; a schedule can run it on a timetableGovernance for NetSuite
Destructive actions wait for a yes.
66 NetSuite actions are destructive. The first 10:
- Delete an invoice
netsuite.invoices.delete - Create a cash refund
netsuite.cash_refunds.create - Create a customer refund
netsuite.customer_refunds.create - Delete a vendor payment
netsuite.vendor_payments.delete - Delete a customer deposit
netsuite.customer_deposits.delete - Delete a customer payment
netsuite.customer_payments.delete - Delete an estimate (quote)
netsuite.estimates.delete - Delete a purchase order
netsuite.purchase_orders.delete - Delete a GL account
netsuite.accounts.delete - Delete a credit memo
netsuite.credit_memos.delete
A destructive action runs only with confirm: true. Under the human policy the agent cannot confirm for itself: the run stops until a named person approves, in the console or from a signed link in an email. The cap on a key is refused before the call is sent, never after.
Delete an invoice?
intent: the user asked me to delete an invoice
account { op: "keys.create", name: "netsuite-agent", allowed_actions: ["netsuite.*"], cap_calls: 2000, confirm_policy: "human_for_writes", approval_rules: [ { match: "netsuite.invoices.delete", approver: "[email protected]" }, { match: "netsuite.cash_refunds.create", approver: "[email protected]" }, { match: "netsuite.customer_refunds.create", approver: "[email protected]" } ]}Cost
What NetSuite costs on actionlake.
Every NetSuite action is one upstream call, the only thing actionlake bills. Searching, check, cost, account and any call NetSuite refused with 401, 403, 429 or a 5xx are free. Paid plans start at US$49 a month for 250,000 calls, with overage from US$0.30 down to US$0.18 per 1,000.
- 1upstream call per actionall 458 NetSuite actions
- 81actions pageeach page of a long list is one call
- 147reads can be cacheda cache hit costs nothing
- 100,000calls a month, freepaid plans from US$49 a month for 250,000
Action index
Every NetSuite action.
458 actions by area: the id your agent calls, what it does, and its effect.
ERP458
netsuite.customer_deposits.createCreate a customer depositwritenetsuite.invoices.createCreate an invoicewritenetsuite.views.credit_memosList credit memos with amountsreadnetsuite.views.subsidiariesList subsidiariesreadnetsuite.accounting_periods.createCreate an accounting periodwritenetsuite.accounting_periods.deleteDelete an accounting perioddestructive- and 452 more in this area
This index shows a sample of each area. All 458 actions, with their inputs and prices, are in the catalogue, which a free sandbox key can search.
Questions
The NetSuite MCP server, answered.
Is there a NetSuite MCP server for Claude?
Yes. actionlake is an MCP gateway: a remote MCP server that gives Claude, or another MCP client, 458 NetSuite actions, through the same eight tools it uses for every other connector. actionlake is independent; it is not made or endorsed by NetSuite.
What do I need to connect NetSuite?
Your own NetSuite OAuth app, registered with NetSuite (its client id and client secret), and the access and refresh tokens from one admin sign-in. actionlake has no NetSuite app of its own, so this is not a one-step consent. actionlake renews the access token as it expires. Plus your account host. The free call account { op: "connections.requirements", service: "netsuite" } lists exactly what to paste.
Can an AI agent delete or change things in NetSuite?
Only if its key allows it, and only with an explicit confirmation. 66 NetSuite actions are destructive, including delete an invoice, create a cash refund and create a customer refund. Each runs only with confirm: true. Under the human confirm policy, or an approval rule on the key, the run waits until a named person approves it.
Will an AI agent use up my NetSuite API limit?
actionlake paces every call to the limits in the NetSuite service file: 10 calls a second per connection. Repeated reads are answered from cache (147 NetSuite actions can be), which never reaches NetSuite.
What does a NetSuite action cost?
One upstream call, the only unit actionlake bills. A list that pages bills one call per page (81 NetSuite actions page). Cache hits, searches, dry runs and calls NetSuite refused with 401, 403, 429 or a 5xx are free. The Free plan includes 100,000 calls a month with no card. Paid plans start at US$49 a month for 250,000 calls, with overage from US$0.30 down to US$0.18 per 1,000.
Which NetSuite API does it cover?
The Oracle NetSuite API v1 at your NetSuite instance's API base URL, which you enter when connecting (path /services/rest). It is built from NetSuite's documentation as read on 18 September 2026. 458 actions in 1 area, each one in the signed service file (version 1.0.0).
Can I combine NetSuite with my other systems?
Yes. ask joins NetSuite to ConnectWise PSA or HubSpot CRM on the same customer and returns the answer rather than every row. NetSuite maps crm.contact, which 192 other connectors also map.
Does actionlake keep my NetSuite data, and where?
actionlake processes and stores data in Sydney, Australia; there is no US region yet. Reads may be cached for up to an hour, and a write clears the reads it affects. Each run's request and response is kept, sealed, for your plan's trace window: 1 day on Free, 3 days on Starter, 7 days on Pro, 14 days on Team, 30 days on Business and 30 days on Enterprise. Your NetSuite credential is sealed under your tenant's key, never logged and never returned. Your traffic is not used to train models.
Which AI clients can use it?
Claude Code, tested by us end to end, and the Claude app as a custom connector, tested by us with an existing key. Other MCP clients that support remote servers over Streamable HTTP (MCP revisions 2025-06-18 and 2025-11-25) and OAuth dynamic client registration, or a bearer header, should connect the same way; we have not tested them. Or plain REST, under the same action names.
Give your agent NetSuite today.
Start free - 100,000 calls/month, no card. No signup. Hard caps on every key. Cached answers are free.