@slack/radar-mcp
v1.2.0
Published
MCP server and web dashboard for on-device debugging of the Slack Android app via ADB
Downloads
521
Readme
slack-radar-mcp
Platform-agnostic MCP server and web dashboard for on-device debugging of mobile apps.
Gives Claude Code direct access to network calls, RTM events, analytics (clogs), screenshots, logs, and more from a running debug build. Ships with Android support (ADB); the DeviceTransport interface makes adding iOS or other platforms straightforward.
For Slack engineers. The npm package is published publicly as a distribution convenience, but the source repository, issue tracker, and support live on Slack's internal GitHub Enterprise. External users can install the package but should not expect support or source access. The tool only functions against a Slack debug build, which is not distributed externally.
Installation
The recommended path is via the marketplace plugin:
/plugin install slack-radar@slack-android-marketplace
/slack-radar-setupOr register manually:
slack claude mcp add -s user slack-radar-mcp -- npx -y @slack/radar-mcp@latestRestart your Claude Code session for the tools to appear.
Web Dashboard
The package also ships a browser-based dashboard that shows the same live device data without Claude Code in the loop.
npx -p @slack/radar-mcp slack-radar-webOr with a global install:
npm install -g @slack/radar-mcp
slack-radar-webOpens http://localhost:8100 automatically. Set SLACK_RADAR_WEB_PORT to use a different port. Features:
- Live Network / RTM / Clogs tabs with real-time SSE streaming
- Filter bar for URL, channel, event name, payload text
- Detail pane with Copy JSON, Copy Body, and Copy cURL buttons
- Profile selector for personal vs work profile when both are running
- Auto-extend keeps the device-side server alive while the browser tab is open
- Enable Radar button handles ADB forwarding and device activation without Claude
Prerequisites
- Node.js 18+
- ADB with a single connected device (USB or wireless debug)
- A debug build of Slack installed on the device (must include the
slack-radarmodules)
Session Management
Radar starts disabled each session. All tools except ping return an error until enabled.
| Command | Effect |
|---|---|
| /radar-enable | Activates ADB forwarding, device broadcast, SSE stream. Tools become available. |
| /radar-disable | Tears down stream, clears local buffers. Tools return "not active" error. |
Auto-enable: When you ask Claude an obvious device question (clogs, network calls, screenshots, app state, RTM events, logs), Claude invokes /radar-enable automatically before calling the relevant tool.
Auto-disable: When the device-side radar shuts down after idle (default 5 min), the next tool call failure flips the session to disabled. Claude will tell you and offer to re-enable.
Tools
| Tool | Description |
|---|---|
| ping | Health check. Returns uptime, buffer sizes, remaining session time, stream status. Use timeout_minutes to extend sessions. |
| get_recent_network_calls | HTTP call summaries: method, URL, status code, duration. Filterable by URL substring and status code. |
| get_network_call_detail | Full request/response headers and bodies for a specific call (gzip/brotli decompressed). |
| get_recent_rtm_events | RTM event summaries: type, direction, channel, timestamp. Filterable by type, direction, channel. Uses subtypes (e.g. message_changed, not message). |
| get_rtm_event_detail | Full RTM event JSON payload for a specific event. |
| get_recent_clogs | Analytics event summaries: name and timestamp. Filterable by event name substring. Persists from app start. |
| get_clog_detail | Full clog JSON payload for a specific event. |
| wait_for_events | Block until matching events arrive via SSE stream. Idle-timeout based, not polling. |
| search | Full-text search across network, RTM, and clog buffers. |
| get_app_state | Current Activity/Fragment state via dumpsys. Shows visible screen, parameters, tab state. |
| get_recent_logs | Logcat entries filtered by tag. For Timber debug logs (FKDebug, SlackRadar, etc.). |
| screenshot | Capture device screen as PNG. 720px default, full_res=true for full resolution. |
| record_screen | Record short screen video (MP4). Default 5s, max 30s. |
| clear_buffers | Clear all captured network calls and RTM events from device and local buffers. |
| _radar_session_enable | Enable radar for the session. Called by /radar-enable skill. |
| _radar_session_disable | Disable radar for the session. Called by /radar-disable skill. |
Architecture
Mobile debug build (device)
+-- Local socket (platform-specific)
+-- HTTP endpoints + SSE streaming
|
| port forwarding (adb forward / iproxy / etc.)
|
@slack/radar-mcp (Node.js, runs on developer machine)
+-- src/shared/ DeviceTransport, AndroidTransport, SSE stream, constants
+-- src/mcp/ MCP stdio server (Claude Code entry point)
+-- src/web/ HTTP proxy server + browser dashboard
+-- public/ Static HTML/CSS/JS served to the browserAll device-specific logic lives behind the DeviceTransport interface (src/shared/transport.ts). The MCP server, web dashboard, tools, SSE streaming, and session management are fully platform-agnostic.
Adding a new platform: implement DeviceTransport in src/shared/<platform>.ts, add a case to createTransport() in src/mcp/index.ts. No other files change.
Security
- No TCP port on device. Uses platform-specific local sockets, only reachable via port forwarding. Requires physical USB or explicit debug pairing.
- Debug builds only. Release builds bind a no-op implementation. Server code is eliminated at compile time.
- Lazy activation. Dormant until explicitly triggered.
- Auto-shutdown. Device-side server shuts down after idle timeout (default 5 minutes). Zero cost when unused.
Data Capture
What gets captured depends on the in-app server implementation. The MCP server is agnostic to the data source. The Android implementation captures:
- Network calls: OkHttp interceptor. Ring buffer: 200 calls.
- RTM events: WebSocket listener. Ring buffer: 500 events.
- Clogs: Analytics interceptor. Ring buffer: 500 events. Persists across radar activation cycles.
All data is in-memory only. No disk writes.
What gets captured, in detail
This tool captures unredacted network traffic from your debug Slack build, including:
- URL query parameters (tokens can appear here)
Authorizationheaders and cookiesSet-Cookieresponse headers (session tokens)- Request and response bodies, up to 256 KB per body, for JSON, form, text, and XML content types
- RTM WebSocket payloads (every sent and received message)
- Analytics (clog) events serialized as JSON
- Screenshots and short screen recordings on demand
- Logcat entries filtered by tag
Auth tokens and session cookies will appear in captured data. Captured data flows to your MCP client (Claude Code), which may send relevant portions to the configured AI provider per its own data handling policy.
Use against workspaces you are signed into as yourself
The tool is intended for debugging the Slack Android app against your own sessions. Do not share captured data (screenshots, log exports, tool transcripts) externally without first redacting auth material. Treat anything radar captures with the same care you would treat a curl transcript of an authenticated API call.
Local Development
npm install
npm run build # Compile TypeScript + copy static assets to dist/
npm start # Run the MCP server (stdio transport)
npm run start:web # Run the web dashboard
npm run watch # TypeScript compiler in watch mode
npm test # Unit tests
npm run test:smoke # Smoke tests
npm run test:all # BothTroubleshooting
"ADB port forwarding failed"
Ensure a device is connected (adb devices should show exactly one device). If using wireless debug, confirm the pairing is active.
"Radar not responding"
The device-side server may have auto-shut down. Use /radar-enable to restart it.
"Session disabled"
Two consecutive connection failures disable the session. Use /radar-enable to reconnect.
Work profile devices
The MCP server auto-detects the Android user ID via ps and targets the broadcast accordingly. No manual --user flag needed. The web dashboard shows a profile selector when both personal and work profiles are running.
Tools not appearing after setup Restart your Claude Code session. MCP servers are registered at session start.
Port already in use (web dashboard)
Another instance may be running. Kill it with lsof -ti :8100 | xargs kill or set a different port with SLACK_RADAR_WEB_PORT=8101 slack-radar-web.
