# Thryv MCP tools

> Every Thryv MCP tool on the Cotlet server: tool names, input schemas, a tools/call example and an example result for each tool.

Source: https://cotlet.dev/docs/mcp/thryv

Docs sections: [Get started](https://cotlet.dev/docs.md) · [REST API](https://cotlet.dev/docs/api.md) · [MCP](https://cotlet.dev/docs/mcp.md) · [SDKs & CLI](https://cotlet.dev/docs/sdks.md) · [Integrations](https://cotlet.dev/docs/integrations.md)

14 tools for Thryv on the Cotlet MCP server. Your agent picks them from tools/list.

- MCP server: `https://cotlet.dev/mcp/v1`
- Connects with: Your own Thryv Business Center account (primary admin for full access)
- Integration page: https://cotlet.dev/integrations/thryv-api-mcp-server

## Endpoints

| Endpoint | Access | Description |
|---|---|---|
| `thryv_list_clients` | read | Clients with contact details and tags, newest first. |
| `thryv_get_client` | read | Client card: contact details, tags, notes, client details, appointments, invoices and message history. |
| `thryv_list_services` | read | Services from your services menu, with their saved prices. |
| `thryv_list_appointments` | read | Calendar appointments in a date range, with client, service, staff and price. |
| `thryv_list_invoices` | read | Invoices from the Sales tab with client, total, balance due and dates. |
| `thryv_list_conversations` | read | Inbox conversations with the latest messages, across email, text and other connected channels. |
| `thryv_list_reviews` | read | Reviews from the Reputation dashboard, from every connected site, with rating and whether you replied. |
| `thryv_add_client` | write | New client card. Nothing is sent to the client. |
| `thryv_book_appointment` | write | New calendar appointment. Thryv emails the client a booking confirmation. |
| `thryv_mark_no_show` | write | Mark an appointment as a no-show, before its end time. May send your missed appointment email. |
| `thryv_create_estimate` | write | Itemized estimate on the client card, saved or sent for approval in the client portal. |
| `thryv_create_invoice` | write | Invoice on the client card, saved to send later or sent with an online payment link. |
| `thryv_send_message` | write | Message one or more clients, the same as Send Message on your dashboard. |
| `thryv_reply_to_review` | write | Post a public reply to a review from the Reputation dashboard. |

## List clients

MCP tool: `thryv_list_clients`

Access: read.

Lists the clients on your account, newest first. Filter by name, email or tag to find a group such as everyone tagged "spring". Pages hold up to 100 clients; pass next_cursor back as cursor for the next page.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `search` | string | no | Name or email. |
| `tag` | string | no | Only clients with this tag. |
| `limit` | integer | no | 1 to 100. Default: 50. |
| `cursor` | string | no | Next page cursor from the previous call. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "thryv_list_clients",
    "arguments": {}
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "clients": [
      {
        "client_id": "cl_8f2a91",
        "name": "Sample Client",
        "email": "client@example.com",
        "phone": "+1 555 0100",
        "tags": [
          "spring"
        ]
      },
      {
        "client_id": "cl_20b4d7",
        "name": "Jordan Hale",
        "email": "jordan@example.com",
        "phone": "+1 555 0101",
        "tags": [
          "spring",
          "lawn"
        ]
      }
    ],
    "next_cursor": null
  },
  "isError": false
}
```

## Get client

MCP tool: `thryv_get_client`

Access: read.

Returns one client card with contact details, tags, internal notes, appointments, invoices and the message history. Use it before replying or invoicing so your agent sees everything about the client.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `client_id` | string | yes | Client ID from list_clients. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "thryv_get_client",
    "arguments": {
      "client_id": "client_8c41d2"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "client_id": "cl_8f2a91",
    "name": "Sample Client",
    "email": "client@example.com",
    "tags": [
      "spring"
    ],
    "notes": "Prefers morning visits.",
    "appointments": [
      {
        "appointment_id": "ap_40b2d8",
        "service": "Lawn treatment",
        "start": "2026-09-29T09:00:00-05:00"
      }
    ],
    "invoices": [
      {
        "invoice_id": "inv_2041",
        "total": "85.00",
        "balance_due": "0.00"
      }
    ],
    "messages": 3
  },
  "isError": false
}
```

## List services

MCP tool: `thryv_list_services`

Access: read.

Returns the services on your services menu with their saved prices. Use the name as the service parameter of book_appointment.

### Parameters

No parameters.

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "thryv_list_services",
    "arguments": {}
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "services": [
      {
        "name": "Lawn treatment",
        "price": "85.00"
      },
      {
        "name": "Edging",
        "price": "25.00"
      }
    ]
  },
  "isError": false
}
```

## List appointments

MCP tool: `thryv_list_appointments`

Access: read.

Lists calendar appointments between two dates, with client, service, staff and price. The range is at most 31 days. Filter by staff member to see one person's calendar.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `from` | date | yes | First day. |
| `to` | date | yes | Last day, at most 31 days after from. |
| `staff` | string | no | Only this staff member. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "thryv_list_appointments",
    "arguments": {
      "from": "2026-10-01",
      "to": "2026-10-01"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "appointments": [
      {
        "appointment_id": "ap_40b2d8",
        "client": "Sample Client",
        "client_id": "cl_8f2a91",
        "service": "Lawn treatment",
        "start": "2026-10-13T09:00:00-05:00",
        "end": "2026-10-13T10:00:00-05:00",
        "staff": "Alex",
        "price": "85.00"
      },
      {
        "appointment_id": "ap_40b2d9",
        "client": "Jordan Hale",
        "client_id": "cl_20b4d7",
        "service": "Edging",
        "start": "2026-10-13T11:00:00-05:00",
        "end": "2026-10-13T11:30:00-05:00",
        "staff": "Alex",
        "price": "25.00"
      }
    ]
  },
  "isError": false
}
```

## List invoices

MCP tool: `thryv_list_invoices`

Access: read.

Lists invoices from the Sales tab with client, total, balance due and dates. Set unpaid_only to skip invoices paid in full. Pages hold up to 100 invoices.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `client_id` | string | no | Only this client. |
| `unpaid_only` | boolean | no | Skip invoices paid in full. |
| `limit` | integer | no | 1 to 100. Default: 50. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "thryv_list_invoices",
    "arguments": {}
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "invoices": [
      {
        "invoice_id": "inv_2044",
        "client": "Jordan Hale",
        "client_id": "cl_20b4d7",
        "total": "110.00",
        "balance_due": "110.00",
        "issued": "2026-10-05",
        "due": "2026-10-19"
      }
    ]
  },
  "isError": false
}
```

## List conversations

MCP tool: `thryv_list_conversations`

Access: read.

Lists inbox conversations with the latest messages, across email, text and the other channels you connected in Thryv. Filter by client to see one thread. Pages hold up to 50 conversations.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `client_id` | string | no | Only this client. |
| `limit` | integer | no | 1 to 50. Default: 20. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "thryv_list_conversations",
    "arguments": {}
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "conversations": [
      {
        "conversation_id": "cv_77d2",
        "client": "Sample Client",
        "client_id": "cl_8f2a91",
        "channel": "text",
        "last_message": "Can we move Tuesday to 10:00?",
        "updated_at": "2026-10-10T16:02:00-05:00"
      }
    ]
  },
  "isError": false
}
```

## List reviews

MCP tool: `thryv_list_reviews`

Access: read.

Lists reviews from the Reputation dashboard, from every site you connected, with rating, text and whether you replied. Use unanswered_only to see what needs a reply. Pass review_id to reply_to_review.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `unanswered_only` | boolean | no | Skip reviews you already answered. |
| `since` | date | no | Only reviews posted on or after this date. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "thryv_list_reviews",
    "arguments": {}
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "reviews": [
      {
        "review_id": "rv_3b90c1",
        "site": "Google",
        "rating": 5,
        "author": "Dana K.",
        "text": "The lawn looks great.",
        "posted": "2026-10-08",
        "replied": false
      }
    ]
  },
  "isError": false
}
```

## Add client

MCP tool: `thryv_add_client`

Access: write.

Creates a client card. Nothing is sent to the client, and the card can be edited or removed in Thryv, so the call skips confirmation. Only the first name is required.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `first_name` | string | yes | First name. |
| `last_name` | string | no | Last name. |
| `email` | string | no | Email address. |
| `phone` | string | no | Phone number. |
| `tags` | string[] | no | Tags to add. |
| `notes` | string | no | Internal notes, not shown to the client. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "thryv_add_client",
    "arguments": {
      "first_name": "first name"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "client_id": "cl_8f2a91",
    "name": "Sam Lee",
    "email": "client@example.com",
    "tags": [
      "spring"
    ],
    "status": "created"
  },
  "isError": false
}
```

## Book appointment

MCP tool: `thryv_book_appointment`

Access: write. Confirm: waits for the user's OK before it runs.

Books an appointment on your calendar for a client. Thryv emails the client a booking confirmation, plus any extra recipients you add. End time defaults to the service length and staff to the primary admin. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `client_id` | string | yes | Client ID from list_clients. |
| `service` | string | yes | Service name from list_services, or a custom title. |
| `start` | datetime | yes | ISO 8601 with time zone. |
| `end` | datetime | no | End time. Default: the service length. |
| `staff` | string | no | Staff member. Default: the primary admin. |
| `price_type` | enum | no | fixed, custom or no_fee. Default: the service setting. |
| `price` | string | no | Price for a fixed-price appointment. |
| `additional_recipients` | string[] | no | More emails that get the booking email. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "thryv_book_appointment",
    "arguments": {
      "client_id": "cl_8f2a91",
      "service": "Lawn treatment",
      "start": "2026-10-13T09:00:00-05:00",
      "staff": "Alex",
      "price_type": "fixed",
      "price": "85.00"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "appointment_id": "ap_51c7e0",
    "client": "Sample Client",
    "service": "Lawn treatment",
    "start": "2026-10-13T09:00:00-05:00",
    "end": "2026-10-13T10:00:00-05:00",
    "staff": "Alex",
    "price": "85.00",
    "confirmation_sent_to": [
      "client@example.com"
    ]
  },
  "isError": false
}
```

## Mark no-show

MCP tool: `thryv_mark_no_show`

Access: write. Confirm: waits for the user's OK before it runs.

Marks one appointment as a no-show, before its end time. If you set up a missed appointment email in Thryv, it may go out to the client. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `appointment_id` | string | yes | Appointment ID from list_appointments. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "thryv_mark_no_show",
    "arguments": {
      "appointment_id": "appointment_8c41d2"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "appointment_id": "ap_40b2d9",
    "status": "no_show"
  },
  "isError": false
}
```

## Create estimate

MCP tool: `thryv_create_estimate`

Access: write. Confirm: waits for the user's OK before it runs.

Creates an itemized estimate on the client card. With send false it is only saved; with send true it goes to the client for approval in the client portal. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `client_id` | string | yes | Client ID from list_clients. |
| `line_items` | object[] | yes | List of items, each with description, quantity and unit_price. |
| `notes` | string | no | Notes shown on the estimate. |
| `send` | boolean | no | Send it to the client now. Default: false. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "thryv_create_estimate",
    "arguments": {
      "client_id": "cl_8f2a91",
      "line_items": [
        {
          "description": "Gutter cleaning",
          "quantity": 1,
          "unit_price": "140.00"
        },
        {
          "description": "Tree trimming",
          "quantity": 2,
          "unit_price": "95.00"
        }
      ],
      "notes": "Based on your message of 10 Oct. Final price confirmed on site.",
      "send": false
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "estimate_id": "est_1180",
    "client_id": "cl_8f2a91",
    "total": "110.00",
    "status": "saved"
  },
  "isError": false
}
```

## Create invoice

MCP tool: `thryv_create_invoice`

Access: write. Confirm: waits for the user's OK before it runs.

Creates an invoice on the client card from line items. With send false it is saved to send later; with send true it goes to the client with an online payment link. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `client_id` | string | yes | Client ID from list_clients. |
| `line_items` | object[] | yes | List of items, each with description, quantity and unit_price. |
| `send` | boolean | no | Send it to the client now. Default: false. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "thryv_create_invoice",
    "arguments": {
      "client_id": "client_8c41d2",
      "line_items": [
        "line items"
      ]
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "invoice_id": "inv_2051",
    "client_id": "cl_8f2a91",
    "line_items": [
      {
        "description": "Lawn treatment",
        "quantity": 1,
        "unit_price": "85.00"
      },
      {
        "description": "Edging",
        "quantity": 1,
        "unit_price": "25.00"
      }
    ],
    "total": "110.00",
    "balance_due": "110.00",
    "status": "draft"
  },
  "isError": false
}
```

## Send message

MCP tool: `thryv_send_message`

Access: write. Confirm: waits for the user's OK before it runs.

Sends a message to one or more clients, the same as Send Message on your dashboard. Subject and message text are required. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `client_ids` | string[] | yes | Client IDs from list_clients. |
| `subject` | string | yes | Subject line. |
| `message` | string | yes | Message text. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "thryv_send_message",
    "arguments": {
      "client_ids": [
        "client ids"
      ],
      "subject": "subject",
      "message": "message"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "sent_to": [
      "cl_8f2a91",
      "cl_20b4d7"
    ],
    "subject": "Open slots next week",
    "status": "sent"
  },
  "isError": false
}
```

## Reply to review

MCP tool: `thryv_reply_to_review`

Access: write. Confirm: waits for the user's OK before it runs.

Posts a public reply to one review from the Reputation dashboard. The reply is visible to anyone who reads the review. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `review_id` | string | yes | Review ID from list_reviews. |
| `text` | string | yes | Reply text. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "thryv_reply_to_review",
    "arguments": {
      "review_id": "rv_3b90c1",
      "text": "Thank you, Dana! Glad the lawn came back green after the fall treatment. See you in the spring."
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "review_id": "rv_3b90c1",
    "status": "published"
  },
  "isError": false
}
```
