@vibesharingapp/mcp-server 0.6.0 → 0.7.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 +8 -4
  2. package/dist/index.js +154 -1
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -73,11 +73,13 @@ Sign up at [vibesharing.app](https://vibesharing.app), then go to [Account Setti
73
73
  ### 2. Configure Claude Code
74
74
 
75
75
  ```bash
76
- claude mcp add vibesharing \
77
- -e VIBESHARING_TOKEN=vs_your_token_here \
76
+ claude mcp add vibesharing -s user \
77
+ -e VIBESHARING_TOKEN=vs_PASTE_YOUR_TOKEN \
78
78
  -- npx -y @vibesharingapp/mcp-server@latest
79
79
  ```
80
80
 
81
+ > **Important:** Replace `vs_PASTE_YOUR_TOKEN` with your actual token. Use `-s user` so it works in all projects. Then restart Claude Code.
82
+
81
83
  Or add to your Claude Code settings manually:
82
84
 
83
85
  ```json
@@ -199,7 +201,9 @@ VibeSharing isn't just another tool to check. It's infrastructure for teams buil
199
201
  **Stop building in isolation. Start shipping with your team.**
200
202
 
201
203
  ```bash
202
- claude mcp add vibesharing \
203
- -e VIBESHARING_TOKEN=vs_your_token_here \
204
+ claude mcp add vibesharing -s user \
205
+ -e VIBESHARING_TOKEN=vs_PASTE_YOUR_TOKEN \
204
206
  -- npx -y @vibesharingapp/mcp-server@latest
205
207
  ```
208
+
209
+ > **Important:** Replace `vs_PASTE_YOUR_TOKEN` with your actual token. Use `-s user` so it works in all projects. Then restart Claude Code.
package/dist/index.js CHANGED
@@ -164,6 +164,15 @@ class VibesharingClient {
164
164
  method: "DELETE",
165
165
  });
166
166
  }
167
+ async diagnose() {
168
+ return this.request("/api/diagnose");
169
+ }
170
+ async sendSupportRequest(params) {
171
+ return this.request("/api/support", {
172
+ method: "POST",
173
+ body: JSON.stringify(params),
174
+ });
175
+ }
167
176
  async generateFeedbackTopics(projectId, topics) {
168
177
  return this.request("/api/feedback-topics", {
169
178
  method: "POST",
@@ -303,13 +312,25 @@ const VIBESHARING_TOKEN = process.env.VIBESHARING_TOKEN;
303
312
  if (!VIBESHARING_TOKEN) {
304
313
  console.error("Error: VIBESHARING_TOKEN environment variable is required");
305
314
  console.error("Get your deploy token from VibeSharing → Account Settings");
315
+ console.error("");
316
+ console.error("Quick setup:");
317
+ console.error(" claude mcp add vibesharing -s user -e VIBESHARING_TOKEN=vs_YOUR_TOKEN -- npx -y @vibesharingapp/mcp-server@latest");
318
+ process.exit(1);
319
+ }
320
+ if (VIBESHARING_TOKEN === "vs_your_token_here" || VIBESHARING_TOKEN.length < 10) {
321
+ console.error("Error: VIBESHARING_TOKEN is still the placeholder value");
322
+ console.error("Replace it with your actual deploy token from VibeSharing → Account Settings");
323
+ console.error("");
324
+ console.error("Fix:");
325
+ console.error(" claude mcp remove vibesharing");
326
+ console.error(" claude mcp add vibesharing -s user -e VIBESHARING_TOKEN=vs_YOUR_TOKEN -- npx -y @vibesharingapp/mcp-server@latest");
306
327
  process.exit(1);
307
328
  }
308
329
  const client = new VibesharingClient(VIBESHARING_URL, VIBESHARING_TOKEN);
309
330
  // Create MCP server
310
331
  const server = new index_js_1.Server({
311
332
  name: "vibesharing",
312
- version: "0.6.0",
333
+ version: "0.7.0",
313
334
  }, {
314
335
  capabilities: {
315
336
  tools: {},
@@ -782,6 +803,36 @@ server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => {
782
803
  required: ["project_id"],
783
804
  },
784
805
  },
806
+ {
807
+ name: "diagnose",
808
+ description: "Run a comprehensive health check on the user's VibeSharing setup. Checks token validity, GitHub connection, stuck deploy locks (auto-clears them), recent deploy errors, and prototype status. Use this to troubleshoot issues.",
809
+ inputSchema: {
810
+ type: "object",
811
+ properties: {},
812
+ },
813
+ },
814
+ {
815
+ name: "send_support_request",
816
+ description: "Send a support request to the VibeSharing admin. Use this when the user has an issue you can't resolve, needs a configuration change, or wants to report a bug.",
817
+ inputSchema: {
818
+ type: "object",
819
+ properties: {
820
+ subject: {
821
+ type: "string",
822
+ description: "Short subject line for the support request",
823
+ },
824
+ description: {
825
+ type: "string",
826
+ description: "Detailed description of the issue or request",
827
+ },
828
+ context: {
829
+ type: "string",
830
+ description: "Optional: Session context, error messages, or relevant logs to help debug the issue",
831
+ },
832
+ },
833
+ required: ["subject", "description"],
834
+ },
835
+ },
785
836
  ],
786
837
  };
787
838
  });
@@ -1552,6 +1603,108 @@ server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
1552
1603
  content: [{ type: "text", text: lines.join("\n") }],
1553
1604
  };
1554
1605
  }
1606
+ case "diagnose": {
1607
+ const result = await client.diagnose();
1608
+ const lines = [
1609
+ "VibeSharing Health Check",
1610
+ "========================",
1611
+ ];
1612
+ // Token status
1613
+ if (result.token?.valid) {
1614
+ lines.push(`\u2713 Token: valid (org: ${result.token.org}, role: ${result.token.role})`);
1615
+ }
1616
+ else {
1617
+ lines.push(`\u2717 Token: invalid — ${result.token?.error || "unknown error"}`);
1618
+ }
1619
+ // GitHub status
1620
+ if (result.github?.connected) {
1621
+ lines.push(`\u2713 GitHub: connected (@${result.github.username})`);
1622
+ }
1623
+ else {
1624
+ lines.push(`\u2717 GitHub: not connected — connect at ${VIBESHARING_URL}/dashboard/account`);
1625
+ }
1626
+ // Deploy locks
1627
+ if (result.deploy_locks?.stuck > 0) {
1628
+ const cleared = result.deploy_locks.cleared || 0;
1629
+ const names = (result.deploy_locks.prototypes || [])
1630
+ .map((p) => p.name)
1631
+ .join(", ");
1632
+ if (cleared > 0) {
1633
+ lines.push(`\u2717 Deploy locks: ${result.deploy_locks.stuck} stuck lock(s) found on: ${names} — cleared ${cleared}`);
1634
+ }
1635
+ else {
1636
+ lines.push(`\u2717 Deploy locks: ${result.deploy_locks.stuck} stuck lock(s) on: ${names}`);
1637
+ }
1638
+ }
1639
+ else {
1640
+ lines.push(`\u2713 Deploy locks: none`);
1641
+ }
1642
+ // Recent deploys
1643
+ const successful = result.recent_deploys?.successful || 0;
1644
+ const failed = result.recent_deploys?.failed || 0;
1645
+ if (failed > 0) {
1646
+ lines.push(`\u26A0 Recent deploys (24h): ${successful} successful, ${failed} failed`);
1647
+ const errors = result.recent_deploys?.errors || [];
1648
+ for (const err of errors.slice(0, 3)) {
1649
+ lines.push(` - ${err.error_type}: ${err.error_message || "no details"}`);
1650
+ }
1651
+ }
1652
+ else {
1653
+ lines.push(`\u2713 Recent deploys (24h): ${successful} successful, 0 failed`);
1654
+ }
1655
+ // Prototypes
1656
+ const total = result.prototypes?.total || 0;
1657
+ const withoutUrl = result.prototypes?.without_url || 0;
1658
+ if (withoutUrl > 0 && total > 0) {
1659
+ lines.push(`\u26A0 Prototypes: ${withoutUrl} of ${total} not deployed yet`);
1660
+ }
1661
+ else {
1662
+ lines.push(`\u2713 Prototypes: ${total} total, all have deploy URLs`);
1663
+ }
1664
+ // Issues summary
1665
+ const issues = [];
1666
+ if (!result.token?.valid)
1667
+ issues.push("Token is invalid. Get a new one from Account Settings.");
1668
+ if (!result.github?.connected)
1669
+ issues.push("GitHub not connected. Connect at Account Settings to enable Push to Deploy.");
1670
+ if (result.deploy_locks?.cleared > 0) {
1671
+ issues.push(`${result.deploy_locks.cleared} stuck deploy lock(s) were cleared. Retry your deploy.`);
1672
+ }
1673
+ if (failed > 0)
1674
+ issues.push(`${failed} deploy error(s) in the last 24h. Check the errors above.`);
1675
+ if (issues.length > 0) {
1676
+ lines.push("", "Issues found:");
1677
+ for (const issue of issues) {
1678
+ lines.push(`- ${issue}`);
1679
+ }
1680
+ }
1681
+ else {
1682
+ lines.push("", "No issues found. Everything looks good!");
1683
+ }
1684
+ return {
1685
+ content: [{ type: "text", text: lines.join("\n") }],
1686
+ };
1687
+ }
1688
+ case "send_support_request": {
1689
+ const { subject, description, context } = args;
1690
+ if (!subject || !description) {
1691
+ return {
1692
+ content: [{ type: "text", text: "Error: subject and description are required." }],
1693
+ isError: true,
1694
+ };
1695
+ }
1696
+ const result = await client.sendSupportRequest({ subject, description, context });
1697
+ return {
1698
+ content: [
1699
+ {
1700
+ type: "text",
1701
+ text: result.sent
1702
+ ? `Support request sent!\n\nSubject: ${subject}\n\n${result.message}`
1703
+ : `Support request logged but email delivery had an issue.\n\nSubject: ${subject}\n\n${result.message}`,
1704
+ },
1705
+ ],
1706
+ };
1707
+ }
1555
1708
  default:
1556
1709
  return {
1557
1710
  content: [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibesharingapp/mcp-server",
3
- "version": "0.6.0",
3
+ "version": "0.7.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",