# Dribbble MCP tools

> Every Dribbble 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/dribbble

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)

11 tools for Dribbble on the Cotlet MCP server. Your agent picks them from tools/list.

- MCP server: `https://cotlet.dev/mcp/v1`
- Connects with: Your own Dribbble account (a Pro account for Pro Analytics)
- Integration page: https://cotlet.dev/integrations/dribbble-api-mcp-server

## Endpoints

| Endpoint | Access | Description |
|---|---|---|
| `dribbble_list_shots` | read | Your shots, newest first, with title, tags, publish date and URL. |
| `dribbble_get_shot_stats` | read | Views, likes, saves and comment count of one of your shots. |
| `dribbble_get_pro_analytics` | read | Pro Analytics: leads, proposals, funded projects, response time and rate, conversion and earnings. |
| `dribbble_list_conversations` | read | Your Messages inbox: who, last message, time and whether it is unread. |
| `dribbble_get_conversation` | read | All messages in a conversation, with sender, text, time and attached files. |
| `dribbble_list_leads` | read | Project and Service Requests you received, with client, date, type and whether you replied. |
| `dribbble_list_comments` | read | Comments on one of your shots, with author, text, time and whether you replied. |
| `dribbble_upload_shot` | write | Publish a new shot from an image, with title, description and tags. |
| `dribbble_update_shot` | write | Change the title, description or tags of one of your shots. |
| `dribbble_reply_to_message` | write | Send a message as you in an existing conversation. |
| `dribbble_reply_to_comment` | write | Reply as you under a comment on one of your shots. |

## List shots

MCP tool: `dribbble_list_shots`

Access: read.

Returns your own shots, newest first, the same order as your profile. Each item has the title, tags, publish date and URL. Use the shot_id of an item in get_shot_stats, list_comments and update_shot. Pass next_cursor back as cursor for the next page.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `limit` | integer | no | 1 to 100. Default: 24. |
| `cursor` | string | no | Next page cursor from the previous call. |

### tools/call

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

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "shots": [
      {
        "shot_id": "21847531",
        "title": "Fintech dashboard",
        "tags": [
          "ui",
          "fintech",
          "dashboard"
        ],
        "published_at": "2026-10-08T09:30:00Z",
        "url": "https://dribbble.com/shots/21847531-Fintech-dashboard"
      },
      {
        "shot_id": "21790442",
        "title": "Onboarding flow",
        "tags": [
          "ux",
          "mobile"
        ],
        "published_at": "2026-09-30T14:10:00Z",
        "url": "https://dribbble.com/shots/21790442-Onboarding-flow"
      }
    ],
    "next_cursor": "eyJvZmZzZXQiOjI0fQ"
  },
  "isError": false
}
```

## Get shot stats

MCP tool: `dribbble_get_shot_stats`

Access: read.

Returns the engagement numbers Dribbble shows for one of your shots: views, likes, saves and the number of comments. It works for your own shots only. The numbers are the ones Dribbble shows at the time of the call.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `shot_id` | string | yes | Shot ID from list_shots. |

### tools/call

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

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "shot_id": "21847531",
    "title": "Fintech dashboard",
    "views": 4120,
    "likes": 186,
    "saves": 74,
    "comments": 12
  },
  "isError": false
}
```

## Get Pro Analytics

MCP tool: `dribbble_get_pro_analytics`

Access: read.

Returns the figures of your Pro Analytics dashboard for a period: leads, project proposals, funded and completed projects, average project value, response time, response rate, lead conversion rate, cancellation rate and earnings. Dribbble refreshes these once a day. Needs a Pro account.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `period` | enum | no | 30d, 60d, 90d or all_time. Default: 30d. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "dribbble_get_pro_analytics",
    "arguments": {
      "period": "60d"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "period": "30d",
    "leads": 14,
    "project_proposals": 6,
    "funded_projects": 3,
    "completed_projects": 2,
    "average_project_value": 2400,
    "response_time_hours": 3.5,
    "response_rate": 92.9,
    "lead_conversion_rate": 21.4,
    "cancellation_rate": 0,
    "earnings": 4800,
    "currency": "USD"
  },
  "isError": false
}
```

## List conversations

MCP tool: `dribbble_list_conversations`

Access: read.

Lists your Dribbble Messages conversations, most recent first, with the other person, a preview of the last message, its time and whether it is unread. Set unread_only to see only what needs an answer. Pass conversation_id to get_conversation or reply_to_message.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `unread_only` | boolean | no | Only conversations with unread messages. |
| `limit` | integer | no | 1 to 50. Default: 20. |
| `cursor` | string | no | Next page cursor from the previous call. |

### tools/call

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

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "conversations": [
      {
        "conversation_id": "8841207",
        "with": "Marta Kowal",
        "last_message": "Hi! We need a redesign of our analytics dashboard.",
        "updated_at": "2026-10-10T08:14:00Z",
        "unread": true
      }
    ],
    "next_cursor": null
  },
  "isError": false
}
```

## Get conversation

MCP tool: `dribbble_get_conversation`

Access: read.

Returns the messages of one conversation, oldest first, with the sender, text, time and any attached files. Your agent reads the whole thread before it drafts a reply.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `conversation_id` | string | yes | Conversation ID from list_conversations. |

### tools/call

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

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "conversation_id": "8841207",
    "with": "Marta Kowal",
    "messages": [
      {
        "from": "Marta Kowal",
        "body": "Hi! We need a redesign of our analytics dashboard.",
        "sent_at": "2026-10-10T08:14:00Z",
        "attachments": []
      }
    ]
  },
  "isError": false
}
```

## List leads

MCP tool: `dribbble_list_leads`

Access: read.

Lists the Project and Service Requests you received, newest first, the same requests Pro Analytics counts as Leads. Each item has the client, the date, the request type and whether you have replied. Use unanswered_only to see what still needs an answer.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `since` | date | no | Only leads received on or after this date. |
| `unanswered_only` | boolean | no | Skip leads you already replied to. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "dribbble_list_leads",
    "arguments": {
      "since": "2026-10-05",
      "unanswered_only": true
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "leads": [
      {
        "lead_id": "ld_30912",
        "client": "Marta Kowal",
        "type": "Project Request",
        "received_at": "2026-10-08T11:02:00Z",
        "replied": false,
        "conversation_id": "8841207"
      }
    ],
    "next_cursor": null
  },
  "isError": false
}
```

## List comments

MCP tool: `dribbble_list_comments`

Access: read.

Lists the comments on one of your shots, newest first, with the author, text, time and whether you replied. Set unanswered_only to skip comments you already answered. Pass comment_id to reply_to_comment.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `shot_id` | string | yes | Shot ID from list_shots. |
| `unanswered_only` | boolean | no | Skip comments you already replied to. |

### tools/call

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

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "shot_id": "21847531",
    "comments": [
      {
        "comment_id": "c_4471",
        "author": "Jonas Weber",
        "body": "Clean grid. What spacing scale is this?",
        "created_at": "2026-10-09T17:40:00Z",
        "replied": false
      }
    ],
    "next_cursor": null
  },
  "isError": false
}
```

## Upload shot

MCP tool: `dribbble_upload_shot`

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

Publishes a new shot on your profile from an image URL, with a title, an optional description and tags. Set publish_at to schedule it. The shot appears under your name and is public once published. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `image_url` | string | yes | PNG, JPG or GIF by URL. |
| `title` | string | yes | Shot title. |
| `description` | string | no | Text shown under the shot. |
| `tags` | string[] | no | Tags that help the shot show up in search. |
| `publish_at` | datetime | no | Schedule it, ISO 8601 with time zone. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "dribbble_upload_shot",
    "arguments": {
      "image_url": "https://example.com",
      "title": "title"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "shot_id": "21901377",
    "status": "published",
    "title": "Fintech dashboard",
    "tags": [
      "ui",
      "fintech",
      "dashboard"
    ],
    "url": "https://dribbble.com/shots/21901377-Fintech-dashboard",
    "published_at": "2026-10-11T10:00:00+02:00"
  },
  "isError": false
}
```

## Update shot

MCP tool: `dribbble_update_shot`

Access: write.

Changes the title, description or tags of one of your own shots. Fields you leave out stay as they are. It sends nothing to anyone and one more call restores the old text, so it runs without asking first.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `shot_id` | string | yes | Shot ID from list_shots. |
| `fields` | object | yes | Any of title, description, tags. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "dribbble_update_shot",
    "arguments": {
      "shot_id": "shot_8c41d2",
      "fields": "fields"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "shot_id": "21847531",
    "status": "updated",
    "title": "Fintech dashboard v2",
    "tags": [
      "ui",
      "fintech",
      "dashboard"
    ]
  },
  "isError": false
}
```

## Reply to message

MCP tool: `dribbble_reply_to_message`

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

Sends a message in an existing conversation, under your name. The other person sees it in their Dribbble Messages. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `conversation_id` | string | yes | Conversation ID from list_conversations. |
| `body` | string | yes | Message text. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "dribbble_reply_to_message",
    "arguments": {
      "conversation_id": "8841207",
      "body": "Thanks for reaching out! I can start on the dashboard redesign next week. Could you share the current screens?"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "message_id": "55120934",
    "conversation_id": "8841207",
    "status": "sent",
    "sent_at": "2026-10-10T14:22:05+02:00"
  },
  "isError": false
}
```

## Reply to comment

MCP tool: `dribbble_reply_to_comment`

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

Posts a reply under one comment on your shot, under your name. The reply is public on the shot. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `comment_id` | string | yes | Comment ID from list_comments. |
| `body` | string | yes | Reply text. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "dribbble_reply_to_comment",
    "arguments": {
      "comment_id": "comment_8c41d2",
      "body": "body"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "comment_id": "c_4480",
    "reply_to": "c_4471",
    "status": "published"
  },
  "isError": false
}
```
