@vibesharingapp/mcp-server 0.4.2 → 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 (2) hide show
  1. package/dist/index.js +132 -21
  2. package/package.json +1 -1
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.2";
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.2",
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",