---
title: "Discourse MCP server for AI agents - actionlake"
description: "Give Claude 91 Discourse actions through one MCP server: topics, users, admin users, posts. Your agent never holds the credential. 100,000 calls a month free."
canonical: https://actionlake.com/connectors/discourse
updated: 2026-10-23
---

Connectors · Developer & infrastructure

# Discourse MCP server for AI agents.

actionlake is an MCP gateway: one remote MCP server that connects Claude and other MCP clients to Discourse and the rest of your systems. It gives your agent 91 Discourse actions (37 reads, 42 writes and 12 that wait for a confirmation) and holds the Discourse credential itself, so the agent never does. It paces Discourse's limits and records every call.

[Connect Discourse free](https://actionlake.com/console?start=sandbox) [See pricing](https://actionlake.com/pricing)

100,000 free calls a month. No card, no email, no password: press Start a free sandbox on the next screen and keep the key it shows you.

`claude mcp add --transport http actionlake https://connect.actionlake.com/mcp`

the first call

```
do {
  action: "discourse.admin_users.list",
  intent: "check which Discourse account is connected"
}
# List users · read · 1 upstream call
```

- 91 actions in one signed file
- 37 read look, never change
- 42 write create and update
- 12 wait for a yes destructive, confirmed first

Set up

## Connect Discourse in three steps.

1. 01
   ### Add actionlake to Claude.
   Run the command once in Claude Code; its consent page can create a free sandbox: 100,000 calls a month, no card. In the Claude app, add a custom connector with the URL below and paste your key on the consent page. Creating a new sandbox from the Claude app is not yet tested by us.
   `https://connect.actionlake.com/mcp`
2. 02
   ### Connect Discourse.
   Header credentials. No consent screen: your agent can connect it for you, but the key then passes through your chat. To keep it out of the model's context, paste it in the console instead. actionlake stores what you paste write-only, sealed under your tenant's key.
   - `api_key` Discourse API key (Admin > API > New API Key)
   - `api_username` Api-Username: the Discourse username the key acts as (for admin endpoints, an admin such as `system`)
   - `host` Where your Discourse lives: your host
   ```
   account { op: "connections.requirements", service: "discourse" }
   # free: exactly what to paste, and what is found for you
   ```
3. 03
   ### Make the first call. Check before a write.
   Ask in plain words; Claude picks the action. Before anything changes, `check` validates the call and prices it, for free.
   ```
   do    { action: "discourse.admin_users.list" }
   # list users · read · 1 upstream call
   check { action: "discourse.users.create", input: { … } }
   # free: inputs, permissions, cost and confirmations, nothing sent
   ```

Discourse at a glance

**Sign-in**

Header credentials. No consent screen: your agent can connect it for you, but the key then passes through your chat. To keep it out of the model's context, paste it in the console instead.

**You provide**

`api_key` `api_username`

**Setup fields**

`host`

**Limits we pace to**

60 calls a minute, per connection

**API covered**

Discourse API (OpenAPI 3.1, docs.discourse.org/openapi.json, version `latest`), at your Discourse instance's API base URL, which you enter when connecting

**Built from**

Discourse's documentation, read 23 October 2026[docs.discourse.org](https://docs.discourse.org/openapi.json) [meta.discourse.org](https://meta.discourse.org/t/discourse-rest-api-documentation/22706)

**Service file**

Version 1.0.0, signed (Ed25519)

**Cached reads**

37 of 37 reads, for up to 5 minutes; a write clears what it affects

**Shared entities**

4, so ask can line Discourse up with your other systems

**Data**

Processed and stored in Sydney, Australia. No US region yet

Capabilities

## What an AI agent can do in Discourse.

91 actions in 23 areas. Every one carries its effect, so a key can allow the reads and hold the rest.

- **37** read look, never change
- **42** write create and update
- **12** destructive wait for a confirmation

1. ### Topics
   12
   4 read · 7 write · 1 destructive
   Get the latest topics · Get a single topic · Update a topic · Remove a topic
2. ### Users
   12
   4 read · 7 write · 1 destructive
   Creates a user · Get a single user by username · Update a user · Send password reset email
3. ### Admin users
   11
   3 read · 3 write · 5 destructive
   List users · Delete a user · Merge a user · List users by flag
4. ### Posts
   7
   3 read · 3 write · 1 destructive
   List latest posts across topics · Creates a new topic, a new post, or a private message · Update a single post · delete a single post
5. ### Groups
   6
   3 read · 2 write · 1 destructive
   List groups · Create a group · Get a group · Update a group
6. ### Uploads
   6
   0 read · 5 write · 1 destructive
   Generates batches of presigned URLs for multipart parts · Completes a direct external upload · Complete multipart upload · Creates a multipart external upload
7. ### Categories
   5
   3 read · 2 write · 0 destructive
   Creates a category · Retrieves a list of categories · List topics · Show category
8. ### Badges
   4
   1 read · 2 write · 1 destructive
   Create badge · List badges · Update badge · Delete badge

**15 more areas · 28 actions**

- Tag groups **4**
- Backups **3**
- Group members **3**
- Invites **2**
- Notifications **2**
- Private messages **2**
- Site **2**
- Tags **2**
- User badges **2**
- Directory items **1**
- Events **1**
- Post actions **1**
- Search **1**
- Topic timers **1**
- User actions **1**

Top actions

## The Discourse API, shaped for agents.

The ids your agent types, what each does, and the one name it shares with other systems. 24 of Discourse's 25 action names are shared with at least one other connector, so an agent learns them once.

| Action | What it does | Effect | Same name in |
| --- | --- | --- | --- |
| `discourse.admin_users.list` List users | List users. | read | `identity.user.list` 474 connectors |
| `discourse.groups.list` List groups | List groups. | read | `identity.group.list` 262 connectors |
| `discourse.users.create` Creates a user | Creates a user. | write | `identity.user.create` 262 connectors |
| `discourse.groups.create` Create a group | Create a group. | write | `identity.group.create` 205 connectors |
| `discourse.admin_users.delete` Delete a user | Delete a user. | destructive | `identity.user.delete` 253 connectors |
| `discourse.tags.list` Get a list of tags | Get a list of tags. | read | `crm.tag.list` 65 connectors |
| `discourse.group_members.list` List group members | List group members. | read | `identity.group_member.list` 103 connectors |
| `discourse.group_members.add` Add group members | Add group members. | write | `identity.group_member.add` 72 connectors |
| `discourse.invites.create` Create an invite | Create an invite. | write | `identity.invitation.create` 41 connectors |
| `discourse.posts.list` List latest posts across topics | List latest posts across topics. | read | `service.forum_post.list` 2 connectors |
| `discourse.posts.create` Creates a new topic, a new post, or a private message | Creates a new topic, a new post, or a private message. | write | `service.forum_post.create` 2 connectors |
| `discourse.topics.list_latest` Get the latest topics | Get the latest topics. | read | `service.forum_topic.list` 2 connectors |

Try it

## Prompts to paste into Claude.

Each one names the Discourse actions it will call, so you know what it reads and what it changes before you send it.

1. Read read
   Who has access in Discourse? List every user and their role.
   calls `discourse.admin_users.list`
2. Write write
   Creates a user in Discourse. Show me exactly what you will send before you save it.
   calls `discourse.users.create`

Governance for Discourse

## Destructive actions wait for a yes.

12 Discourse actions are destructive. These are all of them:

- Delete a user `discourse.admin_users.delete`
- Delete a group `discourse.groups.delete`
- Remove group members `discourse.group_members.remove`
- Merge a user `discourse.admin_users.merge`
- delete a single post `discourse.posts.delete`
- Remove a topic `discourse.topics.delete`
- Suspend a user `discourse.admin_users.suspend`
- Change password `discourse.users.reset_password`
- Anonymize a user `discourse.admin_users.anonymize`
- Deactivate a user `discourse.admin_users.deactivate`
- Delete badge `discourse.badges.delete`
- Abort multipart upload `discourse.uploads.abort_multipart`

A destructive action runs only with `confirm: true`. Under the `human` policy the agent cannot confirm for itself: the run stops until a named person approves, in the console or from a signed link in an email. The cap on a key is refused before the call is sent, never after.

do discourse.admin_users.delete confirm_policy: **human**

Delete a user?

**intent:** the user asked me to delete a user

run suspended · waiting for a named person · key _discourse-agent_ cannot confirm itself

In the console, or from an emailed signed link.

a key for this connector

```
account {
  op: "keys.create", name: "discourse-agent",
  allowed_actions: ["discourse.*"], cap_calls: 2000,
  confirm_policy: "human_for_writes",
  approval_rules: [
    { match: "discourse.admin_users.delete", approver: "lead@example.com" },
    { match: "discourse.groups.delete", approver: "lead@example.com" },
    { match: "discourse.group_members.remove", approver: "lead@example.com" }
  ]
}
```

Illustrative. Scoped to Discourse only, capped at 2,000 upstream calls, every write confirmed, and the destructive ones approved by a named person.

Cost

## What Discourse costs on actionlake.

Every Discourse action is one upstream call, the only thing actionlake bills. Searching, `check`, `cost`, `account` and any call Discourse refused with 401, 403, 429 or a 5xx are free. Paid plans start at US$49 a month for 250,000 calls, with overage from US$0.30 down to US$0.18 per 1,000.

- 1 upstream call per action all 91 Discourse actions
- 91 actions page each page of a long list is one call
- 37 reads can be cached a cache hit costs nothing
- 100,000 calls a month, free paid plans from US$49 a month for 250,000

[See pricing](https://actionlake.com/pricing)

Action index

## Every Discourse action.

91 actions by area: the id your agent calls, what it does, and its effect.

**Topics 12**

- `discourse.topics.bookmark` Bookmark topic write
- `discourse.topics.delete` Remove a topic destructive
- `discourse.topics.get` Get a single topic read
- `discourse.topics.invite_group` Invite group to topic write
- `discourse.topics.invite_user` Invite to topic write
- `discourse.topics.list_latest` Get the latest topics read
- `discourse.topics.list_posts` Get specific posts from a topic read
- `discourse.topics.list_top` Get the top topics filtered by period read
- `discourse.topics.set_notification_level` Set notification level write
- `discourse.topics.update` Update a topic write
- `discourse.topics.update_status` Update the status of a topic write
- `discourse.topics.update_timestamp` Update topic timestamp write

**Users 12**

- `discourse.users.create` Creates a user write
- `discourse.users.get` Get a single user by username read
- `discourse.users.get_by_external_id` Get a user by external_id read
- `discourse.users.get_by_provider_external_id` Get a user by identity provider external ID read
- `discourse.users.get_emails` Get email addresses belonging to a user read
- `discourse.users.refresh_gravatar` Refresh gravatar write
- `discourse.users.reset_password` Change password destructive
- `discourse.users.send_password_reset` Send password reset email write
- `discourse.users.update` Update a user write
- `discourse.users.update_avatar` Update avatar write
- `discourse.users.update_email` Update email write
- `discourse.users.update_username` Update username write

**Admin users 11**

- `discourse.admin_users.activate` Activate a user write
- `discourse.admin_users.anonymize` Anonymize a user destructive
- `discourse.admin_users.deactivate` Deactivate a user destructive
- `discourse.admin_users.delete` Delete a user destructive
- `discourse.admin_users.get` Get a user by id read
- `discourse.admin_users.list` List users read
- `discourse.admin_users.list_by_flag` List users by flag read
- `discourse.admin_users.log_out` Log a user out write
- `discourse.admin_users.merge` Merge a user destructive
- `discourse.admin_users.silence` Silence a user write
- `discourse.admin_users.suspend` Suspend a user destructive

**Posts 7**

- `discourse.posts.create` Creates a new topic, a new post, or a private message write
- `discourse.posts.delete` delete a single post destructive
- `discourse.posts.get` Retrieve a single post read
- `discourse.posts.list` List latest posts across topics read
- `discourse.posts.list_replies` List replies to a post read
- `discourse.posts.lock` Lock a post from being edited write
- `discourse.posts.update` Update a single post write

**Groups 6**

- `discourse.groups.create` Create a group write
- `discourse.groups.delete` Delete a group destructive
- `discourse.groups.get` Get a group read
- `discourse.groups.get_by_id` Get a group by id read
- `discourse.groups.list` List groups read
- `discourse.groups.update` Update a group write

**Uploads 6**

- `discourse.uploads.abort_multipart` Abort multipart upload destructive
- `discourse.uploads.batch_presign_multipart_parts` Generates batches of presigned URLs for multipart parts write
- `discourse.uploads.complete_external` Completes a direct external upload write
- `discourse.uploads.complete_multipart` Complete multipart upload write
- `discourse.uploads.create_multipart` Creates a multipart external upload write
- `discourse.uploads.generate_presigned_put` Initiates a direct external upload write

**Categories 5**

- `discourse.categories.create` Creates a category write
- `discourse.categories.get` Show category read
- `discourse.categories.list` Retrieves a list of categories read
- `discourse.categories.list_topics` List topics read
- `discourse.categories.update` Updates a category write

**Badges 4**

- `discourse.badges.create` Create badge write
- `discourse.badges.delete` Delete badge destructive
- `discourse.badges.list` List badges read
- `discourse.badges.update` Update badge write

**Tag groups 4**

- `discourse.tag_groups.create` Creates a tag group write
- `discourse.tag_groups.get` Get a single tag group read
- `discourse.tag_groups.list` Get a list of tag groups read
- `discourse.tag_groups.update` Update tag group write

**Backups 3**

- `discourse.backups.create` Create backup write
- `discourse.backups.list` List backups read
- `discourse.backups.send_download_email` Send download backup email write

**Group members 3**

- `discourse.group_members.add` Add group members write
- `discourse.group_members.list` List group members read
- `discourse.group_members.remove` Remove group members destructive

**Invites 2**

- `discourse.invites.create` Create an invite write
- `discourse.invites.create_multiple` Create multiple invites write

**Notifications 2**

- `discourse.notifications.list` Get the notifications that belong to the current user read
- `discourse.notifications.mark_read` Mark notifications as read write

**Private messages 2**

- `discourse.private_messages.list` Get a list of private messages for a user read
- `discourse.private_messages.list_sent` Get a list of private messages sent for a user read

**Site 2**

- `discourse.site.get` Get site info read
- `discourse.site.get_basic_info` Get site basic info read

**Tags 2**

- `discourse.tags.list` Get a list of tags read
- `discourse.tags.list_topics` Get a specific tag read

**User badges 2**

- `discourse.user_badges.create` Grant a badge to a user write
- `discourse.user_badges.list` List badges for a user read

**Directory items 1**

- `discourse.directory_items.list` Get a public list of users read

**Events 1**

- `discourse.events.list` List calendar events read

**Post actions 1**

- `discourse.post_actions.create` Like a post and other actions write

**Search 1**

- `discourse.search.query` Search for a term read

**Topic timers 1**

- `discourse.topic_timers.create` Create topic timer write

**User actions 1**

- `discourse.user_actions.list` Get a list of user actions read

Questions

## The Discourse MCP server, answered.

**Is there a Discourse MCP server for Claude?**

Yes. actionlake is an MCP gateway: a remote MCP server that gives Claude, or another MCP client, 91 Discourse actions across topics, users, admin users and posts, through the same eight tools it uses for every other connector. actionlake is independent; it is not made or endorsed by Discourse.

**What do I need to connect Discourse?**

Discourse API key (Admin > API > New API Key) and Api-Username: the Discourse username the key acts as (for admin endpoints, an admin such as `system`). Plus your host. The free call account { op: "connections.requirements", service: "discourse" } lists exactly what to paste.

**Can an AI agent delete or change things in Discourse?**

Only if its key allows it, and only with an explicit confirmation. 12 Discourse actions are destructive, including delete a user, delete a group and remove group members. Each runs only with confirm: true. Under the human confirm policy, or an approval rule on the key, the run waits until a named person approves it.

**Will an AI agent use up my Discourse API limit?**

actionlake paces every call to the limits in the Discourse service file: 60 calls a minute per connection. Repeated reads are answered from cache (37 Discourse actions can be), which never reaches Discourse.

**What does a Discourse action cost?**

One upstream call, the only unit actionlake bills. A list that pages bills one call per page (91 Discourse actions page). Cache hits, searches, dry runs and calls Discourse refused with 401, 403, 429 or a 5xx are free. The Free plan includes 100,000 calls a month with no card. Paid plans start at US$49 a month for 250,000 calls, with overage from US$0.30 down to US$0.18 per 1,000.

**Which Discourse API does it cover?**

The Discourse API (OpenAPI 3.1, docs.discourse.org/openapi.json, version `latest`) at your Discourse instance's API base URL, which you enter when connecting. It is built from Discourse's documentation as read on 23 October 2026. 91 actions in 23 areas, each one in the signed service file (version 1.0.0).

**Does actionlake keep my Discourse data, and where?**

actionlake processes and stores data in Sydney, Australia; there is no US region yet. Reads may be cached for up to 5 minutes, and a write clears the reads it affects. Each run's request and response is kept, sealed, for your plan's trace window: 1 day on Free, 3 days on Starter, 7 days on Pro, 14 days on Team, 30 days on Business and 30 days on Enterprise. Your Discourse credential is sealed under your tenant's key, never logged and never returned. Your traffic is not used to train models.

**Which AI clients can use it?**

Claude Code, tested by us end to end, and the Claude app as a custom connector, tested by us with an existing key. Other MCP clients that support remote servers over Streamable HTTP (MCP revisions 2025-06-18 and 2025-11-25) and OAuth dynamic client registration, or a bearer header, should connect the same way; we have not tested them. Or plain REST, under the same action names.

## More connectors like Discourse

Shares the most action names with

- [Files.com 13](https://actionlake.com/connectors/files-com)
- [Sourcegraph 10](https://actionlake.com/connectors/sourcegraph)
- [Harbor 10](https://actionlake.com/connectors/harbor)
- [Kintone 9](https://actionlake.com/connectors/kintone)
- [Spacelift 8](https://actionlake.com/connectors/spacelift)
- [env zero (env0) 7](https://actionlake.com/connectors/env-zero-env0)

Joins with, on shared entities

- [Slack 3](https://actionlake.com/connectors/slack)
- [Odoo 3](https://actionlake.com/connectors/odoo)
- [NICE CXone Mpower 3](https://actionlake.com/connectors/nice-cxone-mpower)
- [ActiveCampaign 3](https://actionlake.com/connectors/activecampaign)
- [Zoho SalesIQ 3](https://actionlake.com/connectors/zoho-salesiq)
- [Lark Suite 3](https://actionlake.com/connectors/lark-suite)

Browse

- [All Developer & infrastructure connectors](https://actionlake.com/connectors/category/developer-and-infrastructure)
- [All connectors](https://actionlake.com/connectors)
- [How actionlake compares](https://actionlake.com/compare)

actionlake is independent. It is not made or endorsed by Discourse; the name is the vendor's own. Counts are from the Discourse service file, version 1.0.0.

## Give your agent Discourse today.

[Connect Discourse free](https://actionlake.com/console?start=sandbox) [See pricing](https://actionlake.com/pricing)

Start free - 100,000 calls/month, no card. No signup. Hard caps on every key. Cached answers are free.

---

Source: https://actionlake.com/connectors/discourse
More: https://actionlake.com/llms.txt
