You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
[0.0.1] - 2026-11-13
Added
Status's account (teamId, userId, enterpriseId), from auth.test. Thanks to @domeevans (#18).
The tools RPC's status method (slack_status, allowed at every access). Thanks to @domeevans (#18).
slack_mark_read / mark_read (write): Slack's conversations.mark. Needs a :write scope; SCOPE_MISSING without it. Thanks to @domeevans (#18).
oauth.auth_server_metadata_url, passed unchanged into the slack server's oauth block, so a host with an https: callback can keep Slack's client secret on its own sign-in service. OpenCode uses that document in place of Slack's for the whole sign-in; SECURITY.md says what its server controls. Without it the entry is unchanged.
The jellyaccess setting declares its choices (needs a jelly that includes app#1301).
The README and docs/configuration.md say that Slack refreshes without a secret only for desktop redirects, and answers a refused refresh with HTTP 200 bad_client_secret.
Changed
The plugin now reads the Slack token, in src/slack-api.ts only, to call auth.test and conversations.mark, and never stores, logs or returns it.
Known limits
Slack's server and Slack's tools. The plugin adds Slack's hosted MCP server and no wrapper tools; its only Web API calls, auth.test and conversations.mark, are tested against a fake Slack, not a live one. Tool schemas, results (Markdown text, not JSON) and rate limits are Slack's.
The default access is all. Agents can then read private channels and files, and send or change things, without asking. Set access to "ask-changes" or "read-only" to restrict it; see Permissions.
Tool classes are set by hand. A tool Slack adds later runs under the namespace rule (allowed at all, asks at ask-changes, denied at read-only) and is not a script method until the plugin classifies it. /slack-status names such tools.
mark_read needs im:write, channels:write or the like, not in the default scopes.
Jelly.access needs a Jelly with app#1301.
Private search needs scopes the default sign-in lacks. With the default scopes, Slack answers missing_scope for it. See the scope table.
Tested on OpenCode 2.2.3, 2.2.4, 2.2.5 and 2.2.6 only. Other releases in >=2.2.3 <2.3.0 run untested.
A script's calls are not recorded in the session. Slack's audit logs record them.
Names keep the doubled prefix. A permission action is the tool's full name, such as slack_slack_search_public. Renaming it would break saved rules.
Updates are not automatic for a Git install, and opencode plugin update and opencode plugin check do not work on one: to move to a newer release, remove the old entry and add the new tag.