Connect any AI assistant to NetSuite ERP with OAuth 2.0, automatic token refresh, and a web-based setup wizard
NetSuite MCP has 13 tools with consistent naming (verb_noun pattern: ns_get*, ns_create*, ns_update*, ns_list*, ns_run*) and descriptions present for all tools. However, critical gaps exist: (1) Output schemas are NOT documented anywhere, tools return JSON but LLMs cannot predict field structure; (2) Parameter descriptions are present but lack constraints (enums, ranges, formats), e.g., 'recordType' accepts free-form strings with no enum of valid types; (3) Error handling is minimal, no recovery guidance or actionable error messages visible in code; (4) No pagination support despite tools like ns_listAllReports and ns_getSubsidiaries that could return large result sets; (5) Tool descriptions average ~150 chars (within baseline 194) but lack dependency hints and 'when to use' context. Naming is strong (all start with action verbs, clear intent), but schema and output documentation are the primary weaknesses.
Create a new record in NetSuite. Returns the internal ID and URL of the created record. Common record types: customer, salesOrder, invoice, purchaseOrder, item, employee, vendor, account, transaction.
List all accounting books in the NetSuite account. Returns book IDs, names, types (primary, secondary), and associated currencies. Useful for multi-book accounting setups.
List all accounting contexts in the NetSuite account. Accounting contexts define currency and exchange rate settings for multi-currency operations.
List all nexus (tax jurisdiction) records in the NetSuite account. Nexus defines tax authorities and jurisdictions for different countries/states. Essential for tax compliance and VAT/GST handling.
Retrieve a single record from NetSuite by its internal ID. Supports expanding sub-resources (sublists). Returns the full record data as JSON.
Output schemas not documented. Tools return JSON (e.g., ns_getRecord, ns_listAllReports) but LLMs cannot predict field structure, types, or required fields. This forces agents to guess at response shape and breaks tool chaining when downstream tools need specific fields.
Parameter constraints missing. 'recordType' in ns_createRecord and ns_getRecord accepts free-form strings with no enum of valid types (customer, salesOrder, invoice, etc.). LLMs will hallucinate invalid record types. 'category' in ns_listAllReports lacks enum constraint.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | <=2025-11-25 | v2 |
Retrieve metadata for a NetSuite record type: available fields, field types, required fields, and sublist definitions. Use this before creating or updating records to discover valid field names.
List all subsidiaries in the NetSuite account. Returns subsidiary IDs, names, currencies, and parent subsidiary relationships.
List all available financial and operational reports in NetSuite. Returns report IDs, names, and categories. Use the report ID with ns_runReport to execute.
Browse a library of pre-built prompt templates for common NetSuite operations. Returns categorized prompt templates that can be used as starting points for NetSuite queries and operations.
Interactive helper: returns available filter options for NetSuite reports. Use this before running a report to discover valid values for subsidiaries, departments, date ranges, and other filter dimensions.
Run a specific NetSuite report and return the results. Use ns_listAllReports to find available report IDs. Supports date range and filter parameters.
Interactive selector for NetSuite record types and common field names. Returns a list of valid record types and their key fields to help construct API calls. Use this when you are unsure which record type or field name to use.
Update an existing record in NetSuite. Only the fields provided in the data object will be updated (PATCH semantics). Returns success status.
No pagination support. ns_listAllReports, ns_getSubsidiaries, and ns_getAccountingContexts could return large result sets but lack limit/offset/page parameters and total count in response. Large result sets will exhaust context windows.
Error handling lacks recovery guidance. No visible error messages, categorization (retryable vs fatal), or actionable next steps. LLMs cannot self-correct or know whether to retry, ask user, or abort.
Descriptions lack dependency hints and 'when to use' context. E.g., ns_getRecordTypeMetadata says 'Use this before creating or updating records' but does not explain when to call ns_selector_app instead. Descriptions are present but underutilize the pattern:tool-description guidance.