find-contact
CommandResolve a 3CX contact or extension by email, extension, or name
Locate a Meraki device by serial, name, or MAC across an organization's networks
$ npx -y skills add wyre-ai/msp-claude-plugins --agent claude-code
description: Locate a Meraki device by serial, name, or MAC across an organization, or find where a client MAC is connected argument-hint: "<query> [org_id]" arguments: [query, org_id]
Locate a Cisco Meraki device by serial number, name, or MAC address across an organization's inventory and networks. Returns the device's serial, model, product type, status, and the network it is assigned to. If a MAC belongs to a client (a laptop or phone) rather than a Meraki device, reports where that client was last seen instead.
1. **Classify the query**
2. **Serial — try the exact lookup first**
execute_api { "capability_id": "getDevice", "parameters": { "serial": "Q2XX-XXXX-XXXX" } }This needs no organization ID. A hit gives `name`, `model`, `mac`, `networkId`, `lanIp`, and firmware, but not the organization, which step 6 needs. Read the device's network; its `organizationId` is the device's org, and its `name` is the network name for the results:
execute_api { "capability_id": "getNetwork", "parameters": { "networkId": "<networkId>" } }Use that `organizationId` in step 6, even when `org_id` was given. If it differs from `org_id`, say the device belongs to that other organization. Then skip to step 6. A 404 means the device is not in any network the key can see: it may be claimed but unassigned, in another org, or mistyped. Resolve the org (step 3) and check inventory:
execute_api { "capability_id": "getOrganizationInventoryDevice", "parameters": { "organizationId": "<orgId>", "serial": "Q2XX-XXXX-XXXX" } }An inventory entry whose `networkId` is null is claimed but unassigned.
3. **Resolve the organization (MAC and name searches, or serial fallback)**
If `org_id` is given, use it. Otherwise list the organizations the key can see; use the only one, or list them and ask which to search.
execute_api { "capability_id": "getOrganizations" }4. **MAC — check Meraki hardware, then clients**
Search inventory first; it covers claimed and unassigned devices.
execute_api { "capability_id": "getOrganizationInventoryDevices", "parameters": { "organizationId": "<orgId>", "macs": ["aa:bb:cc:dd:ee:ff"], "perPage": 100 } }A match whose `networkId` is set is an assigned device; inventory does not carry its LAN IP, so read it with `getDevice` and the match's `serial`. No match means the MAC is not a Meraki device. Treat it as a client and search for it:
execute_api { "capability_id": "getOrganizationClientsSearch", "parameters": { "organizationId": "<orgId>", "mac": "aa:bb:cc:dd:ee:ff", "perPage": 5 } }The search returns at most five records, one per network the client was seen on. If `records` holds five, say the client may also appear on other networks and its latest location may be missing. Each record names the network the client was seen on, with its IP, VLAN, SSID or switch port, last-seen time, and `recentDeviceMac` (the AP or switch it last connected through). To name that AP or switch, look it up with `getOrganizationDevices` and `"mac": "<recentDeviceMac>"`.
5. **Name — search assigned devices**
execute_api { "capability_id": "getOrganizationDevices", "parameters": { "organizationId": "<orgId>", "name": "HQ-Core", "perPage": 100 } }The `name` filter matches devices whose name contains the term. Inventory search does not match on name, so a named device that is unassigned will not show up here.
6. **Add live status and network names**
For the matched serials, fetch availability in one call:
execute_api { "capability_id": "getOrganizationDevicesAvailabilities", "parameters": { "organizationId": "<orgId>", "serials": ["Q2XX-XXXX-XXXX"] } }Resolve network names with `getNetwork` (one network) or `getOrganizationNetworks` (several).
7. **Present results**
Show a table: name, serial, model, product type, status, network (or "unassigned"), MAC, LAN IP. For a client MAC, show network, IP, VLAN, SSID or switch port, connected-through device, and last seen. If a list came back with exactly `perPage` items, say there may be more matches and suggest a more specific query.
| Parameter | Type | Required | Description | |-----------|------|----------|-------------| | query | string | Yes | Serial (e.g. `Q2XX-XXXX-XXXX`), name, or MAC (e.g. `AA:BB:CC:DD:EE:FF`) | | org_id | string | No | Organization ID; if omitted, resolved via `getOrganizations` |
/meraki-find-device Q2XX-XXXX-XXXX
/meraki-find-device AA:BB:CC:DD:EE:FF
/meraki-find-device HQ-Core-Switch 123456
One command to supercharge Claude Code for MSP workflows. Then restart Claude Code. That's it. Documentation: mcp.wyre.ai
Resolve a 3CX contact or extension by email, extension, or name
Snapshot of 3CX queue staffing and active call load
Review and triage abuse mailbox cases in Abnormal Security
Search for specific threat patterns in Abnormal Security by sender, recipient, attack type, or keywords
Triage recent email threats detected by Abnormal Security by severity and attack type
Implement tasks incrementally — build, test, verify, commit. Add "auto" to run the whole plan in one approved pass.