|
1 | 1 | # Changelog |
2 | 2 |
|
3 | | -## Unreleased |
| 3 | +## [0.3.0](https://github.com/discourse/discourse-mcp/compare/v0.2.9...v0.3.0) (2026-08-21) |
4 | 4 |
|
5 | 5 | ### Features |
6 | 6 |
|
|
23 | 23 | - Retain random session IDs, reject missing/unknown sessions and second initialization, bound pre-read request bodies to 4 MiB, and close active transports during shutdown |
24 | 24 | - After DELETE, expose a clear restart-required MCP/health response instead of leaving a closed transport behind a healthy endpoint |
25 | 25 |
|
26 | | - |
27 | 26 | * Add opt-in, admin-sensitive `webhooks` and `site_settings` toolsets |
28 | 27 | - Add secret-safe webhook inspection, bounded/redacted delivery diagnostics, guarded lifecycle operations, ping, and exact single-event redelivery with fresh destination preconditions and no automatic mutation retries |
29 | 28 | - Harden site-setting reads against upstream-secret and credential-like values, support directly listing only currently overridden settings, and add one-setting-at-a-time updates with live metadata validation, expected-value conflict checks, no-retry writes, and exact verification reads |
|
52 | 51 | - Preserve existing filtered calls while adding top periods and defining hot exactly as Discourse's daily top score |
53 | 52 | - Return uniform rich topic metadata with null-safe fields and pagination totals/continuation only when authoritative |
54 | 53 | - Keep `search` default-on and both search tools available in read-only mode |
| 54 | + |
55 | 55 | * Add the opt-in `moderation` toolset for Discourse's review queue |
56 | 56 | - Inspect queue count, reviewables, high-priority reviewable-topic aggregation, full bounded context, score explanations, and dynamic available actions |
57 | 57 | - Distinguish pending reviewable totals from individual score/flag records and mark the topic aggregation as non-exhaustive |
|
64 | 64 | - Show a short browser activation code and poll for approval automatically |
65 | 65 | - Use RSA-OAEP encryption and validate the response nonce |
66 | 66 | - Fall back to the legacy copy-and-paste flow on older Discourse sites |
| 67 | + |
67 | 68 | * Add typed built-in toolsets and `--toolsets <name[,name...]>` selection |
68 | 69 | - Filter built-in tools by operator-facing domains while preserving canonical registration order |
69 | 70 | - Keep site selection, write enablement, and call-time authorization as independent safety controls |
70 | 71 | - Support comma-separated CLI values and string or array profile configuration |
71 | 72 | - Treat omitted selection as the non-opt-in default catalog and add `--toolsets all` for every domain |
| 73 | + |
72 | 74 | * Add the opt-in `groups` toolset for complete group lifecycle management |
73 | 75 | - List and inspect groups, members, owners, and pending membership requests with upstream visibility and pagination semantics |
74 | 76 | - Create, fully configure, update, and delete custom groups, including notification defaults, associations, email settings, custom fields, and plugin extensions |
75 | 77 | - Use separate, unambiguous mutation tools for usernames, numeric user IDs, existing-account emails, and unknown-address invitations instead of mirroring Discourse's selector precedence |
76 | 78 | - Bulk-add and remove members, promote and demote owners, approve or deny requests, and support request/join/leave self-service flows |
77 | 79 | - Preserve write gating and Discourse's staff, owner, Guardian, automatic-group, invitation, and membership-setting restrictions |
| 80 | + |
78 | 81 | * Add the opt-in `workflows` toolset for the experimental `discourse-workflows` plugin |
79 | 82 | - Discover workflows, node types, templates, credentials, executions, versions, and related forum entities |
80 | 83 | - Create and replace complete graphs with paired graph safety and a flat connection adapter |
81 | 84 | - Apply mechanical MCP-side graph operations after a fresh GET, then publish, unpublish, discard, delete, or restore drafts |
82 | 85 | - Evaluate expressions, manage pin-data, step-run or manually run the current draft, and poll asynchronous executions |
83 | | -* Add typed AI-agent subagent delegation support |
| 86 | + |
| 87 | +* Add opt-in Discourse AI administration toolsets |
| 88 | + - Add typed AI-agent discovery, lifecycle management, bot-user creation, and portable import/export through `ai_agents` |
| 89 | + - Add scripted custom-tool discovery, lifecycle, focused authoring guidance, execution testing, and import/export through `ai_custom_tools` |
| 90 | + - Add exact-area, non-secret AI feature discovery and updates through `ai_features` |
| 91 | + - Keep all three domains default-off, require admin authority, and retain write gating for mutations and custom-tool execution |
84 | 92 | - Accept ordered `subagent_ids` allowlists on agent creation and partial updates, including negative system-agent IDs |
85 | 93 | - Match Discourse's limit of 20 unique subagents and expose `subagent_count` in slim agent listings |
| 94 | + |
86 | 95 | * Add the default `private_messages` toolset for authenticated PM lifecycle operations |
87 | 96 | - List personal and group inbox/archive/unread/new mailboxes, plus personal sent messages, with uncached identity-safe reads |
88 | 97 | - Read PM-specific metadata, direct allowed-user/group records, reply relationships, and bounded post bodies while rejecting public topics |
89 | 98 | - Create PMs for typed user, group, and email recipients and safely reply only after a PM-archetype preflight |
90 | 99 | - Invite users, groups, or email addresses with correct group notification serialization and intentionally conservative email outcome reporting |
91 | 100 | - Preserve Discourse authorization, write gating, API-key identity rules, recipient limits, and Guardian checks |
92 | 101 |
|
| 102 | +### Security |
| 103 | + |
| 104 | +* Stop logging HTTP response bodies, including at debug level, because administration APIs may return secrets or other sensitive content |
| 105 | + |
| 106 | +### Bug Fixes |
| 107 | + |
| 108 | +* Treat successful empty `204 No Content` responses as valid results for delete operations |
| 109 | + |
93 | 110 | ### Maintenance |
94 | 111 |
|
95 | 112 | * Pin `@modelcontextprotocol/sdk` exactly to reviewed version 1.30.0 and harden dual-lockfile packaging |
96 | 113 | - Keep pnpm authoritative while regenerating/tracking `package-lock.json`; CI now verifies frozen pnpm and clean npm installs, typecheck/build/tests, production audits, package contents, and CLI metadata smoke tests |
97 | | - - Preserve the modern remote-tool callback/content compatibility fixes and reject the vulnerable 1.17.x downgrade |
98 | | - |
99 | | -* Close out overlapping open PR proposals on the `features` branch |
100 | | - - #52, #48, and #39 are superseded after their directory, CLI metadata, and profile-path behavior lands through the current architecture |
101 | | - - #17 is superseded by bounded rich `discourse_search_posts`; topic search remains unchanged rather than gaining unbounded bare post IDs |
102 | | - - #49's lockfile/build concern is adopted while its vulnerable SDK downgrade is rejected; #41 and #43 are obsoleted by the reviewed 1.30.0 pin and transport compatibility tests; #51 remains this branch |
| 114 | + - Upgrade Zod, TypeScript, ESLint, and supporting type packages while preserving the modern remote-tool callback/content compatibility fixes and rejecting the vulnerable SDK 1.17.x downgrade |
103 | 115 |
|
104 | 116 | * Simplify built-in tool registration with typed `defineTool()` definitions and one ordered catalog |
105 | 117 | - Preserve existing MCP names, metadata, schemas, handlers, registration order, and availability |
|
332 | 344 | #### Features |
333 | 345 |
|
334 | 346 | * add optional HTTP transport support via --transport flag |
335 | | -* implement Streamable HTTP transport (initially stateless; superseded in Unreleased by the one-stateful-session security contract) as alternative to stdio |
| 347 | +* implement Streamable HTTP transport (initially stateless; superseded in 0.3.0 by the one-stateful-session security contract) as alternative to stdio |
336 | 348 | * add --port flag for configuring HTTP server port (default: 3000) |
337 | 349 | * include health check endpoint at /health for HTTP mode |
338 | 350 |
|
|
0 commit comments