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),…
Retrieving individual NetSuite records by type and internal ID, and discovering a record type's available fields via record-type metadata. Read-only — retrieving existing records, not creating or updating them.
$ npx -y skills add wyre-technology/msp-claude-plugins --skill records-and-metadata --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/records-and-metadataContext preview
The summary Claude sees to decide when to auto-load this skill.
Retrieving individual NetSuite records by type and internal ID, and discovering a record type's available fields via record-type metadata. Read-only — retrieving existing records, not creating or updating them.
name: "NetSuite Records & Metadata" description: > Retrieving individual NetSuite records by type and internal ID, and discovering a record type's available fields via record-type metadata. Read-only — retrieving existing records, not creating or updating them. when_to_use: >- When looking up a specific NetSuite record (customer, vendor, sales order, invoice, or any other record type) by its internal ID, or when you need to know what fields a NetSuite record type has before querying or reading it. Use when: netsuite record, netsuite customer, netsuite vendor, netsuite invoice, netsuite sales order, record type, internal id, or netsuite field.
NetSuite organizes almost everything as a typed record — `customer`, `vendor`, `salesorder`, `invoice`, `employee`, and many more, each with its own internal ID and field set. This skill covers looking a specific record up directly when you already know (or can pin down) its type and ID, and discovering what fields a record type actually has before you go looking for one.
`suiteql-queries` to search, then retrieve the specific record here if needed.
[GOVERNANCE.md](../../GOVERNANCE.md), *Tool permission tiers*: `ns_createRecord` and `ns_updateRecord` are the two write tools this plugin deliberately excludes. Make the change directly in the NetSuite UI, with the same care you'd give any change to a client's financial system of record.
`reports-and-saved-searches` rather than re-deriving what a report already computes.
Every NetSuite record has a record type (a fixed string like `customer` or `salesorder`) and an internal ID (a number, unique within that type). Record-type metadata describes the fields a given type carries — names, data types, and (per NetSuite's `ns_getRecordTypeMetadata` tool) can be requested for a single type or for all types at once. What a record actually returns when retrieved depends entirely on the connected role's view permissions on that type and its fields — the same way it would if a human opened the record in the NetSuite UI.
The confirmed read tool family for this domain:
data types) for all NetSuite record types, or for a specific 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). The corresponding write tools, `ns_createRecord` and `ns_updateRecord`, are excluded from this plugin — see [GOVERNANCE.md](../../GOVERNANCE.md).
**A note on record-type-specific commands:** this plugin does not ship a separate command per record type (e.g. no dedicated "get customer" vs. "get vendor" command). `ns_getRecord` is generic across record types by design, and this plugin's `/get-record` command is built directly against that generic tool rather than inventing per-type wrappers that don't correspond to anything the underlying MCP surface exposes.
A support ticket references a customer by name, not ID:
1. If the internal ID isn't known, use `suiteql-queries` to find it (e.g. `SELECT id, companyname FROM customer WHERE companyname LIKE '...'`) 2. Call `ns_getRecord` with type `customer` and the resolved ID 3. Report the fields relevant to the escalation — don't dump the entire record if only a few fields matter
Before querying an unfamiliar record type:
1. Call `ns_getRecordTypeMetadata` for that type 2. Use the returned field names and types to write an accurate SuiteQL query in `suiteql-queries`, rather than guessing at field names
just record-level.** A role with view access to a record type can still have specific fields withheld — a retrieved record missing an expected field may be a permission boundary, not a data gap.
order 12345 are unrelated records; always pair an ID with its record type.
correction (fixing an obviously wrong field) is outside this plugin — escalate to a human with direct NetSuite access.
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…