@echoes-io/mcp-server 4.1.0 → 6.0.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 (66) hide show
  1. package/README.md +120 -185
  2. package/cli/index.d.ts +3 -0
  3. package/cli/index.d.ts.map +1 -0
  4. package/cli/index.js +4 -0
  5. package/cli/index.js.map +1 -0
  6. package/cli/program.d.ts +3 -0
  7. package/cli/program.d.ts.map +1 -0
  8. package/cli/program.js +150 -0
  9. package/cli/program.js.map +1 -0
  10. package/lib/constants.d.ts +8 -0
  11. package/lib/constants.d.ts.map +1 -0
  12. package/lib/constants.js +12 -0
  13. package/lib/constants.js.map +1 -0
  14. package/lib/database/index.d.ts +34 -0
  15. package/lib/database/index.d.ts.map +1 -0
  16. package/lib/database/index.js +266 -0
  17. package/lib/database/index.js.map +1 -0
  18. package/lib/database/schemas.d.ts +55 -0
  19. package/lib/database/schemas.d.ts.map +1 -0
  20. package/lib/database/schemas.js +70 -0
  21. package/lib/database/schemas.js.map +1 -0
  22. package/lib/indexer/embeddings.d.ts +6 -0
  23. package/lib/indexer/embeddings.d.ts.map +1 -0
  24. package/lib/indexer/embeddings.js +51 -0
  25. package/lib/indexer/embeddings.js.map +1 -0
  26. package/lib/indexer/extractor.d.ts +81 -0
  27. package/lib/indexer/extractor.d.ts.map +1 -0
  28. package/lib/indexer/extractor.js +68 -0
  29. package/lib/indexer/extractor.js.map +1 -0
  30. package/lib/indexer/scanner.d.ts +8 -0
  31. package/lib/indexer/scanner.d.ts.map +1 -0
  32. package/lib/indexer/scanner.js +73 -0
  33. package/lib/indexer/scanner.js.map +1 -0
  34. package/lib/prompts/index.d.ts +13 -0
  35. package/lib/prompts/index.d.ts.map +1 -0
  36. package/lib/prompts/index.js +153 -0
  37. package/lib/prompts/index.js.map +1 -0
  38. package/lib/server.d.ts +13 -0
  39. package/lib/server.d.ts.map +1 -0
  40. package/lib/server.js +90 -0
  41. package/lib/server.js.map +1 -0
  42. package/lib/tools/index.d.ts +19 -0
  43. package/lib/tools/index.d.ts.map +1 -0
  44. package/lib/tools/index.js +128 -0
  45. package/lib/tools/index.js.map +1 -0
  46. package/lib/tools/search.d.ts +86 -0
  47. package/lib/tools/search.d.ts.map +1 -0
  48. package/lib/tools/search.js +95 -0
  49. package/lib/tools/search.js.map +1 -0
  50. package/lib/tools/stats.d.ts +18 -0
  51. package/lib/tools/stats.d.ts.map +1 -0
  52. package/lib/tools/stats.js +62 -0
  53. package/lib/tools/stats.js.map +1 -0
  54. package/lib/tools/words-count.d.ts +18 -0
  55. package/lib/tools/words-count.d.ts.map +1 -0
  56. package/lib/tools/words-count.js +31 -0
  57. package/lib/tools/words-count.js.map +1 -0
  58. package/lib/types.d.ts +29 -0
  59. package/lib/types.d.ts.map +1 -0
  60. package/lib/types.js +2 -0
  61. package/lib/types.js.map +1 -0
  62. package/lib/utils.d.ts +19 -0
  63. package/lib/utils.d.ts.map +1 -0
  64. package/lib/utils.js +40 -0
  65. package/lib/utils.js.map +1 -0
  66. package/package.json +59 -61
@@ -0,0 +1,95 @@
1
+ import z from 'zod';
2
+ import { DEFAULT_DB_PATH } from '../constants.js';
3
+ import { Database } from '../database/index.js';
4
+ import { generateEmbedding } from '../indexer/embeddings.js';
5
+ export const searchConfig = {
6
+ name: 'search',
7
+ description: 'Search indexed content using semantic similarity or filters.',
8
+ arguments: {
9
+ query: 'Search query text.',
10
+ type: 'Search type: chapters (default), entities, or relations.',
11
+ arc: 'Filter by arc name (optional).',
12
+ entityType: 'Filter entities by type: CHARACTER, LOCATION, EVENT, OBJECT, EMOTION.',
13
+ relationType: 'Filter relations by type.',
14
+ limit: 'Maximum number of results (default: 10).',
15
+ dbPath: `Database path (default: ${DEFAULT_DB_PATH}).`,
16
+ },
17
+ };
18
+ export const searchSchema = z.object({
19
+ query: z.string().describe(searchConfig.arguments.query),
20
+ type: z
21
+ .enum(['chapters', 'entities', 'relations'])
22
+ .default('chapters')
23
+ .describe(searchConfig.arguments.type),
24
+ arc: z.string().optional().describe(searchConfig.arguments.arc),
25
+ entityType: z.string().optional().describe(searchConfig.arguments.entityType),
26
+ relationType: z.string().optional().describe(searchConfig.arguments.relationType),
27
+ limit: z.number().optional().default(10).describe(searchConfig.arguments.limit),
28
+ dbPath: z.string().default(DEFAULT_DB_PATH).describe(searchConfig.arguments.dbPath),
29
+ });
30
+ export async function search(input) {
31
+ const { query, type, arc, entityType, relationType, limit, dbPath } = searchSchema.parse(input);
32
+ const db = new Database(dbPath);
33
+ await db.connect();
34
+ if (type === 'chapters') {
35
+ const vector = await generateEmbedding(query, db.embeddingModel);
36
+ const chapters = await db.searchChapters(vector, limit, arc);
37
+ db.close();
38
+ return {
39
+ type: 'chapters',
40
+ results: chapters.map((c) => ({
41
+ id: c.id,
42
+ arc: c.arc,
43
+ episode: c.episode,
44
+ chapter: c.chapter,
45
+ pov: c.pov,
46
+ title: c.title,
47
+ location: c.location,
48
+ content: c.content.slice(0, 500) + (c.content.length > 500 ? '...' : ''),
49
+ word_count: c.word_count,
50
+ /* v8 ignore next */
51
+ score: 1 - (c._distance ?? 0),
52
+ })),
53
+ };
54
+ }
55
+ if (type === 'entities') {
56
+ const vector = await generateEmbedding(query, db.embeddingModel);
57
+ const entities = await db.searchEntities(vector, limit, arc, entityType);
58
+ db.close();
59
+ return {
60
+ type: 'entities',
61
+ results: entities.map((e) => ({
62
+ id: e.id,
63
+ arc: e.arc,
64
+ name: e.name,
65
+ type: e.type,
66
+ description: e.description,
67
+ aliases: e.aliases,
68
+ chapter_count: e.chapter_count,
69
+ /* v8 ignore next */
70
+ score: 1 - (e._distance ?? 0),
71
+ })),
72
+ };
73
+ }
74
+ // type === 'relations'
75
+ const relations = await db.getRelations(arc, relationType);
76
+ db.close();
77
+ // Filter relations by query (simple text match on source/target/description)
78
+ const queryLower = query.toLowerCase();
79
+ const filtered = relations.filter((r) => r.source_entity.toLowerCase().includes(queryLower) ||
80
+ r.target_entity.toLowerCase().includes(queryLower) ||
81
+ r.description.toLowerCase().includes(queryLower));
82
+ return {
83
+ type: 'relations',
84
+ results: filtered.slice(0, limit).map((r) => ({
85
+ id: r.id,
86
+ arc: r.arc,
87
+ source_entity: r.source_entity,
88
+ target_entity: r.target_entity,
89
+ type: r.type,
90
+ description: r.description,
91
+ chapters: r.chapters,
92
+ })),
93
+ };
94
+ }
95
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import z from 'zod';
2
+ import type { ToolConfig } from '../types.js';
3
+ export declare const statsConfig: ToolConfig;
4
+ export declare const statsSchema: z.ZodObject<{
5
+ arc: z.ZodOptional<z.ZodString>;
6
+ pov: z.ZodOptional<z.ZodString>;
7
+ dbPath: z.ZodDefault<z.ZodString>;
8
+ }, z.z.core.$strip>;
9
+ export type StatsInput = z.infer<typeof statsSchema>;
10
+ export interface StatsOutput {
11
+ totalChapters: number;
12
+ totalWords: number;
13
+ arcs: string[];
14
+ povs: Record<string, number>;
15
+ averageWordsPerChapter: number;
16
+ }
17
+ export declare function stats(input: StatsInput): Promise<StatsOutput>;
18
+ //# sourceMappingURL=stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["stats.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAIpB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,eAAO,MAAM,WAAW,EAAE,UAQzB,CAAC;AAEF,eAAO,MAAM,WAAW;;;;mBAItB,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAErD,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAOD,wBAAsB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CA8CnE"}
@@ -0,0 +1,62 @@
1
+ import z from 'zod';
2
+ import { DEFAULT_DB_PATH } from '../constants.js';
3
+ import { Database } from '../database/index.js';
4
+ export const statsConfig = {
5
+ name: 'stats',
6
+ description: 'Get aggregate statistics for indexed timeline content.',
7
+ arguments: {
8
+ arc: 'Filter by arc name(s), comma-separated (optional).',
9
+ pov: 'Filter by POV character(s), comma-separated (optional).',
10
+ dbPath: `Database path (default: ${DEFAULT_DB_PATH}).`,
11
+ },
12
+ };
13
+ export const statsSchema = z.object({
14
+ arc: z.string().optional().describe(statsConfig.arguments.arc),
15
+ pov: z.string().optional().describe(statsConfig.arguments.pov),
16
+ dbPath: z.string().default(DEFAULT_DB_PATH).describe(statsConfig.arguments.dbPath),
17
+ });
18
+ function parseFilter(value) {
19
+ if (!value)
20
+ return undefined;
21
+ return value.split(',').map((v) => v.trim().toLowerCase());
22
+ }
23
+ export async function stats(input) {
24
+ const { arc, pov, dbPath } = statsSchema.parse(input);
25
+ const arcFilter = parseFilter(arc);
26
+ const povFilter = parseFilter(pov);
27
+ const db = new Database(dbPath);
28
+ let chapters = await db.getChapters();
29
+ db.close();
30
+ if (chapters.length === 0) {
31
+ throw new Error('No indexed chapters found. Run "index" first.');
32
+ }
33
+ // Normalize POV to lowercase for comparison
34
+ chapters = chapters.map((c) => ({ ...c, pov: c.pov.toLowerCase() }));
35
+ if (arcFilter) {
36
+ chapters = chapters.filter((c) => arcFilter.includes(c.arc.toLowerCase()));
37
+ if (chapters.length === 0) {
38
+ throw new Error(`No chapters found for arc "${arc}".`);
39
+ }
40
+ }
41
+ if (povFilter) {
42
+ chapters = chapters.filter((c) => povFilter.includes(c.pov));
43
+ if (chapters.length === 0) {
44
+ throw new Error(`No chapters found for POV "${pov}".`);
45
+ }
46
+ }
47
+ const arcs = [...new Set(chapters.map((c) => c.arc))].sort();
48
+ const povs = {};
49
+ let totalWords = 0;
50
+ for (const chapter of chapters) {
51
+ totalWords += chapter.word_count;
52
+ povs[chapter.pov] = (povs[chapter.pov] || 0) + 1;
53
+ }
54
+ return {
55
+ totalChapters: chapters.length,
56
+ totalWords,
57
+ arcs,
58
+ povs,
59
+ averageWordsPerChapter: Math.round(totalWords / chapters.length),
60
+ };
61
+ }
62
+ //# sourceMappingURL=stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["stats.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import z from 'zod';
2
+ import type { ToolConfig } from '../types.js';
3
+ export declare const wordsCountConfig: ToolConfig;
4
+ export declare const wordsCountSchema: z.ZodObject<{
5
+ filePath: z.ZodString;
6
+ detailed: z.ZodOptional<z.ZodBoolean>;
7
+ }, z.z.core.$strip>;
8
+ export type WordsCountInput = z.infer<typeof wordsCountSchema>;
9
+ export interface WordsCountOutput {
10
+ words: number;
11
+ characters: number;
12
+ charactersNoSpaces: number;
13
+ readingTimeMinutes: number;
14
+ sentences?: number;
15
+ paragraphs?: number;
16
+ }
17
+ export declare function wordsCount(input: WordsCountInput): WordsCountOutput;
18
+ //# sourceMappingURL=words-count.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"words-count.d.ts","sourceRoot":"","sources":["words-count.ts"],"names":[],"mappings":"AAEA,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C,eAAO,MAAM,gBAAgB,EAAE,UAO9B,CAAC;AAEF,eAAO,MAAM,gBAAgB;;;mBAG3B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE/D,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CAkBnE"}
@@ -0,0 +1,31 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import z from 'zod';
3
+ import { parseChapter } from '../utils.js';
4
+ export const wordsCountConfig = {
5
+ name: 'words-count',
6
+ description: 'Counts the number of words in a given text file.',
7
+ arguments: {
8
+ filePath: 'Path to the text file to be analyzed.',
9
+ detailed: 'Include detailed statistics.',
10
+ },
11
+ };
12
+ export const wordsCountSchema = z.object({
13
+ filePath: z.string().describe(wordsCountConfig.arguments.filePath),
14
+ detailed: z.boolean().optional().describe(wordsCountConfig.arguments.detailed),
15
+ });
16
+ export function wordsCount(input) {
17
+ const { filePath, detailed = false } = wordsCountSchema.parse(input);
18
+ const { stats } = parseChapter(readFileSync(filePath, 'utf-8'));
19
+ const result = {
20
+ words: stats.wordCount,
21
+ characters: stats.charCountWithSpaces,
22
+ charactersNoSpaces: stats.charCount,
23
+ readingTimeMinutes: stats.readingTimeMinutes,
24
+ };
25
+ if (detailed) {
26
+ result.sentences = stats.sentenceCount;
27
+ result.paragraphs = stats.paragraphCount;
28
+ }
29
+ return result;
30
+ }
31
+ //# sourceMappingURL=words-count.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"words-count.js","sourceRoot":"","sources":["words-count.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,CAAC,MAAM,KAAK,CAAC;AAGpB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,CAAC,MAAM,gBAAgB,GAAe;IAC1C,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,kDAAkD;IAC/D,SAAS,EAAE;QACT,QAAQ,EAAE,uCAAuC;QACjD,QAAQ,EAAE,8BAA8B;KACzC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC,SAAS,CAAC,QAAQ,CAAC;IAClE,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC,SAAS,CAAC,QAAQ,CAAC;CAC/E,CAAC,CAAC;AAaH,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,KAAK,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAErE,MAAM,EAAE,KAAK,EAAE,GAAG,YAAY,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAEhE,MAAM,MAAM,GAAqB;QAC/B,KAAK,EAAE,KAAK,CAAC,SAAS;QACtB,UAAU,EAAE,KAAK,CAAC,mBAAmB;QACrC,kBAAkB,EAAE,KAAK,CAAC,SAAS;QACnC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;KAC7C,CAAC;IAEF,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,aAAa,CAAC;QACvC,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC,cAAc,CAAC;IAC3C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/lib/types.d.ts ADDED
@@ -0,0 +1,29 @@
1
+ export interface Package {
2
+ name: string;
3
+ description: string;
4
+ version: string;
5
+ }
6
+ export interface ToolConfig {
7
+ name: string;
8
+ description: string;
9
+ arguments: Record<string, string>;
10
+ }
11
+ export interface ChapterMetadata {
12
+ pov: string;
13
+ title: string;
14
+ date: string;
15
+ timeline: string;
16
+ arc: string;
17
+ episode: number;
18
+ part: number;
19
+ chapter: number;
20
+ summary: string;
21
+ location: string;
22
+ outfit?: string;
23
+ kink?: string;
24
+ }
25
+ export interface ParsedMarkdown {
26
+ metadata: ChapterMetadata;
27
+ content: string;
28
+ }
29
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,eAAe,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB"}
package/lib/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["types.ts"],"names":[],"mappings":""}
package/lib/utils.d.ts ADDED
@@ -0,0 +1,19 @@
1
+ import type { ChapterMetadata, Package, ParsedMarkdown } from './types.js';
2
+ export declare function getPackageConfig(): Package;
3
+ export interface TextStats {
4
+ wordCount: number;
5
+ charCount: number;
6
+ charCountWithSpaces: number;
7
+ paragraphCount: number;
8
+ sentenceCount: number;
9
+ readingTimeMinutes: number;
10
+ }
11
+ export interface ParsedChapter {
12
+ metadata: ChapterMetadata;
13
+ content: string;
14
+ plainText: string;
15
+ stats: TextStats;
16
+ }
17
+ export declare function parseMarkdown(markdown: string): ParsedMarkdown;
18
+ export declare function parseChapter(markdown: string): ParsedChapter;
19
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["utils.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE3E,wBAAgB,gBAAgB,IAAI,OAAO,CAG1C;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,eAAe,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,SAAS,CAAC;CAClB;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAW9D;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAuB5D"}
package/lib/utils.js ADDED
@@ -0,0 +1,40 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import matter from 'gray-matter';
4
+ import removeMd from 'remove-markdown';
5
+ export function getPackageConfig() {
6
+ const packagePath = join(import.meta.dirname, '..', 'package.json');
7
+ return JSON.parse(readFileSync(packagePath, 'utf8'));
8
+ }
9
+ export function parseMarkdown(markdown) {
10
+ const { data, content } = matter(markdown);
11
+ if (data.date instanceof Date) {
12
+ data.date = data.date.toISOString().split('T')[0];
13
+ }
14
+ return {
15
+ metadata: data,
16
+ content: content.trim(),
17
+ };
18
+ }
19
+ export function parseChapter(markdown) {
20
+ const { metadata, content } = parseMarkdown(markdown);
21
+ // Strip markdown to plain text
22
+ const withoutHeaders = content.replace(/^#{1,6}\s+.*$/gm, '');
23
+ const plainText = removeMd(withoutHeaders);
24
+ // Compute all stats
25
+ const wordCount = plainText.split(/\s+/).filter((w) => w.length > 0).length;
26
+ return {
27
+ metadata,
28
+ content,
29
+ plainText,
30
+ stats: {
31
+ wordCount,
32
+ charCount: plainText.replace(/\s/g, '').length,
33
+ charCountWithSpaces: plainText.length,
34
+ paragraphCount: plainText.split(/\n\s*\n/).filter((p) => p.trim().length > 0).length,
35
+ sentenceCount: plainText.split(/[.!?]+/).filter((s) => s.trim().length > 0).length,
36
+ readingTimeMinutes: Math.ceil(wordCount / 200),
37
+ },
38
+ };
39
+ }
40
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,QAAQ,MAAM,iBAAiB,CAAC;AAIvC,MAAM,UAAU,gBAAgB;IAC9B,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IACpE,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAY,CAAC;AAClE,CAAC;AAkBD,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE3C,IAAI,IAAI,CAAC,IAAI,YAAY,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,IAAuB;QACjC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE;KACxB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAEtD,+BAA+B;IAC/B,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;IAE3C,oBAAoB;IACpB,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;IAE5E,OAAO;QACL,QAAQ;QACR,OAAO;QACP,SAAS;QACT,KAAK,EAAE;YACL,SAAS;YACT,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM;YAC9C,mBAAmB,EAAE,SAAS,CAAC,MAAM;YACrC,cAAc,EAAE,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM;YACpF,aAAa,EAAE,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM;YAClF,kBAAkB,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;SAC/C;KACF,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,57 +1,60 @@
1
1
  {
2
2
  "name": "@echoes-io/mcp-server",
3
+ "version": "6.0.0",
4
+ "description": "📚 Model Context Protocol server for AI-powered storytelling with Narrative Knowledge Graph - extract characters, locations, relationships and search your stories semantically.",
3
5
  "type": "module",
4
- "version": "4.1.0",
5
- "description": "Model Context Protocol server for AI integration with Echoes storytelling platform",
6
+ "bin": {
7
+ "echoes": "cli/index.js"
8
+ },
9
+ "files": [
10
+ "cli/**/*.js",
11
+ "cli/**/*.d.ts",
12
+ "cli/**/*.map",
13
+ "lib/**/*.js",
14
+ "lib/**/*.d.ts",
15
+ "lib/**/*.map",
16
+ "README.md",
17
+ "LICENSE"
18
+ ],
6
19
  "scripts": {
7
- "dev": "tsx cli/index.ts",
8
- "db:generate": "drizzle-kit generate",
9
- "db:migrate": "drizzle-kit migrate",
10
- "db:studio": "drizzle-kit studio",
20
+ "prebuild": "npm run clean",
21
+ "build": "tsc",
22
+ "pretest": "npm run clean",
23
+ "test": "vitest run",
24
+ "pretest:coverage": "npm run clean",
25
+ "test:coverage": "vitest run --coverage",
26
+ "posttest:coverage": "coverage-badge-readme",
11
27
  "prelint": "npm run build",
12
28
  "lint": "concurrently npm:lint:* --prefixColors auto",
13
- "postlint": "npm run clean",
14
29
  "lint:format": "biome check --write",
30
+ "lint:package": "npmPkgJsonLint .",
15
31
  "lint:lockfile": "lockfile-lint --path package-lock.json",
16
32
  "lint:engines": "ls-engines",
17
33
  "lint:publish": "publint --strict",
18
- "pretest": "npm run clean",
19
- "test": "vitest run",
20
- "pretest:coverage": "npm run clean",
21
- "test:coverage": "vitest run --coverage",
22
- "check": "npm run test:coverage && npm run lint",
23
- "prepare": "[ \"$CI\" = \"true\" ] || [ \"$GITHUB_ACTIONS\" = \"true\" ] && echo 'Skipping husky' && exit 0 || husky",
24
- "clean": "rimraf --glob ./{cli,src,test}/**/*.{d.ts,js} ./{drizzle,vitest}*.{d.ts,js}",
25
- "prebuild": "npm run clean",
26
- "build": "tsc",
27
- "release": "semantic-release"
28
- },
29
- "bin": {
30
- "echoes-mcp-server": "./cli/index.js"
31
- },
32
- "exports": {
33
- ".": "./src/database/index.js"
34
- },
35
- "files": [
36
- "cli/**/*.{d.ts,js}",
37
- "lib/**/*.{d.ts,js}",
38
- "src/**/*.{d.ts,js}"
39
- ],
40
- "engines": {
41
- "node": ">= 20.3"
42
- },
43
- "publishConfig": {
44
- "access": "public",
45
- "provenance": true
34
+ "postlint": "npm run clean",
35
+ "clean": "rimraf --glob ./{cli,lib,scripts,test}/**/*.{d.ts,js,map} ./vitest*.{d.ts,js,map}",
36
+ "prepare": "[ \"$CI\" = \"true\" ] || [ \"$GITHUB_ACTIONS\" = \"true\" ] && echo 'Skipping husky' && exit 0 || husky"
46
37
  },
47
38
  "repository": {
48
39
  "type": "git",
49
40
  "url": "git+https://github.com/echoes-io/mcp-server.git"
50
41
  },
51
42
  "keywords": [
52
- "echoes",
43
+ "mcp",
44
+ "model-context-protocol",
53
45
  "storytelling",
54
- "multi-pov"
46
+ "narrative",
47
+ "knowledge-graph",
48
+ "rag",
49
+ "semantic-search",
50
+ "entity-extraction",
51
+ "lancedb",
52
+ "vector-database",
53
+ "gemini",
54
+ "embeddings",
55
+ "typescript",
56
+ "ai",
57
+ "llm"
55
58
  ],
56
59
  "author": "Zweer <n.olivieriachille@gmail.com>",
57
60
  "license": "MIT",
@@ -59,45 +62,40 @@
59
62
  "url": "https://github.com/echoes-io/mcp-server/issues"
60
63
  },
61
64
  "homepage": "https://github.com/echoes-io/mcp-server#readme",
62
- "release": {
63
- "plugins": [
64
- "@semantic-release/commit-analyzer",
65
- "@semantic-release/release-notes-generator",
66
- "@semantic-release/changelog",
67
- "@semantic-release/npm",
68
- "@semantic-release/github",
69
- "@semantic-release/git"
70
- ]
65
+ "engines": {
66
+ "node": ">=20.3"
71
67
  },
72
68
  "devDependencies": {
73
- "@biomejs/biome": "^2.3.8",
69
+ "@biomejs/biome": "^2.3.10",
74
70
  "@semantic-release/changelog": "^6.0.3",
75
71
  "@semantic-release/git": "^10.0.1",
76
72
  "@tsconfig/node22": "^22.0.5",
77
- "@types/better-sqlite3": "^7.6.11",
78
- "@types/node": "^24.10.1",
79
- "@vitest/coverage-v8": "^4.0.15",
73
+ "@types/node": "^25.0.3",
74
+ "@vitest/coverage-v8": "^4.0.16",
75
+ "@zweer/coverage-badge-readme": "^1.2.2",
80
76
  "concurrently": "^9.2.1",
81
- "drizzle-kit": "^1.0.0-beta.3-36e9b9e",
82
- "fast-check": "^4.4.0",
83
77
  "husky": "^9.1.7",
84
78
  "lint-staged": "^16.2.7",
85
79
  "lockfile-lint": "^4.14.1",
86
- "ls-engines": "^0.9.3",
87
- "publint": "^0.3.15",
88
- "rimraf": "^6.1.2",
80
+ "ls-engines": "^0.9.4",
81
+ "npm-package-json-lint": "^9.0.0",
82
+ "npm-package-json-lint-config-default": "^8.0.1",
83
+ "publint": "^0.3.16",
89
84
  "semantic-release": "^25.0.2",
90
85
  "tsx": "^4.21.0",
91
86
  "typescript": "^5.9.3",
92
- "vitest": "^4.0.15"
87
+ "vitest": "^4.0.16"
93
88
  },
94
89
  "dependencies": {
95
- "@modelcontextprotocol/sdk": "^1.24.2",
96
- "better-sqlite3": "^11.0.0",
97
- "drizzle-orm": "^1.0.0-beta.3-36e9b9e",
90
+ "@commander-js/extra-typings": "^14.0.0",
91
+ "@google/genai": "^1.34.0",
92
+ "@huggingface/transformers": "^3.8.1",
93
+ "@lancedb/lancedb": "^0.23.0",
94
+ "@modelcontextprotocol/sdk": "^1.25.1",
95
+ "apache-arrow": "^18.1.0",
96
+ "commander": "^14.0.2",
98
97
  "gray-matter": "^4.0.3",
99
98
  "remove-markdown": "^0.6.2",
100
- "sqlite-vec": "^0.1.7-alpha.2",
101
- "zod": "^4.1.12"
99
+ "zod": "^4.2.1"
102
100
  }
103
101
  }