Creators & communities
Substack
Posts, Notes, messages, subscribers and stats for your publication.
50 endpoints
Your agent reads your mentions and DMs, summarizes busy channels and posts the weekly recap. It works in your own Discord account, inside the Claude or ChatGPT app. Nothing to install or host.
14 tools Read and write
Discord has an official API for bots and apps. Its official MCP server at docs.discord.com/mcp only searches the developer docs (checked 6 Nov 2026). Cotlet runs 14 Discord tools hosted, over MCP for agents and REST for scripts. There is no bot token to create and no server manager to ask.
| What you need | Discord bot API | Community MCP server | Cotlet |
|---|---|---|---|
| Read and post in channels | A bot added by a manager | Same, you run it | Yes, where your account can |
| Read your DMs and Inbox mentions | No | No, bot token | Yes |
| Assign roles and time out members | Bot with the permission | Bot with the permission | Yes, with your own role |
| Works in the Claude and ChatGPT apps | No, you build it | Runs on your computer | Yes, one address |
| Runs 24/7 without your computer | If you host the bot | If you host it | Yes, hosted |
| One account for many apps | No | No | Yes |
Checked 6 Nov 2026. Sources: Discord Developer Docs: API reference · Discord docs MCP server · Discord Developer Docs: Message Content intent · Zapier: Discord integrations
Use your own account in its Cotlet Cloud Browser.
Connect your agent or create a Cotlet API key.
Your agent reads and posts for you.
We never keep your Discord password, and nothing is posted, sent or changed until you approve it. Who can see your session
Use MCP with your AI agent, or HTTP requests in n8n, Make, Zapier and scripts. Follow the MCP setup below or jump to the REST guide.
Add the Cotlet address. Add https://cotlet.dev/mcp/v1 as an MCP server or connector in your agent.
Enable Discord for agents. Sign up, log in to Discord in its Cloud Browser, then press Enable for agents.
Approve the connection. Chat apps ask you to sign in to Cotlet. Editors, n8n and scripts use an API key from the console.
One shared address, https://cotlet.dev/mcp/v1, also carries Discord next to your other apps. If you enable Discord after connecting, refresh the connector so the new tools show up.
Settings > Connectors > Add custom connector
URL: https://cotlet.dev/mcp/v1/connect
Claude Code:
claude mcp add --transport http cotlet-discord \
https://cotlet.dev/mcp/v1 \
--header "Authorization: Bearer $COTLET_API_KEY" Settings > Apps & Connectors > Create
MCP server URL: https://cotlet.dev/mcp/v1/connect
Authentication: OAuth // ~/.cursor/mcp.json
{
"mcpServers": {
"cotlet-discord": {
"url": "https://cotlet.dev/mcp/v1",
"headers": { "Authorization": "Bearer ${env:COTLET_API_KEY}" }
}
}
} # ~/.codex/config.toml
[mcp_servers.cotlet-discord]
url = "https://cotlet.dev/mcp/v1"
bearer_token_env_var = "COTLET_API_KEY" MCP Client Tool (inside an AI Agent)
Transport: HTTP Streamable
URL: https://cotlet.dev/mcp/v1
Auth: Bearer, <your key>
Tool: discord_read Make: MCP Client > Call a tool
Zapier: MCP Client by Zapier > Run Tool
Server URL: https://cotlet.dev/mcp/v1
Token: <your key>
Tool: discord_write Sign in to your Discord account in its Cotlet Cloud Browser and enable the app for agents. Moderation tools need the matching role in the server.
Create a Cotlet API key with access to Discord and its read operations. Store it as COTLET_API_KEY in your environment or automation platform's credential store.
curl "https://cotlet.dev/api/v1/discord/messages?channel=1058204419337711800&since=2026-11-01&limit=50" \
-H "Authorization: Bearer $COTLET_API_KEY" A successful REST call puts the tool output in result. This illustrative response excerpt omits call IDs and credit details.
{
"status": "success",
"app": "discord",
"tool": "list_messages",
"result": {
"messages": [
{
"message_id": "1190466022837014528",
"author": "tom.becker",
"text": "Does anyone have a template for a pricing page?",
"thread_replies": 0,
"replied": false
}
],
"next_cursor": "1190466022837014528"
}
} Read result.messages and pass result.next_cursor unchanged as cursor until it comes back empty. Messages are newest first, 50 a page by default. Keep the channel and since the same while paging.
| Tool | Connect through | Example workflow |
|---|---|---|
| n8n | HTTP Request | Call list_mentions each morning and write the items that need an answer to a sheet. |
| Python or Node.js | REST API | Page through list_messages for #help and flag messages where replied is false. |
| Make or Zapier | HTTP request step | Call list_members with joined_since and add new members to your community CRM. |
Send Authorization: Bearer <your Cotlet API key> in request headers. You configure the schedule, destination and comparisons.
Cotlet reads Discord; your workflow steps write to your chosen destination. These HTTP workflows do not need a native Cotlet connector or a prebuilt template.
The API and MCP reference lists operations and inputs. The REST API guide explains authentication, errors and approvals.
Messages come newest first, 50 a page by default. Search runs in one server or one DM at a time.
Returns the servers in your server list, in the order Discord shows them. Each entry has the server name, the id to pass as server to the other tools and the name of your highest role. unread is true when the server has unread messages in unmuted channels. It does not list servers you have not joined.
MCP calldiscord_read → list_servers
REST endpointGET https://cotlet.dev/api/v1/discord/servers
No parameters.
{
"servers": [
{
"server_id": "1058204419337711702",
"name": "Landing Page Lab",
"highest_role": "Moderator",
"unread": true
},
{
"server_id": "1041930587712340066",
"name": "Indie Makers",
"highest_role": "Member",
"unread": false
}
]
} Lists the channels of one server in the order of the sidebar, grouped by category. Only channels your account can see are returned. type is text, forum or thread. Use channel_id as channel in list_messages and send_message. Private channels you cannot open are not shown.
MCP calldiscord_read → list_channels
REST endpointGET https://cotlet.dev/api/v1/discord/channels
| Name | Type | Description |
|---|---|---|
| server string required | string | Server id from list_servers. |
| type enum | enum | all, text, forum or thread. Default: all. |
{
"server": "server"
} {
"channels": [
{
"channel_id": "1058204419337711800",
"name": "general",
"category": "Community",
"type": "text"
},
{
"channel_id": "1058204419337711811",
"name": "help",
"category": "Community",
"type": "forum"
},
{
"channel_id": "1058204419337711822",
"name": "weekly-recap",
"category": "Community",
"type": "text"
}
]
} Returns messages of one channel you can open, newest first, a page at a time; pass next_cursor back as cursor for older ones. Each message has its id, the author, the text, the time, the number of replies in its thread and the reactions. replied is true when a later message in the channel is a reply to it. Messages you cannot see in the app are not returned.
MCP calldiscord_read → list_messages
REST endpointGET https://cotlet.dev/api/v1/discord/messages
| Name | Type | Description |
|---|---|---|
| channel string required | string | Channel, thread or DM id from list_channels or list_direct_conversations. |
| since date | date | Only messages sent on or after this date. |
| limit integer | integer | Messages per page. Default: 50. |
| cursor string | string | Next page cursor from the previous call. |
{
"channel": "channel"
} {
"messages": [
{
"message_id": "1190466022837014528",
"author": "tom.becker",
"text": "Does anyone have a template for a pricing page?",
"sent_at": "2026-11-04T16:12:00.000000Z",
"thread_replies": 0,
"replied": false,
"reactions": [
{
"emoji": "👀",
"count": 2
}
]
},
{
"message_id": "1190431876100952064",
"author": "maria.silva",
"text": "Shipped my first landing page today.",
"sent_at": "2026-11-04T10:41:00.000000Z",
"thread_replies": 3,
"replied": true,
"reactions": [
{
"emoji": "🎉",
"count": 5
}
]
}
],
"next_cursor": "1190431876100952064"
} Runs the search box of Discord for one server or one DM. query is the text to find. from, in, mentions and has work like the from:, in:, mentions: and has: shortcuts of the search bar. Results show the channel, the author and the message text. Discord searches the server or DM you name, not all your servers at once.
MCP calldiscord_read → search_messages
REST endpointGET https://cotlet.dev/api/v1/discord/messages/search
| Name | Type | Description |
|---|---|---|
| server string | string | Server id to search. Use this or dm. |
| dm string | string | DM conversation id to search. Use this or server. |
| query string required | string | Text to find. |
| from string | string | Only messages by this username. |
| in string | string | Only messages in this channel name. |
| mentions string | string | Only messages that mention this username. |
| has enum | enum | link, embed, image, video or sound. |
{
"query": "query"
} {
"results": [
{
"message_id": "1189022840016593920",
"channel": "general",
"author": "tom.becker",
"text": "My pricing page converts better with three plans than two.",
"sent_at": "2026-10-29T09:03:00.000000Z"
}
]
} Lists the members of one server that your account can see in the member list, newest joiners first, a page at a time. Each member has the username, the display name, the roles and joined_at. member_id goes to assign_role and timeout_member. Large servers show only part of the member list to members without moderator permissions.
MCP calldiscord_read → list_members
REST endpointGET https://cotlet.dev/api/v1/discord/members
| Name | Type | Description |
|---|---|---|
| server string required | string | Server id from list_servers. |
| joined_since date | date | Only members who joined on or after this date. |
| role string | string | Only members with this role name. |
| cursor string | string | Next page cursor from the previous call. |
{
"server": "server"
} {
"members": [
{
"member_id": "1161738420995301376",
"username": "ana.lopez",
"display_name": "Ana Lopez",
"roles": [
"Member"
],
"joined_at": "2026-11-04T18:21:00.000000Z"
}
],
"next_cursor": "1161738420995301376"
} Reading mentions and DMs does not clear them from your Inbox or mark a conversation as read.
Returns the items of the Mentions tab in your Discord Inbox, newest first. Each item has the server, the channel, the author and the message. include_everyone and include_roles switch on the @everyone and @role mentions, as the filter button of the tab does. Reading does not remove items from the Inbox.
MCP calldiscord_read → list_mentions
REST endpointGET https://cotlet.dev/api/v1/discord/mentions
| Name | Type | Description |
|---|---|---|
| include_everyone boolean | boolean | Include @everyone mentions. Default: false. |
| include_roles boolean | boolean | Include @role mentions. Default: false. |
| since date | date | Only mentions on or after this date. |
{
"mentions": [
{
"message_id": "1190466022837014528",
"server": "Landing Page Lab",
"channel": "help",
"author": "tom.becker",
"text": "@maya can you look at my pricing page?",
"sent_at": "2026-11-04T16:12:00.000000Z"
}
]
} Lists the conversations in your Direct Messages list, the most recent first. Each has the people in it, the id to use as channel in list_messages or dm in search_messages, and the last message. unread is true when you have not read it. Reading does not mark a conversation as read.
MCP calldiscord_read → list_direct_conversations
REST endpointGET https://cotlet.dev/api/v1/discord/direct-conversations
| Name | Type | Description |
|---|---|---|
| unread_only boolean | boolean | Only conversations with unread messages. Default: false. |
{
"conversations": [
{
"dm_id": "1171290365844979712",
"with": [
"ana.lopez"
],
"last_message": "Thanks, I will send the draft tomorrow.",
"unread": true
}
]
} Sends a DM from your account to one user, in the existing conversation or in a new one. The person is notified. Discord can refuse a DM when the person has turned off messages from server members, and the call then fails with the reason. By default you confirm each call; you can switch that off for this tool.
MCP calldiscord_write → send_direct_message
REST endpointPOST https://cotlet.dev/api/v1/discord/direct-messages
| Name | Type | Description |
|---|---|---|
| user string | string | Username of the person. Use this or dm. |
| dm string | string | Existing DM conversation id. Use this or user. |
| content string required | string | Message text. |
{
"content": "content"
} {
"message_id": "1190620017733128192",
"status": "sent",
"to": "ana.lopez",
"sent_at": "2026-11-05T07:10:00.000000Z"
} Everything here appears under your name and waits for your OK by default.
Posts text in one channel or thread that your account can write in. The message appears under your name and everyone in the channel sees it. It returns the message id and link. It fails if your role cannot post in that channel. By default you confirm each call; you can switch that off for this tool.
MCP calldiscord_write → send_message
REST endpointPOST https://cotlet.dev/api/v1/discord/messages
| Name | Type | Description |
|---|---|---|
| channel string required | string | Channel or thread id from list_channels. |
| content string required | string | Message text. Discord markdown works. |
{
"channel": "1058204419337711822",
"content": "Weekly recap: 3 landing pages shipped, pricing page template pinned in #help."
} {
"message_id": "1190602918442721280",
"status": "sent",
"channel": "weekly-recap",
"url": "https://discord.com/channels/1058204419337711702/1058204419337711822/1190602918442721280",
"sent_at": "2026-11-05T07:00:00.000000Z"
} Posts a reply that points at one message, so Discord shows the quote above it. The author of the message is notified. It works in channels, threads and DMs you can write in. It returns the id and link of the reply. By default you confirm each call; you can switch that off for this tool.
MCP calldiscord_write → reply_to_message
REST endpointPOST https://cotlet.dev/api/v1/discord/messages/{message_id}/replies
| Name | Type | Description |
|---|---|---|
| channel string required | string | Channel, thread or DM id. |
| message_id string required | string | Id of the message to reply to. |
| content string required | string | Reply text. |
{
"channel": "channel",
"message_id": "message_8c41d2",
"content": "content"
} {
"message_id": "1190611204497309696",
"status": "sent",
"reply_to": "1190466022837014528",
"sent_at": "2026-11-05T07:05:00.000000Z"
} Adds your reaction to one message. Everyone who sees the message sees the reaction and the author may be notified. Adding the same emoji twice changes nothing. By default you confirm each call; you can switch that off for this tool.
MCP calldiscord_write → add_reaction
REST endpointPOST https://cotlet.dev/api/v1/discord/messages/{message_id}/reactions
| Name | Type | Description |
|---|---|---|
| channel string required | string | Channel, thread or DM id. |
| message_id string required | string | Id of the message. |
| emoji string required | string | A standard emoji such as 🎉. |
{
"channel": "channel",
"message_id": "message_8c41d2",
"emoji": "emoji"
} {
"message_id": "1190431876100952064",
"emoji": "🎉",
"status": "added"
} Pins one message so it shows in the pinned messages of the channel, where every member can see it. Discord posts a notice in the channel that you pinned it. It fails if your role cannot pin messages there. By default you confirm each call; you can switch that off for this tool.
MCP calldiscord_write → pin_message
REST endpointPOST https://cotlet.dev/api/v1/discord/messages/{message_id}/pin
| Name | Type | Description |
|---|---|---|
| channel string required | string | Channel or thread id. |
| message_id string required | string | Id of the message to pin. |
{
"channel": "channel",
"message_id": "message_8c41d2"
} {
"message_id": "1190602918442721280",
"channel": "weekly-recap",
"status": "pinned"
} Needs Manage Roles or Time Out Members. A call your role does not allow fails with the reason.
Adds one role to one member, the same as picking the role in the member list. The member sees the role and what it unlocks, and the role may open channels for them. It fails if your account lacks Manage Roles or the role sits above your highest role. By default you confirm each call; you can switch that off for this tool.
MCP calldiscord_write → assign_role
REST endpointPOST https://cotlet.dev/api/v1/discord/members/{member_id}/role/assign
| Name | Type | Description |
|---|---|---|
| server string required | string | Server id from list_servers. |
| member_id string required | string | Member id from list_members. |
| role string required | string | Role name, as in Server Settings > Roles. |
{
"server": "server",
"member_id": "member_8c41d2",
"role": "role"
} {
"member_id": "1161738420995301376",
"role": "Member",
"status": "assigned"
} Puts one member on time out for the number of minutes you give. A timed-out member can still see and read channels but cannot post. The member is affected at once and sees it. It fails if your account lacks the permission or the member has an equal or higher role. By default you confirm each call; you can switch that off for this tool.
MCP calldiscord_write → timeout_member
REST endpointPOST https://cotlet.dev/api/v1/discord/members/{member_id}/timeout
| Name | Type | Description |
|---|---|---|
| server string required | string | Server id from list_servers. |
| member_id string required | string | Member id from list_members. |
| minutes integer required | integer | Length of the time out in minutes. |
| reason string | string | Reason for the moderation log. |
{
"server": "server",
"member_id": "member_8c41d2",
"minutes": 1
} {
"member_id": "1161738420995301376",
"status": "timed_out",
"minutes": 60
} Your logged-in Discord profile, encrypted with AES-256-GCM, in Finland. Not the password.
The 14 Discord tools. Never the login cookie.
Your servers, channels, DMs and Inbox.
Password, two-factor, billing and Nitro.
Your agent gives you the browser link and you finish it there.
Disable for agents in one click, or reset the browser.
Our site scores A+ on Qualys SSL Labs, securityheaders.com and Mozilla Observatory (live results). There is no SOC 2 report or third-party pentest yet.
When Discord moves a button or renames a field, the fix happens on our side and your prompts keep working. status.cotlet.dev shows the live status.
| Action | Undo |
|---|---|
| Send or reply to a message | Delete the message in Discord. Members may have read it already |
| Send a DM | Delete the message in the conversation |
| Add a reaction | Remove your reaction in Discord |
| Pin a message | Unpin it in Discord |
| Assign a role | Remove the role in Server Settings, Roles |
| Time out a member | End the time out on the member in Discord |
7 of 14 tools ask first: every one that posts, reacts, pins, messages someone or changes a member. The 7 read tools run at once. Switch the wait off per tool for a scheduled run.
No Cotlet tool deletes a message, a channel or a member. Deleting stays in Discord, in your hands.
{
"name": "send_message",
"arguments": {
"channel": "1058204419337711822",
"content": "Weekly recap: 3 landing pages shipped, pricing page template pinned in #help."
}
} curl -X POST https://cotlet.dev/api/v1/discord/messages \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"channel":"1058204419337711822","content":"Weekly recap: 3 landing pages shipped, pricing page template pinned in #help."}' {
"message_id": "1190602918442721280",
"status": "sent",
"channel": "weekly-recap",
"url": "https://discord.com/channels/1058204419337711702/1058204419337711822/1190602918442721280",
"sent_at": "2026-11-05T07:00:00.000000Z"
} Scripts and cron jobs reach the same tools over REST at /api/v1/discord, with the same key and price. A failed call costs nothing. The tools table lists the REST path of each tool.
About $28 a monthfor a server manager's daily routine, 4,820 credits. Discord itself is free to use.
| Job | Calls | Credits |
|---|---|---|
| Daily mentions summary | 3 × 30 | 900 |
| Weekly channel digest | 5 × 4 | 200 |
| Answer open questions, 3 days a week | 6 × 12 | 720 |
| Welcome new members, daily | 5 × 30 | 1,500 |
| Cloud Browser, 30 days | 1,500 | |
| Total | 4,820 |
The month is our example for a server of about 500 members, not a measured average: Discord publishes no typical server size (checked 6 Nov 2026). Nitro costs $2.99 or $9.99 a month on discord.com/nitro and is not needed. Dollars at the $29 pack rate.
| Credits | Price, one time | Calls at 10 credits | Per 1,000 credits |
|---|---|---|---|
| 5,000 | $29 | 500 | $5.80 |
| 15,000 | $79 | 1,500 | $5.27 |
| 32,000 | $149 | 3,200 | $4.66 |
| 60,000 | $249 | 6,000 | $4.15 |
Only successful calls use credits; failed calls and timeouts cost nothing. At a balance of 0 calls pause, never a surprise charge. Authenticate with the Authorization: Bearer header.
| Option | What it does | Where it stops |
|---|---|---|
| SaseQ/discord-mcp | Java MCP server for the Discord API in Docker. 591 stars, MIT, last commit 23 Oct 2026. | You run it with a bot token and add the bot to each server. |
| cappyeo/discord-mcp | Open-source server with 209 typed tools for your own bot. 189 stars, Apache-2.0, last commit 2 Nov 2026. | Bot based and self-run. |
| barryyip0625/mcp-discord | MCP server for AI assistants on Discord. 110 stars, MIT, last commit 5 Nov 2026. | Bot token and your own hosting. |
| v-3/discordmcp | Early Discord MCP server for Claude. 242 stars, no license listed. | Last commit 21 Jan 2025. |
| Anthropic Discord plugin | Claude Code channel plugin: reply, react and edit messages from a Discord bot. | Claude Code only, and it needs a bot invited to a server with the Message Content intent on. |
| Zapier | Polling triggers such as New Message Posted to Channel and New Mention, actions such as Send Direct Message. | Checks every 15 minutes on the Free plan. |
The GitHub servers are good if you want to run a bot of your own and can host it. Zapier fits fixed if-this-then-that steps. Cotlet is the hosted option that works in your own account, inside the Claude and ChatGPT apps, with one sign-in for all your apps.
Take Group sp. z o.o. runs Cotlet. It is a software company registered in Poland, EU (VAT PL6342984273), working since 2019, founded by Bart Krawczyk (Co-founder, CTO) and Jake Slugocki (Co-founder, SEO, sales and marketing). Write to contact@cotlet.dev with questions about the Discord tools.
Sign up at cotlet.dev, log in to Discord once in its Cloud Browser and add Cotlet to ChatGPT or Claude, following the steps in your console. No API key is needed. ChatGPT and Claude then work in your Discord account through Cotlet, in their phone apps too.
With Cotlet, ChatGPT, Claude and other AI agents handle jobs like these in Discord: summarize my Discord mentions; weekly digest of a busy channel; answer unanswered questions. You ask in plain words, and anything that reaches other people waits for your OK first.
Yes. Call Cotlet's REST API from a script or an HTTP step in n8n, Make or Zapier with your Cotlet key. MCP is the alternative for AI agents; you do not need to connect an agent to use REST.
Create a free account at https://cotlet.dev, open Discord under Integrations in the console and log in to Discord in its Cloud Browser. The trial starts with your first app, no card asked.
No bot and no admin rights are needed to read and post where your account already can. Your role still counts: assign_role needs Manage Roles, timeout_member needs Time Out Members, and a call your role does not allow fails with the reason. Discord's own bot API instead needs a bot added by a server manager.
Yes. list_direct_conversations shows your DMs, list_messages reads one, and list_mentions returns the Mentions tab of your Inbox. Discord's bot API cannot read either, because a bot has no access to your account. Reading does not clear your Inbox.
No. Cotlet works in a free Discord account. Nitro Basic is $2.99 and Nitro $9.99 a month on discord.com/nitro (6 Nov 2026) and adds perks such as larger uploads.
Only the door is different. Both expose the same 14 tools, inputs and answers, with one API key and one price. Agents use MCP; scripts and HTTP steps use REST.
No. Cotlet is independent and not affiliated with Discord Inc.
Free 7-day trial with 2,000 credits, no card needed.
May we use Google Analytics to see which pages help people? It sets cookies only if you accept. No ads, and we never sell data. Cookie policy