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.
- package/README.md +85 -0
- package/dist/action-plan.html +221 -0
- package/dist/idea-card.html +313 -0
- package/dist/lean-canvas.html +145 -0
- package/dist-server/server.d.ts +3 -0
- package/dist-server/server.d.ts.map +1 -0
- package/dist-server/server.js +62 -0
- package/dist-server/server.js.map +1 -0
- package/dist-server/src/db/database.d.ts +5 -0
- package/dist-server/src/db/database.d.ts.map +1 -0
- package/dist-server/src/db/database.js +29 -0
- package/dist-server/src/db/database.js.map +1 -0
- package/dist-server/src/db/queries.d.ts +38 -0
- package/dist-server/src/db/queries.d.ts.map +1 -0
- package/dist-server/src/db/queries.js +384 -0
- package/dist-server/src/db/queries.js.map +1 -0
- package/dist-server/src/db/schema.d.ts +3 -0
- package/dist-server/src/db/schema.d.ts.map +1 -0
- package/dist-server/src/db/schema.js +58 -0
- package/dist-server/src/db/schema.js.map +1 -0
- package/dist-server/src/lib/logger.d.ts +7 -0
- package/dist-server/src/lib/logger.d.ts.map +1 -0
- package/dist-server/src/lib/logger.js +10 -0
- package/dist-server/src/lib/logger.js.map +1 -0
- package/dist-server/src/resources/action-plan.d.ts +3 -0
- package/dist-server/src/resources/action-plan.d.ts.map +1 -0
- package/dist-server/src/resources/action-plan.js +34 -0
- package/dist-server/src/resources/action-plan.js.map +1 -0
- package/dist-server/src/resources/idea-card.d.ts +3 -0
- package/dist-server/src/resources/idea-card.d.ts.map +1 -0
- package/dist-server/src/resources/idea-card.js +34 -0
- package/dist-server/src/resources/idea-card.js.map +1 -0
- package/dist-server/src/resources/lean-canvas.d.ts +3 -0
- package/dist-server/src/resources/lean-canvas.d.ts.map +1 -0
- package/dist-server/src/resources/lean-canvas.js +34 -0
- package/dist-server/src/resources/lean-canvas.js.map +1 -0
- package/dist-server/src/tools/action-plan.d.ts +3 -0
- package/dist-server/src/tools/action-plan.d.ts.map +1 -0
- package/dist-server/src/tools/action-plan.js +163 -0
- package/dist-server/src/tools/action-plan.js.map +1 -0
- package/dist-server/src/tools/canvas.d.ts +3 -0
- package/dist-server/src/tools/canvas.d.ts.map +1 -0
- package/dist-server/src/tools/canvas.js +112 -0
- package/dist-server/src/tools/canvas.js.map +1 -0
- package/dist-server/src/tools/capture.d.ts +3 -0
- package/dist-server/src/tools/capture.d.ts.map +1 -0
- package/dist-server/src/tools/capture.js +63 -0
- package/dist-server/src/tools/capture.js.map +1 -0
- package/dist-server/src/tools/delete.d.ts +3 -0
- package/dist-server/src/tools/delete.d.ts.map +1 -0
- package/dist-server/src/tools/delete.js +43 -0
- package/dist-server/src/tools/delete.js.map +1 -0
- package/dist-server/src/tools/get.d.ts +3 -0
- package/dist-server/src/tools/get.d.ts.map +1 -0
- package/dist-server/src/tools/get.js +80 -0
- package/dist-server/src/tools/get.js.map +1 -0
- package/dist-server/src/tools/list.d.ts +3 -0
- package/dist-server/src/tools/list.d.ts.map +1 -0
- package/dist-server/src/tools/list.js +20 -0
- package/dist-server/src/tools/list.js.map +1 -0
- package/dist-server/src/tools/pivot.d.ts +3 -0
- package/dist-server/src/tools/pivot.d.ts.map +1 -0
- package/dist-server/src/tools/pivot.js +68 -0
- package/dist-server/src/tools/pivot.js.map +1 -0
- package/dist-server/src/tools/research.d.ts +3 -0
- package/dist-server/src/tools/research.d.ts.map +1 -0
- package/dist-server/src/tools/research.js +106 -0
- package/dist-server/src/tools/research.js.map +1 -0
- package/dist-server/src/tools/stress-test.d.ts +3 -0
- package/dist-server/src/tools/stress-test.d.ts.map +1 -0
- package/dist-server/src/tools/stress-test.js +105 -0
- package/dist-server/src/tools/stress-test.js.map +1 -0
- package/dist-server/src/tools/update.d.ts +3 -0
- package/dist-server/src/tools/update.d.ts.map +1 -0
- package/dist-server/src/tools/update.js +100 -0
- package/dist-server/src/tools/update.js.map +1 -0
- package/dist-server/src/types.d.ts +217 -0
- package/dist-server/src/types.d.ts.map +1 -0
- package/dist-server/src/types.js +139 -0
- package/dist-server/src/types.js.map +1 -0
- package/dist-server/tests/db/action-plan.test.d.ts +2 -0
- package/dist-server/tests/db/action-plan.test.d.ts.map +1 -0
- package/dist-server/tests/db/action-plan.test.js +212 -0
- package/dist-server/tests/db/action-plan.test.js.map +1 -0
- package/dist-server/tests/db/canvas.test.d.ts +2 -0
- package/dist-server/tests/db/canvas.test.d.ts.map +1 -0
- package/dist-server/tests/db/canvas.test.js +91 -0
- package/dist-server/tests/db/canvas.test.js.map +1 -0
- package/dist-server/tests/db/queries.test.d.ts +2 -0
- package/dist-server/tests/db/queries.test.d.ts.map +1 -0
- package/dist-server/tests/db/queries.test.js +92 -0
- package/dist-server/tests/db/queries.test.js.map +1 -0
- package/dist-server/tests/db/stress-test.test.d.ts +2 -0
- package/dist-server/tests/db/stress-test.test.d.ts.map +1 -0
- package/dist-server/tests/db/stress-test.test.js +78 -0
- package/dist-server/tests/db/stress-test.test.js.map +1 -0
- package/dist-server/tests/resources/idea-card.test.d.ts +2 -0
- package/dist-server/tests/resources/idea-card.test.d.ts.map +1 -0
- package/dist-server/tests/resources/idea-card.test.js +14 -0
- package/dist-server/tests/resources/idea-card.test.js.map +1 -0
- package/dist-server/tests/resources/lean-canvas.test.d.ts +2 -0
- package/dist-server/tests/resources/lean-canvas.test.d.ts.map +1 -0
- package/dist-server/tests/resources/lean-canvas.test.js +14 -0
- package/dist-server/tests/resources/lean-canvas.test.js.map +1 -0
- package/dist-server/tests/tools/action-plan.test.d.ts +2 -0
- package/dist-server/tests/tools/action-plan.test.d.ts.map +1 -0
- package/dist-server/tests/tools/action-plan.test.js +110 -0
- package/dist-server/tests/tools/action-plan.test.js.map +1 -0
- package/dist-server/tests/tools/canvas.test.d.ts +2 -0
- package/dist-server/tests/tools/canvas.test.d.ts.map +1 -0
- package/dist-server/tests/tools/canvas.test.js +55 -0
- package/dist-server/tests/tools/canvas.test.js.map +1 -0
- package/dist-server/tests/tools/capture.test.d.ts +2 -0
- package/dist-server/tests/tools/capture.test.d.ts.map +1 -0
- package/dist-server/tests/tools/capture.test.js +40 -0
- package/dist-server/tests/tools/capture.test.js.map +1 -0
- package/dist-server/tests/tools/delete.test.d.ts +2 -0
- package/dist-server/tests/tools/delete.test.d.ts.map +1 -0
- package/dist-server/tests/tools/delete.test.js +24 -0
- package/dist-server/tests/tools/delete.test.js.map +1 -0
- package/dist-server/tests/tools/get.test.d.ts +2 -0
- package/dist-server/tests/tools/get.test.d.ts.map +1 -0
- package/dist-server/tests/tools/get.test.js +29 -0
- package/dist-server/tests/tools/get.test.js.map +1 -0
- package/dist-server/tests/tools/list.test.d.ts +2 -0
- package/dist-server/tests/tools/list.test.d.ts.map +1 -0
- package/dist-server/tests/tools/list.test.js +33 -0
- package/dist-server/tests/tools/list.test.js.map +1 -0
- package/dist-server/tests/tools/research.test.d.ts +2 -0
- package/dist-server/tests/tools/research.test.d.ts.map +1 -0
- package/dist-server/tests/tools/research.test.js +61 -0
- package/dist-server/tests/tools/research.test.js.map +1 -0
- package/dist-server/tests/tools/stress-test.test.d.ts +2 -0
- package/dist-server/tests/tools/stress-test.test.d.ts.map +1 -0
- package/dist-server/tests/tools/stress-test.test.js +98 -0
- package/dist-server/tests/tools/stress-test.test.js.map +1 -0
- package/dist-server/tests/tools/update.test.d.ts +2 -0
- package/dist-server/tests/tools/update.test.d.ts.map +1 -0
- package/dist-server/tests/tools/update.test.js +30 -0
- package/dist-server/tests/tools/update.test.js.map +1 -0
- 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 @@
|
|
|
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":"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"}
|
|
@@ -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 @@
|
|
|
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
|