@silverbackbase/root 0.4.1 → 0.4.2
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/dist/core/db.d.ts +4 -4
- package/dist/core/db.js +8 -8
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.js +1 -1
- package/dist/core/knowledge.d.ts +3 -3
- package/dist/core/knowledge.js +7 -7
- package/dist/mcp.js +37 -37
- package/dist/mcp.js.map +1 -1
- package/package.json +1 -1
package/dist/core/db.d.ts
CHANGED
|
@@ -8,10 +8,10 @@ export interface KnowledgeRow {
|
|
|
8
8
|
updatedAt: Date;
|
|
9
9
|
}
|
|
10
10
|
export interface KnowledgeDB {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
createProject(id: string, name: string, url: string): Promise<ClientRow>;
|
|
12
|
+
listProjects(): Promise<ClientRow[]>;
|
|
13
|
+
getProject(id: string): Promise<ClientRow | undefined>;
|
|
14
|
+
deleteProject(id: string): Promise<{
|
|
15
15
|
items_removed: number;
|
|
16
16
|
}>;
|
|
17
17
|
getAll(accountId: string): Promise<KnowledgeRow[]>;
|
package/dist/core/db.js
CHANGED
|
@@ -60,20 +60,20 @@ function createSQLiteDB(dbPath) {
|
|
|
60
60
|
sqlite.exec("PRAGMA foreign_keys = ON;");
|
|
61
61
|
sqlite.exec(CREATE_TABLE_SQL);
|
|
62
62
|
return {
|
|
63
|
-
async
|
|
63
|
+
async createProject(id, name, url) {
|
|
64
64
|
const now = new Date().toISOString();
|
|
65
65
|
sqlite.prepare("INSERT INTO clients (id, name, url, created_at) VALUES (?, ?, ?, ?)").run(id, name, url, now);
|
|
66
66
|
return { id, name, url, createdAt: new Date(now) };
|
|
67
67
|
},
|
|
68
|
-
async
|
|
68
|
+
async listProjects() {
|
|
69
69
|
const rows = sqlite.prepare("SELECT * FROM clients ORDER BY created_at DESC").all();
|
|
70
70
|
return rows.map(parseSqliteClient);
|
|
71
71
|
},
|
|
72
|
-
async
|
|
72
|
+
async getProject(id) {
|
|
73
73
|
const row = sqlite.prepare("SELECT * FROM clients WHERE id = ?").get(id);
|
|
74
74
|
return row ? parseSqliteClient(row) : undefined;
|
|
75
75
|
},
|
|
76
|
-
async
|
|
76
|
+
async deleteProject(id) {
|
|
77
77
|
const count = sqlite.prepare("SELECT COUNT(*) as n FROM knowledge_items WHERE account_id = ?").get(id).n;
|
|
78
78
|
sqlite.prepare("DELETE FROM knowledge_items WHERE account_id = ?").run(id);
|
|
79
79
|
sqlite.prepare("DELETE FROM clients WHERE id = ?").run(id);
|
|
@@ -133,24 +133,24 @@ function createPostgresDB(url) {
|
|
|
133
133
|
};
|
|
134
134
|
}
|
|
135
135
|
return {
|
|
136
|
-
async
|
|
136
|
+
async createProject(id, name, url) {
|
|
137
137
|
const now = new Date();
|
|
138
138
|
await sql `INSERT INTO clients (id, name, url, created_at) VALUES (${id}, ${name}, ${url}, ${now})`;
|
|
139
139
|
return { id, name, url, createdAt: now };
|
|
140
140
|
},
|
|
141
|
-
async
|
|
141
|
+
async listProjects() {
|
|
142
142
|
await ensureInit();
|
|
143
143
|
const rows = await sql `SELECT * FROM clients ORDER BY created_at DESC`;
|
|
144
144
|
return rows.map((r) => ({ id: r.id, name: r.name, url: r.url, createdAt: new Date(r.created_at) }));
|
|
145
145
|
},
|
|
146
|
-
async
|
|
146
|
+
async getProject(id) {
|
|
147
147
|
await ensureInit();
|
|
148
148
|
const [row] = await sql `SELECT * FROM clients WHERE id = ${id}`;
|
|
149
149
|
if (!row)
|
|
150
150
|
return undefined;
|
|
151
151
|
return { id: row.id, name: row.name, url: row.url, createdAt: new Date(row.created_at) };
|
|
152
152
|
},
|
|
153
|
-
async
|
|
153
|
+
async deleteProject(id) {
|
|
154
154
|
await ensureInit();
|
|
155
155
|
const [{ n }] = await sql `SELECT COUNT(*)::int as n FROM knowledge_items WHERE account_id = ${id}`;
|
|
156
156
|
await sql `DELETE FROM knowledge_items WHERE account_id = ${id}`;
|
package/dist/core/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { getContext, getCategory, createItem, updateItem, deleteItem, searchKnowledge,
|
|
1
|
+
export { getContext, getCategory, createItem, updateItem, deleteItem, searchKnowledge, createProject, listProjects, deleteProject } from "./knowledge.js";
|
|
2
2
|
export { onboardFromUrl } from "./onboard.js";
|
|
3
3
|
export { refreshKnowledge } from "./refresh.js";
|
|
4
4
|
export type { KnowledgeCategory, KnowledgeItem, BusinessContext, OnboardResult, RefreshDiff, ClientRow } from "./types.js";
|
package/dist/core/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { getContext, getCategory, createItem, updateItem, deleteItem, searchKnowledge,
|
|
1
|
+
export { getContext, getCategory, createItem, updateItem, deleteItem, searchKnowledge, createProject, listProjects, deleteProject } from "./knowledge.js";
|
|
2
2
|
export { onboardFromUrl } from "./onboard.js";
|
|
3
3
|
export { refreshKnowledge } from "./refresh.js";
|
|
4
4
|
export { CATEGORIES } from "./types.js";
|
package/dist/core/knowledge.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { KnowledgeCategory, BusinessContext, ClientRow } from "./types.js";
|
|
2
|
-
export declare function
|
|
3
|
-
export declare function
|
|
4
|
-
export declare function
|
|
2
|
+
export declare function createProject(name: string, url: string): Promise<ClientRow>;
|
|
3
|
+
export declare function listProjects(): Promise<ClientRow[]>;
|
|
4
|
+
export declare function deleteProject(clientId: string): Promise<{
|
|
5
5
|
deleted: boolean;
|
|
6
6
|
items_removed: number;
|
|
7
7
|
}>;
|
package/dist/core/knowledge.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { nanoid } from "nanoid";
|
|
2
2
|
import { db } from "./db.js";
|
|
3
|
-
export async function
|
|
3
|
+
export async function createProject(name, url) {
|
|
4
4
|
const id = nanoid();
|
|
5
|
-
return db.
|
|
5
|
+
return db.createProject(id, name, url);
|
|
6
6
|
}
|
|
7
|
-
export async function
|
|
8
|
-
return db.
|
|
7
|
+
export async function listProjects() {
|
|
8
|
+
return db.listProjects();
|
|
9
9
|
}
|
|
10
|
-
export async function
|
|
11
|
-
const client = await db.
|
|
10
|
+
export async function deleteProject(clientId) {
|
|
11
|
+
const client = await db.getProject(clientId);
|
|
12
12
|
if (!client)
|
|
13
13
|
return { deleted: false, items_removed: 0 };
|
|
14
|
-
const { items_removed } = await db.
|
|
14
|
+
const { items_removed } = await db.deleteProject(clientId);
|
|
15
15
|
return { deleted: true, items_removed };
|
|
16
16
|
}
|
|
17
17
|
export async function getContext(accountId) {
|
package/dist/mcp.js
CHANGED
|
@@ -1,126 +1,126 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import { WebStandardStreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js";
|
|
3
3
|
import { z } from "zod";
|
|
4
|
-
import { getContext, getCategory, createItem, updateItem, deleteItem, searchKnowledge,
|
|
4
|
+
import { getContext, getCategory, createItem, updateItem, deleteItem, searchKnowledge, createProject, listProjects, deleteProject, } from "./core/knowledge.js";
|
|
5
5
|
import { onboardFromUrl } from "./core/onboard.js";
|
|
6
6
|
import { refreshKnowledge } from "./core/refresh.js";
|
|
7
7
|
const CATEGORY_ENUM = z.enum([
|
|
8
8
|
"offer", "persona", "objection", "differentiator",
|
|
9
9
|
"competitor", "geo", "pricing", "faq", "profile",
|
|
10
10
|
]);
|
|
11
|
-
const
|
|
12
|
-
function
|
|
13
|
-
return
|
|
11
|
+
const PROJECT_ID_PARAM = z.string().optional().describe("Project ID. If omitted, uses ROOT_ACCOUNT_ID env var (defaults to 'default').");
|
|
12
|
+
function resolveProjectId(projectId) {
|
|
13
|
+
return projectId ?? process.env.ROOT_ACCOUNT_ID ?? "default";
|
|
14
14
|
}
|
|
15
15
|
export function buildServer() {
|
|
16
16
|
const server = new McpServer({ name: "root", version: "0.4.0" });
|
|
17
17
|
// ── CLIENT MANAGEMENT ─────────────────────────────────────────────────────
|
|
18
|
-
server.registerTool("
|
|
18
|
+
server.registerTool("root_create_project", {
|
|
19
19
|
description: "Create a new account and automatically onboard a website. Scrapes the URL, extracts business knowledge (offers, personas, competitors, geo zones…) and stores it under a new isolated account ID. Returns the account object and the full onboarding summary.",
|
|
20
20
|
inputSchema: {
|
|
21
21
|
name: z.string().describe("Account name (e.g. 'Mon business', 'Agence Dupont', 'Projet X')"),
|
|
22
22
|
url: z.string().describe("Website URL to onboard (e.g. 'https://dupont.fr')"),
|
|
23
23
|
},
|
|
24
24
|
}, async ({ name, url }) => {
|
|
25
|
-
const client = await
|
|
25
|
+
const client = await createProject(name, url);
|
|
26
26
|
const onboarding = await onboardFromUrl(client.id, url);
|
|
27
27
|
return { content: [{ type: "text", text: JSON.stringify({ client, onboarding }) }] };
|
|
28
28
|
});
|
|
29
|
-
server.registerTool("
|
|
29
|
+
server.registerTool("root_list_projects", {
|
|
30
30
|
description: "List all accounts stored in Root — name, URL, ID, and creation date.",
|
|
31
31
|
inputSchema: {},
|
|
32
32
|
}, async () => {
|
|
33
|
-
const clients = await
|
|
33
|
+
const clients = await listProjects();
|
|
34
34
|
return { content: [{ type: "text", text: JSON.stringify({ count: clients.length, clients }) }] };
|
|
35
35
|
});
|
|
36
|
-
server.registerTool("
|
|
36
|
+
server.registerTool("root_delete_project", {
|
|
37
37
|
description: "Delete an account and all its associated knowledge items.",
|
|
38
38
|
inputSchema: {
|
|
39
|
-
|
|
39
|
+
project_id: z.string().describe("The account ID to delete"),
|
|
40
40
|
},
|
|
41
|
-
}, async ({
|
|
42
|
-
const result = await
|
|
41
|
+
}, async ({ project_id }) => {
|
|
42
|
+
const result = await deleteProject(project_id);
|
|
43
43
|
return { content: [{ type: "text", text: JSON.stringify(result) }] };
|
|
44
44
|
});
|
|
45
45
|
// ── KNOWLEDGE TOOLS ────────────────────────────────────────────────────────
|
|
46
46
|
server.registerTool("root_get_context", {
|
|
47
47
|
description: "Returns complete business knowledge for a client — offers, personas, objections, differentiators, competitors, geo zones, pricing, and FAQs. ALWAYS call this tool before generating any content, SEO article, email, or prospection material.",
|
|
48
48
|
inputSchema: {
|
|
49
|
-
|
|
49
|
+
project_id: PROJECT_ID_PARAM,
|
|
50
50
|
},
|
|
51
|
-
}, async ({
|
|
52
|
-
const context = await getContext(
|
|
51
|
+
}, async ({ project_id }) => {
|
|
52
|
+
const context = await getContext(resolveProjectId(project_id));
|
|
53
53
|
return { content: [{ type: "text", text: JSON.stringify(context) }] };
|
|
54
54
|
});
|
|
55
55
|
server.registerTool("root_get_category", {
|
|
56
56
|
description: "Returns a specific category of business knowledge. Use when you need only one type of data (e.g. just personas for a prospection email, just objections for a sales script).",
|
|
57
57
|
inputSchema: {
|
|
58
|
-
|
|
58
|
+
project_id: PROJECT_ID_PARAM,
|
|
59
59
|
category: CATEGORY_ENUM.describe("The knowledge category to retrieve"),
|
|
60
60
|
},
|
|
61
|
-
}, async ({
|
|
62
|
-
const items = await getCategory(
|
|
61
|
+
}, async ({ project_id, category }) => {
|
|
62
|
+
const items = await getCategory(resolveProjectId(project_id), category);
|
|
63
63
|
return { content: [{ type: "text", text: JSON.stringify({ category, count: items.length, items }) }] };
|
|
64
64
|
});
|
|
65
65
|
server.registerTool("root_search", {
|
|
66
66
|
description: "Search across all business knowledge with a text query. Use to find a specific objection, competitor detail, or FAQ answer.",
|
|
67
67
|
inputSchema: {
|
|
68
|
-
|
|
68
|
+
project_id: PROJECT_ID_PARAM,
|
|
69
69
|
query: z.string().describe("Search query"),
|
|
70
70
|
},
|
|
71
|
-
}, async ({
|
|
72
|
-
const results = await searchKnowledge(
|
|
71
|
+
}, async ({ project_id, query }) => {
|
|
72
|
+
const results = await searchKnowledge(resolveProjectId(project_id), query);
|
|
73
73
|
return { content: [{ type: "text", text: JSON.stringify({ query, count: results.length, results }) }] };
|
|
74
74
|
});
|
|
75
75
|
server.registerTool("root_onboard_from_url", {
|
|
76
|
-
description: "Onboard a client by scraping their website URL. Automatically extracts offers, personas, differentiators, geo zones, pricing, FAQs, and analyzes local competitors. Returns full context + gaps + followup questions for missing data. Use
|
|
76
|
+
description: "Onboard a client by scraping their website URL. Automatically extracts offers, personas, differentiators, geo zones, pricing, FAQs, and analyzes local competitors. Returns full context + gaps + followup questions for missing data. Use root_create_project instead if the client doesn't exist yet.",
|
|
77
77
|
inputSchema: {
|
|
78
|
-
|
|
78
|
+
project_id: PROJECT_ID_PARAM,
|
|
79
79
|
url: z.string().describe("The client website URL (e.g. https://client.fr)"),
|
|
80
80
|
},
|
|
81
|
-
}, async ({
|
|
82
|
-
const result = await onboardFromUrl(
|
|
81
|
+
}, async ({ project_id, url }) => {
|
|
82
|
+
const result = await onboardFromUrl(resolveProjectId(project_id), url);
|
|
83
83
|
return { content: [{ type: "text", text: JSON.stringify(result) }] };
|
|
84
84
|
});
|
|
85
85
|
server.registerTool("root_create_item", {
|
|
86
86
|
description: "Add a new knowledge item to a category. Use to add an offer, persona, competitor, or any data not extracted automatically.",
|
|
87
87
|
inputSchema: {
|
|
88
|
-
|
|
88
|
+
project_id: PROJECT_ID_PARAM,
|
|
89
89
|
category: CATEGORY_ENUM.describe("Knowledge category"),
|
|
90
90
|
data: z.record(z.unknown()).describe("The item data as a JSON object"),
|
|
91
91
|
},
|
|
92
|
-
}, async ({
|
|
93
|
-
const item = await createItem(
|
|
92
|
+
}, async ({ project_id, category, data }) => {
|
|
93
|
+
const item = await createItem(resolveProjectId(project_id), category, data);
|
|
94
94
|
return { content: [{ type: "text", text: JSON.stringify({ success: true, item }) }] };
|
|
95
95
|
});
|
|
96
96
|
server.registerTool("root_update_item", {
|
|
97
97
|
description: "Update an existing knowledge item by ID.",
|
|
98
98
|
inputSchema: {
|
|
99
|
-
|
|
99
|
+
project_id: PROJECT_ID_PARAM,
|
|
100
100
|
id: z.string().describe("The item ID to update"),
|
|
101
101
|
data: z.record(z.unknown()).describe("Fields to update (merged with existing data)"),
|
|
102
102
|
},
|
|
103
|
-
}, async ({
|
|
104
|
-
const item = await updateItem(
|
|
103
|
+
}, async ({ project_id, id, data }) => {
|
|
104
|
+
const item = await updateItem(resolveProjectId(project_id), id, data);
|
|
105
105
|
return { content: [{ type: "text", text: JSON.stringify({ success: true, item }) }] };
|
|
106
106
|
});
|
|
107
107
|
server.registerTool("root_delete_item", {
|
|
108
108
|
description: "Delete a knowledge item by ID.",
|
|
109
109
|
inputSchema: {
|
|
110
|
-
|
|
110
|
+
project_id: PROJECT_ID_PARAM,
|
|
111
111
|
id: z.string().describe("The item ID to delete"),
|
|
112
112
|
},
|
|
113
|
-
}, async ({
|
|
114
|
-
const result = await deleteItem(
|
|
113
|
+
}, async ({ project_id, id }) => {
|
|
114
|
+
const result = await deleteItem(resolveProjectId(project_id), id);
|
|
115
115
|
return { content: [{ type: "text", text: JSON.stringify(result) }] };
|
|
116
116
|
});
|
|
117
117
|
server.registerTool("root_refresh", {
|
|
118
118
|
description: "Refresh market intelligence for a client. Re-queries DataForSEO SERP for the configured geo zones and sector, detects new competitors and competitors that disappeared from search results. Returns a structured diff. Run weekly or when you suspect market changes.",
|
|
119
119
|
inputSchema: {
|
|
120
|
-
|
|
120
|
+
project_id: PROJECT_ID_PARAM,
|
|
121
121
|
},
|
|
122
|
-
}, async ({
|
|
123
|
-
const diff = await refreshKnowledge(
|
|
122
|
+
}, async ({ project_id }) => {
|
|
123
|
+
const diff = await refreshKnowledge(resolveProjectId(project_id));
|
|
124
124
|
return { content: [{ type: "text", text: JSON.stringify(diff) }] };
|
|
125
125
|
});
|
|
126
126
|
return server;
|
package/dist/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,wCAAwC,EAAE,MAAM,+DAA+D,CAAC;AACzH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAC5E,aAAa,EAAE,YAAY,EAAE,aAAa,GAC3C,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC;IAC3B,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,gBAAgB;IACjD,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS;CACjD,CAAC,CAAC;AAEH,MAAM,
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
|