api-patterns
3CX's native PBX MCP server: the per-PBX endpoint shape (every PBX is its own FQDN and its own OAuth authorization server — there is no shared mcp.3cx.com),…
Running read-only SuiteQL queries against NetSuite data and discovering queryable fields and joins via SuiteQL metadata. The flexible ad-hoc query surface for questions no existing report or saved search already answers.
$ npx -y skills add wyre-technology/msp-claude-plugins --skill suiteql-queries --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/suiteql-queriesContext preview
The summary Claude sees to decide when to auto-load this skill.
Running read-only SuiteQL queries against NetSuite data and discovering queryable fields and joins via SuiteQL metadata. The flexible ad-hoc query surface for questions no existing report or saved search already answers.
name: "NetSuite SuiteQL Queries" description: > Running read-only SuiteQL queries against NetSuite data and discovering queryable fields and joins via SuiteQL metadata. The flexible ad-hoc query surface for questions no existing report or saved search already answers. when_to_use: >- When you need to query NetSuite data with custom criteria that no existing report or saved search covers, or when you need to know what fields and joins a record type supports for SuiteQL. Use when: suiteql, netsuite query, netsuite sql, ad hoc query, netsuite join, or netsuite field metadata.
SuiteQL is NetSuite's SQL-like query language over its record data — `SELECT` statements with `WHERE`, `JOIN`, `ORDER BY`, and similar clauses, scoped to whatever the connected role can see. It's the right tool when a question needs custom filtering or joins that no existing report or saved search already provides.
`reports-and-saved-searches` instead of re-deriving something NetSuite has already computed.
`records-and-metadata`; `ns_getRecord` is simpler than a SuiteQL query for a single record by ID.
`ns_runCustomSuiteQL` is documented by Oracle as accepting **read-only queries only** — write statements are not a workaround this skill supports, or one NetSuite will honor.
SuiteQL queries NetSuite's underlying record tables (which broadly mirror record types like `customer`, `transaction`, `item`) using SQL syntax. It's a subset of SQL, not full ANSI SQL — some familiar constructs may not be supported. Query results respect the connected role's view permissions the same way direct record retrieval and reports do.
The confirmed read tool family for this domain:
documentation states explicitly: read-only queries only)
SuiteQL, including available fields, data types, and joinable fields; can be scoped to a specific record type
Both are documented by Oracle at [Available Tools in the MCP Standard Tools SuiteApp](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/article_0902023508.html).
1. `ns_runCustomSuiteQL` with a targeted `SELECT id, ... FROM <type> WHERE ...` 2. Take the resolved ID to `records-and-metadata`'s `ns_getRecord` if a full record retrieval is needed next
1. `ns_getSuiteQLMetadata` for the record type in question, to confirm real field names and available joins 2. Write the SuiteQL query against the confirmed fields, rather than guessing at column names from the NetSuite UI's field labels (which don't always match the underlying SuiteQL field name)
1. Confirm no existing report or saved search already answers it (check `reports-and-saved-searches` first — don't re-derive what NetSuite already computes) 2. Write a targeted, bounded SuiteQL query — filter by date range or specific criteria rather than pulling an entire table 3. Report results plainly, noting if the result set was truncated or if the query should be narrowed further
is guaranteed to work — if a query fails unexpectedly, simplify it before assuming the data doesn't exist.
`transaction`) is a way to exhaust rate limits and return far more data than the question needs — prefer explicit columns and a `WHERE` clause.
`ns_getSuiteQLMetadata` rather than guessing from what a field is called on screen.
documentation.** `ns_runCustomSuiteQL` itself is documented as read-only-queries-only — but this plugin does not independently verify that constraint; it is Oracle's own stated behavior. See [GOVERNANCE.md](../../GOVERNANCE.md).
One command to supercharge Claude Code for MSP workflows. Then restart Claude Code. That's it. Documentation: mcp.wyre.ai
Repo: wyre-technology/msp-claude-plugins
3CX's native PBX MCP server: the per-PBX endpoint shape (every PBX is its own FQDN and its own OAuth authorization server — there is no shared mcp.3cx.com),…
3CX's live-operations surface: read-only visibility into active calls, recordings, voicemail, department and queue membership, and forwarding/presence…
3CX's read-only directory surface: resolving a caller by email or by exact extension, searching the PBX's own phonebooks, searching contacts synced from an…
3CX's system-and-configuration surface: server time, PBX event log and application log search, service status, database schema and the read-only SELECT-only…
Abnormal Security abuse mailbox cases: user-reported email submissions, case statuses and judgments, the case lifecycle, bulk and remediation actions, and…
Abnormal Security message analysis: message retrieval, email header inspection, attachments, sender reputation, delivery context, and SPF/DKIM/DMARC…