@jtalk22/slack-mcp 3.1.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -13
- package/docs/SETUP.md +64 -29
- package/docs/TROUBLESHOOTING.md +28 -0
- package/lib/handlers.js +156 -0
- package/lib/slack-client.js +11 -3
- package/lib/token-store.js +6 -5
- package/lib/tools.js +131 -0
- package/package.json +15 -8
- package/public/index.html +10 -6
- package/public/share.html +6 -5
- package/scripts/setup-wizard.js +1 -1
- package/server.json +8 -2
- package/src/server-http.js +16 -1
- package/src/server.js +31 -7
- package/src/web-server.js +117 -4
- package/docs/CLOUDFLARE-BROWSER-TOOLKIT.md +0 -67
- package/docs/COMMUNICATION-STYLE.md +0 -66
- package/docs/COMPATIBILITY.md +0 -19
- package/docs/DEPLOYMENT-MODES.md +0 -55
- package/docs/HN-LAUNCH.md +0 -72
- package/docs/INDEX.md +0 -41
- package/docs/INSTALL-PROOF.md +0 -18
- package/docs/LAUNCH-COPY-v3.0.0.md +0 -101
- package/docs/LAUNCH-MATRIX.md +0 -22
- package/docs/LAUNCH-OPS.md +0 -71
- package/docs/RELEASE-HEALTH.md +0 -77
- package/docs/SUPPORT-BOUNDARIES.md +0 -49
- package/docs/USE_CASE_RECIPES.md +0 -69
- package/docs/WEB-API.md +0 -303
- package/docs/images/demo-channel-messages.png +0 -0
- package/docs/images/demo-channels.png +0 -0
- package/docs/images/demo-claude-mobile-360x800.png +0 -0
- package/docs/images/demo-claude-mobile-390x844.png +0 -0
- package/docs/images/demo-claude-mobile-poster.png +0 -0
- package/docs/images/demo-main-mobile-360x800.png +0 -0
- package/docs/images/demo-main-mobile-390x844.png +0 -0
- package/docs/images/demo-main.png +0 -0
- package/docs/images/demo-messages.png +0 -0
- package/docs/images/demo-poster.png +0 -0
- package/docs/images/demo-sidebar.png +0 -0
- package/docs/images/diagram-oauth-comparison.svg +0 -80
- package/docs/images/diagram-session-flow.svg +0 -105
- package/docs/images/social-preview-v3.png +0 -0
- package/docs/images/web-api-mobile-360x800.png +0 -0
- package/docs/images/web-api-mobile-390x844.png +0 -0
- package/public/demo-claude.html +0 -1974
- package/public/demo-video.html +0 -244
- package/public/demo.html +0 -1196
- package/scripts/build-mobile-demo.js +0 -168
- package/scripts/build-release-health-delta.js +0 -201
- package/scripts/build-social-preview.js +0 -189
- package/scripts/capture-screenshots.js +0 -152
- package/scripts/check-owner-attribution.sh +0 -131
- package/scripts/check-public-language.sh +0 -26
- package/scripts/check-version-parity.js +0 -218
- package/scripts/cloudflare-browser-tool.js +0 -237
- package/scripts/collect-release-health.js +0 -162
- package/scripts/impact-push-v3.js +0 -781
- package/scripts/record-demo.js +0 -163
- package/scripts/release-preflight.js +0 -247
- package/scripts/setup-git-hooks.sh +0 -15
- package/scripts/update-github-social-preview.js +0 -208
- package/scripts/verify-core.js +0 -159
- package/scripts/verify-install-flow.js +0 -193
- package/scripts/verify-web.js +0 -273
package/docs/WEB-API.md
DELETED
|
@@ -1,303 +0,0 @@
|
|
|
1
|
-
# Web API Reference
|
|
2
|
-
|
|
3
|
-
The Slack Web Server exposes all MCP tools as REST endpoints, accessible from any browser or HTTP client.
|
|
4
|
-
|
|
5
|
-
Claude web now supports remote MCP connectors on paid plans, so this Web API mode is best used for:
|
|
6
|
-
- local localhost dashboard workflows
|
|
7
|
-
- REST/API integrations
|
|
8
|
-
- fallback operation when you do not want to host a remote MCP endpoint
|
|
9
|
-
|
|
10
|
-
References:
|
|
11
|
-
- https://support.anthropic.com/en/articles/11995447-connectors-in-claude
|
|
12
|
-
- https://support.anthropic.com/en/articles/11175166-about-custom-integrations-using-remote-mcp
|
|
13
|
-
|
|
14
|
-
## Starting the Server
|
|
15
|
-
|
|
16
|
-
```bash
|
|
17
|
-
cd ~/slack-mcp-server
|
|
18
|
-
npm run web
|
|
19
|
-
# Or run directly from npm:
|
|
20
|
-
npx -y @jtalk22/slack-mcp web
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
The server will:
|
|
24
|
-
1. Start on port 3000
|
|
25
|
-
2. Serve the web UI at http://localhost:3000
|
|
26
|
-
3. Generate a secure API key (saved to `~/.slack-mcp-api-key`)
|
|
27
|
-
|
|
28
|
-
## Auto-Start on Login (Recommended)
|
|
29
|
-
|
|
30
|
-
Create a LaunchAgent to auto-start the web server on login:
|
|
31
|
-
|
|
32
|
-
```bash
|
|
33
|
-
cat > ~/Library/LaunchAgents/com.slack-web-api.plist << 'EOF'
|
|
34
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
35
|
-
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
36
|
-
<plist version="1.0">
|
|
37
|
-
<dict>
|
|
38
|
-
<key>Label</key>
|
|
39
|
-
<string>com.slack-web-api</string>
|
|
40
|
-
<key>ProgramArguments</key>
|
|
41
|
-
<array>
|
|
42
|
-
<string>/opt/homebrew/bin/node</string>
|
|
43
|
-
<string>/Users/YOUR_USERNAME/slack-mcp-server/src/web-server.js</string>
|
|
44
|
-
</array>
|
|
45
|
-
<key>WorkingDirectory</key>
|
|
46
|
-
<string>/Users/YOUR_USERNAME/slack-mcp-server</string>
|
|
47
|
-
<key>RunAtLoad</key>
|
|
48
|
-
<true/>
|
|
49
|
-
<key>KeepAlive</key>
|
|
50
|
-
<true/>
|
|
51
|
-
<key>StandardOutPath</key>
|
|
52
|
-
<string>/tmp/slack-web-api.log</string>
|
|
53
|
-
<key>StandardErrorPath</key>
|
|
54
|
-
<string>/tmp/slack-web-api.error.log</string>
|
|
55
|
-
</dict>
|
|
56
|
-
</plist>
|
|
57
|
-
EOF
|
|
58
|
-
|
|
59
|
-
# Load it
|
|
60
|
-
launchctl load ~/Library/LaunchAgents/com.slack-web-api.plist
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
**Manage the service:**
|
|
64
|
-
```bash
|
|
65
|
-
# Check status
|
|
66
|
-
launchctl list | grep slack-web-api
|
|
67
|
-
|
|
68
|
-
# Restart
|
|
69
|
-
launchctl kickstart -k gui/$(id -u)/com.slack-web-api
|
|
70
|
-
|
|
71
|
-
# Stop
|
|
72
|
-
launchctl unload ~/Library/LaunchAgents/com.slack-web-api.plist
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
## Authentication
|
|
76
|
-
|
|
77
|
-
All API requests require the API key in the Authorization header:
|
|
78
|
-
|
|
79
|
-
```
|
|
80
|
-
Authorization: Bearer <your-api-key>
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
The server generates a cryptographically secure API key on first run, saved to `~/.slack-mcp-api-key`. The key is printed to the console:
|
|
84
|
-
|
|
85
|
-
```
|
|
86
|
-
Dashboard: http://localhost:3000/?key=smcp_xxxxxxxxxxxx
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
To use a custom key:
|
|
90
|
-
```bash
|
|
91
|
-
SLACK_API_KEY=your-custom-key npm run web
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
---
|
|
95
|
-
|
|
96
|
-
## Endpoints
|
|
97
|
-
|
|
98
|
-
### GET /
|
|
99
|
-
Server info and available endpoints (no auth required).
|
|
100
|
-
|
|
101
|
-
### GET /health
|
|
102
|
-
Check Slack connection status.
|
|
103
|
-
|
|
104
|
-
```bash
|
|
105
|
-
curl -H "Authorization: Bearer $API_KEY" http://localhost:3000/health
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
**Response:**
|
|
109
|
-
```json
|
|
110
|
-
{
|
|
111
|
-
"status": "ok",
|
|
112
|
-
"code": "ok",
|
|
113
|
-
"message": "Slack auth valid",
|
|
114
|
-
"user": "james",
|
|
115
|
-
"team": "Rêvasser"
|
|
116
|
-
}
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
---
|
|
120
|
-
|
|
121
|
-
### GET /token-status
|
|
122
|
-
Read-only token diagnostics (age/health/cache stats). This endpoint does not trigger Chrome extraction.
|
|
123
|
-
|
|
124
|
-
```bash
|
|
125
|
-
curl -H "Authorization: Bearer $API_KEY" http://localhost:3000/token-status
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
---
|
|
129
|
-
|
|
130
|
-
### POST /refresh
|
|
131
|
-
Force token refresh from Chrome.
|
|
132
|
-
|
|
133
|
-
```bash
|
|
134
|
-
curl -X POST -H "Authorization: Bearer $API_KEY" http://localhost:3000/refresh
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
---
|
|
138
|
-
|
|
139
|
-
### GET /conversations
|
|
140
|
-
List conversations (DMs/channels).
|
|
141
|
-
|
|
142
|
-
**Query Parameters:**
|
|
143
|
-
| Param | Default | Description |
|
|
144
|
-
|-------|---------|-------------|
|
|
145
|
-
| types | im,mpim | Conversation types |
|
|
146
|
-
| limit | 100 | Max results |
|
|
147
|
-
|
|
148
|
-
**Types:** `im`, `mpim`, `public_channel`, `private_channel`
|
|
149
|
-
|
|
150
|
-
```bash
|
|
151
|
-
curl -H "Authorization: Bearer $API_KEY" "http://localhost:3000/conversations?types=im"
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
**Response:**
|
|
155
|
-
```json
|
|
156
|
-
{
|
|
157
|
-
"count": 5,
|
|
158
|
-
"conversations": [
|
|
159
|
-
{ "id": "D063M4403MW", "name": "Gwen Santos", "type": "dm" }
|
|
160
|
-
]
|
|
161
|
-
}
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
---
|
|
165
|
-
|
|
166
|
-
### GET /conversations/:id/history
|
|
167
|
-
Get messages from a conversation.
|
|
168
|
-
|
|
169
|
-
**Query Parameters:**
|
|
170
|
-
| Param | Default | Description |
|
|
171
|
-
|-------|---------|-------------|
|
|
172
|
-
| limit | 50 | Messages to fetch |
|
|
173
|
-
| oldest | - | Unix timestamp start |
|
|
174
|
-
| latest | - | Unix timestamp end |
|
|
175
|
-
| resolve_users | true | Convert user IDs to names |
|
|
176
|
-
|
|
177
|
-
```bash
|
|
178
|
-
curl -H "Authorization: Bearer $API_KEY" "http://localhost:3000/conversations/D063M4403MW/history?limit=10"
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
---
|
|
182
|
-
|
|
183
|
-
### GET /conversations/:id/full
|
|
184
|
-
Export full conversation with threads.
|
|
185
|
-
|
|
186
|
-
**Query Parameters:**
|
|
187
|
-
| Param | Default | Description |
|
|
188
|
-
|-------|---------|-------------|
|
|
189
|
-
| max_messages | 2000 | Max messages |
|
|
190
|
-
| include_threads | true | Fetch replies |
|
|
191
|
-
| oldest | - | Unix timestamp start |
|
|
192
|
-
| latest | - | Unix timestamp end |
|
|
193
|
-
| output_file | - | Save to file path |
|
|
194
|
-
|
|
195
|
-
```bash
|
|
196
|
-
curl -H "Authorization: Bearer $API_KEY" "http://localhost:3000/conversations/D063M4403MW/full?max_messages=500"
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
---
|
|
200
|
-
|
|
201
|
-
### GET /conversations/:id/thread/:ts
|
|
202
|
-
Get thread replies.
|
|
203
|
-
|
|
204
|
-
```bash
|
|
205
|
-
curl -H "Authorization: Bearer $API_KEY" "http://localhost:3000/conversations/D063M4403MW/thread/1767368030.607599"
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
---
|
|
209
|
-
|
|
210
|
-
### GET /search
|
|
211
|
-
Search messages across workspace.
|
|
212
|
-
|
|
213
|
-
**Query Parameters:**
|
|
214
|
-
| Param | Default | Description |
|
|
215
|
-
|-------|---------|-------------|
|
|
216
|
-
| q | *required* | Search query |
|
|
217
|
-
| count | 20 | Max results |
|
|
218
|
-
|
|
219
|
-
**Query Syntax:**
|
|
220
|
-
- `from:@username` - From specific user
|
|
221
|
-
- `in:#channel` - In specific channel
|
|
222
|
-
- `before:2026-01-01` - Before date
|
|
223
|
-
- `after:2025-12-01` - After date
|
|
224
|
-
|
|
225
|
-
```bash
|
|
226
|
-
curl -H "Authorization: Bearer $API_KEY" "http://localhost:3000/search?q=from:@gwen%20meeting"
|
|
227
|
-
```
|
|
228
|
-
|
|
229
|
-
---
|
|
230
|
-
|
|
231
|
-
### POST /messages
|
|
232
|
-
Send a message.
|
|
233
|
-
|
|
234
|
-
**Body:**
|
|
235
|
-
```json
|
|
236
|
-
{
|
|
237
|
-
"channel_id": "D063M4403MW",
|
|
238
|
-
"text": "Hello!",
|
|
239
|
-
"thread_ts": "1767368030.607599" // optional, for replies
|
|
240
|
-
}
|
|
241
|
-
```
|
|
242
|
-
|
|
243
|
-
```bash
|
|
244
|
-
curl -X POST -H "Authorization: Bearer $API_KEY" \
|
|
245
|
-
-H "Content-Type: application/json" \
|
|
246
|
-
-d '{"channel_id":"D063M4403MW","text":"Hello!"}' \
|
|
247
|
-
http://localhost:3000/messages
|
|
248
|
-
```
|
|
249
|
-
|
|
250
|
-
---
|
|
251
|
-
|
|
252
|
-
### GET /users
|
|
253
|
-
List all workspace users.
|
|
254
|
-
|
|
255
|
-
```bash
|
|
256
|
-
curl -H "Authorization: Bearer $API_KEY" "http://localhost:3000/users?limit=50"
|
|
257
|
-
```
|
|
258
|
-
|
|
259
|
-
---
|
|
260
|
-
|
|
261
|
-
### GET /users/:id
|
|
262
|
-
Get user details.
|
|
263
|
-
|
|
264
|
-
```bash
|
|
265
|
-
curl -H "Authorization: Bearer $API_KEY" http://localhost:3000/users/U05GPEVH7J9
|
|
266
|
-
```
|
|
267
|
-
|
|
268
|
-
---
|
|
269
|
-
|
|
270
|
-
## Web UI
|
|
271
|
-
|
|
272
|
-
Open http://localhost:3000 in your browser for a visual interface.
|
|
273
|
-
|
|
274
|
-
The UI auto-connects with the default API key:
|
|
275
|
-
1. Select a conversation from the sidebar
|
|
276
|
-
2. View messages, threads, and user info
|
|
277
|
-
3. Search messages across the workspace
|
|
278
|
-
4. Send messages directly from the browser
|
|
279
|
-
|
|
280
|
-
**Using with claude.ai:**
|
|
281
|
-
1. Preferred: add a remote MCP connector in Claude settings if you run a remote endpoint.
|
|
282
|
-
2. Fallback: open the web UI alongside claude.ai for local browsing/search.
|
|
283
|
-
3. Copy-paste relevant message content as needed.
|
|
284
|
-
|
|
285
|
-
---
|
|
286
|
-
|
|
287
|
-
## Environment Variables
|
|
288
|
-
|
|
289
|
-
| Variable | Default | Description |
|
|
290
|
-
|----------|---------|-------------|
|
|
291
|
-
| PORT | 3000 | Server port |
|
|
292
|
-
| SLACK_API_KEY | (generated) | API key for authentication |
|
|
293
|
-
| SLACK_TOKEN | - | Slack xoxc token |
|
|
294
|
-
| SLACK_COOKIE | - | Slack xoxd cookie |
|
|
295
|
-
|
|
296
|
-
---
|
|
297
|
-
|
|
298
|
-
## Security Notes
|
|
299
|
-
|
|
300
|
-
1. **API Key**: Keep it secret. Anyone with the key can access your Slack.
|
|
301
|
-
2. **Local Only**: By default, only accessible from localhost.
|
|
302
|
-
3. **HTTPS**: For remote access, put behind a reverse proxy with HTTPS.
|
|
303
|
-
4. **Token Storage**: Slack tokens are stored in keychain and token file.
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 900 420">
|
|
2
|
-
<defs>
|
|
3
|
-
<linearGradient id="bgGrad2" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
4
|
-
<stop offset="0%" style="stop-color:#1a1a2e"/>
|
|
5
|
-
<stop offset="100%" style="stop-color:#16213e"/>
|
|
6
|
-
</linearGradient>
|
|
7
|
-
<marker id="arrowRed2" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto">
|
|
8
|
-
<path d="M0,0 L0,6 L9,3 z" fill="#e94560"/>
|
|
9
|
-
</marker>
|
|
10
|
-
<marker id="arrowTeal2" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto">
|
|
11
|
-
<path d="M0,0 L0,6 L9,3 z" fill="#4ecdc4"/>
|
|
12
|
-
</marker>
|
|
13
|
-
</defs>
|
|
14
|
-
|
|
15
|
-
<!-- Background -->
|
|
16
|
-
<rect width="900" height="420" fill="url(#bgGrad2)" rx="12"/>
|
|
17
|
-
|
|
18
|
-
<!-- Left Side: OAuth (Red-tinted) -->
|
|
19
|
-
<rect x="30" y="50" width="400" height="340" rx="12" fill="#e94560" opacity="0.1" stroke="#e94560" stroke-width="2"/>
|
|
20
|
-
<text x="230" y="85" text-anchor="middle" fill="#fca5a5" font-family="system-ui, -apple-system, sans-serif" font-size="16" font-weight="600">Official Slack API (OAuth)</text>
|
|
21
|
-
|
|
22
|
-
<!-- OAuth Flow - Row 1 -->
|
|
23
|
-
<rect x="45" y="110" width="120" height="45" rx="8" fill="#2d2d2d" stroke="#e94560" stroke-width="1"/>
|
|
24
|
-
<text x="105" y="138" text-anchor="middle" fill="#ffffff" font-family="system-ui, -apple-system, sans-serif" font-size="12">Create App</text>
|
|
25
|
-
|
|
26
|
-
<path d="M 170 132 L 190 132" stroke="#e94560" stroke-width="2" marker-end="url(#arrowRed2)"/>
|
|
27
|
-
|
|
28
|
-
<rect x="195" y="110" width="120" height="45" rx="8" fill="#2d2d2d" stroke="#e94560" stroke-width="1"/>
|
|
29
|
-
<text x="255" y="138" text-anchor="middle" fill="#ffffff" font-family="system-ui, -apple-system, sans-serif" font-size="12">Request Scopes</text>
|
|
30
|
-
|
|
31
|
-
<path d="M 320 132 L 340 132" stroke="#e94560" stroke-width="2" marker-end="url(#arrowRed2)"/>
|
|
32
|
-
|
|
33
|
-
<rect x="345" y="110" width="75" height="45" rx="8" fill="#e94560" opacity="0.4" stroke="#e94560" stroke-width="1"/>
|
|
34
|
-
<text x="382" y="128" text-anchor="middle" fill="#ffffff" font-family="system-ui, -apple-system, sans-serif" font-size="11" font-weight="600">Admin</text>
|
|
35
|
-
<text x="382" y="144" text-anchor="middle" fill="#ffffff" font-family="system-ui, -apple-system, sans-serif" font-size="11" font-weight="600">Approval</text>
|
|
36
|
-
|
|
37
|
-
<!-- Arrow down from Admin Approval -->
|
|
38
|
-
<path d="M 382 160 L 382 195" stroke="#e94560" stroke-width="2" marker-end="url(#arrowRed2)"/>
|
|
39
|
-
|
|
40
|
-
<!-- OAuth Flow - Row 2 -->
|
|
41
|
-
<rect x="95" y="205" width="140" height="45" rx="8" fill="#2d2d2d" stroke="#e94560" stroke-width="1"/>
|
|
42
|
-
<text x="165" y="233" text-anchor="middle" fill="#ffffff" font-family="system-ui, -apple-system, sans-serif" font-size="12">User Authorization</text>
|
|
43
|
-
|
|
44
|
-
<path d="M 240 227 L 260 227" stroke="#e94560" stroke-width="2" marker-end="url(#arrowRed2)"/>
|
|
45
|
-
|
|
46
|
-
<rect x="265" y="205" width="140" height="45" rx="8" fill="#2d2d2d" stroke="#e94560" stroke-width="1"/>
|
|
47
|
-
<text x="335" y="233" text-anchor="middle" fill="#ffffff" font-family="system-ui, -apple-system, sans-serif" font-size="12">Limited Access</text>
|
|
48
|
-
|
|
49
|
-
<!-- OAuth Result (blocked) -->
|
|
50
|
-
<rect x="70" y="280" width="290" height="60" rx="8" fill="#e94560" opacity="0.15" stroke="#e94560" stroke-width="2" stroke-dasharray="4"/>
|
|
51
|
-
<text x="215" y="305" text-anchor="middle" fill="#fca5a5" font-family="system-ui, -apple-system, sans-serif" font-size="13" font-weight="500">No DMs without</text>
|
|
52
|
-
<text x="215" y="325" text-anchor="middle" fill="#fca5a5" font-family="system-ui, -apple-system, sans-serif" font-size="13" font-weight="500">per-conversation consent</text>
|
|
53
|
-
|
|
54
|
-
<!-- Right Side: Session Mirroring (Green-tinted) -->
|
|
55
|
-
<rect x="470" y="50" width="400" height="340" rx="12" fill="#4ecdc4" opacity="0.1" stroke="#4ecdc4" stroke-width="2"/>
|
|
56
|
-
<text x="670" y="85" text-anchor="middle" fill="#5eead4" font-family="system-ui, -apple-system, sans-serif" font-size="16" font-weight="600">Session Mirroring</text>
|
|
57
|
-
|
|
58
|
-
<!-- Session Mirroring Flow -->
|
|
59
|
-
<rect x="495" y="120" width="160" height="50" rx="8" fill="#3b82f6" opacity="0.9"/>
|
|
60
|
-
<text x="575" y="150" text-anchor="middle" fill="#ffffff" font-family="system-ui, -apple-system, sans-serif" font-size="12" font-weight="500">Open Slack in Chrome</text>
|
|
61
|
-
|
|
62
|
-
<path d="M 660 145 L 700 145" stroke="#4ecdc4" stroke-width="3" marker-end="url(#arrowTeal2)"/>
|
|
63
|
-
|
|
64
|
-
<rect x="705" y="120" width="140" height="50" rx="8" fill="#da7756" opacity="0.9"/>
|
|
65
|
-
<text x="775" y="150" text-anchor="middle" fill="#ffffff" font-family="system-ui, -apple-system, sans-serif" font-size="12" font-weight="500">Mirror Session</text>
|
|
66
|
-
|
|
67
|
-
<path d="M 775 175 L 775 210" stroke="#4ecdc4" stroke-width="3" marker-end="url(#arrowTeal2)"/>
|
|
68
|
-
|
|
69
|
-
<rect x="605" y="220" width="160" height="50" rx="8" fill="#4ecdc4" opacity="0.9"/>
|
|
70
|
-
<text x="685" y="250" text-anchor="middle" fill="#1a1a2e" font-family="system-ui, -apple-system, sans-serif" font-size="13" font-weight="600">Full Access</text>
|
|
71
|
-
|
|
72
|
-
<!-- Session Mirroring Result (success) -->
|
|
73
|
-
<rect x="510" y="295" width="340" height="60" rx="8" fill="#4ecdc4" opacity="0.2" stroke="#4ecdc4" stroke-width="2"/>
|
|
74
|
-
<text x="680" y="320" text-anchor="middle" fill="#5eead4" font-family="system-ui, -apple-system, sans-serif" font-size="13" font-weight="500">Your DMs, Channels, Search, History</text>
|
|
75
|
-
<text x="680" y="340" text-anchor="middle" fill="#5eead4" font-family="system-ui, -apple-system, sans-serif" font-size="11">✓ Same access as your browser</text>
|
|
76
|
-
|
|
77
|
-
<!-- VS divider -->
|
|
78
|
-
<circle cx="450" cy="210" r="24" fill="#1a1a2e" stroke="#ffffff" stroke-width="2" opacity="0.9"/>
|
|
79
|
-
<text x="450" y="216" text-anchor="middle" fill="#ffffff" font-family="system-ui, -apple-system, sans-serif" font-size="14" font-weight="700">vs</text>
|
|
80
|
-
</svg>
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 900 400">
|
|
2
|
-
<defs>
|
|
3
|
-
<linearGradient id="bgGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
4
|
-
<stop offset="0%" style="stop-color:#1a1a2e"/>
|
|
5
|
-
<stop offset="100%" style="stop-color:#16213e"/>
|
|
6
|
-
</linearGradient>
|
|
7
|
-
<filter id="glow">
|
|
8
|
-
<feGaussianBlur stdDeviation="2" result="coloredBlur"/>
|
|
9
|
-
<feMerge>
|
|
10
|
-
<feMergeNode in="coloredBlur"/>
|
|
11
|
-
<feMergeNode in="SourceGraphic"/>
|
|
12
|
-
</feMerge>
|
|
13
|
-
</filter>
|
|
14
|
-
</defs>
|
|
15
|
-
|
|
16
|
-
<!-- Background -->
|
|
17
|
-
<rect width="900" height="400" fill="url(#bgGrad)" rx="12"/>
|
|
18
|
-
|
|
19
|
-
<!-- Title -->
|
|
20
|
-
<text x="450" y="35" text-anchor="middle" fill="#ffffff" font-family="system-ui, -apple-system, sans-serif" font-size="18" font-weight="600">Session Mirroring Flow</text>
|
|
21
|
-
|
|
22
|
-
<!-- Participants -->
|
|
23
|
-
<!-- Chrome -->
|
|
24
|
-
<rect x="50" y="60" width="120" height="40" rx="8" fill="#3b82f6" opacity="0.9"/>
|
|
25
|
-
<text x="110" y="85" text-anchor="middle" fill="#ffffff" font-family="system-ui, -apple-system, sans-serif" font-size="13" font-weight="500">Chrome</text>
|
|
26
|
-
<line x1="110" y1="100" x2="110" y2="360" stroke="#3b82f6" stroke-width="2" stroke-dasharray="4"/>
|
|
27
|
-
|
|
28
|
-
<!-- AppleScript -->
|
|
29
|
-
<rect x="220" y="60" width="120" height="40" rx="8" fill="#8b5cf6" opacity="0.9"/>
|
|
30
|
-
<text x="280" y="85" text-anchor="middle" fill="#ffffff" font-family="system-ui, -apple-system, sans-serif" font-size="13" font-weight="500">AppleScript</text>
|
|
31
|
-
<line x1="280" y1="100" x2="280" y2="360" stroke="#8b5cf6" stroke-width="2" stroke-dasharray="4"/>
|
|
32
|
-
|
|
33
|
-
<!-- Token Store -->
|
|
34
|
-
<rect x="390" y="60" width="120" height="40" rx="8" fill="#4ecdc4" opacity="0.9"/>
|
|
35
|
-
<text x="450" y="85" text-anchor="middle" fill="#1a1a2e" font-family="system-ui, -apple-system, sans-serif" font-size="13" font-weight="500">Token Store</text>
|
|
36
|
-
<line x1="450" y1="100" x2="450" y2="360" stroke="#4ecdc4" stroke-width="2" stroke-dasharray="4"/>
|
|
37
|
-
|
|
38
|
-
<!-- MCP Server -->
|
|
39
|
-
<rect x="560" y="60" width="120" height="40" rx="8" fill="#da7756" opacity="0.9"/>
|
|
40
|
-
<text x="620" y="85" text-anchor="middle" fill="#ffffff" font-family="system-ui, -apple-system, sans-serif" font-size="13" font-weight="500">MCP Server</text>
|
|
41
|
-
<line x1="620" y1="100" x2="620" y2="360" stroke="#da7756" stroke-width="2" stroke-dasharray="4"/>
|
|
42
|
-
|
|
43
|
-
<!-- Slack API -->
|
|
44
|
-
<rect x="730" y="60" width="120" height="40" rx="8" fill="#e94560" opacity="0.9"/>
|
|
45
|
-
<text x="790" y="85" text-anchor="middle" fill="#ffffff" font-family="system-ui, -apple-system, sans-serif" font-size="13" font-weight="500">Slack API</text>
|
|
46
|
-
<line x1="790" y1="100" x2="790" y2="360" stroke="#e94560" stroke-width="2" stroke-dasharray="4"/>
|
|
47
|
-
|
|
48
|
-
<!-- Note: Logged into Slack -->
|
|
49
|
-
<rect x="60" y="115" width="100" height="30" rx="4" fill="#3b82f6" opacity="0.2" stroke="#3b82f6" stroke-width="1"/>
|
|
50
|
-
<text x="110" y="135" text-anchor="middle" fill="#93c5fd" font-family="system-ui, -apple-system, sans-serif" font-size="10">Logged into Slack</text>
|
|
51
|
-
|
|
52
|
-
<!-- Arrow 1: Script → Chrome -->
|
|
53
|
-
<line x1="280" y1="160" x2="130" y2="160" stroke="#8b5cf6" stroke-width="2" marker-end="url(#arrowPurple)"/>
|
|
54
|
-
<text x="205" y="153" text-anchor="middle" fill="#c4b5fd" font-family="system-ui, -apple-system, sans-serif" font-size="10">Execute JS in tab</text>
|
|
55
|
-
|
|
56
|
-
<!-- Arrow 2: Chrome → Script (dashed return) -->
|
|
57
|
-
<line x1="130" y1="185" x2="260" y2="185" stroke="#3b82f6" stroke-width="2" stroke-dasharray="5" marker-end="url(#arrowBlue)"/>
|
|
58
|
-
<text x="195" y="200" text-anchor="middle" fill="#93c5fd" font-family="system-ui, -apple-system, sans-serif" font-size="10">xoxc- + xoxd- tokens</text>
|
|
59
|
-
|
|
60
|
-
<!-- Arrow 3: Script → Store -->
|
|
61
|
-
<line x1="300" y1="225" x2="430" y2="225" stroke="#8b5cf6" stroke-width="2" marker-end="url(#arrowPurple)"/>
|
|
62
|
-
<text x="365" y="218" text-anchor="middle" fill="#c4b5fd" font-family="system-ui, -apple-system, sans-serif" font-size="10">Save tokens</text>
|
|
63
|
-
|
|
64
|
-
<!-- Store self-arrow (Keychain) -->
|
|
65
|
-
<path d="M 470 245 Q 500 245 500 260 Q 500 275 470 275" fill="none" stroke="#4ecdc4" stroke-width="2"/>
|
|
66
|
-
<text x="515" y="265" fill="#5eead4" font-family="system-ui, -apple-system, sans-serif" font-size="10">Keychain encrypt</text>
|
|
67
|
-
|
|
68
|
-
<!-- Divider -->
|
|
69
|
-
<line x1="50" y1="300" x2="850" y2="300" stroke="#ffffff" stroke-width="1" opacity="0.2"/>
|
|
70
|
-
<text x="60" y="295" fill="#ffffff" opacity="0.5" font-family="system-ui, -apple-system, sans-serif" font-size="10">Claude requests data</text>
|
|
71
|
-
|
|
72
|
-
<!-- Arrow 4: MCP → Store -->
|
|
73
|
-
<line x1="600" y1="320" x2="470" y2="320" stroke="#da7756" stroke-width="2" marker-end="url(#arrowOrange)"/>
|
|
74
|
-
<text x="535" y="313" text-anchor="middle" fill="#fbbf8c" font-family="system-ui, -apple-system, sans-serif" font-size="10">Load creds</text>
|
|
75
|
-
|
|
76
|
-
<!-- Arrow 5: Store → MCP (return) -->
|
|
77
|
-
<line x1="470" y1="340" x2="600" y2="340" stroke="#4ecdc4" stroke-width="2" stroke-dasharray="5" marker-end="url(#arrowTeal)"/>
|
|
78
|
-
|
|
79
|
-
<!-- Arrow 6: MCP → Slack -->
|
|
80
|
-
<line x1="640" y1="355" x2="770" y2="355" stroke="#da7756" stroke-width="2" marker-end="url(#arrowOrange)"/>
|
|
81
|
-
<text x="705" y="348" text-anchor="middle" fill="#fbbf8c" font-family="system-ui, -apple-system, sans-serif" font-size="10">GET messages</text>
|
|
82
|
-
|
|
83
|
-
<!-- Arrow 7: Slack → MCP (return) -->
|
|
84
|
-
<line x1="770" y1="375" x2="640" y2="375" stroke="#e94560" stroke-width="2" stroke-dasharray="5" marker-end="url(#arrowRed)"/>
|
|
85
|
-
<text x="705" y="390" text-anchor="middle" fill="#fca5a5" font-family="system-ui, -apple-system, sans-serif" font-size="10">Full history</text>
|
|
86
|
-
|
|
87
|
-
<!-- Arrow markers -->
|
|
88
|
-
<defs>
|
|
89
|
-
<marker id="arrowPurple" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto">
|
|
90
|
-
<path d="M0,0 L0,6 L9,3 z" fill="#8b5cf6"/>
|
|
91
|
-
</marker>
|
|
92
|
-
<marker id="arrowBlue" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto">
|
|
93
|
-
<path d="M0,0 L0,6 L9,3 z" fill="#3b82f6"/>
|
|
94
|
-
</marker>
|
|
95
|
-
<marker id="arrowTeal" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto">
|
|
96
|
-
<path d="M0,0 L0,6 L9,3 z" fill="#4ecdc4"/>
|
|
97
|
-
</marker>
|
|
98
|
-
<marker id="arrowOrange" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto">
|
|
99
|
-
<path d="M0,0 L0,6 L9,3 z" fill="#da7756"/>
|
|
100
|
-
</marker>
|
|
101
|
-
<marker id="arrowRed" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto">
|
|
102
|
-
<path d="M0,0 L0,6 L9,3 z" fill="#e94560"/>
|
|
103
|
-
</marker>
|
|
104
|
-
</defs>
|
|
105
|
-
</svg>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|