thorbit-kb-mcp 0.2.4 → 0.2.5

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.
@@ -80,6 +80,7 @@ var ansi = {
80
80
  clay: "\x1B[38;2;226;138;92m",
81
81
  cream: "\x1B[38;2;255;244;230m",
82
82
  green: "\x1B[38;2;75;181;67m",
83
+ shadow: "\x1B[38;2;116;70;56m",
83
84
  slate: "\x1B[38;2;174;181;195m",
84
85
  wire: "\x1B[38;2;198;90;54m"
85
86
  };
@@ -166,17 +167,11 @@ var thorbitPixelLetters = {
166
167
  };
167
168
  function renderReferenceCardBanner() {
168
169
  const heading = justifyCardContent(" Plain text", "\u29C9", cardWidth);
169
- const wordmarkRows = renderPixelWordmark("THORBIT");
170
- const wireRows = [
171
- " \u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E \u256D\u2500\u2500\u2500\u2500\u256E \u256D\u2500\u2500\u2500\u2500\u2500\u2500\u256E \u256D\u2500\u2500\u2500\u2500\u256E \u256D\u2500\u2500\u2500\u2500\u256E \u256D\u2500\u256E \u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E",
172
- " \u2570\u2500\u256E \u256D\u2500\u256F \u256D\u2500\u256F \u2570\u2500\u256E \u2502 \u256D\u2500\u2500\u2500\u256F \u256D\u2500\u256F \u2570\u2500\u256E \u2502 \u256D\u2500\u2500\u256F \u256D\u2500\u256F \u2570\u2500\u256E \u2570\u2500\u256E \u256D\u2500\u256F"
173
- ];
174
170
  return [
175
171
  `${ansi.cardBorder}\u256D${"\u2500".repeat(cardWidth + 2)}\u256E${ansi.reset}`,
176
172
  renderCardLine(heading, "title"),
177
173
  renderCardLine("", "blank"),
178
- ...wireRows.map((row) => renderCardLine(row, "wire")),
179
- ...wordmarkRows.map((row) => renderCardLine(row, "mark")),
174
+ ...renderLayeredPixelWordmarkCardLines("THORBIT"),
180
175
  renderCardLine("", "blank"),
181
176
  renderCardLine(" THORBIT KB MCP", "caption"),
182
177
  `${ansi.cardBorder}\u2570${"\u2500".repeat(cardWidth + 2)}\u256F${ansi.reset}`
@@ -207,12 +202,18 @@ function renderCardLine(content, tone) {
207
202
  caption: ansi.terracotta,
208
203
  blank: ansi.slate
209
204
  }[tone];
210
- const paddedContent = padCardContent(content, cardWidth);
205
+ return renderCardLineParts([{ color: foreground, text: content }]);
206
+ }
207
+ function renderCardLineParts(parts) {
208
+ const visibleWidth = parts.reduce((width, part) => width + part.text.length, 0);
209
+ const padding = " ".repeat(Math.max(0, cardWidth - visibleWidth));
211
210
  return [
212
211
  `${ansi.cardBorder}\u2502${ansi.reset}`,
213
212
  ansi.cardBg,
214
- foreground,
215
- ` ${paddedContent} `,
213
+ " ",
214
+ ...parts.map((part) => `${part.color}${part.text}`),
215
+ padding,
216
+ " ",
216
217
  ansi.reset,
217
218
  `${ansi.cardBorder}\u2502${ansi.reset}`
218
219
  ].join("");
@@ -220,31 +221,57 @@ function renderCardLine(content, tone) {
220
221
  function justifyCardContent(left, right, width) {
221
222
  return `${left}${" ".repeat(Math.max(1, width - left.length - right.length))}${right}`;
222
223
  }
223
- function padCardContent(content, width) {
224
- if (content.length >= width) return content.slice(0, width);
225
- return content.padEnd(width);
226
- }
227
- function renderPixelWordmark(word) {
228
- const rows = [];
224
+ function buildPixelWordmarkMatrix(word) {
225
+ const rows = Array.from({ length: 7 }, () => []);
229
226
  for (let rowIndex = 0; rowIndex < 7; rowIndex += 1) {
230
- const row = word.split("").map((letter) => {
227
+ word.split("").forEach((letter, letterIndex) => {
231
228
  const pattern = thorbitPixelLetters[letter];
232
- if (!pattern) return "";
233
- return pattern[rowIndex].split("").map((cell) => cell === "1" ? "\u2588\u2588" : " ").join("");
234
- }).join(" ");
235
- rows.push(` ${row}`);
229
+ if (!pattern) return;
230
+ if (letterIndex > 0) rows[rowIndex].push(false);
231
+ rows[rowIndex].push(...pattern[rowIndex].split("").map((cell) => cell === "1"));
232
+ });
236
233
  }
237
234
  return rows;
238
235
  }
236
+ function renderLayeredPixelWordmarkCardLines(word) {
237
+ const matrix = buildPixelWordmarkMatrix(word);
238
+ const wordmarkWidth = Math.max(...matrix.map((row) => row.length));
239
+ const shadowOffsetX = 1;
240
+ const shadowOffsetY = -1;
241
+ const outputRows = matrix.length + Math.abs(Math.min(0, shadowOffsetY));
242
+ const outputWidth = wordmarkWidth + shadowOffsetX;
243
+ return Array.from({ length: outputRows }, (_, outputRowIndex) => {
244
+ const rowParts = [{ color: ansi.slate, text: " " }];
245
+ for (let columnIndex = 0; columnIndex < outputWidth; columnIndex += 1) {
246
+ const foregroundRow = outputRowIndex - Math.abs(Math.min(0, shadowOffsetY));
247
+ const hasForeground = foregroundRow >= 0 && Boolean(matrix[foregroundRow]?.[columnIndex]);
248
+ const shadowSourceRow = outputRowIndex - shadowOffsetY - Math.abs(Math.min(0, shadowOffsetY));
249
+ const shadowSourceColumn = columnIndex - shadowOffsetX;
250
+ const hasShadow = shadowSourceRow >= 0 && shadowSourceColumn >= 0 && Boolean(matrix[shadowSourceRow]?.[shadowSourceColumn]);
251
+ if (hasForeground) {
252
+ appendCardPart(rowParts, ansi.clay, "\u2588\u2588");
253
+ } else if (hasShadow) {
254
+ appendCardPart(rowParts, ansi.shadow, "\u2591\u2591");
255
+ } else {
256
+ appendCardPart(rowParts, ansi.slate, " ");
257
+ }
258
+ }
259
+ return renderCardLineParts(rowParts);
260
+ });
261
+ }
262
+ function appendCardPart(parts, color, text) {
263
+ const previous = parts[parts.length - 1];
264
+ if (previous?.color === color) {
265
+ previous.text += text;
266
+ return;
267
+ }
268
+ parts.push({ color, text });
269
+ }
239
270
  function renderAsciiWordmark(word) {
271
+ const matrix = buildPixelWordmarkMatrix(word);
240
272
  const rows = [];
241
- for (let rowIndex = 0; rowIndex < 7; rowIndex += 1) {
242
- const row = word.split("").map((letter) => {
243
- const pattern = thorbitPixelLetters[letter];
244
- if (!pattern) return "";
245
- return pattern[rowIndex].replaceAll("1", "#").replaceAll("0", " ");
246
- }).join(" ");
247
- rows.push(row);
273
+ for (const matrixRow of matrix) {
274
+ rows.push(matrixRow.map((cell) => cell ? "#" : " ").join(""));
248
275
  }
249
276
  return rows;
250
277
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../bin/thorbit-kb-mcp-install.ts"],"sourcesContent":["import { realpathSync } from 'node:fs'\nimport { fileURLToPath } from 'node:url'\n\nexport type InstallOptions = {\n apiKey: string\n baseUrl?: string\n keyPath?: string\n serverName: string\n json: boolean\n color: boolean\n help: boolean\n}\n\nexport function readArg(name: string, argv = process.argv.slice(2)): string | undefined {\n const prefix = `--${name}=`\n const inline = argv.find(arg => arg.startsWith(prefix))\n if (inline) return inline.slice(prefix.length)\n const index = argv.indexOf(`--${name}`)\n return index >= 0 ? argv[index + 1] : undefined\n}\n\nexport function hasFlag(name: string, argv = process.argv.slice(2)): boolean {\n return argv.includes(`--${name}`)\n}\n\nexport function resolveInstallOptions(argv = process.argv.slice(2)): InstallOptions {\n return {\n apiKey: readArg('api-key', argv) ?? process.env.THORBIT_API_KEY ?? process.env.THORBIT_MCP_API_KEY ?? 'thbt_mcp_...',\n baseUrl: readArg('base-url', argv) ?? process.env.THORBIT_BASE_URL,\n keyPath: readArg('key-path', argv) ?? process.env.THORBIT_KB_MCP_KEY_PATH,\n serverName: readArg('server-name', argv) ?? 'thorbit-kb',\n json: hasFlag('json', argv),\n color: !hasFlag('no-color', argv),\n help: hasFlag('help', argv) || hasFlag('h', argv),\n }\n}\n\nexport function buildMcpConfig(options: InstallOptions) {\n const env: Record<string, string> = options.keyPath\n ? { THORBIT_KB_MCP_KEY_PATH: options.keyPath }\n : { THORBIT_API_KEY: options.apiKey }\n\n if (options.baseUrl) {\n env.THORBIT_BASE_URL = options.baseUrl.replace(/\\/$/, '')\n }\n\n return {\n mcpServers: {\n [options.serverName]: {\n command: 'npx',\n args: ['-y', 'thorbit-kb-mcp@latest'],\n env,\n },\n },\n }\n}\n\nconst ansi = {\n reset: '\\u001b[0m',\n bold: '\\u001b[1m',\n dim: '\\u001b[2m',\n terracotta: '\\u001b[38;2;198;90;54m',\n cardBg: '\\u001b[48;2;31;31;31m',\n cardBorder: '\\u001b[38;2;108;66;50m',\n clay: '\\u001b[38;2;226;138;92m',\n cream: '\\u001b[38;2;255;244;230m',\n green: '\\u001b[38;2;75;181;67m',\n slate: '\\u001b[38;2;174;181;195m',\n wire: '\\u001b[38;2;198;90;54m',\n}\n\nfunction paint(value: string, code: string, enabled: boolean): string {\n return enabled ? `${code}${value}${ansi.reset}` : value\n}\n\nexport function renderHelp(color: boolean): string {\n return [\n renderBanner(color),\n '',\n 'Usage:',\n ' npx -y -p thorbit-kb-mcp@latest thorbit-kb-mcp-install [options]',\n '',\n 'Options:',\n ' --api-key <key> Thorbit MCP API key from Settings -> MCPs.',\n ' --key-path <path> File containing the API key. Preferred for shared machines and servers.',\n ' --base-url <url> Thorbit app URL. Defaults to https://thorbit.ai.',\n ' --server-name <name> MCP client server name. Defaults to thorbit-kb.',\n ' --json Print only MCP client JSON.',\n ' --no-color Disable ANSI color.',\n ' --help Show this help.',\n '',\n ].join('\\n')\n}\n\nexport function renderBanner(color: boolean): string {\n return color ? renderReferenceCardBanner() : renderAsciiBanner()\n}\n\nconst cardWidth = 104\n\ntype CardTone = 'title' | 'mark' | 'wire' | 'caption' | 'blank'\n\nconst thorbitPixelLetters: Record<string, string[]> = {\n T: [\n '1111111',\n '0011000',\n '0011000',\n '0011000',\n '0011000',\n '0011000',\n '0011000',\n ],\n H: [\n '110011',\n '110011',\n '110011',\n '111111',\n '110011',\n '110011',\n '110011',\n ],\n O: [\n '011110',\n '110011',\n '110011',\n '110011',\n '110011',\n '110011',\n '011110',\n ],\n R: [\n '111110',\n '110011',\n '110011',\n '111110',\n '110110',\n '110011',\n '110011',\n ],\n B: [\n '111110',\n '110011',\n '110011',\n '111110',\n '110011',\n '110011',\n '111110',\n ],\n I: [\n '1111',\n '0110',\n '0110',\n '0110',\n '0110',\n '0110',\n '1111',\n ],\n}\n\nfunction renderReferenceCardBanner(): string {\n const heading = justifyCardContent(' Plain text', '⧉', cardWidth)\n const wordmarkRows = renderPixelWordmark('THORBIT')\n const wireRows = [\n ' ╭───────╮ ╭────╮ ╭──────╮ ╭────╮ ╭────╮ ╭─╮ ╭───────╮',\n ' ╰─╮ ╭─╯ ╭─╯ ╰─╮ │ ╭───╯ ╭─╯ ╰─╮ │ ╭──╯ ╭─╯ ╰─╮ ╰─╮ ╭─╯',\n ]\n\n return [\n `${ansi.cardBorder}╭${'─'.repeat(cardWidth + 2)}╮${ansi.reset}`,\n renderCardLine(heading, 'title'),\n renderCardLine('', 'blank'),\n ...wireRows.map(row => renderCardLine(row, 'wire')),\n ...wordmarkRows.map(row => renderCardLine(row, 'mark')),\n renderCardLine('', 'blank'),\n renderCardLine(' THORBIT KB MCP', 'caption'),\n `${ansi.cardBorder}╰${'─'.repeat(cardWidth + 2)}╯${ansi.reset}`,\n ].join('\\n')\n}\n\nfunction renderAsciiBanner(): string {\n const contentWidth = 96\n const border = `+${'-'.repeat(contentWidth + 2)}+`\n const cardLine = (content = '') => `| ${content.padEnd(contentWidth)} |`\n const title = 'Plain text'\n const copy = '[copy]'\n const lines = [\n border,\n cardLine(`${title}${' '.repeat(contentWidth - title.length - copy.length)}${copy}`),\n cardLine(),\n ...renderAsciiWordmark('THORBIT').map(line => cardLine(` ${line}`)),\n cardLine(),\n cardLine(' THORBIT KB MCP'),\n border,\n ]\n\n return lines.join('\\n')\n}\n\nfunction renderCardLine(content: string, tone: CardTone): string {\n const foreground = {\n title: ansi.cream,\n mark: ansi.clay,\n wire: ansi.wire,\n caption: ansi.terracotta,\n blank: ansi.slate,\n }[tone]\n const paddedContent = padCardContent(content, cardWidth)\n return [\n `${ansi.cardBorder}│${ansi.reset}`,\n ansi.cardBg,\n foreground,\n ` ${paddedContent} `,\n ansi.reset,\n `${ansi.cardBorder}│${ansi.reset}`,\n ].join('')\n}\n\nfunction justifyCardContent(left: string, right: string, width: number): string {\n return `${left}${' '.repeat(Math.max(1, width - left.length - right.length))}${right}`\n}\n\nfunction padCardContent(content: string, width: number): string {\n if (content.length >= width) return content.slice(0, width)\n return content.padEnd(width)\n}\n\nfunction renderPixelWordmark(word: string): string[] {\n const rows: string[] = []\n for (let rowIndex = 0; rowIndex < 7; rowIndex += 1) {\n const row = word.split('').map(letter => {\n const pattern = thorbitPixelLetters[letter]\n if (!pattern) return ''\n return pattern[rowIndex].split('').map(cell => (cell === '1' ? '██' : ' ')).join('')\n }).join(' ')\n rows.push(` ${row}`)\n }\n return rows\n}\n\nfunction renderAsciiWordmark(word: string): string[] {\n const rows: string[] = []\n for (let rowIndex = 0; rowIndex < 7; rowIndex += 1) {\n const row = word.split('').map(letter => {\n const pattern = thorbitPixelLetters[letter]\n if (!pattern) return ''\n return pattern[rowIndex].replaceAll('1', '#').replaceAll('0', ' ')\n }).join(' ')\n rows.push(row)\n }\n return rows\n}\n\nexport function renderInstallInstructions(options: InstallOptions): string {\n const color = options.color\n const config = buildMcpConfig(options)\n const json = JSON.stringify(config, null, 2)\n const keySetup = options.keyPath\n ? [\n paint('Key file mode', ansi.terracotta, color),\n ` chmod 600 ${options.keyPath}`,\n ].join('\\n')\n : [\n paint('Safer key-file option', ansi.terracotta, color),\n \" mkdir -p ~/.config/thorbit\",\n \" printf '%s\\\\n' 'thbt_mcp_...' > ~/.config/thorbit/kb-mcp-key\",\n ' chmod 600 ~/.config/thorbit/kb-mcp-key',\n '',\n ' Then run:',\n ' npx -y -p thorbit-kb-mcp@latest thorbit-kb-mcp-install --key-path ~/.config/thorbit/kb-mcp-key',\n ].join('\\n')\n\n return [\n renderBanner(color),\n paint('Vector-backed knowledge bases for MCP agents.', ansi.slate, color),\n '',\n `${paint('1.', ansi.terracotta, color)} Generate an API key in Thorbit Settings -> MCPs.`,\n `${paint('2.', ansi.terracotta, color)} Add this server config to your MCP client:`,\n '',\n json,\n '',\n `${paint('3.', ansi.terracotta, color)} Restart your MCP client, then call ${paint('thorbit_kb_list', ansi.green, color)} or ${paint('thorbit_kb_create', ansi.green, color)}.`,\n '',\n keySetup,\n '',\n paint('Tools', ansi.terracotta, color),\n ' thorbit_kb_create Create a vector-backed Thorbit KB.',\n ' thorbit_kb_ingest_url Extract a URL through MCP Scraper and ingest it.',\n ' thorbit_kb_ingest_site Map/extract a site through MCP Scraper and ingest pages.',\n ' thorbit_kb_ingest_youtube Transcribe YouTube through MCP Scraper and ingest chunks.',\n ' thorbit_kb_search Smart RAG search with citations.',\n ' thorbit_kb_ask Grounded answers with citations and strategy metadata.',\n '',\n paint('Raw JSON:', ansi.slate, color),\n ' npx -y -p thorbit-kb-mcp@latest thorbit-kb-mcp-install --json --api-key thbt_mcp_...',\n '',\n ].join('\\n')\n}\n\nexport function main(): void {\n const options = resolveInstallOptions()\n if (options.help) {\n process.stdout.write(renderHelp(options.color))\n return\n }\n\n if (options.json) {\n process.stdout.write(`${JSON.stringify(buildMcpConfig(options), null, 2)}\\n`)\n return\n }\n\n process.stdout.write(renderInstallInstructions(options))\n}\n\nfunction isMainModule(): boolean {\n const entry = process.argv[1]\n if (!entry) return false\n try {\n return realpathSync(entry) === realpathSync(fileURLToPath(import.meta.url))\n } catch {\n return false\n }\n}\n\nif (isMainModule()) main()\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../bin/thorbit-kb-mcp-install.ts"],"sourcesContent":["import { realpathSync } from 'node:fs'\nimport { fileURLToPath } from 'node:url'\n\nexport type InstallOptions = {\n apiKey: string\n baseUrl?: string\n keyPath?: string\n serverName: string\n json: boolean\n color: boolean\n help: boolean\n}\n\nexport function readArg(name: string, argv = process.argv.slice(2)): string | undefined {\n const prefix = `--${name}=`\n const inline = argv.find(arg => arg.startsWith(prefix))\n if (inline) return inline.slice(prefix.length)\n const index = argv.indexOf(`--${name}`)\n return index >= 0 ? argv[index + 1] : undefined\n}\n\nexport function hasFlag(name: string, argv = process.argv.slice(2)): boolean {\n return argv.includes(`--${name}`)\n}\n\nexport function resolveInstallOptions(argv = process.argv.slice(2)): InstallOptions {\n return {\n apiKey: readArg('api-key', argv) ?? process.env.THORBIT_API_KEY ?? process.env.THORBIT_MCP_API_KEY ?? 'thbt_mcp_...',\n baseUrl: readArg('base-url', argv) ?? process.env.THORBIT_BASE_URL,\n keyPath: readArg('key-path', argv) ?? process.env.THORBIT_KB_MCP_KEY_PATH,\n serverName: readArg('server-name', argv) ?? 'thorbit-kb',\n json: hasFlag('json', argv),\n color: !hasFlag('no-color', argv),\n help: hasFlag('help', argv) || hasFlag('h', argv),\n }\n}\n\nexport function buildMcpConfig(options: InstallOptions) {\n const env: Record<string, string> = options.keyPath\n ? { THORBIT_KB_MCP_KEY_PATH: options.keyPath }\n : { THORBIT_API_KEY: options.apiKey }\n\n if (options.baseUrl) {\n env.THORBIT_BASE_URL = options.baseUrl.replace(/\\/$/, '')\n }\n\n return {\n mcpServers: {\n [options.serverName]: {\n command: 'npx',\n args: ['-y', 'thorbit-kb-mcp@latest'],\n env,\n },\n },\n }\n}\n\nconst ansi = {\n reset: '\\u001b[0m',\n bold: '\\u001b[1m',\n dim: '\\u001b[2m',\n terracotta: '\\u001b[38;2;198;90;54m',\n cardBg: '\\u001b[48;2;31;31;31m',\n cardBorder: '\\u001b[38;2;108;66;50m',\n clay: '\\u001b[38;2;226;138;92m',\n cream: '\\u001b[38;2;255;244;230m',\n green: '\\u001b[38;2;75;181;67m',\n shadow: '\\u001b[38;2;116;70;56m',\n slate: '\\u001b[38;2;174;181;195m',\n wire: '\\u001b[38;2;198;90;54m',\n}\n\nfunction paint(value: string, code: string, enabled: boolean): string {\n return enabled ? `${code}${value}${ansi.reset}` : value\n}\n\nexport function renderHelp(color: boolean): string {\n return [\n renderBanner(color),\n '',\n 'Usage:',\n ' npx -y -p thorbit-kb-mcp@latest thorbit-kb-mcp-install [options]',\n '',\n 'Options:',\n ' --api-key <key> Thorbit MCP API key from Settings -> MCPs.',\n ' --key-path <path> File containing the API key. Preferred for shared machines and servers.',\n ' --base-url <url> Thorbit app URL. Defaults to https://thorbit.ai.',\n ' --server-name <name> MCP client server name. Defaults to thorbit-kb.',\n ' --json Print only MCP client JSON.',\n ' --no-color Disable ANSI color.',\n ' --help Show this help.',\n '',\n ].join('\\n')\n}\n\nexport function renderBanner(color: boolean): string {\n return color ? renderReferenceCardBanner() : renderAsciiBanner()\n}\n\nconst cardWidth = 104\n\ntype CardTone = 'title' | 'mark' | 'wire' | 'caption' | 'blank'\ntype CardPart = {\n color: string\n text: string\n}\n\nconst thorbitPixelLetters: Record<string, string[]> = {\n T: [\n '1111111',\n '0011000',\n '0011000',\n '0011000',\n '0011000',\n '0011000',\n '0011000',\n ],\n H: [\n '110011',\n '110011',\n '110011',\n '111111',\n '110011',\n '110011',\n '110011',\n ],\n O: [\n '011110',\n '110011',\n '110011',\n '110011',\n '110011',\n '110011',\n '011110',\n ],\n R: [\n '111110',\n '110011',\n '110011',\n '111110',\n '110110',\n '110011',\n '110011',\n ],\n B: [\n '111110',\n '110011',\n '110011',\n '111110',\n '110011',\n '110011',\n '111110',\n ],\n I: [\n '1111',\n '0110',\n '0110',\n '0110',\n '0110',\n '0110',\n '1111',\n ],\n}\n\nfunction renderReferenceCardBanner(): string {\n const heading = justifyCardContent(' Plain text', '⧉', cardWidth)\n\n return [\n `${ansi.cardBorder}╭${'─'.repeat(cardWidth + 2)}╮${ansi.reset}`,\n renderCardLine(heading, 'title'),\n renderCardLine('', 'blank'),\n ...renderLayeredPixelWordmarkCardLines('THORBIT'),\n renderCardLine('', 'blank'),\n renderCardLine(' THORBIT KB MCP', 'caption'),\n `${ansi.cardBorder}╰${'─'.repeat(cardWidth + 2)}╯${ansi.reset}`,\n ].join('\\n')\n}\n\nfunction renderAsciiBanner(): string {\n const contentWidth = 96\n const border = `+${'-'.repeat(contentWidth + 2)}+`\n const cardLine = (content = '') => `| ${content.padEnd(contentWidth)} |`\n const title = 'Plain text'\n const copy = '[copy]'\n const lines = [\n border,\n cardLine(`${title}${' '.repeat(contentWidth - title.length - copy.length)}${copy}`),\n cardLine(),\n ...renderAsciiWordmark('THORBIT').map(line => cardLine(` ${line}`)),\n cardLine(),\n cardLine(' THORBIT KB MCP'),\n border,\n ]\n\n return lines.join('\\n')\n}\n\nfunction renderCardLine(content: string, tone: CardTone): string {\n const foreground = {\n title: ansi.cream,\n mark: ansi.clay,\n wire: ansi.wire,\n caption: ansi.terracotta,\n blank: ansi.slate,\n }[tone]\n return renderCardLineParts([{ color: foreground, text: content }])\n}\n\nfunction renderCardLineParts(parts: CardPart[]): string {\n const visibleWidth = parts.reduce((width, part) => width + part.text.length, 0)\n const padding = ' '.repeat(Math.max(0, cardWidth - visibleWidth))\n return [\n `${ansi.cardBorder}│${ansi.reset}`,\n ansi.cardBg,\n ' ',\n ...parts.map(part => `${part.color}${part.text}`),\n padding,\n ' ',\n ansi.reset,\n `${ansi.cardBorder}│${ansi.reset}`,\n ].join('')\n}\n\nfunction justifyCardContent(left: string, right: string, width: number): string {\n return `${left}${' '.repeat(Math.max(1, width - left.length - right.length))}${right}`\n}\n\nfunction padCardContent(content: string, width: number): string {\n if (content.length >= width) return content.slice(0, width)\n return content.padEnd(width)\n}\n\nfunction buildPixelWordmarkMatrix(word: string): boolean[][] {\n const rows: boolean[][] = Array.from({ length: 7 }, () => [])\n for (let rowIndex = 0; rowIndex < 7; rowIndex += 1) {\n word.split('').forEach((letter, letterIndex) => {\n const pattern = thorbitPixelLetters[letter]\n if (!pattern) return\n if (letterIndex > 0) rows[rowIndex].push(false)\n rows[rowIndex].push(...pattern[rowIndex].split('').map(cell => cell === '1'))\n })\n }\n return rows\n}\n\nfunction renderLayeredPixelWordmarkCardLines(word: string): string[] {\n const matrix = buildPixelWordmarkMatrix(word)\n const wordmarkWidth = Math.max(...matrix.map(row => row.length))\n const shadowOffsetX = 1\n const shadowOffsetY = -1\n const outputRows = matrix.length + Math.abs(Math.min(0, shadowOffsetY))\n const outputWidth = wordmarkWidth + shadowOffsetX\n\n return Array.from({ length: outputRows }, (_, outputRowIndex) => {\n const rowParts: CardPart[] = [{ color: ansi.slate, text: ' ' }]\n\n for (let columnIndex = 0; columnIndex < outputWidth; columnIndex += 1) {\n const foregroundRow = outputRowIndex - Math.abs(Math.min(0, shadowOffsetY))\n const hasForeground = foregroundRow >= 0 && Boolean(matrix[foregroundRow]?.[columnIndex])\n const shadowSourceRow = outputRowIndex - shadowOffsetY - Math.abs(Math.min(0, shadowOffsetY))\n const shadowSourceColumn = columnIndex - shadowOffsetX\n const hasShadow = shadowSourceRow >= 0 && shadowSourceColumn >= 0\n && Boolean(matrix[shadowSourceRow]?.[shadowSourceColumn])\n\n if (hasForeground) {\n appendCardPart(rowParts, ansi.clay, '██')\n } else if (hasShadow) {\n appendCardPart(rowParts, ansi.shadow, '░░')\n } else {\n appendCardPart(rowParts, ansi.slate, ' ')\n }\n }\n\n return renderCardLineParts(rowParts)\n })\n}\n\nfunction appendCardPart(parts: CardPart[], color: string, text: string): void {\n const previous = parts[parts.length - 1]\n if (previous?.color === color) {\n previous.text += text\n return\n }\n parts.push({ color, text })\n}\n\nfunction renderAsciiWordmark(word: string): string[] {\n const matrix = buildPixelWordmarkMatrix(word)\n const rows: string[] = []\n for (const matrixRow of matrix) {\n rows.push(matrixRow.map(cell => (cell ? '#' : ' ')).join(''))\n }\n return rows\n}\n\nexport function renderInstallInstructions(options: InstallOptions): string {\n const color = options.color\n const config = buildMcpConfig(options)\n const json = JSON.stringify(config, null, 2)\n const keySetup = options.keyPath\n ? [\n paint('Key file mode', ansi.terracotta, color),\n ` chmod 600 ${options.keyPath}`,\n ].join('\\n')\n : [\n paint('Safer key-file option', ansi.terracotta, color),\n \" mkdir -p ~/.config/thorbit\",\n \" printf '%s\\\\n' 'thbt_mcp_...' > ~/.config/thorbit/kb-mcp-key\",\n ' chmod 600 ~/.config/thorbit/kb-mcp-key',\n '',\n ' Then run:',\n ' npx -y -p thorbit-kb-mcp@latest thorbit-kb-mcp-install --key-path ~/.config/thorbit/kb-mcp-key',\n ].join('\\n')\n\n return [\n renderBanner(color),\n paint('Vector-backed knowledge bases for MCP agents.', ansi.slate, color),\n '',\n `${paint('1.', ansi.terracotta, color)} Generate an API key in Thorbit Settings -> MCPs.`,\n `${paint('2.', ansi.terracotta, color)} Add this server config to your MCP client:`,\n '',\n json,\n '',\n `${paint('3.', ansi.terracotta, color)} Restart your MCP client, then call ${paint('thorbit_kb_list', ansi.green, color)} or ${paint('thorbit_kb_create', ansi.green, color)}.`,\n '',\n keySetup,\n '',\n paint('Tools', ansi.terracotta, color),\n ' thorbit_kb_create Create a vector-backed Thorbit KB.',\n ' thorbit_kb_ingest_url Extract a URL through MCP Scraper and ingest it.',\n ' thorbit_kb_ingest_site Map/extract a site through MCP Scraper and ingest pages.',\n ' thorbit_kb_ingest_youtube Transcribe YouTube through MCP Scraper and ingest chunks.',\n ' thorbit_kb_search Smart RAG search with citations.',\n ' thorbit_kb_ask Grounded answers with citations and strategy metadata.',\n '',\n paint('Raw JSON:', ansi.slate, color),\n ' npx -y -p thorbit-kb-mcp@latest thorbit-kb-mcp-install --json --api-key thbt_mcp_...',\n '',\n ].join('\\n')\n}\n\nexport function main(): void {\n const options = resolveInstallOptions()\n if (options.help) {\n process.stdout.write(renderHelp(options.color))\n return\n }\n\n if (options.json) {\n process.stdout.write(`${JSON.stringify(buildMcpConfig(options), null, 2)}\\n`)\n return\n }\n\n process.stdout.write(renderInstallInstructions(options))\n}\n\nfunction isMainModule(): boolean {\n const entry = process.argv[1]\n if (!entry) return false\n try {\n return realpathSync(entry) === realpathSync(fileURLToPath(import.meta.url))\n } catch {\n return false\n }\n}\n\nif (isMainModule()) main()\n"],"mappings":"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","names":[]}
@@ -49,6 +49,7 @@ var ansi = {
49
49
  clay: "\x1B[38;2;226;138;92m",
50
50
  cream: "\x1B[38;2;255;244;230m",
51
51
  green: "\x1B[38;2;75;181;67m",
52
+ shadow: "\x1B[38;2;116;70;56m",
52
53
  slate: "\x1B[38;2;174;181;195m",
53
54
  wire: "\x1B[38;2;198;90;54m"
54
55
  };
@@ -135,17 +136,11 @@ var thorbitPixelLetters = {
135
136
  };
136
137
  function renderReferenceCardBanner() {
137
138
  const heading = justifyCardContent(" Plain text", "\u29C9", cardWidth);
138
- const wordmarkRows = renderPixelWordmark("THORBIT");
139
- const wireRows = [
140
- " \u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E \u256D\u2500\u2500\u2500\u2500\u256E \u256D\u2500\u2500\u2500\u2500\u2500\u2500\u256E \u256D\u2500\u2500\u2500\u2500\u256E \u256D\u2500\u2500\u2500\u2500\u256E \u256D\u2500\u256E \u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E",
141
- " \u2570\u2500\u256E \u256D\u2500\u256F \u256D\u2500\u256F \u2570\u2500\u256E \u2502 \u256D\u2500\u2500\u2500\u256F \u256D\u2500\u256F \u2570\u2500\u256E \u2502 \u256D\u2500\u2500\u256F \u256D\u2500\u256F \u2570\u2500\u256E \u2570\u2500\u256E \u256D\u2500\u256F"
142
- ];
143
139
  return [
144
140
  `${ansi.cardBorder}\u256D${"\u2500".repeat(cardWidth + 2)}\u256E${ansi.reset}`,
145
141
  renderCardLine(heading, "title"),
146
142
  renderCardLine("", "blank"),
147
- ...wireRows.map((row) => renderCardLine(row, "wire")),
148
- ...wordmarkRows.map((row) => renderCardLine(row, "mark")),
143
+ ...renderLayeredPixelWordmarkCardLines("THORBIT"),
149
144
  renderCardLine("", "blank"),
150
145
  renderCardLine(" THORBIT KB MCP", "caption"),
151
146
  `${ansi.cardBorder}\u2570${"\u2500".repeat(cardWidth + 2)}\u256F${ansi.reset}`
@@ -176,12 +171,18 @@ function renderCardLine(content, tone) {
176
171
  caption: ansi.terracotta,
177
172
  blank: ansi.slate
178
173
  }[tone];
179
- const paddedContent = padCardContent(content, cardWidth);
174
+ return renderCardLineParts([{ color: foreground, text: content }]);
175
+ }
176
+ function renderCardLineParts(parts) {
177
+ const visibleWidth = parts.reduce((width, part) => width + part.text.length, 0);
178
+ const padding = " ".repeat(Math.max(0, cardWidth - visibleWidth));
180
179
  return [
181
180
  `${ansi.cardBorder}\u2502${ansi.reset}`,
182
181
  ansi.cardBg,
183
- foreground,
184
- ` ${paddedContent} `,
182
+ " ",
183
+ ...parts.map((part) => `${part.color}${part.text}`),
184
+ padding,
185
+ " ",
185
186
  ansi.reset,
186
187
  `${ansi.cardBorder}\u2502${ansi.reset}`
187
188
  ].join("");
@@ -189,31 +190,57 @@ function renderCardLine(content, tone) {
189
190
  function justifyCardContent(left, right, width) {
190
191
  return `${left}${" ".repeat(Math.max(1, width - left.length - right.length))}${right}`;
191
192
  }
192
- function padCardContent(content, width) {
193
- if (content.length >= width) return content.slice(0, width);
194
- return content.padEnd(width);
195
- }
196
- function renderPixelWordmark(word) {
197
- const rows = [];
193
+ function buildPixelWordmarkMatrix(word) {
194
+ const rows = Array.from({ length: 7 }, () => []);
198
195
  for (let rowIndex = 0; rowIndex < 7; rowIndex += 1) {
199
- const row = word.split("").map((letter) => {
196
+ word.split("").forEach((letter, letterIndex) => {
200
197
  const pattern = thorbitPixelLetters[letter];
201
- if (!pattern) return "";
202
- return pattern[rowIndex].split("").map((cell) => cell === "1" ? "\u2588\u2588" : " ").join("");
203
- }).join(" ");
204
- rows.push(` ${row}`);
198
+ if (!pattern) return;
199
+ if (letterIndex > 0) rows[rowIndex].push(false);
200
+ rows[rowIndex].push(...pattern[rowIndex].split("").map((cell) => cell === "1"));
201
+ });
205
202
  }
206
203
  return rows;
207
204
  }
205
+ function renderLayeredPixelWordmarkCardLines(word) {
206
+ const matrix = buildPixelWordmarkMatrix(word);
207
+ const wordmarkWidth = Math.max(...matrix.map((row) => row.length));
208
+ const shadowOffsetX = 1;
209
+ const shadowOffsetY = -1;
210
+ const outputRows = matrix.length + Math.abs(Math.min(0, shadowOffsetY));
211
+ const outputWidth = wordmarkWidth + shadowOffsetX;
212
+ return Array.from({ length: outputRows }, (_, outputRowIndex) => {
213
+ const rowParts = [{ color: ansi.slate, text: " " }];
214
+ for (let columnIndex = 0; columnIndex < outputWidth; columnIndex += 1) {
215
+ const foregroundRow = outputRowIndex - Math.abs(Math.min(0, shadowOffsetY));
216
+ const hasForeground = foregroundRow >= 0 && Boolean(matrix[foregroundRow]?.[columnIndex]);
217
+ const shadowSourceRow = outputRowIndex - shadowOffsetY - Math.abs(Math.min(0, shadowOffsetY));
218
+ const shadowSourceColumn = columnIndex - shadowOffsetX;
219
+ const hasShadow = shadowSourceRow >= 0 && shadowSourceColumn >= 0 && Boolean(matrix[shadowSourceRow]?.[shadowSourceColumn]);
220
+ if (hasForeground) {
221
+ appendCardPart(rowParts, ansi.clay, "\u2588\u2588");
222
+ } else if (hasShadow) {
223
+ appendCardPart(rowParts, ansi.shadow, "\u2591\u2591");
224
+ } else {
225
+ appendCardPart(rowParts, ansi.slate, " ");
226
+ }
227
+ }
228
+ return renderCardLineParts(rowParts);
229
+ });
230
+ }
231
+ function appendCardPart(parts, color, text) {
232
+ const previous = parts[parts.length - 1];
233
+ if (previous?.color === color) {
234
+ previous.text += text;
235
+ return;
236
+ }
237
+ parts.push({ color, text });
238
+ }
208
239
  function renderAsciiWordmark(word) {
240
+ const matrix = buildPixelWordmarkMatrix(word);
209
241
  const rows = [];
210
- for (let rowIndex = 0; rowIndex < 7; rowIndex += 1) {
211
- const row = word.split("").map((letter) => {
212
- const pattern = thorbitPixelLetters[letter];
213
- if (!pattern) return "";
214
- return pattern[rowIndex].replaceAll("1", "#").replaceAll("0", " ");
215
- }).join(" ");
216
- rows.push(row);
242
+ for (const matrixRow of matrix) {
243
+ rows.push(matrixRow.map((cell) => cell ? "#" : " ").join(""));
217
244
  }
218
245
  return rows;
219
246
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../bin/thorbit-kb-mcp-install.ts"],"sourcesContent":["import { realpathSync } from 'node:fs'\nimport { fileURLToPath } from 'node:url'\n\nexport type InstallOptions = {\n apiKey: string\n baseUrl?: string\n keyPath?: string\n serverName: string\n json: boolean\n color: boolean\n help: boolean\n}\n\nexport function readArg(name: string, argv = process.argv.slice(2)): string | undefined {\n const prefix = `--${name}=`\n const inline = argv.find(arg => arg.startsWith(prefix))\n if (inline) return inline.slice(prefix.length)\n const index = argv.indexOf(`--${name}`)\n return index >= 0 ? argv[index + 1] : undefined\n}\n\nexport function hasFlag(name: string, argv = process.argv.slice(2)): boolean {\n return argv.includes(`--${name}`)\n}\n\nexport function resolveInstallOptions(argv = process.argv.slice(2)): InstallOptions {\n return {\n apiKey: readArg('api-key', argv) ?? process.env.THORBIT_API_KEY ?? process.env.THORBIT_MCP_API_KEY ?? 'thbt_mcp_...',\n baseUrl: readArg('base-url', argv) ?? process.env.THORBIT_BASE_URL,\n keyPath: readArg('key-path', argv) ?? process.env.THORBIT_KB_MCP_KEY_PATH,\n serverName: readArg('server-name', argv) ?? 'thorbit-kb',\n json: hasFlag('json', argv),\n color: !hasFlag('no-color', argv),\n help: hasFlag('help', argv) || hasFlag('h', argv),\n }\n}\n\nexport function buildMcpConfig(options: InstallOptions) {\n const env: Record<string, string> = options.keyPath\n ? { THORBIT_KB_MCP_KEY_PATH: options.keyPath }\n : { THORBIT_API_KEY: options.apiKey }\n\n if (options.baseUrl) {\n env.THORBIT_BASE_URL = options.baseUrl.replace(/\\/$/, '')\n }\n\n return {\n mcpServers: {\n [options.serverName]: {\n command: 'npx',\n args: ['-y', 'thorbit-kb-mcp@latest'],\n env,\n },\n },\n }\n}\n\nconst ansi = {\n reset: '\\u001b[0m',\n bold: '\\u001b[1m',\n dim: '\\u001b[2m',\n terracotta: '\\u001b[38;2;198;90;54m',\n cardBg: '\\u001b[48;2;31;31;31m',\n cardBorder: '\\u001b[38;2;108;66;50m',\n clay: '\\u001b[38;2;226;138;92m',\n cream: '\\u001b[38;2;255;244;230m',\n green: '\\u001b[38;2;75;181;67m',\n slate: '\\u001b[38;2;174;181;195m',\n wire: '\\u001b[38;2;198;90;54m',\n}\n\nfunction paint(value: string, code: string, enabled: boolean): string {\n return enabled ? `${code}${value}${ansi.reset}` : value\n}\n\nexport function renderHelp(color: boolean): string {\n return [\n renderBanner(color),\n '',\n 'Usage:',\n ' npx -y -p thorbit-kb-mcp@latest thorbit-kb-mcp-install [options]',\n '',\n 'Options:',\n ' --api-key <key> Thorbit MCP API key from Settings -> MCPs.',\n ' --key-path <path> File containing the API key. Preferred for shared machines and servers.',\n ' --base-url <url> Thorbit app URL. Defaults to https://thorbit.ai.',\n ' --server-name <name> MCP client server name. Defaults to thorbit-kb.',\n ' --json Print only MCP client JSON.',\n ' --no-color Disable ANSI color.',\n ' --help Show this help.',\n '',\n ].join('\\n')\n}\n\nexport function renderBanner(color: boolean): string {\n return color ? renderReferenceCardBanner() : renderAsciiBanner()\n}\n\nconst cardWidth = 104\n\ntype CardTone = 'title' | 'mark' | 'wire' | 'caption' | 'blank'\n\nconst thorbitPixelLetters: Record<string, string[]> = {\n T: [\n '1111111',\n '0011000',\n '0011000',\n '0011000',\n '0011000',\n '0011000',\n '0011000',\n ],\n H: [\n '110011',\n '110011',\n '110011',\n '111111',\n '110011',\n '110011',\n '110011',\n ],\n O: [\n '011110',\n '110011',\n '110011',\n '110011',\n '110011',\n '110011',\n '011110',\n ],\n R: [\n '111110',\n '110011',\n '110011',\n '111110',\n '110110',\n '110011',\n '110011',\n ],\n B: [\n '111110',\n '110011',\n '110011',\n '111110',\n '110011',\n '110011',\n '111110',\n ],\n I: [\n '1111',\n '0110',\n '0110',\n '0110',\n '0110',\n '0110',\n '1111',\n ],\n}\n\nfunction renderReferenceCardBanner(): string {\n const heading = justifyCardContent(' Plain text', '⧉', cardWidth)\n const wordmarkRows = renderPixelWordmark('THORBIT')\n const wireRows = [\n ' ╭───────╮ ╭────╮ ╭──────╮ ╭────╮ ╭────╮ ╭─╮ ╭───────╮',\n ' ╰─╮ ╭─╯ ╭─╯ ╰─╮ │ ╭───╯ ╭─╯ ╰─╮ │ ╭──╯ ╭─╯ ╰─╮ ╰─╮ ╭─╯',\n ]\n\n return [\n `${ansi.cardBorder}╭${'─'.repeat(cardWidth + 2)}╮${ansi.reset}`,\n renderCardLine(heading, 'title'),\n renderCardLine('', 'blank'),\n ...wireRows.map(row => renderCardLine(row, 'wire')),\n ...wordmarkRows.map(row => renderCardLine(row, 'mark')),\n renderCardLine('', 'blank'),\n renderCardLine(' THORBIT KB MCP', 'caption'),\n `${ansi.cardBorder}╰${'─'.repeat(cardWidth + 2)}╯${ansi.reset}`,\n ].join('\\n')\n}\n\nfunction renderAsciiBanner(): string {\n const contentWidth = 96\n const border = `+${'-'.repeat(contentWidth + 2)}+`\n const cardLine = (content = '') => `| ${content.padEnd(contentWidth)} |`\n const title = 'Plain text'\n const copy = '[copy]'\n const lines = [\n border,\n cardLine(`${title}${' '.repeat(contentWidth - title.length - copy.length)}${copy}`),\n cardLine(),\n ...renderAsciiWordmark('THORBIT').map(line => cardLine(` ${line}`)),\n cardLine(),\n cardLine(' THORBIT KB MCP'),\n border,\n ]\n\n return lines.join('\\n')\n}\n\nfunction renderCardLine(content: string, tone: CardTone): string {\n const foreground = {\n title: ansi.cream,\n mark: ansi.clay,\n wire: ansi.wire,\n caption: ansi.terracotta,\n blank: ansi.slate,\n }[tone]\n const paddedContent = padCardContent(content, cardWidth)\n return [\n `${ansi.cardBorder}│${ansi.reset}`,\n ansi.cardBg,\n foreground,\n ` ${paddedContent} `,\n ansi.reset,\n `${ansi.cardBorder}│${ansi.reset}`,\n ].join('')\n}\n\nfunction justifyCardContent(left: string, right: string, width: number): string {\n return `${left}${' '.repeat(Math.max(1, width - left.length - right.length))}${right}`\n}\n\nfunction padCardContent(content: string, width: number): string {\n if (content.length >= width) return content.slice(0, width)\n return content.padEnd(width)\n}\n\nfunction renderPixelWordmark(word: string): string[] {\n const rows: string[] = []\n for (let rowIndex = 0; rowIndex < 7; rowIndex += 1) {\n const row = word.split('').map(letter => {\n const pattern = thorbitPixelLetters[letter]\n if (!pattern) return ''\n return pattern[rowIndex].split('').map(cell => (cell === '1' ? '██' : ' ')).join('')\n }).join(' ')\n rows.push(` ${row}`)\n }\n return rows\n}\n\nfunction renderAsciiWordmark(word: string): string[] {\n const rows: string[] = []\n for (let rowIndex = 0; rowIndex < 7; rowIndex += 1) {\n const row = word.split('').map(letter => {\n const pattern = thorbitPixelLetters[letter]\n if (!pattern) return ''\n return pattern[rowIndex].replaceAll('1', '#').replaceAll('0', ' ')\n }).join(' ')\n rows.push(row)\n }\n return rows\n}\n\nexport function renderInstallInstructions(options: InstallOptions): string {\n const color = options.color\n const config = buildMcpConfig(options)\n const json = JSON.stringify(config, null, 2)\n const keySetup = options.keyPath\n ? [\n paint('Key file mode', ansi.terracotta, color),\n ` chmod 600 ${options.keyPath}`,\n ].join('\\n')\n : [\n paint('Safer key-file option', ansi.terracotta, color),\n \" mkdir -p ~/.config/thorbit\",\n \" printf '%s\\\\n' 'thbt_mcp_...' > ~/.config/thorbit/kb-mcp-key\",\n ' chmod 600 ~/.config/thorbit/kb-mcp-key',\n '',\n ' Then run:',\n ' npx -y -p thorbit-kb-mcp@latest thorbit-kb-mcp-install --key-path ~/.config/thorbit/kb-mcp-key',\n ].join('\\n')\n\n return [\n renderBanner(color),\n paint('Vector-backed knowledge bases for MCP agents.', ansi.slate, color),\n '',\n `${paint('1.', ansi.terracotta, color)} Generate an API key in Thorbit Settings -> MCPs.`,\n `${paint('2.', ansi.terracotta, color)} Add this server config to your MCP client:`,\n '',\n json,\n '',\n `${paint('3.', ansi.terracotta, color)} Restart your MCP client, then call ${paint('thorbit_kb_list', ansi.green, color)} or ${paint('thorbit_kb_create', ansi.green, color)}.`,\n '',\n keySetup,\n '',\n paint('Tools', ansi.terracotta, color),\n ' thorbit_kb_create Create a vector-backed Thorbit KB.',\n ' thorbit_kb_ingest_url Extract a URL through MCP Scraper and ingest it.',\n ' thorbit_kb_ingest_site Map/extract a site through MCP Scraper and ingest pages.',\n ' thorbit_kb_ingest_youtube Transcribe YouTube through MCP Scraper and ingest chunks.',\n ' thorbit_kb_search Smart RAG search with citations.',\n ' thorbit_kb_ask Grounded answers with citations and strategy metadata.',\n '',\n paint('Raw JSON:', ansi.slate, color),\n ' npx -y -p thorbit-kb-mcp@latest thorbit-kb-mcp-install --json --api-key thbt_mcp_...',\n '',\n ].join('\\n')\n}\n\nexport function main(): void {\n const options = resolveInstallOptions()\n if (options.help) {\n process.stdout.write(renderHelp(options.color))\n return\n }\n\n if (options.json) {\n process.stdout.write(`${JSON.stringify(buildMcpConfig(options), null, 2)}\\n`)\n return\n }\n\n process.stdout.write(renderInstallInstructions(options))\n}\n\nfunction isMainModule(): boolean {\n const entry = process.argv[1]\n if (!entry) return false\n try {\n return realpathSync(entry) === realpathSync(fileURLToPath(import.meta.url))\n } catch {\n return false\n }\n}\n\nif (isMainModule()) main()\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../bin/thorbit-kb-mcp-install.ts"],"sourcesContent":["import { realpathSync } from 'node:fs'\nimport { fileURLToPath } from 'node:url'\n\nexport type InstallOptions = {\n apiKey: string\n baseUrl?: string\n keyPath?: string\n serverName: string\n json: boolean\n color: boolean\n help: boolean\n}\n\nexport function readArg(name: string, argv = process.argv.slice(2)): string | undefined {\n const prefix = `--${name}=`\n const inline = argv.find(arg => arg.startsWith(prefix))\n if (inline) return inline.slice(prefix.length)\n const index = argv.indexOf(`--${name}`)\n return index >= 0 ? argv[index + 1] : undefined\n}\n\nexport function hasFlag(name: string, argv = process.argv.slice(2)): boolean {\n return argv.includes(`--${name}`)\n}\n\nexport function resolveInstallOptions(argv = process.argv.slice(2)): InstallOptions {\n return {\n apiKey: readArg('api-key', argv) ?? process.env.THORBIT_API_KEY ?? process.env.THORBIT_MCP_API_KEY ?? 'thbt_mcp_...',\n baseUrl: readArg('base-url', argv) ?? process.env.THORBIT_BASE_URL,\n keyPath: readArg('key-path', argv) ?? process.env.THORBIT_KB_MCP_KEY_PATH,\n serverName: readArg('server-name', argv) ?? 'thorbit-kb',\n json: hasFlag('json', argv),\n color: !hasFlag('no-color', argv),\n help: hasFlag('help', argv) || hasFlag('h', argv),\n }\n}\n\nexport function buildMcpConfig(options: InstallOptions) {\n const env: Record<string, string> = options.keyPath\n ? { THORBIT_KB_MCP_KEY_PATH: options.keyPath }\n : { THORBIT_API_KEY: options.apiKey }\n\n if (options.baseUrl) {\n env.THORBIT_BASE_URL = options.baseUrl.replace(/\\/$/, '')\n }\n\n return {\n mcpServers: {\n [options.serverName]: {\n command: 'npx',\n args: ['-y', 'thorbit-kb-mcp@latest'],\n env,\n },\n },\n }\n}\n\nconst ansi = {\n reset: '\\u001b[0m',\n bold: '\\u001b[1m',\n dim: '\\u001b[2m',\n terracotta: '\\u001b[38;2;198;90;54m',\n cardBg: '\\u001b[48;2;31;31;31m',\n cardBorder: '\\u001b[38;2;108;66;50m',\n clay: '\\u001b[38;2;226;138;92m',\n cream: '\\u001b[38;2;255;244;230m',\n green: '\\u001b[38;2;75;181;67m',\n shadow: '\\u001b[38;2;116;70;56m',\n slate: '\\u001b[38;2;174;181;195m',\n wire: '\\u001b[38;2;198;90;54m',\n}\n\nfunction paint(value: string, code: string, enabled: boolean): string {\n return enabled ? `${code}${value}${ansi.reset}` : value\n}\n\nexport function renderHelp(color: boolean): string {\n return [\n renderBanner(color),\n '',\n 'Usage:',\n ' npx -y -p thorbit-kb-mcp@latest thorbit-kb-mcp-install [options]',\n '',\n 'Options:',\n ' --api-key <key> Thorbit MCP API key from Settings -> MCPs.',\n ' --key-path <path> File containing the API key. Preferred for shared machines and servers.',\n ' --base-url <url> Thorbit app URL. Defaults to https://thorbit.ai.',\n ' --server-name <name> MCP client server name. Defaults to thorbit-kb.',\n ' --json Print only MCP client JSON.',\n ' --no-color Disable ANSI color.',\n ' --help Show this help.',\n '',\n ].join('\\n')\n}\n\nexport function renderBanner(color: boolean): string {\n return color ? renderReferenceCardBanner() : renderAsciiBanner()\n}\n\nconst cardWidth = 104\n\ntype CardTone = 'title' | 'mark' | 'wire' | 'caption' | 'blank'\ntype CardPart = {\n color: string\n text: string\n}\n\nconst thorbitPixelLetters: Record<string, string[]> = {\n T: [\n '1111111',\n '0011000',\n '0011000',\n '0011000',\n '0011000',\n '0011000',\n '0011000',\n ],\n H: [\n '110011',\n '110011',\n '110011',\n '111111',\n '110011',\n '110011',\n '110011',\n ],\n O: [\n '011110',\n '110011',\n '110011',\n '110011',\n '110011',\n '110011',\n '011110',\n ],\n R: [\n '111110',\n '110011',\n '110011',\n '111110',\n '110110',\n '110011',\n '110011',\n ],\n B: [\n '111110',\n '110011',\n '110011',\n '111110',\n '110011',\n '110011',\n '111110',\n ],\n I: [\n '1111',\n '0110',\n '0110',\n '0110',\n '0110',\n '0110',\n '1111',\n ],\n}\n\nfunction renderReferenceCardBanner(): string {\n const heading = justifyCardContent(' Plain text', '⧉', cardWidth)\n\n return [\n `${ansi.cardBorder}╭${'─'.repeat(cardWidth + 2)}╮${ansi.reset}`,\n renderCardLine(heading, 'title'),\n renderCardLine('', 'blank'),\n ...renderLayeredPixelWordmarkCardLines('THORBIT'),\n renderCardLine('', 'blank'),\n renderCardLine(' THORBIT KB MCP', 'caption'),\n `${ansi.cardBorder}╰${'─'.repeat(cardWidth + 2)}╯${ansi.reset}`,\n ].join('\\n')\n}\n\nfunction renderAsciiBanner(): string {\n const contentWidth = 96\n const border = `+${'-'.repeat(contentWidth + 2)}+`\n const cardLine = (content = '') => `| ${content.padEnd(contentWidth)} |`\n const title = 'Plain text'\n const copy = '[copy]'\n const lines = [\n border,\n cardLine(`${title}${' '.repeat(contentWidth - title.length - copy.length)}${copy}`),\n cardLine(),\n ...renderAsciiWordmark('THORBIT').map(line => cardLine(` ${line}`)),\n cardLine(),\n cardLine(' THORBIT KB MCP'),\n border,\n ]\n\n return lines.join('\\n')\n}\n\nfunction renderCardLine(content: string, tone: CardTone): string {\n const foreground = {\n title: ansi.cream,\n mark: ansi.clay,\n wire: ansi.wire,\n caption: ansi.terracotta,\n blank: ansi.slate,\n }[tone]\n return renderCardLineParts([{ color: foreground, text: content }])\n}\n\nfunction renderCardLineParts(parts: CardPart[]): string {\n const visibleWidth = parts.reduce((width, part) => width + part.text.length, 0)\n const padding = ' '.repeat(Math.max(0, cardWidth - visibleWidth))\n return [\n `${ansi.cardBorder}│${ansi.reset}`,\n ansi.cardBg,\n ' ',\n ...parts.map(part => `${part.color}${part.text}`),\n padding,\n ' ',\n ansi.reset,\n `${ansi.cardBorder}│${ansi.reset}`,\n ].join('')\n}\n\nfunction justifyCardContent(left: string, right: string, width: number): string {\n return `${left}${' '.repeat(Math.max(1, width - left.length - right.length))}${right}`\n}\n\nfunction padCardContent(content: string, width: number): string {\n if (content.length >= width) return content.slice(0, width)\n return content.padEnd(width)\n}\n\nfunction buildPixelWordmarkMatrix(word: string): boolean[][] {\n const rows: boolean[][] = Array.from({ length: 7 }, () => [])\n for (let rowIndex = 0; rowIndex < 7; rowIndex += 1) {\n word.split('').forEach((letter, letterIndex) => {\n const pattern = thorbitPixelLetters[letter]\n if (!pattern) return\n if (letterIndex > 0) rows[rowIndex].push(false)\n rows[rowIndex].push(...pattern[rowIndex].split('').map(cell => cell === '1'))\n })\n }\n return rows\n}\n\nfunction renderLayeredPixelWordmarkCardLines(word: string): string[] {\n const matrix = buildPixelWordmarkMatrix(word)\n const wordmarkWidth = Math.max(...matrix.map(row => row.length))\n const shadowOffsetX = 1\n const shadowOffsetY = -1\n const outputRows = matrix.length + Math.abs(Math.min(0, shadowOffsetY))\n const outputWidth = wordmarkWidth + shadowOffsetX\n\n return Array.from({ length: outputRows }, (_, outputRowIndex) => {\n const rowParts: CardPart[] = [{ color: ansi.slate, text: ' ' }]\n\n for (let columnIndex = 0; columnIndex < outputWidth; columnIndex += 1) {\n const foregroundRow = outputRowIndex - Math.abs(Math.min(0, shadowOffsetY))\n const hasForeground = foregroundRow >= 0 && Boolean(matrix[foregroundRow]?.[columnIndex])\n const shadowSourceRow = outputRowIndex - shadowOffsetY - Math.abs(Math.min(0, shadowOffsetY))\n const shadowSourceColumn = columnIndex - shadowOffsetX\n const hasShadow = shadowSourceRow >= 0 && shadowSourceColumn >= 0\n && Boolean(matrix[shadowSourceRow]?.[shadowSourceColumn])\n\n if (hasForeground) {\n appendCardPart(rowParts, ansi.clay, '██')\n } else if (hasShadow) {\n appendCardPart(rowParts, ansi.shadow, '░░')\n } else {\n appendCardPart(rowParts, ansi.slate, ' ')\n }\n }\n\n return renderCardLineParts(rowParts)\n })\n}\n\nfunction appendCardPart(parts: CardPart[], color: string, text: string): void {\n const previous = parts[parts.length - 1]\n if (previous?.color === color) {\n previous.text += text\n return\n }\n parts.push({ color, text })\n}\n\nfunction renderAsciiWordmark(word: string): string[] {\n const matrix = buildPixelWordmarkMatrix(word)\n const rows: string[] = []\n for (const matrixRow of matrix) {\n rows.push(matrixRow.map(cell => (cell ? '#' : ' ')).join(''))\n }\n return rows\n}\n\nexport function renderInstallInstructions(options: InstallOptions): string {\n const color = options.color\n const config = buildMcpConfig(options)\n const json = JSON.stringify(config, null, 2)\n const keySetup = options.keyPath\n ? [\n paint('Key file mode', ansi.terracotta, color),\n ` chmod 600 ${options.keyPath}`,\n ].join('\\n')\n : [\n paint('Safer key-file option', ansi.terracotta, color),\n \" mkdir -p ~/.config/thorbit\",\n \" printf '%s\\\\n' 'thbt_mcp_...' > ~/.config/thorbit/kb-mcp-key\",\n ' chmod 600 ~/.config/thorbit/kb-mcp-key',\n '',\n ' Then run:',\n ' npx -y -p thorbit-kb-mcp@latest thorbit-kb-mcp-install --key-path ~/.config/thorbit/kb-mcp-key',\n ].join('\\n')\n\n return [\n renderBanner(color),\n paint('Vector-backed knowledge bases for MCP agents.', ansi.slate, color),\n '',\n `${paint('1.', ansi.terracotta, color)} Generate an API key in Thorbit Settings -> MCPs.`,\n `${paint('2.', ansi.terracotta, color)} Add this server config to your MCP client:`,\n '',\n json,\n '',\n `${paint('3.', ansi.terracotta, color)} Restart your MCP client, then call ${paint('thorbit_kb_list', ansi.green, color)} or ${paint('thorbit_kb_create', ansi.green, color)}.`,\n '',\n keySetup,\n '',\n paint('Tools', ansi.terracotta, color),\n ' thorbit_kb_create Create a vector-backed Thorbit KB.',\n ' thorbit_kb_ingest_url Extract a URL through MCP Scraper and ingest it.',\n ' thorbit_kb_ingest_site Map/extract a site through MCP Scraper and ingest pages.',\n ' thorbit_kb_ingest_youtube Transcribe YouTube through MCP Scraper and ingest chunks.',\n ' thorbit_kb_search Smart RAG search with citations.',\n ' thorbit_kb_ask Grounded answers with citations and strategy metadata.',\n '',\n paint('Raw JSON:', ansi.slate, color),\n ' npx -y -p thorbit-kb-mcp@latest thorbit-kb-mcp-install --json --api-key thbt_mcp_...',\n '',\n ].join('\\n')\n}\n\nexport function main(): void {\n const options = resolveInstallOptions()\n if (options.help) {\n process.stdout.write(renderHelp(options.color))\n return\n }\n\n if (options.json) {\n process.stdout.write(`${JSON.stringify(buildMcpConfig(options), null, 2)}\\n`)\n return\n }\n\n process.stdout.write(renderInstallInstructions(options))\n}\n\nfunction isMainModule(): boolean {\n const entry = process.argv[1]\n if (!entry) return false\n try {\n return realpathSync(entry) === realpathSync(fileURLToPath(import.meta.url))\n } catch {\n return false\n }\n}\n\nif (isMainModule()) main()\n"],"mappings":"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","names":[]}
@@ -169,7 +169,7 @@ var ThorbitKbAskInputSchema = {
169
169
  };
170
170
 
171
171
  // src/thorbit-kb-mcp-server.ts
172
- var VERSION = "0.2.4";
172
+ var VERSION = "0.2.5";
173
173
  function readOnlyAnnotations(title, idempotent = true) {
174
174
  return {
175
175
  title,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../bin/thorbit-kb-mcp.ts","../../src/thorbit-kb-api-client.ts","../../src/thorbit-kb-mcp-env.ts","../../src/thorbit-kb-mcp-server.ts","../../src/thorbit-kb-mcp-response-formatters.ts","../../src/thorbit-kb-mcp-tool-schemas.ts"],"sourcesContent":["import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { ThorbitKnowledgeBaseApiClient } from '../src/thorbit-kb-api-client.js'\nimport { resolveThorbitKbMcpEnv } from '../src/thorbit-kb-mcp-env.js'\nimport { buildThorbitKnowledgeBaseMcpServer } from '../src/thorbit-kb-mcp-server.js'\n\nasync function main() {\n const env = resolveThorbitKbMcpEnv()\n const client = new ThorbitKnowledgeBaseApiClient(env)\n const server = buildThorbitKnowledgeBaseMcpServer(client)\n await server.connect(new StdioServerTransport())\n}\n\nmain().catch(error => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`)\n process.exit(1)\n})\n","import type { ThorbitKnowledgeBaseMcpToolName } from './thorbit-kb-mcp-tool-names.js'\n\nexport type ThorbitKnowledgeBaseMcpEnvelope =\n | {\n ok: true\n result: unknown\n warnings?: string[]\n requestId: string\n usage?: Record<string, unknown>\n }\n | {\n ok: false\n error: {\n code: string\n message: string\n details?: unknown\n }\n requestId: string\n }\n\nexport class ThorbitKnowledgeBaseApiClient {\n private readonly baseUrl: string\n private readonly apiKey: string\n\n constructor(options: { baseUrl: string; apiKey: string }) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, '')\n this.apiKey = options.apiKey\n }\n\n async callTool(toolName: ThorbitKnowledgeBaseMcpToolName, input: unknown): Promise<ThorbitKnowledgeBaseMcpEnvelope> {\n const response = await fetch(`${this.baseUrl}/api/v1/mcp/knowledge-base/${toolName}`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(input ?? {}),\n })\n\n const body = await response.json().catch(() => null) as ThorbitKnowledgeBaseMcpEnvelope | null\n if (body && typeof body === 'object' && 'ok' in body) return body\n\n return {\n ok: false,\n requestId: 'unavailable',\n error: {\n code: response.ok ? 'invalid_response' : `http_${response.status}`,\n message: response.ok ? 'Thorbit returned an invalid MCP response' : `Thorbit API request failed with HTTP ${response.status}`,\n },\n }\n }\n}\n\n","import { readFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\n\nexport type ThorbitKbMcpEnv = {\n apiKey: string\n baseUrl: string\n}\n\nfunction readApiKeyFile(): string | undefined {\n const explicitPath = process.env.THORBIT_KB_MCP_KEY_PATH?.trim()\n const paths = [explicitPath, join(homedir(), '.thorbit-kb-mcp-key')].filter(Boolean) as string[]\n for (const path of paths) {\n try {\n const value = readFileSync(path, 'utf8').trim()\n if (value) return value\n } catch {\n continue\n }\n }\n return undefined\n}\n\nexport function resolveThorbitKbMcpEnv(): ThorbitKbMcpEnv {\n const apiKey = (\n process.env.THORBIT_API_KEY ||\n process.env.THORBIT_MCP_API_KEY ||\n process.env.THORBIT_KB_MCP_API_KEY ||\n readApiKeyFile()\n )?.trim()\n\n if (!apiKey) {\n throw new Error('THORBIT_API_KEY, THORBIT_MCP_API_KEY, or ~/.thorbit-kb-mcp-key is required')\n }\n\n return {\n apiKey,\n baseUrl: (process.env.THORBIT_BASE_URL || process.env.THORBIT_KB_MCP_BASE_URL || 'https://thorbit.ai').trim(),\n }\n}\n","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { ToolAnnotations } from '@modelcontextprotocol/sdk/types.js'\nimport type { ZodRawShape } from 'zod'\nimport type { ThorbitKnowledgeBaseApiClient } from './thorbit-kb-api-client.js'\nimport { formatThorbitKbMcpToolResult } from './thorbit-kb-mcp-response-formatters.js'\nimport {\n ThorbitKbAskInputSchema,\n ThorbitKbCreateInputSchema,\n ThorbitKbIngestSiteInputSchema,\n ThorbitKbIngestTextInputSchema,\n ThorbitKbIngestUrlInputSchema,\n ThorbitKbIngestYoutubeInputSchema,\n ThorbitKbListInputSchema,\n ThorbitKbSearchInputSchema,\n ThorbitKbSourceStatusInputSchema,\n} from './thorbit-kb-mcp-tool-schemas.js'\nimport type { ThorbitKnowledgeBaseMcpToolName } from './thorbit-kb-mcp-tool-names.js'\n\nconst VERSION = '0.2.4'\n\ntype ThorbitKbToolConfig<InputArgs extends ZodRawShape> = {\n title: string\n description: string\n inputSchema: InputArgs\n annotations: ToolAnnotations\n}\n\nfunction readOnlyAnnotations(title: string, idempotent = true) {\n return {\n title,\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: idempotent,\n openWorldHint: false,\n }\n}\n\nfunction ingestAnnotations(title: string, openWorldHint: boolean) {\n return {\n title,\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint,\n }\n}\n\nexport function buildThorbitKnowledgeBaseMcpServer(client: ThorbitKnowledgeBaseApiClient): McpServer {\n const server = new McpServer({ name: 'thorbit-kb-mcp', version: VERSION })\n\n server.registerResource(\n 'knowledge-bases',\n 'thorbit-kb://knowledge-bases',\n {\n title: 'Thorbit Knowledge Bases',\n description: 'Knowledge bases visible to this Thorbit MCP API key.',\n mimeType: 'application/json',\n },\n async (uri) => {\n const envelope = await client.callTool('thorbit_kb_list', {})\n return { contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify(envelope, null, 2) }] }\n },\n )\n\n server.registerResource(\n 'source-status',\n new ResourceTemplate('thorbit-kb://sources/{sourcePublicId}', { list: undefined }),\n {\n title: 'Thorbit KB Source Status',\n description: 'Status and metadata for one Thorbit knowledge-base source.',\n mimeType: 'application/json',\n },\n async (uri, variables) => {\n const sourcePublicId = Array.isArray(variables.sourcePublicId) ? variables.sourcePublicId[0] : variables.sourcePublicId\n const envelope = await client.callTool('thorbit_kb_source_status', { sourcePublicIds: [String(sourcePublicId)] })\n return { contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify(envelope, null, 2) }] }\n },\n )\n\n function registerTool<T extends ThorbitKnowledgeBaseMcpToolName>(\n toolName: T,\n config: ThorbitKbToolConfig<ZodRawShape>,\n ): void {\n server.registerTool(toolName, config, async (input) => {\n const envelope = await client.callTool(toolName, input)\n return formatThorbitKbMcpToolResult(toolName, envelope)\n })\n }\n\n registerTool('thorbit_kb_create', {\n title: 'Create Thorbit Knowledge Base',\n description: 'Create a new Thorbit vector-backed knowledge base for MCP ingestion, smart RAG search, citations, and entity extraction.',\n inputSchema: ThorbitKbCreateInputSchema,\n annotations: ingestAnnotations('Create Thorbit Knowledge Base', false),\n })\n\n registerTool('thorbit_kb_list', {\n title: 'List Thorbit Knowledge Bases',\n description: 'List Thorbit knowledge bases visible to this API key. Use before ingestion/search when the target KB public ID is unknown.',\n inputSchema: ThorbitKbListInputSchema,\n annotations: readOnlyAnnotations('List Thorbit Knowledge Bases'),\n })\n\n registerTool('thorbit_kb_source_status', {\n title: 'Read Thorbit KB Source Status',\n description: 'Poll ingestion status for source public IDs returned by Thorbit KB ingestion tools.',\n inputSchema: ThorbitKbSourceStatusInputSchema,\n annotations: readOnlyAnnotations('Read Thorbit KB Source Status'),\n })\n\n registerTool('thorbit_kb_ingest_url', {\n title: 'Ingest URL Into Thorbit KB',\n description: 'Extract one public URL through MCP Scraper, clean the content, submit it to Thorbit, and vectorize it into the selected knowledge base.',\n inputSchema: ThorbitKbIngestUrlInputSchema,\n annotations: ingestAnnotations('Ingest URL Into Thorbit KB', true),\n })\n\n registerTool('thorbit_kb_ingest_site', {\n title: 'Ingest Website Into Thorbit KB',\n description: 'Map a website through MCP Scraper, extract selected pages, submit each page to Thorbit, and vectorize them into the selected knowledge base.',\n inputSchema: ThorbitKbIngestSiteInputSchema,\n annotations: ingestAnnotations('Ingest Website Into Thorbit KB', true),\n })\n\n registerTool('thorbit_kb_ingest_youtube', {\n title: 'Ingest YouTube Into Thorbit KB',\n description: 'Transcribe a YouTube video through MCP Scraper, preserve timestamp chunks when available, and vectorize the transcript into Thorbit KB.',\n inputSchema: ThorbitKbIngestYoutubeInputSchema,\n annotations: ingestAnnotations('Ingest YouTube Into Thorbit KB', true),\n })\n\n registerTool('thorbit_kb_ingest_text', {\n title: 'Ingest Text Into Thorbit KB',\n description: 'Submit provided text or Markdown directly to Thorbit and vectorize it into the selected knowledge base.',\n inputSchema: ThorbitKbIngestTextInputSchema,\n annotations: ingestAnnotations('Ingest Text Into Thorbit KB', false),\n })\n\n registerTool('thorbit_kb_search', {\n title: 'Search Thorbit Knowledge Base',\n description: 'Search Thorbit KB content with citation-ready chunks. Use when the user needs source-backed snippets or evidence.',\n inputSchema: ThorbitKbSearchInputSchema,\n annotations: readOnlyAnnotations('Search Thorbit Knowledge Base'),\n })\n\n registerTool('thorbit_kb_ask', {\n title: 'Ask Thorbit Knowledge Base',\n description: 'Answer a question using only retrieved Thorbit KB context. Returns answer, citations, sufficiency, and retrieval strategy metadata.',\n inputSchema: ThorbitKbAskInputSchema,\n annotations: readOnlyAnnotations('Ask Thorbit Knowledge Base', false),\n })\n\n return server\n}\n","import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js'\nimport type { ThorbitKnowledgeBaseMcpEnvelope } from './thorbit-kb-api-client.js'\nimport type { ThorbitKnowledgeBaseMcpToolName } from './thorbit-kb-mcp-tool-names.js'\n\nfunction summarizeResult(toolName: ThorbitKnowledgeBaseMcpToolName, result: unknown): string {\n if (toolName === 'thorbit_kb_create' && result && typeof result === 'object' && 'knowledgeBase' in result) {\n const kb = result.knowledgeBase as { name?: unknown; publicId?: unknown }\n return `Created Thorbit knowledge base ${String(kb.name ?? kb.publicId ?? '')}.`\n }\n if (toolName === 'thorbit_kb_list' && result && typeof result === 'object' && 'knowledgeBases' in result) {\n const count = Array.isArray(result.knowledgeBases) ? result.knowledgeBases.length : 0\n return `Found ${count} Thorbit knowledge base${count === 1 ? '' : 's'}.`\n }\n if (toolName.startsWith('thorbit_kb_ingest')) return 'Knowledge-base ingestion completed. Check structuredContent for source receipts.'\n if (toolName === 'thorbit_kb_source_status') return 'Source status returned. Check structuredContent for details.'\n if (toolName === 'thorbit_kb_search') return 'Knowledge-base search completed. Check structuredContent for results and citations.'\n if (toolName === 'thorbit_kb_ask') return 'Knowledge-base answer generated. Check structuredContent for citations and strategy.'\n return 'Thorbit knowledge-base tool completed.'\n}\n\nexport function formatThorbitKbMcpToolResult(\n toolName: ThorbitKnowledgeBaseMcpToolName,\n envelope: ThorbitKnowledgeBaseMcpEnvelope,\n): CallToolResult {\n if (!envelope.ok) {\n return {\n isError: true,\n content: [{\n type: 'text',\n text: `${envelope.error.code}: ${envelope.error.message}`,\n }],\n structuredContent: envelope,\n }\n }\n\n return {\n content: [{\n type: 'text',\n text: summarizeResult(toolName, envelope.result),\n }],\n structuredContent: envelope.result as Record<string, unknown>,\n }\n}\n","import { z } from 'zod'\n\nconst MetadataSchema = z.record(z.string(), z.unknown())\n\nexport const ThorbitKbCreateInputSchema = {\n name: z.string().min(1).max(255).describe('Name for the new Thorbit knowledge base.'),\n description: z.string().max(2000).optional().describe('Optional description for the new knowledge base.'),\n projectPublicId: z.string().min(1).optional().describe('Optional Thorbit project public ID. Omit to create an org-level knowledge base.'),\n folder: z.string().min(1).max(128).optional().describe('Optional organizational folder, such as research or domains.'),\n}\n\nexport const ThorbitKbListInputSchema = {\n projectPublicId: z.string().min(1).optional().describe('Optional Thorbit project public ID used to narrow knowledge-base listing.'),\n includeGlobal: z.boolean().default(true).describe('Include org-level/global knowledge bases. Default true.'),\n limit: z.number().int().min(1).max(100).default(50).describe('Maximum knowledge bases to return.'),\n}\n\nexport const ThorbitKbSourceStatusInputSchema = {\n sourcePublicIds: z.array(z.string().min(1)).min(1).max(100).describe('Source public IDs returned by Thorbit KB ingestion tools.'),\n}\n\nexport const ThorbitKbIngestUrlInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n url: z.string().url().describe('Public URL to extract through MCP Scraper and ingest into Thorbit.'),\n title: z.string().min(1).max(512).optional().describe('Optional title override. Provider title is used when omitted.'),\n mode: z.enum(['append']).default('append').describe('Append a new source version. Refresh mode is intentionally not enabled in V1.'),\n maxCharacters: z.number().int().min(500).max(500000).optional().describe('Optional cap before chunking/vectorization.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on the KB source.'),\n}\n\nexport const ThorbitKbIngestSiteInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n startUrl: z.string().url().describe('Website start URL. Thorbit maps URLs through MCP Scraper, then ingests selected pages.'),\n includePatterns: z.array(z.string().min(1)).max(20).optional().describe('Optional regex or substring patterns that a mapped URL must match.'),\n excludePatterns: z.array(z.string().min(1)).max(20).optional().describe('Optional regex or substring patterns that remove mapped URLs.'),\n maxPages: z.number().int().min(1).max(100).default(25).describe('Maximum pages to ingest. Default 25, hard cap 100.'),\n mode: z.enum(['append']).default('append').describe('Append source versions. Refresh mode is intentionally not enabled in V1.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on each KB source.'),\n}\n\nexport const ThorbitKbIngestYoutubeInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n videoUrl: z.string().url().describe('YouTube video URL. Thorbit transcribes through MCP Scraper and vectorizes transcript chunks.'),\n title: z.string().min(1).max(512).optional().describe('Optional title override.'),\n mode: z.enum(['append']).default('append').describe('Append a new source version.'),\n preserveTimestamps: z.boolean().default(true).describe('Store transcript timestamps on chunks when MCP Scraper returns them.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on the KB source.'),\n}\n\nexport const ThorbitKbIngestTextInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n title: z.string().min(1).max(512).describe('Source title shown in KB citations.'),\n content: z.string().min(1).max(500000).describe('Text or Markdown to chunk, embed, and ingest.'),\n sourceUrl: z.string().url().optional().describe('Optional canonical source URL for citations.'),\n sourceType: z.enum(['manual', 'note', 'markdown']).default('manual').describe('Caller-facing source type. Thorbit stores note/markdown as manual sources in V1.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on the KB source.'),\n}\n\nexport const ThorbitKbSearchInputSchema = {\n query: z.string().min(1).max(4000).describe('Search query. Use the user question or a focused retrieval query.'),\n knowledgeBasePublicId: z.string().min(1).optional().describe('Optional target KB. Omit to search visible KBs.'),\n projectPublicId: z.string().min(1).optional().describe('Optional project scope when no KB is specified.'),\n limit: z.number().int().min(1).max(20).default(5).describe('Maximum chunks to return.'),\n includeEntities: z.boolean().default(false).describe('Reserved for entity-rich responses.'),\n searchMode: z.enum(['smart', 'hybrid']).default('smart').describe('smart uses Thorbit intent/rerank retrieval; hybrid uses ANN plus FTS.'),\n}\n\nexport const ThorbitKbAskInputSchema = {\n question: z.string().min(1).max(8000).describe('Question to answer using Thorbit KB context only.'),\n knowledgeBasePublicId: z.string().min(1).optional().describe('Optional target KB. Omit to answer over visible KBs.'),\n projectPublicId: z.string().min(1).optional().describe('Optional project scope when no KB is specified.'),\n answerStyle: z.enum(['concise', 'detailed', 'extractive']).default('concise').describe('Use extractive to return source excerpts without an LLM answer.'),\n limit: z.number().int().min(1).max(20).default(8).describe('Maximum retrieved chunks used for the answer.'),\n requireCitations: z.boolean().default(true).describe('Keep true for grounded answers with citation arrays.'),\n}\n\nexport const ThorbitKnowledgeBaseMcpToolInputSchemas = {\n thorbit_kb_create: ThorbitKbCreateInputSchema,\n thorbit_kb_list: ThorbitKbListInputSchema,\n thorbit_kb_source_status: ThorbitKbSourceStatusInputSchema,\n thorbit_kb_ingest_url: ThorbitKbIngestUrlInputSchema,\n thorbit_kb_ingest_site: ThorbitKbIngestSiteInputSchema,\n thorbit_kb_ingest_youtube: ThorbitKbIngestYoutubeInputSchema,\n thorbit_kb_ingest_text: ThorbitKbIngestTextInputSchema,\n thorbit_kb_search: ThorbitKbSearchInputSchema,\n thorbit_kb_ask: ThorbitKbAskInputSchema,\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../bin/thorbit-kb-mcp.ts","../../src/thorbit-kb-api-client.ts","../../src/thorbit-kb-mcp-env.ts","../../src/thorbit-kb-mcp-server.ts","../../src/thorbit-kb-mcp-response-formatters.ts","../../src/thorbit-kb-mcp-tool-schemas.ts"],"sourcesContent":["import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { ThorbitKnowledgeBaseApiClient } from '../src/thorbit-kb-api-client.js'\nimport { resolveThorbitKbMcpEnv } from '../src/thorbit-kb-mcp-env.js'\nimport { buildThorbitKnowledgeBaseMcpServer } from '../src/thorbit-kb-mcp-server.js'\n\nasync function main() {\n const env = resolveThorbitKbMcpEnv()\n const client = new ThorbitKnowledgeBaseApiClient(env)\n const server = buildThorbitKnowledgeBaseMcpServer(client)\n await server.connect(new StdioServerTransport())\n}\n\nmain().catch(error => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`)\n process.exit(1)\n})\n","import type { ThorbitKnowledgeBaseMcpToolName } from './thorbit-kb-mcp-tool-names.js'\n\nexport type ThorbitKnowledgeBaseMcpEnvelope =\n | {\n ok: true\n result: unknown\n warnings?: string[]\n requestId: string\n usage?: Record<string, unknown>\n }\n | {\n ok: false\n error: {\n code: string\n message: string\n details?: unknown\n }\n requestId: string\n }\n\nexport class ThorbitKnowledgeBaseApiClient {\n private readonly baseUrl: string\n private readonly apiKey: string\n\n constructor(options: { baseUrl: string; apiKey: string }) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, '')\n this.apiKey = options.apiKey\n }\n\n async callTool(toolName: ThorbitKnowledgeBaseMcpToolName, input: unknown): Promise<ThorbitKnowledgeBaseMcpEnvelope> {\n const response = await fetch(`${this.baseUrl}/api/v1/mcp/knowledge-base/${toolName}`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(input ?? {}),\n })\n\n const body = await response.json().catch(() => null) as ThorbitKnowledgeBaseMcpEnvelope | null\n if (body && typeof body === 'object' && 'ok' in body) return body\n\n return {\n ok: false,\n requestId: 'unavailable',\n error: {\n code: response.ok ? 'invalid_response' : `http_${response.status}`,\n message: response.ok ? 'Thorbit returned an invalid MCP response' : `Thorbit API request failed with HTTP ${response.status}`,\n },\n }\n }\n}\n\n","import { readFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\n\nexport type ThorbitKbMcpEnv = {\n apiKey: string\n baseUrl: string\n}\n\nfunction readApiKeyFile(): string | undefined {\n const explicitPath = process.env.THORBIT_KB_MCP_KEY_PATH?.trim()\n const paths = [explicitPath, join(homedir(), '.thorbit-kb-mcp-key')].filter(Boolean) as string[]\n for (const path of paths) {\n try {\n const value = readFileSync(path, 'utf8').trim()\n if (value) return value\n } catch {\n continue\n }\n }\n return undefined\n}\n\nexport function resolveThorbitKbMcpEnv(): ThorbitKbMcpEnv {\n const apiKey = (\n process.env.THORBIT_API_KEY ||\n process.env.THORBIT_MCP_API_KEY ||\n process.env.THORBIT_KB_MCP_API_KEY ||\n readApiKeyFile()\n )?.trim()\n\n if (!apiKey) {\n throw new Error('THORBIT_API_KEY, THORBIT_MCP_API_KEY, or ~/.thorbit-kb-mcp-key is required')\n }\n\n return {\n apiKey,\n baseUrl: (process.env.THORBIT_BASE_URL || process.env.THORBIT_KB_MCP_BASE_URL || 'https://thorbit.ai').trim(),\n }\n}\n","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { ToolAnnotations } from '@modelcontextprotocol/sdk/types.js'\nimport type { ZodRawShape } from 'zod'\nimport type { ThorbitKnowledgeBaseApiClient } from './thorbit-kb-api-client.js'\nimport { formatThorbitKbMcpToolResult } from './thorbit-kb-mcp-response-formatters.js'\nimport {\n ThorbitKbAskInputSchema,\n ThorbitKbCreateInputSchema,\n ThorbitKbIngestSiteInputSchema,\n ThorbitKbIngestTextInputSchema,\n ThorbitKbIngestUrlInputSchema,\n ThorbitKbIngestYoutubeInputSchema,\n ThorbitKbListInputSchema,\n ThorbitKbSearchInputSchema,\n ThorbitKbSourceStatusInputSchema,\n} from './thorbit-kb-mcp-tool-schemas.js'\nimport type { ThorbitKnowledgeBaseMcpToolName } from './thorbit-kb-mcp-tool-names.js'\n\nconst VERSION = '0.2.5'\n\ntype ThorbitKbToolConfig<InputArgs extends ZodRawShape> = {\n title: string\n description: string\n inputSchema: InputArgs\n annotations: ToolAnnotations\n}\n\nfunction readOnlyAnnotations(title: string, idempotent = true) {\n return {\n title,\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: idempotent,\n openWorldHint: false,\n }\n}\n\nfunction ingestAnnotations(title: string, openWorldHint: boolean) {\n return {\n title,\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint,\n }\n}\n\nexport function buildThorbitKnowledgeBaseMcpServer(client: ThorbitKnowledgeBaseApiClient): McpServer {\n const server = new McpServer({ name: 'thorbit-kb-mcp', version: VERSION })\n\n server.registerResource(\n 'knowledge-bases',\n 'thorbit-kb://knowledge-bases',\n {\n title: 'Thorbit Knowledge Bases',\n description: 'Knowledge bases visible to this Thorbit MCP API key.',\n mimeType: 'application/json',\n },\n async (uri) => {\n const envelope = await client.callTool('thorbit_kb_list', {})\n return { contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify(envelope, null, 2) }] }\n },\n )\n\n server.registerResource(\n 'source-status',\n new ResourceTemplate('thorbit-kb://sources/{sourcePublicId}', { list: undefined }),\n {\n title: 'Thorbit KB Source Status',\n description: 'Status and metadata for one Thorbit knowledge-base source.',\n mimeType: 'application/json',\n },\n async (uri, variables) => {\n const sourcePublicId = Array.isArray(variables.sourcePublicId) ? variables.sourcePublicId[0] : variables.sourcePublicId\n const envelope = await client.callTool('thorbit_kb_source_status', { sourcePublicIds: [String(sourcePublicId)] })\n return { contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify(envelope, null, 2) }] }\n },\n )\n\n function registerTool<T extends ThorbitKnowledgeBaseMcpToolName>(\n toolName: T,\n config: ThorbitKbToolConfig<ZodRawShape>,\n ): void {\n server.registerTool(toolName, config, async (input) => {\n const envelope = await client.callTool(toolName, input)\n return formatThorbitKbMcpToolResult(toolName, envelope)\n })\n }\n\n registerTool('thorbit_kb_create', {\n title: 'Create Thorbit Knowledge Base',\n description: 'Create a new Thorbit vector-backed knowledge base for MCP ingestion, smart RAG search, citations, and entity extraction.',\n inputSchema: ThorbitKbCreateInputSchema,\n annotations: ingestAnnotations('Create Thorbit Knowledge Base', false),\n })\n\n registerTool('thorbit_kb_list', {\n title: 'List Thorbit Knowledge Bases',\n description: 'List Thorbit knowledge bases visible to this API key. Use before ingestion/search when the target KB public ID is unknown.',\n inputSchema: ThorbitKbListInputSchema,\n annotations: readOnlyAnnotations('List Thorbit Knowledge Bases'),\n })\n\n registerTool('thorbit_kb_source_status', {\n title: 'Read Thorbit KB Source Status',\n description: 'Poll ingestion status for source public IDs returned by Thorbit KB ingestion tools.',\n inputSchema: ThorbitKbSourceStatusInputSchema,\n annotations: readOnlyAnnotations('Read Thorbit KB Source Status'),\n })\n\n registerTool('thorbit_kb_ingest_url', {\n title: 'Ingest URL Into Thorbit KB',\n description: 'Extract one public URL through MCP Scraper, clean the content, submit it to Thorbit, and vectorize it into the selected knowledge base.',\n inputSchema: ThorbitKbIngestUrlInputSchema,\n annotations: ingestAnnotations('Ingest URL Into Thorbit KB', true),\n })\n\n registerTool('thorbit_kb_ingest_site', {\n title: 'Ingest Website Into Thorbit KB',\n description: 'Map a website through MCP Scraper, extract selected pages, submit each page to Thorbit, and vectorize them into the selected knowledge base.',\n inputSchema: ThorbitKbIngestSiteInputSchema,\n annotations: ingestAnnotations('Ingest Website Into Thorbit KB', true),\n })\n\n registerTool('thorbit_kb_ingest_youtube', {\n title: 'Ingest YouTube Into Thorbit KB',\n description: 'Transcribe a YouTube video through MCP Scraper, preserve timestamp chunks when available, and vectorize the transcript into Thorbit KB.',\n inputSchema: ThorbitKbIngestYoutubeInputSchema,\n annotations: ingestAnnotations('Ingest YouTube Into Thorbit KB', true),\n })\n\n registerTool('thorbit_kb_ingest_text', {\n title: 'Ingest Text Into Thorbit KB',\n description: 'Submit provided text or Markdown directly to Thorbit and vectorize it into the selected knowledge base.',\n inputSchema: ThorbitKbIngestTextInputSchema,\n annotations: ingestAnnotations('Ingest Text Into Thorbit KB', false),\n })\n\n registerTool('thorbit_kb_search', {\n title: 'Search Thorbit Knowledge Base',\n description: 'Search Thorbit KB content with citation-ready chunks. Use when the user needs source-backed snippets or evidence.',\n inputSchema: ThorbitKbSearchInputSchema,\n annotations: readOnlyAnnotations('Search Thorbit Knowledge Base'),\n })\n\n registerTool('thorbit_kb_ask', {\n title: 'Ask Thorbit Knowledge Base',\n description: 'Answer a question using only retrieved Thorbit KB context. Returns answer, citations, sufficiency, and retrieval strategy metadata.',\n inputSchema: ThorbitKbAskInputSchema,\n annotations: readOnlyAnnotations('Ask Thorbit Knowledge Base', false),\n })\n\n return server\n}\n","import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js'\nimport type { ThorbitKnowledgeBaseMcpEnvelope } from './thorbit-kb-api-client.js'\nimport type { ThorbitKnowledgeBaseMcpToolName } from './thorbit-kb-mcp-tool-names.js'\n\nfunction summarizeResult(toolName: ThorbitKnowledgeBaseMcpToolName, result: unknown): string {\n if (toolName === 'thorbit_kb_create' && result && typeof result === 'object' && 'knowledgeBase' in result) {\n const kb = result.knowledgeBase as { name?: unknown; publicId?: unknown }\n return `Created Thorbit knowledge base ${String(kb.name ?? kb.publicId ?? '')}.`\n }\n if (toolName === 'thorbit_kb_list' && result && typeof result === 'object' && 'knowledgeBases' in result) {\n const count = Array.isArray(result.knowledgeBases) ? result.knowledgeBases.length : 0\n return `Found ${count} Thorbit knowledge base${count === 1 ? '' : 's'}.`\n }\n if (toolName.startsWith('thorbit_kb_ingest')) return 'Knowledge-base ingestion completed. Check structuredContent for source receipts.'\n if (toolName === 'thorbit_kb_source_status') return 'Source status returned. Check structuredContent for details.'\n if (toolName === 'thorbit_kb_search') return 'Knowledge-base search completed. Check structuredContent for results and citations.'\n if (toolName === 'thorbit_kb_ask') return 'Knowledge-base answer generated. Check structuredContent for citations and strategy.'\n return 'Thorbit knowledge-base tool completed.'\n}\n\nexport function formatThorbitKbMcpToolResult(\n toolName: ThorbitKnowledgeBaseMcpToolName,\n envelope: ThorbitKnowledgeBaseMcpEnvelope,\n): CallToolResult {\n if (!envelope.ok) {\n return {\n isError: true,\n content: [{\n type: 'text',\n text: `${envelope.error.code}: ${envelope.error.message}`,\n }],\n structuredContent: envelope,\n }\n }\n\n return {\n content: [{\n type: 'text',\n text: summarizeResult(toolName, envelope.result),\n }],\n structuredContent: envelope.result as Record<string, unknown>,\n }\n}\n","import { z } from 'zod'\n\nconst MetadataSchema = z.record(z.string(), z.unknown())\n\nexport const ThorbitKbCreateInputSchema = {\n name: z.string().min(1).max(255).describe('Name for the new Thorbit knowledge base.'),\n description: z.string().max(2000).optional().describe('Optional description for the new knowledge base.'),\n projectPublicId: z.string().min(1).optional().describe('Optional Thorbit project public ID. Omit to create an org-level knowledge base.'),\n folder: z.string().min(1).max(128).optional().describe('Optional organizational folder, such as research or domains.'),\n}\n\nexport const ThorbitKbListInputSchema = {\n projectPublicId: z.string().min(1).optional().describe('Optional Thorbit project public ID used to narrow knowledge-base listing.'),\n includeGlobal: z.boolean().default(true).describe('Include org-level/global knowledge bases. Default true.'),\n limit: z.number().int().min(1).max(100).default(50).describe('Maximum knowledge bases to return.'),\n}\n\nexport const ThorbitKbSourceStatusInputSchema = {\n sourcePublicIds: z.array(z.string().min(1)).min(1).max(100).describe('Source public IDs returned by Thorbit KB ingestion tools.'),\n}\n\nexport const ThorbitKbIngestUrlInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n url: z.string().url().describe('Public URL to extract through MCP Scraper and ingest into Thorbit.'),\n title: z.string().min(1).max(512).optional().describe('Optional title override. Provider title is used when omitted.'),\n mode: z.enum(['append']).default('append').describe('Append a new source version. Refresh mode is intentionally not enabled in V1.'),\n maxCharacters: z.number().int().min(500).max(500000).optional().describe('Optional cap before chunking/vectorization.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on the KB source.'),\n}\n\nexport const ThorbitKbIngestSiteInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n startUrl: z.string().url().describe('Website start URL. Thorbit maps URLs through MCP Scraper, then ingests selected pages.'),\n includePatterns: z.array(z.string().min(1)).max(20).optional().describe('Optional regex or substring patterns that a mapped URL must match.'),\n excludePatterns: z.array(z.string().min(1)).max(20).optional().describe('Optional regex or substring patterns that remove mapped URLs.'),\n maxPages: z.number().int().min(1).max(100).default(25).describe('Maximum pages to ingest. Default 25, hard cap 100.'),\n mode: z.enum(['append']).default('append').describe('Append source versions. Refresh mode is intentionally not enabled in V1.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on each KB source.'),\n}\n\nexport const ThorbitKbIngestYoutubeInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n videoUrl: z.string().url().describe('YouTube video URL. Thorbit transcribes through MCP Scraper and vectorizes transcript chunks.'),\n title: z.string().min(1).max(512).optional().describe('Optional title override.'),\n mode: z.enum(['append']).default('append').describe('Append a new source version.'),\n preserveTimestamps: z.boolean().default(true).describe('Store transcript timestamps on chunks when MCP Scraper returns them.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on the KB source.'),\n}\n\nexport const ThorbitKbIngestTextInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n title: z.string().min(1).max(512).describe('Source title shown in KB citations.'),\n content: z.string().min(1).max(500000).describe('Text or Markdown to chunk, embed, and ingest.'),\n sourceUrl: z.string().url().optional().describe('Optional canonical source URL for citations.'),\n sourceType: z.enum(['manual', 'note', 'markdown']).default('manual').describe('Caller-facing source type. Thorbit stores note/markdown as manual sources in V1.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on the KB source.'),\n}\n\nexport const ThorbitKbSearchInputSchema = {\n query: z.string().min(1).max(4000).describe('Search query. Use the user question or a focused retrieval query.'),\n knowledgeBasePublicId: z.string().min(1).optional().describe('Optional target KB. Omit to search visible KBs.'),\n projectPublicId: z.string().min(1).optional().describe('Optional project scope when no KB is specified.'),\n limit: z.number().int().min(1).max(20).default(5).describe('Maximum chunks to return.'),\n includeEntities: z.boolean().default(false).describe('Reserved for entity-rich responses.'),\n searchMode: z.enum(['smart', 'hybrid']).default('smart').describe('smart uses Thorbit intent/rerank retrieval; hybrid uses ANN plus FTS.'),\n}\n\nexport const ThorbitKbAskInputSchema = {\n question: z.string().min(1).max(8000).describe('Question to answer using Thorbit KB context only.'),\n knowledgeBasePublicId: z.string().min(1).optional().describe('Optional target KB. Omit to answer over visible KBs.'),\n projectPublicId: z.string().min(1).optional().describe('Optional project scope when no KB is specified.'),\n answerStyle: z.enum(['concise', 'detailed', 'extractive']).default('concise').describe('Use extractive to return source excerpts without an LLM answer.'),\n limit: z.number().int().min(1).max(20).default(8).describe('Maximum retrieved chunks used for the answer.'),\n requireCitations: z.boolean().default(true).describe('Keep true for grounded answers with citation arrays.'),\n}\n\nexport const ThorbitKnowledgeBaseMcpToolInputSchemas = {\n thorbit_kb_create: ThorbitKbCreateInputSchema,\n thorbit_kb_list: ThorbitKbListInputSchema,\n thorbit_kb_source_status: ThorbitKbSourceStatusInputSchema,\n thorbit_kb_ingest_url: ThorbitKbIngestUrlInputSchema,\n thorbit_kb_ingest_site: ThorbitKbIngestSiteInputSchema,\n thorbit_kb_ingest_youtube: ThorbitKbIngestYoutubeInputSchema,\n thorbit_kb_ingest_text: ThorbitKbIngestTextInputSchema,\n thorbit_kb_search: ThorbitKbSearchInputSchema,\n thorbit_kb_ask: ThorbitKbAskInputSchema,\n}\n"],"mappings":";;;;AAAA,mBAAqC;;;ACoB9B,IAAM,gCAAN,MAAoC;AAAA,EACxB;AAAA,EACA;AAAA,EAEjB,YAAY,SAA8C;AACxD,SAAK,UAAU,QAAQ,QAAQ,QAAQ,OAAO,EAAE;AAChD,SAAK,SAAS,QAAQ;AAAA,EACxB;AAAA,EAEA,MAAM,SAAS,UAA2C,OAA0D;AAClH,UAAM,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,8BAA8B,QAAQ,IAAI;AAAA,MACpF,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAU,KAAK,MAAM;AAAA,QACpC,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU,SAAS,CAAC,CAAC;AAAA,IAClC,CAAC;AAED,UAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,IAAI;AACnD,QAAI,QAAQ,OAAO,SAAS,YAAY,QAAQ,KAAM,QAAO;AAE7D,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,WAAW;AAAA,MACX,OAAO;AAAA,QACL,MAAM,SAAS,KAAK,qBAAqB,QAAQ,SAAS,MAAM;AAAA,QAChE,SAAS,SAAS,KAAK,6CAA6C,wCAAwC,SAAS,MAAM;AAAA,MAC7H;AAAA,IACF;AAAA,EACF;AACF;;;ACnDA,qBAA6B;AAC7B,qBAAwB;AACxB,uBAAqB;AAOrB,SAAS,iBAAqC;AAC5C,QAAM,eAAe,QAAQ,IAAI,yBAAyB,KAAK;AAC/D,QAAM,QAAQ,CAAC,kBAAc,2BAAK,wBAAQ,GAAG,qBAAqB,CAAC,EAAE,OAAO,OAAO;AACnF,aAAW,QAAQ,OAAO;AACxB,QAAI;AACF,YAAM,YAAQ,6BAAa,MAAM,MAAM,EAAE,KAAK;AAC9C,UAAI,MAAO,QAAO;AAAA,IACpB,QAAQ;AACN;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,yBAA0C;AACxD,QAAM,UACJ,QAAQ,IAAI,mBACZ,QAAQ,IAAI,uBACZ,QAAQ,IAAI,0BACZ,eAAe,IACd,KAAK;AAER,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,4EAA4E;AAAA,EAC9F;AAEA,SAAO;AAAA,IACL;AAAA,IACA,UAAU,QAAQ,IAAI,oBAAoB,QAAQ,IAAI,2BAA2B,sBAAsB,KAAK;AAAA,EAC9G;AACF;;;ACvCA,iBAA4C;;;ACI5C,SAAS,gBAAgB,UAA2C,QAAyB;AAC3F,MAAI,aAAa,uBAAuB,UAAU,OAAO,WAAW,YAAY,mBAAmB,QAAQ;AACzG,UAAM,KAAK,OAAO;AAClB,WAAO,kCAAkC,OAAO,GAAG,QAAQ,GAAG,YAAY,EAAE,CAAC;AAAA,EAC/E;AACA,MAAI,aAAa,qBAAqB,UAAU,OAAO,WAAW,YAAY,oBAAoB,QAAQ;AACxG,UAAM,QAAQ,MAAM,QAAQ,OAAO,cAAc,IAAI,OAAO,eAAe,SAAS;AACpF,WAAO,SAAS,KAAK,0BAA0B,UAAU,IAAI,KAAK,GAAG;AAAA,EACvE;AACA,MAAI,SAAS,WAAW,mBAAmB,EAAG,QAAO;AACrD,MAAI,aAAa,2BAA4B,QAAO;AACpD,MAAI,aAAa,oBAAqB,QAAO;AAC7C,MAAI,aAAa,iBAAkB,QAAO;AAC1C,SAAO;AACT;AAEO,SAAS,6BACd,UACA,UACgB;AAChB,MAAI,CAAC,SAAS,IAAI;AAChB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,CAAC;AAAA,QACR,MAAM;AAAA,QACN,MAAM,GAAG,SAAS,MAAM,IAAI,KAAK,SAAS,MAAM,OAAO;AAAA,MACzD,CAAC;AAAA,MACD,mBAAmB;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS,CAAC;AAAA,MACR,MAAM;AAAA,MACN,MAAM,gBAAgB,UAAU,SAAS,MAAM;AAAA,IACjD,CAAC;AAAA,IACD,mBAAmB,SAAS;AAAA,EAC9B;AACF;;;AC1CA,iBAAkB;AAElB,IAAM,iBAAiB,aAAE,OAAO,aAAE,OAAO,GAAG,aAAE,QAAQ,CAAC;AAEhD,IAAM,6BAA6B;AAAA,EACxC,MAAM,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,0CAA0C;AAAA,EACpF,aAAa,aAAE,OAAO,EAAE,IAAI,GAAI,EAAE,SAAS,EAAE,SAAS,kDAAkD;AAAA,EACxG,iBAAiB,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,iFAAiF;AAAA,EACxI,QAAQ,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,SAAS,8DAA8D;AACvH;AAEO,IAAM,2BAA2B;AAAA,EACtC,iBAAiB,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,2EAA2E;AAAA,EAClI,eAAe,aAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,SAAS,yDAAyD;AAAA,EAC3G,OAAO,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,QAAQ,EAAE,EAAE,SAAS,oCAAoC;AACnG;AAEO,IAAM,mCAAmC;AAAA,EAC9C,iBAAiB,aAAE,MAAM,aAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,2DAA2D;AAClI;AAEO,IAAM,gCAAgC;AAAA,EAC3C,uBAAuB,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,0CAA0C;AAAA,EAC5F,KAAK,aAAE,OAAO,EAAE,IAAI,EAAE,SAAS,oEAAoE;AAAA,EACnG,OAAO,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,SAAS,+DAA+D;AAAA,EACrH,MAAM,aAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,QAAQ,QAAQ,EAAE,SAAS,+EAA+E;AAAA,EACnI,eAAe,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,IAAI,GAAM,EAAE,SAAS,EAAE,SAAS,6CAA6C;AAAA,EACtH,UAAU,eAAe,SAAS,EAAE,SAAS,4CAA4C;AAC3F;AAEO,IAAM,iCAAiC;AAAA,EAC5C,uBAAuB,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,0CAA0C;AAAA,EAC5F,UAAU,aAAE,OAAO,EAAE,IAAI,EAAE,SAAS,wFAAwF;AAAA,EAC5H,iBAAiB,aAAE,MAAM,aAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,SAAS,oEAAoE;AAAA,EAC5I,iBAAiB,aAAE,MAAM,aAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,SAAS,+DAA+D;AAAA,EACvI,UAAU,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,QAAQ,EAAE,EAAE,SAAS,oDAAoD;AAAA,EACpH,MAAM,aAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,QAAQ,QAAQ,EAAE,SAAS,0EAA0E;AAAA,EAC9H,UAAU,eAAe,SAAS,EAAE,SAAS,6CAA6C;AAC5F;AAEO,IAAM,oCAAoC;AAAA,EAC/C,uBAAuB,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,0CAA0C;AAAA,EAC5F,UAAU,aAAE,OAAO,EAAE,IAAI,EAAE,SAAS,8FAA8F;AAAA,EAClI,OAAO,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,SAAS,0BAA0B;AAAA,EAChF,MAAM,aAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,QAAQ,QAAQ,EAAE,SAAS,8BAA8B;AAAA,EAClF,oBAAoB,aAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,SAAS,sEAAsE;AAAA,EAC7H,UAAU,eAAe,SAAS,EAAE,SAAS,4CAA4C;AAC3F;AAEO,IAAM,iCAAiC;AAAA,EAC5C,uBAAuB,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,0CAA0C;AAAA,EAC5F,OAAO,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,qCAAqC;AAAA,EAChF,SAAS,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAM,EAAE,SAAS,+CAA+C;AAAA,EAC/F,WAAW,aAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,8CAA8C;AAAA,EAC9F,YAAY,aAAE,KAAK,CAAC,UAAU,QAAQ,UAAU,CAAC,EAAE,QAAQ,QAAQ,EAAE,SAAS,kFAAkF;AAAA,EAChK,UAAU,eAAe,SAAS,EAAE,SAAS,4CAA4C;AAC3F;AAEO,IAAM,6BAA6B;AAAA,EACxC,OAAO,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAI,EAAE,SAAS,mEAAmE;AAAA,EAC/G,uBAAuB,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,iDAAiD;AAAA,EAC9G,iBAAiB,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,iDAAiD;AAAA,EACxG,OAAO,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC,EAAE,SAAS,2BAA2B;AAAA,EACtF,iBAAiB,aAAE,QAAQ,EAAE,QAAQ,KAAK,EAAE,SAAS,qCAAqC;AAAA,EAC1F,YAAY,aAAE,KAAK,CAAC,SAAS,QAAQ,CAAC,EAAE,QAAQ,OAAO,EAAE,SAAS,uEAAuE;AAC3I;AAEO,IAAM,0BAA0B;AAAA,EACrC,UAAU,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAI,EAAE,SAAS,mDAAmD;AAAA,EAClG,uBAAuB,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,sDAAsD;AAAA,EACnH,iBAAiB,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,iDAAiD;AAAA,EACxG,aAAa,aAAE,KAAK,CAAC,WAAW,YAAY,YAAY,CAAC,EAAE,QAAQ,SAAS,EAAE,SAAS,iEAAiE;AAAA,EACxJ,OAAO,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC,EAAE,SAAS,+CAA+C;AAAA,EAC1G,kBAAkB,aAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,SAAS,sDAAsD;AAC7G;;;AFxDA,IAAM,UAAU;AAShB,SAAS,oBAAoB,OAAe,aAAa,MAAM;AAC7D,SAAO;AAAA,IACL;AAAA,IACA,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,eAAe;AAAA,EACjB;AACF;AAEA,SAAS,kBAAkB,OAAe,eAAwB;AAChE,SAAO;AAAA,IACL;AAAA,IACA,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB;AAAA,EACF;AACF;AAEO,SAAS,mCAAmC,QAAkD;AACnG,QAAM,SAAS,IAAI,qBAAU,EAAE,MAAM,kBAAkB,SAAS,QAAQ,CAAC;AAEzE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,OAAO,QAAQ;AACb,YAAM,WAAW,MAAM,OAAO,SAAS,mBAAmB,CAAC,CAAC;AAC5D,aAAO,EAAE,UAAU,CAAC,EAAE,KAAK,IAAI,MAAM,UAAU,oBAAoB,MAAM,KAAK,UAAU,UAAU,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAChH;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,IAAI,4BAAiB,yCAAyC,EAAE,MAAM,OAAU,CAAC;AAAA,IACjF;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,OAAO,KAAK,cAAc;AACxB,YAAM,iBAAiB,MAAM,QAAQ,UAAU,cAAc,IAAI,UAAU,eAAe,CAAC,IAAI,UAAU;AACzG,YAAM,WAAW,MAAM,OAAO,SAAS,4BAA4B,EAAE,iBAAiB,CAAC,OAAO,cAAc,CAAC,EAAE,CAAC;AAChH,aAAO,EAAE,UAAU,CAAC,EAAE,KAAK,IAAI,MAAM,UAAU,oBAAoB,MAAM,KAAK,UAAU,UAAU,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IAChH;AAAA,EACF;AAEA,WAAS,aACP,UACA,QACM;AACN,WAAO,aAAa,UAAU,QAAQ,OAAO,UAAU;AACrD,YAAM,WAAW,MAAM,OAAO,SAAS,UAAU,KAAK;AACtD,aAAO,6BAA6B,UAAU,QAAQ;AAAA,IACxD,CAAC;AAAA,EACH;AAEA,eAAa,qBAAqB;AAAA,IAChC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAa,kBAAkB,iCAAiC,KAAK;AAAA,EACvE,CAAC;AAED,eAAa,mBAAmB;AAAA,IAC9B,OAAO;AAAA,IACP,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAa,oBAAoB,8BAA8B;AAAA,EACjE,CAAC;AAED,eAAa,4BAA4B;AAAA,IACvC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAa,oBAAoB,+BAA+B;AAAA,EAClE,CAAC;AAED,eAAa,yBAAyB;AAAA,IACpC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAa,kBAAkB,8BAA8B,IAAI;AAAA,EACnE,CAAC;AAED,eAAa,0BAA0B;AAAA,IACrC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAa,kBAAkB,kCAAkC,IAAI;AAAA,EACvE,CAAC;AAED,eAAa,6BAA6B;AAAA,IACxC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAa,kBAAkB,kCAAkC,IAAI;AAAA,EACvE,CAAC;AAED,eAAa,0BAA0B;AAAA,IACrC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAa,kBAAkB,+BAA+B,KAAK;AAAA,EACrE,CAAC;AAED,eAAa,qBAAqB;AAAA,IAChC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAa,oBAAoB,+BAA+B;AAAA,EAClE,CAAC;AAED,eAAa,kBAAkB;AAAA,IAC7B,OAAO;AAAA,IACP,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAa,oBAAoB,8BAA8B,KAAK;AAAA,EACtE,CAAC;AAED,SAAO;AACT;;;AHpJA,eAAe,OAAO;AACpB,QAAM,MAAM,uBAAuB;AACnC,QAAM,SAAS,IAAI,8BAA8B,GAAG;AACpD,QAAM,SAAS,mCAAmC,MAAM;AACxD,QAAM,OAAO,QAAQ,IAAI,kCAAqB,CAAC;AACjD;AAEA,KAAK,EAAE,MAAM,WAAS;AACpB,UAAQ,OAAO,MAAM,GAAG,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,CAAI;AAClF,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":[]}
@@ -168,7 +168,7 @@ var ThorbitKbAskInputSchema = {
168
168
  };
169
169
 
170
170
  // src/thorbit-kb-mcp-server.ts
171
- var VERSION = "0.2.4";
171
+ var VERSION = "0.2.5";
172
172
  function readOnlyAnnotations(title, idempotent = true) {
173
173
  return {
174
174
  title,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../bin/thorbit-kb-mcp.ts","../../src/thorbit-kb-api-client.ts","../../src/thorbit-kb-mcp-env.ts","../../src/thorbit-kb-mcp-server.ts","../../src/thorbit-kb-mcp-response-formatters.ts","../../src/thorbit-kb-mcp-tool-schemas.ts"],"sourcesContent":["import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { ThorbitKnowledgeBaseApiClient } from '../src/thorbit-kb-api-client.js'\nimport { resolveThorbitKbMcpEnv } from '../src/thorbit-kb-mcp-env.js'\nimport { buildThorbitKnowledgeBaseMcpServer } from '../src/thorbit-kb-mcp-server.js'\n\nasync function main() {\n const env = resolveThorbitKbMcpEnv()\n const client = new ThorbitKnowledgeBaseApiClient(env)\n const server = buildThorbitKnowledgeBaseMcpServer(client)\n await server.connect(new StdioServerTransport())\n}\n\nmain().catch(error => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`)\n process.exit(1)\n})\n","import type { ThorbitKnowledgeBaseMcpToolName } from './thorbit-kb-mcp-tool-names.js'\n\nexport type ThorbitKnowledgeBaseMcpEnvelope =\n | {\n ok: true\n result: unknown\n warnings?: string[]\n requestId: string\n usage?: Record<string, unknown>\n }\n | {\n ok: false\n error: {\n code: string\n message: string\n details?: unknown\n }\n requestId: string\n }\n\nexport class ThorbitKnowledgeBaseApiClient {\n private readonly baseUrl: string\n private readonly apiKey: string\n\n constructor(options: { baseUrl: string; apiKey: string }) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, '')\n this.apiKey = options.apiKey\n }\n\n async callTool(toolName: ThorbitKnowledgeBaseMcpToolName, input: unknown): Promise<ThorbitKnowledgeBaseMcpEnvelope> {\n const response = await fetch(`${this.baseUrl}/api/v1/mcp/knowledge-base/${toolName}`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(input ?? {}),\n })\n\n const body = await response.json().catch(() => null) as ThorbitKnowledgeBaseMcpEnvelope | null\n if (body && typeof body === 'object' && 'ok' in body) return body\n\n return {\n ok: false,\n requestId: 'unavailable',\n error: {\n code: response.ok ? 'invalid_response' : `http_${response.status}`,\n message: response.ok ? 'Thorbit returned an invalid MCP response' : `Thorbit API request failed with HTTP ${response.status}`,\n },\n }\n }\n}\n\n","import { readFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\n\nexport type ThorbitKbMcpEnv = {\n apiKey: string\n baseUrl: string\n}\n\nfunction readApiKeyFile(): string | undefined {\n const explicitPath = process.env.THORBIT_KB_MCP_KEY_PATH?.trim()\n const paths = [explicitPath, join(homedir(), '.thorbit-kb-mcp-key')].filter(Boolean) as string[]\n for (const path of paths) {\n try {\n const value = readFileSync(path, 'utf8').trim()\n if (value) return value\n } catch {\n continue\n }\n }\n return undefined\n}\n\nexport function resolveThorbitKbMcpEnv(): ThorbitKbMcpEnv {\n const apiKey = (\n process.env.THORBIT_API_KEY ||\n process.env.THORBIT_MCP_API_KEY ||\n process.env.THORBIT_KB_MCP_API_KEY ||\n readApiKeyFile()\n )?.trim()\n\n if (!apiKey) {\n throw new Error('THORBIT_API_KEY, THORBIT_MCP_API_KEY, or ~/.thorbit-kb-mcp-key is required')\n }\n\n return {\n apiKey,\n baseUrl: (process.env.THORBIT_BASE_URL || process.env.THORBIT_KB_MCP_BASE_URL || 'https://thorbit.ai').trim(),\n }\n}\n","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { ToolAnnotations } from '@modelcontextprotocol/sdk/types.js'\nimport type { ZodRawShape } from 'zod'\nimport type { ThorbitKnowledgeBaseApiClient } from './thorbit-kb-api-client.js'\nimport { formatThorbitKbMcpToolResult } from './thorbit-kb-mcp-response-formatters.js'\nimport {\n ThorbitKbAskInputSchema,\n ThorbitKbCreateInputSchema,\n ThorbitKbIngestSiteInputSchema,\n ThorbitKbIngestTextInputSchema,\n ThorbitKbIngestUrlInputSchema,\n ThorbitKbIngestYoutubeInputSchema,\n ThorbitKbListInputSchema,\n ThorbitKbSearchInputSchema,\n ThorbitKbSourceStatusInputSchema,\n} from './thorbit-kb-mcp-tool-schemas.js'\nimport type { ThorbitKnowledgeBaseMcpToolName } from './thorbit-kb-mcp-tool-names.js'\n\nconst VERSION = '0.2.4'\n\ntype ThorbitKbToolConfig<InputArgs extends ZodRawShape> = {\n title: string\n description: string\n inputSchema: InputArgs\n annotations: ToolAnnotations\n}\n\nfunction readOnlyAnnotations(title: string, idempotent = true) {\n return {\n title,\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: idempotent,\n openWorldHint: false,\n }\n}\n\nfunction ingestAnnotations(title: string, openWorldHint: boolean) {\n return {\n title,\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint,\n }\n}\n\nexport function buildThorbitKnowledgeBaseMcpServer(client: ThorbitKnowledgeBaseApiClient): McpServer {\n const server = new McpServer({ name: 'thorbit-kb-mcp', version: VERSION })\n\n server.registerResource(\n 'knowledge-bases',\n 'thorbit-kb://knowledge-bases',\n {\n title: 'Thorbit Knowledge Bases',\n description: 'Knowledge bases visible to this Thorbit MCP API key.',\n mimeType: 'application/json',\n },\n async (uri) => {\n const envelope = await client.callTool('thorbit_kb_list', {})\n return { contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify(envelope, null, 2) }] }\n },\n )\n\n server.registerResource(\n 'source-status',\n new ResourceTemplate('thorbit-kb://sources/{sourcePublicId}', { list: undefined }),\n {\n title: 'Thorbit KB Source Status',\n description: 'Status and metadata for one Thorbit knowledge-base source.',\n mimeType: 'application/json',\n },\n async (uri, variables) => {\n const sourcePublicId = Array.isArray(variables.sourcePublicId) ? variables.sourcePublicId[0] : variables.sourcePublicId\n const envelope = await client.callTool('thorbit_kb_source_status', { sourcePublicIds: [String(sourcePublicId)] })\n return { contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify(envelope, null, 2) }] }\n },\n )\n\n function registerTool<T extends ThorbitKnowledgeBaseMcpToolName>(\n toolName: T,\n config: ThorbitKbToolConfig<ZodRawShape>,\n ): void {\n server.registerTool(toolName, config, async (input) => {\n const envelope = await client.callTool(toolName, input)\n return formatThorbitKbMcpToolResult(toolName, envelope)\n })\n }\n\n registerTool('thorbit_kb_create', {\n title: 'Create Thorbit Knowledge Base',\n description: 'Create a new Thorbit vector-backed knowledge base for MCP ingestion, smart RAG search, citations, and entity extraction.',\n inputSchema: ThorbitKbCreateInputSchema,\n annotations: ingestAnnotations('Create Thorbit Knowledge Base', false),\n })\n\n registerTool('thorbit_kb_list', {\n title: 'List Thorbit Knowledge Bases',\n description: 'List Thorbit knowledge bases visible to this API key. Use before ingestion/search when the target KB public ID is unknown.',\n inputSchema: ThorbitKbListInputSchema,\n annotations: readOnlyAnnotations('List Thorbit Knowledge Bases'),\n })\n\n registerTool('thorbit_kb_source_status', {\n title: 'Read Thorbit KB Source Status',\n description: 'Poll ingestion status for source public IDs returned by Thorbit KB ingestion tools.',\n inputSchema: ThorbitKbSourceStatusInputSchema,\n annotations: readOnlyAnnotations('Read Thorbit KB Source Status'),\n })\n\n registerTool('thorbit_kb_ingest_url', {\n title: 'Ingest URL Into Thorbit KB',\n description: 'Extract one public URL through MCP Scraper, clean the content, submit it to Thorbit, and vectorize it into the selected knowledge base.',\n inputSchema: ThorbitKbIngestUrlInputSchema,\n annotations: ingestAnnotations('Ingest URL Into Thorbit KB', true),\n })\n\n registerTool('thorbit_kb_ingest_site', {\n title: 'Ingest Website Into Thorbit KB',\n description: 'Map a website through MCP Scraper, extract selected pages, submit each page to Thorbit, and vectorize them into the selected knowledge base.',\n inputSchema: ThorbitKbIngestSiteInputSchema,\n annotations: ingestAnnotations('Ingest Website Into Thorbit KB', true),\n })\n\n registerTool('thorbit_kb_ingest_youtube', {\n title: 'Ingest YouTube Into Thorbit KB',\n description: 'Transcribe a YouTube video through MCP Scraper, preserve timestamp chunks when available, and vectorize the transcript into Thorbit KB.',\n inputSchema: ThorbitKbIngestYoutubeInputSchema,\n annotations: ingestAnnotations('Ingest YouTube Into Thorbit KB', true),\n })\n\n registerTool('thorbit_kb_ingest_text', {\n title: 'Ingest Text Into Thorbit KB',\n description: 'Submit provided text or Markdown directly to Thorbit and vectorize it into the selected knowledge base.',\n inputSchema: ThorbitKbIngestTextInputSchema,\n annotations: ingestAnnotations('Ingest Text Into Thorbit KB', false),\n })\n\n registerTool('thorbit_kb_search', {\n title: 'Search Thorbit Knowledge Base',\n description: 'Search Thorbit KB content with citation-ready chunks. Use when the user needs source-backed snippets or evidence.',\n inputSchema: ThorbitKbSearchInputSchema,\n annotations: readOnlyAnnotations('Search Thorbit Knowledge Base'),\n })\n\n registerTool('thorbit_kb_ask', {\n title: 'Ask Thorbit Knowledge Base',\n description: 'Answer a question using only retrieved Thorbit KB context. Returns answer, citations, sufficiency, and retrieval strategy metadata.',\n inputSchema: ThorbitKbAskInputSchema,\n annotations: readOnlyAnnotations('Ask Thorbit Knowledge Base', false),\n })\n\n return server\n}\n","import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js'\nimport type { ThorbitKnowledgeBaseMcpEnvelope } from './thorbit-kb-api-client.js'\nimport type { ThorbitKnowledgeBaseMcpToolName } from './thorbit-kb-mcp-tool-names.js'\n\nfunction summarizeResult(toolName: ThorbitKnowledgeBaseMcpToolName, result: unknown): string {\n if (toolName === 'thorbit_kb_create' && result && typeof result === 'object' && 'knowledgeBase' in result) {\n const kb = result.knowledgeBase as { name?: unknown; publicId?: unknown }\n return `Created Thorbit knowledge base ${String(kb.name ?? kb.publicId ?? '')}.`\n }\n if (toolName === 'thorbit_kb_list' && result && typeof result === 'object' && 'knowledgeBases' in result) {\n const count = Array.isArray(result.knowledgeBases) ? result.knowledgeBases.length : 0\n return `Found ${count} Thorbit knowledge base${count === 1 ? '' : 's'}.`\n }\n if (toolName.startsWith('thorbit_kb_ingest')) return 'Knowledge-base ingestion completed. Check structuredContent for source receipts.'\n if (toolName === 'thorbit_kb_source_status') return 'Source status returned. Check structuredContent for details.'\n if (toolName === 'thorbit_kb_search') return 'Knowledge-base search completed. Check structuredContent for results and citations.'\n if (toolName === 'thorbit_kb_ask') return 'Knowledge-base answer generated. Check structuredContent for citations and strategy.'\n return 'Thorbit knowledge-base tool completed.'\n}\n\nexport function formatThorbitKbMcpToolResult(\n toolName: ThorbitKnowledgeBaseMcpToolName,\n envelope: ThorbitKnowledgeBaseMcpEnvelope,\n): CallToolResult {\n if (!envelope.ok) {\n return {\n isError: true,\n content: [{\n type: 'text',\n text: `${envelope.error.code}: ${envelope.error.message}`,\n }],\n structuredContent: envelope,\n }\n }\n\n return {\n content: [{\n type: 'text',\n text: summarizeResult(toolName, envelope.result),\n }],\n structuredContent: envelope.result as Record<string, unknown>,\n }\n}\n","import { z } from 'zod'\n\nconst MetadataSchema = z.record(z.string(), z.unknown())\n\nexport const ThorbitKbCreateInputSchema = {\n name: z.string().min(1).max(255).describe('Name for the new Thorbit knowledge base.'),\n description: z.string().max(2000).optional().describe('Optional description for the new knowledge base.'),\n projectPublicId: z.string().min(1).optional().describe('Optional Thorbit project public ID. Omit to create an org-level knowledge base.'),\n folder: z.string().min(1).max(128).optional().describe('Optional organizational folder, such as research or domains.'),\n}\n\nexport const ThorbitKbListInputSchema = {\n projectPublicId: z.string().min(1).optional().describe('Optional Thorbit project public ID used to narrow knowledge-base listing.'),\n includeGlobal: z.boolean().default(true).describe('Include org-level/global knowledge bases. Default true.'),\n limit: z.number().int().min(1).max(100).default(50).describe('Maximum knowledge bases to return.'),\n}\n\nexport const ThorbitKbSourceStatusInputSchema = {\n sourcePublicIds: z.array(z.string().min(1)).min(1).max(100).describe('Source public IDs returned by Thorbit KB ingestion tools.'),\n}\n\nexport const ThorbitKbIngestUrlInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n url: z.string().url().describe('Public URL to extract through MCP Scraper and ingest into Thorbit.'),\n title: z.string().min(1).max(512).optional().describe('Optional title override. Provider title is used when omitted.'),\n mode: z.enum(['append']).default('append').describe('Append a new source version. Refresh mode is intentionally not enabled in V1.'),\n maxCharacters: z.number().int().min(500).max(500000).optional().describe('Optional cap before chunking/vectorization.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on the KB source.'),\n}\n\nexport const ThorbitKbIngestSiteInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n startUrl: z.string().url().describe('Website start URL. Thorbit maps URLs through MCP Scraper, then ingests selected pages.'),\n includePatterns: z.array(z.string().min(1)).max(20).optional().describe('Optional regex or substring patterns that a mapped URL must match.'),\n excludePatterns: z.array(z.string().min(1)).max(20).optional().describe('Optional regex or substring patterns that remove mapped URLs.'),\n maxPages: z.number().int().min(1).max(100).default(25).describe('Maximum pages to ingest. Default 25, hard cap 100.'),\n mode: z.enum(['append']).default('append').describe('Append source versions. Refresh mode is intentionally not enabled in V1.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on each KB source.'),\n}\n\nexport const ThorbitKbIngestYoutubeInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n videoUrl: z.string().url().describe('YouTube video URL. Thorbit transcribes through MCP Scraper and vectorizes transcript chunks.'),\n title: z.string().min(1).max(512).optional().describe('Optional title override.'),\n mode: z.enum(['append']).default('append').describe('Append a new source version.'),\n preserveTimestamps: z.boolean().default(true).describe('Store transcript timestamps on chunks when MCP Scraper returns them.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on the KB source.'),\n}\n\nexport const ThorbitKbIngestTextInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n title: z.string().min(1).max(512).describe('Source title shown in KB citations.'),\n content: z.string().min(1).max(500000).describe('Text or Markdown to chunk, embed, and ingest.'),\n sourceUrl: z.string().url().optional().describe('Optional canonical source URL for citations.'),\n sourceType: z.enum(['manual', 'note', 'markdown']).default('manual').describe('Caller-facing source type. Thorbit stores note/markdown as manual sources in V1.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on the KB source.'),\n}\n\nexport const ThorbitKbSearchInputSchema = {\n query: z.string().min(1).max(4000).describe('Search query. Use the user question or a focused retrieval query.'),\n knowledgeBasePublicId: z.string().min(1).optional().describe('Optional target KB. Omit to search visible KBs.'),\n projectPublicId: z.string().min(1).optional().describe('Optional project scope when no KB is specified.'),\n limit: z.number().int().min(1).max(20).default(5).describe('Maximum chunks to return.'),\n includeEntities: z.boolean().default(false).describe('Reserved for entity-rich responses.'),\n searchMode: z.enum(['smart', 'hybrid']).default('smart').describe('smart uses Thorbit intent/rerank retrieval; hybrid uses ANN plus FTS.'),\n}\n\nexport const ThorbitKbAskInputSchema = {\n question: z.string().min(1).max(8000).describe('Question to answer using Thorbit KB context only.'),\n knowledgeBasePublicId: z.string().min(1).optional().describe('Optional target KB. Omit to answer over visible KBs.'),\n projectPublicId: z.string().min(1).optional().describe('Optional project scope when no KB is specified.'),\n answerStyle: z.enum(['concise', 'detailed', 'extractive']).default('concise').describe('Use extractive to return source excerpts without an LLM answer.'),\n limit: z.number().int().min(1).max(20).default(8).describe('Maximum retrieved chunks used for the answer.'),\n requireCitations: z.boolean().default(true).describe('Keep true for grounded answers with citation arrays.'),\n}\n\nexport const ThorbitKnowledgeBaseMcpToolInputSchemas = {\n thorbit_kb_create: ThorbitKbCreateInputSchema,\n thorbit_kb_list: ThorbitKbListInputSchema,\n thorbit_kb_source_status: ThorbitKbSourceStatusInputSchema,\n thorbit_kb_ingest_url: ThorbitKbIngestUrlInputSchema,\n thorbit_kb_ingest_site: ThorbitKbIngestSiteInputSchema,\n thorbit_kb_ingest_youtube: ThorbitKbIngestYoutubeInputSchema,\n thorbit_kb_ingest_text: ThorbitKbIngestTextInputSchema,\n thorbit_kb_search: ThorbitKbSearchInputSchema,\n thorbit_kb_ask: ThorbitKbAskInputSchema,\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../bin/thorbit-kb-mcp.ts","../../src/thorbit-kb-api-client.ts","../../src/thorbit-kb-mcp-env.ts","../../src/thorbit-kb-mcp-server.ts","../../src/thorbit-kb-mcp-response-formatters.ts","../../src/thorbit-kb-mcp-tool-schemas.ts"],"sourcesContent":["import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { ThorbitKnowledgeBaseApiClient } from '../src/thorbit-kb-api-client.js'\nimport { resolveThorbitKbMcpEnv } from '../src/thorbit-kb-mcp-env.js'\nimport { buildThorbitKnowledgeBaseMcpServer } from '../src/thorbit-kb-mcp-server.js'\n\nasync function main() {\n const env = resolveThorbitKbMcpEnv()\n const client = new ThorbitKnowledgeBaseApiClient(env)\n const server = buildThorbitKnowledgeBaseMcpServer(client)\n await server.connect(new StdioServerTransport())\n}\n\nmain().catch(error => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`)\n process.exit(1)\n})\n","import type { ThorbitKnowledgeBaseMcpToolName } from './thorbit-kb-mcp-tool-names.js'\n\nexport type ThorbitKnowledgeBaseMcpEnvelope =\n | {\n ok: true\n result: unknown\n warnings?: string[]\n requestId: string\n usage?: Record<string, unknown>\n }\n | {\n ok: false\n error: {\n code: string\n message: string\n details?: unknown\n }\n requestId: string\n }\n\nexport class ThorbitKnowledgeBaseApiClient {\n private readonly baseUrl: string\n private readonly apiKey: string\n\n constructor(options: { baseUrl: string; apiKey: string }) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, '')\n this.apiKey = options.apiKey\n }\n\n async callTool(toolName: ThorbitKnowledgeBaseMcpToolName, input: unknown): Promise<ThorbitKnowledgeBaseMcpEnvelope> {\n const response = await fetch(`${this.baseUrl}/api/v1/mcp/knowledge-base/${toolName}`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(input ?? {}),\n })\n\n const body = await response.json().catch(() => null) as ThorbitKnowledgeBaseMcpEnvelope | null\n if (body && typeof body === 'object' && 'ok' in body) return body\n\n return {\n ok: false,\n requestId: 'unavailable',\n error: {\n code: response.ok ? 'invalid_response' : `http_${response.status}`,\n message: response.ok ? 'Thorbit returned an invalid MCP response' : `Thorbit API request failed with HTTP ${response.status}`,\n },\n }\n }\n}\n\n","import { readFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\n\nexport type ThorbitKbMcpEnv = {\n apiKey: string\n baseUrl: string\n}\n\nfunction readApiKeyFile(): string | undefined {\n const explicitPath = process.env.THORBIT_KB_MCP_KEY_PATH?.trim()\n const paths = [explicitPath, join(homedir(), '.thorbit-kb-mcp-key')].filter(Boolean) as string[]\n for (const path of paths) {\n try {\n const value = readFileSync(path, 'utf8').trim()\n if (value) return value\n } catch {\n continue\n }\n }\n return undefined\n}\n\nexport function resolveThorbitKbMcpEnv(): ThorbitKbMcpEnv {\n const apiKey = (\n process.env.THORBIT_API_KEY ||\n process.env.THORBIT_MCP_API_KEY ||\n process.env.THORBIT_KB_MCP_API_KEY ||\n readApiKeyFile()\n )?.trim()\n\n if (!apiKey) {\n throw new Error('THORBIT_API_KEY, THORBIT_MCP_API_KEY, or ~/.thorbit-kb-mcp-key is required')\n }\n\n return {\n apiKey,\n baseUrl: (process.env.THORBIT_BASE_URL || process.env.THORBIT_KB_MCP_BASE_URL || 'https://thorbit.ai').trim(),\n }\n}\n","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { ToolAnnotations } from '@modelcontextprotocol/sdk/types.js'\nimport type { ZodRawShape } from 'zod'\nimport type { ThorbitKnowledgeBaseApiClient } from './thorbit-kb-api-client.js'\nimport { formatThorbitKbMcpToolResult } from './thorbit-kb-mcp-response-formatters.js'\nimport {\n ThorbitKbAskInputSchema,\n ThorbitKbCreateInputSchema,\n ThorbitKbIngestSiteInputSchema,\n ThorbitKbIngestTextInputSchema,\n ThorbitKbIngestUrlInputSchema,\n ThorbitKbIngestYoutubeInputSchema,\n ThorbitKbListInputSchema,\n ThorbitKbSearchInputSchema,\n ThorbitKbSourceStatusInputSchema,\n} from './thorbit-kb-mcp-tool-schemas.js'\nimport type { ThorbitKnowledgeBaseMcpToolName } from './thorbit-kb-mcp-tool-names.js'\n\nconst VERSION = '0.2.5'\n\ntype ThorbitKbToolConfig<InputArgs extends ZodRawShape> = {\n title: string\n description: string\n inputSchema: InputArgs\n annotations: ToolAnnotations\n}\n\nfunction readOnlyAnnotations(title: string, idempotent = true) {\n return {\n title,\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: idempotent,\n openWorldHint: false,\n }\n}\n\nfunction ingestAnnotations(title: string, openWorldHint: boolean) {\n return {\n title,\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint,\n }\n}\n\nexport function buildThorbitKnowledgeBaseMcpServer(client: ThorbitKnowledgeBaseApiClient): McpServer {\n const server = new McpServer({ name: 'thorbit-kb-mcp', version: VERSION })\n\n server.registerResource(\n 'knowledge-bases',\n 'thorbit-kb://knowledge-bases',\n {\n title: 'Thorbit Knowledge Bases',\n description: 'Knowledge bases visible to this Thorbit MCP API key.',\n mimeType: 'application/json',\n },\n async (uri) => {\n const envelope = await client.callTool('thorbit_kb_list', {})\n return { contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify(envelope, null, 2) }] }\n },\n )\n\n server.registerResource(\n 'source-status',\n new ResourceTemplate('thorbit-kb://sources/{sourcePublicId}', { list: undefined }),\n {\n title: 'Thorbit KB Source Status',\n description: 'Status and metadata for one Thorbit knowledge-base source.',\n mimeType: 'application/json',\n },\n async (uri, variables) => {\n const sourcePublicId = Array.isArray(variables.sourcePublicId) ? variables.sourcePublicId[0] : variables.sourcePublicId\n const envelope = await client.callTool('thorbit_kb_source_status', { sourcePublicIds: [String(sourcePublicId)] })\n return { contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify(envelope, null, 2) }] }\n },\n )\n\n function registerTool<T extends ThorbitKnowledgeBaseMcpToolName>(\n toolName: T,\n config: ThorbitKbToolConfig<ZodRawShape>,\n ): void {\n server.registerTool(toolName, config, async (input) => {\n const envelope = await client.callTool(toolName, input)\n return formatThorbitKbMcpToolResult(toolName, envelope)\n })\n }\n\n registerTool('thorbit_kb_create', {\n title: 'Create Thorbit Knowledge Base',\n description: 'Create a new Thorbit vector-backed knowledge base for MCP ingestion, smart RAG search, citations, and entity extraction.',\n inputSchema: ThorbitKbCreateInputSchema,\n annotations: ingestAnnotations('Create Thorbit Knowledge Base', false),\n })\n\n registerTool('thorbit_kb_list', {\n title: 'List Thorbit Knowledge Bases',\n description: 'List Thorbit knowledge bases visible to this API key. Use before ingestion/search when the target KB public ID is unknown.',\n inputSchema: ThorbitKbListInputSchema,\n annotations: readOnlyAnnotations('List Thorbit Knowledge Bases'),\n })\n\n registerTool('thorbit_kb_source_status', {\n title: 'Read Thorbit KB Source Status',\n description: 'Poll ingestion status for source public IDs returned by Thorbit KB ingestion tools.',\n inputSchema: ThorbitKbSourceStatusInputSchema,\n annotations: readOnlyAnnotations('Read Thorbit KB Source Status'),\n })\n\n registerTool('thorbit_kb_ingest_url', {\n title: 'Ingest URL Into Thorbit KB',\n description: 'Extract one public URL through MCP Scraper, clean the content, submit it to Thorbit, and vectorize it into the selected knowledge base.',\n inputSchema: ThorbitKbIngestUrlInputSchema,\n annotations: ingestAnnotations('Ingest URL Into Thorbit KB', true),\n })\n\n registerTool('thorbit_kb_ingest_site', {\n title: 'Ingest Website Into Thorbit KB',\n description: 'Map a website through MCP Scraper, extract selected pages, submit each page to Thorbit, and vectorize them into the selected knowledge base.',\n inputSchema: ThorbitKbIngestSiteInputSchema,\n annotations: ingestAnnotations('Ingest Website Into Thorbit KB', true),\n })\n\n registerTool('thorbit_kb_ingest_youtube', {\n title: 'Ingest YouTube Into Thorbit KB',\n description: 'Transcribe a YouTube video through MCP Scraper, preserve timestamp chunks when available, and vectorize the transcript into Thorbit KB.',\n inputSchema: ThorbitKbIngestYoutubeInputSchema,\n annotations: ingestAnnotations('Ingest YouTube Into Thorbit KB', true),\n })\n\n registerTool('thorbit_kb_ingest_text', {\n title: 'Ingest Text Into Thorbit KB',\n description: 'Submit provided text or Markdown directly to Thorbit and vectorize it into the selected knowledge base.',\n inputSchema: ThorbitKbIngestTextInputSchema,\n annotations: ingestAnnotations('Ingest Text Into Thorbit KB', false),\n })\n\n registerTool('thorbit_kb_search', {\n title: 'Search Thorbit Knowledge Base',\n description: 'Search Thorbit KB content with citation-ready chunks. Use when the user needs source-backed snippets or evidence.',\n inputSchema: ThorbitKbSearchInputSchema,\n annotations: readOnlyAnnotations('Search Thorbit Knowledge Base'),\n })\n\n registerTool('thorbit_kb_ask', {\n title: 'Ask Thorbit Knowledge Base',\n description: 'Answer a question using only retrieved Thorbit KB context. Returns answer, citations, sufficiency, and retrieval strategy metadata.',\n inputSchema: ThorbitKbAskInputSchema,\n annotations: readOnlyAnnotations('Ask Thorbit Knowledge Base', false),\n })\n\n return server\n}\n","import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js'\nimport type { ThorbitKnowledgeBaseMcpEnvelope } from './thorbit-kb-api-client.js'\nimport type { ThorbitKnowledgeBaseMcpToolName } from './thorbit-kb-mcp-tool-names.js'\n\nfunction summarizeResult(toolName: ThorbitKnowledgeBaseMcpToolName, result: unknown): string {\n if (toolName === 'thorbit_kb_create' && result && typeof result === 'object' && 'knowledgeBase' in result) {\n const kb = result.knowledgeBase as { name?: unknown; publicId?: unknown }\n return `Created Thorbit knowledge base ${String(kb.name ?? kb.publicId ?? '')}.`\n }\n if (toolName === 'thorbit_kb_list' && result && typeof result === 'object' && 'knowledgeBases' in result) {\n const count = Array.isArray(result.knowledgeBases) ? result.knowledgeBases.length : 0\n return `Found ${count} Thorbit knowledge base${count === 1 ? '' : 's'}.`\n }\n if (toolName.startsWith('thorbit_kb_ingest')) return 'Knowledge-base ingestion completed. Check structuredContent for source receipts.'\n if (toolName === 'thorbit_kb_source_status') return 'Source status returned. Check structuredContent for details.'\n if (toolName === 'thorbit_kb_search') return 'Knowledge-base search completed. Check structuredContent for results and citations.'\n if (toolName === 'thorbit_kb_ask') return 'Knowledge-base answer generated. Check structuredContent for citations and strategy.'\n return 'Thorbit knowledge-base tool completed.'\n}\n\nexport function formatThorbitKbMcpToolResult(\n toolName: ThorbitKnowledgeBaseMcpToolName,\n envelope: ThorbitKnowledgeBaseMcpEnvelope,\n): CallToolResult {\n if (!envelope.ok) {\n return {\n isError: true,\n content: [{\n type: 'text',\n text: `${envelope.error.code}: ${envelope.error.message}`,\n }],\n structuredContent: envelope,\n }\n }\n\n return {\n content: [{\n type: 'text',\n text: summarizeResult(toolName, envelope.result),\n }],\n structuredContent: envelope.result as Record<string, unknown>,\n }\n}\n","import { z } from 'zod'\n\nconst MetadataSchema = z.record(z.string(), z.unknown())\n\nexport const ThorbitKbCreateInputSchema = {\n name: z.string().min(1).max(255).describe('Name for the new Thorbit knowledge base.'),\n description: z.string().max(2000).optional().describe('Optional description for the new knowledge base.'),\n projectPublicId: z.string().min(1).optional().describe('Optional Thorbit project public ID. Omit to create an org-level knowledge base.'),\n folder: z.string().min(1).max(128).optional().describe('Optional organizational folder, such as research or domains.'),\n}\n\nexport const ThorbitKbListInputSchema = {\n projectPublicId: z.string().min(1).optional().describe('Optional Thorbit project public ID used to narrow knowledge-base listing.'),\n includeGlobal: z.boolean().default(true).describe('Include org-level/global knowledge bases. Default true.'),\n limit: z.number().int().min(1).max(100).default(50).describe('Maximum knowledge bases to return.'),\n}\n\nexport const ThorbitKbSourceStatusInputSchema = {\n sourcePublicIds: z.array(z.string().min(1)).min(1).max(100).describe('Source public IDs returned by Thorbit KB ingestion tools.'),\n}\n\nexport const ThorbitKbIngestUrlInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n url: z.string().url().describe('Public URL to extract through MCP Scraper and ingest into Thorbit.'),\n title: z.string().min(1).max(512).optional().describe('Optional title override. Provider title is used when omitted.'),\n mode: z.enum(['append']).default('append').describe('Append a new source version. Refresh mode is intentionally not enabled in V1.'),\n maxCharacters: z.number().int().min(500).max(500000).optional().describe('Optional cap before chunking/vectorization.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on the KB source.'),\n}\n\nexport const ThorbitKbIngestSiteInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n startUrl: z.string().url().describe('Website start URL. Thorbit maps URLs through MCP Scraper, then ingests selected pages.'),\n includePatterns: z.array(z.string().min(1)).max(20).optional().describe('Optional regex or substring patterns that a mapped URL must match.'),\n excludePatterns: z.array(z.string().min(1)).max(20).optional().describe('Optional regex or substring patterns that remove mapped URLs.'),\n maxPages: z.number().int().min(1).max(100).default(25).describe('Maximum pages to ingest. Default 25, hard cap 100.'),\n mode: z.enum(['append']).default('append').describe('Append source versions. Refresh mode is intentionally not enabled in V1.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on each KB source.'),\n}\n\nexport const ThorbitKbIngestYoutubeInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n videoUrl: z.string().url().describe('YouTube video URL. Thorbit transcribes through MCP Scraper and vectorizes transcript chunks.'),\n title: z.string().min(1).max(512).optional().describe('Optional title override.'),\n mode: z.enum(['append']).default('append').describe('Append a new source version.'),\n preserveTimestamps: z.boolean().default(true).describe('Store transcript timestamps on chunks when MCP Scraper returns them.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on the KB source.'),\n}\n\nexport const ThorbitKbIngestTextInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n title: z.string().min(1).max(512).describe('Source title shown in KB citations.'),\n content: z.string().min(1).max(500000).describe('Text or Markdown to chunk, embed, and ingest.'),\n sourceUrl: z.string().url().optional().describe('Optional canonical source URL for citations.'),\n sourceType: z.enum(['manual', 'note', 'markdown']).default('manual').describe('Caller-facing source type. Thorbit stores note/markdown as manual sources in V1.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on the KB source.'),\n}\n\nexport const ThorbitKbSearchInputSchema = {\n query: z.string().min(1).max(4000).describe('Search query. Use the user question or a focused retrieval query.'),\n knowledgeBasePublicId: z.string().min(1).optional().describe('Optional target KB. Omit to search visible KBs.'),\n projectPublicId: z.string().min(1).optional().describe('Optional project scope when no KB is specified.'),\n limit: z.number().int().min(1).max(20).default(5).describe('Maximum chunks to return.'),\n includeEntities: z.boolean().default(false).describe('Reserved for entity-rich responses.'),\n searchMode: z.enum(['smart', 'hybrid']).default('smart').describe('smart uses Thorbit intent/rerank retrieval; hybrid uses ANN plus FTS.'),\n}\n\nexport const ThorbitKbAskInputSchema = {\n question: z.string().min(1).max(8000).describe('Question to answer using Thorbit KB context only.'),\n knowledgeBasePublicId: z.string().min(1).optional().describe('Optional target KB. Omit to answer over visible KBs.'),\n projectPublicId: z.string().min(1).optional().describe('Optional project scope when no KB is specified.'),\n answerStyle: z.enum(['concise', 'detailed', 'extractive']).default('concise').describe('Use extractive to return source excerpts without an LLM answer.'),\n limit: z.number().int().min(1).max(20).default(8).describe('Maximum retrieved chunks used for the answer.'),\n requireCitations: z.boolean().default(true).describe('Keep true for grounded answers with citation arrays.'),\n}\n\nexport const ThorbitKnowledgeBaseMcpToolInputSchemas = {\n thorbit_kb_create: ThorbitKbCreateInputSchema,\n thorbit_kb_list: ThorbitKbListInputSchema,\n thorbit_kb_source_status: ThorbitKbSourceStatusInputSchema,\n thorbit_kb_ingest_url: ThorbitKbIngestUrlInputSchema,\n thorbit_kb_ingest_site: ThorbitKbIngestSiteInputSchema,\n thorbit_kb_ingest_youtube: ThorbitKbIngestYoutubeInputSchema,\n thorbit_kb_ingest_text: ThorbitKbIngestTextInputSchema,\n thorbit_kb_search: ThorbitKbSearchInputSchema,\n thorbit_kb_ask: ThorbitKbAskInputSchema,\n}\n"],"mappings":"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","names":[]}
package/dist/index.cjs CHANGED
@@ -186,7 +186,7 @@ var ThorbitKnowledgeBaseMcpToolInputSchemas = {
186
186
  };
187
187
 
188
188
  // src/thorbit-kb-mcp-server.ts
189
- var VERSION = "0.2.4";
189
+ var VERSION = "0.2.5";
190
190
  function readOnlyAnnotations(title, idempotent = true) {
191
191
  return {
192
192
  title,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/thorbit-kb-api-client.ts","../src/thorbit-kb-mcp-server.ts","../src/thorbit-kb-mcp-response-formatters.ts","../src/thorbit-kb-mcp-tool-schemas.ts","../src/thorbit-kb-mcp-env.ts","../src/thorbit-kb-mcp-tool-names.ts"],"sourcesContent":["export { ThorbitKnowledgeBaseApiClient } from './thorbit-kb-api-client.js'\nexport { buildThorbitKnowledgeBaseMcpServer } from './thorbit-kb-mcp-server.js'\nexport { resolveThorbitKbMcpEnv } from './thorbit-kb-mcp-env.js'\nexport * from './thorbit-kb-mcp-tool-names.js'\nexport * from './thorbit-kb-mcp-tool-schemas.js'\n\n","import type { ThorbitKnowledgeBaseMcpToolName } from './thorbit-kb-mcp-tool-names.js'\n\nexport type ThorbitKnowledgeBaseMcpEnvelope =\n | {\n ok: true\n result: unknown\n warnings?: string[]\n requestId: string\n usage?: Record<string, unknown>\n }\n | {\n ok: false\n error: {\n code: string\n message: string\n details?: unknown\n }\n requestId: string\n }\n\nexport class ThorbitKnowledgeBaseApiClient {\n private readonly baseUrl: string\n private readonly apiKey: string\n\n constructor(options: { baseUrl: string; apiKey: string }) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, '')\n this.apiKey = options.apiKey\n }\n\n async callTool(toolName: ThorbitKnowledgeBaseMcpToolName, input: unknown): Promise<ThorbitKnowledgeBaseMcpEnvelope> {\n const response = await fetch(`${this.baseUrl}/api/v1/mcp/knowledge-base/${toolName}`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(input ?? {}),\n })\n\n const body = await response.json().catch(() => null) as ThorbitKnowledgeBaseMcpEnvelope | null\n if (body && typeof body === 'object' && 'ok' in body) return body\n\n return {\n ok: false,\n requestId: 'unavailable',\n error: {\n code: response.ok ? 'invalid_response' : `http_${response.status}`,\n message: response.ok ? 'Thorbit returned an invalid MCP response' : `Thorbit API request failed with HTTP ${response.status}`,\n },\n }\n }\n}\n\n","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { ToolAnnotations } from '@modelcontextprotocol/sdk/types.js'\nimport type { ZodRawShape } from 'zod'\nimport type { ThorbitKnowledgeBaseApiClient } from './thorbit-kb-api-client.js'\nimport { formatThorbitKbMcpToolResult } from './thorbit-kb-mcp-response-formatters.js'\nimport {\n ThorbitKbAskInputSchema,\n ThorbitKbCreateInputSchema,\n ThorbitKbIngestSiteInputSchema,\n ThorbitKbIngestTextInputSchema,\n ThorbitKbIngestUrlInputSchema,\n ThorbitKbIngestYoutubeInputSchema,\n ThorbitKbListInputSchema,\n ThorbitKbSearchInputSchema,\n ThorbitKbSourceStatusInputSchema,\n} from './thorbit-kb-mcp-tool-schemas.js'\nimport type { ThorbitKnowledgeBaseMcpToolName } from './thorbit-kb-mcp-tool-names.js'\n\nconst VERSION = '0.2.4'\n\ntype ThorbitKbToolConfig<InputArgs extends ZodRawShape> = {\n title: string\n description: string\n inputSchema: InputArgs\n annotations: ToolAnnotations\n}\n\nfunction readOnlyAnnotations(title: string, idempotent = true) {\n return {\n title,\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: idempotent,\n openWorldHint: false,\n }\n}\n\nfunction ingestAnnotations(title: string, openWorldHint: boolean) {\n return {\n title,\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint,\n }\n}\n\nexport function buildThorbitKnowledgeBaseMcpServer(client: ThorbitKnowledgeBaseApiClient): McpServer {\n const server = new McpServer({ name: 'thorbit-kb-mcp', version: VERSION })\n\n server.registerResource(\n 'knowledge-bases',\n 'thorbit-kb://knowledge-bases',\n {\n title: 'Thorbit Knowledge Bases',\n description: 'Knowledge bases visible to this Thorbit MCP API key.',\n mimeType: 'application/json',\n },\n async (uri) => {\n const envelope = await client.callTool('thorbit_kb_list', {})\n return { contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify(envelope, null, 2) }] }\n },\n )\n\n server.registerResource(\n 'source-status',\n new ResourceTemplate('thorbit-kb://sources/{sourcePublicId}', { list: undefined }),\n {\n title: 'Thorbit KB Source Status',\n description: 'Status and metadata for one Thorbit knowledge-base source.',\n mimeType: 'application/json',\n },\n async (uri, variables) => {\n const sourcePublicId = Array.isArray(variables.sourcePublicId) ? variables.sourcePublicId[0] : variables.sourcePublicId\n const envelope = await client.callTool('thorbit_kb_source_status', { sourcePublicIds: [String(sourcePublicId)] })\n return { contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify(envelope, null, 2) }] }\n },\n )\n\n function registerTool<T extends ThorbitKnowledgeBaseMcpToolName>(\n toolName: T,\n config: ThorbitKbToolConfig<ZodRawShape>,\n ): void {\n server.registerTool(toolName, config, async (input) => {\n const envelope = await client.callTool(toolName, input)\n return formatThorbitKbMcpToolResult(toolName, envelope)\n })\n }\n\n registerTool('thorbit_kb_create', {\n title: 'Create Thorbit Knowledge Base',\n description: 'Create a new Thorbit vector-backed knowledge base for MCP ingestion, smart RAG search, citations, and entity extraction.',\n inputSchema: ThorbitKbCreateInputSchema,\n annotations: ingestAnnotations('Create Thorbit Knowledge Base', false),\n })\n\n registerTool('thorbit_kb_list', {\n title: 'List Thorbit Knowledge Bases',\n description: 'List Thorbit knowledge bases visible to this API key. Use before ingestion/search when the target KB public ID is unknown.',\n inputSchema: ThorbitKbListInputSchema,\n annotations: readOnlyAnnotations('List Thorbit Knowledge Bases'),\n })\n\n registerTool('thorbit_kb_source_status', {\n title: 'Read Thorbit KB Source Status',\n description: 'Poll ingestion status for source public IDs returned by Thorbit KB ingestion tools.',\n inputSchema: ThorbitKbSourceStatusInputSchema,\n annotations: readOnlyAnnotations('Read Thorbit KB Source Status'),\n })\n\n registerTool('thorbit_kb_ingest_url', {\n title: 'Ingest URL Into Thorbit KB',\n description: 'Extract one public URL through MCP Scraper, clean the content, submit it to Thorbit, and vectorize it into the selected knowledge base.',\n inputSchema: ThorbitKbIngestUrlInputSchema,\n annotations: ingestAnnotations('Ingest URL Into Thorbit KB', true),\n })\n\n registerTool('thorbit_kb_ingest_site', {\n title: 'Ingest Website Into Thorbit KB',\n description: 'Map a website through MCP Scraper, extract selected pages, submit each page to Thorbit, and vectorize them into the selected knowledge base.',\n inputSchema: ThorbitKbIngestSiteInputSchema,\n annotations: ingestAnnotations('Ingest Website Into Thorbit KB', true),\n })\n\n registerTool('thorbit_kb_ingest_youtube', {\n title: 'Ingest YouTube Into Thorbit KB',\n description: 'Transcribe a YouTube video through MCP Scraper, preserve timestamp chunks when available, and vectorize the transcript into Thorbit KB.',\n inputSchema: ThorbitKbIngestYoutubeInputSchema,\n annotations: ingestAnnotations('Ingest YouTube Into Thorbit KB', true),\n })\n\n registerTool('thorbit_kb_ingest_text', {\n title: 'Ingest Text Into Thorbit KB',\n description: 'Submit provided text or Markdown directly to Thorbit and vectorize it into the selected knowledge base.',\n inputSchema: ThorbitKbIngestTextInputSchema,\n annotations: ingestAnnotations('Ingest Text Into Thorbit KB', false),\n })\n\n registerTool('thorbit_kb_search', {\n title: 'Search Thorbit Knowledge Base',\n description: 'Search Thorbit KB content with citation-ready chunks. Use when the user needs source-backed snippets or evidence.',\n inputSchema: ThorbitKbSearchInputSchema,\n annotations: readOnlyAnnotations('Search Thorbit Knowledge Base'),\n })\n\n registerTool('thorbit_kb_ask', {\n title: 'Ask Thorbit Knowledge Base',\n description: 'Answer a question using only retrieved Thorbit KB context. Returns answer, citations, sufficiency, and retrieval strategy metadata.',\n inputSchema: ThorbitKbAskInputSchema,\n annotations: readOnlyAnnotations('Ask Thorbit Knowledge Base', false),\n })\n\n return server\n}\n","import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js'\nimport type { ThorbitKnowledgeBaseMcpEnvelope } from './thorbit-kb-api-client.js'\nimport type { ThorbitKnowledgeBaseMcpToolName } from './thorbit-kb-mcp-tool-names.js'\n\nfunction summarizeResult(toolName: ThorbitKnowledgeBaseMcpToolName, result: unknown): string {\n if (toolName === 'thorbit_kb_create' && result && typeof result === 'object' && 'knowledgeBase' in result) {\n const kb = result.knowledgeBase as { name?: unknown; publicId?: unknown }\n return `Created Thorbit knowledge base ${String(kb.name ?? kb.publicId ?? '')}.`\n }\n if (toolName === 'thorbit_kb_list' && result && typeof result === 'object' && 'knowledgeBases' in result) {\n const count = Array.isArray(result.knowledgeBases) ? result.knowledgeBases.length : 0\n return `Found ${count} Thorbit knowledge base${count === 1 ? '' : 's'}.`\n }\n if (toolName.startsWith('thorbit_kb_ingest')) return 'Knowledge-base ingestion completed. Check structuredContent for source receipts.'\n if (toolName === 'thorbit_kb_source_status') return 'Source status returned. Check structuredContent for details.'\n if (toolName === 'thorbit_kb_search') return 'Knowledge-base search completed. Check structuredContent for results and citations.'\n if (toolName === 'thorbit_kb_ask') return 'Knowledge-base answer generated. Check structuredContent for citations and strategy.'\n return 'Thorbit knowledge-base tool completed.'\n}\n\nexport function formatThorbitKbMcpToolResult(\n toolName: ThorbitKnowledgeBaseMcpToolName,\n envelope: ThorbitKnowledgeBaseMcpEnvelope,\n): CallToolResult {\n if (!envelope.ok) {\n return {\n isError: true,\n content: [{\n type: 'text',\n text: `${envelope.error.code}: ${envelope.error.message}`,\n }],\n structuredContent: envelope,\n }\n }\n\n return {\n content: [{\n type: 'text',\n text: summarizeResult(toolName, envelope.result),\n }],\n structuredContent: envelope.result as Record<string, unknown>,\n }\n}\n","import { z } from 'zod'\n\nconst MetadataSchema = z.record(z.string(), z.unknown())\n\nexport const ThorbitKbCreateInputSchema = {\n name: z.string().min(1).max(255).describe('Name for the new Thorbit knowledge base.'),\n description: z.string().max(2000).optional().describe('Optional description for the new knowledge base.'),\n projectPublicId: z.string().min(1).optional().describe('Optional Thorbit project public ID. Omit to create an org-level knowledge base.'),\n folder: z.string().min(1).max(128).optional().describe('Optional organizational folder, such as research or domains.'),\n}\n\nexport const ThorbitKbListInputSchema = {\n projectPublicId: z.string().min(1).optional().describe('Optional Thorbit project public ID used to narrow knowledge-base listing.'),\n includeGlobal: z.boolean().default(true).describe('Include org-level/global knowledge bases. Default true.'),\n limit: z.number().int().min(1).max(100).default(50).describe('Maximum knowledge bases to return.'),\n}\n\nexport const ThorbitKbSourceStatusInputSchema = {\n sourcePublicIds: z.array(z.string().min(1)).min(1).max(100).describe('Source public IDs returned by Thorbit KB ingestion tools.'),\n}\n\nexport const ThorbitKbIngestUrlInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n url: z.string().url().describe('Public URL to extract through MCP Scraper and ingest into Thorbit.'),\n title: z.string().min(1).max(512).optional().describe('Optional title override. Provider title is used when omitted.'),\n mode: z.enum(['append']).default('append').describe('Append a new source version. Refresh mode is intentionally not enabled in V1.'),\n maxCharacters: z.number().int().min(500).max(500000).optional().describe('Optional cap before chunking/vectorization.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on the KB source.'),\n}\n\nexport const ThorbitKbIngestSiteInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n startUrl: z.string().url().describe('Website start URL. Thorbit maps URLs through MCP Scraper, then ingests selected pages.'),\n includePatterns: z.array(z.string().min(1)).max(20).optional().describe('Optional regex or substring patterns that a mapped URL must match.'),\n excludePatterns: z.array(z.string().min(1)).max(20).optional().describe('Optional regex or substring patterns that remove mapped URLs.'),\n maxPages: z.number().int().min(1).max(100).default(25).describe('Maximum pages to ingest. Default 25, hard cap 100.'),\n mode: z.enum(['append']).default('append').describe('Append source versions. Refresh mode is intentionally not enabled in V1.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on each KB source.'),\n}\n\nexport const ThorbitKbIngestYoutubeInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n videoUrl: z.string().url().describe('YouTube video URL. Thorbit transcribes through MCP Scraper and vectorizes transcript chunks.'),\n title: z.string().min(1).max(512).optional().describe('Optional title override.'),\n mode: z.enum(['append']).default('append').describe('Append a new source version.'),\n preserveTimestamps: z.boolean().default(true).describe('Store transcript timestamps on chunks when MCP Scraper returns them.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on the KB source.'),\n}\n\nexport const ThorbitKbIngestTextInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n title: z.string().min(1).max(512).describe('Source title shown in KB citations.'),\n content: z.string().min(1).max(500000).describe('Text or Markdown to chunk, embed, and ingest.'),\n sourceUrl: z.string().url().optional().describe('Optional canonical source URL for citations.'),\n sourceType: z.enum(['manual', 'note', 'markdown']).default('manual').describe('Caller-facing source type. Thorbit stores note/markdown as manual sources in V1.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on the KB source.'),\n}\n\nexport const ThorbitKbSearchInputSchema = {\n query: z.string().min(1).max(4000).describe('Search query. Use the user question or a focused retrieval query.'),\n knowledgeBasePublicId: z.string().min(1).optional().describe('Optional target KB. Omit to search visible KBs.'),\n projectPublicId: z.string().min(1).optional().describe('Optional project scope when no KB is specified.'),\n limit: z.number().int().min(1).max(20).default(5).describe('Maximum chunks to return.'),\n includeEntities: z.boolean().default(false).describe('Reserved for entity-rich responses.'),\n searchMode: z.enum(['smart', 'hybrid']).default('smart').describe('smart uses Thorbit intent/rerank retrieval; hybrid uses ANN plus FTS.'),\n}\n\nexport const ThorbitKbAskInputSchema = {\n question: z.string().min(1).max(8000).describe('Question to answer using Thorbit KB context only.'),\n knowledgeBasePublicId: z.string().min(1).optional().describe('Optional target KB. Omit to answer over visible KBs.'),\n projectPublicId: z.string().min(1).optional().describe('Optional project scope when no KB is specified.'),\n answerStyle: z.enum(['concise', 'detailed', 'extractive']).default('concise').describe('Use extractive to return source excerpts without an LLM answer.'),\n limit: z.number().int().min(1).max(20).default(8).describe('Maximum retrieved chunks used for the answer.'),\n requireCitations: z.boolean().default(true).describe('Keep true for grounded answers with citation arrays.'),\n}\n\nexport const ThorbitKnowledgeBaseMcpToolInputSchemas = {\n thorbit_kb_create: ThorbitKbCreateInputSchema,\n thorbit_kb_list: ThorbitKbListInputSchema,\n thorbit_kb_source_status: ThorbitKbSourceStatusInputSchema,\n thorbit_kb_ingest_url: ThorbitKbIngestUrlInputSchema,\n thorbit_kb_ingest_site: ThorbitKbIngestSiteInputSchema,\n thorbit_kb_ingest_youtube: ThorbitKbIngestYoutubeInputSchema,\n thorbit_kb_ingest_text: ThorbitKbIngestTextInputSchema,\n thorbit_kb_search: ThorbitKbSearchInputSchema,\n thorbit_kb_ask: ThorbitKbAskInputSchema,\n}\n","import { readFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\n\nexport type ThorbitKbMcpEnv = {\n apiKey: string\n baseUrl: string\n}\n\nfunction readApiKeyFile(): string | undefined {\n const explicitPath = process.env.THORBIT_KB_MCP_KEY_PATH?.trim()\n const paths = [explicitPath, join(homedir(), '.thorbit-kb-mcp-key')].filter(Boolean) as string[]\n for (const path of paths) {\n try {\n const value = readFileSync(path, 'utf8').trim()\n if (value) return value\n } catch {\n continue\n }\n }\n return undefined\n}\n\nexport function resolveThorbitKbMcpEnv(): ThorbitKbMcpEnv {\n const apiKey = (\n process.env.THORBIT_API_KEY ||\n process.env.THORBIT_MCP_API_KEY ||\n process.env.THORBIT_KB_MCP_API_KEY ||\n readApiKeyFile()\n )?.trim()\n\n if (!apiKey) {\n throw new Error('THORBIT_API_KEY, THORBIT_MCP_API_KEY, or ~/.thorbit-kb-mcp-key is required')\n }\n\n return {\n apiKey,\n baseUrl: (process.env.THORBIT_BASE_URL || process.env.THORBIT_KB_MCP_BASE_URL || 'https://thorbit.ai').trim(),\n }\n}\n","export const ThorbitKnowledgeBaseMcpToolNames = [\n 'thorbit_kb_create',\n 'thorbit_kb_list',\n 'thorbit_kb_source_status',\n 'thorbit_kb_ingest_url',\n 'thorbit_kb_ingest_site',\n 'thorbit_kb_ingest_youtube',\n 'thorbit_kb_ingest_text',\n 'thorbit_kb_search',\n 'thorbit_kb_ask',\n] as const\n\nexport type ThorbitKnowledgeBaseMcpToolName = typeof ThorbitKnowledgeBaseMcpToolNames[number]\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/thorbit-kb-api-client.ts","../src/thorbit-kb-mcp-server.ts","../src/thorbit-kb-mcp-response-formatters.ts","../src/thorbit-kb-mcp-tool-schemas.ts","../src/thorbit-kb-mcp-env.ts","../src/thorbit-kb-mcp-tool-names.ts"],"sourcesContent":["export { ThorbitKnowledgeBaseApiClient } from './thorbit-kb-api-client.js'\nexport { buildThorbitKnowledgeBaseMcpServer } from './thorbit-kb-mcp-server.js'\nexport { resolveThorbitKbMcpEnv } from './thorbit-kb-mcp-env.js'\nexport * from './thorbit-kb-mcp-tool-names.js'\nexport * from './thorbit-kb-mcp-tool-schemas.js'\n\n","import type { ThorbitKnowledgeBaseMcpToolName } from './thorbit-kb-mcp-tool-names.js'\n\nexport type ThorbitKnowledgeBaseMcpEnvelope =\n | {\n ok: true\n result: unknown\n warnings?: string[]\n requestId: string\n usage?: Record<string, unknown>\n }\n | {\n ok: false\n error: {\n code: string\n message: string\n details?: unknown\n }\n requestId: string\n }\n\nexport class ThorbitKnowledgeBaseApiClient {\n private readonly baseUrl: string\n private readonly apiKey: string\n\n constructor(options: { baseUrl: string; apiKey: string }) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, '')\n this.apiKey = options.apiKey\n }\n\n async callTool(toolName: ThorbitKnowledgeBaseMcpToolName, input: unknown): Promise<ThorbitKnowledgeBaseMcpEnvelope> {\n const response = await fetch(`${this.baseUrl}/api/v1/mcp/knowledge-base/${toolName}`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(input ?? {}),\n })\n\n const body = await response.json().catch(() => null) as ThorbitKnowledgeBaseMcpEnvelope | null\n if (body && typeof body === 'object' && 'ok' in body) return body\n\n return {\n ok: false,\n requestId: 'unavailable',\n error: {\n code: response.ok ? 'invalid_response' : `http_${response.status}`,\n message: response.ok ? 'Thorbit returned an invalid MCP response' : `Thorbit API request failed with HTTP ${response.status}`,\n },\n }\n }\n}\n\n","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { ToolAnnotations } from '@modelcontextprotocol/sdk/types.js'\nimport type { ZodRawShape } from 'zod'\nimport type { ThorbitKnowledgeBaseApiClient } from './thorbit-kb-api-client.js'\nimport { formatThorbitKbMcpToolResult } from './thorbit-kb-mcp-response-formatters.js'\nimport {\n ThorbitKbAskInputSchema,\n ThorbitKbCreateInputSchema,\n ThorbitKbIngestSiteInputSchema,\n ThorbitKbIngestTextInputSchema,\n ThorbitKbIngestUrlInputSchema,\n ThorbitKbIngestYoutubeInputSchema,\n ThorbitKbListInputSchema,\n ThorbitKbSearchInputSchema,\n ThorbitKbSourceStatusInputSchema,\n} from './thorbit-kb-mcp-tool-schemas.js'\nimport type { ThorbitKnowledgeBaseMcpToolName } from './thorbit-kb-mcp-tool-names.js'\n\nconst VERSION = '0.2.5'\n\ntype ThorbitKbToolConfig<InputArgs extends ZodRawShape> = {\n title: string\n description: string\n inputSchema: InputArgs\n annotations: ToolAnnotations\n}\n\nfunction readOnlyAnnotations(title: string, idempotent = true) {\n return {\n title,\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: idempotent,\n openWorldHint: false,\n }\n}\n\nfunction ingestAnnotations(title: string, openWorldHint: boolean) {\n return {\n title,\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint,\n }\n}\n\nexport function buildThorbitKnowledgeBaseMcpServer(client: ThorbitKnowledgeBaseApiClient): McpServer {\n const server = new McpServer({ name: 'thorbit-kb-mcp', version: VERSION })\n\n server.registerResource(\n 'knowledge-bases',\n 'thorbit-kb://knowledge-bases',\n {\n title: 'Thorbit Knowledge Bases',\n description: 'Knowledge bases visible to this Thorbit MCP API key.',\n mimeType: 'application/json',\n },\n async (uri) => {\n const envelope = await client.callTool('thorbit_kb_list', {})\n return { contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify(envelope, null, 2) }] }\n },\n )\n\n server.registerResource(\n 'source-status',\n new ResourceTemplate('thorbit-kb://sources/{sourcePublicId}', { list: undefined }),\n {\n title: 'Thorbit KB Source Status',\n description: 'Status and metadata for one Thorbit knowledge-base source.',\n mimeType: 'application/json',\n },\n async (uri, variables) => {\n const sourcePublicId = Array.isArray(variables.sourcePublicId) ? variables.sourcePublicId[0] : variables.sourcePublicId\n const envelope = await client.callTool('thorbit_kb_source_status', { sourcePublicIds: [String(sourcePublicId)] })\n return { contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify(envelope, null, 2) }] }\n },\n )\n\n function registerTool<T extends ThorbitKnowledgeBaseMcpToolName>(\n toolName: T,\n config: ThorbitKbToolConfig<ZodRawShape>,\n ): void {\n server.registerTool(toolName, config, async (input) => {\n const envelope = await client.callTool(toolName, input)\n return formatThorbitKbMcpToolResult(toolName, envelope)\n })\n }\n\n registerTool('thorbit_kb_create', {\n title: 'Create Thorbit Knowledge Base',\n description: 'Create a new Thorbit vector-backed knowledge base for MCP ingestion, smart RAG search, citations, and entity extraction.',\n inputSchema: ThorbitKbCreateInputSchema,\n annotations: ingestAnnotations('Create Thorbit Knowledge Base', false),\n })\n\n registerTool('thorbit_kb_list', {\n title: 'List Thorbit Knowledge Bases',\n description: 'List Thorbit knowledge bases visible to this API key. Use before ingestion/search when the target KB public ID is unknown.',\n inputSchema: ThorbitKbListInputSchema,\n annotations: readOnlyAnnotations('List Thorbit Knowledge Bases'),\n })\n\n registerTool('thorbit_kb_source_status', {\n title: 'Read Thorbit KB Source Status',\n description: 'Poll ingestion status for source public IDs returned by Thorbit KB ingestion tools.',\n inputSchema: ThorbitKbSourceStatusInputSchema,\n annotations: readOnlyAnnotations('Read Thorbit KB Source Status'),\n })\n\n registerTool('thorbit_kb_ingest_url', {\n title: 'Ingest URL Into Thorbit KB',\n description: 'Extract one public URL through MCP Scraper, clean the content, submit it to Thorbit, and vectorize it into the selected knowledge base.',\n inputSchema: ThorbitKbIngestUrlInputSchema,\n annotations: ingestAnnotations('Ingest URL Into Thorbit KB', true),\n })\n\n registerTool('thorbit_kb_ingest_site', {\n title: 'Ingest Website Into Thorbit KB',\n description: 'Map a website through MCP Scraper, extract selected pages, submit each page to Thorbit, and vectorize them into the selected knowledge base.',\n inputSchema: ThorbitKbIngestSiteInputSchema,\n annotations: ingestAnnotations('Ingest Website Into Thorbit KB', true),\n })\n\n registerTool('thorbit_kb_ingest_youtube', {\n title: 'Ingest YouTube Into Thorbit KB',\n description: 'Transcribe a YouTube video through MCP Scraper, preserve timestamp chunks when available, and vectorize the transcript into Thorbit KB.',\n inputSchema: ThorbitKbIngestYoutubeInputSchema,\n annotations: ingestAnnotations('Ingest YouTube Into Thorbit KB', true),\n })\n\n registerTool('thorbit_kb_ingest_text', {\n title: 'Ingest Text Into Thorbit KB',\n description: 'Submit provided text or Markdown directly to Thorbit and vectorize it into the selected knowledge base.',\n inputSchema: ThorbitKbIngestTextInputSchema,\n annotations: ingestAnnotations('Ingest Text Into Thorbit KB', false),\n })\n\n registerTool('thorbit_kb_search', {\n title: 'Search Thorbit Knowledge Base',\n description: 'Search Thorbit KB content with citation-ready chunks. Use when the user needs source-backed snippets or evidence.',\n inputSchema: ThorbitKbSearchInputSchema,\n annotations: readOnlyAnnotations('Search Thorbit Knowledge Base'),\n })\n\n registerTool('thorbit_kb_ask', {\n title: 'Ask Thorbit Knowledge Base',\n description: 'Answer a question using only retrieved Thorbit KB context. Returns answer, citations, sufficiency, and retrieval strategy metadata.',\n inputSchema: ThorbitKbAskInputSchema,\n annotations: readOnlyAnnotations('Ask Thorbit Knowledge Base', false),\n })\n\n return server\n}\n","import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js'\nimport type { ThorbitKnowledgeBaseMcpEnvelope } from './thorbit-kb-api-client.js'\nimport type { ThorbitKnowledgeBaseMcpToolName } from './thorbit-kb-mcp-tool-names.js'\n\nfunction summarizeResult(toolName: ThorbitKnowledgeBaseMcpToolName, result: unknown): string {\n if (toolName === 'thorbit_kb_create' && result && typeof result === 'object' && 'knowledgeBase' in result) {\n const kb = result.knowledgeBase as { name?: unknown; publicId?: unknown }\n return `Created Thorbit knowledge base ${String(kb.name ?? kb.publicId ?? '')}.`\n }\n if (toolName === 'thorbit_kb_list' && result && typeof result === 'object' && 'knowledgeBases' in result) {\n const count = Array.isArray(result.knowledgeBases) ? result.knowledgeBases.length : 0\n return `Found ${count} Thorbit knowledge base${count === 1 ? '' : 's'}.`\n }\n if (toolName.startsWith('thorbit_kb_ingest')) return 'Knowledge-base ingestion completed. Check structuredContent for source receipts.'\n if (toolName === 'thorbit_kb_source_status') return 'Source status returned. Check structuredContent for details.'\n if (toolName === 'thorbit_kb_search') return 'Knowledge-base search completed. Check structuredContent for results and citations.'\n if (toolName === 'thorbit_kb_ask') return 'Knowledge-base answer generated. Check structuredContent for citations and strategy.'\n return 'Thorbit knowledge-base tool completed.'\n}\n\nexport function formatThorbitKbMcpToolResult(\n toolName: ThorbitKnowledgeBaseMcpToolName,\n envelope: ThorbitKnowledgeBaseMcpEnvelope,\n): CallToolResult {\n if (!envelope.ok) {\n return {\n isError: true,\n content: [{\n type: 'text',\n text: `${envelope.error.code}: ${envelope.error.message}`,\n }],\n structuredContent: envelope,\n }\n }\n\n return {\n content: [{\n type: 'text',\n text: summarizeResult(toolName, envelope.result),\n }],\n structuredContent: envelope.result as Record<string, unknown>,\n }\n}\n","import { z } from 'zod'\n\nconst MetadataSchema = z.record(z.string(), z.unknown())\n\nexport const ThorbitKbCreateInputSchema = {\n name: z.string().min(1).max(255).describe('Name for the new Thorbit knowledge base.'),\n description: z.string().max(2000).optional().describe('Optional description for the new knowledge base.'),\n projectPublicId: z.string().min(1).optional().describe('Optional Thorbit project public ID. Omit to create an org-level knowledge base.'),\n folder: z.string().min(1).max(128).optional().describe('Optional organizational folder, such as research or domains.'),\n}\n\nexport const ThorbitKbListInputSchema = {\n projectPublicId: z.string().min(1).optional().describe('Optional Thorbit project public ID used to narrow knowledge-base listing.'),\n includeGlobal: z.boolean().default(true).describe('Include org-level/global knowledge bases. Default true.'),\n limit: z.number().int().min(1).max(100).default(50).describe('Maximum knowledge bases to return.'),\n}\n\nexport const ThorbitKbSourceStatusInputSchema = {\n sourcePublicIds: z.array(z.string().min(1)).min(1).max(100).describe('Source public IDs returned by Thorbit KB ingestion tools.'),\n}\n\nexport const ThorbitKbIngestUrlInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n url: z.string().url().describe('Public URL to extract through MCP Scraper and ingest into Thorbit.'),\n title: z.string().min(1).max(512).optional().describe('Optional title override. Provider title is used when omitted.'),\n mode: z.enum(['append']).default('append').describe('Append a new source version. Refresh mode is intentionally not enabled in V1.'),\n maxCharacters: z.number().int().min(500).max(500000).optional().describe('Optional cap before chunking/vectorization.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on the KB source.'),\n}\n\nexport const ThorbitKbIngestSiteInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n startUrl: z.string().url().describe('Website start URL. Thorbit maps URLs through MCP Scraper, then ingests selected pages.'),\n includePatterns: z.array(z.string().min(1)).max(20).optional().describe('Optional regex or substring patterns that a mapped URL must match.'),\n excludePatterns: z.array(z.string().min(1)).max(20).optional().describe('Optional regex or substring patterns that remove mapped URLs.'),\n maxPages: z.number().int().min(1).max(100).default(25).describe('Maximum pages to ingest. Default 25, hard cap 100.'),\n mode: z.enum(['append']).default('append').describe('Append source versions. Refresh mode is intentionally not enabled in V1.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on each KB source.'),\n}\n\nexport const ThorbitKbIngestYoutubeInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n videoUrl: z.string().url().describe('YouTube video URL. Thorbit transcribes through MCP Scraper and vectorizes transcript chunks.'),\n title: z.string().min(1).max(512).optional().describe('Optional title override.'),\n mode: z.enum(['append']).default('append').describe('Append a new source version.'),\n preserveTimestamps: z.boolean().default(true).describe('Store transcript timestamps on chunks when MCP Scraper returns them.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on the KB source.'),\n}\n\nexport const ThorbitKbIngestTextInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n title: z.string().min(1).max(512).describe('Source title shown in KB citations.'),\n content: z.string().min(1).max(500000).describe('Text or Markdown to chunk, embed, and ingest.'),\n sourceUrl: z.string().url().optional().describe('Optional canonical source URL for citations.'),\n sourceType: z.enum(['manual', 'note', 'markdown']).default('manual').describe('Caller-facing source type. Thorbit stores note/markdown as manual sources in V1.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on the KB source.'),\n}\n\nexport const ThorbitKbSearchInputSchema = {\n query: z.string().min(1).max(4000).describe('Search query. Use the user question or a focused retrieval query.'),\n knowledgeBasePublicId: z.string().min(1).optional().describe('Optional target KB. Omit to search visible KBs.'),\n projectPublicId: z.string().min(1).optional().describe('Optional project scope when no KB is specified.'),\n limit: z.number().int().min(1).max(20).default(5).describe('Maximum chunks to return.'),\n includeEntities: z.boolean().default(false).describe('Reserved for entity-rich responses.'),\n searchMode: z.enum(['smart', 'hybrid']).default('smart').describe('smart uses Thorbit intent/rerank retrieval; hybrid uses ANN plus FTS.'),\n}\n\nexport const ThorbitKbAskInputSchema = {\n question: z.string().min(1).max(8000).describe('Question to answer using Thorbit KB context only.'),\n knowledgeBasePublicId: z.string().min(1).optional().describe('Optional target KB. Omit to answer over visible KBs.'),\n projectPublicId: z.string().min(1).optional().describe('Optional project scope when no KB is specified.'),\n answerStyle: z.enum(['concise', 'detailed', 'extractive']).default('concise').describe('Use extractive to return source excerpts without an LLM answer.'),\n limit: z.number().int().min(1).max(20).default(8).describe('Maximum retrieved chunks used for the answer.'),\n requireCitations: z.boolean().default(true).describe('Keep true for grounded answers with citation arrays.'),\n}\n\nexport const ThorbitKnowledgeBaseMcpToolInputSchemas = {\n thorbit_kb_create: ThorbitKbCreateInputSchema,\n thorbit_kb_list: ThorbitKbListInputSchema,\n thorbit_kb_source_status: ThorbitKbSourceStatusInputSchema,\n thorbit_kb_ingest_url: ThorbitKbIngestUrlInputSchema,\n thorbit_kb_ingest_site: ThorbitKbIngestSiteInputSchema,\n thorbit_kb_ingest_youtube: ThorbitKbIngestYoutubeInputSchema,\n thorbit_kb_ingest_text: ThorbitKbIngestTextInputSchema,\n thorbit_kb_search: ThorbitKbSearchInputSchema,\n thorbit_kb_ask: ThorbitKbAskInputSchema,\n}\n","import { readFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\n\nexport type ThorbitKbMcpEnv = {\n apiKey: string\n baseUrl: string\n}\n\nfunction readApiKeyFile(): string | undefined {\n const explicitPath = process.env.THORBIT_KB_MCP_KEY_PATH?.trim()\n const paths = [explicitPath, join(homedir(), '.thorbit-kb-mcp-key')].filter(Boolean) as string[]\n for (const path of paths) {\n try {\n const value = readFileSync(path, 'utf8').trim()\n if (value) return value\n } catch {\n continue\n }\n }\n return undefined\n}\n\nexport function resolveThorbitKbMcpEnv(): ThorbitKbMcpEnv {\n const apiKey = (\n process.env.THORBIT_API_KEY ||\n process.env.THORBIT_MCP_API_KEY ||\n process.env.THORBIT_KB_MCP_API_KEY ||\n readApiKeyFile()\n )?.trim()\n\n if (!apiKey) {\n throw new Error('THORBIT_API_KEY, THORBIT_MCP_API_KEY, or ~/.thorbit-kb-mcp-key is required')\n }\n\n return {\n apiKey,\n baseUrl: (process.env.THORBIT_BASE_URL || process.env.THORBIT_KB_MCP_BASE_URL || 'https://thorbit.ai').trim(),\n }\n}\n","export const ThorbitKnowledgeBaseMcpToolNames = [\n 'thorbit_kb_create',\n 'thorbit_kb_list',\n 'thorbit_kb_source_status',\n 'thorbit_kb_ingest_url',\n 'thorbit_kb_ingest_site',\n 'thorbit_kb_ingest_youtube',\n 'thorbit_kb_ingest_text',\n 'thorbit_kb_search',\n 'thorbit_kb_ask',\n] as const\n\nexport type ThorbitKnowledgeBaseMcpToolName = typeof ThorbitKnowledgeBaseMcpToolNames[number]\n"],"mappings":"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","names":[]}
package/dist/index.js CHANGED
@@ -148,7 +148,7 @@ var ThorbitKnowledgeBaseMcpToolInputSchemas = {
148
148
  };
149
149
 
150
150
  // src/thorbit-kb-mcp-server.ts
151
- var VERSION = "0.2.4";
151
+ var VERSION = "0.2.5";
152
152
  function readOnlyAnnotations(title, idempotent = true) {
153
153
  return {
154
154
  title,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/thorbit-kb-api-client.ts","../src/thorbit-kb-mcp-server.ts","../src/thorbit-kb-mcp-response-formatters.ts","../src/thorbit-kb-mcp-tool-schemas.ts","../src/thorbit-kb-mcp-env.ts","../src/thorbit-kb-mcp-tool-names.ts"],"sourcesContent":["import type { ThorbitKnowledgeBaseMcpToolName } from './thorbit-kb-mcp-tool-names.js'\n\nexport type ThorbitKnowledgeBaseMcpEnvelope =\n | {\n ok: true\n result: unknown\n warnings?: string[]\n requestId: string\n usage?: Record<string, unknown>\n }\n | {\n ok: false\n error: {\n code: string\n message: string\n details?: unknown\n }\n requestId: string\n }\n\nexport class ThorbitKnowledgeBaseApiClient {\n private readonly baseUrl: string\n private readonly apiKey: string\n\n constructor(options: { baseUrl: string; apiKey: string }) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, '')\n this.apiKey = options.apiKey\n }\n\n async callTool(toolName: ThorbitKnowledgeBaseMcpToolName, input: unknown): Promise<ThorbitKnowledgeBaseMcpEnvelope> {\n const response = await fetch(`${this.baseUrl}/api/v1/mcp/knowledge-base/${toolName}`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(input ?? {}),\n })\n\n const body = await response.json().catch(() => null) as ThorbitKnowledgeBaseMcpEnvelope | null\n if (body && typeof body === 'object' && 'ok' in body) return body\n\n return {\n ok: false,\n requestId: 'unavailable',\n error: {\n code: response.ok ? 'invalid_response' : `http_${response.status}`,\n message: response.ok ? 'Thorbit returned an invalid MCP response' : `Thorbit API request failed with HTTP ${response.status}`,\n },\n }\n }\n}\n\n","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { ToolAnnotations } from '@modelcontextprotocol/sdk/types.js'\nimport type { ZodRawShape } from 'zod'\nimport type { ThorbitKnowledgeBaseApiClient } from './thorbit-kb-api-client.js'\nimport { formatThorbitKbMcpToolResult } from './thorbit-kb-mcp-response-formatters.js'\nimport {\n ThorbitKbAskInputSchema,\n ThorbitKbCreateInputSchema,\n ThorbitKbIngestSiteInputSchema,\n ThorbitKbIngestTextInputSchema,\n ThorbitKbIngestUrlInputSchema,\n ThorbitKbIngestYoutubeInputSchema,\n ThorbitKbListInputSchema,\n ThorbitKbSearchInputSchema,\n ThorbitKbSourceStatusInputSchema,\n} from './thorbit-kb-mcp-tool-schemas.js'\nimport type { ThorbitKnowledgeBaseMcpToolName } from './thorbit-kb-mcp-tool-names.js'\n\nconst VERSION = '0.2.4'\n\ntype ThorbitKbToolConfig<InputArgs extends ZodRawShape> = {\n title: string\n description: string\n inputSchema: InputArgs\n annotations: ToolAnnotations\n}\n\nfunction readOnlyAnnotations(title: string, idempotent = true) {\n return {\n title,\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: idempotent,\n openWorldHint: false,\n }\n}\n\nfunction ingestAnnotations(title: string, openWorldHint: boolean) {\n return {\n title,\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint,\n }\n}\n\nexport function buildThorbitKnowledgeBaseMcpServer(client: ThorbitKnowledgeBaseApiClient): McpServer {\n const server = new McpServer({ name: 'thorbit-kb-mcp', version: VERSION })\n\n server.registerResource(\n 'knowledge-bases',\n 'thorbit-kb://knowledge-bases',\n {\n title: 'Thorbit Knowledge Bases',\n description: 'Knowledge bases visible to this Thorbit MCP API key.',\n mimeType: 'application/json',\n },\n async (uri) => {\n const envelope = await client.callTool('thorbit_kb_list', {})\n return { contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify(envelope, null, 2) }] }\n },\n )\n\n server.registerResource(\n 'source-status',\n new ResourceTemplate('thorbit-kb://sources/{sourcePublicId}', { list: undefined }),\n {\n title: 'Thorbit KB Source Status',\n description: 'Status and metadata for one Thorbit knowledge-base source.',\n mimeType: 'application/json',\n },\n async (uri, variables) => {\n const sourcePublicId = Array.isArray(variables.sourcePublicId) ? variables.sourcePublicId[0] : variables.sourcePublicId\n const envelope = await client.callTool('thorbit_kb_source_status', { sourcePublicIds: [String(sourcePublicId)] })\n return { contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify(envelope, null, 2) }] }\n },\n )\n\n function registerTool<T extends ThorbitKnowledgeBaseMcpToolName>(\n toolName: T,\n config: ThorbitKbToolConfig<ZodRawShape>,\n ): void {\n server.registerTool(toolName, config, async (input) => {\n const envelope = await client.callTool(toolName, input)\n return formatThorbitKbMcpToolResult(toolName, envelope)\n })\n }\n\n registerTool('thorbit_kb_create', {\n title: 'Create Thorbit Knowledge Base',\n description: 'Create a new Thorbit vector-backed knowledge base for MCP ingestion, smart RAG search, citations, and entity extraction.',\n inputSchema: ThorbitKbCreateInputSchema,\n annotations: ingestAnnotations('Create Thorbit Knowledge Base', false),\n })\n\n registerTool('thorbit_kb_list', {\n title: 'List Thorbit Knowledge Bases',\n description: 'List Thorbit knowledge bases visible to this API key. Use before ingestion/search when the target KB public ID is unknown.',\n inputSchema: ThorbitKbListInputSchema,\n annotations: readOnlyAnnotations('List Thorbit Knowledge Bases'),\n })\n\n registerTool('thorbit_kb_source_status', {\n title: 'Read Thorbit KB Source Status',\n description: 'Poll ingestion status for source public IDs returned by Thorbit KB ingestion tools.',\n inputSchema: ThorbitKbSourceStatusInputSchema,\n annotations: readOnlyAnnotations('Read Thorbit KB Source Status'),\n })\n\n registerTool('thorbit_kb_ingest_url', {\n title: 'Ingest URL Into Thorbit KB',\n description: 'Extract one public URL through MCP Scraper, clean the content, submit it to Thorbit, and vectorize it into the selected knowledge base.',\n inputSchema: ThorbitKbIngestUrlInputSchema,\n annotations: ingestAnnotations('Ingest URL Into Thorbit KB', true),\n })\n\n registerTool('thorbit_kb_ingest_site', {\n title: 'Ingest Website Into Thorbit KB',\n description: 'Map a website through MCP Scraper, extract selected pages, submit each page to Thorbit, and vectorize them into the selected knowledge base.',\n inputSchema: ThorbitKbIngestSiteInputSchema,\n annotations: ingestAnnotations('Ingest Website Into Thorbit KB', true),\n })\n\n registerTool('thorbit_kb_ingest_youtube', {\n title: 'Ingest YouTube Into Thorbit KB',\n description: 'Transcribe a YouTube video through MCP Scraper, preserve timestamp chunks when available, and vectorize the transcript into Thorbit KB.',\n inputSchema: ThorbitKbIngestYoutubeInputSchema,\n annotations: ingestAnnotations('Ingest YouTube Into Thorbit KB', true),\n })\n\n registerTool('thorbit_kb_ingest_text', {\n title: 'Ingest Text Into Thorbit KB',\n description: 'Submit provided text or Markdown directly to Thorbit and vectorize it into the selected knowledge base.',\n inputSchema: ThorbitKbIngestTextInputSchema,\n annotations: ingestAnnotations('Ingest Text Into Thorbit KB', false),\n })\n\n registerTool('thorbit_kb_search', {\n title: 'Search Thorbit Knowledge Base',\n description: 'Search Thorbit KB content with citation-ready chunks. Use when the user needs source-backed snippets or evidence.',\n inputSchema: ThorbitKbSearchInputSchema,\n annotations: readOnlyAnnotations('Search Thorbit Knowledge Base'),\n })\n\n registerTool('thorbit_kb_ask', {\n title: 'Ask Thorbit Knowledge Base',\n description: 'Answer a question using only retrieved Thorbit KB context. Returns answer, citations, sufficiency, and retrieval strategy metadata.',\n inputSchema: ThorbitKbAskInputSchema,\n annotations: readOnlyAnnotations('Ask Thorbit Knowledge Base', false),\n })\n\n return server\n}\n","import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js'\nimport type { ThorbitKnowledgeBaseMcpEnvelope } from './thorbit-kb-api-client.js'\nimport type { ThorbitKnowledgeBaseMcpToolName } from './thorbit-kb-mcp-tool-names.js'\n\nfunction summarizeResult(toolName: ThorbitKnowledgeBaseMcpToolName, result: unknown): string {\n if (toolName === 'thorbit_kb_create' && result && typeof result === 'object' && 'knowledgeBase' in result) {\n const kb = result.knowledgeBase as { name?: unknown; publicId?: unknown }\n return `Created Thorbit knowledge base ${String(kb.name ?? kb.publicId ?? '')}.`\n }\n if (toolName === 'thorbit_kb_list' && result && typeof result === 'object' && 'knowledgeBases' in result) {\n const count = Array.isArray(result.knowledgeBases) ? result.knowledgeBases.length : 0\n return `Found ${count} Thorbit knowledge base${count === 1 ? '' : 's'}.`\n }\n if (toolName.startsWith('thorbit_kb_ingest')) return 'Knowledge-base ingestion completed. Check structuredContent for source receipts.'\n if (toolName === 'thorbit_kb_source_status') return 'Source status returned. Check structuredContent for details.'\n if (toolName === 'thorbit_kb_search') return 'Knowledge-base search completed. Check structuredContent for results and citations.'\n if (toolName === 'thorbit_kb_ask') return 'Knowledge-base answer generated. Check structuredContent for citations and strategy.'\n return 'Thorbit knowledge-base tool completed.'\n}\n\nexport function formatThorbitKbMcpToolResult(\n toolName: ThorbitKnowledgeBaseMcpToolName,\n envelope: ThorbitKnowledgeBaseMcpEnvelope,\n): CallToolResult {\n if (!envelope.ok) {\n return {\n isError: true,\n content: [{\n type: 'text',\n text: `${envelope.error.code}: ${envelope.error.message}`,\n }],\n structuredContent: envelope,\n }\n }\n\n return {\n content: [{\n type: 'text',\n text: summarizeResult(toolName, envelope.result),\n }],\n structuredContent: envelope.result as Record<string, unknown>,\n }\n}\n","import { z } from 'zod'\n\nconst MetadataSchema = z.record(z.string(), z.unknown())\n\nexport const ThorbitKbCreateInputSchema = {\n name: z.string().min(1).max(255).describe('Name for the new Thorbit knowledge base.'),\n description: z.string().max(2000).optional().describe('Optional description for the new knowledge base.'),\n projectPublicId: z.string().min(1).optional().describe('Optional Thorbit project public ID. Omit to create an org-level knowledge base.'),\n folder: z.string().min(1).max(128).optional().describe('Optional organizational folder, such as research or domains.'),\n}\n\nexport const ThorbitKbListInputSchema = {\n projectPublicId: z.string().min(1).optional().describe('Optional Thorbit project public ID used to narrow knowledge-base listing.'),\n includeGlobal: z.boolean().default(true).describe('Include org-level/global knowledge bases. Default true.'),\n limit: z.number().int().min(1).max(100).default(50).describe('Maximum knowledge bases to return.'),\n}\n\nexport const ThorbitKbSourceStatusInputSchema = {\n sourcePublicIds: z.array(z.string().min(1)).min(1).max(100).describe('Source public IDs returned by Thorbit KB ingestion tools.'),\n}\n\nexport const ThorbitKbIngestUrlInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n url: z.string().url().describe('Public URL to extract through MCP Scraper and ingest into Thorbit.'),\n title: z.string().min(1).max(512).optional().describe('Optional title override. Provider title is used when omitted.'),\n mode: z.enum(['append']).default('append').describe('Append a new source version. Refresh mode is intentionally not enabled in V1.'),\n maxCharacters: z.number().int().min(500).max(500000).optional().describe('Optional cap before chunking/vectorization.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on the KB source.'),\n}\n\nexport const ThorbitKbIngestSiteInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n startUrl: z.string().url().describe('Website start URL. Thorbit maps URLs through MCP Scraper, then ingests selected pages.'),\n includePatterns: z.array(z.string().min(1)).max(20).optional().describe('Optional regex or substring patterns that a mapped URL must match.'),\n excludePatterns: z.array(z.string().min(1)).max(20).optional().describe('Optional regex or substring patterns that remove mapped URLs.'),\n maxPages: z.number().int().min(1).max(100).default(25).describe('Maximum pages to ingest. Default 25, hard cap 100.'),\n mode: z.enum(['append']).default('append').describe('Append source versions. Refresh mode is intentionally not enabled in V1.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on each KB source.'),\n}\n\nexport const ThorbitKbIngestYoutubeInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n videoUrl: z.string().url().describe('YouTube video URL. Thorbit transcribes through MCP Scraper and vectorizes transcript chunks.'),\n title: z.string().min(1).max(512).optional().describe('Optional title override.'),\n mode: z.enum(['append']).default('append').describe('Append a new source version.'),\n preserveTimestamps: z.boolean().default(true).describe('Store transcript timestamps on chunks when MCP Scraper returns them.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on the KB source.'),\n}\n\nexport const ThorbitKbIngestTextInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n title: z.string().min(1).max(512).describe('Source title shown in KB citations.'),\n content: z.string().min(1).max(500000).describe('Text or Markdown to chunk, embed, and ingest.'),\n sourceUrl: z.string().url().optional().describe('Optional canonical source URL for citations.'),\n sourceType: z.enum(['manual', 'note', 'markdown']).default('manual').describe('Caller-facing source type. Thorbit stores note/markdown as manual sources in V1.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on the KB source.'),\n}\n\nexport const ThorbitKbSearchInputSchema = {\n query: z.string().min(1).max(4000).describe('Search query. Use the user question or a focused retrieval query.'),\n knowledgeBasePublicId: z.string().min(1).optional().describe('Optional target KB. Omit to search visible KBs.'),\n projectPublicId: z.string().min(1).optional().describe('Optional project scope when no KB is specified.'),\n limit: z.number().int().min(1).max(20).default(5).describe('Maximum chunks to return.'),\n includeEntities: z.boolean().default(false).describe('Reserved for entity-rich responses.'),\n searchMode: z.enum(['smart', 'hybrid']).default('smart').describe('smart uses Thorbit intent/rerank retrieval; hybrid uses ANN plus FTS.'),\n}\n\nexport const ThorbitKbAskInputSchema = {\n question: z.string().min(1).max(8000).describe('Question to answer using Thorbit KB context only.'),\n knowledgeBasePublicId: z.string().min(1).optional().describe('Optional target KB. Omit to answer over visible KBs.'),\n projectPublicId: z.string().min(1).optional().describe('Optional project scope when no KB is specified.'),\n answerStyle: z.enum(['concise', 'detailed', 'extractive']).default('concise').describe('Use extractive to return source excerpts without an LLM answer.'),\n limit: z.number().int().min(1).max(20).default(8).describe('Maximum retrieved chunks used for the answer.'),\n requireCitations: z.boolean().default(true).describe('Keep true for grounded answers with citation arrays.'),\n}\n\nexport const ThorbitKnowledgeBaseMcpToolInputSchemas = {\n thorbit_kb_create: ThorbitKbCreateInputSchema,\n thorbit_kb_list: ThorbitKbListInputSchema,\n thorbit_kb_source_status: ThorbitKbSourceStatusInputSchema,\n thorbit_kb_ingest_url: ThorbitKbIngestUrlInputSchema,\n thorbit_kb_ingest_site: ThorbitKbIngestSiteInputSchema,\n thorbit_kb_ingest_youtube: ThorbitKbIngestYoutubeInputSchema,\n thorbit_kb_ingest_text: ThorbitKbIngestTextInputSchema,\n thorbit_kb_search: ThorbitKbSearchInputSchema,\n thorbit_kb_ask: ThorbitKbAskInputSchema,\n}\n","import { readFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\n\nexport type ThorbitKbMcpEnv = {\n apiKey: string\n baseUrl: string\n}\n\nfunction readApiKeyFile(): string | undefined {\n const explicitPath = process.env.THORBIT_KB_MCP_KEY_PATH?.trim()\n const paths = [explicitPath, join(homedir(), '.thorbit-kb-mcp-key')].filter(Boolean) as string[]\n for (const path of paths) {\n try {\n const value = readFileSync(path, 'utf8').trim()\n if (value) return value\n } catch {\n continue\n }\n }\n return undefined\n}\n\nexport function resolveThorbitKbMcpEnv(): ThorbitKbMcpEnv {\n const apiKey = (\n process.env.THORBIT_API_KEY ||\n process.env.THORBIT_MCP_API_KEY ||\n process.env.THORBIT_KB_MCP_API_KEY ||\n readApiKeyFile()\n )?.trim()\n\n if (!apiKey) {\n throw new Error('THORBIT_API_KEY, THORBIT_MCP_API_KEY, or ~/.thorbit-kb-mcp-key is required')\n }\n\n return {\n apiKey,\n baseUrl: (process.env.THORBIT_BASE_URL || process.env.THORBIT_KB_MCP_BASE_URL || 'https://thorbit.ai').trim(),\n }\n}\n","export const ThorbitKnowledgeBaseMcpToolNames = [\n 'thorbit_kb_create',\n 'thorbit_kb_list',\n 'thorbit_kb_source_status',\n 'thorbit_kb_ingest_url',\n 'thorbit_kb_ingest_site',\n 'thorbit_kb_ingest_youtube',\n 'thorbit_kb_ingest_text',\n 'thorbit_kb_search',\n 'thorbit_kb_ask',\n] as const\n\nexport type ThorbitKnowledgeBaseMcpToolName = typeof ThorbitKnowledgeBaseMcpToolNames[number]\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/thorbit-kb-api-client.ts","../src/thorbit-kb-mcp-server.ts","../src/thorbit-kb-mcp-response-formatters.ts","../src/thorbit-kb-mcp-tool-schemas.ts","../src/thorbit-kb-mcp-env.ts","../src/thorbit-kb-mcp-tool-names.ts"],"sourcesContent":["import type { ThorbitKnowledgeBaseMcpToolName } from './thorbit-kb-mcp-tool-names.js'\n\nexport type ThorbitKnowledgeBaseMcpEnvelope =\n | {\n ok: true\n result: unknown\n warnings?: string[]\n requestId: string\n usage?: Record<string, unknown>\n }\n | {\n ok: false\n error: {\n code: string\n message: string\n details?: unknown\n }\n requestId: string\n }\n\nexport class ThorbitKnowledgeBaseApiClient {\n private readonly baseUrl: string\n private readonly apiKey: string\n\n constructor(options: { baseUrl: string; apiKey: string }) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, '')\n this.apiKey = options.apiKey\n }\n\n async callTool(toolName: ThorbitKnowledgeBaseMcpToolName, input: unknown): Promise<ThorbitKnowledgeBaseMcpEnvelope> {\n const response = await fetch(`${this.baseUrl}/api/v1/mcp/knowledge-base/${toolName}`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(input ?? {}),\n })\n\n const body = await response.json().catch(() => null) as ThorbitKnowledgeBaseMcpEnvelope | null\n if (body && typeof body === 'object' && 'ok' in body) return body\n\n return {\n ok: false,\n requestId: 'unavailable',\n error: {\n code: response.ok ? 'invalid_response' : `http_${response.status}`,\n message: response.ok ? 'Thorbit returned an invalid MCP response' : `Thorbit API request failed with HTTP ${response.status}`,\n },\n }\n }\n}\n\n","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { ToolAnnotations } from '@modelcontextprotocol/sdk/types.js'\nimport type { ZodRawShape } from 'zod'\nimport type { ThorbitKnowledgeBaseApiClient } from './thorbit-kb-api-client.js'\nimport { formatThorbitKbMcpToolResult } from './thorbit-kb-mcp-response-formatters.js'\nimport {\n ThorbitKbAskInputSchema,\n ThorbitKbCreateInputSchema,\n ThorbitKbIngestSiteInputSchema,\n ThorbitKbIngestTextInputSchema,\n ThorbitKbIngestUrlInputSchema,\n ThorbitKbIngestYoutubeInputSchema,\n ThorbitKbListInputSchema,\n ThorbitKbSearchInputSchema,\n ThorbitKbSourceStatusInputSchema,\n} from './thorbit-kb-mcp-tool-schemas.js'\nimport type { ThorbitKnowledgeBaseMcpToolName } from './thorbit-kb-mcp-tool-names.js'\n\nconst VERSION = '0.2.5'\n\ntype ThorbitKbToolConfig<InputArgs extends ZodRawShape> = {\n title: string\n description: string\n inputSchema: InputArgs\n annotations: ToolAnnotations\n}\n\nfunction readOnlyAnnotations(title: string, idempotent = true) {\n return {\n title,\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: idempotent,\n openWorldHint: false,\n }\n}\n\nfunction ingestAnnotations(title: string, openWorldHint: boolean) {\n return {\n title,\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint,\n }\n}\n\nexport function buildThorbitKnowledgeBaseMcpServer(client: ThorbitKnowledgeBaseApiClient): McpServer {\n const server = new McpServer({ name: 'thorbit-kb-mcp', version: VERSION })\n\n server.registerResource(\n 'knowledge-bases',\n 'thorbit-kb://knowledge-bases',\n {\n title: 'Thorbit Knowledge Bases',\n description: 'Knowledge bases visible to this Thorbit MCP API key.',\n mimeType: 'application/json',\n },\n async (uri) => {\n const envelope = await client.callTool('thorbit_kb_list', {})\n return { contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify(envelope, null, 2) }] }\n },\n )\n\n server.registerResource(\n 'source-status',\n new ResourceTemplate('thorbit-kb://sources/{sourcePublicId}', { list: undefined }),\n {\n title: 'Thorbit KB Source Status',\n description: 'Status and metadata for one Thorbit knowledge-base source.',\n mimeType: 'application/json',\n },\n async (uri, variables) => {\n const sourcePublicId = Array.isArray(variables.sourcePublicId) ? variables.sourcePublicId[0] : variables.sourcePublicId\n const envelope = await client.callTool('thorbit_kb_source_status', { sourcePublicIds: [String(sourcePublicId)] })\n return { contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify(envelope, null, 2) }] }\n },\n )\n\n function registerTool<T extends ThorbitKnowledgeBaseMcpToolName>(\n toolName: T,\n config: ThorbitKbToolConfig<ZodRawShape>,\n ): void {\n server.registerTool(toolName, config, async (input) => {\n const envelope = await client.callTool(toolName, input)\n return formatThorbitKbMcpToolResult(toolName, envelope)\n })\n }\n\n registerTool('thorbit_kb_create', {\n title: 'Create Thorbit Knowledge Base',\n description: 'Create a new Thorbit vector-backed knowledge base for MCP ingestion, smart RAG search, citations, and entity extraction.',\n inputSchema: ThorbitKbCreateInputSchema,\n annotations: ingestAnnotations('Create Thorbit Knowledge Base', false),\n })\n\n registerTool('thorbit_kb_list', {\n title: 'List Thorbit Knowledge Bases',\n description: 'List Thorbit knowledge bases visible to this API key. Use before ingestion/search when the target KB public ID is unknown.',\n inputSchema: ThorbitKbListInputSchema,\n annotations: readOnlyAnnotations('List Thorbit Knowledge Bases'),\n })\n\n registerTool('thorbit_kb_source_status', {\n title: 'Read Thorbit KB Source Status',\n description: 'Poll ingestion status for source public IDs returned by Thorbit KB ingestion tools.',\n inputSchema: ThorbitKbSourceStatusInputSchema,\n annotations: readOnlyAnnotations('Read Thorbit KB Source Status'),\n })\n\n registerTool('thorbit_kb_ingest_url', {\n title: 'Ingest URL Into Thorbit KB',\n description: 'Extract one public URL through MCP Scraper, clean the content, submit it to Thorbit, and vectorize it into the selected knowledge base.',\n inputSchema: ThorbitKbIngestUrlInputSchema,\n annotations: ingestAnnotations('Ingest URL Into Thorbit KB', true),\n })\n\n registerTool('thorbit_kb_ingest_site', {\n title: 'Ingest Website Into Thorbit KB',\n description: 'Map a website through MCP Scraper, extract selected pages, submit each page to Thorbit, and vectorize them into the selected knowledge base.',\n inputSchema: ThorbitKbIngestSiteInputSchema,\n annotations: ingestAnnotations('Ingest Website Into Thorbit KB', true),\n })\n\n registerTool('thorbit_kb_ingest_youtube', {\n title: 'Ingest YouTube Into Thorbit KB',\n description: 'Transcribe a YouTube video through MCP Scraper, preserve timestamp chunks when available, and vectorize the transcript into Thorbit KB.',\n inputSchema: ThorbitKbIngestYoutubeInputSchema,\n annotations: ingestAnnotations('Ingest YouTube Into Thorbit KB', true),\n })\n\n registerTool('thorbit_kb_ingest_text', {\n title: 'Ingest Text Into Thorbit KB',\n description: 'Submit provided text or Markdown directly to Thorbit and vectorize it into the selected knowledge base.',\n inputSchema: ThorbitKbIngestTextInputSchema,\n annotations: ingestAnnotations('Ingest Text Into Thorbit KB', false),\n })\n\n registerTool('thorbit_kb_search', {\n title: 'Search Thorbit Knowledge Base',\n description: 'Search Thorbit KB content with citation-ready chunks. Use when the user needs source-backed snippets or evidence.',\n inputSchema: ThorbitKbSearchInputSchema,\n annotations: readOnlyAnnotations('Search Thorbit Knowledge Base'),\n })\n\n registerTool('thorbit_kb_ask', {\n title: 'Ask Thorbit Knowledge Base',\n description: 'Answer a question using only retrieved Thorbit KB context. Returns answer, citations, sufficiency, and retrieval strategy metadata.',\n inputSchema: ThorbitKbAskInputSchema,\n annotations: readOnlyAnnotations('Ask Thorbit Knowledge Base', false),\n })\n\n return server\n}\n","import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js'\nimport type { ThorbitKnowledgeBaseMcpEnvelope } from './thorbit-kb-api-client.js'\nimport type { ThorbitKnowledgeBaseMcpToolName } from './thorbit-kb-mcp-tool-names.js'\n\nfunction summarizeResult(toolName: ThorbitKnowledgeBaseMcpToolName, result: unknown): string {\n if (toolName === 'thorbit_kb_create' && result && typeof result === 'object' && 'knowledgeBase' in result) {\n const kb = result.knowledgeBase as { name?: unknown; publicId?: unknown }\n return `Created Thorbit knowledge base ${String(kb.name ?? kb.publicId ?? '')}.`\n }\n if (toolName === 'thorbit_kb_list' && result && typeof result === 'object' && 'knowledgeBases' in result) {\n const count = Array.isArray(result.knowledgeBases) ? result.knowledgeBases.length : 0\n return `Found ${count} Thorbit knowledge base${count === 1 ? '' : 's'}.`\n }\n if (toolName.startsWith('thorbit_kb_ingest')) return 'Knowledge-base ingestion completed. Check structuredContent for source receipts.'\n if (toolName === 'thorbit_kb_source_status') return 'Source status returned. Check structuredContent for details.'\n if (toolName === 'thorbit_kb_search') return 'Knowledge-base search completed. Check structuredContent for results and citations.'\n if (toolName === 'thorbit_kb_ask') return 'Knowledge-base answer generated. Check structuredContent for citations and strategy.'\n return 'Thorbit knowledge-base tool completed.'\n}\n\nexport function formatThorbitKbMcpToolResult(\n toolName: ThorbitKnowledgeBaseMcpToolName,\n envelope: ThorbitKnowledgeBaseMcpEnvelope,\n): CallToolResult {\n if (!envelope.ok) {\n return {\n isError: true,\n content: [{\n type: 'text',\n text: `${envelope.error.code}: ${envelope.error.message}`,\n }],\n structuredContent: envelope,\n }\n }\n\n return {\n content: [{\n type: 'text',\n text: summarizeResult(toolName, envelope.result),\n }],\n structuredContent: envelope.result as Record<string, unknown>,\n }\n}\n","import { z } from 'zod'\n\nconst MetadataSchema = z.record(z.string(), z.unknown())\n\nexport const ThorbitKbCreateInputSchema = {\n name: z.string().min(1).max(255).describe('Name for the new Thorbit knowledge base.'),\n description: z.string().max(2000).optional().describe('Optional description for the new knowledge base.'),\n projectPublicId: z.string().min(1).optional().describe('Optional Thorbit project public ID. Omit to create an org-level knowledge base.'),\n folder: z.string().min(1).max(128).optional().describe('Optional organizational folder, such as research or domains.'),\n}\n\nexport const ThorbitKbListInputSchema = {\n projectPublicId: z.string().min(1).optional().describe('Optional Thorbit project public ID used to narrow knowledge-base listing.'),\n includeGlobal: z.boolean().default(true).describe('Include org-level/global knowledge bases. Default true.'),\n limit: z.number().int().min(1).max(100).default(50).describe('Maximum knowledge bases to return.'),\n}\n\nexport const ThorbitKbSourceStatusInputSchema = {\n sourcePublicIds: z.array(z.string().min(1)).min(1).max(100).describe('Source public IDs returned by Thorbit KB ingestion tools.'),\n}\n\nexport const ThorbitKbIngestUrlInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n url: z.string().url().describe('Public URL to extract through MCP Scraper and ingest into Thorbit.'),\n title: z.string().min(1).max(512).optional().describe('Optional title override. Provider title is used when omitted.'),\n mode: z.enum(['append']).default('append').describe('Append a new source version. Refresh mode is intentionally not enabled in V1.'),\n maxCharacters: z.number().int().min(500).max(500000).optional().describe('Optional cap before chunking/vectorization.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on the KB source.'),\n}\n\nexport const ThorbitKbIngestSiteInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n startUrl: z.string().url().describe('Website start URL. Thorbit maps URLs through MCP Scraper, then ingests selected pages.'),\n includePatterns: z.array(z.string().min(1)).max(20).optional().describe('Optional regex or substring patterns that a mapped URL must match.'),\n excludePatterns: z.array(z.string().min(1)).max(20).optional().describe('Optional regex or substring patterns that remove mapped URLs.'),\n maxPages: z.number().int().min(1).max(100).default(25).describe('Maximum pages to ingest. Default 25, hard cap 100.'),\n mode: z.enum(['append']).default('append').describe('Append source versions. Refresh mode is intentionally not enabled in V1.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on each KB source.'),\n}\n\nexport const ThorbitKbIngestYoutubeInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n videoUrl: z.string().url().describe('YouTube video URL. Thorbit transcribes through MCP Scraper and vectorizes transcript chunks.'),\n title: z.string().min(1).max(512).optional().describe('Optional title override.'),\n mode: z.enum(['append']).default('append').describe('Append a new source version.'),\n preserveTimestamps: z.boolean().default(true).describe('Store transcript timestamps on chunks when MCP Scraper returns them.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on the KB source.'),\n}\n\nexport const ThorbitKbIngestTextInputSchema = {\n knowledgeBasePublicId: z.string().min(1).describe('Target Thorbit knowledge-base public ID.'),\n title: z.string().min(1).max(512).describe('Source title shown in KB citations.'),\n content: z.string().min(1).max(500000).describe('Text or Markdown to chunk, embed, and ingest.'),\n sourceUrl: z.string().url().optional().describe('Optional canonical source URL for citations.'),\n sourceType: z.enum(['manual', 'note', 'markdown']).default('manual').describe('Caller-facing source type. Thorbit stores note/markdown as manual sources in V1.'),\n metadata: MetadataSchema.optional().describe('Optional metadata stored on the KB source.'),\n}\n\nexport const ThorbitKbSearchInputSchema = {\n query: z.string().min(1).max(4000).describe('Search query. Use the user question or a focused retrieval query.'),\n knowledgeBasePublicId: z.string().min(1).optional().describe('Optional target KB. Omit to search visible KBs.'),\n projectPublicId: z.string().min(1).optional().describe('Optional project scope when no KB is specified.'),\n limit: z.number().int().min(1).max(20).default(5).describe('Maximum chunks to return.'),\n includeEntities: z.boolean().default(false).describe('Reserved for entity-rich responses.'),\n searchMode: z.enum(['smart', 'hybrid']).default('smart').describe('smart uses Thorbit intent/rerank retrieval; hybrid uses ANN plus FTS.'),\n}\n\nexport const ThorbitKbAskInputSchema = {\n question: z.string().min(1).max(8000).describe('Question to answer using Thorbit KB context only.'),\n knowledgeBasePublicId: z.string().min(1).optional().describe('Optional target KB. Omit to answer over visible KBs.'),\n projectPublicId: z.string().min(1).optional().describe('Optional project scope when no KB is specified.'),\n answerStyle: z.enum(['concise', 'detailed', 'extractive']).default('concise').describe('Use extractive to return source excerpts without an LLM answer.'),\n limit: z.number().int().min(1).max(20).default(8).describe('Maximum retrieved chunks used for the answer.'),\n requireCitations: z.boolean().default(true).describe('Keep true for grounded answers with citation arrays.'),\n}\n\nexport const ThorbitKnowledgeBaseMcpToolInputSchemas = {\n thorbit_kb_create: ThorbitKbCreateInputSchema,\n thorbit_kb_list: ThorbitKbListInputSchema,\n thorbit_kb_source_status: ThorbitKbSourceStatusInputSchema,\n thorbit_kb_ingest_url: ThorbitKbIngestUrlInputSchema,\n thorbit_kb_ingest_site: ThorbitKbIngestSiteInputSchema,\n thorbit_kb_ingest_youtube: ThorbitKbIngestYoutubeInputSchema,\n thorbit_kb_ingest_text: ThorbitKbIngestTextInputSchema,\n thorbit_kb_search: ThorbitKbSearchInputSchema,\n thorbit_kb_ask: ThorbitKbAskInputSchema,\n}\n","import { readFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\n\nexport type ThorbitKbMcpEnv = {\n apiKey: string\n baseUrl: string\n}\n\nfunction readApiKeyFile(): string | undefined {\n const explicitPath = process.env.THORBIT_KB_MCP_KEY_PATH?.trim()\n const paths = [explicitPath, join(homedir(), '.thorbit-kb-mcp-key')].filter(Boolean) as string[]\n for (const path of paths) {\n try {\n const value = readFileSync(path, 'utf8').trim()\n if (value) return value\n } catch {\n continue\n }\n }\n return undefined\n}\n\nexport function resolveThorbitKbMcpEnv(): ThorbitKbMcpEnv {\n const apiKey = (\n process.env.THORBIT_API_KEY ||\n process.env.THORBIT_MCP_API_KEY ||\n process.env.THORBIT_KB_MCP_API_KEY ||\n readApiKeyFile()\n )?.trim()\n\n if (!apiKey) {\n throw new Error('THORBIT_API_KEY, THORBIT_MCP_API_KEY, or ~/.thorbit-kb-mcp-key is required')\n }\n\n return {\n apiKey,\n baseUrl: (process.env.THORBIT_BASE_URL || process.env.THORBIT_KB_MCP_BASE_URL || 'https://thorbit.ai').trim(),\n }\n}\n","export const ThorbitKnowledgeBaseMcpToolNames = [\n 'thorbit_kb_create',\n 'thorbit_kb_list',\n 'thorbit_kb_source_status',\n 'thorbit_kb_ingest_url',\n 'thorbit_kb_ingest_site',\n 'thorbit_kb_ingest_youtube',\n 'thorbit_kb_ingest_text',\n 'thorbit_kb_search',\n 'thorbit_kb_ask',\n] as const\n\nexport type ThorbitKnowledgeBaseMcpToolName = typeof ThorbitKnowledgeBaseMcpToolNames[number]\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "thorbit-kb-mcp",
3
- "version": "0.2.4",
3
+ "version": "0.2.5",
4
4
  "description": "MCP server for Thorbit Knowledge Base ingestion, search, and grounded answers",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",