Problem
TicketsResource.list() builds a filters array of { field, operator, value } for status/organizationId/deviceId and POSTs it to /v2/ticketing/trigger/board/{boardId}/run:
filters.push({ field: "status", operator: "is", value: id }); // value is a NUMBER
filters.push({ field: "clientId", operator: "is", value: params.organizationId });
filters.push({ field: "nodeId", operator: "is", value: params.deviceId });
Passing any of these throws a generic 400 (see wyre-technology/ninjaone-mcp#61, #60). Two problems found while investigating:
value must be a JSON string. The OpenAPI TicketBoardRequestDTO types filters[].value as a string; sending value: 2000 (number) is a likely 400 trigger. NinjaOne treats status IDs as strings elsewhere.
- The accepted
field tokens for status/client are undocumented and not demonstrably supported. Every production NinjaOne integration reviewed (SquaredUp, lwhitelock, Weavestream, Homotechsual) avoids server-side status/client filtering here and either relies on the board's saved conditions or filters client-side.
Impact
Consumers can't filter tickets via list({ status }) / list({ organizationId }) — the call fails outright, and combined with the 400→auth-error mapping (separate issue) the failure is easy to misread.
Suggested fix
At minimum, coerce value to a string. Better: drop the unsupported server-side status/client/device filters from list() (or gate them behind a clearly-documented, verified-working code path), and document that these should be filtered client-side. ninjaone-mcp has already moved to client-side filtering as a workaround (wyre-technology/ninjaone-mcp#62).
Context: wyre-technology/ninjaone-mcp#61, wyre-technology/ninjaone-mcp#60
Problem
TicketsResource.list()builds afiltersarray of{ field, operator, value }forstatus/organizationId/deviceIdand POSTs it to/v2/ticketing/trigger/board/{boardId}/run:Passing any of these throws a generic
400(see wyre-technology/ninjaone-mcp#61, #60). Two problems found while investigating:valuemust be a JSON string. The OpenAPITicketBoardRequestDTOtypesfilters[].valueas a string; sendingvalue: 2000(number) is a likely 400 trigger. NinjaOne treats status IDs as strings elsewhere.fieldtokens for status/client are undocumented and not demonstrably supported. Every production NinjaOne integration reviewed (SquaredUp, lwhitelock, Weavestream, Homotechsual) avoids server-side status/client filtering here and either relies on the board's saved conditions or filters client-side.Impact
Consumers can't filter tickets via
list({ status })/list({ organizationId })— the call fails outright, and combined with the 400→auth-error mapping (separate issue) the failure is easy to misread.Suggested fix
At minimum, coerce
valueto a string. Better: drop the unsupported server-side status/client/device filters fromlist()(or gate them behind a clearly-documented, verified-working code path), and document that these should be filtered client-side.ninjaone-mcphas already moved to client-side filtering as a workaround (wyre-technology/ninjaone-mcp#62).Context: wyre-technology/ninjaone-mcp#61, wyre-technology/ninjaone-mcp#60