thorbit-kb-mcp 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/bin/thorbit-kb-mcp.cjs +17 -1
- package/dist/bin/thorbit-kb-mcp.cjs.map +1 -1
- package/dist/bin/thorbit-kb-mcp.js +17 -1
- package/dist/bin/thorbit-kb-mcp.js.map +1 -1
- package/dist/index.cjs +21 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +14 -2
- package/dist/index.d.ts +14 -2
- package/dist/index.js +20 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -67,6 +67,10 @@ var import_mcp = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
|
67
67
|
|
|
68
68
|
// src/thorbit-kb-mcp-response-formatters.ts
|
|
69
69
|
function summarizeResult(toolName, result) {
|
|
70
|
+
if (toolName === "thorbit_kb_create" && result && typeof result === "object" && "knowledgeBase" in result) {
|
|
71
|
+
const kb = result.knowledgeBase;
|
|
72
|
+
return `Created Thorbit knowledge base ${String(kb.name ?? kb.publicId ?? "")}.`;
|
|
73
|
+
}
|
|
70
74
|
if (toolName === "thorbit_kb_list" && result && typeof result === "object" && "knowledgeBases" in result) {
|
|
71
75
|
const count = Array.isArray(result.knowledgeBases) ? result.knowledgeBases.length : 0;
|
|
72
76
|
return `Found ${count} Thorbit knowledge base${count === 1 ? "" : "s"}.`;
|
|
@@ -100,6 +104,12 @@ function formatThorbitKbMcpToolResult(toolName, envelope) {
|
|
|
100
104
|
// src/thorbit-kb-mcp-tool-schemas.ts
|
|
101
105
|
var import_zod = require("zod");
|
|
102
106
|
var MetadataSchema = import_zod.z.record(import_zod.z.string(), import_zod.z.unknown());
|
|
107
|
+
var ThorbitKbCreateInputSchema = {
|
|
108
|
+
name: import_zod.z.string().min(1).max(255).describe("Name for the new Thorbit knowledge base."),
|
|
109
|
+
description: import_zod.z.string().max(2e3).optional().describe("Optional description for the new knowledge base."),
|
|
110
|
+
projectPublicId: import_zod.z.string().min(1).optional().describe("Optional Thorbit project public ID. Omit to create an org-level knowledge base."),
|
|
111
|
+
folder: import_zod.z.string().min(1).max(128).optional().describe("Optional organizational folder, such as research or domains.")
|
|
112
|
+
};
|
|
103
113
|
var ThorbitKbListInputSchema = {
|
|
104
114
|
projectPublicId: import_zod.z.string().min(1).optional().describe("Optional Thorbit project public ID used to narrow knowledge-base listing."),
|
|
105
115
|
includeGlobal: import_zod.z.boolean().default(true).describe("Include org-level/global knowledge bases. Default true."),
|
|
@@ -159,7 +169,7 @@ var ThorbitKbAskInputSchema = {
|
|
|
159
169
|
};
|
|
160
170
|
|
|
161
171
|
// src/thorbit-kb-mcp-server.ts
|
|
162
|
-
var VERSION = "0.
|
|
172
|
+
var VERSION = "0.2.0";
|
|
163
173
|
function readOnlyAnnotations(title, idempotent = true) {
|
|
164
174
|
return {
|
|
165
175
|
title,
|
|
@@ -213,6 +223,12 @@ function buildThorbitKnowledgeBaseMcpServer(client) {
|
|
|
213
223
|
return formatThorbitKbMcpToolResult(toolName, envelope);
|
|
214
224
|
});
|
|
215
225
|
}
|
|
226
|
+
registerTool("thorbit_kb_create", {
|
|
227
|
+
title: "Create Thorbit Knowledge Base",
|
|
228
|
+
description: "Create a new Thorbit vector-backed knowledge base for MCP ingestion, smart RAG search, citations, and entity extraction.",
|
|
229
|
+
inputSchema: ThorbitKbCreateInputSchema,
|
|
230
|
+
annotations: ingestAnnotations("Create Thorbit Knowledge Base", false)
|
|
231
|
+
});
|
|
216
232
|
registerTool("thorbit_kb_list", {
|
|
217
233
|
title: "List Thorbit Knowledge Bases",
|
|
218
234
|
description: "List Thorbit knowledge bases visible to this API key. Use before ingestion/search when the target KB public ID is unknown.",
|
|
@@ -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 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.1.0'\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_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_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\n","import { z } from 'zod'\n\nconst MetadataSchema = z.record(z.string(), z.unknown())\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_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\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,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;;;ACtCA,iBAAkB;AAElB,IAAM,iBAAiB,aAAE,OAAO,aAAE,OAAO,GAAG,aAAE,QAAQ,CAAC;AAEhD,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;;;AFlDA,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,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;;;AH5IA,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":[]}
|
|
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.0'\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":[]}
|
|
@@ -66,6 +66,10 @@ import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mc
|
|
|
66
66
|
|
|
67
67
|
// src/thorbit-kb-mcp-response-formatters.ts
|
|
68
68
|
function summarizeResult(toolName, result) {
|
|
69
|
+
if (toolName === "thorbit_kb_create" && result && typeof result === "object" && "knowledgeBase" in result) {
|
|
70
|
+
const kb = result.knowledgeBase;
|
|
71
|
+
return `Created Thorbit knowledge base ${String(kb.name ?? kb.publicId ?? "")}.`;
|
|
72
|
+
}
|
|
69
73
|
if (toolName === "thorbit_kb_list" && result && typeof result === "object" && "knowledgeBases" in result) {
|
|
70
74
|
const count = Array.isArray(result.knowledgeBases) ? result.knowledgeBases.length : 0;
|
|
71
75
|
return `Found ${count} Thorbit knowledge base${count === 1 ? "" : "s"}.`;
|
|
@@ -99,6 +103,12 @@ function formatThorbitKbMcpToolResult(toolName, envelope) {
|
|
|
99
103
|
// src/thorbit-kb-mcp-tool-schemas.ts
|
|
100
104
|
import { z } from "zod";
|
|
101
105
|
var MetadataSchema = z.record(z.string(), z.unknown());
|
|
106
|
+
var ThorbitKbCreateInputSchema = {
|
|
107
|
+
name: z.string().min(1).max(255).describe("Name for the new Thorbit knowledge base."),
|
|
108
|
+
description: z.string().max(2e3).optional().describe("Optional description for the new knowledge base."),
|
|
109
|
+
projectPublicId: z.string().min(1).optional().describe("Optional Thorbit project public ID. Omit to create an org-level knowledge base."),
|
|
110
|
+
folder: z.string().min(1).max(128).optional().describe("Optional organizational folder, such as research or domains.")
|
|
111
|
+
};
|
|
102
112
|
var ThorbitKbListInputSchema = {
|
|
103
113
|
projectPublicId: z.string().min(1).optional().describe("Optional Thorbit project public ID used to narrow knowledge-base listing."),
|
|
104
114
|
includeGlobal: z.boolean().default(true).describe("Include org-level/global knowledge bases. Default true."),
|
|
@@ -158,7 +168,7 @@ var ThorbitKbAskInputSchema = {
|
|
|
158
168
|
};
|
|
159
169
|
|
|
160
170
|
// src/thorbit-kb-mcp-server.ts
|
|
161
|
-
var VERSION = "0.
|
|
171
|
+
var VERSION = "0.2.0";
|
|
162
172
|
function readOnlyAnnotations(title, idempotent = true) {
|
|
163
173
|
return {
|
|
164
174
|
title,
|
|
@@ -212,6 +222,12 @@ function buildThorbitKnowledgeBaseMcpServer(client) {
|
|
|
212
222
|
return formatThorbitKbMcpToolResult(toolName, envelope);
|
|
213
223
|
});
|
|
214
224
|
}
|
|
225
|
+
registerTool("thorbit_kb_create", {
|
|
226
|
+
title: "Create Thorbit Knowledge Base",
|
|
227
|
+
description: "Create a new Thorbit vector-backed knowledge base for MCP ingestion, smart RAG search, citations, and entity extraction.",
|
|
228
|
+
inputSchema: ThorbitKbCreateInputSchema,
|
|
229
|
+
annotations: ingestAnnotations("Create Thorbit Knowledge Base", false)
|
|
230
|
+
});
|
|
215
231
|
registerTool("thorbit_kb_list", {
|
|
216
232
|
title: "List Thorbit Knowledge Bases",
|
|
217
233
|
description: "List Thorbit knowledge bases visible to this API key. Use before ingestion/search when the target KB public ID is unknown.",
|
|
@@ -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 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.1.0'\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_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_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\n","import { z } from 'zod'\n\nconst MetadataSchema = z.record(z.string(), z.unknown())\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_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\n"],"mappings":";;;AAAA,SAAS,4BAA4B;;;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,SAAS,oBAAoB;AAC7B,SAAS,eAAe;AACxB,SAAS,YAAY;AAOrB,SAAS,iBAAqC;AAC5C,QAAM,eAAe,QAAQ,IAAI,yBAAyB,KAAK;AAC/D,QAAM,QAAQ,CAAC,cAAc,KAAK,QAAQ,GAAG,qBAAqB,CAAC,EAAE,OAAO,OAAO;AACnF,aAAW,QAAQ,OAAO;AACxB,QAAI;AACF,YAAM,QAAQ,aAAa,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,SAAS,WAAW,wBAAwB;;;ACI5C,SAAS,gBAAgB,UAA2C,QAAyB;AAC3F,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;;;ACtCA,SAAS,SAAS;AAElB,IAAM,iBAAiB,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC;AAEhD,IAAM,2BAA2B;AAAA,EACtC,iBAAiB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,2EAA2E;AAAA,EAClI,eAAe,EAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,SAAS,yDAAyD;AAAA,EAC3G,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,QAAQ,EAAE,EAAE,SAAS,oCAAoC;AACnG;AAEO,IAAM,mCAAmC;AAAA,EAC9C,iBAAiB,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,2DAA2D;AAClI;AAEO,IAAM,gCAAgC;AAAA,EAC3C,uBAAuB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,0CAA0C;AAAA,EAC5F,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,oEAAoE;AAAA,EACnG,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,SAAS,+DAA+D;AAAA,EACrH,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,QAAQ,QAAQ,EAAE,SAAS,+EAA+E;AAAA,EACnI,eAAe,EAAE,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,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,0CAA0C;AAAA,EAC5F,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,wFAAwF;AAAA,EAC5H,iBAAiB,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,SAAS,oEAAoE;AAAA,EAC5I,iBAAiB,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,SAAS,+DAA+D;AAAA,EACvI,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,QAAQ,EAAE,EAAE,SAAS,oDAAoD;AAAA,EACpH,MAAM,EAAE,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,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,0CAA0C;AAAA,EAC5F,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,8FAA8F;AAAA,EAClI,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,SAAS,0BAA0B;AAAA,EAChF,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,QAAQ,QAAQ,EAAE,SAAS,8BAA8B;AAAA,EAClF,oBAAoB,EAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,SAAS,sEAAsE;AAAA,EAC7H,UAAU,eAAe,SAAS,EAAE,SAAS,4CAA4C;AAC3F;AAEO,IAAM,iCAAiC;AAAA,EAC5C,uBAAuB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,0CAA0C;AAAA,EAC5F,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,qCAAqC;AAAA,EAChF,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAM,EAAE,SAAS,+CAA+C;AAAA,EAC/F,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,8CAA8C;AAAA,EAC9F,YAAY,EAAE,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,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAI,EAAE,SAAS,mEAAmE;AAAA,EAC/G,uBAAuB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,iDAAiD;AAAA,EAC9G,iBAAiB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,iDAAiD;AAAA,EACxG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC,EAAE,SAAS,2BAA2B;AAAA,EACtF,iBAAiB,EAAE,QAAQ,EAAE,QAAQ,KAAK,EAAE,SAAS,qCAAqC;AAAA,EAC1F,YAAY,EAAE,KAAK,CAAC,SAAS,QAAQ,CAAC,EAAE,QAAQ,OAAO,EAAE,SAAS,uEAAuE;AAC3I;AAEO,IAAM,0BAA0B;AAAA,EACrC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAI,EAAE,SAAS,mDAAmD;AAAA,EAClG,uBAAuB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,sDAAsD;AAAA,EACnH,iBAAiB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,iDAAiD;AAAA,EACxG,aAAa,EAAE,KAAK,CAAC,WAAW,YAAY,YAAY,CAAC,EAAE,QAAQ,SAAS,EAAE,SAAS,iEAAiE;AAAA,EACxJ,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC,EAAE,SAAS,+CAA+C;AAAA,EAC1G,kBAAkB,EAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,SAAS,sDAAsD;AAC7G;;;AFlDA,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,UAAU,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,iBAAiB,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,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;;;AH5IA,eAAe,OAAO;AACpB,QAAM,MAAM,uBAAuB;AACnC,QAAM,SAAS,IAAI,8BAA8B,GAAG;AACpD,QAAM,SAAS,mCAAmC,MAAM;AACxD,QAAM,OAAO,QAAQ,IAAI,qBAAqB,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":[]}
|
|
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.0'\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
|
@@ -22,6 +22,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
22
22
|
var src_exports = {};
|
|
23
23
|
__export(src_exports, {
|
|
24
24
|
ThorbitKbAskInputSchema: () => ThorbitKbAskInputSchema,
|
|
25
|
+
ThorbitKbCreateInputSchema: () => ThorbitKbCreateInputSchema,
|
|
25
26
|
ThorbitKbIngestSiteInputSchema: () => ThorbitKbIngestSiteInputSchema,
|
|
26
27
|
ThorbitKbIngestTextInputSchema: () => ThorbitKbIngestTextInputSchema,
|
|
27
28
|
ThorbitKbIngestUrlInputSchema: () => ThorbitKbIngestUrlInputSchema,
|
|
@@ -72,6 +73,10 @@ var import_mcp = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
|
72
73
|
|
|
73
74
|
// src/thorbit-kb-mcp-response-formatters.ts
|
|
74
75
|
function summarizeResult(toolName, result) {
|
|
76
|
+
if (toolName === "thorbit_kb_create" && result && typeof result === "object" && "knowledgeBase" in result) {
|
|
77
|
+
const kb = result.knowledgeBase;
|
|
78
|
+
return `Created Thorbit knowledge base ${String(kb.name ?? kb.publicId ?? "")}.`;
|
|
79
|
+
}
|
|
75
80
|
if (toolName === "thorbit_kb_list" && result && typeof result === "object" && "knowledgeBases" in result) {
|
|
76
81
|
const count = Array.isArray(result.knowledgeBases) ? result.knowledgeBases.length : 0;
|
|
77
82
|
return `Found ${count} Thorbit knowledge base${count === 1 ? "" : "s"}.`;
|
|
@@ -105,6 +110,12 @@ function formatThorbitKbMcpToolResult(toolName, envelope) {
|
|
|
105
110
|
// src/thorbit-kb-mcp-tool-schemas.ts
|
|
106
111
|
var import_zod = require("zod");
|
|
107
112
|
var MetadataSchema = import_zod.z.record(import_zod.z.string(), import_zod.z.unknown());
|
|
113
|
+
var ThorbitKbCreateInputSchema = {
|
|
114
|
+
name: import_zod.z.string().min(1).max(255).describe("Name for the new Thorbit knowledge base."),
|
|
115
|
+
description: import_zod.z.string().max(2e3).optional().describe("Optional description for the new knowledge base."),
|
|
116
|
+
projectPublicId: import_zod.z.string().min(1).optional().describe("Optional Thorbit project public ID. Omit to create an org-level knowledge base."),
|
|
117
|
+
folder: import_zod.z.string().min(1).max(128).optional().describe("Optional organizational folder, such as research or domains.")
|
|
118
|
+
};
|
|
108
119
|
var ThorbitKbListInputSchema = {
|
|
109
120
|
projectPublicId: import_zod.z.string().min(1).optional().describe("Optional Thorbit project public ID used to narrow knowledge-base listing."),
|
|
110
121
|
includeGlobal: import_zod.z.boolean().default(true).describe("Include org-level/global knowledge bases. Default true."),
|
|
@@ -163,6 +174,7 @@ var ThorbitKbAskInputSchema = {
|
|
|
163
174
|
requireCitations: import_zod.z.boolean().default(true).describe("Keep true for grounded answers with citation arrays.")
|
|
164
175
|
};
|
|
165
176
|
var ThorbitKnowledgeBaseMcpToolInputSchemas = {
|
|
177
|
+
thorbit_kb_create: ThorbitKbCreateInputSchema,
|
|
166
178
|
thorbit_kb_list: ThorbitKbListInputSchema,
|
|
167
179
|
thorbit_kb_source_status: ThorbitKbSourceStatusInputSchema,
|
|
168
180
|
thorbit_kb_ingest_url: ThorbitKbIngestUrlInputSchema,
|
|
@@ -174,7 +186,7 @@ var ThorbitKnowledgeBaseMcpToolInputSchemas = {
|
|
|
174
186
|
};
|
|
175
187
|
|
|
176
188
|
// src/thorbit-kb-mcp-server.ts
|
|
177
|
-
var VERSION = "0.
|
|
189
|
+
var VERSION = "0.2.0";
|
|
178
190
|
function readOnlyAnnotations(title, idempotent = true) {
|
|
179
191
|
return {
|
|
180
192
|
title,
|
|
@@ -228,6 +240,12 @@ function buildThorbitKnowledgeBaseMcpServer(client) {
|
|
|
228
240
|
return formatThorbitKbMcpToolResult(toolName, envelope);
|
|
229
241
|
});
|
|
230
242
|
}
|
|
243
|
+
registerTool("thorbit_kb_create", {
|
|
244
|
+
title: "Create Thorbit Knowledge Base",
|
|
245
|
+
description: "Create a new Thorbit vector-backed knowledge base for MCP ingestion, smart RAG search, citations, and entity extraction.",
|
|
246
|
+
inputSchema: ThorbitKbCreateInputSchema,
|
|
247
|
+
annotations: ingestAnnotations("Create Thorbit Knowledge Base", false)
|
|
248
|
+
});
|
|
231
249
|
registerTool("thorbit_kb_list", {
|
|
232
250
|
title: "List Thorbit Knowledge Bases",
|
|
233
251
|
description: "List Thorbit knowledge bases visible to this API key. Use before ingestion/search when the target KB public ID is unknown.",
|
|
@@ -309,6 +327,7 @@ function resolveThorbitKbMcpEnv() {
|
|
|
309
327
|
|
|
310
328
|
// src/thorbit-kb-mcp-tool-names.ts
|
|
311
329
|
var ThorbitKnowledgeBaseMcpToolNames = [
|
|
330
|
+
"thorbit_kb_create",
|
|
312
331
|
"thorbit_kb_list",
|
|
313
332
|
"thorbit_kb_source_status",
|
|
314
333
|
"thorbit_kb_ingest_url",
|
|
@@ -321,6 +340,7 @@ var ThorbitKnowledgeBaseMcpToolNames = [
|
|
|
321
340
|
// Annotate the CommonJS export names for ESM import in node:
|
|
322
341
|
0 && (module.exports = {
|
|
323
342
|
ThorbitKbAskInputSchema,
|
|
343
|
+
ThorbitKbCreateInputSchema,
|
|
324
344
|
ThorbitKbIngestSiteInputSchema,
|
|
325
345
|
ThorbitKbIngestTextInputSchema,
|
|
326
346
|
ThorbitKbIngestUrlInputSchema,
|
package/dist/index.cjs.map
CHANGED
|
@@ -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 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.1.0'\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_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_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\n","import { z } from 'zod'\n\nconst MetadataSchema = z.record(z.string(), z.unknown())\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_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\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_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\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.0'\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":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACoBO,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,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;AAEO,IAAM,0CAA0C;AAAA,EACrD,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,0BAA0B;AAAA,EAC1B,uBAAuB;AAAA,EACvB,wBAAwB;AAAA,EACxB,2BAA2B;AAAA,EAC3B,wBAAwB;AAAA,EACxB,mBAAmB;AAAA,EACnB,gBAAgB;AAClB;;;AFpEA,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;;;AGzJA,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;;;ACvCO,IAAM,mCAAmC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;","names":[]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
|
|
4
|
-
declare const ThorbitKnowledgeBaseMcpToolNames: readonly ["thorbit_kb_list", "thorbit_kb_source_status", "thorbit_kb_ingest_url", "thorbit_kb_ingest_site", "thorbit_kb_ingest_youtube", "thorbit_kb_ingest_text", "thorbit_kb_search", "thorbit_kb_ask"];
|
|
4
|
+
declare const ThorbitKnowledgeBaseMcpToolNames: readonly ["thorbit_kb_create", "thorbit_kb_list", "thorbit_kb_source_status", "thorbit_kb_ingest_url", "thorbit_kb_ingest_site", "thorbit_kb_ingest_youtube", "thorbit_kb_ingest_text", "thorbit_kb_search", "thorbit_kb_ask"];
|
|
5
5
|
type ThorbitKnowledgeBaseMcpToolName = typeof ThorbitKnowledgeBaseMcpToolNames[number];
|
|
6
6
|
|
|
7
7
|
type ThorbitKnowledgeBaseMcpEnvelope = {
|
|
@@ -37,6 +37,12 @@ type ThorbitKbMcpEnv = {
|
|
|
37
37
|
};
|
|
38
38
|
declare function resolveThorbitKbMcpEnv(): ThorbitKbMcpEnv;
|
|
39
39
|
|
|
40
|
+
declare const ThorbitKbCreateInputSchema: {
|
|
41
|
+
name: z.ZodString;
|
|
42
|
+
description: z.ZodOptional<z.ZodString>;
|
|
43
|
+
projectPublicId: z.ZodOptional<z.ZodString>;
|
|
44
|
+
folder: z.ZodOptional<z.ZodString>;
|
|
45
|
+
};
|
|
40
46
|
declare const ThorbitKbListInputSchema: {
|
|
41
47
|
projectPublicId: z.ZodOptional<z.ZodString>;
|
|
42
48
|
includeGlobal: z.ZodDefault<z.ZodBoolean>;
|
|
@@ -95,6 +101,12 @@ declare const ThorbitKbAskInputSchema: {
|
|
|
95
101
|
requireCitations: z.ZodDefault<z.ZodBoolean>;
|
|
96
102
|
};
|
|
97
103
|
declare const ThorbitKnowledgeBaseMcpToolInputSchemas: {
|
|
104
|
+
thorbit_kb_create: {
|
|
105
|
+
name: z.ZodString;
|
|
106
|
+
description: z.ZodOptional<z.ZodString>;
|
|
107
|
+
projectPublicId: z.ZodOptional<z.ZodString>;
|
|
108
|
+
folder: z.ZodOptional<z.ZodString>;
|
|
109
|
+
};
|
|
98
110
|
thorbit_kb_list: {
|
|
99
111
|
projectPublicId: z.ZodOptional<z.ZodString>;
|
|
100
112
|
includeGlobal: z.ZodDefault<z.ZodBoolean>;
|
|
@@ -154,4 +166,4 @@ declare const ThorbitKnowledgeBaseMcpToolInputSchemas: {
|
|
|
154
166
|
};
|
|
155
167
|
};
|
|
156
168
|
|
|
157
|
-
export { ThorbitKbAskInputSchema, ThorbitKbIngestSiteInputSchema, ThorbitKbIngestTextInputSchema, ThorbitKbIngestUrlInputSchema, ThorbitKbIngestYoutubeInputSchema, ThorbitKbListInputSchema, ThorbitKbSearchInputSchema, ThorbitKbSourceStatusInputSchema, ThorbitKnowledgeBaseApiClient, ThorbitKnowledgeBaseMcpToolInputSchemas, type ThorbitKnowledgeBaseMcpToolName, ThorbitKnowledgeBaseMcpToolNames, buildThorbitKnowledgeBaseMcpServer, resolveThorbitKbMcpEnv };
|
|
169
|
+
export { ThorbitKbAskInputSchema, ThorbitKbCreateInputSchema, ThorbitKbIngestSiteInputSchema, ThorbitKbIngestTextInputSchema, ThorbitKbIngestUrlInputSchema, ThorbitKbIngestYoutubeInputSchema, ThorbitKbListInputSchema, ThorbitKbSearchInputSchema, ThorbitKbSourceStatusInputSchema, ThorbitKnowledgeBaseApiClient, ThorbitKnowledgeBaseMcpToolInputSchemas, type ThorbitKnowledgeBaseMcpToolName, ThorbitKnowledgeBaseMcpToolNames, buildThorbitKnowledgeBaseMcpServer, resolveThorbitKbMcpEnv };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
|
|
4
|
-
declare const ThorbitKnowledgeBaseMcpToolNames: readonly ["thorbit_kb_list", "thorbit_kb_source_status", "thorbit_kb_ingest_url", "thorbit_kb_ingest_site", "thorbit_kb_ingest_youtube", "thorbit_kb_ingest_text", "thorbit_kb_search", "thorbit_kb_ask"];
|
|
4
|
+
declare const ThorbitKnowledgeBaseMcpToolNames: readonly ["thorbit_kb_create", "thorbit_kb_list", "thorbit_kb_source_status", "thorbit_kb_ingest_url", "thorbit_kb_ingest_site", "thorbit_kb_ingest_youtube", "thorbit_kb_ingest_text", "thorbit_kb_search", "thorbit_kb_ask"];
|
|
5
5
|
type ThorbitKnowledgeBaseMcpToolName = typeof ThorbitKnowledgeBaseMcpToolNames[number];
|
|
6
6
|
|
|
7
7
|
type ThorbitKnowledgeBaseMcpEnvelope = {
|
|
@@ -37,6 +37,12 @@ type ThorbitKbMcpEnv = {
|
|
|
37
37
|
};
|
|
38
38
|
declare function resolveThorbitKbMcpEnv(): ThorbitKbMcpEnv;
|
|
39
39
|
|
|
40
|
+
declare const ThorbitKbCreateInputSchema: {
|
|
41
|
+
name: z.ZodString;
|
|
42
|
+
description: z.ZodOptional<z.ZodString>;
|
|
43
|
+
projectPublicId: z.ZodOptional<z.ZodString>;
|
|
44
|
+
folder: z.ZodOptional<z.ZodString>;
|
|
45
|
+
};
|
|
40
46
|
declare const ThorbitKbListInputSchema: {
|
|
41
47
|
projectPublicId: z.ZodOptional<z.ZodString>;
|
|
42
48
|
includeGlobal: z.ZodDefault<z.ZodBoolean>;
|
|
@@ -95,6 +101,12 @@ declare const ThorbitKbAskInputSchema: {
|
|
|
95
101
|
requireCitations: z.ZodDefault<z.ZodBoolean>;
|
|
96
102
|
};
|
|
97
103
|
declare const ThorbitKnowledgeBaseMcpToolInputSchemas: {
|
|
104
|
+
thorbit_kb_create: {
|
|
105
|
+
name: z.ZodString;
|
|
106
|
+
description: z.ZodOptional<z.ZodString>;
|
|
107
|
+
projectPublicId: z.ZodOptional<z.ZodString>;
|
|
108
|
+
folder: z.ZodOptional<z.ZodString>;
|
|
109
|
+
};
|
|
98
110
|
thorbit_kb_list: {
|
|
99
111
|
projectPublicId: z.ZodOptional<z.ZodString>;
|
|
100
112
|
includeGlobal: z.ZodDefault<z.ZodBoolean>;
|
|
@@ -154,4 +166,4 @@ declare const ThorbitKnowledgeBaseMcpToolInputSchemas: {
|
|
|
154
166
|
};
|
|
155
167
|
};
|
|
156
168
|
|
|
157
|
-
export { ThorbitKbAskInputSchema, ThorbitKbIngestSiteInputSchema, ThorbitKbIngestTextInputSchema, ThorbitKbIngestUrlInputSchema, ThorbitKbIngestYoutubeInputSchema, ThorbitKbListInputSchema, ThorbitKbSearchInputSchema, ThorbitKbSourceStatusInputSchema, ThorbitKnowledgeBaseApiClient, ThorbitKnowledgeBaseMcpToolInputSchemas, type ThorbitKnowledgeBaseMcpToolName, ThorbitKnowledgeBaseMcpToolNames, buildThorbitKnowledgeBaseMcpServer, resolveThorbitKbMcpEnv };
|
|
169
|
+
export { ThorbitKbAskInputSchema, ThorbitKbCreateInputSchema, ThorbitKbIngestSiteInputSchema, ThorbitKbIngestTextInputSchema, ThorbitKbIngestUrlInputSchema, ThorbitKbIngestYoutubeInputSchema, ThorbitKbListInputSchema, ThorbitKbSearchInputSchema, ThorbitKbSourceStatusInputSchema, ThorbitKnowledgeBaseApiClient, ThorbitKnowledgeBaseMcpToolInputSchemas, type ThorbitKnowledgeBaseMcpToolName, ThorbitKnowledgeBaseMcpToolNames, buildThorbitKnowledgeBaseMcpServer, resolveThorbitKbMcpEnv };
|
package/dist/index.js
CHANGED
|
@@ -35,6 +35,10 @@ import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mc
|
|
|
35
35
|
|
|
36
36
|
// src/thorbit-kb-mcp-response-formatters.ts
|
|
37
37
|
function summarizeResult(toolName, result) {
|
|
38
|
+
if (toolName === "thorbit_kb_create" && result && typeof result === "object" && "knowledgeBase" in result) {
|
|
39
|
+
const kb = result.knowledgeBase;
|
|
40
|
+
return `Created Thorbit knowledge base ${String(kb.name ?? kb.publicId ?? "")}.`;
|
|
41
|
+
}
|
|
38
42
|
if (toolName === "thorbit_kb_list" && result && typeof result === "object" && "knowledgeBases" in result) {
|
|
39
43
|
const count = Array.isArray(result.knowledgeBases) ? result.knowledgeBases.length : 0;
|
|
40
44
|
return `Found ${count} Thorbit knowledge base${count === 1 ? "" : "s"}.`;
|
|
@@ -68,6 +72,12 @@ function formatThorbitKbMcpToolResult(toolName, envelope) {
|
|
|
68
72
|
// src/thorbit-kb-mcp-tool-schemas.ts
|
|
69
73
|
import { z } from "zod";
|
|
70
74
|
var MetadataSchema = z.record(z.string(), z.unknown());
|
|
75
|
+
var ThorbitKbCreateInputSchema = {
|
|
76
|
+
name: z.string().min(1).max(255).describe("Name for the new Thorbit knowledge base."),
|
|
77
|
+
description: z.string().max(2e3).optional().describe("Optional description for the new knowledge base."),
|
|
78
|
+
projectPublicId: z.string().min(1).optional().describe("Optional Thorbit project public ID. Omit to create an org-level knowledge base."),
|
|
79
|
+
folder: z.string().min(1).max(128).optional().describe("Optional organizational folder, such as research or domains.")
|
|
80
|
+
};
|
|
71
81
|
var ThorbitKbListInputSchema = {
|
|
72
82
|
projectPublicId: z.string().min(1).optional().describe("Optional Thorbit project public ID used to narrow knowledge-base listing."),
|
|
73
83
|
includeGlobal: z.boolean().default(true).describe("Include org-level/global knowledge bases. Default true."),
|
|
@@ -126,6 +136,7 @@ var ThorbitKbAskInputSchema = {
|
|
|
126
136
|
requireCitations: z.boolean().default(true).describe("Keep true for grounded answers with citation arrays.")
|
|
127
137
|
};
|
|
128
138
|
var ThorbitKnowledgeBaseMcpToolInputSchemas = {
|
|
139
|
+
thorbit_kb_create: ThorbitKbCreateInputSchema,
|
|
129
140
|
thorbit_kb_list: ThorbitKbListInputSchema,
|
|
130
141
|
thorbit_kb_source_status: ThorbitKbSourceStatusInputSchema,
|
|
131
142
|
thorbit_kb_ingest_url: ThorbitKbIngestUrlInputSchema,
|
|
@@ -137,7 +148,7 @@ var ThorbitKnowledgeBaseMcpToolInputSchemas = {
|
|
|
137
148
|
};
|
|
138
149
|
|
|
139
150
|
// src/thorbit-kb-mcp-server.ts
|
|
140
|
-
var VERSION = "0.
|
|
151
|
+
var VERSION = "0.2.0";
|
|
141
152
|
function readOnlyAnnotations(title, idempotent = true) {
|
|
142
153
|
return {
|
|
143
154
|
title,
|
|
@@ -191,6 +202,12 @@ function buildThorbitKnowledgeBaseMcpServer(client) {
|
|
|
191
202
|
return formatThorbitKbMcpToolResult(toolName, envelope);
|
|
192
203
|
});
|
|
193
204
|
}
|
|
205
|
+
registerTool("thorbit_kb_create", {
|
|
206
|
+
title: "Create Thorbit Knowledge Base",
|
|
207
|
+
description: "Create a new Thorbit vector-backed knowledge base for MCP ingestion, smart RAG search, citations, and entity extraction.",
|
|
208
|
+
inputSchema: ThorbitKbCreateInputSchema,
|
|
209
|
+
annotations: ingestAnnotations("Create Thorbit Knowledge Base", false)
|
|
210
|
+
});
|
|
194
211
|
registerTool("thorbit_kb_list", {
|
|
195
212
|
title: "List Thorbit Knowledge Bases",
|
|
196
213
|
description: "List Thorbit knowledge bases visible to this API key. Use before ingestion/search when the target KB public ID is unknown.",
|
|
@@ -272,6 +289,7 @@ function resolveThorbitKbMcpEnv() {
|
|
|
272
289
|
|
|
273
290
|
// src/thorbit-kb-mcp-tool-names.ts
|
|
274
291
|
var ThorbitKnowledgeBaseMcpToolNames = [
|
|
292
|
+
"thorbit_kb_create",
|
|
275
293
|
"thorbit_kb_list",
|
|
276
294
|
"thorbit_kb_source_status",
|
|
277
295
|
"thorbit_kb_ingest_url",
|
|
@@ -283,6 +301,7 @@ var ThorbitKnowledgeBaseMcpToolNames = [
|
|
|
283
301
|
];
|
|
284
302
|
export {
|
|
285
303
|
ThorbitKbAskInputSchema,
|
|
304
|
+
ThorbitKbCreateInputSchema,
|
|
286
305
|
ThorbitKbIngestSiteInputSchema,
|
|
287
306
|
ThorbitKbIngestTextInputSchema,
|
|
288
307
|
ThorbitKbIngestUrlInputSchema,
|
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 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.1.0'\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_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_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\n","import { z } from 'zod'\n\nconst MetadataSchema = z.record(z.string(), z.unknown())\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_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\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_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\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.0'\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":[]}
|