slashvibe-mcp 0.2.8 → 0.2.9
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 +40 -58
- package/config.js +5 -142
- package/crypto.js +8 -3
- package/index.js +193 -58
- package/notify.js +0 -97
- package/package.json +3 -5
- package/protocol/index.js +1 -88
- package/store/api.js +68 -289
- package/tools/_actions.js +0 -106
- package/tools/artifact-create.js +9 -4
- package/tools/artifact-view.js +1 -31
- package/tools/artifacts-buy.js +111 -0
- package/tools/artifacts-price.js +103 -0
- package/tools/connect.js +284 -0
- package/tools/crossword.js +1 -17
- package/tools/discover.js +1 -1
- package/tools/dm.js +69 -39
- package/tools/drawing.js +1 -1
- package/tools/echo.js +0 -16
- package/tools/feed.js +3 -16
- package/tools/game.js +2 -2
- package/tools/gigs-apply.js +99 -0
- package/tools/gigs-browse.js +114 -0
- package/tools/gigs-complete.js +128 -0
- package/tools/gigs-post.js +140 -0
- package/tools/handoff.js +1 -7
- package/tools/help.js +1 -1
- package/tools/inbox.js +27 -149
- package/tools/init.js +36 -648
- package/tools/live-off.js +109 -0
- package/tools/live-watch.js +176 -0
- package/tools/live.js +128 -0
- package/tools/party-game.js +1 -1
- package/tools/presence-agent.js +0 -7
- package/tools/proof-of-work.js +148 -0
- package/tools/report.js +1 -1
- package/tools/sessions-browse.js +105 -0
- package/tools/settings.js +3 -38
- package/tools/ship.js +1 -1
- package/tools/solo-game.js +1 -1
- package/tools/start.js +90 -197
- package/tools/wallet.js +176 -87
- package/tools/whats-happening.js +125 -0
- package/tools/who.js +2 -24
- package/tools/x-mentions.js +1 -1
- package/version.json +3 -12
- package/LICENSE +0 -21
- package/intelligence/index.js +0 -38
- package/intelligence/infer.js +0 -316
- package/intelligence/patterns.js +0 -651
- package/intelligence/proactive.js +0 -358
- package/intelligence/serendipity.js +0 -306
- package/memory.js +0 -166
- package/store/sqlite.js +0 -347
- package/tools/_discovery-enhanced.js +0 -290
- package/tools/_discovery.js +0 -346
- package/tools/_proactive-discovery.js +0 -301
- package/tools/admin-inbox.js +0 -218
- package/tools/agent-treasury.js +0 -288
- package/tools/arcade.js +0 -173
- package/tools/ask-expert.js +0 -160
- package/tools/auto-suggest-connections.js +0 -304
- package/tools/become-expert.js +0 -150
- package/tools/bootstrap-skills.js +0 -231
- package/tools/bridge-dashboard.js +0 -342
- package/tools/bridge-health.js +0 -400
- package/tools/bridge-live.js +0 -384
- package/tools/bridges.js +0 -383
- package/tools/collaborative-drawing.js +0 -286
- package/tools/colorguess.js +0 -281
- package/tools/discover-insights.js +0 -379
- package/tools/discover-momentum.js +0 -256
- package/tools/discovery-analytics.js +0 -345
- package/tools/discovery-auto-suggest.js +0 -275
- package/tools/discovery-bootstrap.js +0 -267
- package/tools/discovery-daily.js +0 -375
- package/tools/discovery-dashboard.js +0 -385
- package/tools/discovery-digest.js +0 -314
- package/tools/discovery-hub.js +0 -357
- package/tools/discovery-insights.js +0 -384
- package/tools/discovery-momentum.js +0 -281
- package/tools/discovery-monitor.js +0 -319
- package/tools/discovery-proactive.js +0 -300
- package/tools/draw.js +0 -317
- package/tools/farcaster.js +0 -307
- package/tools/forget.js +0 -119
- package/tools/games-catalog.js +0 -376
- package/tools/games.js +0 -313
- package/tools/genesis.js +0 -233
- package/tools/guessnumber.js +0 -194
- package/tools/hangman.js +0 -129
- package/tools/l2-bridge.js +0 -272
- package/tools/l2-status.js +0 -217
- package/tools/l2.js +0 -206
- package/tools/migrate.js +0 -156
- package/tools/mint.js +0 -377
- package/tools/multiplayer-tictactoe.js +0 -303
- package/tools/notifications.js +0 -415
- package/tools/observe.js +0 -200
- package/tools/onboarding.js +0 -147
- package/tools/pulse.js +0 -218
- package/tools/recall.js +0 -147
- package/tools/remember.js +0 -86
- package/tools/reputation.js +0 -175
- package/tools/riddle.js +0 -240
- package/tools/run-bootstrap.js +0 -69
- package/tools/shipback.js +0 -326
- package/tools/skills-analytics.js +0 -349
- package/tools/skills-bootstrap.js +0 -301
- package/tools/skills-dashboard.js +0 -268
- package/tools/skills.js +0 -380
- package/tools/smart-intro.js +0 -353
- package/tools/social-processor.js +0 -445
- package/tools/storybuilder.js +0 -331
- package/tools/tag-suggestions.js +0 -257
- package/tools/telegram-bot.js +0 -183
- package/tools/telegram-setup.js +0 -214
- package/tools/tip.js +0 -120
- package/tools/token.js +0 -103
- package/tools/twentyquestions.js +0 -143
- package/tools/webhook-test.js +0 -388
- package/tools/workshop.js +0 -327
package/README.md
CHANGED
|
@@ -1,87 +1,69 @@
|
|
|
1
|
-
#
|
|
1
|
+
# vibe-mcp
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
## What is /vibe?
|
|
6
|
-
|
|
7
|
-
/vibe brings social connection to the terminal. While you're building with Claude Code, /vibe lets you:
|
|
8
|
-
|
|
9
|
-
- **See who's online** - Know when other developers are in flow
|
|
10
|
-
- **Send DMs** - Message fellow builders without leaving your terminal
|
|
11
|
-
- **Share your presence** - Let others know what you're working on
|
|
12
|
-
- **Build reputation** - Your sessions become proof of work
|
|
3
|
+
Social layer for Claude Code. DMs, presence, and connection between AI-assisted developers.
|
|
13
4
|
|
|
14
5
|
## Installation
|
|
15
6
|
|
|
16
7
|
```bash
|
|
17
|
-
|
|
8
|
+
# Install globally
|
|
9
|
+
npm install -g vibe-mcp
|
|
10
|
+
|
|
11
|
+
# Or add to Claude Code MCP config
|
|
12
|
+
claude mcp add vibe-mcp
|
|
18
13
|
```
|
|
19
14
|
|
|
20
|
-
|
|
15
|
+
## Manual Setup
|
|
16
|
+
|
|
17
|
+
Add to `~/.claude.json`:
|
|
21
18
|
|
|
22
19
|
```json
|
|
23
20
|
{
|
|
24
21
|
"mcpServers": {
|
|
25
22
|
"vibe": {
|
|
26
23
|
"command": "npx",
|
|
27
|
-
"args": ["-
|
|
24
|
+
"args": ["vibe-mcp"],
|
|
25
|
+
"env": {
|
|
26
|
+
"VIBE_API_URL": "https://www.slashvibe.dev"
|
|
27
|
+
}
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
```
|
|
32
32
|
|
|
33
|
-
##
|
|
34
|
-
|
|
35
|
-
1. Install the MCP server
|
|
36
|
-
2. Authenticate: `vibe_auth` tool will guide you
|
|
37
|
-
3. Check who's online: `vibe_presence`
|
|
38
|
-
4. Send a message: `vibe_dm`
|
|
39
|
-
|
|
40
|
-
## Available Tools
|
|
33
|
+
## Features
|
|
41
34
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
| `vibe_inbox` | Check your messages |
|
|
48
|
-
| `vibe_ship` | Announce what you shipped |
|
|
49
|
-
| `vibe_idea` | Share an idea with the community |
|
|
50
|
-
| `vibe_discover` | Find interesting builders |
|
|
51
|
-
| `vibe_remember` | Save context about a connection |
|
|
52
|
-
| `vibe_recall` | Recall memories about someone |
|
|
35
|
+
- **Presence** - See who's online building with Claude Code
|
|
36
|
+
- **DMs** - Direct messages between developers
|
|
37
|
+
- **Memory** - Remember context about connections
|
|
38
|
+
- **Status** - Share what you're working on
|
|
39
|
+
- **Games** - Play tic-tac-toe while coding
|
|
53
40
|
|
|
54
|
-
##
|
|
41
|
+
## Commands
|
|
55
42
|
|
|
56
|
-
|
|
43
|
+
Once installed, use these in Claude Code:
|
|
57
44
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
45
|
+
| Command | Description |
|
|
46
|
+
|---------|-------------|
|
|
47
|
+
| `vibe` | Check inbox and see who's online |
|
|
48
|
+
| `vibe who` | List online users |
|
|
49
|
+
| `vibe dm @handle "message"` | Send a DM |
|
|
50
|
+
| `vibe status shipping` | Set your status |
|
|
51
|
+
| `vibe remember @handle "note"` | Save a memory |
|
|
52
|
+
| `vibe recall @handle` | Recall memories |
|
|
61
53
|
|
|
62
|
-
##
|
|
54
|
+
## API
|
|
63
55
|
|
|
64
|
-
|
|
56
|
+
The MCP server connects to `slashvibe.dev` for:
|
|
57
|
+
- User presence and discovery
|
|
58
|
+
- Message routing
|
|
59
|
+
- Identity verification
|
|
65
60
|
|
|
66
|
-
|
|
61
|
+
## Related
|
|
67
62
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
- Report bugs via [GitHub Issues](https://github.com/VibeCodingInc/vibe-mcp/issues)
|
|
73
|
-
- Propose features via [Discussions](https://github.com/VibeCodingInc/vibe-mcp/discussions)
|
|
74
|
-
- Submit PRs for review
|
|
63
|
+
- [slashvibe.dev](https://slashvibe.dev) - Web presence
|
|
64
|
+
- [Spirit Protocol](https://spiritprotocol.io) - Parent ecosystem
|
|
65
|
+
- [AIRC](https://airc.chat) - Agent identity protocol
|
|
75
66
|
|
|
76
67
|
## License
|
|
77
68
|
|
|
78
|
-
MIT
|
|
79
|
-
|
|
80
|
-
## Links
|
|
81
|
-
|
|
82
|
-
- [slashvibe.dev](https://slashvibe.dev) - The platform
|
|
83
|
-
- [Twitter](https://twitter.com/slashvibe) - Updates
|
|
84
|
-
|
|
85
|
-
---
|
|
86
|
-
|
|
87
|
-
Built with obsession by [Slash Vibe, Inc.](https://slashvibe.dev)
|
|
69
|
+
MIT
|
package/config.js
CHANGED
|
@@ -66,15 +66,7 @@ function save(config) {
|
|
|
66
66
|
publicKey: config.publicKey || existing.publicKey || null,
|
|
67
67
|
privateKey: config.privateKey || existing.privateKey || null,
|
|
68
68
|
// Guided mode (AskUserQuestion menus)
|
|
69
|
-
guided_mode: config.guided_mode !== undefined ? config.guided_mode : existing.guided_mode
|
|
70
|
-
// Notification level
|
|
71
|
-
notifications: config.notifications || existing.notifications || null,
|
|
72
|
-
// GitHub Activity settings
|
|
73
|
-
github_activity_enabled: config.github_activity_enabled !== undefined ? config.github_activity_enabled : existing.github_activity_enabled,
|
|
74
|
-
github_activity_privacy: config.github_activity_privacy || existing.github_activity_privacy || null,
|
|
75
|
-
// Privy OAuth token (persisted across MCP process restarts)
|
|
76
|
-
privyToken: config.privyToken || existing.privyToken || null,
|
|
77
|
-
authMethod: config.authMethod || existing.authMethod || null
|
|
69
|
+
guided_mode: config.guided_mode !== undefined ? config.guided_mode : existing.guided_mode
|
|
78
70
|
};
|
|
79
71
|
fs.writeFileSync(PRIMARY_CONFIG, JSON.stringify(data, null, 2));
|
|
80
72
|
}
|
|
@@ -211,77 +203,11 @@ function setAuthToken(token, sessionId = null) {
|
|
|
211
203
|
}
|
|
212
204
|
|
|
213
205
|
function getAuthToken() {
|
|
214
|
-
// First check session data
|
|
215
206
|
const data = getSessionData();
|
|
216
207
|
if (data?.token) return data.token;
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
return cfg?.privyToken || null;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
/**
|
|
224
|
-
* Save Privy JWT token (used after browser OAuth flow)
|
|
225
|
-
* @param {string} token - Privy access token
|
|
226
|
-
*/
|
|
227
|
-
function savePrivyToken(token) {
|
|
228
|
-
// Save to session data
|
|
229
|
-
const data = getSessionData() || {};
|
|
230
|
-
saveSessionData({
|
|
231
|
-
...data,
|
|
232
|
-
sessionId: data.sessionId || generateSessionId(),
|
|
233
|
-
token,
|
|
234
|
-
authMethod: 'privy' // Track that this is a Privy token
|
|
235
|
-
});
|
|
236
|
-
|
|
237
|
-
// Also save to shared config for persistence across MCP restarts
|
|
238
|
-
const cfg = load();
|
|
239
|
-
cfg.privyToken = token;
|
|
240
|
-
cfg.authMethod = 'privy';
|
|
241
|
-
save(cfg);
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
/**
|
|
245
|
-
* Check if user has Privy auth (vs legacy keypair)
|
|
246
|
-
*/
|
|
247
|
-
function hasPrivyAuth() {
|
|
248
|
-
const data = getSessionData();
|
|
249
|
-
if (data?.authMethod === 'privy' && data?.token) return true;
|
|
250
|
-
|
|
251
|
-
const cfg = load();
|
|
252
|
-
return cfg?.authMethod === 'privy' && cfg?.privyToken;
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
/**
|
|
256
|
-
* Remove keypair after migration to Privy
|
|
257
|
-
* Clears private key from config (security improvement)
|
|
258
|
-
*/
|
|
259
|
-
function removeKeypair() {
|
|
260
|
-
const cfg = load();
|
|
261
|
-
delete cfg.publicKey;
|
|
262
|
-
delete cfg.privateKey;
|
|
263
|
-
save(cfg);
|
|
264
|
-
|
|
265
|
-
// Also clear from session
|
|
266
|
-
const data = getSessionData();
|
|
267
|
-
if (data) {
|
|
268
|
-
delete data.publicKey;
|
|
269
|
-
delete data.privateKey;
|
|
270
|
-
saveSessionData(data);
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
/**
|
|
275
|
-
* Get auth URL for browser-based GitHub OAuth
|
|
276
|
-
* @param {string|null} handle - Custom handle (optional - defaults to GitHub username)
|
|
277
|
-
*/
|
|
278
|
-
function getAuthUrl(handle = null) {
|
|
279
|
-
const apiUrl = getApiUrl();
|
|
280
|
-
if (handle) {
|
|
281
|
-
return `${apiUrl}/api/auth/github?handle=${encodeURIComponent(handle)}`;
|
|
282
|
-
}
|
|
283
|
-
// No handle = use GitHub username as handle
|
|
284
|
-
return `${apiUrl}/api/auth/github`;
|
|
208
|
+
// Fall back to privyToken in config (for persistence across sessions)
|
|
209
|
+
const config = load();
|
|
210
|
+
return config?.privyToken || null;
|
|
285
211
|
}
|
|
286
212
|
|
|
287
213
|
function clearSession() {
|
|
@@ -325,61 +251,11 @@ function setNotifications(level) {
|
|
|
325
251
|
save(config);
|
|
326
252
|
}
|
|
327
253
|
|
|
328
|
-
// GitHub Activity settings
|
|
329
|
-
// Shows shipping status based on GitHub commit activity
|
|
330
|
-
// Default: false (opt-in for privacy)
|
|
331
|
-
function getGithubActivityEnabled() {
|
|
332
|
-
const config = load();
|
|
333
|
-
return config.github_activity_enabled === true;
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
function setGithubActivityEnabled(enabled) {
|
|
337
|
-
const config = load();
|
|
338
|
-
config.github_activity_enabled = enabled;
|
|
339
|
-
save(config);
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
// GitHub Activity privacy level
|
|
343
|
-
// Levels: "full" | "status_only" | "off"
|
|
344
|
-
// - full: Show repos, commit counts, tech stack (default when enabled)
|
|
345
|
-
// - status_only: Just show shipping badge (🔥/⚡), no details
|
|
346
|
-
// - off: Disabled completely
|
|
347
|
-
function getGithubActivityPrivacy() {
|
|
348
|
-
const config = load();
|
|
349
|
-
return config.github_activity_privacy || 'full';
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
function setGithubActivityPrivacy(level) {
|
|
353
|
-
const validLevels = ['full', 'status_only', 'off'];
|
|
354
|
-
if (!validLevels.includes(level)) {
|
|
355
|
-
throw new Error(`Invalid privacy level. Use: ${validLevels.join(', ')}`);
|
|
356
|
-
}
|
|
357
|
-
const config = load();
|
|
358
|
-
config.github_activity_privacy = level;
|
|
359
|
-
save(config);
|
|
360
|
-
}
|
|
361
|
-
|
|
362
254
|
// API URL — central endpoint for all API calls
|
|
363
255
|
function getApiUrl() {
|
|
364
256
|
return process.env.VIBE_API_URL || 'https://www.slashvibe.dev';
|
|
365
257
|
}
|
|
366
258
|
|
|
367
|
-
// ─────────────────────────────────────────────────────────────
|
|
368
|
-
// Generic key-value store for ephemeral session state
|
|
369
|
-
// Used by presence-agent, mute, and other tools for runtime state
|
|
370
|
-
// NOT persisted to disk — resets when MCP server restarts
|
|
371
|
-
// ─────────────────────────────────────────────────────────────
|
|
372
|
-
const sessionState = {};
|
|
373
|
-
|
|
374
|
-
function get(key, defaultValue = null) {
|
|
375
|
-
return sessionState[key] !== undefined ? sessionState[key] : defaultValue;
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
function set(key, value) {
|
|
379
|
-
sessionState[key] = value;
|
|
380
|
-
return value;
|
|
381
|
-
}
|
|
382
|
-
|
|
383
259
|
module.exports = {
|
|
384
260
|
VIBE_DIR,
|
|
385
261
|
CONFIG_FILE,
|
|
@@ -403,18 +279,5 @@ module.exports = {
|
|
|
403
279
|
setGuidedMode,
|
|
404
280
|
getNotifications,
|
|
405
281
|
setNotifications,
|
|
406
|
-
|
|
407
|
-
getGithubActivityEnabled,
|
|
408
|
-
setGithubActivityEnabled,
|
|
409
|
-
getGithubActivityPrivacy,
|
|
410
|
-
setGithubActivityPrivacy,
|
|
411
|
-
getApiUrl,
|
|
412
|
-
// Privy OAuth helpers
|
|
413
|
-
savePrivyToken,
|
|
414
|
-
hasPrivyAuth,
|
|
415
|
-
removeKeypair,
|
|
416
|
-
getAuthUrl,
|
|
417
|
-
// Generic key-value for ephemeral session state
|
|
418
|
-
get,
|
|
419
|
-
set
|
|
282
|
+
getApiUrl
|
|
420
283
|
};
|
package/crypto.js
CHANGED
|
@@ -143,9 +143,10 @@ function generateMessageId() {
|
|
|
143
143
|
* @param {string} [params.body] Message body
|
|
144
144
|
* @param {object} [params.payload] Message payload
|
|
145
145
|
* @param {string} privateKeyBase64 Sender's private key
|
|
146
|
+
* @param {string} publicKeyBase64 Sender's public key (required for verification)
|
|
146
147
|
* @returns {object} Complete signed message
|
|
147
148
|
*/
|
|
148
|
-
function createSignedMessage({ from, to, body, payload }, privateKeyBase64) {
|
|
149
|
+
function createSignedMessage({ from, to, body, payload }, privateKeyBase64, publicKeyBase64) {
|
|
149
150
|
const message = {
|
|
150
151
|
v: '0.1',
|
|
151
152
|
id: generateMessageId(),
|
|
@@ -158,8 +159,9 @@ function createSignedMessage({ from, to, body, payload }, privateKeyBase64) {
|
|
|
158
159
|
if (body) message.body = body;
|
|
159
160
|
if (payload) message.payload = payload;
|
|
160
161
|
|
|
161
|
-
// Sign
|
|
162
|
+
// Sign and include public key for verification
|
|
162
163
|
message.signature = sign(message, privateKeyBase64);
|
|
164
|
+
message.publicKey = publicKeyBase64;
|
|
163
165
|
|
|
164
166
|
return message;
|
|
165
167
|
}
|
|
@@ -171,9 +173,10 @@ function createSignedMessage({ from, to, body, payload }, privateKeyBase64) {
|
|
|
171
173
|
* @param {string} status Status (online/idle/busy/offline)
|
|
172
174
|
* @param {string} [context] Activity context
|
|
173
175
|
* @param {string} privateKeyBase64 User's private key
|
|
176
|
+
* @param {string} publicKeyBase64 User's public key (required for verification)
|
|
174
177
|
* @returns {object} Signed heartbeat
|
|
175
178
|
*/
|
|
176
|
-
function createSignedHeartbeat(handle, status, context, privateKeyBase64) {
|
|
179
|
+
function createSignedHeartbeat(handle, status, context, privateKeyBase64, publicKeyBase64) {
|
|
177
180
|
const heartbeat = {
|
|
178
181
|
handle,
|
|
179
182
|
status,
|
|
@@ -183,7 +186,9 @@ function createSignedHeartbeat(handle, status, context, privateKeyBase64) {
|
|
|
183
186
|
|
|
184
187
|
if (context) heartbeat.context = context;
|
|
185
188
|
|
|
189
|
+
// Sign and include public key for verification
|
|
186
190
|
heartbeat.signature = sign(heartbeat, privateKeyBase64);
|
|
191
|
+
heartbeat.publicKey = publicKeyBase64;
|
|
187
192
|
|
|
188
193
|
return heartbeat;
|
|
189
194
|
}
|