ara-mcp 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.
Files changed (141) hide show
  1. package/README.md +85 -0
  2. package/dist/action-plan.html +221 -0
  3. package/dist/idea-card.html +313 -0
  4. package/dist/lean-canvas.html +145 -0
  5. package/dist-server/server.d.ts +3 -0
  6. package/dist-server/server.d.ts.map +1 -0
  7. package/dist-server/server.js +62 -0
  8. package/dist-server/server.js.map +1 -0
  9. package/dist-server/src/db/database.d.ts +5 -0
  10. package/dist-server/src/db/database.d.ts.map +1 -0
  11. package/dist-server/src/db/database.js +29 -0
  12. package/dist-server/src/db/database.js.map +1 -0
  13. package/dist-server/src/db/queries.d.ts +38 -0
  14. package/dist-server/src/db/queries.d.ts.map +1 -0
  15. package/dist-server/src/db/queries.js +384 -0
  16. package/dist-server/src/db/queries.js.map +1 -0
  17. package/dist-server/src/db/schema.d.ts +3 -0
  18. package/dist-server/src/db/schema.d.ts.map +1 -0
  19. package/dist-server/src/db/schema.js +58 -0
  20. package/dist-server/src/db/schema.js.map +1 -0
  21. package/dist-server/src/lib/logger.d.ts +7 -0
  22. package/dist-server/src/lib/logger.d.ts.map +1 -0
  23. package/dist-server/src/lib/logger.js +10 -0
  24. package/dist-server/src/lib/logger.js.map +1 -0
  25. package/dist-server/src/resources/action-plan.d.ts +3 -0
  26. package/dist-server/src/resources/action-plan.d.ts.map +1 -0
  27. package/dist-server/src/resources/action-plan.js +34 -0
  28. package/dist-server/src/resources/action-plan.js.map +1 -0
  29. package/dist-server/src/resources/idea-card.d.ts +3 -0
  30. package/dist-server/src/resources/idea-card.d.ts.map +1 -0
  31. package/dist-server/src/resources/idea-card.js +34 -0
  32. package/dist-server/src/resources/idea-card.js.map +1 -0
  33. package/dist-server/src/resources/lean-canvas.d.ts +3 -0
  34. package/dist-server/src/resources/lean-canvas.d.ts.map +1 -0
  35. package/dist-server/src/resources/lean-canvas.js +34 -0
  36. package/dist-server/src/resources/lean-canvas.js.map +1 -0
  37. package/dist-server/src/tools/action-plan.d.ts +3 -0
  38. package/dist-server/src/tools/action-plan.d.ts.map +1 -0
  39. package/dist-server/src/tools/action-plan.js +163 -0
  40. package/dist-server/src/tools/action-plan.js.map +1 -0
  41. package/dist-server/src/tools/canvas.d.ts +3 -0
  42. package/dist-server/src/tools/canvas.d.ts.map +1 -0
  43. package/dist-server/src/tools/canvas.js +112 -0
  44. package/dist-server/src/tools/canvas.js.map +1 -0
  45. package/dist-server/src/tools/capture.d.ts +3 -0
  46. package/dist-server/src/tools/capture.d.ts.map +1 -0
  47. package/dist-server/src/tools/capture.js +63 -0
  48. package/dist-server/src/tools/capture.js.map +1 -0
  49. package/dist-server/src/tools/delete.d.ts +3 -0
  50. package/dist-server/src/tools/delete.d.ts.map +1 -0
  51. package/dist-server/src/tools/delete.js +43 -0
  52. package/dist-server/src/tools/delete.js.map +1 -0
  53. package/dist-server/src/tools/get.d.ts +3 -0
  54. package/dist-server/src/tools/get.d.ts.map +1 -0
  55. package/dist-server/src/tools/get.js +80 -0
  56. package/dist-server/src/tools/get.js.map +1 -0
  57. package/dist-server/src/tools/list.d.ts +3 -0
  58. package/dist-server/src/tools/list.d.ts.map +1 -0
  59. package/dist-server/src/tools/list.js +20 -0
  60. package/dist-server/src/tools/list.js.map +1 -0
  61. package/dist-server/src/tools/pivot.d.ts +3 -0
  62. package/dist-server/src/tools/pivot.d.ts.map +1 -0
  63. package/dist-server/src/tools/pivot.js +68 -0
  64. package/dist-server/src/tools/pivot.js.map +1 -0
  65. package/dist-server/src/tools/research.d.ts +3 -0
  66. package/dist-server/src/tools/research.d.ts.map +1 -0
  67. package/dist-server/src/tools/research.js +106 -0
  68. package/dist-server/src/tools/research.js.map +1 -0
  69. package/dist-server/src/tools/stress-test.d.ts +3 -0
  70. package/dist-server/src/tools/stress-test.d.ts.map +1 -0
  71. package/dist-server/src/tools/stress-test.js +105 -0
  72. package/dist-server/src/tools/stress-test.js.map +1 -0
  73. package/dist-server/src/tools/update.d.ts +3 -0
  74. package/dist-server/src/tools/update.d.ts.map +1 -0
  75. package/dist-server/src/tools/update.js +100 -0
  76. package/dist-server/src/tools/update.js.map +1 -0
  77. package/dist-server/src/types.d.ts +217 -0
  78. package/dist-server/src/types.d.ts.map +1 -0
  79. package/dist-server/src/types.js +139 -0
  80. package/dist-server/src/types.js.map +1 -0
  81. package/dist-server/tests/db/action-plan.test.d.ts +2 -0
  82. package/dist-server/tests/db/action-plan.test.d.ts.map +1 -0
  83. package/dist-server/tests/db/action-plan.test.js +212 -0
  84. package/dist-server/tests/db/action-plan.test.js.map +1 -0
  85. package/dist-server/tests/db/canvas.test.d.ts +2 -0
  86. package/dist-server/tests/db/canvas.test.d.ts.map +1 -0
  87. package/dist-server/tests/db/canvas.test.js +91 -0
  88. package/dist-server/tests/db/canvas.test.js.map +1 -0
  89. package/dist-server/tests/db/queries.test.d.ts +2 -0
  90. package/dist-server/tests/db/queries.test.d.ts.map +1 -0
  91. package/dist-server/tests/db/queries.test.js +92 -0
  92. package/dist-server/tests/db/queries.test.js.map +1 -0
  93. package/dist-server/tests/db/stress-test.test.d.ts +2 -0
  94. package/dist-server/tests/db/stress-test.test.d.ts.map +1 -0
  95. package/dist-server/tests/db/stress-test.test.js +78 -0
  96. package/dist-server/tests/db/stress-test.test.js.map +1 -0
  97. package/dist-server/tests/resources/idea-card.test.d.ts +2 -0
  98. package/dist-server/tests/resources/idea-card.test.d.ts.map +1 -0
  99. package/dist-server/tests/resources/idea-card.test.js +14 -0
  100. package/dist-server/tests/resources/idea-card.test.js.map +1 -0
  101. package/dist-server/tests/resources/lean-canvas.test.d.ts +2 -0
  102. package/dist-server/tests/resources/lean-canvas.test.d.ts.map +1 -0
  103. package/dist-server/tests/resources/lean-canvas.test.js +14 -0
  104. package/dist-server/tests/resources/lean-canvas.test.js.map +1 -0
  105. package/dist-server/tests/tools/action-plan.test.d.ts +2 -0
  106. package/dist-server/tests/tools/action-plan.test.d.ts.map +1 -0
  107. package/dist-server/tests/tools/action-plan.test.js +110 -0
  108. package/dist-server/tests/tools/action-plan.test.js.map +1 -0
  109. package/dist-server/tests/tools/canvas.test.d.ts +2 -0
  110. package/dist-server/tests/tools/canvas.test.d.ts.map +1 -0
  111. package/dist-server/tests/tools/canvas.test.js +55 -0
  112. package/dist-server/tests/tools/canvas.test.js.map +1 -0
  113. package/dist-server/tests/tools/capture.test.d.ts +2 -0
  114. package/dist-server/tests/tools/capture.test.d.ts.map +1 -0
  115. package/dist-server/tests/tools/capture.test.js +40 -0
  116. package/dist-server/tests/tools/capture.test.js.map +1 -0
  117. package/dist-server/tests/tools/delete.test.d.ts +2 -0
  118. package/dist-server/tests/tools/delete.test.d.ts.map +1 -0
  119. package/dist-server/tests/tools/delete.test.js +24 -0
  120. package/dist-server/tests/tools/delete.test.js.map +1 -0
  121. package/dist-server/tests/tools/get.test.d.ts +2 -0
  122. package/dist-server/tests/tools/get.test.d.ts.map +1 -0
  123. package/dist-server/tests/tools/get.test.js +29 -0
  124. package/dist-server/tests/tools/get.test.js.map +1 -0
  125. package/dist-server/tests/tools/list.test.d.ts +2 -0
  126. package/dist-server/tests/tools/list.test.d.ts.map +1 -0
  127. package/dist-server/tests/tools/list.test.js +33 -0
  128. package/dist-server/tests/tools/list.test.js.map +1 -0
  129. package/dist-server/tests/tools/research.test.d.ts +2 -0
  130. package/dist-server/tests/tools/research.test.d.ts.map +1 -0
  131. package/dist-server/tests/tools/research.test.js +61 -0
  132. package/dist-server/tests/tools/research.test.js.map +1 -0
  133. package/dist-server/tests/tools/stress-test.test.d.ts +2 -0
  134. package/dist-server/tests/tools/stress-test.test.d.ts.map +1 -0
  135. package/dist-server/tests/tools/stress-test.test.js +98 -0
  136. package/dist-server/tests/tools/stress-test.test.js.map +1 -0
  137. package/dist-server/tests/tools/update.test.d.ts +2 -0
  138. package/dist-server/tests/tools/update.test.d.ts.map +1 -0
  139. package/dist-server/tests/tools/update.test.js +30 -0
  140. package/dist-server/tests/tools/update.test.js.map +1 -0
  141. package/package.json +48 -0
@@ -0,0 +1,68 @@
1
+ import { z } from "zod";
2
+ import { registerAppTool } from "@modelcontextprotocol/ext-apps/server";
3
+ import { applyPivot } from "../db/queries.js";
4
+ import { log } from "../lib/logger.js";
5
+ export function registerPivotTools(server) {
6
+ registerAppTool(server, "apply_pivot", {
7
+ title: "Apply Pivot",
8
+ description: "Apply a pivot direction to transform this idea. DESTRUCTIVE — saves a snapshot of current fields first, then updates title, tagline, and motivation from the selected pivot.\n" +
9
+ "When the pivot includes features, targetUsers, or businessModel, those fields are also updated (per D-04).\n" +
10
+ "The original idea state is preserved in a snapshot for comparison.\n\n" +
11
+ "pivotIndex: 0-based index into the previously saved pivots array.",
12
+ inputSchema: z.object({
13
+ ideaId: z.string().describe("The ID of the idea"),
14
+ pivotIndex: z.number().int().min(0).max(4).describe("0-based index of the pivot to apply"),
15
+ }),
16
+ _meta: {
17
+ ui: { resourceUri: "ui://ara/idea-card" },
18
+ },
19
+ }, async (input) => {
20
+ const idea = applyPivot(input.ideaId, input.pivotIndex);
21
+ if (!idea) {
22
+ log.warn(`apply_pivot: idea not found or pivot index invalid — ${input.ideaId}[${input.pivotIndex}]`);
23
+ return {
24
+ content: [{
25
+ type: "text",
26
+ text: `Idea not found or pivot index invalid: "${input.ideaId}"[${input.pivotIndex}]`,
27
+ }],
28
+ isError: true,
29
+ };
30
+ }
31
+ log.info(`apply_pivot: applied pivot ${input.pivotIndex} to "${idea.title}" (${idea.id})`);
32
+ // Re-render idea-card with transformed fields
33
+ return {
34
+ content: [{
35
+ type: "text",
36
+ text: JSON.stringify({
37
+ id: idea.id,
38
+ title: idea.title,
39
+ tagline: idea.tagline,
40
+ motivation: idea.motivation,
41
+ features: idea.features,
42
+ targetUsers: idea.targetUsers,
43
+ businessModel: idea.businessModel,
44
+ category: idea.category,
45
+ tags: idea.tags,
46
+ score: idea.score,
47
+ researchLevel: idea.researchLevel,
48
+ createdAt: idea.createdAt,
49
+ updatedAt: idea.updatedAt,
50
+ ...(idea.researchStatus === 'complete' ? {
51
+ marketScore: idea.marketScore,
52
+ feasibilityScore: idea.feasibilityScore,
53
+ uniquenessScore: idea.uniquenessScore,
54
+ verdictSummary: idea.verdictSummary,
55
+ researchStatus: idea.researchStatus,
56
+ researchData: idea.researchData,
57
+ } : {}),
58
+ ...(idea.stressTestStatus === 'complete' ? {
59
+ killScore: idea.killScore,
60
+ stressTestStatus: idea.stressTestStatus,
61
+ stressTestData: idea.stressTestData,
62
+ } : {}),
63
+ }),
64
+ }],
65
+ };
66
+ });
67
+ }
68
+ //# sourceMappingURL=pivot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pivot.js","sourceRoot":"","sources":["../../../src/tools/pivot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerResearchTool(server: McpServer): void;
3
+ //# sourceMappingURL=research.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"research.d.ts","sourceRoot":"","sources":["../../../src/tools/research.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6G5D"}
@@ -0,0 +1,106 @@
1
+ import { z } from "zod";
2
+ import { registerAppTool } from "@modelcontextprotocol/ext-apps/server";
3
+ import { saveResearch } from "../db/queries.js";
4
+ import { log } from "../lib/logger.js";
5
+ export function registerResearchTool(server) {
6
+ registerAppTool(server, "save_research", {
7
+ title: "Save Research",
8
+ description: "Save completed research results for an idea. Call this ONCE after performing web-based research and analysis on an idea. Provide all fields you discovered:\n" +
9
+ "- scores (0-100 each): overall, market, feasibility, uniqueness\n" +
10
+ "- competitors: array of {name, description, strengths[], weaknesses[], url?} — aim for 3-5 real companies\n" +
11
+ "- marketSizing: {tam, sam, som} as human-readable strings (e.g. \"$12B global market\")\n" +
12
+ "- swotAnalysis: {strengths[], weaknesses[], opportunities[], threats[]} — 3-4 items per quadrant\n" +
13
+ "- trends: array of {title, description, direction} where direction is emerging|growing|stable|declining\n" +
14
+ "- audienceSegments: array of {name, description, size?}\n" +
15
+ "- rationale strings for each score dimension explaining WHY you gave that score\n" +
16
+ "- verdictSummary: 2-3 sentence overall assessment\n\n" +
17
+ "This tool persists the research and re-renders the idea card with score rings and research sections.",
18
+ inputSchema: z.object({
19
+ ideaId: z.string().describe("The ID of the idea to save research for"),
20
+ score: z.number().min(0).max(100).describe("Overall idea score (0-100)"),
21
+ marketScore: z.number().min(0).max(100).describe("Market opportunity score (0-100)"),
22
+ feasibilityScore: z.number().min(0).max(100).describe("Technical/business feasibility score (0-100)"),
23
+ uniquenessScore: z.number().min(0).max(100).describe("Uniqueness/differentiation score (0-100)"),
24
+ marketRationale: z.string().optional().describe("1-2 sentence explanation of market score"),
25
+ feasibilityRationale: z.string().optional().describe("1-2 sentence explanation of feasibility score"),
26
+ uniquenessRationale: z.string().optional().describe("1-2 sentence explanation of uniqueness score"),
27
+ verdictSummary: z.string().optional().describe("2-3 sentence overall assessment"),
28
+ researchData: z.object({
29
+ competitors: z.array(z.object({
30
+ name: z.string(),
31
+ description: z.string(),
32
+ strengths: z.array(z.string()),
33
+ weaknesses: z.array(z.string()),
34
+ url: z.string().optional(),
35
+ })).optional(),
36
+ marketSizing: z.object({
37
+ tam: z.string(),
38
+ sam: z.string(),
39
+ som: z.string(),
40
+ growthRate: z.string().optional(),
41
+ timeframe: z.string().optional(),
42
+ confidence: z.string().optional(),
43
+ }).optional(),
44
+ swotAnalysis: z.object({
45
+ strengths: z.array(z.string()),
46
+ weaknesses: z.array(z.string()),
47
+ opportunities: z.array(z.string()),
48
+ threats: z.array(z.string()),
49
+ }).optional(),
50
+ trends: z.array(z.object({
51
+ title: z.string(),
52
+ description: z.string(),
53
+ direction: z.enum(["emerging", "growing", "stable", "declining"]),
54
+ })).optional(),
55
+ audienceSegments: z.array(z.object({
56
+ name: z.string(),
57
+ description: z.string(),
58
+ size: z.string().optional(),
59
+ })).optional(),
60
+ }).optional().describe("Structured research data (competitors, market sizing, SWOT, trends, audience)"),
61
+ }),
62
+ _meta: { ui: { resourceUri: "ui://ara/idea-card" } },
63
+ }, async (input) => {
64
+ const idea = saveResearch(input.ideaId, {
65
+ score: input.score,
66
+ marketScore: input.marketScore,
67
+ feasibilityScore: input.feasibilityScore,
68
+ uniquenessScore: input.uniquenessScore,
69
+ marketRationale: input.marketRationale,
70
+ feasibilityRationale: input.feasibilityRationale,
71
+ uniquenessRationale: input.uniquenessRationale,
72
+ verdictSummary: input.verdictSummary,
73
+ researchData: input.researchData ?? null,
74
+ });
75
+ if (!idea) {
76
+ log.warn(`save_research: idea not found — ${input.ideaId}`);
77
+ return {
78
+ content: [{
79
+ type: "text",
80
+ text: `Idea not found: "${input.ideaId}"`,
81
+ }],
82
+ isError: true,
83
+ };
84
+ }
85
+ log.info(`save_research: saved research for "${idea.title}" (${idea.id}) — score: ${idea.score}`);
86
+ // IMPORTANT: content[0].text is abbreviated — NO researchData blob (Pitfall 1)
87
+ // The artifact receives the full data via ontoolresult; Claude doesn't need the blob echoed back
88
+ return {
89
+ content: [{
90
+ type: "text",
91
+ text: JSON.stringify({
92
+ id: idea.id,
93
+ title: idea.title,
94
+ score: idea.score,
95
+ marketScore: idea.marketScore,
96
+ feasibilityScore: idea.feasibilityScore,
97
+ uniquenessScore: idea.uniquenessScore,
98
+ verdictSummary: idea.verdictSummary,
99
+ researchStatus: idea.researchStatus,
100
+ lastResearchedAt: idea.lastResearchedAt,
101
+ }),
102
+ }],
103
+ };
104
+ });
105
+ }
106
+ //# sourceMappingURL=research.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"research.js","sourceRoot":"","sources":["../../../src/tools/research.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAEvC,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,eAAe,CACb,MAAM,EACN,eAAe,EACf;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EACT,+JAA+J;YAC/J,mEAAmE;YACnE,6GAA6G;YAC7G,2FAA2F;YAC3F,oGAAoG;YACpG,2GAA2G;YAC3G,2DAA2D;YAC3D,mFAAmF;YACnF,uDAAuD;YACvD,sGAAsG;QACxG,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;YACtE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC;YACxE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,kCAAkC,CAAC;YACpF,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,8CAA8C,CAAC;YACrG,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,0CAA0C,CAAC;YAChG,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;YAC3F,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;YACrG,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;YACnG,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;YACjF,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC;gBACrB,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;oBAC5B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;oBAChB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;oBACvB,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;oBAC9B,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;oBAC/B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;iBAC3B,CAAC,CAAC,CAAC,QAAQ,EAAE;gBACd,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC;oBACrB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;oBACf,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;oBACf,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;oBACf,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;oBACjC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;oBAChC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;iBAClC,CAAC,CAAC,QAAQ,EAAE;gBACb,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC;oBACrB,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;oBAC9B,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;oBAC/B,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;oBAClC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;iBAC7B,CAAC,CAAC,QAAQ,EAAE;gBACb,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;oBACvB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;oBACjB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;oBACvB,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;iBAClE,CAAC,CAAC,CAAC,QAAQ,EAAE;gBACd,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;oBACjC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;oBAChB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;oBACvB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;iBAC5B,CAAC,CAAC,CAAC,QAAQ,EAAE;aACf,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+EAA+E,CAAC;SACxG,CAAC;QACF,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,oBAAoB,EAAE,EAAE;KACrD,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;QACd,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE;YACtC,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;YACxC,eAAe,EAAE,KAAK,CAAC,eAAe;YACtC,eAAe,EAAE,KAAK,CAAC,eAAe;YACtC,oBAAoB,EAAE,KAAK,CAAC,oBAAoB;YAChD,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;YAC9C,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,YAAY,EAAE,KAAK,CAAC,YAAmD,IAAI,IAAI;SAChF,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,GAAG,CAAC,IAAI,CAAC,mCAAmC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YAC5D,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,oBAAoB,KAAK,CAAC,MAAM,GAAG;qBAC1C,CAAC;gBACF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,sCAAsC,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,EAAE,cAAc,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAElG,+EAA+E;QAC/E,iGAAiG;QACjG,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,EAAE,EAAE,IAAI,CAAC,EAAE;wBACX,KAAK,EAAE,IAAI,CAAC,KAAK;wBACjB,KAAK,EAAE,IAAI,CAAC,KAAK;wBACjB,WAAW,EAAE,IAAI,CAAC,WAAW;wBAC7B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;wBACvC,eAAe,EAAE,IAAI,CAAC,eAAe;wBACrC,cAAc,EAAE,IAAI,CAAC,cAAc;wBACnC,cAAc,EAAE,IAAI,CAAC,cAAc;wBACnC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;qBACxC,CAAC;iBACH,CAAC;SACH,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerStressTestTool(server: McpServer): void;
3
+ //# sourceMappingURL=stress-test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stress-test.d.ts","sourceRoot":"","sources":["../../../src/tools/stress-test.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6G9D"}
@@ -0,0 +1,105 @@
1
+ import { z } from "zod";
2
+ import { registerAppTool } from "@modelcontextprotocol/ext-apps/server";
3
+ import { saveStressTest } from "../db/queries.js";
4
+ import { log } from "../lib/logger.js";
5
+ export function registerStressTestTool(server) {
6
+ registerAppTool(server, "save_stress_test", {
7
+ title: "Save Stress Test",
8
+ description: "Save completed stress test results for an idea. Call this ONCE after performing adversarial analysis.\n" +
9
+ "You are the adversary — use web search to find REAL failed predecessors, actual incumbents, and current regulatory landscape.\n" +
10
+ "Provide:\n" +
11
+ "- killScore (0-100): overall risk score. Higher = more dangerous.\n" +
12
+ " 0-20: safe, 21-40: caution, 41-60: risky, 61-80: dangerous, 81-100: critical\n" +
13
+ "- failedPredecessors: array of {name, year?, causeOfDeath, lesson} — real companies that tried and failed\n" +
14
+ "- incumbentThreats: array of {name, threat, defensibility} — who could copy or crush this idea\n" +
15
+ "- regulatoryRisks: array of {risk, jurisdiction?, severity?} — legal/regulatory concerns\n" +
16
+ "- hiddenCosts: array of {cost, estimate?} — costs the founder hasn't considered\n" +
17
+ "- investorQuestions: array of strings — tough questions an investor would ask\n\n" +
18
+ "This tool persists the stress test and re-renders the idea card with the Kill Score.",
19
+ inputSchema: z.object({
20
+ ideaId: z.string().describe("The ID of the idea to stress test"),
21
+ killScore: z.number().min(0).max(100).describe("Kill Score (0-100) — higher means more risk"),
22
+ failedPredecessors: z.array(z.object({
23
+ name: z.string(),
24
+ year: z.union([z.string(), z.number()]).optional(),
25
+ causeOfDeath: z.string(),
26
+ lesson: z.string(),
27
+ })).optional().describe("Real companies/products that tried this and failed"),
28
+ incumbentThreats: z.array(z.object({
29
+ name: z.string(),
30
+ threat: z.string(),
31
+ defensibility: z.string(),
32
+ })).optional().describe("Incumbents who could copy or crush this idea"),
33
+ regulatoryRisks: z.array(z.object({
34
+ risk: z.string(),
35
+ jurisdiction: z.string().optional(),
36
+ severity: z.string().optional(),
37
+ })).optional().describe("Legal and regulatory risks"),
38
+ hiddenCosts: z.array(z.object({
39
+ cost: z.string(),
40
+ estimate: z.string().optional(),
41
+ })).optional().describe("Hidden or underestimated costs"),
42
+ investorQuestions: z.array(z.string()).optional().describe("Tough investor questions"),
43
+ }),
44
+ _meta: { ui: { resourceUri: "ui://ara/idea-card" } },
45
+ }, async (input) => {
46
+ const stressTestData = {
47
+ failedPredecessors: input.failedPredecessors ?? [],
48
+ incumbentThreats: input.incumbentThreats ?? [],
49
+ regulatoryRisks: input.regulatoryRisks ?? [],
50
+ hiddenCosts: input.hiddenCosts ?? [],
51
+ investorQuestions: input.investorQuestions ?? [],
52
+ };
53
+ const idea = saveStressTest(input.ideaId, {
54
+ killScore: input.killScore,
55
+ stressTestData: stressTestData,
56
+ });
57
+ if (!idea) {
58
+ log.warn(`save_stress_test: idea not found — ${input.ideaId}`);
59
+ return {
60
+ content: [{
61
+ type: "text",
62
+ text: `Idea not found: "${input.ideaId}"`,
63
+ }],
64
+ isError: true,
65
+ };
66
+ }
67
+ log.info(`save_stress_test: saved for "${idea.title}" (${idea.id}) — killScore: ${idea.killScore}`);
68
+ // Return full data including stressTestData for artifact hydration.
69
+ // save_stress_test is the trigger tool — returns full data once for immediate rendering.
70
+ // get_idea and update_idea deliberately return abbreviated stress test fields (Pitfall 1).
71
+ return {
72
+ content: [{
73
+ type: "text",
74
+ text: JSON.stringify({
75
+ id: idea.id,
76
+ title: idea.title,
77
+ tagline: idea.tagline,
78
+ motivation: idea.motivation,
79
+ features: idea.features,
80
+ targetUsers: idea.targetUsers,
81
+ businessModel: idea.businessModel,
82
+ category: idea.category,
83
+ tags: idea.tags,
84
+ score: idea.score,
85
+ researchLevel: idea.researchLevel,
86
+ killScore: idea.killScore,
87
+ stressTestStatus: idea.stressTestStatus,
88
+ stressTestData: idea.stressTestData,
89
+ // Include research fields if available so artifact renders everything
90
+ ...(idea.researchStatus === 'complete' ? {
91
+ marketScore: idea.marketScore,
92
+ feasibilityScore: idea.feasibilityScore,
93
+ uniquenessScore: idea.uniquenessScore,
94
+ verdictSummary: idea.verdictSummary,
95
+ researchStatus: idea.researchStatus,
96
+ researchData: idea.researchData,
97
+ } : {}),
98
+ createdAt: idea.createdAt,
99
+ updatedAt: idea.updatedAt,
100
+ }),
101
+ }],
102
+ };
103
+ });
104
+ }
105
+ //# sourceMappingURL=stress-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stress-test.js","sourceRoot":"","sources":["../../../src/tools/stress-test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerUpdateTool(server: McpServer): void;
3
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/tools/update.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0G1D"}
@@ -0,0 +1,100 @@
1
+ import { z } from "zod";
2
+ import { registerAppTool } from "@modelcontextprotocol/ext-apps/server";
3
+ import { updateIdeaField } from "../db/queries.js";
4
+ import { log } from "../lib/logger.js";
5
+ export function registerUpdateTool(server) {
6
+ registerAppTool(server, "update_idea", {
7
+ title: "Update Idea",
8
+ description: "Update a single field of a saved idea. Use when the user asks to change a specific aspect of their idea (e.g., 'change the tagline to X', 'add a feature').\nAllowed fields: title, tagline, motivation, features, targetUsers, businessModel, category, tags, notes, stage, ideaType, rawText.\nFor array fields (features, tags), pass an array of strings.",
9
+ inputSchema: z.object({
10
+ ideaId: z.string().describe("The ID of the idea to update"),
11
+ field: z.string().describe("The field name to update (camelCase)"),
12
+ value: z
13
+ .union([z.string(), z.array(z.string())])
14
+ .describe("The new value"),
15
+ }),
16
+ _meta: { ui: { resourceUri: "ui://ara/idea-card" } },
17
+ }, async ({ ideaId, field, value }) => {
18
+ try {
19
+ const updated = updateIdeaField(ideaId, field, value);
20
+ if (!updated) {
21
+ log.warn(`update_idea: idea not found or field not allowed — ${ideaId}.${field}`);
22
+ return {
23
+ content: [
24
+ {
25
+ type: "text",
26
+ text: `Idea not found or field not allowed: ${ideaId}.${field}`,
27
+ },
28
+ ],
29
+ isError: true,
30
+ };
31
+ }
32
+ log.info(`update_idea: updated "${updated.title}" field "${field}" (${ideaId})`);
33
+ const researchFields = updated.researchStatus === 'complete' ? {
34
+ marketScore: updated.marketScore,
35
+ feasibilityScore: updated.feasibilityScore,
36
+ uniquenessScore: updated.uniquenessScore,
37
+ marketRationale: updated.marketRationale,
38
+ feasibilityRationale: updated.feasibilityRationale,
39
+ uniquenessRationale: updated.uniquenessRationale,
40
+ verdictSummary: updated.verdictSummary,
41
+ researchStatus: updated.researchStatus,
42
+ lastResearchedAt: updated.lastResearchedAt,
43
+ } : {};
44
+ // Note: stressTestData blob intentionally excluded (Pitfall 1 — update_idea is called on
45
+ // every field edit; including the blob would bloat Claude's context window)
46
+ const stressTestFields = updated.stressTestStatus === 'complete' ? {
47
+ killScore: updated.killScore,
48
+ stressTestStatus: updated.stressTestStatus,
49
+ } : {};
50
+ // Note: actionPlanData blob intentionally excluded (Pitfall 1 — update_idea is called on
51
+ // every field edit; including the blob would bloat Claude's context window)
52
+ const actionPlanFields = updated.actionPlanData ? {
53
+ actionPlanStatus: 'complete',
54
+ } : { actionPlanStatus: 'none' };
55
+ const pivotsFields = updated.pivotsData ? {
56
+ pivotsData: updated.pivotsData,
57
+ } : {};
58
+ return {
59
+ content: [
60
+ {
61
+ type: "text",
62
+ text: JSON.stringify({
63
+ id: updated.id,
64
+ title: updated.title,
65
+ tagline: updated.tagline,
66
+ motivation: updated.motivation,
67
+ features: updated.features,
68
+ targetUsers: updated.targetUsers,
69
+ businessModel: updated.businessModel,
70
+ category: updated.category,
71
+ tags: updated.tags,
72
+ score: updated.score,
73
+ researchLevel: updated.researchLevel,
74
+ createdAt: updated.createdAt,
75
+ updatedAt: updated.updatedAt,
76
+ ...researchFields,
77
+ ...stressTestFields,
78
+ ...actionPlanFields,
79
+ ...pivotsFields,
80
+ }),
81
+ },
82
+ ],
83
+ };
84
+ }
85
+ catch (err) {
86
+ const message = err instanceof Error ? err.message : String(err);
87
+ log.warn(`update_idea: error — ${message}`);
88
+ return {
89
+ content: [
90
+ {
91
+ type: "text",
92
+ text: `Update failed: ${message}`,
93
+ },
94
+ ],
95
+ isError: true,
96
+ };
97
+ }
98
+ });
99
+ }
100
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/tools/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,217 @@
1
+ export interface Idea {
2
+ id: string;
3
+ rawText: string;
4
+ title: string;
5
+ tagline: string;
6
+ motivation: string;
7
+ features: string[];
8
+ ideaType: string;
9
+ category: string;
10
+ tags: string[];
11
+ targetUsers: string;
12
+ notes: string;
13
+ businessModel: string;
14
+ stage: string;
15
+ score: number;
16
+ marketScore: number;
17
+ feasibilityScore: number;
18
+ uniquenessScore: number;
19
+ killScore: number;
20
+ researchStatus: 'none' | 'pending' | 'in_progress' | 'complete' | 'failed';
21
+ researchLevel: number;
22
+ researchData: ResearchData | null;
23
+ sourceCount: number;
24
+ marketInsights: string;
25
+ marketRationale: string;
26
+ feasibilityRationale: string;
27
+ uniquenessRationale: string;
28
+ researchConfidence: string;
29
+ verdictSummary: string;
30
+ lastResearchedAt: string | null;
31
+ stressTestData: StressTestResult | null;
32
+ stressTestStatus: 'none' | 'pending' | 'complete' | 'failed';
33
+ actionPlanData: ActionPlanResult | null;
34
+ pivotsData: PivotSuggestion[] | null;
35
+ pivotSnapshot: PivotSnapshot | null;
36
+ canvasOverrides: Record<string, string>;
37
+ canvasOriginals: Record<string, string>;
38
+ keyMetricsData: KeyMetric[] | null;
39
+ deletedAt: string | null;
40
+ createdAt: string;
41
+ updatedAt: string;
42
+ }
43
+ export interface IdeaRow {
44
+ id: string;
45
+ raw_text: string;
46
+ title: string;
47
+ tagline: string;
48
+ motivation: string;
49
+ features: string;
50
+ idea_type: string;
51
+ category: string;
52
+ tags: string;
53
+ target_users: string;
54
+ notes: string;
55
+ business_model: string;
56
+ stage: string;
57
+ score: number;
58
+ market_score: number;
59
+ feasibility_score: number;
60
+ uniqueness_score: number;
61
+ kill_score: number;
62
+ research_status: string;
63
+ research_level: number;
64
+ research_data: string | null;
65
+ source_count: number;
66
+ market_insights: string;
67
+ market_rationale: string;
68
+ feasibility_rationale: string;
69
+ uniqueness_rationale: string;
70
+ research_confidence: string;
71
+ verdict_summary: string;
72
+ last_researched_at: string | null;
73
+ stress_test_data: string | null;
74
+ stress_test_status: string;
75
+ action_plan_data: string | null;
76
+ pivots_data: string | null;
77
+ pivot_snapshot: string | null;
78
+ canvas_overrides: string;
79
+ canvas_originals: string;
80
+ key_metrics_data: string | null;
81
+ deleted_at: string | null;
82
+ created_at: string;
83
+ updated_at: string;
84
+ }
85
+ export interface Competitor {
86
+ name: string;
87
+ description: string;
88
+ strengths: string[];
89
+ weaknesses: string[];
90
+ url?: string;
91
+ }
92
+ export interface MarketSizing {
93
+ tam: string;
94
+ sam: string;
95
+ som: string;
96
+ growthRate?: string;
97
+ timeframe?: string;
98
+ confidence?: string;
99
+ }
100
+ export interface SwotAnalysis {
101
+ strengths: string[];
102
+ weaknesses: string[];
103
+ opportunities: string[];
104
+ threats: string[];
105
+ }
106
+ export interface TrendItem {
107
+ title: string;
108
+ description: string;
109
+ direction: 'emerging' | 'growing' | 'stable' | 'declining';
110
+ }
111
+ export interface AudienceSegment {
112
+ name: string;
113
+ description: string;
114
+ size?: string;
115
+ }
116
+ export interface FailedPredecessor {
117
+ name: string;
118
+ year?: string | number;
119
+ causeOfDeath: string;
120
+ lesson: string;
121
+ }
122
+ export interface IncumbentThreat {
123
+ name: string;
124
+ threat: string;
125
+ defensibility: string;
126
+ }
127
+ export interface RegulatoryRisk {
128
+ risk: string;
129
+ jurisdiction?: string;
130
+ severity?: string;
131
+ }
132
+ export interface HiddenCost {
133
+ cost: string;
134
+ estimate?: string;
135
+ }
136
+ export interface ResearchData {
137
+ competitors: Competitor[];
138
+ marketSizing: MarketSizing;
139
+ swotAnalysis: SwotAnalysis;
140
+ trends: TrendItem[];
141
+ audienceSegments: AudienceSegment[];
142
+ [key: string]: unknown;
143
+ }
144
+ export interface StressTestResult {
145
+ killScore: number;
146
+ failedPredecessors: FailedPredecessor[];
147
+ incumbentThreats: IncumbentThreat[];
148
+ regulatoryRisks: RegulatoryRisk[];
149
+ hiddenCosts: HiddenCost[];
150
+ investorQuestions: string[];
151
+ [key: string]: unknown;
152
+ }
153
+ export interface Feature {
154
+ name: string;
155
+ description?: string;
156
+ }
157
+ export interface BuildPhase {
158
+ name: string;
159
+ duration: string;
160
+ milestones: string[];
161
+ }
162
+ export interface BuildPlan {
163
+ mustHave: Feature[];
164
+ shouldHave: Feature[];
165
+ niceToHave: Feature[];
166
+ techStack: string[];
167
+ phases: BuildPhase[];
168
+ }
169
+ export interface ValidationTest {
170
+ assumption: string;
171
+ test: string;
172
+ successMetric: string;
173
+ method?: string;
174
+ }
175
+ export interface GTMStrategy {
176
+ positioningStatement: string;
177
+ channels: string[];
178
+ pricingModel: string;
179
+ launchStrategy: string;
180
+ }
181
+ export interface PitchSlide {
182
+ title: string;
183
+ bullets: string[];
184
+ }
185
+ export interface ActionPlanResult {
186
+ buildPlan: BuildPlan;
187
+ validationTests: ValidationTest[];
188
+ gtmStrategy: GTMStrategy;
189
+ pitchOutline: PitchSlide[];
190
+ }
191
+ export interface PivotSuggestion {
192
+ angle: string;
193
+ title: string;
194
+ tagline: string;
195
+ description: string;
196
+ rationale: string;
197
+ features?: string[];
198
+ targetUsers?: string;
199
+ businessModel?: string;
200
+ }
201
+ export interface PivotSnapshot {
202
+ title: string;
203
+ tagline: string;
204
+ motivation: string;
205
+ features: string[];
206
+ targetUsers: string;
207
+ businessModel: string;
208
+ }
209
+ export interface KeyMetric {
210
+ name: string;
211
+ target: string;
212
+ measurement: string;
213
+ [key: string]: unknown;
214
+ }
215
+ export declare function rowToIdea(row: IdeaRow): Idea;
216
+ export declare function ideaToRow(idea: Partial<Idea>): Partial<IdeaRow>;
217
+ //# sourceMappingURL=types.d.ts.map