Slack draft "Send" button shows raw JSON-parse error instead of the real Slack Connect restriction message

Status Open
Maintainer reply None cached
Activity 0 comments · opened Aug 14, 2026

Description

When a message is drafted in a Slack channel via the Slack MCP integration's slack_send_message_draft tool, and that channel is an externally shared (Slack Connect) channel, clicking Send on the draft in the Slack UI fails with a confusing client-side error instead of a clear explanation:

✗ Failed to send
Unexpected token 'e', "execution_"... is not valid JSON

Root cause (as far as I can diagnose from the client side)

Calling slack_send_message directly against the same channel returns a clear, well-formed error string from the MCP layer:

execution_failed: mcp_externally_shared_channel_restricted: Cannot send messages to externally shared (Slack Connect) channels. Use the slack_send_message_draft tool instead to create a draft that the user can review and send manually.

It looks like the same underlying restriction also applies when the user clicks "Send" on an app-created draft for that same Connect channel — but whatever surfaces that rejection to the Slack "Send" button UI passes the raw execution_failed: ... string through to a JSON.parse() (or equivalent) call, which throws on the leading e of execution_failed, producing the generic Unexpected token 'e', "execution_"... is not valid JSON message instead of the actual, human-readable restriction text.

Expected behavior

The Send button should surface the real reason for the failure (e.g. "This channel is externally shared — messages created by an app/integration can't be sent to it; please send this message yourself from your own Slack client instead"), not a raw JSON-parsing crash message.

Impact

The user has no way to tell, from the UI alone, that the failure is a deliberate/expected Slack Connect restriction rather than a bug or transient error — they just see a cryptic parser error and have no actionable next step surfaced to them.

Environment

  • Claude Code, using the Slack MCP connector (Slack tools such as slack_send_message_draft / slack_send_message)
  • Target channel: a channel that started as an internal channel and later had an external (Slack Connect) member added to it, converting it to externally-shared

View original on GitHub ↗