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,98 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from "vitest";
|
|
2
|
+
import { getDatabase } from "../../src/db/database.js";
|
|
3
|
+
import { saveIdea, getIdeaById, saveStressTest } from "../../src/db/queries.js";
|
|
4
|
+
const integrationPayload = {
|
|
5
|
+
killScore: 65,
|
|
6
|
+
stressTestData: {
|
|
7
|
+
failedPredecessors: [
|
|
8
|
+
{ name: "Vine", year: "2017", causeOfDeath: "Failed to monetize creators before TikTok arrived", lesson: "Creator economics must be in v1" },
|
|
9
|
+
],
|
|
10
|
+
incumbentThreats: [
|
|
11
|
+
{ name: "Notion AI", threat: "Idea validation templates now AI-powered", defensibility: "Ara's pipeline is purpose-built, not a template hack" },
|
|
12
|
+
],
|
|
13
|
+
regulatoryRisks: [
|
|
14
|
+
{ risk: "AI-generated content may require disclosure in some jurisdictions", jurisdiction: "EU", severity: "medium" },
|
|
15
|
+
],
|
|
16
|
+
hiddenCosts: [
|
|
17
|
+
{ cost: "LLM inference costs grow with context window usage", estimate: "$0.05/idea scored" },
|
|
18
|
+
],
|
|
19
|
+
investorQuestions: [
|
|
20
|
+
"How does your pipeline differ from ChatGPT with a good prompt?",
|
|
21
|
+
"What's your defensibility when OpenAI adds this natively?",
|
|
22
|
+
],
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
describe("save_stress_test integration", () => {
|
|
26
|
+
beforeEach(() => {
|
|
27
|
+
const db = getDatabase();
|
|
28
|
+
db.exec("DELETE FROM ideas");
|
|
29
|
+
saveIdea({ id: "st-int-001", title: "Stress Integration Idea" });
|
|
30
|
+
});
|
|
31
|
+
it("persists killScore and stressTestStatus via getIdeaById", () => {
|
|
32
|
+
saveStressTest("st-int-001", integrationPayload);
|
|
33
|
+
const idea = getIdeaById("st-int-001");
|
|
34
|
+
expect(idea).not.toBeNull();
|
|
35
|
+
expect(idea.killScore).toBe(65);
|
|
36
|
+
expect(idea.stressTestStatus).toBe("complete");
|
|
37
|
+
});
|
|
38
|
+
it("returns null for non-existent idea", () => {
|
|
39
|
+
const result = saveStressTest("no-such-idea", integrationPayload);
|
|
40
|
+
expect(result).toBeNull();
|
|
41
|
+
});
|
|
42
|
+
it("stressTestData is not null and has failedPredecessors after save", () => {
|
|
43
|
+
saveStressTest("st-int-001", integrationPayload);
|
|
44
|
+
const idea = getIdeaById("st-int-001");
|
|
45
|
+
expect(idea.stressTestData).not.toBeNull();
|
|
46
|
+
const predecessors = idea.stressTestData.failedPredecessors;
|
|
47
|
+
expect(predecessors.length).toBeGreaterThan(0);
|
|
48
|
+
});
|
|
49
|
+
it("idea has killScore and stressTestStatus fields (simulates get_idea abbreviated fields)", () => {
|
|
50
|
+
saveStressTest("st-int-001", integrationPayload);
|
|
51
|
+
const idea = getIdeaById("st-int-001");
|
|
52
|
+
// Simulate what get_idea would return in abbreviated JSON
|
|
53
|
+
const abbreviated = {
|
|
54
|
+
id: idea.id,
|
|
55
|
+
title: idea.title,
|
|
56
|
+
killScore: idea.killScore,
|
|
57
|
+
stressTestStatus: idea.stressTestStatus,
|
|
58
|
+
};
|
|
59
|
+
expect(abbreviated.killScore).toBe(65);
|
|
60
|
+
expect(abbreviated.stressTestStatus).toBe("complete");
|
|
61
|
+
});
|
|
62
|
+
it("abbreviated content does NOT include stressTestData blob (Pitfall 1)", () => {
|
|
63
|
+
saveStressTest("st-int-001", integrationPayload);
|
|
64
|
+
const idea = getIdeaById("st-int-001");
|
|
65
|
+
// stressTestData blob exists on the full idea...
|
|
66
|
+
expect(idea.stressTestData).not.toBeNull();
|
|
67
|
+
// ...but a properly abbreviated tool response omits it
|
|
68
|
+
const abbreviated = {
|
|
69
|
+
id: idea.id,
|
|
70
|
+
title: idea.title,
|
|
71
|
+
killScore: idea.killScore,
|
|
72
|
+
stressTestStatus: idea.stressTestStatus,
|
|
73
|
+
};
|
|
74
|
+
expect("stressTestData" in abbreviated).toBe(false);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
// Pure function — these tests pass immediately with no external dependencies
|
|
78
|
+
function buildRefineMessage(boxLabel, content, ideaTitle) {
|
|
79
|
+
if (!content || !content.trim()) {
|
|
80
|
+
return `Help me fill the "${boxLabel}" box for this idea (idea: "${ideaTitle}").`;
|
|
81
|
+
}
|
|
82
|
+
return `Help me improve the "${boxLabel}" box for this idea:\n\nCurrent content: "${content}"`;
|
|
83
|
+
}
|
|
84
|
+
describe("click-to-refine message construction", () => {
|
|
85
|
+
it("filled box message includes box label and current content", () => {
|
|
86
|
+
const message = buildRefineMessage("Problem", "Users can't validate ideas fast", "Ara");
|
|
87
|
+
expect(message).toContain("improve");
|
|
88
|
+
expect(message).toContain("Problem");
|
|
89
|
+
expect(message).toContain("Users can't validate ideas fast");
|
|
90
|
+
});
|
|
91
|
+
it("empty box message asks to 'fill' the box with idea title", () => {
|
|
92
|
+
const message = buildRefineMessage("Channels", "", "Ara");
|
|
93
|
+
expect(message).toContain("fill");
|
|
94
|
+
expect(message).toContain("Channels");
|
|
95
|
+
expect(message).toContain("Ara");
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
//# sourceMappingURL=stress-test.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stress-test.test.js","sourceRoot":"","sources":["../../../tests/tools/stress-test.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.test.d.ts","sourceRoot":"","sources":["../../../tests/tools/update.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from "vitest";
|
|
2
|
+
import { getDatabase } from "../../src/db/database.js";
|
|
3
|
+
import { saveIdea, updateIdeaField, getIdeaById } from "../../src/db/queries.js";
|
|
4
|
+
describe("update_idea (updateIdeaField)", () => {
|
|
5
|
+
beforeEach(() => {
|
|
6
|
+
const db = getDatabase();
|
|
7
|
+
db.exec("DELETE FROM ideas");
|
|
8
|
+
saveIdea({ id: "upd-001", title: "Original Title", tagline: "Original tagline" });
|
|
9
|
+
});
|
|
10
|
+
it("updates a string field and returns updated idea", () => {
|
|
11
|
+
const updated = updateIdeaField("upd-001", "tagline", "New tagline");
|
|
12
|
+
expect(updated).not.toBeNull();
|
|
13
|
+
expect(updated.tagline).toBe("New tagline");
|
|
14
|
+
});
|
|
15
|
+
it("updates an array field (features)", () => {
|
|
16
|
+
const updated = updateIdeaField("upd-001", "features", ["feat-1", "feat-2"]);
|
|
17
|
+
expect(updated).not.toBeNull();
|
|
18
|
+
expect(updated.features).toEqual(["feat-1", "feat-2"]);
|
|
19
|
+
});
|
|
20
|
+
it("returns null for non-existent idea", () => {
|
|
21
|
+
const result = updateIdeaField("nonexistent", "title", "Nope");
|
|
22
|
+
expect(result).toBeNull();
|
|
23
|
+
});
|
|
24
|
+
it("persists update to SQLite", () => {
|
|
25
|
+
updateIdeaField("upd-001", "title", "Updated Title");
|
|
26
|
+
const retrieved = getIdeaById("upd-001");
|
|
27
|
+
expect(retrieved.title).toBe("Updated Title");
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=update.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.test.js","sourceRoot":"","sources":["../../../tests/tools/update.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEjF,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;QACzB,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC7B,QAAQ,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,OAAO,GAAG,eAAe,CAAC,SAAS,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;QACrE,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC/B,MAAM,CAAC,OAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,OAAO,GAAG,eAAe,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC7E,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC/B,MAAM,CAAC,OAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,MAAM,GAAG,eAAe,CAAC,aAAa,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,eAAe,CAAC,SAAS,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;QACrD,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,CAAC,SAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ara-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Ara idea validation MCP server — capture, research, score, and build Lean Canvases for business ideas inside Claude",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"ara-mcp": "dist-server/server.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist-server",
|
|
11
|
+
"dist"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"dev": "concurrently \"npx tsx --watch server.ts\" \"npm run build:idea-card -- --watch\"",
|
|
15
|
+
"build": "npm run build:idea-card && npm run build:lean-canvas && npm run build:action-plan && tsc",
|
|
16
|
+
"build:idea-card": "cross-env INPUT=idea-card vite build",
|
|
17
|
+
"build:lean-canvas": "cross-env INPUT=lean-canvas vite build",
|
|
18
|
+
"build:action-plan": "cross-env INPUT=action-plan vite build",
|
|
19
|
+
"prepare": "npm run build",
|
|
20
|
+
"start": "node dist-server/server.js",
|
|
21
|
+
"typecheck": "tsc --noEmit",
|
|
22
|
+
"test": "vitest run --reporter=verbose",
|
|
23
|
+
"test:watch": "vitest --reporter=verbose",
|
|
24
|
+
"test:coverage": "vitest run --reporter=verbose --coverage"
|
|
25
|
+
},
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@modelcontextprotocol/ext-apps": "^1.0.0",
|
|
28
|
+
"@modelcontextprotocol/sdk": "^1.28.0",
|
|
29
|
+
"better-sqlite3": "^11.0.0",
|
|
30
|
+
"cors": "^2.8.5",
|
|
31
|
+
"express": "^5.1.0",
|
|
32
|
+
"zod": "^4.1.13"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@types/better-sqlite3": "^7.0.0",
|
|
36
|
+
"@types/cors": "^2.8.19",
|
|
37
|
+
"@types/express": "^5.0.0",
|
|
38
|
+
"@types/node": "22.10.0",
|
|
39
|
+
"@vitest/coverage-v8": "^4.1.2",
|
|
40
|
+
"concurrently": "^9.2.1",
|
|
41
|
+
"cross-env": "^10.1.0",
|
|
42
|
+
"tsx": "^4.0.0",
|
|
43
|
+
"typescript": "^5.9.3",
|
|
44
|
+
"vite": "^6.0.0",
|
|
45
|
+
"vite-plugin-singlefile": "^2.3.0",
|
|
46
|
+
"vitest": "^4.1.2"
|
|
47
|
+
}
|
|
48
|
+
}
|