feat: Slack MCP connector
From the PR description
Connect Mike to Slack's official MCP server (https://mcp.slack.com/mcp) from Account → Connectors: paste the URL, authorize in a popup, and the assistant gets Slack's tools (19 on a default workspace - search, channels, threads, canvases, profiles). Write-capable tools are off by default.
Changes
- Provider-quirks registry (
backend/src/lib/mcp/providers.ts): Google's special-casing in the OAuth flow is now a table; Slack is a second row. Each row declares host matching, env-var prefix, setup instructions, and error hints. - Slack support: Slack has no dynamic client registration, so operators set
SLACK_MCP_OAUTH_CLIENT_ID/_SECRET(documented in.env.example); without them the UI shows exact setup steps. A paste-ready Slack app manifest ships indocs/slack-mcp-app-manifest.example.json. - OAuth discovery fix: the MCP SDK misses Slack's resource metadata (Slack 302s the path-aware well-known URL; the SDK only falls back on 4xx), producing an authorization URL with no scopes - which Slack rejects. We now discover the metadata URL ourselves (preferring the server's 401
WWW-Authenticateheader) and pass it to the SDK. Benefits all providers. - First 9 commits are shared with #285; whichever merges second gets a small rebase.
Verification
- 521 backend + 176 frontend tests pass (48 in the MCP suite, incl. new Slack cases).
- Live end-to-end against a real workspace: consent → encrypted token stored → 19 tools listed, write tools disabled.
Demo
🎬 Placeholder: screenshots/recording to be attached.
🤖 Generated with Claude Code
Our analysis
Add Slack MCP OAuth connector — read the full analysis →
Think the analysis missed something the PR description covers?
Capture this PR into my fork
Download a Markdown prompt that tells Claude how to port every
commit in this PR into your working tree. Run it via
claude -p < capture-pull-292.md from
inside the repo you want the changes in.