@echoes-io/mcp-server 4.1.1 → 6.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 (112) hide show
  1. package/README.md +120 -185
  2. package/cli/index.d.ts +1 -0
  3. package/cli/index.d.ts.map +1 -0
  4. package/cli/index.js +3 -185
  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 +151 -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/indexer/tasks.d.ts +32 -0
  35. package/lib/indexer/tasks.d.ts.map +1 -0
  36. package/lib/indexer/tasks.js +228 -0
  37. package/lib/indexer/tasks.js.map +1 -0
  38. package/lib/prompts/index.d.ts +13 -0
  39. package/lib/prompts/index.d.ts.map +1 -0
  40. package/lib/prompts/index.js +153 -0
  41. package/lib/prompts/index.js.map +1 -0
  42. package/lib/server.d.ts +13 -0
  43. package/lib/server.d.ts.map +1 -0
  44. package/lib/server.js +90 -0
  45. package/lib/server.js.map +1 -0
  46. package/lib/tools/index.d.ts +14 -0
  47. package/lib/tools/index.d.ts.map +1 -0
  48. package/lib/tools/index.js +25 -0
  49. package/lib/tools/index.js.map +1 -0
  50. package/lib/tools/search.d.ts +86 -0
  51. package/lib/tools/search.d.ts.map +1 -0
  52. package/lib/tools/search.js +95 -0
  53. package/lib/tools/search.js.map +1 -0
  54. package/lib/tools/stats.d.ts +18 -0
  55. package/lib/tools/stats.d.ts.map +1 -0
  56. package/lib/tools/stats.js +62 -0
  57. package/lib/tools/stats.js.map +1 -0
  58. package/{src → lib}/tools/words-count.d.ts +6 -3
  59. package/lib/tools/words-count.d.ts.map +1 -0
  60. package/lib/tools/words-count.js +31 -0
  61. package/lib/tools/words-count.js.map +1 -0
  62. package/{src/types/frontmatter.d.ts → lib/types.d.ts} +11 -17
  63. package/lib/types.d.ts.map +1 -0
  64. package/lib/types.js +2 -0
  65. package/lib/types.js.map +1 -0
  66. package/lib/utils.d.ts +19 -0
  67. package/lib/utils.d.ts.map +1 -0
  68. package/lib/utils.js +40 -0
  69. package/lib/utils.js.map +1 -0
  70. package/package.json +60 -62
  71. package/src/database/index.d.ts +0 -6
  72. package/src/database/index.js +0 -26
  73. package/src/database/relations.d.ts +0 -744
  74. package/src/database/relations.js +0 -52
  75. package/src/database/schema.d.ts +0 -733
  76. package/src/database/schema.js +0 -69
  77. package/src/database/vector.d.ts +0 -25
  78. package/src/database/vector.js +0 -98
  79. package/src/index.d.ts +0 -5
  80. package/src/index.js +0 -5
  81. package/src/rag/character-ner.d.ts +0 -36
  82. package/src/rag/character-ner.js +0 -416
  83. package/src/rag/database-sync.d.ts +0 -38
  84. package/src/rag/database-sync.js +0 -158
  85. package/src/rag/embeddings.d.ts +0 -74
  86. package/src/rag/embeddings.js +0 -164
  87. package/src/rag/graph-rag.d.ts +0 -69
  88. package/src/rag/graph-rag.js +0 -311
  89. package/src/rag/hybrid-rag.d.ts +0 -109
  90. package/src/rag/hybrid-rag.js +0 -255
  91. package/src/rag/index.d.ts +0 -16
  92. package/src/rag/index.js +0 -33
  93. package/src/server.d.ts +0 -43
  94. package/src/server.js +0 -177
  95. package/src/tools/index-rag.d.ts +0 -19
  96. package/src/tools/index-rag.js +0 -85
  97. package/src/tools/index-tracker.d.ts +0 -17
  98. package/src/tools/index-tracker.js +0 -89
  99. package/src/tools/index.d.ts +0 -5
  100. package/src/tools/index.js +0 -5
  101. package/src/tools/rag-context.d.ts +0 -34
  102. package/src/tools/rag-context.js +0 -51
  103. package/src/tools/rag-search.d.ts +0 -35
  104. package/src/tools/rag-search.js +0 -60
  105. package/src/tools/words-count.js +0 -28
  106. package/src/types/frontmatter.js +0 -1
  107. package/src/utils/index.d.ts +0 -1
  108. package/src/utils/index.js +0 -1
  109. package/src/utils/markdown.d.ts +0 -6
  110. package/src/utils/markdown.js +0 -36
  111. package/src/utils/timeline-detection.d.ts +0 -13
  112. package/src/utils/timeline-detection.js +0 -76
@@ -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"}
@@ -1,6 +1,13 @@
1
- /**
2
- * Frontmatter metadata from YAML headers
3
- */
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
+ }
4
11
  export interface ChapterMetadata {
5
12
  pov: string;
6
13
  title: string;
@@ -15,21 +22,8 @@ export interface ChapterMetadata {
15
22
  outfit?: string;
16
23
  kink?: string;
17
24
  }
18
- /**
19
- * Text statistics calculated from content
20
- */
21
- export interface TextStats {
22
- words: number;
23
- characters: number;
24
- charactersNoSpaces: number;
25
- paragraphs: number;
26
- sentences: number;
27
- readingTimeMinutes: number;
28
- }
29
- /**
30
- * Result of parsing a markdown file
31
- */
32
25
  export interface ParsedMarkdown {
33
26
  metadata: ChapterMetadata;
34
27
  content: string;
35
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,58 +1,60 @@
1
1
  {
2
2
  "name": "@echoes-io/mcp-server",
3
+ "version": "6.1.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.1",
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
- "prerelease": "npm run build",
28
- "release": "semantic-release"
29
- },
30
- "bin": {
31
- "echoes-mcp-server": "./cli/index.js"
32
- },
33
- "exports": {
34
- ".": "./src/database/index.js"
35
- },
36
- "files": [
37
- "cli/**/*.{d.ts,js}",
38
- "lib/**/*.{d.ts,js}",
39
- "src/**/*.{d.ts,js}"
40
- ],
41
- "engines": {
42
- "node": ">= 20.3"
43
- },
44
- "publishConfig": {
45
- "access": "public",
46
- "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"
47
37
  },
48
38
  "repository": {
49
39
  "type": "git",
50
40
  "url": "git+https://github.com/echoes-io/mcp-server.git"
51
41
  },
52
42
  "keywords": [
53
- "echoes",
43
+ "mcp",
44
+ "model-context-protocol",
54
45
  "storytelling",
55
- "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"
56
58
  ],
57
59
  "author": "Zweer <n.olivieriachille@gmail.com>",
58
60
  "license": "MIT",
@@ -60,45 +62,41 @@
60
62
  "url": "https://github.com/echoes-io/mcp-server/issues"
61
63
  },
62
64
  "homepage": "https://github.com/echoes-io/mcp-server#readme",
63
- "release": {
64
- "plugins": [
65
- "@semantic-release/commit-analyzer",
66
- "@semantic-release/release-notes-generator",
67
- "@semantic-release/changelog",
68
- "@semantic-release/npm",
69
- "@semantic-release/github",
70
- "@semantic-release/git"
71
- ]
65
+ "engines": {
66
+ "node": ">=20.3"
72
67
  },
73
68
  "devDependencies": {
74
- "@biomejs/biome": "^2.3.8",
69
+ "@biomejs/biome": "^2.3.10",
75
70
  "@semantic-release/changelog": "^6.0.3",
76
71
  "@semantic-release/git": "^10.0.1",
77
72
  "@tsconfig/node22": "^22.0.5",
78
- "@types/better-sqlite3": "^7.6.11",
79
- "@types/node": "^24.10.1",
80
- "@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",
81
76
  "concurrently": "^9.2.1",
82
- "drizzle-kit": "^1.0.0-beta.3-36e9b9e",
83
- "fast-check": "^4.4.0",
84
77
  "husky": "^9.1.7",
85
78
  "lint-staged": "^16.2.7",
86
79
  "lockfile-lint": "^4.14.1",
87
- "ls-engines": "^0.9.3",
88
- "publint": "^0.3.15",
89
- "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",
90
84
  "semantic-release": "^25.0.2",
91
85
  "tsx": "^4.21.0",
92
86
  "typescript": "^5.9.3",
93
- "vitest": "^4.0.15"
87
+ "vitest": "^4.0.16"
94
88
  },
95
89
  "dependencies": {
96
- "@modelcontextprotocol/sdk": "^1.24.2",
97
- "better-sqlite3": "^11.0.0",
98
- "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",
99
97
  "gray-matter": "^4.0.3",
98
+ "listr2": "^9.0.5",
100
99
  "remove-markdown": "^0.6.2",
101
- "sqlite-vec": "^0.1.7-alpha.2",
102
- "zod": "^4.1.12"
100
+ "zod": "^4.2.1"
103
101
  }
104
102
  }
@@ -1,6 +0,0 @@
1
- import { drizzle } from 'drizzle-orm/better-sqlite3';
2
- import * as schema from './schema.js';
3
- export type DatabaseType = ReturnType<typeof drizzle<typeof schema>>;
4
- export declare function initDatabase(dbPath: string): Promise<DatabaseType>;
5
- export { relations } from './relations.js';
6
- export * from './schema.js';
@@ -1,26 +0,0 @@
1
- import Database from 'better-sqlite3';
2
- import { drizzle } from 'drizzle-orm/better-sqlite3';
3
- import { migrate } from 'drizzle-orm/better-sqlite3/migrator';
4
- import * as sqliteVec from 'sqlite-vec';
5
- import { relations } from './relations.js';
6
- import * as schema from './schema.js';
7
- export async function initDatabase(dbPath) {
8
- const client = new Database(dbPath);
9
- // Enable WAL mode for better concurrency
10
- client.pragma('journal_mode = WAL');
11
- // Load sqlite-vec extension
12
- sqliteVec.load(client);
13
- const db = drizzle({ client, relations, schema });
14
- // Auto-migrate on startup
15
- try {
16
- await migrate(db, { migrationsFolder: './db' });
17
- }
18
- catch (error) {
19
- console.error('❌ Database migration failed:', error);
20
- throw error;
21
- }
22
- return db;
23
- }
24
- export { relations } from './relations.js';
25
- // Re-export all schema
26
- export * from './schema.js';