@speakeasy-api/docs-mcp-core 0.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 (51) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +27 -0
  3. package/dist/chunking.d.ts +3 -0
  4. package/dist/chunking.d.ts.map +1 -0
  5. package/dist/chunking.js +332 -0
  6. package/dist/chunking.js.map +1 -0
  7. package/dist/cursor.d.ts +12 -0
  8. package/dist/cursor.d.ts.map +1 -0
  9. package/dist/cursor.js +83 -0
  10. package/dist/cursor.js.map +1 -0
  11. package/dist/embedding-cache.d.ts +46 -0
  12. package/dist/embedding-cache.d.ts.map +1 -0
  13. package/dist/embedding-cache.js +230 -0
  14. package/dist/embedding-cache.js.map +1 -0
  15. package/dist/embedding.d.ts +66 -0
  16. package/dist/embedding.d.ts.map +1 -0
  17. package/dist/embedding.js +264 -0
  18. package/dist/embedding.js.map +1 -0
  19. package/dist/index.d.ts +11 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +11 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/lancedb.d.ts +42 -0
  24. package/dist/lancedb.d.ts.map +1 -0
  25. package/dist/lancedb.js +442 -0
  26. package/dist/lancedb.js.map +1 -0
  27. package/dist/manifest.d.ts +19 -0
  28. package/dist/manifest.d.ts.map +1 -0
  29. package/dist/manifest.js +245 -0
  30. package/dist/manifest.js.map +1 -0
  31. package/dist/metadata.d.ts +6 -0
  32. package/dist/metadata.d.ts.map +1 -0
  33. package/dist/metadata.js +152 -0
  34. package/dist/metadata.js.map +1 -0
  35. package/dist/parser.d.ts +6 -0
  36. package/dist/parser.d.ts.map +1 -0
  37. package/dist/parser.js +21 -0
  38. package/dist/parser.js.map +1 -0
  39. package/dist/search-common.d.ts +7 -0
  40. package/dist/search-common.d.ts.map +1 -0
  41. package/dist/search-common.js +81 -0
  42. package/dist/search-common.js.map +1 -0
  43. package/dist/search.d.ts +13 -0
  44. package/dist/search.d.ts.map +1 -0
  45. package/dist/search.js +166 -0
  46. package/dist/search.js.map +1 -0
  47. package/dist/types.d.ts +125 -0
  48. package/dist/types.d.ts.map +1 -0
  49. package/dist/types.js +2 -0
  50. package/dist/types.js.map +1 -0
  51. package/package.json +49 -0
package/dist/search.js ADDED
@@ -0,0 +1,166 @@
1
+ import { decodeSearchCursor, encodeSearchCursor } from "./cursor.js";
2
+ import { clampLimit, isChunkIdFormat, makeSnippet, matchesMetadataFilters, normalizeSearchText, tokenizeSearchText } from "./search-common.js";
3
+ export class InMemorySearchEngine {
4
+ chunks;
5
+ byId;
6
+ byFile;
7
+ proximityWeight;
8
+ constructor(chunks, options = {}) {
9
+ this.chunks = [...chunks];
10
+ this.byId = new Map(chunks.map((chunk) => [chunk.chunk_id, chunk]));
11
+ this.byFile = new Map();
12
+ this.proximityWeight = options.proximityWeight ?? 1.25;
13
+ for (const chunk of chunks) {
14
+ const list = this.byFile.get(chunk.filepath) ?? [];
15
+ list.push(chunk);
16
+ this.byFile.set(chunk.filepath, list);
17
+ }
18
+ for (const list of this.byFile.values()) {
19
+ list.sort((a, b) => a.chunk_index - b.chunk_index);
20
+ }
21
+ }
22
+ async search(request) {
23
+ const query = request.query.trim();
24
+ if (!query) {
25
+ throw new Error("query is required");
26
+ }
27
+ const limit = clampLimit(request.limit);
28
+ const filters = request.filters ?? {};
29
+ const offset = request.cursor
30
+ ? decodeSearchCursor(request.cursor, { query, filters }).offset
31
+ : 0;
32
+ const taxonomyKeys = request.taxonomy_keys;
33
+ const proximityWeight = request.rrf_weights?.phrase ?? this.proximityWeight;
34
+ const scored = this.chunks
35
+ .filter((chunk) => matchesMetadataFilters(chunk.metadata, filters, taxonomyKeys))
36
+ .map((chunk) => ({ chunk, score: scoreChunk(chunk, query, proximityWeight) }))
37
+ .filter((entry) => entry.score > 0)
38
+ .sort((a, b) => b.score - a.score || a.chunk.chunk_id.localeCompare(b.chunk.chunk_id));
39
+ const paged = scored.slice(offset, offset + limit);
40
+ const hits = paged.map(({ chunk, score }) => toSearchHit(chunk, score, query));
41
+ const nextOffset = offset + paged.length;
42
+ const nextCursor = nextOffset < scored.length
43
+ ? encodeSearchCursor({ offset: nextOffset, limit }, { query, filters })
44
+ : null;
45
+ if (hits.length > 0) {
46
+ return {
47
+ hits,
48
+ next_cursor: nextCursor,
49
+ hint: null
50
+ };
51
+ }
52
+ return {
53
+ hits,
54
+ next_cursor: nextCursor,
55
+ hint: buildHint(this.chunks, query, filters)
56
+ };
57
+ }
58
+ async getDoc(request) {
59
+ if (!isChunkIdFormat(request.chunk_id)) {
60
+ throw new Error(`Chunk ID '${request.chunk_id}' has invalid format. Expected {filepath} or {filepath}#{heading-path}.`);
61
+ }
62
+ const context = Math.max(0, Math.min(5, request.context ?? 0));
63
+ const target = this.byId.get(request.chunk_id);
64
+ if (!target) {
65
+ throw new Error(`Chunk ID '${request.chunk_id}' not found. Use search_docs to discover valid chunk IDs.`);
66
+ }
67
+ const fileChunks = this.byFile.get(target.filepath);
68
+ if (!fileChunks) {
69
+ throw new Error(`Internal error: file '${target.filepath}' is missing from index`);
70
+ }
71
+ const indexInFile = fileChunks.findIndex((chunk) => chunk.chunk_id === target.chunk_id);
72
+ const start = Math.max(0, indexInFile - context);
73
+ const end = Math.min(fileChunks.length - 1, indexInFile + context);
74
+ const blocks = [];
75
+ for (let i = start; i <= end; i += 1) {
76
+ const chunk = fileChunks[i];
77
+ if (!chunk) {
78
+ continue;
79
+ }
80
+ const positionLabel = `Chunk ${i + 1} of ${fileChunks.length}`;
81
+ const contextOffset = i - indexInFile;
82
+ const role = contextOffset === 0
83
+ ? "Target"
84
+ : `Context: ${contextOffset > 0 ? `+${contextOffset}` : contextOffset}`;
85
+ blocks.push(`--- Chunk: ${chunk.chunk_id} (${positionLabel}) (${role}) ---\n${chunk.content}`);
86
+ }
87
+ return {
88
+ text: blocks.join("\n\n")
89
+ };
90
+ }
91
+ }
92
+ // Backwards-compatible alias while introducing the SearchEngine abstraction.
93
+ export class DocsIndex extends InMemorySearchEngine {
94
+ }
95
+ function scoreChunk(chunk, query, proximityWeight) {
96
+ const queryNormalized = normalizeSearchText(query);
97
+ const tokens = tokenizeSearchText(queryNormalized);
98
+ if (tokens.length === 0) {
99
+ return 0;
100
+ }
101
+ const heading = normalizeSearchText(chunk.heading);
102
+ const content = normalizeSearchText(chunk.content_text);
103
+ let lexical = 0;
104
+ for (const token of tokens) {
105
+ lexical += countToken(content, token) + 3 * countToken(heading, token);
106
+ }
107
+ const phraseMatch = content.includes(queryNormalized) || heading.includes(queryNormalized);
108
+ const proximityBoost = phraseMatch ? proximityWeight : 0;
109
+ return lexical + proximityBoost;
110
+ }
111
+ function toSearchHit(chunk, score, query) {
112
+ return {
113
+ chunk_id: chunk.chunk_id,
114
+ heading: chunk.heading,
115
+ breadcrumb: chunk.breadcrumb,
116
+ snippet: makeSnippet(chunk.content_text, query),
117
+ filepath: chunk.filepath,
118
+ metadata: chunk.metadata,
119
+ score: Number(score.toFixed(6))
120
+ };
121
+ }
122
+ function buildHint(chunks, query, filters) {
123
+ const queryMatches = chunks.filter((chunk) => scoreChunk(chunk, query, 0) > 0);
124
+ if (queryMatches.length === 0) {
125
+ return {
126
+ message: "0 results found. No matches were found for this query in the indexed corpus.",
127
+ suggested_filters: {}
128
+ };
129
+ }
130
+ const suggestions = {};
131
+ for (const [key, activeValue] of Object.entries(filters)) {
132
+ const values = new Set();
133
+ for (const chunk of queryMatches) {
134
+ const candidate = chunk.metadata[key];
135
+ if (!candidate || candidate === activeValue) {
136
+ continue;
137
+ }
138
+ values.add(candidate);
139
+ }
140
+ if (values.size > 0) {
141
+ suggestions[key] = [...values].sort((a, b) => a.localeCompare(b));
142
+ }
143
+ }
144
+ const filterSummary = Object.entries(filters)
145
+ .map(([key, value]) => `${key}='${value}'`)
146
+ .join(", ");
147
+ return {
148
+ message: filterSummary
149
+ ? `0 results found for query '${query}' with filters ${filterSummary}.`
150
+ : `0 results found for query '${query}'.`,
151
+ suggested_filters: suggestions
152
+ };
153
+ }
154
+ function countToken(value, token) {
155
+ if (!token) {
156
+ return 0;
157
+ }
158
+ let count = 0;
159
+ let index = value.indexOf(token);
160
+ while (index >= 0) {
161
+ count += 1;
162
+ index = value.indexOf(token, index + token.length);
163
+ }
164
+ return count;
165
+ }
166
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,125 @@
1
+ export interface Chunk {
2
+ chunk_id: string;
3
+ filepath: string;
4
+ heading: string;
5
+ heading_level: number;
6
+ content: string;
7
+ content_text: string;
8
+ breadcrumb: string;
9
+ chunk_index: number;
10
+ metadata: Record<string, string>;
11
+ }
12
+ export interface ChunkingStrategy {
13
+ chunk_by: "h1" | "h2" | "h3" | "file";
14
+ max_chunk_size?: number;
15
+ min_chunk_size?: number;
16
+ }
17
+ export interface ManifestOverride {
18
+ pattern: string;
19
+ strategy?: ChunkingStrategy;
20
+ metadata?: Record<string, string>;
21
+ }
22
+ export interface Manifest {
23
+ version: string;
24
+ strategy?: ChunkingStrategy;
25
+ metadata?: Record<string, string>;
26
+ overrides?: ManifestOverride[];
27
+ }
28
+ export interface RrfWeights {
29
+ vector?: number;
30
+ match?: number;
31
+ phrase?: number;
32
+ }
33
+ export interface SearchRequest {
34
+ query: string;
35
+ limit: number;
36
+ cursor?: string;
37
+ filters: Record<string, string>;
38
+ /** Available taxonomy keys from metadata, used for conditional auto-include */
39
+ taxonomy_keys?: string[];
40
+ /** Optional RRF weight overrides for this request */
41
+ rrf_weights?: RrfWeights;
42
+ }
43
+ export interface SearchHit {
44
+ chunk_id: string;
45
+ heading: string;
46
+ breadcrumb: string;
47
+ snippet: string;
48
+ filepath: string;
49
+ metadata: Record<string, string>;
50
+ score: number;
51
+ }
52
+ export interface SearchHint {
53
+ message: string;
54
+ suggested_filters: Record<string, string[]>;
55
+ }
56
+ export interface SearchResult {
57
+ hits: SearchHit[];
58
+ next_cursor: string | null;
59
+ hint: SearchHint | null;
60
+ }
61
+ export interface SearchEngine {
62
+ search(request: SearchRequest): Promise<SearchResult>;
63
+ getDoc(request: GetDocRequest): Promise<GetDocResult>;
64
+ }
65
+ export interface TaxonomyField {
66
+ description?: string;
67
+ values: string[];
68
+ }
69
+ export interface MetadataStats {
70
+ total_chunks: number;
71
+ total_files: number;
72
+ indexed_at: string;
73
+ source_commit?: string | null;
74
+ }
75
+ export interface EmbeddingMetadata {
76
+ provider: string;
77
+ model: string;
78
+ dimensions: number;
79
+ }
80
+ export interface CorpusMetadata {
81
+ metadata_version: string;
82
+ corpus_description: string;
83
+ taxonomy: Record<string, TaxonomyField>;
84
+ stats: MetadataStats;
85
+ embedding: EmbeddingMetadata | null;
86
+ }
87
+ export interface GetDocRequest {
88
+ chunk_id: string;
89
+ context?: number;
90
+ }
91
+ export interface GetDocResult {
92
+ text: string;
93
+ }
94
+ export interface BuildChunksInput {
95
+ filepath: string;
96
+ markdown: string;
97
+ strategy: ChunkingStrategy;
98
+ metadata?: Record<string, string>;
99
+ }
100
+ export interface ResolvedFileConfig {
101
+ strategy: ChunkingStrategy;
102
+ metadata: Record<string, string>;
103
+ }
104
+ export interface EmbeddingConfig {
105
+ provider: string;
106
+ model: string;
107
+ dimensions: number;
108
+ configFingerprint: string;
109
+ }
110
+ export interface EmbeddingProvider {
111
+ readonly name: string;
112
+ readonly model: string;
113
+ readonly dimensions: number;
114
+ readonly configFingerprint: string;
115
+ embed(texts: string[]): Promise<number[][]>;
116
+ }
117
+ export interface DocsIndexOptions {
118
+ proximityWeight?: number;
119
+ phraseSlop?: number;
120
+ }
121
+ export interface CursorPayload {
122
+ offset: number;
123
+ limit: number;
124
+ }
125
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/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":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@speakeasy-api/docs-mcp-core",
3
+ "version": "0.1.0",
4
+ "description": "Core retrieval and indexing primitives for docs-mcp: markdown chunking, hybrid search, and LanceDB integration",
5
+ "license": "AGPL-3.0-only",
6
+ "type": "module",
7
+ "author": "Speakeasy <info@speakeasy.com> (https://speakeasy.com)",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/speakeasy-api/docs-mcp.git",
11
+ "directory": "packages/core"
12
+ },
13
+ "homepage": "https://github.com/speakeasy-api/docs-mcp",
14
+ "bugs": {
15
+ "url": "https://github.com/speakeasy-api/docs-mcp/issues"
16
+ },
17
+ "files": [
18
+ "dist"
19
+ ],
20
+ "main": "dist/index.js",
21
+ "types": "dist/index.d.ts",
22
+ "exports": {
23
+ ".": {
24
+ "types": "./dist/index.d.ts",
25
+ "import": "./dist/index.js"
26
+ }
27
+ },
28
+ "engines": {
29
+ "node": ">=22.0.0"
30
+ },
31
+ "dependencies": {
32
+ "@lancedb/lancedb": "^0.26.2",
33
+ "apache-arrow": "^18.1.0",
34
+ "gray-matter": "^4.0.3",
35
+ "mdast-util-to-string": "^4.0.0",
36
+ "picomatch": "^4.0.2",
37
+ "remark-frontmatter": "^5.0.0",
38
+ "remark-gfm": "^4.0.0",
39
+ "remark-parse": "^11.0.0",
40
+ "semver": "^7.7.1",
41
+ "unified": "^11.0.5"
42
+ },
43
+ "scripts": {
44
+ "build": "tsc -p tsconfig.json",
45
+ "typecheck": "tsc -p tsconfig.json --noEmit",
46
+ "test": "vitest run",
47
+ "lint": "eslint src test"
48
+ }
49
+ }