PestScan MCP by usefulapi
Read customers, locations, orders, appointments, infestations and bait stations in PestScan.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"pestscan": {
"url": "https://pestscan.usefulapi.io/mcp"
}
}
}Remote endpoints
https://pestscan.usefulapi.io/mcpstreamable-httpWhat it can do
Tool inventory
Tools (15)
🟢pestscan_test_connection
Log in and check that the PestScan API answers. Good first call. PestScan API: GET /v1/test/connection.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢pestscan_list_customers(searchText, customerType, externalId, id, page, ...)
List customers (companies and private persons) with their names and external ids. Use it to find a customer id. PestScan API: GET /v1/crm/customers.
Input Schema
{
"type": "object",
"properties": {
"searchText": {
"description": "Free-text search filter, as the API accepts it.",
"type": "string"
},
"customerType": {
"description": "Customer type: 1 = company, 2 = private person.",
"anyOf": [
{
"type": "number",
"const": 1
},
{
"type": "number",
"const": 2
}
]
},
"externalId": {
"description": "Filter by the external id your system uses for the record.",
"type": "string"
},
"id": {
"description": "Filter by the numeric PestScan id.",
"type": "integer",
"minimum": -2147483648,
"maximum": 2147483647
},
"page": {
"description": "Page number, from 1 (default 1).",
"type": "integer",
"minimum": 1,
"maximum": 2147483647
},
"pageSize": {
"description": "Records per page (default 20, max 100).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢pestscan_list_locations(searchText, externalId, id, customerId, page, ...)
List customer locations (the sites that pests are checked at), with their customer id. PestScan API: GET /v1/crm/locations.
Input Schema
{
"type": "object",
"properties": {
"searchText": {
"description": "Free-text search filter, as the API accepts it.",
"type": "string"
},
"externalId": {
"description": "Filter by the external id your system uses for the record.",
"type": "string"
},
"id": {
"description": "Filter by the numeric PestScan id.",
"type": "integer",
"minimum": -2147483648,
"maximum": 2147483647
},
"customerId": {
"description": "Filter by the customer id.",
"type": "integer",
"minimum": -2147483648,
"maximum": 2147483647
},
"page": {
"description": "Page number, from 1 (default 1).",
"type": "integer",
"minimum": 1,
"maximum": 2147483647
},
"pageSize": {
"description": "Records per page (default 20, max 100).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢pestscan_get_location(id)
Get one location with its full details by PestScan id. PestScan API: GET /v1/crm/locations/GetById?id.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"minimum": -2147483648,
"maximum": 2147483647,
"description": "The numeric PestScan id of the record."
}
},
"required": [
"id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢pestscan_list_orders(fromDate, toDate, id, externalId, page, ...)
List orders (visits) created in a date range, with status, visit type and planned dates. PestScan API: GET /v1/crm/orders.
Input Schema
{
"type": "object",
"properties": {
"fromDate": {
"description": "Only orders created on or after this date or date-time.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2})?)?$"
},
"toDate": {
"description": "Only orders created on or before this date or date-time.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2})?)?$"
},
"id": {
"description": "Filter by the numeric PestScan id.",
"type": "integer",
"minimum": -2147483648,
"maximum": 2147483647
},
"externalId": {
"description": "Filter by the external id your system uses for the record.",
"type": "string"
},
"page": {
"description": "Page number, from 1 (default 1).",
"type": "integer",
"minimum": 1,
"maximum": 2147483647
},
"pageSize": {
"description": "Records per page (default 20, max 100).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢pestscan_list_new_orders
List order sheets that are new for this integration, not yet taken over. Reading does not confirm them. PestScan API: GET /v1/crm/orders/new.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢pestscan_list_completed_orders
List order sheets that are completed and ready for the integration. Reading does not confirm them. PestScan API: GET /v1/crm/orders/completed.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢pestscan_list_appointments(id, fromDate, toDate, page, pageSize)
List appointments with their employees, in a date range (end on or after fromDate, start on or before toDate). PestScan API: GET /v1/crm/appointments.
Input Schema
{
"type": "object",
"properties": {
"id": {
"description": "Filter by the numeric PestScan id.",
"type": "integer",
"minimum": -2147483648,
"maximum": 2147483647
},
"fromDate": {
"description": "ISO 8601 date or date-time, e.g. 2026-11-01 or 2026-11-01T00:00:00Z.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2})?)?$"
},
"toDate": {
"description": "ISO 8601 date or date-time, e.g. 2026-11-01 or 2026-11-01T00:00:00Z.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2})?)?$"
},
"page": {
"description": "Page number, from 1 (default 1).",
"type": "integer",
"minimum": 1,
"maximum": 2147483647
},
"pageSize": {
"description": "Records per page (default 20, max 100).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢pestscan_list_infestations(surveyId, externalSurveyId, baitStationId, pestType, fromDate, ...)
List infestations (pest findings) recorded at a location, filtered by survey, bait station, pest type or date. PestScan API: GET /v1/crm/infestations.
Input Schema
{
"type": "object",
"properties": {
"surveyId": {
"description": "Filter by the location (survey) PestScan id.",
"type": "integer",
"minimum": -2147483648,
"maximum": 2147483647
},
"externalSurveyId": {
"description": "Filter by the location (survey) external id.",
"type": "string"
},
"baitStationId": {
"description": "Filter by the bait station id.",
"type": "integer",
"minimum": -2147483648,
"maximum": 2147483647
},
"pestType": {
"description": "Filter by pest type, as the API names it.",
"type": "string"
},
"fromDate": {
"description": "ISO 8601 date or date-time, e.g. 2026-11-01 or 2026-11-01T00:00:00Z.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2})?)?$"
},
"toDate": {
"description": "ISO 8601 date or date-time, e.g. 2026-11-01 or 2026-11-01T00:00:00Z.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2})?)?$"
},
"page": {
"description": "Page number, from 1 (default 1).",
"type": "integer",
"minimum": 1,
"maximum": 2147483647
},
"pageSize": {
"description": "Records per page (default 20, max 100).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢pestscan_list_bait_stations(baitStationId, surveyId, externalSurveyId, getFrom, page, ...)
List bait stations (monitoring points) with their location, optionally from a date. PestScan API: GET /v1/crm/baitstations.
Input Schema
{
"type": "object",
"properties": {
"baitStationId": {
"description": "Filter by the numeric PestScan id.",
"type": "integer",
"minimum": -2147483648,
"maximum": 2147483647
},
"surveyId": {
"description": "Filter by the location (survey) PestScan id.",
"type": "integer",
"minimum": -2147483648,
"maximum": 2147483647
},
"externalSurveyId": {
"description": "Filter by the location (survey) external id.",
"type": "string"
},
"getFrom": {
"description": "Only bait stations changed on or after this date or date-time.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2})?)?$"
},
"page": {
"description": "Page number, from 1 (default 1).",
"type": "integer",
"minimum": 1,
"maximum": 2147483647
},
"pageSize": {
"description": "Records per page (default 20, max 100).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢pestscan_list_recommendations(surveyId, status, getFrom, page, pageSize)
List recommendations (advice from the inspector) for locations, filtered by survey and status. PestScan API: GET /v1/crm/recommendations.
Input Schema
{
"type": "object",
"properties": {
"surveyId": {
"description": "Filter by the location (survey) id.",
"type": "integer",
"minimum": -2147483648,
"maximum": 2147483647
},
"status": {
"description": "Filter by the exact recommendation status value.",
"type": "integer",
"minimum": -2147483648,
"maximum": 2147483647
},
"getFrom": {
"description": "Only recommendations changed on or after this date or date-time.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2})?)?$"
},
"page": {
"description": "Page number, from 1 (default 1).",
"type": "integer",
"minimum": 1,
"maximum": 2147483647
},
"pageSize": {
"description": "Records per page (default 20, max 100).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢pestscan_list_consumption(surveyId, surveyExternalId, orderSheetId, fromDate, toDate, ...)
List materials used (consumption) per location or visit, in a date range. PestScan API: GET /v1/crm/consumption.
Input Schema
{
"type": "object",
"properties": {
"surveyId": {
"description": "Filter by the location (survey) PestScan id.",
"type": "integer",
"minimum": -2147483648,
"maximum": 2147483647
},
"surveyExternalId": {
"description": "Filter by the location (survey) external id.",
"type": "string"
},
"orderSheetId": {
"description": "Filter by the visit (order sheet) PestScan id.",
"type": "integer",
"minimum": -2147483648,
"maximum": 2147483647
},
"fromDate": {
"description": "ISO 8601 date or date-time, e.g. 2026-11-01 or 2026-11-01T00:00:00Z.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2})?)?$"
},
"toDate": {
"description": "ISO 8601 date or date-time, e.g. 2026-11-01 or 2026-11-01T00:00:00Z.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2})?)?$"
},
"page": {
"description": "Page number, from 1 (default 1).",
"type": "integer",
"minimum": 1,
"maximum": 2147483647
},
"pageSize": {
"description": "Records per page (default 50, max 200).",
"type": "integer",
"minimum": 1,
"maximum": 200
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢pestscan_list_employees(searchText, externalId, employeeId, page, pageSize)
List employees (technicians and office users) with their names and external ids. PestScan API: GET /v1/crm/employees.
Input Schema
{
"type": "object",
"properties": {
"searchText": {
"description": "Search by first name, last name or username.",
"type": "string"
},
"externalId": {
"description": "Filter by the external id your system uses for the record.",
"type": "string"
},
"employeeId": {
"description": "Filter by the numeric PestScan id.",
"type": "integer",
"minimum": -2147483648,
"maximum": 2147483647
},
"page": {
"description": "Page number, from 1 (default 1).",
"type": "integer",
"minimum": 1,
"maximum": 2147483647
},
"pageSize": {
"description": "Records per page (default 20, max 100).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢pestscan_list_articles(searchText, externalId, id, categoryId, page, ...)
List articles (products and materials) with their category. Category 0 = rodents, 1 = insects, 2 = electric traps. PestScan API: GET /v1/crm/articles.
Input Schema
{
"type": "object",
"properties": {
"searchText": {
"description": "Search by article name.",
"type": "string"
},
"externalId": {
"description": "Filter by the external id your system uses for the record.",
"type": "string"
},
"id": {
"description": "Filter by the numeric PestScan id.",
"type": "integer",
"minimum": -2147483648,
"maximum": 2147483647
},
"categoryId": {
"description": "Filter by category id (0 = rodents, 1 = insects, 2 = electric traps).",
"type": "integer",
"minimum": -2147483648,
"maximum": 2147483647
},
"page": {
"description": "Page number, from 1 (default 1).",
"type": "integer",
"minimum": 1,
"maximum": 2147483647
},
"pageSize": {
"description": "Records per page (default 20, max 100).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢pestscan_list_visit_types(searchText, id, page, pageSize)
List the visit types (kinds of visit) that the account uses. PestScan API: GET /v1/crm/visit-types.
Input Schema
{
"type": "object",
"properties": {
"searchText": {
"description": "Search by description.",
"type": "string"
},
"id": {
"description": "Filter by the numeric PestScan id.",
"type": "integer",
"minimum": -2147483648,
"maximum": 2147483647
},
"page": {
"description": "Page number, from 1 (default 1).",
"type": "integer",
"minimum": 1,
"maximum": 2147483647
},
"pageSize": {
"description": "Records per page (default 20, max 100).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence