NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Go modules · #543 by repository stars
Last release 3 days ago
05 Oct 2026
Ships on a steady schedule
a new release about every 8 days
Nearly every release is documented
notes for 58 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
6 months old
210 releases · first in 2026
One column per month.
Nothing published for this version
Raw DingTalk OpenAPI access lands as a new dws api surface for both api.dingtalk.com and oapi.dingtalk.com, backed by app-level token caching and guar
Raw DingTalk OpenAPI access lands as a new dws api surface for both api.dingtalk.com and oapi.dingtalk.com, backed by app-level token caching and guarded host allowlists. PAT enters the host-owned A-core loop: agent hosts can own authorization UI through DINGTALK_DWS_AGENTCODE, parse single-line stderr JSON, call dws pat chmod, and replay the original command. Chat helper regressions are fixed, skill references are brought back in line with shipped commands, and the v1.0.17 Mail release notes are backfilled into README / CHANGELOG.
4; Discovery, cache, and protocol negotiation failures now use exit code 6. Downstream scripts that previously treated 4 as Discovery must update their handling.dws api raw DingTalk OpenAPI command (#184) — direct DingTalk OpenAPI calls without writing an MCP wrapper first. Supports GET / POST / PUT / PATCH / DELETE, JSON --params / --data, stdin input, dry-run previews, --jq, field selection, --page-all, --page-limit, --page-delay, and --base-url.api.dingtalk.com requests use the x-acs-dingtalk-access-token header; oapi.dingtalk.com requests use the legacy access_token query parameter. The raw API client validates the target host before attaching credentials.DINGTALK_DWS_AGENTCODE is set, PAT hits return exit=4 plus single-line stderr JSON; the host renders authorization UI, calls dws pat chmod <scope>..., and replays the original command.dws pat chmod authorization entry point (#142) — grants scopes with --agentCode, --grant-type, and session fallback support; DINGTALK_DWS_AGENTCODE can supply the agent code when the flag is omitted.dws pat browser-policy --enabled <true|false> [--agentCode <id>] controls whether the CLI may open a browser, independently from --format output mode.code, errorCode, and error_code, including PAT_NO_PERMISSION, risk-tier PAT errors, PAT_SCOPE_AUTH_REQUIRED, and AGENT_CODE_NOT_EXISTS.data.hostControl and data.openBrowser, keeping host-facing JSON shapes aligned.claw-type: openClaw; DINGTALK_AGENT, DWS_CHANNEL, and host-owned PAT detection are kept as independent signals.flowId device-code fallback remain supported, with guarded debug output and envelope priority.dws chat message send --group ... again accepts and forwards --at-users, --at-all, and --at-mobiles; those flags are rejected outside group-chat mode so single-chat sends cannot silently drop @-mention intent.dws chat group members list --id <openConversationId> is reachable after the helper/dynamic merge path changed. cmdutil.MergeHardcodedLeaves now honors higher-priority helper groups when a dynamic envelope contributes a leaf at the same path.simple.md now uses shipped OA command names (list-pending, list-initiated), removes a non-existent devdoc search-error command, and marks workbench.md as Draft because workbench commands are not available in the runtime.dws pat chmod now returns an explicit error instead of treating {"Content": null} as success.DWS_SESSION_ID / REWIND_SESSION_ID values are no longer logged when the two env vars disagree.members list, helper-vs-envelope shape mismatch, and merge-priority behavior. (#180)Nothing published for this version
New Mail product surface (mailbox list, KQL message search, message get, send) brings runtime command count to 163 across 14 products. Plugin command-
New Mail product surface (mailbox list, KQL message search, message get, send) brings runtime command count to 163 across 14 products. Plugin command-tree visibility hardening: stdio plugins shipping CLI overlays no longer wait on subprocess discovery to surface their commands, and overlay-registered plugin products are no longer hidden by edition VisibleProducts whitelists. Chat docs clarify that --title is required on dws chat message send.
mail product (#167) — new top-level service for DingTalk Mail. Four leaf commands across two subgroups:
dws mail mailbox list — list mailbox addresses available to the current user (list_user_mailboxes)dws mail message search — KQL search across folders / sender / date / attachments / read-state (search_emails); supports --cursor paginationdws mail message get — fetch full message body + headers + attachments by message ID (get_email_by_message_id)dws mail message send — send email to one or more recipients (send_email)skills/references/products/mail.md registered in skills/SKILL.md master index and intent decision treeoverlay.json declares toolOverrides, command trees are built from manifest metadata synchronously at startup, no subprocess Initialize / tools/list handshake required. Previously, slow or failing subprocesses left plugin commands invisible in dws --help. Background discovery still runs to refresh the warm cache for richer flag types on subsequent startups.hideNonDirectRuntimeCommands / visibleMCPRootCommands / visibleUtilityRootCommands (#179) — refactored to share a single resolveVisibleProducts() helper that unions the edition's VisibleProducts hook with DirectRuntimeProductIDs(), so plugins registered via AppendDynamicServer stay visible in dws --help even when an edition installs a static product whitelist. Previously the hook fully replaced the dynamic registry, silently hiding plugin commands.dws chat message send documentation clarifies --title is required (#174) — the helper command short text and the chat skill reference now state explicitly that --title is mandatory for both group and single-chat sends, matching the runtime validation.buildStdioCommands refactored to share helpers with the overlay-first path (#179) — overlay parsing (resolveStdioOverlay) and tools→DetailTool conversion (toolsToDetails) extracted as package-level helpers; the legacy discovery-first stdio path now delegates to them, eliminating duplicated overlay JSON / cache-snapshot logic.refreshStdioToolsCache now skips SaveTools entirely when discovery returns an empty tool list (transient failure, subprocess not ready, RPC timeout), so a single bad refresh cannot overwrite a previously-good cache and degrade flag enrichment on the next startup.internal/app/plugin_stdio_overlay_test.go and internal/app/visibility_test.go cover overlay-first registration without discovery, warm-cache flag enrichment from InputSchema, fallback when overlays lack toolOverrides, the cache-poisoning guard, and integration cases for plugin visibility under restrictive VisibleProducts whitelists.Discovery service abstraction with schema v3 extensions, open-edition helper-subtree restoration, and a defensive device-flow login reset.
Discovery service abstraction with schema v3 extensions, open-edition helper-subtree restoration, and a defensive device-flow login reset.
internal/discovery service abstraction (#156) — encapsulates market registry fetch, MCP runtime negotiation (initialize → tools/list → detail merge), and multi-level cache fallback. EnvironmentLoader now does cache-first startup, with degraded-mode reasons (unauthenticated / market_unreachable / runtime_all_failed) and UpdatedAt-based selective re-discovery.Example on --help, flag Default / RuntimeDefault (with $currentUserId / $now etc.), BodyWrapper, MutuallyExclusive / RequireOneOf flag groups, OmitWhen, explicit Type override, and detail-schema default propagation.dws chat message send destination-flag routing (#170) — open edition gains a hardcoded helper that dispatches by --group (→ send_message_as_user) vs --user / --open-dingtalk-id (→ send_direct_message_as_user), mirroring the closed-source overlay so single-chat sends finally work end-to-end.pickCommands → cmdutil.MergeHardcodedLeaves (#169) — when a top-level product name collides between the dynamic overlay and a helper subtree, helper-only siblings are grafted into the dynamic tree instead of dropped. Restores dws chat message send-by-bot / recall-by-bot / send-by-webhook and dws chat group members add-bot, which had silently vanished from the open edition.OverridePriority / MergeHardcodedLeaves promoted into pkg/cmdutil (#170) — single source of truth for the merge layer; hardcoded leaves can opt into overriding the dynamic envelope via a strictly higher priority.--device login now clears stale credential state and re-fetches clientID from the MCP server, regardless of what previous login methods (OAuth scan, PAT) left in app.json. Fixes the case where a prior OAuth login made --device fall back to direct mode and demand clientSecret.Compat layer gains subcommand merging under shared parents so multiple server entries can contribute into the same dws subtree without producing dupli
Compat layer gains subcommand merging under shared parents so multiple server entries can contribute into the same dws <parent> <branch> subtree without producing duplicate --help rows. Ships with a fresh auto-generated command index doc, a README sync to 159 commands across 13 products, and a wide-ranging flag-naming cleanup that standardises CLI flags across chat, calendar, drive, minutes, contact, and devdoc commands.
internal/compat subcommand merging via attachOrMerge — when two or more server entries attach to the same parent (e.g. parent: "chat") and their cli.command collides with an existing subcommand in the parent's tree, the new subcommand's children are merged recursively into the existing one instead of creating a duplicate sibling. Leaf-name collisions resolve first-wins. Fixes the "double group / message rows in dws chat --help" symptom when bot capabilities are distributed across chat.group.members and chat.message.docs/command-index.md — a single, English, auto-generated listing of every runtime command the dws CLI exposes under the pre environment (159 total). Each entry carries a description and a "when to use" column aimed at AI agents. Replaces the earlier command-index.pre.* / command-index.full.* ad-hoc snapshots.README.md + README_zh.md) fully synced to the shipped command surface:
Chat: 20 → 23 (bot capabilities merged in; new list-all / list-focused / list-unread-conversations / conversation-info exposed)Calendar: 13 → 14AI Tables: 37 → 41 (chart / dashboard public-share config rows)Doc: 16 → 21 (comment subtree + file create)Minutes: 22 → 19 (single-tool record, list query, list-by-keyword-range pruned)Drive row (6 commands) — promoted out of "Coming soon"Workbench row and standalone Bot row removeddoc, minutes, drive in addition to contact, calendar, todomail, conference, aiapp, live, wikidocs/command-index.mddws contact user search / dws contact dept search / dws devdoc article search now take --query (previously --keyword)dws chat message list / dws chat message search / dws chat message list-mentions / dws chat conversation-info / dws chat message send now take --group for the target conversation (previously --id) and --open-dingtalk-id (previously --open-id)dws chat message list-by-sender now takes --sender-user-id / --sender-open-dingtalk-id (previously --user / --open-id)dws chat message list-topic-replies now takes --group / --topic-id / --limit / --time (previously --id / --topic / --size / --start)dws chat search-common now takes --match-mode (previously --mode)dws drive list now takes --max / --thumbnail (previously --max-results / --with-thumbnail)dws calendar event suggest now takes --users / --duration / --timezone (previously --attendee-user-ids / --duration-minutes / --time-zone)dws minutes list mine / dws minutes list shared now take --max (previously --max-results) and gain --query / --start / --enddws minutes list all no longer exposes the legacy --__scope__ internal aliasdws calendar event create / update gain --attendees, --open-dingtalk-ids, --timezone; dws chat message send gains file-message flags (--dentry-id, --file-name, --file-size, --file-type, --media-id, --msg-type, --space-id) plus --open-dingtalk-id / --user; dws chat message list gains --open-dingtalk-id / --user; dws aitable table delete gains --reason; dws calendar participant add gains --optional; dws todo task create gains --recurrence.internal/compat/dynamic_commands_test.go:
TestBuildDynamicCommands_ParentMergeSameName — two servers with identical command + parent collapse into a single merged subcommandTestBuildDynamicCommands_ParentMergeRecursive — recursive merge through nested groups (e.g. chat.group.members)TestBuildDynamicCommands_ParentMergeLeafCollision — identical leaf paths resolve first-wins without producing duplicatesDocs-only re-tag of v1.0.13. The single commit (#153) backfills the v1.0.13 release notes after the binary was already published; no functional or CLI
Docs-only re-tag of v1.0.13. The single commit (#153) backfills the v1.0.13 release notes after the binary was already published; no functional or CLI surface change.
IM / Messaging capability expansion: the chat (aka im) product surface grows from "group + bot messaging" into a full conversational layer — user-iden
IM / Messaging capability expansion: the chat (aka im) product surface grows from "group + bot messaging" into a full conversational layer — user-identity messaging, message reading & search, personal messages, topic replies, mentions, focused contacts, unread/top/common conversations, org-wide group creation, and first-class bot lifecycle.
dws im alias — dws im is now registered as an alias of dws chat for intent claritychat message send) — send group or 1-on-1 messages as the current user
--group <openConversationId> / --user <userId> / --open-dingtalk-id <openDingTalkId>--text (or positional arg), optional --title--at-all to @everyone, --at-users for per-member @mentions--media-id (obtained from dt_media_upload)chat message send-personal) — sensitive personal-channel send (⚠️ destructive/dangerous op, requires confirmation)chat message list — pull group / 1-on-1 conversation messageschat message list-all — pull all conversations for the current user in a time rangechat message list-topic-replies — pull group topic reply threadschat message list-by-sender — messages by a specific senderchat message list-mentions — messages where the current user was @-mentionedchat message list-focused — messages from focused / starred contactschat message list-unread-conversations — unread conversation listchat message search — keyword search across conversationschat message info — conversation metadatachat list-top-conversations — pinned conversation listchat group create-org — create an organization-wide groupchat search-common — search groups shared with a nickname list (--nicks, --match-mode AND|OR, cursor-based pagination)chat bot create — create an enterprise botchat bot search-groups — search the groups a bot is present inchat skill reference (skills/references/products/chat.md, #148) restructured into three sub-groups — group (9) / message (15) / bot (3) — with refreshed intent-routing table, workflow examples, and context-passing rules aligned with dws-service-endpoints.json (16 new group-chat tool overrides + 2 new bot tool overrides)Chat row: 10 → 20 commands; subcommand tags expanded to message group search list-top-conversationsBot row: 6 → 7 commands; subcommand tags expanded with create search-groupsProduct-surface expansion: first-class doc (DingTalk Docs) and minutes (AI Minutes) skill references, refreshed aitable guide aligned with the shipped
Product-surface expansion: first-class doc (DingTalk Docs) and minutes (AI Minutes) skill references, refreshed aitable guide aligned with the shipped binary (including dashboard / chart / export), and a README sync that brings the full command catalog to 141 commands across 14 products.
doc skill reference (skills/references/products/doc.md) — 16-command coverage of DingTalk Docs:
search, list, info, readcreate, update, folder createupload, downloadquery, insert, update, deletecomment list, create, replydoc_id extraction rules and nodeId dual-format notesminutes skill reference (skills/references/products/minutes.md) — coverage of AI Minutes:
doc and minutes钉钉文档/云文档/知识库/块级编辑/文档评论 → doc; 听记/AI听记/会议纪要/转写/摘要/思维导图/发言人/热词 → minutesdoc delete, doc block deleteaitable description completed with the 附件 (attachment) groupaitable skill enhancements:
field create single-field mode (--name / --type / --config) with examplesbase get URL → baseId quick-tip--filters 筛选语法排错与使用规范" chapterdocchart share get vs dashboard share get error semantics) and two-stage export data polling (scope=all/table/view parameter constraints)doc (16 commands), minutes (22 commands — adds hot-word, mind-graph, replace-text, speaker, upload subgroups)aitable expanded from 20 → 37 commands; surfaces chart, dashboard, export, import, view subgroupsdoc and minutesaitable record query docs rename --keyword → --query to match the shipped binaryaitable record query docs clarify --sort direction semantics (avoids misuse of order)aitable base list guidance strengthened — "only for recent browsing; use base search for lookups"; intent decision prioritizes base search for base discoveryPlugin subsystem hardening: faster cold startup, cleaner lifecycle, stricter isolation, and polished UX for PAT / i18n / error routing.
Plugin subsystem hardening: faster cold startup, cleaner lifecycle, stricter isolation, and polished UX for PAT / i18n / error routing.
feat: supports claw-like products — overlay path for Claw-style embedded editionsfeat(plugin): inject user identity (UserID, CorpID) into stdio plugin subprocessesfeat(auth): improve login UX for terminal auth denial cases — clearer messaging + retry affordancefeat: PAT scope error visualization and auto-retry with authorization polling (#113)
--format jsonperf(plugin): serve plugin MCP tool list from disk cache on startup — hot path skips Initialize+ListTools when snapshot existsperf(plugin): parallelize all plugin discovery and tighten cold timeouts — HTTP cold budget 4s → 700ms (auth) / 500ms (plain); stdio and HTTP fan out concurrentlyperf(plugin): share cache.Store across discovery — single *cache.Store above the fan-out instead of per-goroutine instancesrefactor(plugin): remove default/managed plugin privileged mechanism (#124) — third-party plugins install on an equal footing via dws plugin installrefactor(plugin): purge removed plugin settings instead of merely disabling — RemovePlugin now deletes EnabledPlugins and PluginConfigs entriesfix(transport): cap plugin MCP startup at ~4s when endpoints are unreachable (#119) — eliminates the 10s dws --help stall caused by compounding transport timeoutsfix(plugin): stop stdio child processes on exit and before removal — no more orphaned plugin subprocessesfix(pat): avoid shared PAT command state in root registration (#129)fix: -f json 模式下错误 JSON 从 stdout 改为输出到 stderr (#133) — restores CI stderr-based failure assertionsfix(cli): localize plugin/help command strings via i18n (#118, #134) — zh locale now shows consistent Chinese --help; wraps plugin module, help command, and OAuth client-id/secret flag descriptionschore: remove workspace and bundled artifacts (#127) — clean local-only repository leftoversNothing published for this version
Nothing published for this version
Plugin system launch + execution-pipeline overhaul. This is the largest release since 1.0.0: third-party MCP servers become first-class commands, the
Plugin system launch + execution-pipeline overhaul. This is the largest release since 1.0.0: third-party MCP servers become first-class commands, the command pipeline grows to five stages, and the edition overlay gains the hooks needed for embedded hosts.
plugin command family: install, list, info, enable, disable, remove, create, dev, config set/get/list/unsetDWS_PLUGIN_ROOT / DWS_PLUGIN_DATA variable expansiondws hello greet --name Peter)registerHTTPServerdws plugin create scaffold (plugin.json, SKILL.md, hooks.json); dws plugin dev source-dir registration without copySyncSkills — copies plugin skills to agent directories on startupplugin.json for third-party MCP servers (e.g. Alibaba Cloud Bailian) independent from DingTalk OAuthdws plugin config ...): values persisted to ~/.dws/settings.json, auto-injected as env vars; ${KEY} in plugin.json resolves without manual exportbuild field compiles stdio servers to native binaries at install timeauth, plugin, cache, …) and plugin-vs-plugin duplicate detectionsync.WaitGroup) — startup reduced from sequential N*10s to parallel max(10s)dws doctor — one-stop environment/auth/network diagnosticsdws config list — centralized view of scattered configurationfeat(skill): restore find/get for legacy skill market API — skill find, skill get; skill add still uses aihub downloadedition.Hooks.SaveToken / LoadToken / DeleteToken — delegate token persistence with keychain fallbackedition.Hooks.AuthClientID / AuthClientFromMCP — overlay can override the OAuth client ID and route auth through MCP endpointsedition.Hooks.AfterPersistentPreRun — wire non-MCP clients (e.g. A2A gateway) after root setupedition.Hooks.ClassifyToolResult — custom MCP result classification before the default business-error detectiontoken.json) for embedded hosts to detect auth state without keychain accesspkg/runtimetoken.ResolveAccessToken mirroring MCP auth resolution; MCP identity headers exported via pkg/cli for auxiliary HTTP transportsExitCoder interface — edition-specific errors carry custom exit codesRawStderrError interface — errors that bypass CLI formatting and emit raw stderr (for desktop runtimes)Register → PreParse → PostParse → PreRequest → PostResponse)feat(schema): return structured degraded errors instead of silent empty catalog — new CatalogDegraded error with reasons unauthenticated / market_unreachable / runtime_all_failed; auth pre-check short-circuits doomed MCP connectionsrefactor(auth): unify auxiliary token resolution with MCP cached path — shared resolveAccessTokenFromDir; overlays reuse the process-level token cachefeat(plugin): improve CLI overlay resolution and plugin install robustness
plugin.json cli field now accepts a file path (e.g. "cli": "overlay.json") in addition to inline JSONdescription field on CLIToolOverride for static fallback when MCP tools/list is unavailablecmd /C instead of sh -c for build commandsfix(plugin): harden plugin system security boundaries
file:// / local paths in git URLs; allow only https / sshbuild.output must be a relative path within the plugin directoryPATH, LD_PRELOAD, …) from plugin config injectionfix(plugin): schema flag params, HTTP tool discovery, and integration testsfix(plugin): skip min version check in dev modeAITable command surface expansion, installer alignment with npm conventions, and execution-timeout hardening.
AITable command surface expansion, installer alignment with npm conventions, and execution-timeout hardening.
base: list, search, get, create, updatetable: get, create, updatefield: get, create, updaterecord: query, create, updatetemplate: searchattachment: uploadfeat(install): align skill dirs with npm and add OpenClaw — skill install paths follow npm conventions; OpenClaw added to supported agentsto #73551688)dws upgrade requires v1.0.7+perf: optimize command timeout handling, instrumentation, and diagnosticsSelf-upgrade, edition overlay foundation, and fail-closed auth enforcement.
Self-upgrade, edition overlay foundation, and fail-closed auth enforcement.
dws upgrade — self-upgrade via GitHub Releases; atomic replace; cross-platform (macOS/Linux/Windows)feat: edition layer for Wukong overlay — build-time edition hook lets downstream overlays customize auth UX, config dir, static server list, visible products, and extra root commands
pkg/edition defaults + pkg/editiontest contract testsMakefile target edition-test; CI job edition-testshideNonDirectRuntimeCommands respects edition VisibleProductsauth login subcommand + hints for embedded editionsConfigDir overridedws version — human-readable multi-line output plus JSON with edition, architecture, build, committo #73551688)feat(auth): unify MCP retry constant and add retry to remaining endpointsstyle(auth): redesign OAuth authorization pages UIfix(auth): switch CLI auth check from fail-open to fail-closed
/cli/cliAuthEnabled is unreachable (network error/timeout/5xx), OAuth callback now routes to the permission request page instead of silently marking "enabled"CheckCLIAuthEnabled retries with backoff (3 attempts, 0s/1s/2s) to tolerate transient issuesError diagnostics overhaul, destructive-command confirmation, and credential auto-persistence.
Error diagnostics overhaul, destructive-command confirmation, and credential auto-persistence.
--yes is setServerDiagnostics struct extracts trace_id, server_error_code, technical_detail, server_retryable from MCP responseserror.data, tool call result content, and HTTP headers (X-Trace-Id, X-Request-Id, x-dingtalk-trace-id)PrintHuman: Normal (trace ID + server code), Verbose (+ technical detail), Debug (+ RPC code / operation / reason)TruncateBody / SanitizeArguments / RedactHeaders helpers with sensitive-key substring detectionfeat(auth): enhance device flow with CLI auth check and admin guidancefeat(auth): persist OAuth credentials for reliable token refreshfeat(auth): persist client credentials and optimize keychain access — auto-persist --client-id / --client-secret; keychain credential cache to avoid repeated reads; enhanced logout cleans app.json + keychain secrets + token.jsonadd report helper with flexible date parsing and defaultsfeat: to #73551688 支持消息通知fix: resolve verbosity flag lookup, FileLogger lazy binding, and business error logging
resolveVerbosity uses cmd.Flags() instead of PersistentFlags() so subcommands inherit --verbose / --debugFileLogger lazy-binds in executeInvocation (after configureLogLevel init)success=false) now written to the file logger for offline diagnosisimport path for errors package in skill_command.goNothing published for this version
Nothing published for this version
Token-refresh reliability and onboarding clarity.
Token-refresh reliability and onboarding clarity.
feat(auth): persist client credentials for token refresh — --client-id / --client-secret are stored for automatic refresh after expiration; client secret lives in the system Keychain with a file referencesimple.md onboarding, cross-skill reference fixesNothing published for this version
Filtering power, schema rendering, and a native todo command family.
Filtering power, schema rendering, and a native todo command family.
--fields now accepts dot-notation (e.g. --fields response.content) and array index access (e.g. response.items[0])schema command enhancements
todo task helper family — static create / update / done / get / delete with preferLegacyLeaf replacing dynamic commands
create_personal_todo, update_todo_task, update_todo_done_status, query_todo_detail, delete_todotodo helperen.json spacing/wording issues)Backward-compatible feature and security update after the initial 1.0.0 release.
Backward-compatible feature and security update after the initial 1.0.0 release.
dws auth login and dws auth statusauth login help text, hidden compatibility flags, and interactive UX--json and legacy auth flagscontent payloadsNothing published for this version
Nothing published for this version
Nothing published for this version
First public release of DingTalk Workspace CLI.
First public release of DingTalk Workspace CLI.
--format, --verbose, --debug, --dry-run, --yes, --timeoutSKILL.md with product reference docs, intent routing guide, error codes, and batch scripts~/.agents/skills/dws (home) or ./.agents/skills/dws (project)install.sh, install.ps1)install-skills.sh)Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →