thorbit-kb-mcp 0.1.2 → 0.2.1
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 +5 -1
- package/dist/bin/thorbit-kb-mcp-install.cjs +183 -22
- package/dist/bin/thorbit-kb-mcp-install.cjs.map +1 -1
- package/dist/bin/thorbit-kb-mcp-install.d.cts +26 -1
- package/dist/bin/thorbit-kb-mcp-install.d.ts +26 -1
- package/dist/bin/thorbit-kb-mcp-install.js +152 -22
- package/dist/bin/thorbit-kb-mcp-install.js.map +1 -1
- 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
|
@@ -29,13 +29,16 @@ MCP client example:
|
|
|
29
29
|
Generate the same JSON from the CLI:
|
|
30
30
|
|
|
31
31
|
```bash
|
|
32
|
-
npx -y -p thorbit-kb-mcp@latest thorbit-kb-mcp-install --api-key thbt_mcp_...
|
|
32
|
+
npx -y -p thorbit-kb-mcp@latest thorbit-kb-mcp-install --json --api-key thbt_mcp_...
|
|
33
33
|
```
|
|
34
34
|
|
|
35
35
|
Optional:
|
|
36
36
|
|
|
37
37
|
- `THORBIT_BASE_URL`: hosted Thorbit app URL. Defaults to `https://thorbit.ai`.
|
|
38
38
|
- `THORBIT_KB_MCP_KEY_PATH`: file containing the API key. Defaults to `~/.thorbit-kb-mcp-key`.
|
|
39
|
+
- `thorbit-kb-mcp-install`: prints a terracotta Thorbit KB setup screen by default.
|
|
40
|
+
- `thorbit-kb-mcp-install --json`: prints only MCP client JSON for scripts.
|
|
41
|
+
- `thorbit-kb-mcp-install --key-path ~/.config/thorbit/kb-mcp-key`: emits config that reads the key from a local file instead of embedding it inline.
|
|
39
42
|
|
|
40
43
|
## Internal Admin Key
|
|
41
44
|
|
|
@@ -50,6 +53,7 @@ The command writes the raw key to `~/.thorbit-kb-mcp-admin-key` with `0600` perm
|
|
|
50
53
|
## Tools
|
|
51
54
|
|
|
52
55
|
- `thorbit_kb_list`
|
|
56
|
+
- `thorbit_kb_create`
|
|
53
57
|
- `thorbit_kb_source_status`
|
|
54
58
|
- `thorbit_kb_ingest_url`
|
|
55
59
|
- `thorbit_kb_ingest_site`
|
|
@@ -1,32 +1,193 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
"use strict";
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
3
20
|
|
|
4
21
|
// bin/thorbit-kb-mcp-install.ts
|
|
5
|
-
|
|
22
|
+
var thorbit_kb_mcp_install_exports = {};
|
|
23
|
+
__export(thorbit_kb_mcp_install_exports, {
|
|
24
|
+
buildMcpConfig: () => buildMcpConfig,
|
|
25
|
+
hasFlag: () => hasFlag,
|
|
26
|
+
main: () => main,
|
|
27
|
+
readArg: () => readArg,
|
|
28
|
+
renderBanner: () => renderBanner,
|
|
29
|
+
renderHelp: () => renderHelp,
|
|
30
|
+
renderInstallInstructions: () => renderInstallInstructions,
|
|
31
|
+
resolveInstallOptions: () => resolveInstallOptions
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(thorbit_kb_mcp_install_exports);
|
|
34
|
+
var import_node_fs = require("fs");
|
|
35
|
+
var import_node_url = require("url");
|
|
36
|
+
var import_meta = {};
|
|
37
|
+
function readArg(name, argv = process.argv.slice(2)) {
|
|
6
38
|
const prefix = `--${name}=`;
|
|
7
|
-
const inline =
|
|
39
|
+
const inline = argv.find((arg) => arg.startsWith(prefix));
|
|
8
40
|
if (inline) return inline.slice(prefix.length);
|
|
9
|
-
const index =
|
|
10
|
-
return index >= 0 ?
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
41
|
+
const index = argv.indexOf(`--${name}`);
|
|
42
|
+
return index >= 0 ? argv[index + 1] : void 0;
|
|
43
|
+
}
|
|
44
|
+
function hasFlag(name, argv = process.argv.slice(2)) {
|
|
45
|
+
return argv.includes(`--${name}`);
|
|
46
|
+
}
|
|
47
|
+
function resolveInstallOptions(argv = process.argv.slice(2)) {
|
|
48
|
+
return {
|
|
49
|
+
apiKey: readArg("api-key", argv) ?? process.env.THORBIT_API_KEY ?? process.env.THORBIT_MCP_API_KEY ?? "thbt_mcp_...",
|
|
50
|
+
baseUrl: readArg("base-url", argv) ?? process.env.THORBIT_BASE_URL,
|
|
51
|
+
keyPath: readArg("key-path", argv) ?? process.env.THORBIT_KB_MCP_KEY_PATH,
|
|
52
|
+
serverName: readArg("server-name", argv) ?? "thorbit-kb",
|
|
53
|
+
json: hasFlag("json", argv),
|
|
54
|
+
color: !hasFlag("no-color", argv),
|
|
55
|
+
help: hasFlag("help", argv) || hasFlag("h", argv)
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function buildMcpConfig(options) {
|
|
59
|
+
const env = options.keyPath ? { THORBIT_KB_MCP_KEY_PATH: options.keyPath } : { THORBIT_API_KEY: options.apiKey };
|
|
60
|
+
if (options.baseUrl) {
|
|
61
|
+
env.THORBIT_BASE_URL = options.baseUrl.replace(/\/$/, "");
|
|
28
62
|
}
|
|
63
|
+
return {
|
|
64
|
+
mcpServers: {
|
|
65
|
+
[options.serverName]: {
|
|
66
|
+
command: "npx",
|
|
67
|
+
args: ["-y", "thorbit-kb-mcp@latest"],
|
|
68
|
+
env
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
var ansi = {
|
|
74
|
+
reset: "\x1B[0m",
|
|
75
|
+
bold: "\x1B[1m",
|
|
76
|
+
dim: "\x1B[2m",
|
|
77
|
+
terracotta: "\x1B[38;2;198;90;54m",
|
|
78
|
+
cream: "\x1B[38;2;255;244;230m",
|
|
79
|
+
green: "\x1B[38;2;75;181;67m",
|
|
80
|
+
slate: "\x1B[38;2;148;163;184m"
|
|
29
81
|
};
|
|
30
|
-
|
|
82
|
+
function paint(value, code, enabled) {
|
|
83
|
+
return enabled ? `${code}${value}${ansi.reset}` : value;
|
|
84
|
+
}
|
|
85
|
+
function renderHelp(color) {
|
|
86
|
+
return [
|
|
87
|
+
renderBanner(color),
|
|
88
|
+
"",
|
|
89
|
+
"Usage:",
|
|
90
|
+
" npx -y -p thorbit-kb-mcp@latest thorbit-kb-mcp-install [options]",
|
|
91
|
+
"",
|
|
92
|
+
"Options:",
|
|
93
|
+
" --api-key <key> Thorbit MCP API key from Settings -> MCPs.",
|
|
94
|
+
" --key-path <path> File containing the API key. Preferred for shared machines and servers.",
|
|
95
|
+
" --base-url <url> Thorbit app URL. Defaults to https://thorbit.ai.",
|
|
96
|
+
" --server-name <name> MCP client server name. Defaults to thorbit-kb.",
|
|
97
|
+
" --json Print only MCP client JSON.",
|
|
98
|
+
" --no-color Disable ANSI color.",
|
|
99
|
+
" --help Show this help.",
|
|
100
|
+
""
|
|
101
|
+
].join("\n");
|
|
102
|
+
}
|
|
103
|
+
function renderBanner(color) {
|
|
104
|
+
const banner = String.raw`
|
|
105
|
+
_______ _ _ ____ _____ ____ _____ _______ _ ______
|
|
106
|
+
|__ __| | | |/ __ \| __ \| _ \_ _|__ __| | |/ / _ \
|
|
107
|
+
| | | |__| | | | | |__) | |_) || | | | | ' /| |_) |
|
|
108
|
+
| | | __ | | | | _ /| _ < | | | | | < | _ <
|
|
109
|
+
| | | | | | |__| | | \ \| |_) || |_ | | | . \| |_) |
|
|
110
|
+
|_| |_| |_|\____/|_| \_\____/_____| |_| |_|\_\____/
|
|
111
|
+
|
|
112
|
+
MCP
|
|
113
|
+
`;
|
|
114
|
+
return paint(banner, ansi.terracotta, color);
|
|
115
|
+
}
|
|
116
|
+
function renderInstallInstructions(options) {
|
|
117
|
+
const color = options.color;
|
|
118
|
+
const config = buildMcpConfig(options);
|
|
119
|
+
const json = JSON.stringify(config, null, 2);
|
|
120
|
+
const keySetup = options.keyPath ? [
|
|
121
|
+
paint("Key file mode", ansi.terracotta, color),
|
|
122
|
+
` chmod 600 ${options.keyPath}`
|
|
123
|
+
].join("\n") : [
|
|
124
|
+
paint("Safer key-file option", ansi.terracotta, color),
|
|
125
|
+
" mkdir -p ~/.config/thorbit",
|
|
126
|
+
" printf '%s\\n' 'thbt_mcp_...' > ~/.config/thorbit/kb-mcp-key",
|
|
127
|
+
" chmod 600 ~/.config/thorbit/kb-mcp-key",
|
|
128
|
+
"",
|
|
129
|
+
" Then run:",
|
|
130
|
+
" npx -y -p thorbit-kb-mcp@latest thorbit-kb-mcp-install --key-path ~/.config/thorbit/kb-mcp-key"
|
|
131
|
+
].join("\n");
|
|
132
|
+
return [
|
|
133
|
+
renderBanner(color),
|
|
134
|
+
paint("THORBIT KB MCP", ansi.bold + ansi.cream, color),
|
|
135
|
+
paint("Vector-backed knowledge bases for MCP agents.", ansi.slate, color),
|
|
136
|
+
"",
|
|
137
|
+
`${paint("1.", ansi.terracotta, color)} Generate an API key in Thorbit Settings -> MCPs.`,
|
|
138
|
+
`${paint("2.", ansi.terracotta, color)} Add this server config to your MCP client:`,
|
|
139
|
+
"",
|
|
140
|
+
json,
|
|
141
|
+
"",
|
|
142
|
+
`${paint("3.", ansi.terracotta, color)} Restart your MCP client, then call ${paint("thorbit_kb_list", ansi.green, color)} or ${paint("thorbit_kb_create", ansi.green, color)}.`,
|
|
143
|
+
"",
|
|
144
|
+
keySetup,
|
|
145
|
+
"",
|
|
146
|
+
paint("Tools", ansi.terracotta, color),
|
|
147
|
+
" thorbit_kb_create Create a vector-backed Thorbit KB.",
|
|
148
|
+
" thorbit_kb_ingest_url Extract a URL through MCP Scraper and ingest it.",
|
|
149
|
+
" thorbit_kb_ingest_site Map/extract a site through MCP Scraper and ingest pages.",
|
|
150
|
+
" thorbit_kb_ingest_youtube Transcribe YouTube through MCP Scraper and ingest chunks.",
|
|
151
|
+
" thorbit_kb_search Smart RAG search with citations.",
|
|
152
|
+
" thorbit_kb_ask Grounded answers with citations and strategy metadata.",
|
|
153
|
+
"",
|
|
154
|
+
paint("Raw JSON:", ansi.slate, color),
|
|
155
|
+
" npx -y -p thorbit-kb-mcp@latest thorbit-kb-mcp-install --json --api-key thbt_mcp_...",
|
|
156
|
+
""
|
|
157
|
+
].join("\n");
|
|
158
|
+
}
|
|
159
|
+
function main() {
|
|
160
|
+
const options = resolveInstallOptions();
|
|
161
|
+
if (options.help) {
|
|
162
|
+
process.stdout.write(renderHelp(options.color));
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
if (options.json) {
|
|
166
|
+
process.stdout.write(`${JSON.stringify(buildMcpConfig(options), null, 2)}
|
|
31
167
|
`);
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
process.stdout.write(renderInstallInstructions(options));
|
|
171
|
+
}
|
|
172
|
+
function isMainModule() {
|
|
173
|
+
const entry = process.argv[1];
|
|
174
|
+
if (!entry) return false;
|
|
175
|
+
try {
|
|
176
|
+
return (0, import_node_fs.realpathSync)(entry) === (0, import_node_fs.realpathSync)((0, import_node_url.fileURLToPath)(import_meta.url));
|
|
177
|
+
} catch {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
if (isMainModule()) main();
|
|
182
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
183
|
+
0 && (module.exports = {
|
|
184
|
+
buildMcpConfig,
|
|
185
|
+
hasFlag,
|
|
186
|
+
main,
|
|
187
|
+
readArg,
|
|
188
|
+
renderBanner,
|
|
189
|
+
renderHelp,
|
|
190
|
+
renderInstallInstructions,
|
|
191
|
+
resolveInstallOptions
|
|
192
|
+
});
|
|
32
193
|
//# sourceMappingURL=thorbit-kb-mcp-install.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../bin/thorbit-kb-mcp-install.ts"],"sourcesContent":["function readArg(name: string): string | undefined {\n const prefix = `--${name}=`\n const inline =
|
|
1
|
+
{"version":3,"sources":["../../bin/thorbit-kb-mcp-install.ts"],"sourcesContent":["import { realpathSync } from 'node:fs'\nimport { fileURLToPath } from 'node:url'\n\nexport type InstallOptions = {\n apiKey: string\n baseUrl?: string\n keyPath?: string\n serverName: string\n json: boolean\n color: boolean\n help: boolean\n}\n\nexport function readArg(name: string, argv = process.argv.slice(2)): string | undefined {\n const prefix = `--${name}=`\n const inline = argv.find(arg => arg.startsWith(prefix))\n if (inline) return inline.slice(prefix.length)\n const index = argv.indexOf(`--${name}`)\n return index >= 0 ? argv[index + 1] : undefined\n}\n\nexport function hasFlag(name: string, argv = process.argv.slice(2)): boolean {\n return argv.includes(`--${name}`)\n}\n\nexport function resolveInstallOptions(argv = process.argv.slice(2)): InstallOptions {\n return {\n apiKey: readArg('api-key', argv) ?? process.env.THORBIT_API_KEY ?? process.env.THORBIT_MCP_API_KEY ?? 'thbt_mcp_...',\n baseUrl: readArg('base-url', argv) ?? process.env.THORBIT_BASE_URL,\n keyPath: readArg('key-path', argv) ?? process.env.THORBIT_KB_MCP_KEY_PATH,\n serverName: readArg('server-name', argv) ?? 'thorbit-kb',\n json: hasFlag('json', argv),\n color: !hasFlag('no-color', argv),\n help: hasFlag('help', argv) || hasFlag('h', argv),\n }\n}\n\nexport function buildMcpConfig(options: InstallOptions) {\n const env: Record<string, string> = options.keyPath\n ? { THORBIT_KB_MCP_KEY_PATH: options.keyPath }\n : { THORBIT_API_KEY: options.apiKey }\n\n if (options.baseUrl) {\n env.THORBIT_BASE_URL = options.baseUrl.replace(/\\/$/, '')\n }\n\n return {\n mcpServers: {\n [options.serverName]: {\n command: 'npx',\n args: ['-y', 'thorbit-kb-mcp@latest'],\n env,\n },\n },\n }\n}\n\nconst ansi = {\n reset: '\\u001b[0m',\n bold: '\\u001b[1m',\n dim: '\\u001b[2m',\n terracotta: '\\u001b[38;2;198;90;54m',\n cream: '\\u001b[38;2;255;244;230m',\n green: '\\u001b[38;2;75;181;67m',\n slate: '\\u001b[38;2;148;163;184m',\n}\n\nfunction paint(value: string, code: string, enabled: boolean): string {\n return enabled ? `${code}${value}${ansi.reset}` : value\n}\n\nexport function renderHelp(color: boolean): string {\n return [\n renderBanner(color),\n '',\n 'Usage:',\n ' npx -y -p thorbit-kb-mcp@latest thorbit-kb-mcp-install [options]',\n '',\n 'Options:',\n ' --api-key <key> Thorbit MCP API key from Settings -> MCPs.',\n ' --key-path <path> File containing the API key. Preferred for shared machines and servers.',\n ' --base-url <url> Thorbit app URL. Defaults to https://thorbit.ai.',\n ' --server-name <name> MCP client server name. Defaults to thorbit-kb.',\n ' --json Print only MCP client JSON.',\n ' --no-color Disable ANSI color.',\n ' --help Show this help.',\n '',\n ].join('\\n')\n}\n\nexport function renderBanner(color: boolean): string {\n const banner = String.raw`\n _______ _ _ ____ _____ ____ _____ _______ _ ______\n |__ __| | | |/ __ \\| __ \\| _ \\_ _|__ __| | |/ / _ \\\n | | | |__| | | | | |__) | |_) || | | | | ' /| |_) |\n | | | __ | | | | _ /| _ < | | | | | < | _ <\n | | | | | | |__| | | \\ \\| |_) || |_ | | | . \\| |_) |\n |_| |_| |_|\\____/|_| \\_\\____/_____| |_| |_|\\_\\____/\n\n MCP\n`\n return paint(banner, ansi.terracotta, color)\n}\n\nexport function renderInstallInstructions(options: InstallOptions): string {\n const color = options.color\n const config = buildMcpConfig(options)\n const json = JSON.stringify(config, null, 2)\n const keySetup = options.keyPath\n ? [\n paint('Key file mode', ansi.terracotta, color),\n ` chmod 600 ${options.keyPath}`,\n ].join('\\n')\n : [\n paint('Safer key-file option', ansi.terracotta, color),\n \" mkdir -p ~/.config/thorbit\",\n \" printf '%s\\\\n' 'thbt_mcp_...' > ~/.config/thorbit/kb-mcp-key\",\n ' chmod 600 ~/.config/thorbit/kb-mcp-key',\n '',\n ' Then run:',\n ' npx -y -p thorbit-kb-mcp@latest thorbit-kb-mcp-install --key-path ~/.config/thorbit/kb-mcp-key',\n ].join('\\n')\n\n return [\n renderBanner(color),\n paint('THORBIT KB MCP', ansi.bold + ansi.cream, color),\n paint('Vector-backed knowledge bases for MCP agents.', ansi.slate, color),\n '',\n `${paint('1.', ansi.terracotta, color)} Generate an API key in Thorbit Settings -> MCPs.`,\n `${paint('2.', ansi.terracotta, color)} Add this server config to your MCP client:`,\n '',\n json,\n '',\n `${paint('3.', ansi.terracotta, color)} Restart your MCP client, then call ${paint('thorbit_kb_list', ansi.green, color)} or ${paint('thorbit_kb_create', ansi.green, color)}.`,\n '',\n keySetup,\n '',\n paint('Tools', ansi.terracotta, color),\n ' thorbit_kb_create Create a vector-backed Thorbit KB.',\n ' thorbit_kb_ingest_url Extract a URL through MCP Scraper and ingest it.',\n ' thorbit_kb_ingest_site Map/extract a site through MCP Scraper and ingest pages.',\n ' thorbit_kb_ingest_youtube Transcribe YouTube through MCP Scraper and ingest chunks.',\n ' thorbit_kb_search Smart RAG search with citations.',\n ' thorbit_kb_ask Grounded answers with citations and strategy metadata.',\n '',\n paint('Raw JSON:', ansi.slate, color),\n ' npx -y -p thorbit-kb-mcp@latest thorbit-kb-mcp-install --json --api-key thbt_mcp_...',\n '',\n ].join('\\n')\n}\n\nexport function main(): void {\n const options = resolveInstallOptions()\n if (options.help) {\n process.stdout.write(renderHelp(options.color))\n return\n }\n\n if (options.json) {\n process.stdout.write(`${JSON.stringify(buildMcpConfig(options), null, 2)}\\n`)\n return\n }\n\n process.stdout.write(renderInstallInstructions(options))\n}\n\nfunction isMainModule(): boolean {\n const entry = process.argv[1]\n if (!entry) return false\n try {\n return realpathSync(entry) === realpathSync(fileURLToPath(import.meta.url))\n } catch {\n return false\n }\n}\n\nif (isMainModule()) main()\n"],"mappings":"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","names":[]}
|
|
@@ -1,2 +1,27 @@
|
|
|
1
|
+
type InstallOptions = {
|
|
2
|
+
apiKey: string;
|
|
3
|
+
baseUrl?: string;
|
|
4
|
+
keyPath?: string;
|
|
5
|
+
serverName: string;
|
|
6
|
+
json: boolean;
|
|
7
|
+
color: boolean;
|
|
8
|
+
help: boolean;
|
|
9
|
+
};
|
|
10
|
+
declare function readArg(name: string, argv?: string[]): string | undefined;
|
|
11
|
+
declare function hasFlag(name: string, argv?: string[]): boolean;
|
|
12
|
+
declare function resolveInstallOptions(argv?: string[]): InstallOptions;
|
|
13
|
+
declare function buildMcpConfig(options: InstallOptions): {
|
|
14
|
+
mcpServers: {
|
|
15
|
+
[options.serverName]: {
|
|
16
|
+
command: string;
|
|
17
|
+
args: string[];
|
|
18
|
+
env: Record<string, string>;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
declare function renderHelp(color: boolean): string;
|
|
23
|
+
declare function renderBanner(color: boolean): string;
|
|
24
|
+
declare function renderInstallInstructions(options: InstallOptions): string;
|
|
25
|
+
declare function main(): void;
|
|
1
26
|
|
|
2
|
-
export {
|
|
27
|
+
export { type InstallOptions, buildMcpConfig, hasFlag, main, readArg, renderBanner, renderHelp, renderInstallInstructions, resolveInstallOptions };
|
|
@@ -1,2 +1,27 @@
|
|
|
1
|
+
type InstallOptions = {
|
|
2
|
+
apiKey: string;
|
|
3
|
+
baseUrl?: string;
|
|
4
|
+
keyPath?: string;
|
|
5
|
+
serverName: string;
|
|
6
|
+
json: boolean;
|
|
7
|
+
color: boolean;
|
|
8
|
+
help: boolean;
|
|
9
|
+
};
|
|
10
|
+
declare function readArg(name: string, argv?: string[]): string | undefined;
|
|
11
|
+
declare function hasFlag(name: string, argv?: string[]): boolean;
|
|
12
|
+
declare function resolveInstallOptions(argv?: string[]): InstallOptions;
|
|
13
|
+
declare function buildMcpConfig(options: InstallOptions): {
|
|
14
|
+
mcpServers: {
|
|
15
|
+
[options.serverName]: {
|
|
16
|
+
command: string;
|
|
17
|
+
args: string[];
|
|
18
|
+
env: Record<string, string>;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
declare function renderHelp(color: boolean): string;
|
|
23
|
+
declare function renderBanner(color: boolean): string;
|
|
24
|
+
declare function renderInstallInstructions(options: InstallOptions): string;
|
|
25
|
+
declare function main(): void;
|
|
1
26
|
|
|
2
|
-
export {
|
|
27
|
+
export { type InstallOptions, buildMcpConfig, hasFlag, main, readArg, renderBanner, renderHelp, renderInstallInstructions, resolveInstallOptions };
|
|
@@ -1,31 +1,161 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
// bin/thorbit-kb-mcp-install.ts
|
|
4
|
-
|
|
4
|
+
import { realpathSync } from "fs";
|
|
5
|
+
import { fileURLToPath } from "url";
|
|
6
|
+
function readArg(name, argv = process.argv.slice(2)) {
|
|
5
7
|
const prefix = `--${name}=`;
|
|
6
|
-
const inline =
|
|
8
|
+
const inline = argv.find((arg) => arg.startsWith(prefix));
|
|
7
9
|
if (inline) return inline.slice(prefix.length);
|
|
8
|
-
const index =
|
|
9
|
-
return index >= 0 ?
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
10
|
+
const index = argv.indexOf(`--${name}`);
|
|
11
|
+
return index >= 0 ? argv[index + 1] : void 0;
|
|
12
|
+
}
|
|
13
|
+
function hasFlag(name, argv = process.argv.slice(2)) {
|
|
14
|
+
return argv.includes(`--${name}`);
|
|
15
|
+
}
|
|
16
|
+
function resolveInstallOptions(argv = process.argv.slice(2)) {
|
|
17
|
+
return {
|
|
18
|
+
apiKey: readArg("api-key", argv) ?? process.env.THORBIT_API_KEY ?? process.env.THORBIT_MCP_API_KEY ?? "thbt_mcp_...",
|
|
19
|
+
baseUrl: readArg("base-url", argv) ?? process.env.THORBIT_BASE_URL,
|
|
20
|
+
keyPath: readArg("key-path", argv) ?? process.env.THORBIT_KB_MCP_KEY_PATH,
|
|
21
|
+
serverName: readArg("server-name", argv) ?? "thorbit-kb",
|
|
22
|
+
json: hasFlag("json", argv),
|
|
23
|
+
color: !hasFlag("no-color", argv),
|
|
24
|
+
help: hasFlag("help", argv) || hasFlag("h", argv)
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function buildMcpConfig(options) {
|
|
28
|
+
const env = options.keyPath ? { THORBIT_KB_MCP_KEY_PATH: options.keyPath } : { THORBIT_API_KEY: options.apiKey };
|
|
29
|
+
if (options.baseUrl) {
|
|
30
|
+
env.THORBIT_BASE_URL = options.baseUrl.replace(/\/$/, "");
|
|
27
31
|
}
|
|
32
|
+
return {
|
|
33
|
+
mcpServers: {
|
|
34
|
+
[options.serverName]: {
|
|
35
|
+
command: "npx",
|
|
36
|
+
args: ["-y", "thorbit-kb-mcp@latest"],
|
|
37
|
+
env
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
var ansi = {
|
|
43
|
+
reset: "\x1B[0m",
|
|
44
|
+
bold: "\x1B[1m",
|
|
45
|
+
dim: "\x1B[2m",
|
|
46
|
+
terracotta: "\x1B[38;2;198;90;54m",
|
|
47
|
+
cream: "\x1B[38;2;255;244;230m",
|
|
48
|
+
green: "\x1B[38;2;75;181;67m",
|
|
49
|
+
slate: "\x1B[38;2;148;163;184m"
|
|
28
50
|
};
|
|
29
|
-
|
|
51
|
+
function paint(value, code, enabled) {
|
|
52
|
+
return enabled ? `${code}${value}${ansi.reset}` : value;
|
|
53
|
+
}
|
|
54
|
+
function renderHelp(color) {
|
|
55
|
+
return [
|
|
56
|
+
renderBanner(color),
|
|
57
|
+
"",
|
|
58
|
+
"Usage:",
|
|
59
|
+
" npx -y -p thorbit-kb-mcp@latest thorbit-kb-mcp-install [options]",
|
|
60
|
+
"",
|
|
61
|
+
"Options:",
|
|
62
|
+
" --api-key <key> Thorbit MCP API key from Settings -> MCPs.",
|
|
63
|
+
" --key-path <path> File containing the API key. Preferred for shared machines and servers.",
|
|
64
|
+
" --base-url <url> Thorbit app URL. Defaults to https://thorbit.ai.",
|
|
65
|
+
" --server-name <name> MCP client server name. Defaults to thorbit-kb.",
|
|
66
|
+
" --json Print only MCP client JSON.",
|
|
67
|
+
" --no-color Disable ANSI color.",
|
|
68
|
+
" --help Show this help.",
|
|
69
|
+
""
|
|
70
|
+
].join("\n");
|
|
71
|
+
}
|
|
72
|
+
function renderBanner(color) {
|
|
73
|
+
const banner = String.raw`
|
|
74
|
+
_______ _ _ ____ _____ ____ _____ _______ _ ______
|
|
75
|
+
|__ __| | | |/ __ \| __ \| _ \_ _|__ __| | |/ / _ \
|
|
76
|
+
| | | |__| | | | | |__) | |_) || | | | | ' /| |_) |
|
|
77
|
+
| | | __ | | | | _ /| _ < | | | | | < | _ <
|
|
78
|
+
| | | | | | |__| | | \ \| |_) || |_ | | | . \| |_) |
|
|
79
|
+
|_| |_| |_|\____/|_| \_\____/_____| |_| |_|\_\____/
|
|
80
|
+
|
|
81
|
+
MCP
|
|
82
|
+
`;
|
|
83
|
+
return paint(banner, ansi.terracotta, color);
|
|
84
|
+
}
|
|
85
|
+
function renderInstallInstructions(options) {
|
|
86
|
+
const color = options.color;
|
|
87
|
+
const config = buildMcpConfig(options);
|
|
88
|
+
const json = JSON.stringify(config, null, 2);
|
|
89
|
+
const keySetup = options.keyPath ? [
|
|
90
|
+
paint("Key file mode", ansi.terracotta, color),
|
|
91
|
+
` chmod 600 ${options.keyPath}`
|
|
92
|
+
].join("\n") : [
|
|
93
|
+
paint("Safer key-file option", ansi.terracotta, color),
|
|
94
|
+
" mkdir -p ~/.config/thorbit",
|
|
95
|
+
" printf '%s\\n' 'thbt_mcp_...' > ~/.config/thorbit/kb-mcp-key",
|
|
96
|
+
" chmod 600 ~/.config/thorbit/kb-mcp-key",
|
|
97
|
+
"",
|
|
98
|
+
" Then run:",
|
|
99
|
+
" npx -y -p thorbit-kb-mcp@latest thorbit-kb-mcp-install --key-path ~/.config/thorbit/kb-mcp-key"
|
|
100
|
+
].join("\n");
|
|
101
|
+
return [
|
|
102
|
+
renderBanner(color),
|
|
103
|
+
paint("THORBIT KB MCP", ansi.bold + ansi.cream, color),
|
|
104
|
+
paint("Vector-backed knowledge bases for MCP agents.", ansi.slate, color),
|
|
105
|
+
"",
|
|
106
|
+
`${paint("1.", ansi.terracotta, color)} Generate an API key in Thorbit Settings -> MCPs.`,
|
|
107
|
+
`${paint("2.", ansi.terracotta, color)} Add this server config to your MCP client:`,
|
|
108
|
+
"",
|
|
109
|
+
json,
|
|
110
|
+
"",
|
|
111
|
+
`${paint("3.", ansi.terracotta, color)} Restart your MCP client, then call ${paint("thorbit_kb_list", ansi.green, color)} or ${paint("thorbit_kb_create", ansi.green, color)}.`,
|
|
112
|
+
"",
|
|
113
|
+
keySetup,
|
|
114
|
+
"",
|
|
115
|
+
paint("Tools", ansi.terracotta, color),
|
|
116
|
+
" thorbit_kb_create Create a vector-backed Thorbit KB.",
|
|
117
|
+
" thorbit_kb_ingest_url Extract a URL through MCP Scraper and ingest it.",
|
|
118
|
+
" thorbit_kb_ingest_site Map/extract a site through MCP Scraper and ingest pages.",
|
|
119
|
+
" thorbit_kb_ingest_youtube Transcribe YouTube through MCP Scraper and ingest chunks.",
|
|
120
|
+
" thorbit_kb_search Smart RAG search with citations.",
|
|
121
|
+
" thorbit_kb_ask Grounded answers with citations and strategy metadata.",
|
|
122
|
+
"",
|
|
123
|
+
paint("Raw JSON:", ansi.slate, color),
|
|
124
|
+
" npx -y -p thorbit-kb-mcp@latest thorbit-kb-mcp-install --json --api-key thbt_mcp_...",
|
|
125
|
+
""
|
|
126
|
+
].join("\n");
|
|
127
|
+
}
|
|
128
|
+
function main() {
|
|
129
|
+
const options = resolveInstallOptions();
|
|
130
|
+
if (options.help) {
|
|
131
|
+
process.stdout.write(renderHelp(options.color));
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
if (options.json) {
|
|
135
|
+
process.stdout.write(`${JSON.stringify(buildMcpConfig(options), null, 2)}
|
|
30
136
|
`);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
process.stdout.write(renderInstallInstructions(options));
|
|
140
|
+
}
|
|
141
|
+
function isMainModule() {
|
|
142
|
+
const entry = process.argv[1];
|
|
143
|
+
if (!entry) return false;
|
|
144
|
+
try {
|
|
145
|
+
return realpathSync(entry) === realpathSync(fileURLToPath(import.meta.url));
|
|
146
|
+
} catch {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
if (isMainModule()) main();
|
|
151
|
+
export {
|
|
152
|
+
buildMcpConfig,
|
|
153
|
+
hasFlag,
|
|
154
|
+
main,
|
|
155
|
+
readArg,
|
|
156
|
+
renderBanner,
|
|
157
|
+
renderHelp,
|
|
158
|
+
renderInstallInstructions,
|
|
159
|
+
resolveInstallOptions
|
|
160
|
+
};
|
|
31
161
|
//# sourceMappingURL=thorbit-kb-mcp-install.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../bin/thorbit-kb-mcp-install.ts"],"sourcesContent":["function readArg(name: string): string | undefined {\n const prefix = `--${name}=`\n const inline =
|
|
1
|
+
{"version":3,"sources":["../../bin/thorbit-kb-mcp-install.ts"],"sourcesContent":["import { realpathSync } from 'node:fs'\nimport { fileURLToPath } from 'node:url'\n\nexport type InstallOptions = {\n apiKey: string\n baseUrl?: string\n keyPath?: string\n serverName: string\n json: boolean\n color: boolean\n help: boolean\n}\n\nexport function readArg(name: string, argv = process.argv.slice(2)): string | undefined {\n const prefix = `--${name}=`\n const inline = argv.find(arg => arg.startsWith(prefix))\n if (inline) return inline.slice(prefix.length)\n const index = argv.indexOf(`--${name}`)\n return index >= 0 ? argv[index + 1] : undefined\n}\n\nexport function hasFlag(name: string, argv = process.argv.slice(2)): boolean {\n return argv.includes(`--${name}`)\n}\n\nexport function resolveInstallOptions(argv = process.argv.slice(2)): InstallOptions {\n return {\n apiKey: readArg('api-key', argv) ?? process.env.THORBIT_API_KEY ?? process.env.THORBIT_MCP_API_KEY ?? 'thbt_mcp_...',\n baseUrl: readArg('base-url', argv) ?? process.env.THORBIT_BASE_URL,\n keyPath: readArg('key-path', argv) ?? process.env.THORBIT_KB_MCP_KEY_PATH,\n serverName: readArg('server-name', argv) ?? 'thorbit-kb',\n json: hasFlag('json', argv),\n color: !hasFlag('no-color', argv),\n help: hasFlag('help', argv) || hasFlag('h', argv),\n }\n}\n\nexport function buildMcpConfig(options: InstallOptions) {\n const env: Record<string, string> = options.keyPath\n ? { THORBIT_KB_MCP_KEY_PATH: options.keyPath }\n : { THORBIT_API_KEY: options.apiKey }\n\n if (options.baseUrl) {\n env.THORBIT_BASE_URL = options.baseUrl.replace(/\\/$/, '')\n }\n\n return {\n mcpServers: {\n [options.serverName]: {\n command: 'npx',\n args: ['-y', 'thorbit-kb-mcp@latest'],\n env,\n },\n },\n }\n}\n\nconst ansi = {\n reset: '\\u001b[0m',\n bold: '\\u001b[1m',\n dim: '\\u001b[2m',\n terracotta: '\\u001b[38;2;198;90;54m',\n cream: '\\u001b[38;2;255;244;230m',\n green: '\\u001b[38;2;75;181;67m',\n slate: '\\u001b[38;2;148;163;184m',\n}\n\nfunction paint(value: string, code: string, enabled: boolean): string {\n return enabled ? `${code}${value}${ansi.reset}` : value\n}\n\nexport function renderHelp(color: boolean): string {\n return [\n renderBanner(color),\n '',\n 'Usage:',\n ' npx -y -p thorbit-kb-mcp@latest thorbit-kb-mcp-install [options]',\n '',\n 'Options:',\n ' --api-key <key> Thorbit MCP API key from Settings -> MCPs.',\n ' --key-path <path> File containing the API key. Preferred for shared machines and servers.',\n ' --base-url <url> Thorbit app URL. Defaults to https://thorbit.ai.',\n ' --server-name <name> MCP client server name. Defaults to thorbit-kb.',\n ' --json Print only MCP client JSON.',\n ' --no-color Disable ANSI color.',\n ' --help Show this help.',\n '',\n ].join('\\n')\n}\n\nexport function renderBanner(color: boolean): string {\n const banner = String.raw`\n _______ _ _ ____ _____ ____ _____ _______ _ ______\n |__ __| | | |/ __ \\| __ \\| _ \\_ _|__ __| | |/ / _ \\\n | | | |__| | | | | |__) | |_) || | | | | ' /| |_) |\n | | | __ | | | | _ /| _ < | | | | | < | _ <\n | | | | | | |__| | | \\ \\| |_) || |_ | | | . \\| |_) |\n |_| |_| |_|\\____/|_| \\_\\____/_____| |_| |_|\\_\\____/\n\n MCP\n`\n return paint(banner, ansi.terracotta, color)\n}\n\nexport function renderInstallInstructions(options: InstallOptions): string {\n const color = options.color\n const config = buildMcpConfig(options)\n const json = JSON.stringify(config, null, 2)\n const keySetup = options.keyPath\n ? [\n paint('Key file mode', ansi.terracotta, color),\n ` chmod 600 ${options.keyPath}`,\n ].join('\\n')\n : [\n paint('Safer key-file option', ansi.terracotta, color),\n \" mkdir -p ~/.config/thorbit\",\n \" printf '%s\\\\n' 'thbt_mcp_...' > ~/.config/thorbit/kb-mcp-key\",\n ' chmod 600 ~/.config/thorbit/kb-mcp-key',\n '',\n ' Then run:',\n ' npx -y -p thorbit-kb-mcp@latest thorbit-kb-mcp-install --key-path ~/.config/thorbit/kb-mcp-key',\n ].join('\\n')\n\n return [\n renderBanner(color),\n paint('THORBIT KB MCP', ansi.bold + ansi.cream, color),\n paint('Vector-backed knowledge bases for MCP agents.', ansi.slate, color),\n '',\n `${paint('1.', ansi.terracotta, color)} Generate an API key in Thorbit Settings -> MCPs.`,\n `${paint('2.', ansi.terracotta, color)} Add this server config to your MCP client:`,\n '',\n json,\n '',\n `${paint('3.', ansi.terracotta, color)} Restart your MCP client, then call ${paint('thorbit_kb_list', ansi.green, color)} or ${paint('thorbit_kb_create', ansi.green, color)}.`,\n '',\n keySetup,\n '',\n paint('Tools', ansi.terracotta, color),\n ' thorbit_kb_create Create a vector-backed Thorbit KB.',\n ' thorbit_kb_ingest_url Extract a URL through MCP Scraper and ingest it.',\n ' thorbit_kb_ingest_site Map/extract a site through MCP Scraper and ingest pages.',\n ' thorbit_kb_ingest_youtube Transcribe YouTube through MCP Scraper and ingest chunks.',\n ' thorbit_kb_search Smart RAG search with citations.',\n ' thorbit_kb_ask Grounded answers with citations and strategy metadata.',\n '',\n paint('Raw JSON:', ansi.slate, color),\n ' npx -y -p thorbit-kb-mcp@latest thorbit-kb-mcp-install --json --api-key thbt_mcp_...',\n '',\n ].join('\\n')\n}\n\nexport function main(): void {\n const options = resolveInstallOptions()\n if (options.help) {\n process.stdout.write(renderHelp(options.color))\n return\n }\n\n if (options.json) {\n process.stdout.write(`${JSON.stringify(buildMcpConfig(options), null, 2)}\\n`)\n return\n }\n\n process.stdout.write(renderInstallInstructions(options))\n}\n\nfunction isMainModule(): boolean {\n const entry = process.argv[1]\n if (!entry) return false\n try {\n return realpathSync(entry) === realpathSync(fileURLToPath(import.meta.url))\n } catch {\n return false\n }\n}\n\nif (isMainModule()) main()\n"],"mappings":"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","names":[]}
|
|
@@ -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.1
|
|
172
|
+
var VERSION = "0.2.1";
|
|
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.",
|