@vibesharingapp/mcp-server 0.4.1 → 0.5.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.
Files changed (3) hide show
  1. package/README.md +56 -35
  2. package/dist/index.js +132 -21
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -22,21 +22,26 @@ Until now.
22
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
23
 
24
24
  ```
25
- You: "Register this on VibeSharing, it's deployed at my-app.vercel.app"
25
+ You: "Post this prototype to VibeSharing"
26
26
 
27
- Claude: Done! Your team can now view and leave feedback at:
28
- vibesharing.app/dashboard/projects/abc123
27
+ Claude: I found these collections in your org:
28
+ 1. All Hero Use Cases
29
+ 2. Compliance Hub
30
+ 3. Internal Tools
31
+
32
+ Which collection should this go in? And do you want a custom URL
33
+ like erg-v3-teams.vercel.app?
29
34
  ```
30
35
 
31
- That's it. Your prototype is live on VibeSharing. Your team gets notified. Feedback flows back to you.
36
+ No guessing. No duplicates. Just a quick confirmation and your prototype is live.
32
37
 
33
38
  ## What You Can Do
34
39
 
35
40
  ### Ship prototypes without leaving your terminal
36
41
  ```
37
- "Deploy this to Vercel and register it on VibeSharing"
42
+ "Deploy this to VibeSharing in the Hero Use Cases collection as erg-v3-teams"
38
43
  ```
39
- Claude handles the deployment AND registers it with your team—in one conversation.
44
+ Claude confirms the collection, names the deployment, and handles everything—GitHub repo, Vercel deploy, team registration—in one conversation.
40
45
 
41
46
  ### Check what your team thinks
42
47
  ```
@@ -53,32 +58,34 @@ Your project context persists on VibeSharing, so any team member (or AI session)
53
58
  ### See all your work in one place
54
59
  ```
55
60
  "List my prototypes"
61
+ "Search collections for hero"
56
62
  ```
57
- Every prototype you've registered, with links and recent activity.
63
+ Every prototype you've registered, with links and recent activity. Fuzzy search included.
58
64
 
59
65
  ## Quick Start
60
66
 
61
- ### 1. Install
62
-
63
- ```bash
64
- npm install -g @vibesharingapp/mcp-server
65
- ```
66
-
67
- ### 2. Get Your Token & Connect GitHub
67
+ ### 1. Get Your Token & Connect GitHub
68
68
 
69
69
  Sign up at [vibesharing.app](https://vibesharing.app), then go to [Account Settings](https://vibesharing.app/dashboard/account) to:
70
70
  - **Connect your GitHub account** — required for Push to Deploy (gives you automatic push access to prototype repos)
71
71
  - **Copy your deploy token** — needed for the MCP server config below
72
72
 
73
- ### 3. Configure Claude Code
73
+ ### 2. Configure Claude Code
74
74
 
75
- Add to your Claude Code settings:
75
+ ```bash
76
+ claude mcp add vibesharing \
77
+ -e VIBESHARING_TOKEN=vs_your_token_here \
78
+ -- npx -y @vibesharingapp/mcp-server@latest
79
+ ```
80
+
81
+ Or add to your Claude Code settings manually:
76
82
 
77
83
  ```json
78
84
  {
79
85
  "mcpServers": {
80
86
  "vibesharing": {
81
- "command": "vibesharing-mcp",
87
+ "command": "npx",
88
+ "args": ["-y", "@vibesharingapp/mcp-server@latest"],
82
89
  "env": {
83
90
  "VIBESHARING_TOKEN": "vs_your_token_here"
84
91
  }
@@ -87,7 +94,9 @@ Add to your Claude Code settings:
87
94
  }
88
95
  ```
89
96
 
90
- ### 4. Start Building
97
+ Using `@latest` ensures you always get new features and fixes automatically.
98
+
99
+ ### 3. Start Building
91
100
 
92
101
  That's it. Ask Claude to register prototypes, check feedback, or sync context. It just works.
93
102
 
@@ -106,11 +115,21 @@ See the full picture of your team's prototyping velocity. Guide feedback with cu
106
115
 
107
116
  | Tool | Description |
108
117
  |------|-------------|
109
- | `deploy_prototype` | **NEW** Deploy code directly to VibeSharing (builds & hosts it for you) |
118
+ | `resolve_target` | **Start here.** Fuzzy-matches collection/project names and confirms where to deploy before proceeding. |
119
+ | `import_repo` | Import a GitHub repo into VibeSharing with a named Vercel deployment |
120
+ | `deploy_files` | Deploy multi-file projects to VibeSharing with named deployments |
121
+ | `deploy_prototype` | Deploy a single code file directly |
110
122
  | `register_prototype` | Register an already-deployed prototype with name, description, and URL |
111
- | `list_prototypes` | List all prototypes in your organization |
123
+ | `list_prototypes` | List/search all prototypes in your organization |
124
+ | `list_collections` | List/search all collections |
112
125
  | `get_feedback` | Get feedback and comments for any prototype |
113
126
  | `sync_context` | Push CLAUDE.md, AGENTS.md, or project notes to VibeSharing |
127
+ | `create_collection` | Create a new collection |
128
+ | `upload_source` | Upload source code to an existing prototype |
129
+ | `add_context_link` | Attach reference links (Figma, PRDs, docs) to collections or projects |
130
+ | `list_context_links` | List reference links on a collection or project |
131
+ | `remove_context_link` | Remove a reference link |
132
+ | `verify_token` | Check that your deploy token is valid |
114
133
 
115
134
  ## Environment Variables
116
135
 
@@ -121,25 +140,23 @@ See the full picture of your team's prototyping velocity. Guide feedback with cu
121
140
 
122
141
  ## Examples
123
142
 
124
- ### Deploy directly from Claude Code
143
+ ### Deploy with a named URL
125
144
  ```
126
- You: "Deploy this to VibeSharing as 'Checkout Flow v2'"
145
+ You: "Deploy this to VibeSharing as erg-v3-teams in the Hero Use Cases collection"
127
146
 
128
- Claude: Deployed successfully!
147
+ Claude: Deployed!
129
148
 
130
- Live URL: https://proto-checkout-flow-v2-abc123.vercel.app
149
+ Live URL: https://erg-v3-teams.vercel.app
131
150
  VibeSharing: https://vibesharing.app/dashboard/projects/xyz789
132
151
 
133
152
  Your team can now view the prototype and leave feedback.
134
153
  ```
135
154
 
136
- ### Register after deploying
155
+ ### Fuzzy search for collections
137
156
  ```
138
- You: "I just deployed to https://checkout-v2.vercel.app - register it on VibeSharing
139
- as 'Checkout Flow v2' and mention it simplifies the payment step"
157
+ You: "Put this in the hero collection"
140
158
 
141
- Claude: Registered! Your team can view and leave feedback at:
142
- https://vibesharing.app/dashboard/projects/xyz789
159
+ Claude: I found "All Hero Use Cases" is that the right collection?
143
160
  ```
144
161
 
145
162
  ### Get feedback before your next session
@@ -154,7 +171,7 @@ Claude: 3 new comments on Dashboard Redesign:
154
171
 
155
172
  ### Keep your AI context in sync
156
173
  ```
157
- You: "Sync my CLAUDE.md (or AGENTS.md) to the Dashboard project on VibeSharing"
174
+ You: "Sync my CLAUDE.md to the Dashboard project on VibeSharing"
158
175
 
159
176
  Claude: Context synced! Your team can now see your project notes at:
160
177
  https://vibesharing.app/dashboard/projects/abc123
@@ -164,21 +181,25 @@ Claude: Context synced! Your team can now see your project notes at:
164
181
 
165
182
  VibeSharing isn't just another tool to check. It's infrastructure for teams building with AI:
166
183
 
184
+ - **Smart deploy targeting** — fuzzy-matches collections and projects so you don't need exact IDs
185
+ - **Named deployments** — deterministic URLs like `erg-v3-teams.vercel.app` instead of random hashes
167
186
  - **Context file sync** (CLAUDE.md, AGENTS.md) keeps context alive across sessions and team members
168
187
  - **Guided feedback topics** help stakeholders give useful input
169
188
  - **Email notifications** when prototypes update or get feedback
170
- - **Works with any deploy target** - Vercel, Netlify, Replit, Lovable, v0, or paste any URL
189
+ - **Works with any deploy target** Vercel, Netlify, Replit, Lovable, v0, or paste any URL
171
190
 
172
191
  ## Learn More
173
192
 
174
- - [VibeSharing](https://vibesharing.app) - Sign up free
175
- - [Documentation](https://vibesharing.app/get-started) - Full setup guide
176
- - [GitHub](https://github.com/erova/vibesharing) - Source code
193
+ - [VibeSharing](https://vibesharing.app) Sign up free
194
+ - [Documentation](https://vibesharing.app/get-started) Full setup guide
195
+ - [GitHub](https://github.com/erova/vibesharing) Source code
177
196
 
178
197
  ---
179
198
 
180
199
  **Stop building in isolation. Start shipping with your team.**
181
200
 
182
201
  ```bash
183
- npm install -g @vibesharingapp/mcp-server
202
+ claude mcp add vibesharing \
203
+ -e VIBESHARING_TOKEN=vs_your_token_here \
204
+ -- npx -y @vibesharingapp/mcp-server@latest
184
205
  ```
package/dist/index.js CHANGED
@@ -59,8 +59,37 @@ class VibesharingClient {
59
59
  async getPrototype(id) {
60
60
  return this.request(`/api/prototypes/${id}`);
61
61
  }
62
- async getFeedback(projectId) {
63
- return this.request(`/api/feedback?projectId=${projectId}`);
62
+ async getFeedback(projectId, filters) {
63
+ const params = new URLSearchParams({ projectId });
64
+ if (filters?.status)
65
+ params.set("status", filters.status);
66
+ if (filters?.priority)
67
+ params.set("priority", filters.priority);
68
+ if (filters?.assigned_to)
69
+ params.set("assignedTo", filters.assigned_to);
70
+ return this.request(`/api/feedback?${params.toString()}`);
71
+ }
72
+ async triageFeedback(feedbackIds, updates) {
73
+ if (feedbackIds.length === 1) {
74
+ return this.request("/api/feedback", {
75
+ method: "PATCH",
76
+ body: JSON.stringify({
77
+ feedbackId: feedbackIds[0],
78
+ status: updates.status,
79
+ priority: updates.priority,
80
+ assignedTo: updates.assigned_to,
81
+ }),
82
+ });
83
+ }
84
+ return this.request("/api/feedback/bulk", {
85
+ method: "PATCH",
86
+ body: JSON.stringify({
87
+ feedbackIds,
88
+ status: updates.status,
89
+ priority: updates.priority,
90
+ assignedTo: updates.assigned_to,
91
+ }),
92
+ });
64
93
  }
65
94
  async syncContext(projectId, content) {
66
95
  return this.request("/api/context", {
@@ -178,20 +207,21 @@ function fuzzyMatch(query, items, getName, threshold = 0.3) {
178
207
  .sort((a, b) => b.score - a.score);
179
208
  }
180
209
  // ---- Version tracking & What's New ----
181
- const CURRENT_VERSION = "0.4.1";
210
+ const CURRENT_VERSION = "0.5.0";
182
211
  const WHATS_NEW = {
183
- "0.4.0": [
184
- "🆕 VibeSharing MCP v0.4.0 — What's New:",
212
+ "0.5.0": [
213
+ "🆕 VibeSharing MCP v0.5.0 — What's New:",
185
214
  "",
186
- "• resolve_target toolCall this before deploying to confirm the collection,",
187
- " project name, and deploy URL with the user. Fuzzy-matches names so you don't",
188
- " need exact IDs.",
189
- "• Named deploymentsUse deploy_name on import_repo or deploy_files to set a",
190
- " friendly Vercel URL (e.g., 'erg-v3-teams' → erg-v3-teams.vercel.app).",
191
- " Fuzzy search — list_collections and list_prototypes now accept a 'search'",
192
- " parameter to filter results.",
193
- "• GuardrailsDeploy tools now ask for confirmation when collection or project",
194
- " info is missing, instead of auto-generating everything silently.",
215
+ "• Feedback triageget_feedback now supports status, priority, and assignee",
216
+ " filters. Use triage_feedback to update status (open/in_progress/resolved/",
217
+ " wont_fix/deferred), set priority, and assign feedback to team members.",
218
+ "• New tool: triage_feedback Bulk update feedback items without leaving your editor.",
219
+ ].join("\n"),
220
+ "0.4.0": [
221
+ " resolve_target tool — Fuzzy-matches collection/project names.",
222
+ "• Named deployments Set friendly Vercel URLs with deploy_name.",
223
+ " Fuzzy search on list_collections and list_prototypes.",
224
+ "• Guardrails on deploy tools.",
195
225
  ].join("\n"),
196
226
  };
197
227
  function getWhatsNew() {
@@ -242,7 +272,7 @@ const client = new VibesharingClient(VIBESHARING_URL, VIBESHARING_TOKEN);
242
272
  // Create MCP server
243
273
  const server = new index_js_1.Server({
244
274
  name: "vibesharing",
245
- version: "0.4.0",
275
+ version: "0.5.0",
246
276
  }, {
247
277
  capabilities: {
248
278
  tools: {},
@@ -319,7 +349,7 @@ server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => {
319
349
  },
320
350
  {
321
351
  name: "get_feedback",
322
- description: "Get feedback and comments for a specific prototype. Use this to see what the team thinks about a prototype.",
352
+ description: "Get feedback and comments for a specific prototype. Can filter by status (open, in_progress, resolved, wont_fix, deferred), priority (critical, high, medium, low), or assignee.",
323
353
  inputSchema: {
324
354
  type: "object",
325
355
  properties: {
@@ -327,10 +357,51 @@ server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => {
327
357
  type: "string",
328
358
  description: "The VibeSharing project/prototype ID",
329
359
  },
360
+ status: {
361
+ type: "string",
362
+ description: "Filter by status: open, in_progress, resolved, wont_fix, deferred. Comma-separated for multiple.",
363
+ },
364
+ priority: {
365
+ type: "string",
366
+ description: "Filter by priority: critical, high, medium, low",
367
+ },
368
+ assigned_to: {
369
+ type: "string",
370
+ description: "Filter by assignee user ID, or 'unassigned' for unassigned feedback",
371
+ },
330
372
  },
331
373
  required: ["project_id"],
332
374
  },
333
375
  },
376
+ {
377
+ name: "triage_feedback",
378
+ description: "Update status, priority, or assignee on one or more feedback items. Use this to triage feedback from within your editor.",
379
+ inputSchema: {
380
+ type: "object",
381
+ properties: {
382
+ feedback_ids: {
383
+ type: "array",
384
+ items: { type: "string" },
385
+ description: "One or more feedback IDs to update",
386
+ },
387
+ status: {
388
+ type: "string",
389
+ enum: ["open", "in_progress", "resolved", "wont_fix", "deferred"],
390
+ description: "New status for the feedback items",
391
+ },
392
+ priority: {
393
+ type: "string",
394
+ enum: ["critical", "high", "medium", "low"],
395
+ description: "New priority for the feedback items. Omit to leave unchanged.",
396
+ },
397
+ assigned_to: {
398
+ type: "string",
399
+ description: "User ID to assign to. Use empty string to unassign.",
400
+ },
401
+ },
402
+ required: ["feedback_ids"],
403
+ },
404
+ },
334
405
  {
335
406
  name: "sync_context",
336
407
  description: "Sync your CLAUDE.md, AGENTS.md, or project context to VibeSharing. This helps maintain context across AI sessions and team members.",
@@ -716,26 +787,35 @@ server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
716
787
  };
717
788
  }
718
789
  case "get_feedback": {
719
- const { project_id } = args;
720
- const result = await client.getFeedback(project_id);
790
+ const { project_id, status: statusFilter, priority: priorityFilter, assigned_to: assignedToFilter } = args;
791
+ const result = await client.getFeedback(project_id, {
792
+ status: statusFilter,
793
+ priority: priorityFilter,
794
+ assigned_to: assignedToFilter,
795
+ });
721
796
  const feedback = result.feedback || [];
722
797
  if (feedback.length === 0) {
798
+ const filterNote = statusFilter || priorityFilter || assignedToFilter
799
+ ? " matching your filters"
800
+ : "";
723
801
  return {
724
802
  content: [
725
803
  {
726
804
  type: "text",
727
- text: "No feedback yet for this prototype. Share it with your team to get their thoughts!",
805
+ text: `No feedback${filterNote} for this prototype. Share it with your team to get their thoughts!`,
728
806
  },
729
807
  ],
730
808
  };
731
809
  }
732
810
  const feedbackList = feedback
733
811
  .map((f) => {
734
- const status = f.resolved_at ? " [Resolved]" : "";
812
+ const itemStatus = f.status || (f.resolved_at ? "resolved" : "open");
813
+ const priorityLabel = f.priority ? ` [${f.priority.toUpperCase()}]` : "";
814
+ const assigneeLabel = f.assignee_name ? ` → ${f.assignee_name}` : "";
735
815
  const replies = f.replies && f.replies.length > 0
736
816
  ? `\n Replies: ${f.replies.length}`
737
817
  : "";
738
- return `- ${f.user_name}${status}: "${f.content}"\n ${new Date(f.created_at).toLocaleDateString()}${replies}`;
818
+ return `- [${itemStatus}]${priorityLabel}${assigneeLabel} ${f.user_name}: "${f.content}"\n ID: ${f.id}\n ${new Date(f.created_at).toLocaleDateString()}${replies}`;
739
819
  })
740
820
  .join("\n\n");
741
821
  return {
@@ -747,6 +827,37 @@ server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
747
827
  ],
748
828
  };
749
829
  }
830
+ case "triage_feedback": {
831
+ const { feedback_ids, status: newStatus, priority: newPriority, assigned_to: newAssignee } = args;
832
+ if (!feedback_ids || feedback_ids.length === 0) {
833
+ return {
834
+ content: [{ type: "text", text: "Error: feedback_ids array is required" }],
835
+ };
836
+ }
837
+ const updates = {};
838
+ if (newStatus)
839
+ updates.status = newStatus;
840
+ if (newPriority !== undefined)
841
+ updates.priority = newPriority;
842
+ if (newAssignee !== undefined)
843
+ updates.assigned_to = newAssignee || null;
844
+ const result = await client.triageFeedback(feedback_ids, updates);
845
+ const changes = [];
846
+ if (newStatus)
847
+ changes.push(`status → ${newStatus}`);
848
+ if (newPriority)
849
+ changes.push(`priority → ${newPriority}`);
850
+ if (newAssignee !== undefined)
851
+ changes.push(newAssignee ? `assigned → ${newAssignee}` : "unassigned");
852
+ return {
853
+ content: [
854
+ {
855
+ type: "text",
856
+ text: `Updated ${feedback_ids.length} feedback item(s): ${changes.join(", ")}`,
857
+ },
858
+ ],
859
+ };
860
+ }
750
861
  case "sync_context": {
751
862
  const { project_id, content } = args;
752
863
  await client.syncContext(project_id, content);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibesharingapp/mcp-server",
3
- "version": "0.4.1",
3
+ "version": "0.5.0",
4
4
  "description": "MCP server for VibeSharing - register prototypes and get feedback directly from Claude Code",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",