@vibesharingapp/mcp-server 0.1.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 ADDED
@@ -0,0 +1,169 @@
1
+ # VibeSharing MCP Server
2
+
3
+ **The missing link between your AI coding assistant and your team.**
4
+
5
+ Build prototypes with Claude Code, Cursor, or any AI tool—then instantly share them with your team for feedback. No context switching. No copy-pasting URLs. Just ship and collaborate.
6
+
7
+ ## The Problem
8
+
9
+ You're building fast with AI. Prototypes are flying. But then:
10
+
11
+ - You deploy to Vercel and... forget to tell anyone
12
+ - Your teammate asks "where's that dashboard thing you made?"
13
+ - Feedback lives in Slack threads that disappear
14
+ - Next AI session? All that context is gone
15
+
16
+ **Your AI helps you build. But it can't help you collaborate.**
17
+
18
+ Until now.
19
+
20
+ ## The Solution
21
+
22
+ VibeSharing's MCP server connects Claude Code directly to your team's prototype hub. Every prototype you build becomes instantly shareable, trackable, and open for feedback.
23
+
24
+ ```
25
+ You: "Register this on VibeSharing, it's deployed at my-app.vercel.app"
26
+
27
+ Claude: Done! Your team can now view and leave feedback at:
28
+ vibesharing.app/dashboard/projects/abc123
29
+ ```
30
+
31
+ That's it. Your prototype is live on VibeSharing. Your team gets notified. Feedback flows back to you.
32
+
33
+ ## What You Can Do
34
+
35
+ ### Ship prototypes without leaving your terminal
36
+ ```
37
+ "Deploy this to Vercel and register it on VibeSharing"
38
+ ```
39
+ Claude handles the deployment AND registers it with your team—in one conversation.
40
+
41
+ ### Check what your team thinks
42
+ ```
43
+ "What feedback did I get on the checkout flow prototype?"
44
+ ```
45
+ See comments, suggestions, and resolved issues without opening a browser.
46
+
47
+ ### Keep context alive across sessions
48
+ ```
49
+ "Sync my CLAUDE.md to VibeSharing"
50
+ ```
51
+ Your project context persists on VibeSharing, so any team member (or AI session) can pick up where you left off.
52
+
53
+ ### See all your work in one place
54
+ ```
55
+ "List my prototypes"
56
+ ```
57
+ Every prototype you've registered, with links and recent activity.
58
+
59
+ ## Quick Start
60
+
61
+ ### 1. Install
62
+
63
+ ```bash
64
+ npm install -g @vibesharingapp/mcp-server
65
+ ```
66
+
67
+ ### 2. Get Your Token
68
+
69
+ Sign up at [vibesharing.app](https://vibesharing.app) and grab your deploy token from Account Settings.
70
+
71
+ ### 3. Configure Claude Code
72
+
73
+ Add to your Claude Code settings:
74
+
75
+ ```json
76
+ {
77
+ "mcpServers": {
78
+ "vibesharing": {
79
+ "command": "vibesharing-mcp",
80
+ "env": {
81
+ "VIBESHARING_TOKEN": "vs_your_token_here"
82
+ }
83
+ }
84
+ }
85
+ }
86
+ ```
87
+
88
+ ### 4. Start Building
89
+
90
+ That's it. Ask Claude to register prototypes, check feedback, or sync context. It just works.
91
+
92
+ ## Why This Matters
93
+
94
+ ### For Solo Builders
95
+ Stop losing track of what you've built. Every prototype is catalogued, shareable, and ready for feedback when you need it.
96
+
97
+ ### For Teams
98
+ Finally, visibility into what everyone's shipping. No more "hey, can you send me that link again?" Feedback is structured, threaded, and actionable.
99
+
100
+ ### For Design Leaders
101
+ See the full picture of your team's prototyping velocity. Guide feedback with custom topics. Keep stakeholders in the loop without endless meetings.
102
+
103
+ ## Available Tools
104
+
105
+ | Tool | Description |
106
+ |------|-------------|
107
+ | `register_prototype` | Register a deployed prototype with name, description, and URL |
108
+ | `list_prototypes` | List all prototypes in your organization |
109
+ | `get_feedback` | Get feedback and comments for any prototype |
110
+ | `sync_context` | Push CLAUDE.md or project notes to VibeSharing |
111
+
112
+ ## Environment Variables
113
+
114
+ | Variable | Required | Description |
115
+ |----------|----------|-------------|
116
+ | `VIBESHARING_TOKEN` | Yes | Your deploy token from VibeSharing |
117
+ | `VIBESHARING_URL` | No | Custom API URL (defaults to https://vibesharing.app) |
118
+
119
+ ## Examples
120
+
121
+ ### Register after deploying
122
+ ```
123
+ You: "I just deployed to https://checkout-v2.vercel.app - register it on VibeSharing
124
+ as 'Checkout Flow v2' and mention it simplifies the payment step"
125
+
126
+ Claude: Registered! Your team can view and leave feedback at:
127
+ https://vibesharing.app/dashboard/projects/xyz789
128
+ ```
129
+
130
+ ### Get feedback before your next session
131
+ ```
132
+ You: "Before I continue on the dashboard, what feedback came in?"
133
+
134
+ Claude: 3 new comments on Dashboard Redesign:
135
+ - Sarah: "Love the new nav, but can we make the search more prominent?"
136
+ - Mike: "The loading states feel snappy now"
137
+ - Alex: "Can we add keyboard shortcuts?" [Resolved]
138
+ ```
139
+
140
+ ### Keep your AI context in sync
141
+ ```
142
+ You: "Sync my CLAUDE.md to the Dashboard project on VibeSharing"
143
+
144
+ Claude: Context synced! Your team can now see your project notes at:
145
+ https://vibesharing.app/dashboard/projects/abc123
146
+ ```
147
+
148
+ ## Built for the AI-Native Workflow
149
+
150
+ VibeSharing isn't just another tool to check. It's infrastructure for teams building with AI:
151
+
152
+ - **CLAUDE.md sync** keeps context alive across sessions and team members
153
+ - **Guided feedback topics** help stakeholders give useful input
154
+ - **Email notifications** when prototypes update or get feedback
155
+ - **Works with any deploy target** - Vercel, Netlify, Replit, Lovable, v0, or paste any URL
156
+
157
+ ## Learn More
158
+
159
+ - [VibeSharing](https://vibesharing.app) - Sign up free
160
+ - [Documentation](https://vibesharing.app/get-started) - Full setup guide
161
+ - [GitHub](https://github.com/erova/vibesharing) - Source code
162
+
163
+ ---
164
+
165
+ **Stop building in isolation. Start shipping with your team.**
166
+
167
+ ```bash
168
+ npm install -g @vibesharingapp/mcp-server
169
+ ```
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,307 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
5
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
6
+ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
7
+ // VibeSharing API client
8
+ class VibesharingClient {
9
+ baseUrl;
10
+ token;
11
+ constructor(baseUrl, token) {
12
+ this.baseUrl = baseUrl.replace(/\/$/, "");
13
+ this.token = token;
14
+ }
15
+ async request(path, options = {}) {
16
+ const url = `${this.baseUrl}${path}`;
17
+ const response = await fetch(url, {
18
+ ...options,
19
+ headers: {
20
+ "Content-Type": "application/json",
21
+ Authorization: `Bearer ${this.token}`,
22
+ ...options.headers,
23
+ },
24
+ });
25
+ if (!response.ok) {
26
+ const error = await response.json().catch(() => ({ error: response.statusText }));
27
+ throw new Error(error.error || `API error: ${response.status}`);
28
+ }
29
+ return response.json();
30
+ }
31
+ async registerPrototype(params) {
32
+ return this.request("/api/prototypes", {
33
+ method: "POST",
34
+ body: JSON.stringify(params),
35
+ });
36
+ }
37
+ async listPrototypes() {
38
+ return this.request("/api/prototypes");
39
+ }
40
+ async getPrototype(id) {
41
+ return this.request(`/api/prototypes/${id}`);
42
+ }
43
+ async getFeedback(projectId) {
44
+ return this.request(`/api/feedback?projectId=${projectId}`);
45
+ }
46
+ async syncContext(projectId, content) {
47
+ return this.request("/api/context", {
48
+ method: "POST",
49
+ body: JSON.stringify({ projectId, content }),
50
+ });
51
+ }
52
+ }
53
+ // Get configuration from environment
54
+ const VIBESHARING_URL = process.env.VIBESHARING_URL || "https://vibesharing.app";
55
+ const VIBESHARING_TOKEN = process.env.VIBESHARING_TOKEN;
56
+ if (!VIBESHARING_TOKEN) {
57
+ console.error("Error: VIBESHARING_TOKEN environment variable is required");
58
+ console.error("Get your deploy token from VibeSharing → Account Settings");
59
+ process.exit(1);
60
+ }
61
+ const client = new VibesharingClient(VIBESHARING_URL, VIBESHARING_TOKEN);
62
+ // Create MCP server
63
+ const server = new index_js_1.Server({
64
+ name: "vibesharing",
65
+ version: "0.1.0",
66
+ }, {
67
+ capabilities: {
68
+ tools: {},
69
+ resources: {},
70
+ },
71
+ });
72
+ // Define available tools
73
+ server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => {
74
+ return {
75
+ tools: [
76
+ {
77
+ name: "register_prototype",
78
+ description: "Register a new prototype on VibeSharing. Use this after deploying a prototype to Vercel, Netlify, or any hosting service. Returns the VibeSharing URL where the team can view and leave feedback.",
79
+ inputSchema: {
80
+ type: "object",
81
+ properties: {
82
+ name: {
83
+ type: "string",
84
+ description: "Name of the prototype (e.g., 'Dashboard Redesign v2')",
85
+ },
86
+ description: {
87
+ type: "string",
88
+ description: "Brief description of what this prototype demonstrates",
89
+ },
90
+ external_url: {
91
+ type: "string",
92
+ description: "URL where the prototype is deployed (e.g., https://my-app.vercel.app)",
93
+ },
94
+ parent_project_id: {
95
+ type: "string",
96
+ description: "Optional: ID of parent project if this is a version/iteration",
97
+ },
98
+ },
99
+ required: ["name"],
100
+ },
101
+ },
102
+ {
103
+ name: "list_prototypes",
104
+ description: "List all prototypes in your VibeSharing organization. Shows name, URL, and recent activity.",
105
+ inputSchema: {
106
+ type: "object",
107
+ properties: {},
108
+ },
109
+ },
110
+ {
111
+ name: "get_feedback",
112
+ description: "Get feedback and comments for a specific prototype. Use this to see what the team thinks about a prototype.",
113
+ inputSchema: {
114
+ type: "object",
115
+ properties: {
116
+ project_id: {
117
+ type: "string",
118
+ description: "The VibeSharing project/prototype ID",
119
+ },
120
+ },
121
+ required: ["project_id"],
122
+ },
123
+ },
124
+ {
125
+ name: "sync_context",
126
+ description: "Sync your CLAUDE.md or project context to VibeSharing. This helps maintain context across AI sessions and team members.",
127
+ inputSchema: {
128
+ type: "object",
129
+ properties: {
130
+ project_id: {
131
+ type: "string",
132
+ description: "The VibeSharing project/prototype ID to sync context to",
133
+ },
134
+ content: {
135
+ type: "string",
136
+ description: "The context content (typically contents of CLAUDE.md)",
137
+ },
138
+ },
139
+ required: ["project_id", "content"],
140
+ },
141
+ },
142
+ ],
143
+ };
144
+ });
145
+ // Handle tool calls
146
+ server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
147
+ const { name, arguments: args } = request.params;
148
+ try {
149
+ switch (name) {
150
+ case "register_prototype": {
151
+ const params = args;
152
+ const result = await client.registerPrototype(params);
153
+ return {
154
+ content: [
155
+ {
156
+ type: "text",
157
+ text: `Prototype registered successfully!\n\nName: ${result.project?.name || params.name}\nVibeSharing URL: ${VIBESHARING_URL}/dashboard/projects/${result.project?.id}\n${params.external_url ? `Live URL: ${params.external_url}` : ""}\n\nYour team can now view and leave feedback on this prototype.`,
158
+ },
159
+ ],
160
+ };
161
+ }
162
+ case "list_prototypes": {
163
+ const result = await client.listPrototypes();
164
+ const prototypes = result.prototypes || [];
165
+ if (prototypes.length === 0) {
166
+ return {
167
+ content: [
168
+ {
169
+ type: "text",
170
+ text: "No prototypes found. Use register_prototype to add your first one!",
171
+ },
172
+ ],
173
+ };
174
+ }
175
+ const list = prototypes
176
+ .map((p) => `- ${p.name}\n ID: ${p.id}\n ${p.external_url ? `URL: ${p.external_url}\n ` : ""}Updated: ${new Date(p.updated_at).toLocaleDateString()}`)
177
+ .join("\n\n");
178
+ return {
179
+ content: [
180
+ {
181
+ type: "text",
182
+ text: `Found ${prototypes.length} prototype(s):\n\n${list}`,
183
+ },
184
+ ],
185
+ };
186
+ }
187
+ case "get_feedback": {
188
+ const { project_id } = args;
189
+ const result = await client.getFeedback(project_id);
190
+ const feedback = result.feedback || [];
191
+ if (feedback.length === 0) {
192
+ return {
193
+ content: [
194
+ {
195
+ type: "text",
196
+ text: "No feedback yet for this prototype. Share it with your team to get their thoughts!",
197
+ },
198
+ ],
199
+ };
200
+ }
201
+ const feedbackList = feedback
202
+ .map((f) => {
203
+ const status = f.resolved_at ? " [Resolved]" : "";
204
+ const replies = f.replies && f.replies.length > 0
205
+ ? `\n Replies: ${f.replies.length}`
206
+ : "";
207
+ return `- ${f.user_name}${status}: "${f.content}"\n ${new Date(f.created_at).toLocaleDateString()}${replies}`;
208
+ })
209
+ .join("\n\n");
210
+ return {
211
+ content: [
212
+ {
213
+ type: "text",
214
+ text: `Feedback (${feedback.length} items):\n\n${feedbackList}`,
215
+ },
216
+ ],
217
+ };
218
+ }
219
+ case "sync_context": {
220
+ const { project_id, content } = args;
221
+ await client.syncContext(project_id, content);
222
+ return {
223
+ content: [
224
+ {
225
+ type: "text",
226
+ text: `Context synced successfully to VibeSharing!\n\nProject ID: ${project_id}\nContent length: ${content.length} characters\n\nThis context will be available to team members viewing the prototype.`,
227
+ },
228
+ ],
229
+ };
230
+ }
231
+ default:
232
+ return {
233
+ content: [
234
+ {
235
+ type: "text",
236
+ text: `Unknown tool: ${name}`,
237
+ },
238
+ ],
239
+ isError: true,
240
+ };
241
+ }
242
+ }
243
+ catch (error) {
244
+ return {
245
+ content: [
246
+ {
247
+ type: "text",
248
+ text: `Error: ${error instanceof Error ? error.message : "Unknown error"}`,
249
+ },
250
+ ],
251
+ isError: true,
252
+ };
253
+ }
254
+ });
255
+ // List available resources (prototypes as resources)
256
+ server.setRequestHandler(types_js_1.ListResourcesRequestSchema, async () => {
257
+ try {
258
+ const result = await client.listPrototypes();
259
+ const prototypes = result.prototypes || [];
260
+ return {
261
+ resources: prototypes.map((p) => ({
262
+ uri: `vibesharing://prototype/${p.id}`,
263
+ name: p.name,
264
+ description: p.description || `Prototype: ${p.name}`,
265
+ mimeType: "application/json",
266
+ })),
267
+ };
268
+ }
269
+ catch {
270
+ return { resources: [] };
271
+ }
272
+ });
273
+ // Read a specific resource
274
+ server.setRequestHandler(types_js_1.ReadResourceRequestSchema, async (request) => {
275
+ const { uri } = request.params;
276
+ const match = uri.match(/^vibesharing:\/\/prototype\/(.+)$/);
277
+ if (!match) {
278
+ throw new Error(`Invalid resource URI: ${uri}`);
279
+ }
280
+ const projectId = match[1];
281
+ const [prototype, feedbackResult] = await Promise.all([
282
+ client.getPrototype(projectId),
283
+ client.getFeedback(projectId),
284
+ ]);
285
+ return {
286
+ contents: [
287
+ {
288
+ uri,
289
+ mimeType: "application/json",
290
+ text: JSON.stringify({
291
+ prototype: prototype.project,
292
+ feedback: feedbackResult.feedback,
293
+ }, null, 2),
294
+ },
295
+ ],
296
+ };
297
+ });
298
+ // Start the server
299
+ async function main() {
300
+ const transport = new stdio_js_1.StdioServerTransport();
301
+ await server.connect(transport);
302
+ console.error("VibeSharing MCP server running");
303
+ }
304
+ main().catch((error) => {
305
+ console.error("Fatal error:", error);
306
+ process.exit(1);
307
+ });
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@vibesharingapp/mcp-server",
3
+ "version": "0.1.0",
4
+ "description": "MCP server for VibeSharing - register prototypes and get feedback directly from Claude Code",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "vibesharing-mcp": "./dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "README.md"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "dev": "tsc --watch",
17
+ "start": "node dist/index.js",
18
+ "prepublishOnly": "npm run build"
19
+ },
20
+ "keywords": [
21
+ "mcp",
22
+ "model-context-protocol",
23
+ "claude",
24
+ "claude-code",
25
+ "vibesharing",
26
+ "prototypes",
27
+ "feedback",
28
+ "collaboration",
29
+ "ai",
30
+ "cursor",
31
+ "vibe-coding"
32
+ ],
33
+ "author": "VibeSharing <hello@vibesharing.app>",
34
+ "license": "MIT",
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "git+https://github.com/erova/vibesharing.git",
38
+ "directory": "mcp-server"
39
+ },
40
+ "bugs": {
41
+ "url": "https://github.com/erova/vibesharing/issues"
42
+ },
43
+ "homepage": "https://vibesharing.app",
44
+ "engines": {
45
+ "node": ">=18.0.0"
46
+ },
47
+ "dependencies": {
48
+ "@modelcontextprotocol/sdk": "^1.0.0"
49
+ },
50
+ "devDependencies": {
51
+ "@types/node": "^20.0.0",
52
+ "typescript": "^5.0.0"
53
+ }
54
+ }