@thenavidm/youtube-mcp-cli 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +877 -0
  3. package/SKILL.md +162 -0
  4. package/dist/accounts/store.d.ts +41 -0
  5. package/dist/accounts/store.js +110 -0
  6. package/dist/accounts/store.js.map +1 -0
  7. package/dist/auth.d.ts +14 -0
  8. package/dist/auth.js +206 -0
  9. package/dist/auth.js.map +1 -0
  10. package/dist/cli.d.ts +55 -0
  11. package/dist/cli.js +439 -0
  12. package/dist/cli.js.map +1 -0
  13. package/dist/config.d.ts +42 -0
  14. package/dist/config.js +130 -0
  15. package/dist/config.js.map +1 -0
  16. package/dist/doctor.d.ts +7 -0
  17. package/dist/doctor.js +78 -0
  18. package/dist/doctor.js.map +1 -0
  19. package/dist/index.d.ts +14 -0
  20. package/dist/index.js +134 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/safety.d.ts +50 -0
  23. package/dist/safety.js +84 -0
  24. package/dist/safety.js.map +1 -0
  25. package/dist/server.d.ts +10 -0
  26. package/dist/server.js +28 -0
  27. package/dist/server.js.map +1 -0
  28. package/dist/tools/account.d.ts +10 -0
  29. package/dist/tools/account.js +222 -0
  30. package/dist/tools/account.js.map +1 -0
  31. package/dist/tools/index.d.ts +9 -0
  32. package/dist/tools/index.js +12 -0
  33. package/dist/tools/index.js.map +1 -0
  34. package/dist/tools/kit.d.ts +57 -0
  35. package/dist/tools/kit.js +78 -0
  36. package/dist/tools/kit.js.map +1 -0
  37. package/dist/tools/research.d.ts +16 -0
  38. package/dist/tools/research.js +232 -0
  39. package/dist/tools/research.js.map +1 -0
  40. package/dist/tools/transcripts.d.ts +9 -0
  41. package/dist/tools/transcripts.js +123 -0
  42. package/dist/tools/transcripts.js.map +1 -0
  43. package/dist/tools/types.d.ts +6 -0
  44. package/dist/tools/types.js +2 -0
  45. package/dist/tools/types.js.map +1 -0
  46. package/dist/transport/http.d.ts +23 -0
  47. package/dist/transport/http.js +83 -0
  48. package/dist/transport/http.js.map +1 -0
  49. package/dist/youtube/api.d.ts +47 -0
  50. package/dist/youtube/api.js +176 -0
  51. package/dist/youtube/api.js.map +1 -0
  52. package/dist/youtube/transcripts.d.ts +65 -0
  53. package/dist/youtube/transcripts.js +321 -0
  54. package/dist/youtube/transcripts.js.map +1 -0
  55. package/dist/youtube/ytdlp.d.ts +35 -0
  56. package/dist/youtube/ytdlp.js +145 -0
  57. package/dist/youtube/ytdlp.js.map +1 -0
  58. package/package.json +65 -0
package/dist/cli.js ADDED
@@ -0,0 +1,439 @@
1
+ /**
2
+ * The CLI adapter.
3
+ *
4
+ * `register()` in tools/kit.ts turns a `ToolSpec` into an MCP tool. This turns
5
+ * the same spec into a shell command, from the same `ALL_TOOLS` array, through
6
+ * the same handler and the same `WriteGuard`. Nothing is described twice, so a
7
+ * tool added tomorrow is a command tomorrow and the two surfaces cannot drift.
8
+ *
9
+ * The command IS the tool name. `list_comments` runs as `list-comments`, and the
10
+ * underscore form works too. Zod is the only schema: every flag, its help text
11
+ * and its validation come from the shape the MCP tool already declares.
12
+ */
13
+ import { z } from "zod";
14
+ import { zodToJsonSchema } from "zod-to-json-schema";
15
+ import { loadConfig } from "./config.js";
16
+ import { WriteGuard } from "./safety.js";
17
+ import { ALL_TOOLS } from "./tools/index.js";
18
+ import { makeContext } from "./tools/kit.js";
19
+ import { YouTubeApiError } from "./youtube/api.js";
20
+ /**
21
+ * Peel `.optional()`, `.default()` and `.nullable()` to reach the real type.
22
+ *
23
+ * A description can sit on either the wrapper or the inner type depending on
24
+ * the order the tool author chained them, so both are collected on the way
25
+ * down and the outermost one wins.
26
+ */
27
+ function unwrap(schema) {
28
+ let inner = schema;
29
+ let optional = false;
30
+ let description = schema.description;
31
+ for (;;) {
32
+ const typeName = inner._def.typeName;
33
+ if (typeName === "ZodOptional" || typeName === "ZodDefault" || typeName === "ZodNullable") {
34
+ if (typeName !== "ZodNullable")
35
+ optional = true;
36
+ inner = inner._def.innerType;
37
+ description ??= inner.description;
38
+ continue;
39
+ }
40
+ return { inner, optional, description };
41
+ }
42
+ }
43
+ function kindOf(schema) {
44
+ const typeName = schema._def.typeName;
45
+ switch (typeName) {
46
+ case "ZodString":
47
+ return { kind: "string", repeatable: false };
48
+ case "ZodNumber":
49
+ return { kind: "number", repeatable: false };
50
+ case "ZodBoolean":
51
+ return { kind: "boolean", repeatable: false };
52
+ case "ZodEnum":
53
+ return {
54
+ kind: "enum",
55
+ choices: schema._def.values,
56
+ repeatable: false,
57
+ };
58
+ case "ZodArray": {
59
+ // An array of scalars is repeatable (`--text a --text b`). An array of
60
+ // objects is not worth flattening, so it takes JSON.
61
+ const element = unwrap(schema._def.type).inner;
62
+ const elementKind = element._def.typeName;
63
+ // An enum element is a word you type, so it belongs with the scalars.
64
+ const scalar = elementKind === "ZodString" || elementKind === "ZodNumber" || elementKind === "ZodEnum";
65
+ return { kind: scalar ? "string" : "json", repeatable: true };
66
+ }
67
+ default:
68
+ // Objects, unions, records and anything else take a JSON literal.
69
+ return { kind: "json", repeatable: false };
70
+ }
71
+ }
72
+ /** Turn one schema entry into a flag. */
73
+ function toFlag(key, schema) {
74
+ const { inner, optional, description } = unwrap(schema);
75
+ const { kind, choices, repeatable } = kindOf(inner);
76
+ return {
77
+ key,
78
+ flag: `--${key.replace(/_/g, "-")}`,
79
+ kind,
80
+ required: !optional,
81
+ repeatable,
82
+ choices,
83
+ help: description ?? "",
84
+ };
85
+ }
86
+ export function flagsFor(shape) {
87
+ return Object.entries(shape).map(([key, schema]) => toFlag(key, schema));
88
+ }
89
+ class UsageError extends Error {
90
+ }
91
+ /** Accept a flag as `--foo-bar`, `--foo_bar`, or `foo_bar`. */
92
+ function normalize(token) {
93
+ return token.replace(/^--/, "").replace(/-/g, "_");
94
+ }
95
+ function coerce(flag, raw) {
96
+ switch (flag.kind) {
97
+ case "number": {
98
+ const value = Number(raw);
99
+ if (!Number.isFinite(value))
100
+ throw new UsageError(`${flag.flag} expects a number, got '${raw}'.`);
101
+ return value;
102
+ }
103
+ case "enum":
104
+ if (flag.choices && !flag.choices.includes(raw)) {
105
+ throw new UsageError(`${flag.flag} expects one of: ${flag.choices.join(", ")}. Got '${raw}'.`);
106
+ }
107
+ return raw;
108
+ case "json":
109
+ try {
110
+ return JSON.parse(raw);
111
+ }
112
+ catch {
113
+ throw new UsageError(`${flag.flag} expects JSON, got '${raw}'.`);
114
+ }
115
+ default:
116
+ return raw;
117
+ }
118
+ }
119
+ /**
120
+ * Parse argv against a tool's flags.
121
+ *
122
+ * Zod does the real validation afterwards, so this only has to get the values
123
+ * into the right JavaScript types and catch the mistakes Zod would report in
124
+ * terms of a schema the person at the terminal never sees.
125
+ */
126
+ export function parseArgs(argv, flags) {
127
+ const byKey = new Map(flags.map((f) => [f.key, f]));
128
+ const out = {};
129
+ const positional = [];
130
+ for (let i = 0; i < argv.length; i++) {
131
+ const token = argv[i];
132
+ if (!token.startsWith("--")) {
133
+ positional.push(token);
134
+ continue;
135
+ }
136
+ // `--flag=value` and `--flag value` are both normal to type.
137
+ const equals = token.indexOf("=");
138
+ const name = normalize(equals === -1 ? token : token.slice(0, equals));
139
+ const flag = byKey.get(name);
140
+ if (!flag)
141
+ throw new UsageError(`Unknown option ${token}.`);
142
+ if (flag.kind === "boolean") {
143
+ if (equals !== -1) {
144
+ const value = token.slice(equals + 1);
145
+ out[flag.key] = value !== "false" && value !== "0";
146
+ }
147
+ else {
148
+ out[flag.key] = true;
149
+ }
150
+ continue;
151
+ }
152
+ const raw = equals === -1 ? argv[++i] : token.slice(equals + 1);
153
+ if (raw === undefined)
154
+ throw new UsageError(`${flag.flag} expects a value.`);
155
+ const value = coerce(flag, raw);
156
+ if (flag.repeatable) {
157
+ out[flag.key] = [...(out[flag.key] ?? []), value];
158
+ }
159
+ else {
160
+ out[flag.key] = value;
161
+ }
162
+ }
163
+ // One bare argument fills the first required flag, so `search-posts "cats"`
164
+ // works the way anyone would expect it to before reading any help.
165
+ if (positional.length > 0) {
166
+ const target = flags.find((f) => f.required && out[f.key] === undefined);
167
+ if (!target)
168
+ throw new UsageError(`Unexpected argument '${positional[0]}'.`);
169
+ if (positional.length > 1)
170
+ throw new UsageError(`Unexpected argument '${positional[1]}'.`);
171
+ const value = coerce(target, positional[0]);
172
+ out[target.key] = target.repeatable ? [value] : value;
173
+ }
174
+ return out;
175
+ }
176
+ /** Exit codes, so a script can branch without parsing the message. */
177
+ export const EXIT = {
178
+ ok: 0, usage: 2, notFound: 3, auth: 4, api: 5, rateLimited: 7, config: 10,
179
+ };
180
+ /** Map a thrown error onto one of those, from the shape the API gave back. */
181
+ export function exitCodeFor(error) {
182
+ const e = error;
183
+ const status = e?.status;
184
+ const text = `${e?.code ?? ""} ${e?.message ?? ""}`.toLowerCase();
185
+ // Google sends a used-up quota as a 403, so the reason decides before the
186
+ // status can read it as a rejected credential.
187
+ if (status === 429 || /quota|ratelimit|rate ?limit/i.test(`${e?.reason ?? ""} ${text}`))
188
+ return EXIT.rateLimited;
189
+ // Config before auth: "no account configured" mentions a token, and matching
190
+ // auth first sent someone who had configured nothing looking for an expired
191
+ // credential. Only when there is no HTTP status, so a real 401 still wins.
192
+ if (!status && /not configured|no [a-z ]*(account|credential|token|key)s? (is |are )?configured|missing .*env/.test(text))
193
+ return EXIT.config;
194
+ if (status === 401 || status === 403 || /auth|credential|token/.test(text))
195
+ return EXIT.auth;
196
+ if (status === 404 || /not found/.test(text))
197
+ return EXIT.notFound;
198
+ if (/will not run without|read-only|is unavailable/.test(text))
199
+ return EXIT.usage;
200
+ if (typeof status === "number" && status >= 500)
201
+ return EXIT.api;
202
+ return EXIT.api;
203
+ }
204
+ /**
205
+ * `--select id,post.title` keeps only the named fields. Dotted paths descend,
206
+ * arrays are traversed element-wise. This is what makes a long feed affordable.
207
+ */
208
+ export function selectFields(data, paths) {
209
+ if (Array.isArray(data))
210
+ return data.map((d) => selectFields(d, paths));
211
+ if (data === null || typeof data !== "object")
212
+ return data;
213
+ // Paths are grouped by their first segment before recursing. Walking them one
214
+ // at a time and assigning `out[head]` each time meant the last path won:
215
+ // `--select posts.uri,posts.text` returned only the text, silently.
216
+ const byHead = new Map();
217
+ for (const path of paths) {
218
+ const [head, ...rest] = path.split(".");
219
+ if (head === undefined)
220
+ continue;
221
+ const group = byHead.get(head) ?? [];
222
+ if (rest.length)
223
+ group.push(rest.join("."));
224
+ byHead.set(head, group);
225
+ }
226
+ const out = {};
227
+ for (const [head, rest] of byHead) {
228
+ const value = data[head];
229
+ if (value === undefined)
230
+ continue;
231
+ out[head] = rest.length ? selectFields(value, rest) : value;
232
+ }
233
+ return out;
234
+ }
235
+ /**
236
+ * Print a handler result.
237
+ *
238
+ * Reading tools already return the tagged text from `format/`, which is the
239
+ * shaped-for-a-model output and is just as readable in a terminal. Writing
240
+ * tools return a small object. `--json` forces JSON either way so a script
241
+ * never has to know which kind of tool it called.
242
+ */
243
+ function emit(data, format) {
244
+ if (format === "text" && typeof data === "string") {
245
+ process.stdout.write(data.endsWith("\n") ? data : `${data}\n`);
246
+ return;
247
+ }
248
+ const json = format === "compact" ? JSON.stringify(data) : JSON.stringify(data, null, 2);
249
+ process.stdout.write(`${json}\n`);
250
+ }
251
+ /** Errors are JSON on stderr, always, so a caller parses one shape. */
252
+ function emitError(error) {
253
+ const payload = error instanceof YouTubeApiError
254
+ ? error.toJSON()
255
+ : { error: error?.message ?? String(error) };
256
+ process.stderr.write(`${JSON.stringify(payload, null, 2)}\n`);
257
+ }
258
+ /* -------------------------------------------------------------------- help */
259
+ function commandName(tool) {
260
+ return tool.replace(/_/g, "-");
261
+ }
262
+ /** Where help text starts, when the flag is short enough to leave room. */
263
+ const COLUMN = 34;
264
+ /**
265
+ * The name this was invoked as, so examples are copy-pasteable.
266
+ *
267
+ * The package ships two binaries onto the same file. Printing `youtube-mcp` at
268
+ * someone who typed `youtube-cli` hands them a command that works but is not
269
+ * the one they have in their fingers.
270
+ */
271
+ function binName() {
272
+ const name = (process.argv[1] ?? "").split("/").pop() ?? "";
273
+ return name.startsWith("youtube-cli") ? "youtube-cli" : "youtube-mcp";
274
+ }
275
+ function renderToolHelp(spec) {
276
+ const flags = flagsFor(spec.schema);
277
+ const required = flags.filter((f) => f.required);
278
+ const optional = flags.filter((f) => !f.required);
279
+ const usage = [
280
+ `${binName()} ${commandName(spec.name)}`,
281
+ ...required.map((f) => `${f.flag} <${f.kind}>`),
282
+ optional.length > 0 ? "[options]" : "",
283
+ ]
284
+ .filter(Boolean)
285
+ .join(" ");
286
+ const lines = [``, spec.description.trim(), ``, `Usage:`, ` ${usage}`, ``];
287
+ const describe = (list, heading) => {
288
+ if (list.length === 0)
289
+ return;
290
+ lines.push(`${heading}:`);
291
+ for (const f of list) {
292
+ const placeholder = f.kind === "boolean" ? "" : ` <${f.choices ? f.choices.join("|") : f.kind}>`;
293
+ const left = ` ${f.flag}${placeholder}`;
294
+ const help = f.repeatable ? `${f.help} Repeatable.` : f.help;
295
+ if (!help) {
296
+ lines.push(left);
297
+ }
298
+ else if (left.length < COLUMN) {
299
+ lines.push(`${left.padEnd(COLUMN)}${help}`);
300
+ }
301
+ else {
302
+ // A long enum spelled out in the placeholder would push the help off
303
+ // the line, so it gets its own.
304
+ lines.push(left, `${" ".repeat(COLUMN)}${help}`);
305
+ }
306
+ }
307
+ lines.push(``);
308
+ };
309
+ describe(required, "Required");
310
+ describe(optional, "Options");
311
+ lines.push(`Output:`);
312
+ lines.push(` --json force JSON`);
313
+ lines.push(` --compact force single-line JSON`);
314
+ lines.push(` --agent machine mode: JSON, compact, no prompts, no color`);
315
+ lines.push(` --select <a,b.c> keep only these fields, dotted paths descend`);
316
+ lines.push(``);
317
+ lines.push(`Risk: ${spec.risk}`);
318
+ lines.push(``);
319
+ return lines.join("\n");
320
+ }
321
+ function renderToolList(tools) {
322
+ const width = Math.max(...tools.map((t) => commandName(t.name).length)) + 2;
323
+ const bin = binName();
324
+ const lines = [``, `${bin} commands (${tools.length})`, ``];
325
+ for (const tool of tools) {
326
+ const mark = tool.risk === "read" ? " " : tool.risk === "destructive" ? "!" : "*";
327
+ lines.push(` ${mark} ${commandName(tool.name).padEnd(width)}${tool.title}`);
328
+ }
329
+ lines.push(``);
330
+ lines.push(` * writes ! irreversible, needs --confirm`);
331
+ lines.push(``);
332
+ lines.push(` ${bin} <command> --help what it takes`);
333
+ lines.push(` ${bin} schema <command> the JSON schema an MCP client sees`);
334
+ lines.push(``);
335
+ return lines.join("\n");
336
+ }
337
+ /* ---------------------------------------------------------------- dispatch */
338
+ /** The tools this process will expose, with READ_ONLY applied exactly as the server applies it. */
339
+ function visibleTools(guard) {
340
+ return ALL_TOOLS.filter((tool) => !guard.readOnly || tool.risk === "read");
341
+ }
342
+ export function isCliCommand(argv) {
343
+ const first = argv[0];
344
+ if (!first || first.startsWith("-"))
345
+ return false;
346
+ if (first === "tools" || first === "schema")
347
+ return true;
348
+ const name = normalize(first);
349
+ return ALL_TOOLS.some((tool) => tool.name === name);
350
+ }
351
+ export async function runCli(argv) {
352
+ const config = loadConfig();
353
+ const guard = new WriteGuard(config, "cli");
354
+ const tools = visibleTools(guard);
355
+ const command = argv[0];
356
+ const rest = argv.slice(1);
357
+ if (command === "tools") {
358
+ process.stdout.write(renderToolList(tools));
359
+ return 0;
360
+ }
361
+ if (command === "schema") {
362
+ const wanted = normalize(rest[0] ?? "");
363
+ const spec = tools.find((t) => t.name === wanted);
364
+ if (!spec) {
365
+ emitError(new Error(`Unknown command '${rest[0] ?? ""}'. Run \`${binName()} tools\`.`));
366
+ return 1;
367
+ }
368
+ // The same JSON Schema an MCP client receives, so the two surfaces are
369
+ // provably one. Emitting the Zod object instead printed its internals
370
+ // (`_def`, `~standard`), which is not a schema anyone can consume.
371
+ emit(zodToJsonSchema(z.object(spec.schema).describe(spec.description)), "json");
372
+ return 0;
373
+ }
374
+ const name = normalize(command);
375
+ const spec = tools.find((t) => t.name === name);
376
+ if (!spec) {
377
+ const hidden = ALL_TOOLS.find((t) => t.name === name);
378
+ emitError(new Error(hidden
379
+ ? `${name} is unavailable: this server is running with YOUTUBE_READ_ONLY=1.`
380
+ : `Unknown command '${command}'. Run \`${binName()} tools\`.`));
381
+ return 1;
382
+ }
383
+ if (rest.includes("--help") || rest.includes("-h")) {
384
+ process.stdout.write(renderToolHelp(spec));
385
+ return 0;
386
+ }
387
+ // `--agent` is the whole machine-readable posture in one flag, so an agent
388
+ // does not have to remember four and silently forget one.
389
+ const agent = rest.includes("--agent");
390
+ const format = rest.includes("--compact") || agent ? "compact" : rest.includes("--json") ? "json" : "text";
391
+ const selectAt = rest.findIndex((t) => t === "--select" || t.startsWith("--select="));
392
+ const selectRaw = selectAt === -1
393
+ ? undefined
394
+ : rest[selectAt].includes("=")
395
+ ? rest[selectAt].split("=").slice(1).join("=")
396
+ : rest[selectAt + 1];
397
+ const select = selectRaw?.split(",").map((f) => f.trim()).filter(Boolean);
398
+ const consumed = new Set(["--json", "--compact", "--agent", "--no-color", "--no-input", "--yes"]);
399
+ const toolArgv = rest.filter((token, i) => {
400
+ if (consumed.has(token))
401
+ return false;
402
+ if (token === "--select" || token.startsWith("--select="))
403
+ return false;
404
+ if (selectAt !== -1 && i === selectAt + 1 && !rest[selectAt].includes("="))
405
+ return false;
406
+ return true;
407
+ });
408
+ try {
409
+ const parsed = parseArgs(toolArgv, flagsFor(spec.schema));
410
+ // Zod is the authority on validity, exactly as it is for an MCP call.
411
+ const args = z.object(spec.schema).parse(parsed);
412
+ const ctx = makeContext(config, guard);
413
+ // The same gate the MCP path applies, so --confirm, READ_ONLY,
414
+ // ALLOW_DESTRUCTIVE and the audit log all behave identically here.
415
+ if (spec.risk !== "read") {
416
+ const summary = spec.summary?.(args) ?? spec.name;
417
+ guard.check(spec.name, spec.risk, args.confirm, summary);
418
+ }
419
+ const result = await spec.handler(args, ctx);
420
+ emit(select?.length ? selectFields(result, select) : result, format);
421
+ return EXIT.ok;
422
+ }
423
+ catch (error) {
424
+ if (error instanceof UsageError) {
425
+ emitError(error);
426
+ if (!agent)
427
+ process.stderr.write(renderToolHelp(spec));
428
+ return EXIT.usage;
429
+ }
430
+ if (error instanceof z.ZodError) {
431
+ const first = error.issues[0];
432
+ emitError(new Error(first ? `${first.path.join(".") || "argument"}: ${first.message}` : error.message));
433
+ return EXIT.usage;
434
+ }
435
+ emitError(error);
436
+ return exitCodeFor(error);
437
+ }
438
+ }
439
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Configuration.
3
+ *
4
+ * Channels come from two places, and both are read on every start:
5
+ *
6
+ * YOUTUBE_ACCOUNTS JSON array, several channels at once
7
+ * YOUTUBE_REFRESH_TOKEN one channel
8
+ * ~/.youtube-mcp-cli/ every channel saved by `youtube-cli login`
9
+ *
10
+ * An env channel wins over a saved one with the same id, so a client config can
11
+ * always override the store. The API key is YOUTUBE_API_KEY, else the one saved
12
+ * by `youtube-cli login --api-key`. Transcripts need none of these.
13
+ */
14
+ export type Account = {
15
+ /** Stable key used by the `account` tool parameter. Channel handle or name. */
16
+ id: string;
17
+ name: string;
18
+ clientId: string;
19
+ clientSecret: string;
20
+ refreshToken?: string;
21
+ accessToken?: string;
22
+ };
23
+ export type Config = {
24
+ apiKey?: string;
25
+ accounts: Account[];
26
+ readOnly: boolean;
27
+ /** Block uploads, deletes and anything else that cannot be undone. */
28
+ allowDestructive: boolean;
29
+ requestTimeoutMs: number;
30
+ defaultLanguage: string;
31
+ /** Append-only JSON-lines record of every attempted write. */
32
+ auditPath?: string;
33
+ };
34
+ export declare function loadConfig(): Config;
35
+ /**
36
+ * Resolve the `account` tool parameter to one connected channel.
37
+ *
38
+ * With two or more channels connected and no choice made, this throws rather
39
+ * than defaulting. Defaulting to "the first one" is how an agent silently
40
+ * uploads to the wrong channel, and that is not recoverable.
41
+ */
42
+ export declare function resolveAccount(config: Config, requested?: string): Account | undefined;
package/dist/config.js ADDED
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Configuration.
3
+ *
4
+ * Channels come from two places, and both are read on every start:
5
+ *
6
+ * YOUTUBE_ACCOUNTS JSON array, several channels at once
7
+ * YOUTUBE_REFRESH_TOKEN one channel
8
+ * ~/.youtube-mcp-cli/ every channel saved by `youtube-cli login`
9
+ *
10
+ * An env channel wins over a saved one with the same id, so a client config can
11
+ * always override the store. The API key is YOUTUBE_API_KEY, else the one saved
12
+ * by `youtube-cli login --api-key`. Transcripts need none of these.
13
+ */
14
+ import { loadStore } from "./accounts/store.js";
15
+ function bool(value, fallback) {
16
+ if (value === undefined || value.trim() === "")
17
+ return fallback;
18
+ return !["0", "false", "no", "off"].includes(value.trim().toLowerCase());
19
+ }
20
+ /**
21
+ * Both spellings of the OAuth client are accepted.
22
+ *
23
+ * `YOUTUBE_CLIENT_ID` and `YOUTUBE_OAUTH_CLIENT_ID` are both in wide use and
24
+ * people reasonably expect either to work. A refresh token only ever works
25
+ * against the client that issued it, so accepting one spelling and silently
26
+ * ignoring the other produces an `unauthorized_client` that looks like a
27
+ * revoked grant. Read both.
28
+ */
29
+ function oauthClient() {
30
+ const id = (process.env.YOUTUBE_CLIENT_ID ?? process.env.YOUTUBE_OAUTH_CLIENT_ID ?? "").trim();
31
+ const secret = (process.env.YOUTUBE_CLIENT_SECRET ??
32
+ process.env.YOUTUBE_OAUTH_CLIENT_SECRET ??
33
+ "").trim();
34
+ return { id, secret };
35
+ }
36
+ /** Env channels first, then saved ones whose id the env has not already claimed. */
37
+ function parseAccounts(store) {
38
+ const fromEnv = envAccounts();
39
+ const saved = store.channels
40
+ .filter((c) => c.refresh_token && !fromEnv.some((e) => e.id === c.id))
41
+ .map((c) => ({
42
+ id: c.id,
43
+ name: c.name,
44
+ clientId: c.client_id,
45
+ clientSecret: c.client_secret,
46
+ refreshToken: c.refresh_token,
47
+ }));
48
+ return [...fromEnv, ...saved];
49
+ }
50
+ function envAccounts() {
51
+ const { id: defaultId, secret: defaultSecret } = oauthClient();
52
+ const raw = process.env.YOUTUBE_ACCOUNTS?.trim();
53
+ if (raw) {
54
+ let parsed;
55
+ try {
56
+ parsed = JSON.parse(raw);
57
+ }
58
+ catch {
59
+ throw new Error("YOUTUBE_ACCOUNTS is not valid JSON. It should be an array like " +
60
+ '[{"name":"Main","refresh_token":"1//..."}].');
61
+ }
62
+ if (!Array.isArray(parsed))
63
+ throw new Error("YOUTUBE_ACCOUNTS must be a JSON array.");
64
+ return parsed.map((entry, i) => {
65
+ const a = entry;
66
+ const name = a.name ?? a.account_name ?? a.channel ?? `account-${i + 1}`;
67
+ return {
68
+ id: (a.id ?? name).toLowerCase().replace(/^@/, ""),
69
+ name,
70
+ clientId: a.client_id ?? defaultId,
71
+ clientSecret: a.client_secret ?? defaultSecret,
72
+ refreshToken: a.refresh_token,
73
+ accessToken: a.access_token,
74
+ };
75
+ });
76
+ }
77
+ const refreshToken = process.env.YOUTUBE_REFRESH_TOKEN?.trim();
78
+ const accessToken = process.env.YOUTUBE_ACCESS_TOKEN?.trim();
79
+ if (!refreshToken && !accessToken)
80
+ return [];
81
+ const name = process.env.YOUTUBE_CHANNEL_NAME?.trim() || "default";
82
+ return [
83
+ {
84
+ id: name.toLowerCase().replace(/^@/, ""),
85
+ name,
86
+ clientId: defaultId,
87
+ clientSecret: defaultSecret,
88
+ refreshToken,
89
+ accessToken,
90
+ },
91
+ ];
92
+ }
93
+ export function loadConfig() {
94
+ const store = loadStore();
95
+ return {
96
+ apiKey: process.env.YOUTUBE_API_KEY?.trim() || store.api_key || undefined,
97
+ accounts: parseAccounts(store),
98
+ readOnly: bool(process.env.YOUTUBE_READ_ONLY, false),
99
+ allowDestructive: bool(process.env.YOUTUBE_ALLOW_DESTRUCTIVE, true),
100
+ requestTimeoutMs: Number(process.env.YOUTUBE_REQUEST_TIMEOUT_MS ?? 30000),
101
+ defaultLanguage: process.env.YOUTUBE_TRANSCRIPT_LANG?.trim() || "en",
102
+ auditPath: process.env.YOUTUBE_AUDIT_LOG?.trim() || undefined,
103
+ };
104
+ }
105
+ /**
106
+ * Resolve the `account` tool parameter to one connected channel.
107
+ *
108
+ * With two or more channels connected and no choice made, this throws rather
109
+ * than defaulting. Defaulting to "the first one" is how an agent silently
110
+ * uploads to the wrong channel, and that is not recoverable.
111
+ */
112
+ export function resolveAccount(config, requested) {
113
+ const { accounts } = config;
114
+ if (accounts.length === 0)
115
+ return undefined;
116
+ if (requested) {
117
+ const want = requested.toLowerCase().replace(/^@/, "").trim();
118
+ const match = accounts.find((a) => a.id === want || a.name.toLowerCase() === want) ??
119
+ accounts.find((a) => a.name.toLowerCase().includes(want) || a.id.includes(want));
120
+ if (!match) {
121
+ throw new Error(`No connected channel matches "${requested}". Connected: ${accounts.map((a) => a.name).join(", ")}. Call list_accounts to see them.`);
122
+ }
123
+ return match;
124
+ }
125
+ if (accounts.length > 1) {
126
+ throw new Error(`${accounts.length} channels are connected (${accounts.map((a) => a.name).join(", ")}). Pass account=<name or @handle> so this runs against the right one.`);
127
+ }
128
+ return accounts[0];
129
+ }
130
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * `youtube-cli doctor`: say what is set up and what is not, in the order that
3
+ * matters. Most setup problems here are a missing API in the Cloud project or
4
+ * an OAuth client that does not match the token, and neither is obvious from
5
+ * the error the API returns at call time.
6
+ */
7
+ export declare function doctor(): Promise<number>;