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.
Files changed (46) hide show
  1. package/README.md +146 -38
  2. package/data/knowledge.db +0 -0
  3. package/dist/alerts.d.ts +22 -0
  4. package/dist/alerts.js +433 -0
  5. package/dist/alerts.js.map +1 -0
  6. package/dist/citation-test.d.ts +14 -0
  7. package/dist/citation-test.js +298 -0
  8. package/dist/citation-test.js.map +1 -0
  9. package/dist/daily-report.d.ts +15 -0
  10. package/dist/daily-report.js +441 -0
  11. package/dist/daily-report.js.map +1 -0
  12. package/dist/discover.js +3 -1
  13. package/dist/discover.js.map +1 -1
  14. package/dist/freshness.d.ts +20 -0
  15. package/dist/freshness.js +508 -0
  16. package/dist/freshness.js.map +1 -0
  17. package/dist/index.d.ts +6 -1
  18. package/dist/index.js +253 -14
  19. package/dist/index.js.map +1 -1
  20. package/dist/ingest-projects.d.ts +16 -0
  21. package/dist/ingest-projects.js +196 -0
  22. package/dist/ingest-projects.js.map +1 -0
  23. package/dist/knowledge-db.d.ts +13 -0
  24. package/dist/knowledge-db.js +156 -0
  25. package/dist/knowledge-db.js.map +1 -0
  26. package/dist/pipeline.d.ts +12 -0
  27. package/dist/pipeline.js +83 -0
  28. package/dist/pipeline.js.map +1 -0
  29. package/dist/query-log.d.ts +15 -0
  30. package/dist/query-log.js +93 -0
  31. package/dist/query-log.js.map +1 -0
  32. package/dist/rate-limit.d.ts +34 -0
  33. package/dist/rate-limit.js +206 -0
  34. package/dist/rate-limit.js.map +1 -0
  35. package/dist/related-articles.d.ts +15 -0
  36. package/dist/related-articles.js +217 -0
  37. package/dist/related-articles.js.map +1 -0
  38. package/dist/search.d.ts +13 -4
  39. package/dist/search.js +274 -39
  40. package/dist/search.js.map +1 -1
  41. package/dist/structure.d.ts +11 -0
  42. package/dist/structure.js +451 -0
  43. package/dist/structure.js.map +1 -0
  44. package/dist/types.d.ts +65 -0
  45. package/dist/types.js.map +1 -1
  46. package/package.json +10 -2
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Content Structuring pipeline.
4
+ * Takes discovered content (is_new=1 from discovery.db), fetches full article text,
5
+ * classifies via gemma4:26b, extracts Q&A pairs, generates embeddings and JSON-LD,
6
+ * and UPSERTs into knowledge.db.
7
+ *
8
+ * Usage: npm run structure
9
+ * Requires: Ollama running with gemma4:26b and nomic-embed-text models
10
+ */
11
+ export {};
@@ -0,0 +1,451 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Content Structuring pipeline.
4
+ * Takes discovered content (is_new=1 from discovery.db), fetches full article text,
5
+ * classifies via gemma4:26b, extracts Q&A pairs, generates embeddings and JSON-LD,
6
+ * and UPSERTs into knowledge.db.
7
+ *
8
+ * Usage: npm run structure
9
+ * Requires: Ollama running with gemma4:26b and nomic-embed-text models
10
+ */
11
+ import Database from "better-sqlite3";
12
+ import { join } from "path";
13
+ import { initKnowledgeDb, upsertArticle, replaceChunksForArticle, upsertQaPairs, closeKnowledgeDb, } from "./knowledge-db.js";
14
+ const OLLAMA_URL = process.env.OLLAMA_URL || "http://localhost:11434";
15
+ const EMBED_MODEL = process.env.EMBED_MODEL || "nomic-embed-text";
16
+ const CLASSIFY_MODEL = process.env.CLASSIFY_MODEL || "gemma4:26b";
17
+ const DISCOVERY_DB_PATH = join(import.meta.dirname, "..", "data", "discovery.db");
18
+ // ─── Content Fetching ────────────────────────────────────────────────
19
+ // WHAT: Fetch article URL and convert HTML to clean markdown
20
+ // WHY: Discovered content is HTML — we need markdown for chunking and LLM processing
21
+ async function fetchContent(url) {
22
+ const resp = await fetch(url, {
23
+ headers: { "User-Agent": "ASTGL-Knowledge-Bot/1.0" },
24
+ });
25
+ if (!resp.ok) {
26
+ throw new Error(`Fetch failed: ${resp.status} ${resp.statusText}`);
27
+ }
28
+ const html = await resp.text();
29
+ return htmlToMarkdown(html);
30
+ }
31
+ // WHAT: Lightweight HTML-to-markdown for known source sites
32
+ // WHY: Avoids adding jsdom/readability deps; ASTGL and Substack produce clean HTML
33
+ function htmlToMarkdown(html) {
34
+ // Extract article/main content
35
+ let content = html;
36
+ const articleMatch = html.match(/<article[^>]*>([\s\S]*?)<\/article>/i);
37
+ const mainMatch = html.match(/<main[^>]*>([\s\S]*?)<\/main>/i);
38
+ // Substack uses a specific class for article body
39
+ const substackMatch = html.match(/<div[^>]*class="[^"]*body markup[^"]*"[^>]*>([\s\S]*?)<\/div>\s*<\/div>/i);
40
+ if (articleMatch)
41
+ content = articleMatch[1];
42
+ else if (mainMatch)
43
+ content = mainMatch[1];
44
+ else if (substackMatch)
45
+ content = substackMatch[1];
46
+ // Convert headings
47
+ content = content.replace(/<h1[^>]*>([\s\S]*?)<\/h1>/gi, "\n# $1\n");
48
+ content = content.replace(/<h2[^>]*>([\s\S]*?)<\/h2>/gi, "\n## $1\n");
49
+ content = content.replace(/<h3[^>]*>([\s\S]*?)<\/h3>/gi, "\n### $1\n");
50
+ content = content.replace(/<h4[^>]*>([\s\S]*?)<\/h4>/gi, "\n#### $1\n");
51
+ // Convert inline formatting
52
+ content = content.replace(/<(strong|b)[^>]*>([\s\S]*?)<\/\1>/gi, "**$2**");
53
+ content = content.replace(/<(em|i)[^>]*>([\s\S]*?)<\/\1>/gi, "*$2*");
54
+ content = content.replace(/<code[^>]*>([\s\S]*?)<\/code>/gi, "`$1`");
55
+ // Convert links
56
+ content = content.replace(/<a[^>]*href="([^"]*)"[^>]*>([\s\S]*?)<\/a>/gi, "[$2]($1)");
57
+ // Convert lists
58
+ content = content.replace(/<li[^>]*>([\s\S]*?)<\/li>/gi, "- $1\n");
59
+ // Convert paragraphs and line breaks
60
+ content = content.replace(/<p[^>]*>([\s\S]*?)<\/p>/gi, "\n$1\n");
61
+ content = content.replace(/<br\s*\/?>/gi, "\n");
62
+ // Remove all remaining HTML tags
63
+ content = content.replace(/<[^>]+>/g, "");
64
+ // Decode common HTML entities
65
+ content = content.replace(/&amp;/g, "&");
66
+ content = content.replace(/&lt;/g, "<");
67
+ content = content.replace(/&gt;/g, ">");
68
+ content = content.replace(/&quot;/g, '"');
69
+ content = content.replace(/&#39;/g, "'");
70
+ content = content.replace(/&nbsp;/g, " ");
71
+ content = content.replace(/&#x27;/g, "'");
72
+ // Clean up whitespace
73
+ content = content.replace(/\n{3,}/g, "\n\n");
74
+ return content.trim();
75
+ }
76
+ // ─── LLM Integration (gemma4:26b) ───────────────────────────────────
77
+ // WHAT: Extract JSON from LLM response, stripping thinking-mode preamble
78
+ // WHY: gemma4 with thinking enabled sometimes prepends markdown before JSON
79
+ function extractJson(raw) {
80
+ // Try direct parse first
81
+ const trimmed = raw.trim();
82
+ try {
83
+ JSON.parse(trimmed);
84
+ return trimmed;
85
+ }
86
+ catch {
87
+ // Look for JSON object in the response
88
+ const jsonMatch = trimmed.match(/\{[\s\S]*\}/);
89
+ if (jsonMatch) {
90
+ return jsonMatch[0];
91
+ }
92
+ throw new Error(`No valid JSON found in response: ${trimmed.slice(0, 100)}...`);
93
+ }
94
+ }
95
+ // WHAT: Classify article content type and extract metadata via Ollama
96
+ // WHY: Two focused calls are more reliable than one mega-prompt
97
+ async function classifyContent(text) {
98
+ const resp = await fetch(`${OLLAMA_URL}/api/chat`, {
99
+ method: "POST",
100
+ headers: { "Content-Type": "application/json" },
101
+ body: JSON.stringify({
102
+ model: CLASSIFY_MODEL,
103
+ stream: false,
104
+ format: {
105
+ type: "object",
106
+ properties: {
107
+ content_type: {
108
+ type: "string",
109
+ enum: ["article", "tutorial", "faq", "comparison", "guide", "newsletter"],
110
+ },
111
+ title: { type: "string" },
112
+ description: { type: "string" },
113
+ topics: { type: "array", items: { type: "string" } },
114
+ author: { type: "string" },
115
+ },
116
+ required: ["content_type", "title", "description", "topics", "author"],
117
+ },
118
+ messages: [
119
+ {
120
+ role: "system",
121
+ content: "You are a content classifier. Analyze the article and extract metadata. Classify as: article (informational), tutorial (step-by-step how-to), faq (primarily Q&A), comparison (contrasting options), guide (comprehensive reference), or newsletter (personal updates, announcements, behind-the-scenes — not primarily educational). Extract the title, a 1-2 sentence description, 3-5 topic keywords, and the author name.",
122
+ },
123
+ {
124
+ role: "user",
125
+ content: `Classify this article and extract its metadata:\n\n${text.slice(0, 4000)}`,
126
+ },
127
+ ],
128
+ }),
129
+ });
130
+ if (!resp.ok) {
131
+ throw new Error(`Classification failed: ${resp.status} ${await resp.text()}`);
132
+ }
133
+ const data = (await resp.json());
134
+ return JSON.parse(extractJson(data.message.content));
135
+ }
136
+ // WHAT: Extract Q&A pairs from article content via Ollama
137
+ // WHY: LLM can infer questions from headings and key points that humans would search for
138
+ async function extractQaPairs(text) {
139
+ const resp = await fetch(`${OLLAMA_URL}/api/chat`, {
140
+ method: "POST",
141
+ headers: { "Content-Type": "application/json" },
142
+ body: JSON.stringify({
143
+ model: CLASSIFY_MODEL,
144
+ stream: false,
145
+ format: {
146
+ type: "object",
147
+ properties: {
148
+ qa_pairs: {
149
+ type: "array",
150
+ items: {
151
+ type: "object",
152
+ properties: {
153
+ question: { type: "string" },
154
+ answer: { type: "string" },
155
+ },
156
+ required: ["question", "answer"],
157
+ },
158
+ },
159
+ },
160
+ required: ["qa_pairs"],
161
+ },
162
+ messages: [
163
+ {
164
+ role: "system",
165
+ content: "You are a Q&A extractor. Read the article and generate 5-8 natural question-and-answer pairs that someone might search for. Infer questions from headings and key points. Each answer should be 1-3 sentences, factual, and self-contained.",
166
+ },
167
+ {
168
+ role: "user",
169
+ content: `Extract Q&A pairs from this article:\n\n${text.slice(0, 8000)}`,
170
+ },
171
+ ],
172
+ }),
173
+ });
174
+ if (!resp.ok) {
175
+ throw new Error(`Q&A extraction failed: ${resp.status} ${await resp.text()}`);
176
+ }
177
+ const data = (await resp.json());
178
+ const parsed = JSON.parse(extractJson(data.message.content));
179
+ return parsed.qa_pairs;
180
+ }
181
+ // ─── JSON-LD Generation (template-based) ─────────────────────────────
182
+ // WHAT: Generate JSON-LD structured data from classification + Q&A
183
+ // WHY: Deterministic templates are more reliable than LLM-generated JSON-LD
184
+ function generateJsonLd(meta, qaPairs, url) {
185
+ const schemas = [];
186
+ // Article schema (always)
187
+ schemas.push({
188
+ "@context": "https://schema.org",
189
+ "@type": "Article",
190
+ headline: meta.title,
191
+ description: meta.description,
192
+ author: {
193
+ "@type": "Person",
194
+ name: meta.author,
195
+ },
196
+ publisher: {
197
+ "@type": "Organization",
198
+ name: "ASTGL — As The Geek Learns",
199
+ url: "https://astgl.ai",
200
+ },
201
+ mainEntityOfPage: {
202
+ "@type": "WebPage",
203
+ "@id": url,
204
+ },
205
+ keywords: meta.topics.join(", "),
206
+ });
207
+ // FAQPage schema (if Q&A pairs exist)
208
+ if (qaPairs.length > 0) {
209
+ schemas.push({
210
+ "@context": "https://schema.org",
211
+ "@type": "FAQPage",
212
+ mainEntity: qaPairs.map((qa) => ({
213
+ "@type": "Question",
214
+ name: qa.question,
215
+ acceptedAnswer: {
216
+ "@type": "Answer",
217
+ text: qa.answer,
218
+ },
219
+ })),
220
+ });
221
+ }
222
+ // HowTo schema (if tutorial)
223
+ if (meta.content_type === "tutorial") {
224
+ schemas.push({
225
+ "@context": "https://schema.org",
226
+ "@type": "HowTo",
227
+ name: meta.title,
228
+ description: meta.description,
229
+ });
230
+ }
231
+ return JSON.stringify(schemas);
232
+ }
233
+ // ─── Chunking (reuses ingest.ts pattern) ─────────────────────────────
234
+ // WHAT: Split markdown into chunks by h2 headings + add FAQ chunks from extracted Q&A
235
+ // WHY: h2 sections are self-contained (300-800 tokens), ideal for retrieval
236
+ function chunkArticle(title, url, body, qaPairs) {
237
+ const chunks = [];
238
+ // Split by ## headings
239
+ const sections = body.split(/^## /m);
240
+ // Intro (before any ## heading)
241
+ const intro = sections[0].trim();
242
+ if (intro) {
243
+ chunks.push({
244
+ articleTitle: title,
245
+ articleUrl: url,
246
+ articleOrder: 0,
247
+ sectionHeading: "Introduction",
248
+ chunkType: "intro",
249
+ content: intro,
250
+ });
251
+ }
252
+ // Remaining sections
253
+ for (let i = 1; i < sections.length; i++) {
254
+ const section = sections[i];
255
+ const newlineIdx = section.indexOf("\n");
256
+ const heading = newlineIdx !== -1 ? section.slice(0, newlineIdx).trim() : section.trim();
257
+ const content = newlineIdx !== -1 ? section.slice(newlineIdx + 1).trim() : "";
258
+ if (content) {
259
+ chunks.push({
260
+ articleTitle: title,
261
+ articleUrl: url,
262
+ articleOrder: 0,
263
+ sectionHeading: heading,
264
+ chunkType: "section",
265
+ content: `## ${heading}\n\n${content}`,
266
+ });
267
+ }
268
+ }
269
+ // Q&A pairs as FAQ chunks
270
+ for (const qa of qaPairs) {
271
+ chunks.push({
272
+ articleTitle: title,
273
+ articleUrl: url,
274
+ articleOrder: 0,
275
+ sectionHeading: qa.question,
276
+ chunkType: "faq",
277
+ content: `Q: ${qa.question}\nA: ${qa.answer}`,
278
+ });
279
+ }
280
+ return chunks;
281
+ }
282
+ // ─── Embedding (reuses ingest.ts pattern) ────────────────────────────
283
+ // WHAT: nomic-embed-text has an 8192 token context limit (~6000 chars safe)
284
+ // WHY: One article had a single intro chunk exceeding the limit, causing embed failure
285
+ const MAX_CHUNK_CHARS = 6000;
286
+ async function embed(texts) {
287
+ // Truncate any chunks that exceed the embedding model's context window
288
+ const safeTexts = texts.map((t) => t.length > MAX_CHUNK_CHARS ? t.slice(0, MAX_CHUNK_CHARS) : t);
289
+ const resp = await fetch(`${OLLAMA_URL}/api/embed`, {
290
+ method: "POST",
291
+ headers: { "Content-Type": "application/json" },
292
+ body: JSON.stringify({ model: EMBED_MODEL, input: safeTexts }),
293
+ });
294
+ if (!resp.ok) {
295
+ throw new Error(`Ollama embed failed: ${resp.status} ${await resp.text()}`);
296
+ }
297
+ const data = (await resp.json());
298
+ return data.embeddings;
299
+ }
300
+ // ─── Slug Derivation ─────────────────────────────────────────────────
301
+ function deriveSlug(url) {
302
+ const parsed = new URL(url);
303
+ const segments = parsed.pathname.split("/").filter(Boolean);
304
+ return segments[segments.length - 1] || "unknown";
305
+ }
306
+ // ─── Main Pipeline ───────────────────────────────────────────────────
307
+ async function main() {
308
+ console.error("Content structuring pipeline started");
309
+ // Open discovery.db to find new items
310
+ const discoveryDb = new Database(DISCOVERY_DB_PATH, { readonly: false });
311
+ const newItems = discoveryDb
312
+ .prepare("SELECT id, url, title, description, pub_date, source FROM discovered_content WHERE is_new = 1")
313
+ .all();
314
+ if (newItems.length === 0) {
315
+ console.error("No new items to process");
316
+ console.log(JSON.stringify({
317
+ timestamp: new Date().toISOString(),
318
+ processed: 0,
319
+ failed: 0,
320
+ skipped: 0,
321
+ articles: [],
322
+ }));
323
+ discoveryDb.close();
324
+ return;
325
+ }
326
+ console.error(`Found ${newItems.length} new items to process`);
327
+ // Open knowledge.db for writing
328
+ const knowledgeDb = initKnowledgeDb();
329
+ const summary = {
330
+ timestamp: new Date().toISOString(),
331
+ processed: 0,
332
+ failed: 0,
333
+ skipped: 0,
334
+ articles: [],
335
+ };
336
+ const BATCH_SIZE = 20;
337
+ const markProcessed = discoveryDb.prepare("UPDATE discovered_content SET is_new = 0 WHERE id = ?");
338
+ for (const item of newItems) {
339
+ try {
340
+ console.error(`\n Processing: ${item.url}`);
341
+ // 0. Slug-based deduplication — skip Substack dupes of canonical astgl.ai articles
342
+ const slug = deriveSlug(item.url);
343
+ const existingBySlug = knowledgeDb
344
+ .prepare("SELECT url FROM articles WHERE slug = ?")
345
+ .get(slug);
346
+ if (existingBySlug &&
347
+ existingBySlug.url.includes("astgl.ai") &&
348
+ !item.url.includes("astgl.ai")) {
349
+ console.error(` Skipped: duplicate of canonical ${existingBySlug.url}`);
350
+ summary.skipped++;
351
+ summary.articles.push({
352
+ url: item.url,
353
+ title: item.title || "unknown",
354
+ status: "skipped-duplicate",
355
+ });
356
+ markProcessed.run(item.id);
357
+ continue;
358
+ }
359
+ // 1. Fetch full content
360
+ console.error(" Fetching content...");
361
+ const markdown = await fetchContent(item.url);
362
+ if (markdown.length < 100) {
363
+ console.error(" Skipped: content too short");
364
+ summary.skipped++;
365
+ summary.articles.push({
366
+ url: item.url,
367
+ title: item.title || "unknown",
368
+ status: "skipped-short",
369
+ });
370
+ continue;
371
+ }
372
+ // 2. Classify content
373
+ console.error(" Classifying via gemma4:26b...");
374
+ const classification = await classifyContent(markdown);
375
+ console.error(` Type: ${classification.content_type} | Title: ${classification.title}`);
376
+ // 3. Extract Q&A pairs
377
+ console.error(" Extracting Q&A pairs...");
378
+ let qaPairs = [];
379
+ try {
380
+ qaPairs = await extractQaPairs(markdown);
381
+ console.error(` Extracted ${qaPairs.length} Q&A pairs`);
382
+ }
383
+ catch (qaErr) {
384
+ console.error(` Q&A extraction failed (continuing without): ${qaErr instanceof Error ? qaErr.message : qaErr}`);
385
+ }
386
+ // 4. Generate JSON-LD
387
+ const jsonLd = generateJsonLd(classification, qaPairs, item.url);
388
+ // 5. Chunk content (slug already derived in dedup step above)
389
+ const chunks = chunkArticle(classification.title, item.url, markdown, qaPairs);
390
+ console.error(` ${chunks.length} chunks created`);
391
+ // 6. Embed all chunks
392
+ console.error(" Embedding chunks...");
393
+ const allEmbeddings = [];
394
+ for (let i = 0; i < chunks.length; i += BATCH_SIZE) {
395
+ const batch = chunks.slice(i, i + BATCH_SIZE);
396
+ const embeddings = await embed(batch.map((c) => c.content));
397
+ allEmbeddings.push(...embeddings);
398
+ }
399
+ // 7. UPSERT into knowledge.db
400
+ const article = {
401
+ url: item.url,
402
+ sourceUrl: item.url,
403
+ slug,
404
+ title: classification.title,
405
+ description: classification.description,
406
+ author: classification.author,
407
+ contentType: classification.content_type,
408
+ topics: classification.topics,
409
+ qaPairs,
410
+ jsonLd,
411
+ markdownBody: markdown,
412
+ processedAt: new Date().toISOString(),
413
+ pubDate: item.pub_date || undefined,
414
+ };
415
+ upsertArticle(knowledgeDb, article);
416
+ replaceChunksForArticle(knowledgeDb, item.url, chunks, allEmbeddings);
417
+ upsertQaPairs(knowledgeDb, item.url, qaPairs);
418
+ // 8. Mark as processed in discovery.db
419
+ markProcessed.run(item.id);
420
+ summary.processed++;
421
+ summary.articles.push({
422
+ url: item.url,
423
+ title: classification.title,
424
+ status: "processed",
425
+ });
426
+ console.error(" Done");
427
+ }
428
+ catch (err) {
429
+ const message = err instanceof Error ? err.message : String(err);
430
+ console.error(` FAILED: ${message}`);
431
+ summary.failed++;
432
+ summary.articles.push({
433
+ url: item.url,
434
+ title: item.title || "unknown",
435
+ status: `failed: ${message.slice(0, 100)}`,
436
+ });
437
+ }
438
+ }
439
+ // Print summary
440
+ console.log(JSON.stringify(summary, null, 2));
441
+ closeKnowledgeDb();
442
+ discoveryDb.close();
443
+ console.error("\nContent structuring complete");
444
+ }
445
+ main()
446
+ .then(() => process.exit(0))
447
+ .catch((err) => {
448
+ console.error("Structuring pipeline failed:", err);
449
+ process.exit(1);
450
+ });
451
+ //# sourceMappingURL=structure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structure.js","sourceRoot":"","sources":["../src/structure.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -38,12 +38,77 @@ export interface AnswerResult {
38
38
  title: string;
39
39
  url: string;
40
40
  }>;
41
+ confidence_score: number;
42
+ }
43
+ export interface QueryLogEntry {
44
+ timestamp: string;
45
+ clientId: string;
46
+ toolName: string;
47
+ queryParams: string;
48
+ contentCited: string;
49
+ responseTimeMs: number;
50
+ confidenceScore: number | null;
41
51
  }
42
52
  export interface TopicEntry {
43
53
  title: string;
44
54
  description: string;
45
55
  url: string;
56
+ content_type: string;
57
+ topics: string[];
58
+ }
59
+ export interface TutorialResult {
60
+ title: string;
61
+ url: string;
62
+ description: string;
63
+ steps: string[];
64
+ confidence_score: number;
65
+ }
66
+ export interface ComparisonResult {
67
+ topic_a: {
68
+ title: string;
69
+ url: string;
70
+ key_points: string[];
71
+ };
72
+ topic_b: {
73
+ title: string;
74
+ url: string;
75
+ key_points: string[];
76
+ };
77
+ confidence_score: number;
78
+ }
79
+ export interface LatestArticle {
80
+ title: string;
81
+ description: string;
82
+ url: string;
83
+ content_type: string;
84
+ added_at: string | null;
85
+ }
86
+ export type ContentType = "article" | "tutorial" | "faq" | "comparison" | "guide" | "newsletter" | "project";
87
+ export interface QaPair {
88
+ question: string;
89
+ answer: string;
90
+ }
91
+ export interface ClassificationResult {
92
+ content_type: ContentType;
93
+ title: string;
94
+ description: string;
95
+ topics: string[];
96
+ author: string;
97
+ }
98
+ export interface StructuredArticle {
99
+ url: string;
100
+ sourceUrl: string;
101
+ slug: string;
102
+ title: string;
103
+ description: string;
104
+ author: string;
105
+ contentType: ContentType;
46
106
  topics: string[];
107
+ qaPairs: QaPair[];
108
+ jsonLd: string;
109
+ markdownBody: string;
110
+ processedAt: string;
111
+ pubDate?: string;
47
112
  }
48
113
  export declare const EMBEDDING_DIM = 768;
49
114
  export declare const BASE_URL = "https://astgl.ai/answers";
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA2CA,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAAC;AACjC,MAAM,CAAC,MAAM,QAAQ,GAAG,0BAA0B,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA8GA,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAAC;AACjC,MAAM,CAAC,MAAM,QAAQ,GAAG,0BAA0B,CAAC"}
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "mcp-astgl-knowledge",
3
3
  "mcpName": "io.github.Jmeg8r/astgl-knowledge",
4
- "version": "1.0.2",
5
- "description": "MCP server for searching and citing ASTGL articles about MCP servers, local AI, and AI automation",
4
+ "version": "1.1.0",
5
+ "description": "MCP server with 7 tools for searching, citing, and exploring ASTGL content about MCP servers, local AI, and AI automation — includes tutorials, comparisons, freshness tracking, and rate-limited API access",
6
6
  "type": "module",
7
7
  "bin": {
8
8
  "mcp-astgl-knowledge": "dist/index.js"
@@ -15,7 +15,15 @@
15
15
  "scripts": {
16
16
  "build": "tsc",
17
17
  "ingest": "tsx src/ingest.ts",
18
+ "ingest-projects": "tsx src/ingest-projects.ts",
18
19
  "discover": "tsx src/discover.ts",
20
+ "structure": "tsx src/structure.ts",
21
+ "pipeline": "tsx src/pipeline.ts",
22
+ "citation-test": "tsx src/citation-test.ts",
23
+ "daily-report": "tsx src/daily-report.ts",
24
+ "alerts": "tsx src/alerts.ts",
25
+ "freshness": "tsx src/freshness.ts",
26
+ "related": "tsx src/related-articles.ts",
19
27
  "start": "node dist/index.js",
20
28
  "dev": "tsx src/index.ts",
21
29
  "prepublishOnly": "npm run build"