{"openapi":"3.1.0","info":{"title":"Meraki Wireless (BYOK) API","version":"0.1.0","description":"Meraki Wireless (BYOK) lets an AI assistant read your own Meraki Wireless data through the Meraki Wireless API with a key you supply (Meraki Dashboard API key (Organization > API & Webhooks)). Read-only: 7 tools (get_channel_utilization_by_device, get_channel_utilization_by_network, get_packet_loss_by_device, get_packet_loss_by_network, list_ethernet_statuses, get_client_counts_by_device,...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-meraki-wireless.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-meraki-wireless/docs"},"termsOfService":"https://connectorbay.com/byok-meraki-wireless/terms"},"servers":[{"url":"https://byok-meraki-wireless.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-meraki-wireless/docs"},"security":[{"upstreamKey":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."},"upstreamKey":{"type":"apiKey","in":"header","name":"X-Upstream-Key","description":"Your own key for the service this connector wraps (bring your own key). Used for that one call only; never stored, logged or cached."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/get_channel_utilization_by_device":{"post":{"operationId":"get_channel_utilization_by_device","summary":"Get average channel utilization per access point and radio band over a window, bucketed by an interval. Use for \"Which o","description":"Get average channel utilization per access point and radio band over a window, bucketed by an interval. Use for \"Which of my Meraki access points have congested channels\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"organization_id":{"description":"Organization id from the Meraki organizations list, for example '549236'.","maxLength":40,"title":"Organization Id","type":"string"},"per_page":{"anyOf":[{"maximum":1000,"minimum":3,"type":"integer"},{"type":"null"}],"default":100,"description":"How many entries to return, 3 to 1000. Only the first page is returned unless starting_after is given.","title":"Per Page"},"starting_after":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Paging token: the value the previous page ended with (an id, serial or timestamp). Leave empty for the first page.","title":"Starting After"},"network_id":{"anyOf":[{"maxLength":60,"type":"string"},{"type":"null"}],"default":null,"description":"Only access points of this network id.","title":"Network Id"},"serial":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only access points of the device with this serial, for example 'Q2XX-XXXX-XXXX'.","title":"Serial"},"t0":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Start of the window as ISO 8601; at most 90 days back.","title":"T0"},"t1":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"End of the window as ISO 8601; at most 90 days after t0.","title":"T1"},"timespan":{"anyOf":[{"maximum":7776000,"minimum":1,"type":"number"},{"type":"null"}],"default":null,"description":"Window length in seconds (at most 90 days); use instead of t0 and t1. Default 7 days.","title":"Timespan"},"interval":{"anyOf":[{"enum":[300,600,3600,7200,14400,21600],"type":"integer"},{"type":"null"}],"default":null,"description":"Bucket size in seconds: 300, 600, 3600, 7200, 14400 or 21600 (default 3600).","title":"Interval"}},"required":["organization_id"],"title":"get_channel_utilization_by_deviceArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_channel_utilization_by_network":{"post":{"operationId":"get_channel_utilization_by_network","summary":"Get average channel utilization per network and radio band over a window. Use for \"How busy is the Wi-Fi in each of my M","description":"Get average channel utilization per network and radio band over a window. Use for \"How busy is the Wi-Fi in each of my Meraki networks\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"organization_id":{"description":"Organization id from the Meraki organizations list, for example '549236'.","maxLength":40,"title":"Organization Id","type":"string"},"per_page":{"anyOf":[{"maximum":1000,"minimum":3,"type":"integer"},{"type":"null"}],"default":100,"description":"How many entries to return, 3 to 1000. Only the first page is returned unless starting_after is given.","title":"Per Page"},"starting_after":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Paging token: the value the previous page ended with (an id, serial or timestamp). Leave empty for the first page.","title":"Starting After"},"network_id":{"anyOf":[{"maxLength":60,"type":"string"},{"type":"null"}],"default":null,"description":"Only networks of this network id.","title":"Network Id"},"serial":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only access points of the device with this serial, for example 'Q2XX-XXXX-XXXX'.","title":"Serial"},"t0":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Start of the window as ISO 8601; at most 90 days back.","title":"T0"},"t1":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"End of the window as ISO 8601; at most 90 days after t0.","title":"T1"},"timespan":{"anyOf":[{"maximum":7776000,"minimum":1,"type":"number"},{"type":"null"}],"default":null,"description":"Window length in seconds (at most 90 days); use instead of t0 and t1. Default 7 days.","title":"Timespan"},"interval":{"anyOf":[{"enum":[300,600,3600,7200,14400,21600],"type":"integer"},{"type":"null"}],"default":null,"description":"Bucket size in seconds: 300, 600, 3600, 7200, 14400 or 21600 (default 3600).","title":"Interval"}},"required":["organization_id"],"title":"get_channel_utilization_by_networkArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_packet_loss_by_device":{"post":{"operationId":"get_packet_loss_by_device","summary":"Get average downstream and upstream packet loss per access point over a window, optionally for one band or SSID number. ","description":"Get average downstream and upstream packet loss per access point over a window, optionally for one band or SSID number. Use for \"Which Meraki access points lose the most packets\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"organization_id":{"description":"Organization id from the Meraki organizations list, for example '549236'.","maxLength":40,"title":"Organization Id","type":"string"},"per_page":{"anyOf":[{"maximum":1000,"minimum":3,"type":"integer"},{"type":"null"}],"default":100,"description":"How many entries to return, 3 to 1000. Only the first page is returned unless starting_after is given.","title":"Per Page"},"starting_after":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Paging token: the value the previous page ended with (an id, serial or timestamp). Leave empty for the first page.","title":"Starting After"},"network_id":{"anyOf":[{"maxLength":60,"type":"string"},{"type":"null"}],"default":null,"description":"Only access points of this network id.","title":"Network Id"},"serial":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only access points of the device with this serial, for example 'Q2XX-XXXX-XXXX'.","title":"Serial"},"band":{"anyOf":[{"enum":["2.4","5","6"],"type":"string"},{"type":"null"}],"default":null,"description":"Only this radio band: 2.4, 5 or 6.","title":"Band"},"ssid":{"anyOf":[{"maximum":14,"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Only this SSID number (0 to 14).","title":"Ssid"},"t0":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Start of the window as ISO 8601; at most 90 days back.","title":"T0"},"t1":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"End of the window as ISO 8601; at most 90 days after t0.","title":"T1"},"timespan":{"anyOf":[{"maximum":7776000,"minimum":1,"type":"number"},{"type":"null"}],"default":null,"description":"Window length in seconds (at most 90 days); use instead of t0 and t1. Default 7 days.","title":"Timespan"}},"required":["organization_id"],"title":"get_packet_loss_by_deviceArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_packet_loss_by_network":{"post":{"operationId":"get_packet_loss_by_network","summary":"Get average downstream and upstream packet loss per network over a window, optionally for one band or SSID number. Use f","description":"Get average downstream and upstream packet loss per network over a window, optionally for one band or SSID number. Use for \"What is the Wi-Fi packet loss in each of my Meraki networks\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"organization_id":{"description":"Organization id from the Meraki organizations list, for example '549236'.","maxLength":40,"title":"Organization Id","type":"string"},"per_page":{"anyOf":[{"maximum":1000,"minimum":3,"type":"integer"},{"type":"null"}],"default":100,"description":"How many entries to return, 3 to 1000. Only the first page is returned unless starting_after is given.","title":"Per Page"},"starting_after":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Paging token: the value the previous page ended with (an id, serial or timestamp). Leave empty for the first page.","title":"Starting After"},"network_id":{"anyOf":[{"maxLength":60,"type":"string"},{"type":"null"}],"default":null,"description":"Only networks of this network id.","title":"Network Id"},"band":{"anyOf":[{"enum":["2.4","5","6"],"type":"string"},{"type":"null"}],"default":null,"description":"Only this radio band: 2.4, 5 or 6.","title":"Band"},"ssid":{"anyOf":[{"maximum":14,"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Only this SSID number (0 to 14).","title":"Ssid"},"t0":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Start of the window as ISO 8601; at most 90 days back.","title":"T0"},"t1":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"End of the window as ISO 8601; at most 90 days after t0.","title":"T1"},"timespan":{"anyOf":[{"maximum":7776000,"minimum":1,"type":"number"},{"type":"null"}],"default":null,"description":"Window length in seconds (at most 90 days); use instead of t0 and t1. Default 7 days.","title":"Timespan"}},"required":["organization_id"],"title":"get_packet_loss_by_networkArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_ethernet_statuses":{"post":{"operationId":"list_ethernet_statuses","summary":"List the latest Ethernet status of access points: power mode and draw, ports with link speed and duplex, and link aggreg","description":"List the latest Ethernet status of access points: power mode and draw, ports with link speed and duplex, and link aggregation. Use for \"Are my Meraki access points getting enough PoE power\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"organization_id":{"description":"Organization id from the Meraki organizations list, for example '549236'.","maxLength":40,"title":"Organization Id","type":"string"},"per_page":{"anyOf":[{"maximum":1000,"minimum":3,"type":"integer"},{"type":"null"}],"default":100,"description":"How many entries to return, 3 to 1000. Only the first page is returned unless starting_after is given.","title":"Per Page"},"starting_after":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Paging token: the value the previous page ended with (an id, serial or timestamp). Leave empty for the first page.","title":"Starting After"},"network_id":{"anyOf":[{"maxLength":60,"type":"string"},{"type":"null"}],"default":null,"description":"Only access points of this network id.","title":"Network Id"}},"required":["organization_id"],"title":"list_ethernet_statusesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_client_counts_by_device":{"post":{"operationId":"get_client_counts_by_device","summary":"Get the number of wireless clients currently connected to each access point (counts only, no client details). Use for \"H","description":"Get the number of wireless clients currently connected to each access point (counts only, no client details). Use for \"How many clients are connected to each of my Meraki access points\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"organization_id":{"description":"Organization id from the Meraki organizations list, for example '549236'.","maxLength":40,"title":"Organization Id","type":"string"},"per_page":{"anyOf":[{"maximum":1000,"minimum":3,"type":"integer"},{"type":"null"}],"default":100,"description":"How many entries to return, 3 to 1000. Only the first page is returned unless starting_after is given.","title":"Per Page"},"starting_after":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Paging token: the value the previous page ended with (an id, serial or timestamp). Leave empty for the first page.","title":"Starting After"},"network_id":{"anyOf":[{"maxLength":60,"type":"string"},{"type":"null"}],"default":null,"description":"Only access points of this network id.","title":"Network Id"},"serial":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only access points of the device with this serial, for example 'Q2XX-XXXX-XXXX'.","title":"Serial"}},"required":["organization_id"],"title":"get_client_counts_by_deviceArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_bssid_statuses":{"post":{"operationId":"list_bssid_statuses","summary":"List the status of every BSSID per access point: device name, serial, network and the SSID broadcast details by band and","description":"List the status of every BSSID per access point: device name, serial, network and the SSID broadcast details by band and channel. Use for \"Which SSIDs is each of my Meraki access points broadcasting\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"organization_id":{"description":"Organization id from the Meraki organizations list, for example '549236'.","maxLength":40,"title":"Organization Id","type":"string"},"per_page":{"anyOf":[{"maximum":500,"minimum":3,"type":"integer"},{"type":"null"}],"default":100,"description":"How many entries to return, 3 to 500. Only the first page is returned unless starting_after is given.","title":"Per Page"},"starting_after":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Paging token: the value the previous page ended with (an id, serial or timestamp). Leave empty for the first page.","title":"Starting After"},"network_id":{"anyOf":[{"maxLength":60,"type":"string"},{"type":"null"}],"default":null,"description":"Only access points of this network id.","title":"Network Id"},"serial":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only access points of the device with this serial, for example 'Q2XX-XXXX-XXXX'.","title":"Serial"},"hide_disabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to hide disabled SSIDs.","title":"Hide Disabled"}},"required":["organization_id"],"title":"list_bssid_statusesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}