# Teachers Pay Teachers MCP tools

> Every Teachers Pay Teachers 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/teachers-pay-teachers

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 Teachers Pay Teachers on the Cotlet MCP server. Your agent picks them from tools/list.

- MCP server: `https://cotlet.dev/mcp/v1`
- Connects with: Your own TPT Seller account
- Integration page: https://cotlet.dev/integrations/teachers-pay-teachers-api-mcp-server

## Endpoints

| Endpoint | Access | Description |
|---|---|---|
| `teachers-pay-teachers_list_products` | read | Your product listings with title, type, price, status and custom category. |
| `teachers-pay-teachers_get_product` | read | Full listing: title, description, price, additional license price, grades, subjects, tags, formats and files. |
| `teachers-pay-teachers_get_store_stats` | read | Seller Dashboard totals: earnings, units sold, carts, unique buyers, views and conversions. |
| `teachers-pay-teachers_get_product_stats` | read | Per product: earnings, units sold, views, conversion, Wish Listed and Saved for Later. |
| `teachers-pay-teachers_list_sales` | read | Sales Details from your Sales Reports, one line per item sold, with earnings and sales tax. |
| `teachers-pay-teachers_get_search_keywords` | read | Search Analytics: TPT search keywords that led buyers to your products, with visits, conversions and earnings. |
| `teachers-pay-teachers_list_buyer_questions` | read | Questions from the Q&A section of your store, newest first, with product and any answer. |
| `teachers-pay-teachers_create_product` | write | New Digital Download listing from a file. Inactive by default; an active listing is live for buyers right away. |
| `teachers-pay-teachers_update_product` | write | Change title, description, price, additional license price, grades, subjects or tags of a listing. |
| `teachers-pay-teachers_set_product_status` | write | Make a listing active or inactive. Past buyers keep their downloads. |
| `teachers-pay-teachers_upload_revised_file` | write | Replace the product file and optionally notify past buyers with a note on what changed. |
| `teachers-pay-teachers_answer_buyer_question` | write | Post a public answer to a question on your product page. |
| `teachers-pay-teachers_schedule_sale` | write | Throw a sale on chosen products or your whole store for set dates. |
| `teachers-pay-teachers_send_note_to_followers` | write | Weekly Note to Followers about new products or promotions, sent now or on a set date. |

## List products

MCP tool: `teachers-pay-teachers_list_products`

Access: read.

Lists your listings with title, type, price, status and custom category. Filter by status, type or custom category to find a group of products. Pages hold up to 100 products; pass next_cursor back as cursor for the next page.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `status` | enum | no | active, inactive or all. Default: all. |
| `type` | enum | no | digital_download, bundle, video, google_resource or all. Default: all. |
| `custom_category` | string | no | Only products in this store custom category. |
| `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": "teachers-pay-teachers_list_products",
    "arguments": {}
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "products": [
      {
        "product_id": "11204567",
        "title": "Fraction Task Cards, Grades 3-4",
        "type": "digital_download",
        "price_cents": 600,
        "status": "active",
        "custom_category": "Fractions"
      },
      {
        "product_id": "9873310",
        "title": "Fractions Bundle",
        "type": "bundle",
        "price_cents": 900,
        "status": "active",
        "custom_category": "Fractions"
      }
    ],
    "next_cursor": null
  },
  "isError": false
}
```

## Get product

MCP tool: `teachers-pay-teachers_get_product`

Access: read.

Returns one listing in full: description, price, additional license price, grades, subjects, tags, formats and files. Use it before answering a buyer question or rewriting a title, so your agent works from the real listing.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `product_id` | string | yes | Product ID from list_products. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "teachers-pay-teachers_get_product",
    "arguments": {
      "product_id": "product_8c41d2"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "product_id": "11204567",
    "title": "Fraction Task Cards, Grades 3-4",
    "description": "20 printable task cards on comparing and adding fractions, with answer keys.",
    "price_cents": 600,
    "additional_license_price_cents": 300,
    "grades": [
      "3rd",
      "4th"
    ],
    "subjects": [
      "Fractions"
    ],
    "tags": [
      "Task Cards"
    ],
    "formats": [
      "PDF"
    ],
    "status": "active"
  },
  "isError": false
}
```

## Get store stats

MCP tool: `teachers-pay-teachers_get_store_stats`

Access: read.

Returns the Seller Dashboard totals for a period: earnings, units sold, carts, unique buyers, views and conversions. Set buyer_type to compare first-time and repeat buyers, or product_ids to look at part of the store. Earnings are in US cents.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `from` | date | yes | First day of the period. |
| `to` | date | yes | Last day of the period. |
| `buyer_type` | enum | no | all, first_time or repeat. Default: all. |
| `product_ids` | string[] | no | Only these products. Default: whole store. |

### tools/call

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

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "from": "2026-10-05",
    "to": "2026-10-11",
    "buyer_type": "all",
    "earnings_cents": 41235,
    "units_sold": 74,
    "carts": 91,
    "unique_buyers": 58,
    "views": 3120,
    "conversion": 0.024
  },
  "isError": false
}
```

## Get product stats

MCP tool: `teachers-pay-teachers_get_product_stats`

Access: read.

Returns the numbers of one product for a period: earnings, units sold, views, conversion, Wish Listed and Saved for Later. Call it for each product from list_products to rank them.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `product_id` | string | yes | Product ID from list_products. |
| `from` | date | yes | First day of the period. |
| `to` | date | yes | Last day of the period. |

### tools/call

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

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "product_id": "11204567",
    "from": "2026-10-05",
    "to": "2026-10-11",
    "earnings_cents": 7200,
    "units_sold": 12,
    "views": 410,
    "conversion": 0.029,
    "wish_listed": 5,
    "saved_for_later": 9
  },
  "isError": false
}
```

## List sales

MCP tool: `teachers-pay-teachers_list_sales`

Access: read.

Returns Sales Details from your Sales Reports, one line per item sold, with earnings and sales tax. Filter by product to see the sales of one listing. Pass next_cursor back as cursor for the next page.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `from` | date | yes | First day of the period. |
| `to` | date | yes | Last day of the period. |
| `product_id` | string | no | Only sales of this product. |
| `cursor` | string | no | Next page cursor from the previous call. |

### tools/call

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

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "sales": [
      {
        "date": "2026-10-09",
        "product_id": "11204567",
        "title": "Fraction Task Cards, Grades 3-4",
        "earnings_cents": 510,
        "sales_tax_cents": 0
      },
      {
        "date": "2026-10-09",
        "product_id": "9873310",
        "title": "Fractions Bundle",
        "earnings_cents": 765,
        "sales_tax_cents": 0
      }
    ],
    "next_cursor": null
  },
  "isError": false
}
```

## Get search keywords

MCP tool: `teachers-pay-teachers_get_search_keywords`

Access: read.

Returns the TPT search keywords that led buyers to your products, with visits, conversions and earnings. Search Analytics starts on 1 Jan 2025. Pass product_id to see the keywords of one listing.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `from` | date | yes | First day of the period, 1 Jan 2025 or later. |
| `to` | date | yes | Last day of the period. |
| `product_id` | string | no | One product only. Default: whole store. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "teachers-pay-teachers_get_search_keywords",
    "arguments": {
      "from": "2026-07-01",
      "to": "2026-09-30",
      "product_id": "11204567"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "keywords": [
      {
        "keyword": "fraction task cards",
        "visits": 214,
        "conversions": 9,
        "earnings_cents": 5400
      },
      {
        "keyword": "fractions 4th grade",
        "visits": 167,
        "conversions": 6,
        "earnings_cents": 3600
      }
    ]
  },
  "isError": false
}
```

## List buyer questions

MCP tool: `teachers-pay-teachers_list_buyer_questions`

Access: read.

Lists questions from the Q&A section of your store, newest first, each with its product and any answer you already gave. Set unanswered_only to see what needs a reply. Pass question_id to answer_buyer_question.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `unanswered_only` | boolean | no | Skip questions you already answered. Default: false. |
| `limit` | integer | no | 1 to 100. Default: 50. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "teachers-pay-teachers_list_buyer_questions",
    "arguments": {}
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "questions": [
      {
        "question_id": "q_5821",
        "product_id": "11204567",
        "question": "Does this include answer keys?",
        "asked_at": "2026-10-10T14:20:00Z",
        "answer": null
      }
    ]
  },
  "isError": false
}
```

## Create product

MCP tool: `teachers-pay-teachers_create_product`

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

Creates a Digital Download listing from the URL of a PDF or ZIP. The listing is inactive unless active is true, and an active listing is live for buyers right away. Price is in US cents. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `title` | string | yes | Product title. |
| `description` | string | yes | Product description. |
| `file_url` | string | yes | URL of the PDF or ZIP buyers download. |
| `price_cents` | integer | yes | Price in US cents, e.g. 600 for $6. 0 for a free resource. |
| `grades` | string[] | yes | TPT grade levels, e.g. "1st", "2nd". |
| `subjects` | string[] | yes | TPT subjects, e.g. "Fractions". |
| `tags` | string[] | no | Resource type tags, e.g. "Centers". |
| `preview_url` | string | no | URL of a PDF preview. |
| `active` | boolean | no | Make Listing Active now. Default: false. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "teachers-pay-teachers_create_product",
    "arguments": {
      "title": "title",
      "description": "description",
      "file_url": "https://example.com",
      "price_cents": 1,
      "grades": [
        "1st"
      ],
      "subjects": [
        "Fractions"
      ]
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "product_id": "11310482",
    "title": "Fall Math Centers, Grades 1-2",
    "status": "inactive",
    "price_cents": 600,
    "grades": [
      "1st",
      "2nd"
    ],
    "subjects": [
      "Math"
    ]
  },
  "isError": false
}
```

## Update product

MCP tool: `teachers-pay-teachers_update_product`

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

Changes the fields you pass and leaves the rest. Price changes show to buyers right away on an active listing. Price is in US cents. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `product_id` | string | yes | Product ID from list_products. |
| `fields` | object | yes | Any of title, description, price_cents, additional_license_price_cents, grades, subjects, tags. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "teachers-pay-teachers_update_product",
    "arguments": {
      "product_id": "9873310",
      "fields": {
        "price_cents": 1000,
        "additional_license_price_cents": 900
      }
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "product_id": "11204567",
    "status": "updated",
    "changed": {
      "price_cents": {
        "from": 600,
        "to": 700
      }
    }
  },
  "isError": false
}
```

## Set product status

MCP tool: `teachers-pay-teachers_set_product_status`

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

Makes a listing active (for sale) or inactive (hidden). Past buyers keep their downloads. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `product_id` | string | yes | Product ID from list_products. |
| `active` | boolean | yes | true to sell it, false to hide it. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "teachers-pay-teachers_set_product_status",
    "arguments": {
      "product_id": "product_8c41d2",
      "active": true
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "product_id": "11310482",
    "active": true,
    "status": "active"
  },
  "isError": false
}
```

## Upload revised file

MCP tool: `teachers-pay-teachers_upload_revised_file`

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

Replaces the file buyers download. With notify_buyers set, past buyers are notified on their My Purchases page, and change_note tells them what changed. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `product_id` | string | yes | Product ID from list_products. |
| `file_url` | string | yes | URL of the new PDF or ZIP. |
| `notify_buyers` | boolean | no | Notify Buyers on their My Purchases page. Default: false. |
| `change_note` | string | no | What changed, shown to buyers when notified. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "teachers-pay-teachers_upload_revised_file",
    "arguments": {
      "product_id": "product_8c41d2",
      "file_url": "https://example.com"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "product_id": "11204567",
    "status": "file_replaced",
    "buyers_notified": true
  },
  "isError": false
}
```

## Answer buyer question

MCP tool: `teachers-pay-teachers_answer_buyer_question`

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

Posts an answer to one buyer question. The answer is public and appears under your store name. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `question_id` | string | yes | Question ID from list_buyer_questions. |
| `answer` | string | yes | Answer text, shown publicly under your store name. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "teachers-pay-teachers_answer_buyer_question",
    "arguments": {
      "question_id": "q_5821",
      "answer": "Yes, the file has answer keys for all 20 task cards at the end of the PDF."
    }
  }
}
```

### Example response

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

## Schedule sale

MCP tool: `teachers-pay-teachers_schedule_sale`

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

Schedules a sale of 5, 10, 15 or 20 percent off between a start and an end date. Leave product_ids empty to put the whole store on sale. Buyers see the lower prices during the sale. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `discount` | enum | yes | 5, 10, 15 or 20 (percent off). |
| `start_date` | date | yes | First day of the sale. |
| `end_date` | date | yes | Last day of the sale. |
| `product_ids` | string[] | no | Products on sale. Empty: whole store. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "teachers-pay-teachers_schedule_sale",
    "arguments": {
      "discount": "20",
      "start_date": "2026-10-16",
      "end_date": "2026-10-18",
      "product_ids": [
        "11204567",
        "11204582",
        "9873310"
      ]
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "sale_id": "sale_48213",
    "status": "scheduled",
    "discount": 20,
    "start_date": "2026-10-16",
    "end_date": "2026-10-18",
    "products": 3
  },
  "isError": false
}
```

## Send Note to Followers

MCP tool: `teachers-pay-teachers_send_note_to_followers`

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

Sends a Note to Followers about new products or promotions, now or on the date you set. Images go in the body by URL. The note reaches everyone who follows your store. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `body` | string | yes | Note text. Images by URL. |
| `send_on` | date | no | Send date. Default: now. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "teachers-pay-teachers_send_note_to_followers",
    "arguments": {
      "body": "body"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "note_id": "note_3307",
    "status": "sent",
    "sent_on": "2026-10-12"
  },
  "isError": false
}
```
