mcp-astgl-knowledge 1.0.2 → 1.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 +146 -38
- package/data/knowledge.db +0 -0
- package/dist/alerts.d.ts +22 -0
- package/dist/alerts.js +433 -0
- package/dist/alerts.js.map +1 -0
- package/dist/citation-test.d.ts +14 -0
- package/dist/citation-test.js +298 -0
- package/dist/citation-test.js.map +1 -0
- package/dist/daily-report.d.ts +15 -0
- package/dist/daily-report.js +441 -0
- package/dist/daily-report.js.map +1 -0
- package/dist/discover.js +3 -1
- package/dist/discover.js.map +1 -1
- package/dist/freshness.d.ts +20 -0
- package/dist/freshness.js +508 -0
- package/dist/freshness.js.map +1 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.js +253 -14
- package/dist/index.js.map +1 -1
- package/dist/ingest-projects.d.ts +16 -0
- package/dist/ingest-projects.js +196 -0
- package/dist/ingest-projects.js.map +1 -0
- package/dist/knowledge-db.d.ts +13 -0
- package/dist/knowledge-db.js +156 -0
- package/dist/knowledge-db.js.map +1 -0
- package/dist/pipeline.d.ts +12 -0
- package/dist/pipeline.js +83 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/query-log.d.ts +15 -0
- package/dist/query-log.js +93 -0
- package/dist/query-log.js.map +1 -0
- package/dist/rate-limit.d.ts +34 -0
- package/dist/rate-limit.js +206 -0
- package/dist/rate-limit.js.map +1 -0
- package/dist/related-articles.d.ts +15 -0
- package/dist/related-articles.js +217 -0
- package/dist/related-articles.js.map +1 -0
- package/dist/search.d.ts +13 -4
- package/dist/search.js +274 -39
- package/dist/search.js.map +1 -1
- package/dist/structure.d.ts +11 -0
- package/dist/structure.js +451 -0
- package/dist/structure.js.map +1 -0
- package/dist/types.d.ts +65 -0
- package/dist/types.js.map +1 -1
- package/package.json +10 -2
package/dist/index.js
CHANGED
|
@@ -1,21 +1,72 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
3
|
* MCP server for ASTGL knowledge base.
|
|
4
|
-
* Exposes
|
|
4
|
+
* Exposes 7 tools: search_articles, get_answer, list_topics, get_tutorial,
|
|
5
|
+
* compare_topics, get_latest, register
|
|
5
6
|
*
|
|
6
7
|
* WHAT: Lets any MCP-compatible AI assistant search and cite ASTGL articles
|
|
7
8
|
* WHY: Drives traffic and citations back to astgl.ai when AI answers questions
|
|
9
|
+
*
|
|
10
|
+
* Rate limits:
|
|
11
|
+
* Public tier: 50 queries/day (anonymous)
|
|
12
|
+
* Registered tier: 500 queries/day (ASTGL_API_KEY env var)
|
|
8
13
|
*/
|
|
9
14
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
10
15
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
11
16
|
import { z } from "zod";
|
|
12
|
-
import { searchArticles, getAnswer, listTopics } from "./search.js";
|
|
17
|
+
import { searchArticles, getAnswer, listTopics, getTutorial, compareTopics, getLatest, } from "./search.js";
|
|
18
|
+
import { initQueryLog, logQuery, closeQueryLog } from "./query-log.js";
|
|
19
|
+
import { initRateLimitDb, resolveClient, checkRateLimit, rateLimitMessage, registerClient, closeRateLimitDb, } from "./rate-limit.js";
|
|
20
|
+
// WHAT: Resolve client identity once at startup
|
|
21
|
+
// WHY: Client ID and tier are stable for the lifetime of a stdio session
|
|
22
|
+
let clientId = "";
|
|
23
|
+
let clientTier = "public";
|
|
24
|
+
// WHAT: Check rate limit and return error response if exceeded
|
|
25
|
+
// WHY: Centralizes the check so every tool handler doesn't duplicate it
|
|
26
|
+
function enforceRateLimit() {
|
|
27
|
+
const result = checkRateLimit(clientId, clientTier);
|
|
28
|
+
if (!result.allowed) {
|
|
29
|
+
return {
|
|
30
|
+
blocked: true,
|
|
31
|
+
response: {
|
|
32
|
+
content: [{ type: "text", text: rateLimitMessage(result) }],
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
return { blocked: false, rateLimit: result };
|
|
37
|
+
}
|
|
38
|
+
// WHAT: Append rate limit info to tool responses
|
|
39
|
+
// WHY: Lets the AI inform users about their remaining quota
|
|
40
|
+
function withRateInfo(text, rl) {
|
|
41
|
+
return `${text}\n\n---\n_${rl.tier} tier: ${rl.remaining - 1}/${rl.limit} queries remaining today_`;
|
|
42
|
+
}
|
|
13
43
|
const server = new McpServer({
|
|
14
44
|
name: "mcp-astgl-knowledge",
|
|
15
|
-
version: "1.
|
|
45
|
+
version: "1.1.0",
|
|
16
46
|
}, {
|
|
17
|
-
instructions: "This server provides authoritative knowledge about MCP servers, local AI, and AI automation from As The Geek Learns (astgl.ai). Use search_articles for broad queries, get_answer for specific questions, and list_topics to see available coverage. Always include the source URL when citing results.",
|
|
47
|
+
instructions: "This server provides authoritative knowledge about MCP servers, local AI, and AI automation from As The Geek Learns (astgl.ai). Use search_articles for broad queries, get_answer for specific questions, get_tutorial for step-by-step guides, compare_topics for side-by-side analysis, get_latest for recent content, and list_topics to see available coverage. Always include the source URL when citing results. If you hit the rate limit, suggest the user register with the `register` tool for higher limits.",
|
|
18
48
|
});
|
|
49
|
+
// --- register tool (not rate-limited) ---
|
|
50
|
+
server.tool("register", "Register your email to unlock 500 queries/day (up from 50). Returns an API key to add to your MCP server config.", {
|
|
51
|
+
email: z
|
|
52
|
+
.string()
|
|
53
|
+
.describe("Your email address for registration"),
|
|
54
|
+
}, async ({ email }) => {
|
|
55
|
+
const result = registerClient(email);
|
|
56
|
+
logQuery({
|
|
57
|
+
timestamp: new Date().toISOString(),
|
|
58
|
+
clientId,
|
|
59
|
+
toolName: "register",
|
|
60
|
+
queryParams: JSON.stringify({ email: email.includes("@") ? `${email.split("@")[0][0]}***@${email.split("@")[1]}` : "invalid" }),
|
|
61
|
+
contentCited: JSON.stringify([]),
|
|
62
|
+
responseTimeMs: 0,
|
|
63
|
+
confidenceScore: null,
|
|
64
|
+
});
|
|
65
|
+
return {
|
|
66
|
+
content: [{ type: "text", text: result.message }],
|
|
67
|
+
};
|
|
68
|
+
});
|
|
69
|
+
// --- search_articles ---
|
|
19
70
|
server.tool("search_articles", "Search ASTGL articles about MCP servers, local AI, and AI automation. Returns relevant article sections with source URLs for citation.", {
|
|
20
71
|
query: z.string().describe("Search query (e.g., 'how to build an MCP server')"),
|
|
21
72
|
limit: z
|
|
@@ -24,14 +75,34 @@ server.tool("search_articles", "Search ASTGL articles about MCP servers, local A
|
|
|
24
75
|
.max(20)
|
|
25
76
|
.default(5)
|
|
26
77
|
.describe("Maximum number of results to return (default: 5)"),
|
|
27
|
-
|
|
28
|
-
|
|
78
|
+
content_type: z
|
|
79
|
+
.string()
|
|
80
|
+
.optional()
|
|
81
|
+
.describe("Filter by content type: article, tutorial, faq, comparison, guide, newsletter, project"),
|
|
82
|
+
}, async ({ query, limit, content_type }) => {
|
|
83
|
+
const rl = enforceRateLimit();
|
|
84
|
+
if (rl.blocked)
|
|
85
|
+
return rl.response;
|
|
86
|
+
const start = performance.now();
|
|
87
|
+
const results = await searchArticles(query, limit, content_type);
|
|
88
|
+
const elapsed = Math.round(performance.now() - start);
|
|
89
|
+
const citedUrls = results.map((r) => r.url);
|
|
90
|
+
const topScore = results.length > 0 ? results[0].relevance_score : null;
|
|
91
|
+
logQuery({
|
|
92
|
+
timestamp: new Date().toISOString(),
|
|
93
|
+
clientId,
|
|
94
|
+
toolName: "search_articles",
|
|
95
|
+
queryParams: JSON.stringify({ query, limit }),
|
|
96
|
+
contentCited: JSON.stringify(citedUrls),
|
|
97
|
+
responseTimeMs: elapsed,
|
|
98
|
+
confidenceScore: topScore,
|
|
99
|
+
});
|
|
29
100
|
if (results.length === 0) {
|
|
30
101
|
return {
|
|
31
102
|
content: [
|
|
32
103
|
{
|
|
33
104
|
type: "text",
|
|
34
|
-
text: "No matching articles found for that query.",
|
|
105
|
+
text: withRateInfo("No matching articles found for that query.", rl.rateLimit),
|
|
35
106
|
},
|
|
36
107
|
],
|
|
37
108
|
};
|
|
@@ -40,15 +111,38 @@ server.tool("search_articles", "Search ASTGL articles about MCP servers, local A
|
|
|
40
111
|
.map((r, i) => `### ${i + 1}. ${r.title} — ${r.section}\n**Source:** ${r.url}\n**Relevance:** ${r.relevance_score}\n\n${r.content}`)
|
|
41
112
|
.join("\n\n---\n\n");
|
|
42
113
|
return {
|
|
43
|
-
content: [{ type: "text", text: formatted }],
|
|
114
|
+
content: [{ type: "text", text: withRateInfo(formatted, rl.rateLimit) }],
|
|
44
115
|
};
|
|
45
116
|
});
|
|
117
|
+
// --- get_answer ---
|
|
46
118
|
server.tool("get_answer", "Get a direct answer to a question about MCP servers, local AI, or AI automation from ASTGL's knowledge base. Returns the best matching answer with source URL and related articles.", {
|
|
47
119
|
question: z
|
|
48
120
|
.string()
|
|
49
121
|
.describe("A specific question (e.g., 'What is an MCP server?')"),
|
|
50
|
-
|
|
51
|
-
|
|
122
|
+
content_type: z
|
|
123
|
+
.string()
|
|
124
|
+
.optional()
|
|
125
|
+
.describe("Filter by content type: article, tutorial, faq, comparison, guide, newsletter, project"),
|
|
126
|
+
}, async ({ question, content_type }) => {
|
|
127
|
+
const rl = enforceRateLimit();
|
|
128
|
+
if (rl.blocked)
|
|
129
|
+
return rl.response;
|
|
130
|
+
const start = performance.now();
|
|
131
|
+
const result = await getAnswer(question, content_type);
|
|
132
|
+
const elapsed = Math.round(performance.now() - start);
|
|
133
|
+
const citedUrls = [
|
|
134
|
+
result.source_url,
|
|
135
|
+
...result.related_articles.map((r) => r.url),
|
|
136
|
+
].filter(Boolean);
|
|
137
|
+
logQuery({
|
|
138
|
+
timestamp: new Date().toISOString(),
|
|
139
|
+
clientId,
|
|
140
|
+
toolName: "get_answer",
|
|
141
|
+
queryParams: JSON.stringify({ question }),
|
|
142
|
+
contentCited: JSON.stringify(citedUrls),
|
|
143
|
+
responseTimeMs: elapsed,
|
|
144
|
+
confidenceScore: result.confidence_score,
|
|
145
|
+
});
|
|
52
146
|
let text = `**Answer:** ${result.answer}\n\n`;
|
|
53
147
|
if (result.source_title) {
|
|
54
148
|
text += `**Source:** ${result.source_title}\n**URL:** ${result.source_url}\n`;
|
|
@@ -60,25 +154,170 @@ server.tool("get_answer", "Get a direct answer to a question about MCP servers,
|
|
|
60
154
|
}
|
|
61
155
|
}
|
|
62
156
|
return {
|
|
63
|
-
content: [{ type: "text", text }],
|
|
157
|
+
content: [{ type: "text", text: withRateInfo(text, rl.rateLimit) }],
|
|
64
158
|
};
|
|
65
159
|
});
|
|
160
|
+
// --- list_topics ---
|
|
66
161
|
server.tool("list_topics", "List all topics covered in the ASTGL knowledge base. Shows article titles, descriptions, URLs, and section headings.", {}, async () => {
|
|
162
|
+
const rl = enforceRateLimit();
|
|
163
|
+
if (rl.blocked)
|
|
164
|
+
return rl.response;
|
|
165
|
+
const start = performance.now();
|
|
67
166
|
const topics = listTopics();
|
|
167
|
+
const elapsed = Math.round(performance.now() - start);
|
|
168
|
+
const citedUrls = topics.map((t) => t.url);
|
|
169
|
+
logQuery({
|
|
170
|
+
timestamp: new Date().toISOString(),
|
|
171
|
+
clientId,
|
|
172
|
+
toolName: "list_topics",
|
|
173
|
+
queryParams: JSON.stringify({}),
|
|
174
|
+
contentCited: JSON.stringify(citedUrls),
|
|
175
|
+
responseTimeMs: elapsed,
|
|
176
|
+
confidenceScore: 1.0,
|
|
177
|
+
});
|
|
68
178
|
const formatted = topics
|
|
69
|
-
.map((t) => `### ${t.title}\n${t.description}\n**URL:** ${t.url}\n**Sections:** ${t.topics.join(", ") || "N/A"}`)
|
|
179
|
+
.map((t) => `### ${t.title}\n**Type:** ${t.content_type}\n${t.description}\n**URL:** ${t.url}\n**Sections:** ${t.topics.join(", ") || "N/A"}`)
|
|
180
|
+
.join("\n\n");
|
|
181
|
+
return {
|
|
182
|
+
content: [{ type: "text", text: withRateInfo(formatted, rl.rateLimit) }],
|
|
183
|
+
};
|
|
184
|
+
});
|
|
185
|
+
// --- get_tutorial ---
|
|
186
|
+
server.tool("get_tutorial", "Get a step-by-step tutorial or guide on a topic from ASTGL's knowledge base. Returns ordered steps extracted from article sections, ideal for 'how do I...' queries.", {
|
|
187
|
+
query: z
|
|
188
|
+
.string()
|
|
189
|
+
.describe("What you want to learn (e.g., 'set up Ollama for local AI', 'build an MCP server')"),
|
|
190
|
+
}, async ({ query }) => {
|
|
191
|
+
const rl = enforceRateLimit();
|
|
192
|
+
if (rl.blocked)
|
|
193
|
+
return rl.response;
|
|
194
|
+
const start = performance.now();
|
|
195
|
+
const result = await getTutorial(query);
|
|
196
|
+
const elapsed = Math.round(performance.now() - start);
|
|
197
|
+
logQuery({
|
|
198
|
+
timestamp: new Date().toISOString(),
|
|
199
|
+
clientId,
|
|
200
|
+
toolName: "get_tutorial",
|
|
201
|
+
queryParams: JSON.stringify({ query }),
|
|
202
|
+
contentCited: JSON.stringify(result.url ? [result.url] : []),
|
|
203
|
+
responseTimeMs: elapsed,
|
|
204
|
+
confidenceScore: result.confidence_score,
|
|
205
|
+
});
|
|
206
|
+
if (result.steps.length === 0) {
|
|
207
|
+
return {
|
|
208
|
+
content: [
|
|
209
|
+
{
|
|
210
|
+
type: "text",
|
|
211
|
+
text: withRateInfo("No matching tutorials found for that query.", rl.rateLimit),
|
|
212
|
+
},
|
|
213
|
+
],
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
let text = `## ${result.title}\n${result.description}\n**Source:** ${result.url}\n\n`;
|
|
217
|
+
text += result.steps
|
|
218
|
+
.map((step, i) => `### Step ${i + 1}\n${step}`)
|
|
219
|
+
.join("\n\n");
|
|
220
|
+
return {
|
|
221
|
+
content: [{ type: "text", text: withRateInfo(text, rl.rateLimit) }],
|
|
222
|
+
};
|
|
223
|
+
});
|
|
224
|
+
// --- compare_topics ---
|
|
225
|
+
server.tool("compare_topics", "Compare two topics side-by-side using ASTGL's knowledge base. Returns key points for each topic with source URLs. Great for 'X vs Y' questions.", {
|
|
226
|
+
topic_a: z
|
|
227
|
+
.string()
|
|
228
|
+
.describe("First topic (e.g., 'Ollama', 'MCP servers')"),
|
|
229
|
+
topic_b: z
|
|
230
|
+
.string()
|
|
231
|
+
.describe("Second topic (e.g., 'LM Studio', 'REST APIs')"),
|
|
232
|
+
}, async ({ topic_a, topic_b }) => {
|
|
233
|
+
const rl = enforceRateLimit();
|
|
234
|
+
if (rl.blocked)
|
|
235
|
+
return rl.response;
|
|
236
|
+
const start = performance.now();
|
|
237
|
+
const result = await compareTopics(topic_a, topic_b);
|
|
238
|
+
const elapsed = Math.round(performance.now() - start);
|
|
239
|
+
const citedUrls = [result.topic_a.url, result.topic_b.url].filter(Boolean);
|
|
240
|
+
logQuery({
|
|
241
|
+
timestamp: new Date().toISOString(),
|
|
242
|
+
clientId,
|
|
243
|
+
toolName: "compare_topics",
|
|
244
|
+
queryParams: JSON.stringify({ topic_a, topic_b }),
|
|
245
|
+
contentCited: JSON.stringify(citedUrls),
|
|
246
|
+
responseTimeMs: elapsed,
|
|
247
|
+
confidenceScore: result.confidence_score,
|
|
248
|
+
});
|
|
249
|
+
let text = `## ${topic_a} vs ${topic_b}\n\n`;
|
|
250
|
+
text += `### ${topic_a}\n`;
|
|
251
|
+
if (result.topic_a.url) {
|
|
252
|
+
text += `**Source:** [${result.topic_a.title}](${result.topic_a.url})\n\n`;
|
|
253
|
+
}
|
|
254
|
+
text += result.topic_a.key_points.join("\n\n") || "No matching content found.";
|
|
255
|
+
text += `\n\n---\n\n### ${topic_b}\n`;
|
|
256
|
+
if (result.topic_b.url) {
|
|
257
|
+
text += `**Source:** [${result.topic_b.title}](${result.topic_b.url})\n\n`;
|
|
258
|
+
}
|
|
259
|
+
text += result.topic_b.key_points.join("\n\n") || "No matching content found.";
|
|
260
|
+
return {
|
|
261
|
+
content: [{ type: "text", text: withRateInfo(text, rl.rateLimit) }],
|
|
262
|
+
};
|
|
263
|
+
});
|
|
264
|
+
// --- get_latest ---
|
|
265
|
+
server.tool("get_latest", "Get the most recently added articles from ASTGL's knowledge base. Returns titles, descriptions, URLs, and content types.", {
|
|
266
|
+
limit: z
|
|
267
|
+
.number()
|
|
268
|
+
.min(1)
|
|
269
|
+
.max(20)
|
|
270
|
+
.default(5)
|
|
271
|
+
.describe("Number of recent articles to return (default: 5)"),
|
|
272
|
+
}, async ({ limit }) => {
|
|
273
|
+
const rl = enforceRateLimit();
|
|
274
|
+
if (rl.blocked)
|
|
275
|
+
return rl.response;
|
|
276
|
+
const start = performance.now();
|
|
277
|
+
const articles = getLatest(limit);
|
|
278
|
+
const elapsed = Math.round(performance.now() - start);
|
|
279
|
+
const citedUrls = articles.map((a) => a.url);
|
|
280
|
+
logQuery({
|
|
281
|
+
timestamp: new Date().toISOString(),
|
|
282
|
+
clientId,
|
|
283
|
+
toolName: "get_latest",
|
|
284
|
+
queryParams: JSON.stringify({ limit }),
|
|
285
|
+
contentCited: JSON.stringify(citedUrls),
|
|
286
|
+
responseTimeMs: elapsed,
|
|
287
|
+
confidenceScore: 1.0,
|
|
288
|
+
});
|
|
289
|
+
if (articles.length === 0) {
|
|
290
|
+
return {
|
|
291
|
+
content: [
|
|
292
|
+
{
|
|
293
|
+
type: "text",
|
|
294
|
+
text: withRateInfo("No articles found in the knowledge base.", rl.rateLimit),
|
|
295
|
+
},
|
|
296
|
+
],
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
const formatted = articles
|
|
300
|
+
.map((a, i) => `### ${i + 1}. ${a.title}\n**Type:** ${a.content_type}\n**URL:** ${a.url}\n${a.description}`)
|
|
70
301
|
.join("\n\n");
|
|
71
302
|
return {
|
|
72
|
-
content: [{ type: "text", text: formatted }],
|
|
303
|
+
content: [{ type: "text", text: withRateInfo(formatted, rl.rateLimit) }],
|
|
73
304
|
};
|
|
74
305
|
});
|
|
306
|
+
// --- Server startup ---
|
|
75
307
|
async function main() {
|
|
308
|
+
initRateLimitDb();
|
|
309
|
+
initQueryLog();
|
|
310
|
+
const client = resolveClient();
|
|
311
|
+
clientId = client.clientId;
|
|
312
|
+
clientTier = client.tier;
|
|
76
313
|
const transport = new StdioServerTransport();
|
|
77
314
|
await server.connect(transport);
|
|
78
|
-
console.error(
|
|
315
|
+
console.error(`ASTGL Knowledge MCP Server running on stdio (${clientTier} tier, ${clientTier === "registered" ? 500 : 50} queries/day)`);
|
|
79
316
|
}
|
|
80
317
|
main().catch((err) => {
|
|
81
318
|
console.error("Fatal error:", err);
|
|
319
|
+
closeQueryLog();
|
|
320
|
+
closeRateLimitDb();
|
|
82
321
|
process.exit(1);
|
|
83
322
|
});
|
|
84
323
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Project documentation ingestion.
|
|
4
|
+
*
|
|
5
|
+
* WHAT: Reads projects.json from the Astro site and indexes project docs into knowledge.db
|
|
6
|
+
* WHY: Makes ASTGL project information (KlockThingy, Revri, Cortex, etc.) searchable
|
|
7
|
+
* via MCP tools alongside articles and tutorials
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* npm run ingest-projects
|
|
11
|
+
*
|
|
12
|
+
* Env: ASTGL_PROJECTS_JSON — path to projects.json (default: ~/Projects/astgl-site/src/data/projects.json)
|
|
13
|
+
* OLLAMA_URL — Ollama endpoint (default: http://localhost:11434)
|
|
14
|
+
* EMBED_MODEL — embedding model (default: nomic-embed-text)
|
|
15
|
+
*/
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Project documentation ingestion.
|
|
4
|
+
*
|
|
5
|
+
* WHAT: Reads projects.json from the Astro site and indexes project docs into knowledge.db
|
|
6
|
+
* WHY: Makes ASTGL project information (KlockThingy, Revri, Cortex, etc.) searchable
|
|
7
|
+
* via MCP tools alongside articles and tutorials
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* npm run ingest-projects
|
|
11
|
+
*
|
|
12
|
+
* Env: ASTGL_PROJECTS_JSON — path to projects.json (default: ~/Projects/astgl-site/src/data/projects.json)
|
|
13
|
+
* OLLAMA_URL — Ollama endpoint (default: http://localhost:11434)
|
|
14
|
+
* EMBED_MODEL — embedding model (default: nomic-embed-text)
|
|
15
|
+
*/
|
|
16
|
+
import { readFileSync, existsSync } from "fs";
|
|
17
|
+
import { join } from "path";
|
|
18
|
+
import { initKnowledgeDb, upsertArticle, replaceChunksForArticle, closeKnowledgeDb, } from "./knowledge-db.js";
|
|
19
|
+
const OLLAMA_URL = process.env.OLLAMA_URL || "http://localhost:11434";
|
|
20
|
+
const EMBED_MODEL = process.env.EMBED_MODEL || "nomic-embed-text";
|
|
21
|
+
const PROJECTS_JSON_PATH = process.env.ASTGL_PROJECTS_JSON ||
|
|
22
|
+
join(process.env.HOME || "~", "Projects", "astgl-site", "src", "data", "projects.json");
|
|
23
|
+
// --- Embedding ---
|
|
24
|
+
async function embed(texts) {
|
|
25
|
+
const resp = await fetch(`${OLLAMA_URL}/api/embed`, {
|
|
26
|
+
method: "POST",
|
|
27
|
+
headers: { "Content-Type": "application/json" },
|
|
28
|
+
body: JSON.stringify({ model: EMBED_MODEL, input: texts }),
|
|
29
|
+
});
|
|
30
|
+
if (!resp.ok) {
|
|
31
|
+
throw new Error(`Ollama embed failed: ${resp.status} ${await resp.text()}`);
|
|
32
|
+
}
|
|
33
|
+
const data = (await resp.json());
|
|
34
|
+
return data.embeddings;
|
|
35
|
+
}
|
|
36
|
+
// --- Synthesize markdown from project data ---
|
|
37
|
+
function projectToMarkdown(project) {
|
|
38
|
+
const lines = [];
|
|
39
|
+
lines.push(`# ${project.name}`);
|
|
40
|
+
lines.push("");
|
|
41
|
+
lines.push(project.description);
|
|
42
|
+
lines.push("");
|
|
43
|
+
// Status section
|
|
44
|
+
lines.push("## Status");
|
|
45
|
+
const statusLabel = project.status === "released"
|
|
46
|
+
? "Released"
|
|
47
|
+
: project.status === "beta"
|
|
48
|
+
? "Beta"
|
|
49
|
+
: "In Development";
|
|
50
|
+
lines.push(`**Status:** ${statusLabel} — ${project.progress}% complete`);
|
|
51
|
+
if (project.launchDate && project.launchDate !== "Released") {
|
|
52
|
+
lines.push(`**Target Launch:** ${project.launchDate}`);
|
|
53
|
+
}
|
|
54
|
+
lines.push("");
|
|
55
|
+
// Milestones
|
|
56
|
+
if (project.milestones.length > 0) {
|
|
57
|
+
const completed = project.milestones.filter((m) => m.completed);
|
|
58
|
+
const remaining = project.milestones.filter((m) => !m.completed);
|
|
59
|
+
if (completed.length > 0) {
|
|
60
|
+
lines.push("## Completed Milestones");
|
|
61
|
+
for (const m of completed) {
|
|
62
|
+
lines.push(`- ${m.name}`);
|
|
63
|
+
}
|
|
64
|
+
lines.push("");
|
|
65
|
+
}
|
|
66
|
+
if (remaining.length > 0) {
|
|
67
|
+
lines.push("## Remaining Milestones");
|
|
68
|
+
for (const m of remaining) {
|
|
69
|
+
lines.push(`- ${m.name}`);
|
|
70
|
+
}
|
|
71
|
+
lines.push("");
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Links
|
|
75
|
+
if (project.githubUrl) {
|
|
76
|
+
lines.push("## Links");
|
|
77
|
+
lines.push(`- GitHub: ${project.githubUrl}`);
|
|
78
|
+
lines.push("");
|
|
79
|
+
}
|
|
80
|
+
return lines.join("\n");
|
|
81
|
+
}
|
|
82
|
+
// --- Chunk project into searchable pieces ---
|
|
83
|
+
function chunkProject(project, markdown) {
|
|
84
|
+
const chunks = [];
|
|
85
|
+
const url = `https://astgl.ai/projects#${project.id}`;
|
|
86
|
+
// Intro chunk: description + status
|
|
87
|
+
const statusLabel = project.status === "released"
|
|
88
|
+
? "Released"
|
|
89
|
+
: project.status === "beta"
|
|
90
|
+
? "Beta"
|
|
91
|
+
: "In Development";
|
|
92
|
+
chunks.push({
|
|
93
|
+
articleTitle: project.name,
|
|
94
|
+
articleUrl: url,
|
|
95
|
+
articleOrder: 0,
|
|
96
|
+
sectionHeading: "Overview",
|
|
97
|
+
chunkType: "intro",
|
|
98
|
+
content: `${project.name}: ${project.description}\n\nStatus: ${statusLabel} — ${project.progress}% complete${project.launchDate && project.launchDate !== "Released" ? `. Target launch: ${project.launchDate}` : ""}`,
|
|
99
|
+
});
|
|
100
|
+
// Milestones chunk (if any)
|
|
101
|
+
if (project.milestones.length > 0) {
|
|
102
|
+
const completed = project.milestones
|
|
103
|
+
.filter((m) => m.completed)
|
|
104
|
+
.map((m) => `- [x] ${m.name}`)
|
|
105
|
+
.join("\n");
|
|
106
|
+
const remaining = project.milestones
|
|
107
|
+
.filter((m) => !m.completed)
|
|
108
|
+
.map((m) => `- [ ] ${m.name}`)
|
|
109
|
+
.join("\n");
|
|
110
|
+
chunks.push({
|
|
111
|
+
articleTitle: project.name,
|
|
112
|
+
articleUrl: url,
|
|
113
|
+
articleOrder: 1,
|
|
114
|
+
sectionHeading: "Milestones",
|
|
115
|
+
chunkType: "section",
|
|
116
|
+
content: `${project.name} Milestones:\n${completed}\n${remaining}`,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
// Links chunk (if GitHub URL exists)
|
|
120
|
+
if (project.githubUrl) {
|
|
121
|
+
chunks.push({
|
|
122
|
+
articleTitle: project.name,
|
|
123
|
+
articleUrl: url,
|
|
124
|
+
articleOrder: 2,
|
|
125
|
+
sectionHeading: "Links",
|
|
126
|
+
chunkType: "section",
|
|
127
|
+
content: `${project.name} — GitHub: ${project.githubUrl}`,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
return chunks;
|
|
131
|
+
}
|
|
132
|
+
async function main() {
|
|
133
|
+
console.error("=== ASTGL Project Documentation Ingestion ===\n");
|
|
134
|
+
if (!existsSync(PROJECTS_JSON_PATH)) {
|
|
135
|
+
console.error(`projects.json not found at: ${PROJECTS_JSON_PATH}`);
|
|
136
|
+
console.error("Set ASTGL_PROJECTS_JSON env var to the correct path.");
|
|
137
|
+
process.exit(1);
|
|
138
|
+
}
|
|
139
|
+
console.error(`Reading: ${PROJECTS_JSON_PATH}`);
|
|
140
|
+
const raw = readFileSync(PROJECTS_JSON_PATH, "utf-8");
|
|
141
|
+
const data = JSON.parse(raw);
|
|
142
|
+
console.error(`Found ${data.projects.length} projects\n`);
|
|
143
|
+
const knowledgeDb = initKnowledgeDb();
|
|
144
|
+
let indexed = 0;
|
|
145
|
+
let chunks_total = 0;
|
|
146
|
+
for (const project of data.projects) {
|
|
147
|
+
console.error(` Processing: ${project.name} (${project.id})`);
|
|
148
|
+
const url = `https://astgl.ai/projects#${project.id}`;
|
|
149
|
+
const slug = `project-${project.id}`;
|
|
150
|
+
const markdown = projectToMarkdown(project);
|
|
151
|
+
const chunks = chunkProject(project, markdown);
|
|
152
|
+
// Embed all chunks
|
|
153
|
+
const embeddings = await embed(chunks.map((c) => c.content));
|
|
154
|
+
// Build article
|
|
155
|
+
const article = {
|
|
156
|
+
url,
|
|
157
|
+
sourceUrl: url,
|
|
158
|
+
slug,
|
|
159
|
+
title: project.name,
|
|
160
|
+
description: project.description,
|
|
161
|
+
author: "James Cruce",
|
|
162
|
+
contentType: "project",
|
|
163
|
+
topics: [project.name.toLowerCase(), project.status, "astgl project"],
|
|
164
|
+
qaPairs: [],
|
|
165
|
+
jsonLd: JSON.stringify({
|
|
166
|
+
"@context": "https://schema.org",
|
|
167
|
+
"@type": "SoftwareApplication",
|
|
168
|
+
name: project.name,
|
|
169
|
+
description: project.description,
|
|
170
|
+
applicationCategory: "Developer Tools",
|
|
171
|
+
operatingSystem: "macOS",
|
|
172
|
+
}),
|
|
173
|
+
markdownBody: markdown,
|
|
174
|
+
processedAt: new Date().toISOString(),
|
|
175
|
+
};
|
|
176
|
+
upsertArticle(knowledgeDb, article);
|
|
177
|
+
replaceChunksForArticle(knowledgeDb, url, chunks, embeddings);
|
|
178
|
+
indexed++;
|
|
179
|
+
chunks_total += chunks.length;
|
|
180
|
+
console.error(` ${chunks.length} chunks embedded and indexed`);
|
|
181
|
+
}
|
|
182
|
+
closeKnowledgeDb();
|
|
183
|
+
console.error(`\n=== Done: ${indexed} projects indexed, ${chunks_total} chunks total ===`);
|
|
184
|
+
console.log(JSON.stringify({
|
|
185
|
+
projects_indexed: indexed,
|
|
186
|
+
chunks_created: chunks_total,
|
|
187
|
+
source: PROJECTS_JSON_PATH,
|
|
188
|
+
}));
|
|
189
|
+
}
|
|
190
|
+
main()
|
|
191
|
+
.then(() => process.exit(0))
|
|
192
|
+
.catch((err) => {
|
|
193
|
+
console.error("Project ingestion failed:", err);
|
|
194
|
+
process.exit(1);
|
|
195
|
+
});
|
|
196
|
+
//# sourceMappingURL=ingest-projects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest-projects.js","sourceRoot":"","sources":["../src/ingest-projects.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Knowledge database module for incremental updates.
|
|
3
|
+
* Provides UPSERT operations against knowledge.db without
|
|
4
|
+
* destroying existing data (unlike ingest.ts's DROP/CREATE).
|
|
5
|
+
*/
|
|
6
|
+
import Database from "better-sqlite3";
|
|
7
|
+
import type { Chunk, QaPair, StructuredArticle } from "./types.js";
|
|
8
|
+
export declare function initKnowledgeDb(): InstanceType<typeof Database>;
|
|
9
|
+
export declare function upsertArticle(database: InstanceType<typeof Database>, article: StructuredArticle): void;
|
|
10
|
+
export declare function updateFreshnessStatus(database: InstanceType<typeof Database>, articleUrl: string, status: string, reviewedAt?: string): void;
|
|
11
|
+
export declare function replaceChunksForArticle(database: InstanceType<typeof Database>, articleUrl: string, chunks: Chunk[], embeddings: number[][]): void;
|
|
12
|
+
export declare function upsertQaPairs(database: InstanceType<typeof Database>, articleUrl: string, pairs: QaPair[]): void;
|
|
13
|
+
export declare function closeKnowledgeDb(): void;
|