@liorium/youtube-omni-mcp 0.1.2 → 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/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.0 - 2026-05-14
4
+
5
+ - Add five Creator Research tools: outlier video discovery, hook comparison, topic angle extraction, comment pain-point summarization, and video angle matrix generation.
6
+ - Add governed operation tool foundations for metadata, upload, thumbnail, playlist, comment moderation, and community post workflows.
7
+ - Keep operation tools hidden by default and dry-run-only when explicitly gated with `YOUTUBE_OMNI_ENABLE_WRITE_TOOLS=true` and `YOUTUBE_OMNI_DRY_RUN_WRITES=true`.
8
+ - Add concrete MCP schemas for research and gated operation tools.
9
+ - Update safety policy and capability reporting for the v0.2 phase.
10
+
3
11
  ## 0.1.2 - 2026-05-14
4
12
 
5
13
  - Add concrete MCP `inputSchema` definitions for all v0 tools so agents can pass required arguments reliably.
package/README.md CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  `youtube-omni` is a full-scope YouTube Creator Intelligence + Operations + Analytics + Production MCP project.
4
4
 
5
- Current implementation phase: **v0 read-only foundation**.
5
+ Current implementation phase: **v0.2 Creator Research + governed write foundation**.
6
6
 
7
- ## v0 boundary
7
+ ## v0.2 default boundary
8
8
 
9
- Enabled in v0:
9
+ Enabled by default:
10
10
 
11
11
  - public discovery/search
12
12
  - video details/comparison
@@ -14,6 +14,7 @@ Enabled in v0:
14
14
  - transcript segments/full text/structure analysis
15
15
  - comments read/summarize
16
16
  - research brief drafts
17
+ - Creator Research synthesis tools
17
18
  - safety/capability reporting
18
19
 
19
20
  Locked for later phases, but part of final scope:
@@ -29,8 +30,9 @@ Locked for later phases, but part of final scope:
29
30
 
30
31
  ## Safety defaults
31
32
 
32
- - No write tools are exposed in v0.
33
- - No download tools are exposed in v0.
33
+ - No write tools are exposed by default.
34
+ - No download tools are exposed by default.
35
+ - Operation tools are dry-run-only stubs when `YOUTUBE_OMNI_ENABLE_WRITE_TOOLS=true` and `YOUTUBE_OMNI_DRY_RUN_WRITES=true` are both set.
34
36
  - Secrets must be supplied via environment variables and are never committed.
35
37
  - Write/download/destructive namespaces remain environment-gated for later phases.
36
38
 
@@ -57,6 +59,7 @@ Use this shape in an `mcp.json`-style client configuration:
57
59
  "YOUTUBE_OMNI_MAX_RESULTS": "50",
58
60
  "YOUTUBE_OMNI_ENABLE_OUTLIER": "false",
59
61
  "YOUTUBE_OMNI_ENABLE_WRITE_TOOLS": "false",
62
+ "YOUTUBE_OMNI_DRY_RUN_WRITES": "false",
60
63
  "YOUTUBE_OMNI_ENABLE_DOWNLOAD_TOOLS": "false",
61
64
  "YOUTUBE_OMNI_ENABLE_DESTRUCTIVE_TOOLS": "false"
62
65
  }
@@ -69,7 +72,7 @@ For local development before publishing, use a packed tarball:
69
72
 
70
73
  ```bash
71
74
  npm pack
72
- npx -y ./liorium-youtube-omni-mcp-0.1.2.tgz
75
+ npx -y ./liorium-youtube-omni-mcp-0.2.0.tgz
73
76
  ```
74
77
 
75
78
  ## Development
@@ -93,7 +96,7 @@ All research/specification documents are under `research/`. Implementation docs
93
96
 
94
97
  Key docs:
95
98
 
96
- - `docs/v0-spec.md` — current read-only boundary
97
- - `docs/tool-schema.md` — v0 tool contract
99
+ - `docs/v0-spec.md` — original read-only foundation boundary
100
+ - `docs/tool-schema.md` — v0.2 default and gated tool contract
98
101
  - `docs/safety-policy.md` — risk gates and default locks
99
- - `docs/v0.2-ac-plan.md` — next implementation plan for Creator Research + governed write foundations
102
+ - `docs/v0.2-ac-plan.md` — implementation plan for Creator Research + governed write foundations
@@ -4,6 +4,8 @@ export interface YoutubeOmniConfig {
4
4
  mongoUri?: string;
5
5
  maxResults: number;
6
6
  enableWriteTools: boolean;
7
+ dryRunWrites: boolean;
8
+ approvalAuditPath?: string;
7
9
  enableDownloadTools: boolean;
8
10
  }
9
11
  export declare function loadConfig(env?: NodeJS.ProcessEnv): YoutubeOmniConfig;
@@ -6,6 +6,8 @@ export function loadConfig(env = process.env) {
6
6
  mongoUri: env.YOUTUBE_OMNI_MONGO_URI,
7
7
  maxResults: Number(env.YOUTUBE_OMNI_MAX_RESULTS ?? 50),
8
8
  enableWriteTools: env.YOUTUBE_OMNI_ENABLE_WRITE_TOOLS === 'true',
9
+ dryRunWrites: env.YOUTUBE_OMNI_DRY_RUN_WRITES === 'true',
10
+ approvalAuditPath: env.YOUTUBE_OMNI_APPROVAL_AUDIT_PATH,
9
11
  enableDownloadTools: env.YOUTUBE_OMNI_ENABLE_DOWNLOAD_TOOLS === 'true'
10
12
  };
11
13
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAWpD,MAAM,UAAU,UAAU,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC7D,OAAO;QACL,aAAa,EAAE,GAAG,CAAC,eAAe;QAClC,aAAa,EAAE,GAAG,CAAC,2BAA2B,KAAK,MAAM;QACzD,QAAQ,EAAE,GAAG,CAAC,sBAAsB;QACpC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,wBAAwB,IAAI,EAAE,CAAC;QACtD,gBAAgB,EAAE,GAAG,CAAC,+BAA+B,KAAK,MAAM;QAChE,mBAAmB,EAAE,GAAG,CAAC,kCAAkC,KAAK,MAAM;KACvE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAyB;IACtD,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAapD,MAAM,UAAU,UAAU,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC7D,OAAO;QACL,aAAa,EAAE,GAAG,CAAC,eAAe;QAClC,aAAa,EAAE,GAAG,CAAC,2BAA2B,KAAK,MAAM;QACzD,QAAQ,EAAE,GAAG,CAAC,sBAAsB;QACpC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,wBAAwB,IAAI,EAAE,CAAC;QACtD,gBAAgB,EAAE,GAAG,CAAC,+BAA+B,KAAK,MAAM;QAChE,YAAY,EAAE,GAAG,CAAC,2BAA2B,KAAK,MAAM;QACxD,iBAAiB,EAAE,GAAG,CAAC,gCAAgC;QACvD,mBAAmB,EAAE,GAAG,CAAC,kCAAkC,KAAK,MAAM;KACvE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAyB;IACtD,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC"}
@@ -35,6 +35,9 @@ export declare const YOUTUBE_OMNI_ERRORS: {
35
35
  readonly SAFETY_BLOCKED: {
36
36
  readonly retryable: false;
37
37
  };
38
+ readonly APPROVAL_REQUIRED_OR_WRITE_DISABLED: {
39
+ readonly retryable: false;
40
+ };
38
41
  };
39
42
  export type YoutubeOmniErrorCode = keyof typeof YOUTUBE_OMNI_ERRORS;
40
43
  export declare class YoutubeOmniError extends Error {
@@ -10,7 +10,8 @@ export const YOUTUBE_OMNI_ERRORS = {
10
10
  COMMENTS_DISABLED: { retryable: false },
11
11
  UNSUPPORTED_REGION: { retryable: false },
12
12
  PROVIDER_ERROR: { retryable: true },
13
- SAFETY_BLOCKED: { retryable: false }
13
+ SAFETY_BLOCKED: { retryable: false },
14
+ APPROVAL_REQUIRED_OR_WRITE_DISABLED: { retryable: false }
14
15
  };
15
16
  export class YoutubeOmniError extends Error {
16
17
  code;
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/core/errors.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,gBAAgB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IACtC,uBAAuB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IAC7C,aAAa,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IACnC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;IACnC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;IACjC,eAAe,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IACrC,iBAAiB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IACvC,sBAAsB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IAC5C,iBAAiB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IACvC,kBAAkB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IACxC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;IACnC,cAAc,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;CAC5B,CAAC;AAIX,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAChC,IAAI,CAAuB;IAC3B,SAAS,CAAU;IAE5B,YAAY,IAA0B,EAAE,OAAe;QACrD,KAAK,CAAC,GAAG,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC;IACvD,CAAC;CACF"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/core/errors.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,gBAAgB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IACtC,uBAAuB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IAC7C,aAAa,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IACnC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;IACnC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;IACjC,eAAe,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IACrC,iBAAiB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IACvC,sBAAsB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IAC5C,iBAAiB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IACvC,kBAAkB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IACxC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;IACnC,cAAc,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IACpC,mCAAmC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;CACjD,CAAC;AAIX,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAChC,IAAI,CAAuB;IAC3B,SAAS,CAAU;IAE5B,YAAY,IAA0B,EAAE,OAAe;QACrD,KAAK,CAAC,GAAG,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC;IACvD,CAAC;CACF"}
@@ -1,5 +1,7 @@
1
1
  export declare const V0_LOCKED_PATTERNS: readonly ["upload", "update_video", "delete", "set_thumbnail", "reply_to_comment", "moderate", "publish", "download_video", "clip_segment", "revenue"];
2
+ export type RiskLabel = 'none' | 'low' | 'medium' | 'high' | 'destructive';
2
3
  export interface ActionRisk {
4
+ risk: RiskLabel;
3
5
  riskTier: 0 | 1 | 2 | 3 | 4 | 5;
4
6
  authTier: 'none' | 'api_key' | 'oauth_readonly' | 'oauth_write' | 'hosted' | 'experimental';
5
7
  allowedInV0: boolean;
@@ -13,19 +13,35 @@ export const V0_LOCKED_PATTERNS = [
13
13
  export function isAllowedInV0(action) {
14
14
  return !V0_LOCKED_PATTERNS.some((pattern) => action.includes(pattern));
15
15
  }
16
+ function operationRisk(action) {
17
+ if (!action.includes('youtube.operations.'))
18
+ return undefined;
19
+ const destructive = ['delete_video', 'delete', 'remove'].some((pattern) => action.includes(pattern));
20
+ return {
21
+ risk: destructive ? 'destructive' : 'high',
22
+ riskTier: destructive ? 5 : 4,
23
+ authTier: 'oauth_write',
24
+ allowedInV0: false,
25
+ requiredControls: destructive ? ['approval', 'double_confirmation', 'audit'] : ['approval', 'preview', 'audit', 'dry_run']
26
+ };
27
+ }
16
28
  export function classifyActionRisk(action) {
29
+ const operation = operationRisk(action);
30
+ if (operation)
31
+ return operation;
17
32
  if (!isAllowedInV0(action)) {
18
33
  const destructive = ['delete', 'download_video', 'clip_segment', 'revenue'].some((pattern) => action.includes(pattern));
19
34
  return {
35
+ risk: destructive ? 'destructive' : 'high',
20
36
  riskTier: destructive ? 5 : 4,
21
37
  authTier: action.includes('download') || action.includes('clip') ? 'experimental' : 'oauth_write',
22
38
  allowedInV0: false,
23
39
  requiredControls: destructive ? ['approval', 'double_confirmation', 'audit'] : ['approval', 'preview', 'audit']
24
40
  };
25
41
  }
26
- if (action.includes('transcript') || action.includes('comments') || action.includes('planning')) {
27
- return { riskTier: 1, authTier: 'api_key', allowedInV0: true, requiredControls: ['rate_limit', 'privacy_warning'] };
42
+ if (action.includes('transcript') || action.includes('comments') || action.includes('planning') || action.includes('research')) {
43
+ return { risk: 'low', riskTier: 1, authTier: 'api_key', allowedInV0: true, requiredControls: ['rate_limit', 'privacy_warning'] };
28
44
  }
29
- return { riskTier: 0, authTier: 'api_key', allowedInV0: true, requiredControls: ['rate_limit'] };
45
+ return { risk: 'none', riskTier: 0, authTier: 'api_key', allowedInV0: true, requiredControls: ['rate_limit'] };
30
46
  }
31
47
  //# sourceMappingURL=risk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"risk.js","sourceRoot":"","sources":["../../../src/core/risk.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,QAAQ;IACR,cAAc;IACd,QAAQ;IACR,eAAe;IACf,kBAAkB;IAClB,UAAU;IACV,SAAS;IACT,gBAAgB;IAChB,cAAc;IACd,SAAS;CACD,CAAC;AASX,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,MAAM,WAAW,GAAG,CAAC,QAAQ,EAAE,gBAAgB,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QACxH,OAAO;YACL,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa;YACjG,WAAW,EAAE,KAAK;YAClB,gBAAgB,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,qBAAqB,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC;SAChH,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAChG,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,YAAY,EAAE,iBAAiB,CAAC,EAAE,CAAC;IACtH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC;AACnG,CAAC"}
1
+ {"version":3,"file":"risk.js","sourceRoot":"","sources":["../../../src/core/risk.ts"],"names":[],"mappings":"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"}
@@ -5,3 +5,5 @@ export * from './channel.js';
5
5
  export * from './transcript.js';
6
6
  export * from './comments.js';
7
7
  export * from './planning.js';
8
+ export * from './research.js';
9
+ export * from './operations.js';
@@ -5,4 +5,6 @@ export * from './channel.js';
5
5
  export * from './transcript.js';
6
6
  export * from './comments.js';
7
7
  export * from './planning.js';
8
+ export * from './research.js';
9
+ export * from './operations.js';
8
10
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/schemas/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/schemas/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,50 @@
1
+ import { z } from 'zod';
2
+ export declare const updateVideoMetadataSchema: z.ZodObject<{
3
+ approvalId: z.ZodOptional<z.ZodString>;
4
+ dryRun: z.ZodDefault<z.ZodBoolean>;
5
+ videoId: z.ZodString;
6
+ title: z.ZodOptional<z.ZodString>;
7
+ description: z.ZodOptional<z.ZodString>;
8
+ tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
9
+ }, z.core.$strip>;
10
+ export declare const scheduleUploadSchema: z.ZodObject<{
11
+ approvalId: z.ZodOptional<z.ZodString>;
12
+ dryRun: z.ZodDefault<z.ZodBoolean>;
13
+ filePath: z.ZodString;
14
+ title: z.ZodString;
15
+ scheduledAt: z.ZodOptional<z.ZodString>;
16
+ }, z.core.$strip>;
17
+ export declare const updateThumbnailSchema: z.ZodObject<{
18
+ approvalId: z.ZodOptional<z.ZodString>;
19
+ dryRun: z.ZodDefault<z.ZodBoolean>;
20
+ videoId: z.ZodString;
21
+ imagePath: z.ZodString;
22
+ }, z.core.$strip>;
23
+ export declare const updatePlaylistSchema: z.ZodObject<{
24
+ approvalId: z.ZodOptional<z.ZodString>;
25
+ dryRun: z.ZodDefault<z.ZodBoolean>;
26
+ playlistId: z.ZodString;
27
+ videoId: z.ZodOptional<z.ZodString>;
28
+ action: z.ZodDefault<z.ZodEnum<{
29
+ remove: "remove";
30
+ add: "add";
31
+ reorder: "reorder";
32
+ }>>;
33
+ }, z.core.$strip>;
34
+ export declare const moderateCommentSchema: z.ZodObject<{
35
+ approvalId: z.ZodOptional<z.ZodString>;
36
+ dryRun: z.ZodDefault<z.ZodBoolean>;
37
+ commentId: z.ZodString;
38
+ action: z.ZodEnum<{
39
+ hold: "hold";
40
+ approve: "approve";
41
+ reject: "reject";
42
+ report: "report";
43
+ }>;
44
+ }, z.core.$strip>;
45
+ export declare const createCommunityPostSchema: z.ZodObject<{
46
+ approvalId: z.ZodOptional<z.ZodString>;
47
+ dryRun: z.ZodDefault<z.ZodBoolean>;
48
+ channelId: z.ZodString;
49
+ text: z.ZodString;
50
+ }, z.core.$strip>;
@@ -0,0 +1,41 @@
1
+ import { z } from 'zod';
2
+ import { videoIdSchema } from './common.js';
3
+ const governedOperationFields = {
4
+ approvalId: z.string().min(1).optional(),
5
+ dryRun: z.boolean().default(true)
6
+ };
7
+ export const updateVideoMetadataSchema = z.object({
8
+ videoId: videoIdSchema,
9
+ title: z.string().min(1).max(100).optional(),
10
+ description: z.string().max(5000).optional(),
11
+ tags: z.array(z.string().min(1)).max(50).optional(),
12
+ ...governedOperationFields
13
+ });
14
+ export const scheduleUploadSchema = z.object({
15
+ filePath: z.string().min(1),
16
+ title: z.string().min(1).max(100),
17
+ scheduledAt: z.string().min(1).optional(),
18
+ ...governedOperationFields
19
+ });
20
+ export const updateThumbnailSchema = z.object({
21
+ videoId: videoIdSchema,
22
+ imagePath: z.string().min(1),
23
+ ...governedOperationFields
24
+ });
25
+ export const updatePlaylistSchema = z.object({
26
+ playlistId: z.string().min(1),
27
+ videoId: videoIdSchema.optional(),
28
+ action: z.enum(['add', 'remove', 'reorder']).default('add'),
29
+ ...governedOperationFields
30
+ });
31
+ export const moderateCommentSchema = z.object({
32
+ commentId: z.string().min(1),
33
+ action: z.enum(['hold', 'approve', 'reject', 'report']),
34
+ ...governedOperationFields
35
+ });
36
+ export const createCommunityPostSchema = z.object({
37
+ channelId: z.string().min(1),
38
+ text: z.string().min(1).max(5000),
39
+ ...governedOperationFields
40
+ });
41
+ //# sourceMappingURL=operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operations.js","sourceRoot":"","sources":["../../../src/schemas/operations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,uBAAuB,GAAG;IAC9B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACxC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;CAClC,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,OAAO,EAAE,aAAa;IACtB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAC5C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;IAC5C,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;IACnD,GAAG,uBAAuB;CAC3B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACjC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACzC,GAAG,uBAAuB;CAC3B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,OAAO,EAAE,aAAa;IACtB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,GAAG,uBAAuB;CAC3B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,OAAO,EAAE,aAAa,CAAC,QAAQ,EAAE;IACjC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IAC3D,GAAG,uBAAuB;CAC3B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACvD,GAAG,uBAAuB;CAC3B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;IACjC,GAAG,uBAAuB;CAC3B,CAAC,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { z } from 'zod';
2
+ export declare const outlierVideosSchema: z.ZodObject<{
3
+ query: z.ZodString;
4
+ maxResults: z.ZodDefault<z.ZodNumber>;
5
+ regionCode: z.ZodDefault<z.ZodString>;
6
+ minViewToChannelRatio: z.ZodDefault<z.ZodNumber>;
7
+ recency: z.ZodDefault<z.ZodEnum<{
8
+ any: "any";
9
+ pastWeek: "pastWeek";
10
+ pastMonth: "pastMonth";
11
+ pastQuarter: "pastQuarter";
12
+ pastYear: "pastYear";
13
+ }>>;
14
+ }, z.core.$strip>;
15
+ export declare const compareHooksSchema: z.ZodObject<{
16
+ videoIds: z.ZodArray<z.ZodString>;
17
+ lang: z.ZodDefault<z.ZodString>;
18
+ }, z.core.$strip>;
19
+ export declare const topicAnglesSchema: z.ZodObject<{
20
+ topic: z.ZodString;
21
+ regionCode: z.ZodDefault<z.ZodString>;
22
+ sampleSize: z.ZodDefault<z.ZodNumber>;
23
+ }, z.core.$strip>;
24
+ export declare const commentPainPointsSchema: z.ZodObject<{
25
+ videoId: z.ZodString;
26
+ maxComments: z.ZodDefault<z.ZodNumber>;
27
+ }, z.core.$strip>;
28
+ export declare const videoAngleMatrixSchema: z.ZodObject<{
29
+ topic: z.ZodString;
30
+ rows: z.ZodDefault<z.ZodNumber>;
31
+ regionCode: z.ZodDefault<z.ZodString>;
32
+ }, z.core.$strip>;
33
+ export type OutlierVideosInput = z.infer<typeof outlierVideosSchema>;
34
+ export type CompareHooksInput = z.infer<typeof compareHooksSchema>;
35
+ export type TopicAnglesInput = z.infer<typeof topicAnglesSchema>;
36
+ export type CommentPainPointsInput = z.infer<typeof commentPainPointsSchema>;
37
+ export type VideoAngleMatrixInput = z.infer<typeof videoAngleMatrixSchema>;
@@ -0,0 +1,28 @@
1
+ import { z } from 'zod';
2
+ import { maxResultsSchema, regionCodeSchema, videoIdSchema } from './common.js';
3
+ export const outlierVideosSchema = z.object({
4
+ query: z.string().min(1),
5
+ maxResults: maxResultsSchema,
6
+ regionCode: regionCodeSchema,
7
+ minViewToChannelRatio: z.number().min(1).max(100).default(3),
8
+ recency: z.enum(['any', 'pastWeek', 'pastMonth', 'pastQuarter', 'pastYear']).default('pastQuarter')
9
+ });
10
+ export const compareHooksSchema = z.object({
11
+ videoIds: z.array(videoIdSchema).min(2).max(10),
12
+ lang: z.string().default('en')
13
+ });
14
+ export const topicAnglesSchema = z.object({
15
+ topic: z.string().min(1),
16
+ regionCode: regionCodeSchema,
17
+ sampleSize: maxResultsSchema
18
+ });
19
+ export const commentPainPointsSchema = z.object({
20
+ videoId: videoIdSchema,
21
+ maxComments: z.number().int().min(1).max(100).default(50)
22
+ });
23
+ export const videoAngleMatrixSchema = z.object({
24
+ topic: z.string().min(1),
25
+ rows: z.number().int().min(3).max(20).default(10),
26
+ regionCode: regionCodeSchema
27
+ });
28
+ //# sourceMappingURL=research.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"research.js","sourceRoot":"","sources":["../../../src/schemas/research.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEhF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,UAAU,EAAE,gBAAgB;IAC5B,UAAU,EAAE,gBAAgB;IAC5B,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5D,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;CACpG,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;IAC/C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;CAC/B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,UAAU,EAAE,gBAAgB;IAC5B,UAAU,EAAE,gBAAgB;CAC7B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,OAAO,EAAE,aAAa;IACtB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAC1D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACjD,UAAU,EAAE,gBAAgB;CAC7B,CAAC,CAAC"}
@@ -1,87 +1,19 @@
1
+ import { type YoutubeOmniConfig } from './config.js';
1
2
  import { ProviderRegistry } from './core/provider-registry.js';
2
- export declare const V0_TOOL_NAMES: readonly ["youtube.discovery.search_videos", "youtube.discovery.get_video_categories", "youtube.video.get_details", "youtube.video.compare", "youtube.channel.get_statistics", "youtube.channel.get_top_videos", "youtube.transcript.get_segments", "youtube.transcript.get_full_text", "youtube.transcript.analyze_structure", "youtube.comments.get", "youtube.comments.summarize", "youtube.planning.generate_research_brief", "youtube.safety.classify_action_risk", "youtube.safety.list_capabilities"];
3
+ export declare const V0_TOOL_NAMES: readonly ["youtube.discovery.search_videos", "youtube.discovery.get_video_categories", "youtube.video.get_details", "youtube.video.compare", "youtube.channel.get_statistics", "youtube.channel.get_top_videos", "youtube.transcript.get_segments", "youtube.transcript.get_full_text", "youtube.transcript.analyze_structure", "youtube.comments.get", "youtube.comments.summarize", "youtube.planning.generate_research_brief", "youtube.research.find_outlier_videos", "youtube.research.compare_hooks", "youtube.research.extract_topic_angles", "youtube.research.summarize_comment_pain_points", "youtube.research.generate_video_angle_matrix", "youtube.safety.classify_action_risk", "youtube.safety.list_capabilities"];
4
+ export declare const OPERATION_TOOL_NAMES: readonly ["youtube.operations.update_video_metadata", "youtube.operations.schedule_upload", "youtube.operations.update_thumbnail", "youtube.operations.update_playlist", "youtube.operations.moderate_comment", "youtube.operations.create_community_post"];
3
5
  export type V0ToolName = typeof V0_TOOL_NAMES[number];
6
+ export type OperationToolName = typeof OPERATION_TOOL_NAMES[number];
7
+ export type ToolName = V0ToolName | OperationToolName;
4
8
  type JsonSchema = Record<string, unknown>;
5
9
  type ToolDefinition = {
6
- name: V0ToolName;
10
+ name: ToolName;
7
11
  description: string;
8
12
  inputSchema: JsonSchema;
9
13
  };
10
- export declare const V0_TOOL_INPUT_SCHEMAS: Record<V0ToolName, JsonSchema>;
11
- export declare function getToolDefinitions(): ToolDefinition[];
14
+ export declare const V0_TOOL_INPUT_SCHEMAS: Record<string, JsonSchema>;
15
+ export declare function getToolNames(config?: Pick<YoutubeOmniConfig, 'enableWriteTools' | 'dryRunWrites'>): ToolName[];
16
+ export declare function getToolDefinitions(config?: Pick<YoutubeOmniConfig, 'enableWriteTools' | 'dryRunWrites'>): ToolDefinition[];
12
17
  export declare function createDefaultRegistry(): ProviderRegistry;
13
- export declare function createToolHandlers(registry?: ProviderRegistry): {
14
- 'youtube.discovery.search_videos': (input: unknown) => Promise<import("./core/envelope.js").ToolEnvelope<{
15
- videos: any[];
16
- }>>;
17
- 'youtube.discovery.get_video_categories': (input: unknown) => Promise<import("./core/envelope.js").ToolEnvelope<{
18
- regionCode: string;
19
- categories: any[];
20
- }>>;
21
- 'youtube.video.get_details': (input: unknown) => Promise<import("./core/envelope.js").ToolEnvelope<{
22
- videos: any[];
23
- }>>;
24
- 'youtube.video.compare': (input: unknown) => Promise<import("./core/envelope.js").ToolEnvelope<{
25
- comparison: {
26
- rows: any[];
27
- observations: string[];
28
- };
29
- }>>;
30
- 'youtube.channel.get_statistics': (input: unknown) => Promise<import("./core/envelope.js").ToolEnvelope<{
31
- channels: any[];
32
- }>>;
33
- 'youtube.channel.get_top_videos': (input: unknown) => Promise<import("./core/envelope.js").ToolEnvelope<{
34
- channelId: string;
35
- videos: any[];
36
- }>>;
37
- 'youtube.transcript.get_segments': (input: unknown) => Promise<import("./core/envelope.js").ToolEnvelope<{
38
- transcripts: any[];
39
- }>>;
40
- 'youtube.transcript.get_full_text': (input: unknown) => Promise<import("./core/envelope.js").ToolEnvelope<{
41
- videoId: string;
42
- language: string;
43
- text: string;
44
- truncated: boolean;
45
- }>>;
46
- 'youtube.transcript.analyze_structure': (input: unknown) => Promise<import("./core/envelope.js").ToolEnvelope<{
47
- hook: string;
48
- cta: string;
49
- outline: string[];
50
- claims: never[];
51
- scriptPatterns: string[];
52
- }>>;
53
- 'youtube.comments.get': (input: unknown) => Promise<import("./core/envelope.js").ToolEnvelope<{
54
- videoId: string;
55
- comments: any[];
56
- }>>;
57
- 'youtube.comments.summarize': (input: unknown) => Promise<import("./core/envelope.js").ToolEnvelope<{
58
- summary: string;
59
- questions: string[];
60
- contentRequests: string[];
61
- sentimentSignal: {
62
- positive: string;
63
- negative: string;
64
- mixed: boolean;
65
- };
66
- }>>;
67
- 'youtube.planning.generate_research_brief': (input: unknown) => Promise<import("./core/envelope.js").ToolEnvelope<{
68
- brief: {
69
- topic: string;
70
- benchmarkVideos: any[];
71
- benchmarkChannels: never[];
72
- titlePatterns: string[];
73
- hookPatterns: string[];
74
- audienceQuestions: never[];
75
- contentOpportunities: never[];
76
- risks: string[];
77
- };
78
- }>>;
79
- 'youtube.safety.classify_action_risk': (input: unknown) => Promise<import("./core/envelope.js").ToolEnvelope<import("./core/risk.js").ActionRisk>>;
80
- 'youtube.safety.list_capabilities': (_input: unknown) => Promise<import("./core/envelope.js").ToolEnvelope<{
81
- version: string;
82
- phase: string;
83
- enabledNamespaces: string[];
84
- lockedNamespaces: string[];
85
- }>>;
86
- };
18
+ export declare function createToolHandlers(registry?: ProviderRegistry, config?: Pick<YoutubeOmniConfig, 'enableWriteTools' | 'dryRunWrites'>): Record<string, (input: unknown) => Promise<any>>;
87
19
  export {};
@@ -1,3 +1,4 @@
1
+ import { loadConfig } from './config.js';
1
2
  import { ProviderRegistry } from './core/provider-registry.js';
2
3
  import { MockYoutubeProvider } from './providers/mock-provider.js';
3
4
  import { searchVideos, getVideoCategories } from './tools/discovery.js';
@@ -7,6 +8,8 @@ import { getTranscriptSegments, getTranscriptFullText, analyzeTranscriptStructur
7
8
  import { getVideoComments, summarizeComments } from './tools/comments.js';
8
9
  import { generateResearchBrief } from './tools/planning.js';
9
10
  import { classifyActionRiskTool, listCapabilities } from './tools/safety.js';
11
+ import { compareHooks, extractTopicAngles, findOutlierVideos, generateVideoAngleMatrix, summarizeCommentPainPoints } from './tools/research.js';
12
+ import { createCommunityPost, moderateComment, scheduleUpload, updatePlaylist, updateThumbnail, updateVideoMetadata } from './tools/operations.js';
10
13
  export const V0_TOOL_NAMES = [
11
14
  'youtube.discovery.search_videos',
12
15
  'youtube.discovery.get_video_categories',
@@ -20,9 +23,22 @@ export const V0_TOOL_NAMES = [
20
23
  'youtube.comments.get',
21
24
  'youtube.comments.summarize',
22
25
  'youtube.planning.generate_research_brief',
26
+ 'youtube.research.find_outlier_videos',
27
+ 'youtube.research.compare_hooks',
28
+ 'youtube.research.extract_topic_angles',
29
+ 'youtube.research.summarize_comment_pain_points',
30
+ 'youtube.research.generate_video_angle_matrix',
23
31
  'youtube.safety.classify_action_risk',
24
32
  'youtube.safety.list_capabilities'
25
33
  ];
34
+ export const OPERATION_TOOL_NAMES = [
35
+ 'youtube.operations.update_video_metadata',
36
+ 'youtube.operations.schedule_upload',
37
+ 'youtube.operations.update_thumbnail',
38
+ 'youtube.operations.update_playlist',
39
+ 'youtube.operations.moderate_comment',
40
+ 'youtube.operations.create_community_post'
41
+ ];
26
42
  const stringSchema = (description, extra = {}) => ({ type: 'string', description, ...extra });
27
43
  const numberSchema = (description, minimum, maximum, defaultValue) => ({
28
44
  type: 'number',
@@ -117,14 +133,85 @@ export const V0_TOOL_INPUT_SCHEMAS = {
117
133
  includeTranscripts: booleanSchema('Include transcript signals where available.', true),
118
134
  includeComments: booleanSchema('Include comment signals where available.', true)
119
135
  }, ['topic']),
136
+ 'youtube.research.find_outlier_videos': objectSchema({
137
+ query: stringSchema('Topic or niche to discover outlier videos for.', { minLength: 1 }),
138
+ maxResults: numberSchema('Maximum videos to inspect.', 1, 50, 10),
139
+ regionCode: stringSchema('Two-letter country code.', { pattern: '^[A-Z]{2}$', default: 'US' }),
140
+ minViewToChannelRatio: numberSchema('Minimum views-to-subscriber ratio considered outlier.', 1, 100, 3),
141
+ recency: enumSchema('Search recency window.', ['any', 'pastWeek', 'pastMonth', 'pastQuarter', 'pastYear'], 'pastQuarter')
142
+ }, ['query']),
143
+ 'youtube.research.compare_hooks': objectSchema({
144
+ videoIds: stringArraySchema('YouTube video IDs whose hooks should be compared.', 2, 10),
145
+ lang: stringSchema('Transcript language code.', { default: 'en' })
146
+ }, ['videoIds']),
147
+ 'youtube.research.extract_topic_angles': objectSchema({
148
+ topic: stringSchema('Topic or niche to extract content angles for.', { minLength: 1 }),
149
+ regionCode: stringSchema('Two-letter country code.', { pattern: '^[A-Z]{2}$', default: 'US' }),
150
+ sampleSize: numberSchema('Number of videos to sample.', 1, 50, 10)
151
+ }, ['topic']),
152
+ 'youtube.research.summarize_comment_pain_points': objectSchema({
153
+ videoId: stringSchema('YouTube video ID.', { minLength: 1 }),
154
+ maxComments: numberSchema('Maximum comments to inspect.', 1, 100, 50)
155
+ }, ['videoId']),
156
+ 'youtube.research.generate_video_angle_matrix': objectSchema({
157
+ topic: stringSchema('Topic or niche for angle matrix generation.', { minLength: 1 }),
158
+ rows: numberSchema('Number of matrix rows to generate.', 3, 20, 10),
159
+ regionCode: stringSchema('Two-letter country code.', { pattern: '^[A-Z]{2}$', default: 'US' })
160
+ }, ['topic']),
161
+ 'youtube.operations.update_video_metadata': objectSchema({
162
+ videoId: stringSchema('YouTube video ID.', { minLength: 1 }),
163
+ title: stringSchema('Optional replacement title.', { minLength: 1, maxLength: 100 }),
164
+ description: stringSchema('Optional replacement description.', { maxLength: 5000 }),
165
+ tags: { type: 'array', description: 'Optional replacement tags.', items: { type: 'string', minLength: 1 }, maxItems: 50 },
166
+ approvalId: stringSchema('Optional approval identifier.', { minLength: 1 }),
167
+ dryRun: booleanSchema('Dry-run flag; live writes are unavailable in v0.2.', true)
168
+ }, ['videoId']),
169
+ 'youtube.operations.schedule_upload': objectSchema({
170
+ filePath: stringSchema('Local path to the video file.', { minLength: 1 }),
171
+ title: stringSchema('Upload title.', { minLength: 1, maxLength: 100 }),
172
+ scheduledAt: stringSchema('Optional scheduled publish timestamp.'),
173
+ approvalId: stringSchema('Optional approval identifier.', { minLength: 1 }),
174
+ dryRun: booleanSchema('Dry-run flag; live writes are unavailable in v0.2.', true)
175
+ }, ['filePath', 'title']),
176
+ 'youtube.operations.update_thumbnail': objectSchema({
177
+ videoId: stringSchema('YouTube video ID.', { minLength: 1 }),
178
+ imagePath: stringSchema('Local thumbnail image path.', { minLength: 1 }),
179
+ approvalId: stringSchema('Optional approval identifier.', { minLength: 1 }),
180
+ dryRun: booleanSchema('Dry-run flag; live writes are unavailable in v0.2.', true)
181
+ }, ['videoId', 'imagePath']),
182
+ 'youtube.operations.update_playlist': objectSchema({
183
+ playlistId: stringSchema('YouTube playlist ID.', { minLength: 1 }),
184
+ videoId: stringSchema('YouTube video ID.', { minLength: 1 }),
185
+ action: enumSchema('Playlist mutation action.', ['add', 'remove', 'reorder'], 'add'),
186
+ approvalId: stringSchema('Optional approval identifier.', { minLength: 1 }),
187
+ dryRun: booleanSchema('Dry-run flag; live writes are unavailable in v0.2.', true)
188
+ }, ['playlistId']),
189
+ 'youtube.operations.moderate_comment': objectSchema({
190
+ commentId: stringSchema('YouTube comment ID.', { minLength: 1 }),
191
+ action: enumSchema('Comment moderation action.', ['hold', 'approve', 'reject', 'report']),
192
+ approvalId: stringSchema('Optional approval identifier.', { minLength: 1 }),
193
+ dryRun: booleanSchema('Dry-run flag; live writes are unavailable in v0.2.', true)
194
+ }, ['commentId', 'action']),
195
+ 'youtube.operations.create_community_post': objectSchema({
196
+ channelId: stringSchema('YouTube channel ID.', { minLength: 1 }),
197
+ text: stringSchema('Community post text.', { minLength: 1, maxLength: 5000 }),
198
+ approvalId: stringSchema('Optional approval identifier.', { minLength: 1 }),
199
+ dryRun: booleanSchema('Dry-run flag; live writes are unavailable in v0.2.', true)
200
+ }, ['channelId', 'text']),
120
201
  'youtube.safety.classify_action_risk': objectSchema({
121
202
  action: stringSchema('Action name to classify.', { minLength: 1 }),
122
203
  params: { type: 'object', description: 'Optional action parameters.', additionalProperties: true }
123
204
  }, ['action']),
124
205
  'youtube.safety.list_capabilities': objectSchema({})
125
206
  };
126
- export function getToolDefinitions() {
127
- return V0_TOOL_NAMES.map((name) => ({
207
+ function operationToolsEnabled(config) {
208
+ return config.enableWriteTools === true && config.dryRunWrites === true;
209
+ }
210
+ export function getToolNames(config = loadConfig()) {
211
+ return operationToolsEnabled(config) ? [...V0_TOOL_NAMES, ...OPERATION_TOOL_NAMES] : [...V0_TOOL_NAMES];
212
+ }
213
+ export function getToolDefinitions(config = loadConfig()) {
214
+ return getToolNames(config).map((name) => ({
128
215
  name,
129
216
  description: `YouTube Omni v0 read-only tool: ${name}`,
130
217
  inputSchema: V0_TOOL_INPUT_SCHEMAS[name]
@@ -133,8 +220,8 @@ export function getToolDefinitions() {
133
220
  export function createDefaultRegistry() {
134
221
  return new ProviderRegistry([new MockYoutubeProvider()]);
135
222
  }
136
- export function createToolHandlers(registry = createDefaultRegistry()) {
137
- return {
223
+ export function createToolHandlers(registry = createDefaultRegistry(), config = loadConfig()) {
224
+ const handlers = {
138
225
  'youtube.discovery.search_videos': (input) => searchVideos(input, registry),
139
226
  'youtube.discovery.get_video_categories': (input) => getVideoCategories(input, registry),
140
227
  'youtube.video.get_details': (input) => getVideoDetails(input, registry),
@@ -147,8 +234,22 @@ export function createToolHandlers(registry = createDefaultRegistry()) {
147
234
  'youtube.comments.get': (input) => getVideoComments(input, registry),
148
235
  'youtube.comments.summarize': (input) => summarizeComments(input, registry),
149
236
  'youtube.planning.generate_research_brief': (input) => generateResearchBrief(input, registry),
237
+ 'youtube.research.find_outlier_videos': (input) => findOutlierVideos(input, registry),
238
+ 'youtube.research.compare_hooks': (input) => compareHooks(input, registry),
239
+ 'youtube.research.extract_topic_angles': (input) => extractTopicAngles(input, registry),
240
+ 'youtube.research.summarize_comment_pain_points': (input) => summarizeCommentPainPoints(input, registry),
241
+ 'youtube.research.generate_video_angle_matrix': (input) => generateVideoAngleMatrix(input, registry),
150
242
  'youtube.safety.classify_action_risk': (input) => classifyActionRiskTool(input),
151
243
  'youtube.safety.list_capabilities': (_input) => listCapabilities({})
152
244
  };
245
+ if (operationToolsEnabled(config)) {
246
+ handlers['youtube.operations.update_video_metadata'] = (input) => updateVideoMetadata(input);
247
+ handlers['youtube.operations.schedule_upload'] = (input) => scheduleUpload(input);
248
+ handlers['youtube.operations.update_thumbnail'] = (input) => updateThumbnail(input);
249
+ handlers['youtube.operations.update_playlist'] = (input) => updatePlaylist(input);
250
+ handlers['youtube.operations.moderate_comment'] = (input) => moderateComment(input);
251
+ handlers['youtube.operations.create_community_post'] = (input) => createCommunityPost(input);
252
+ }
253
+ return handlers;
153
254
  }
154
255
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { ToolEnvelope } from '../core/envelope.js';
2
+ type DryRunData = {
3
+ dryRun: true;
4
+ wouldCall: string;
5
+ approvalId?: string;
6
+ request: unknown;
7
+ };
8
+ export declare function updateVideoMetadata(input: unknown): Promise<ToolEnvelope<DryRunData>>;
9
+ export declare function scheduleUpload(input: unknown): Promise<ToolEnvelope<DryRunData>>;
10
+ export declare function updateThumbnail(input: unknown): Promise<ToolEnvelope<DryRunData>>;
11
+ export declare function updatePlaylist(input: unknown): Promise<ToolEnvelope<DryRunData>>;
12
+ export declare function moderateComment(input: unknown): Promise<ToolEnvelope<DryRunData>>;
13
+ export declare function createCommunityPost(input: unknown): Promise<ToolEnvelope<DryRunData>>;
14
+ export {};
@@ -0,0 +1,38 @@
1
+ import { createCommunityPostSchema, moderateCommentSchema, scheduleUploadSchema, updatePlaylistSchema, updateThumbnailSchema, updateVideoMetadataSchema } from '../schemas/operations.js';
2
+ const MESSAGE = 'Write tools are disabled by default. Enable only with OAuth, approval, and audit configured.';
3
+ function operationBlockedEnvelope(tool, wouldCall, request) {
4
+ return {
5
+ ok: false,
6
+ tool,
7
+ timestamp: new Date().toISOString(),
8
+ source: { provider: 'core', authTier: 'oauth_write' },
9
+ data: { dryRun: true, wouldCall, approvalId: request.approvalId, request },
10
+ warnings: ['Operation tool is dry-run-only in v0.2 and never performs live YouTube writes.'],
11
+ error: { code: 'APPROVAL_REQUIRED_OR_WRITE_DISABLED', message: MESSAGE, retryable: false }
12
+ };
13
+ }
14
+ export async function updateVideoMetadata(input) {
15
+ const parsed = updateVideoMetadataSchema.parse(input);
16
+ return operationBlockedEnvelope('youtube.operations.update_video_metadata', 'youtube.videos.update', parsed);
17
+ }
18
+ export async function scheduleUpload(input) {
19
+ const parsed = scheduleUploadSchema.parse(input);
20
+ return operationBlockedEnvelope('youtube.operations.schedule_upload', 'youtube.videos.insert', parsed);
21
+ }
22
+ export async function updateThumbnail(input) {
23
+ const parsed = updateThumbnailSchema.parse(input);
24
+ return operationBlockedEnvelope('youtube.operations.update_thumbnail', 'youtube.thumbnails.set', parsed);
25
+ }
26
+ export async function updatePlaylist(input) {
27
+ const parsed = updatePlaylistSchema.parse(input);
28
+ return operationBlockedEnvelope('youtube.operations.update_playlist', 'youtube.playlistItems.insert_or_delete', parsed);
29
+ }
30
+ export async function moderateComment(input) {
31
+ const parsed = moderateCommentSchema.parse(input);
32
+ return operationBlockedEnvelope('youtube.operations.moderate_comment', 'youtube.comments.setModerationStatus', parsed);
33
+ }
34
+ export async function createCommunityPost(input) {
35
+ const parsed = createCommunityPostSchema.parse(input);
36
+ return operationBlockedEnvelope('youtube.operations.create_community_post', 'youtube.communityPosts.insert', parsed);
37
+ }
38
+ //# sourceMappingURL=operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operations.js","sourceRoot":"","sources":["../../../src/tools/operations.ts"],"names":[],"mappings":"AACA,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,EAC1B,MAAM,0BAA0B,CAAC;AAElC,MAAM,OAAO,GAAG,8FAA8F,CAAC;AAS/G,SAAS,wBAAwB,CAAC,IAAY,EAAE,SAAiB,EAAE,OAAkD;IACnH,OAAO;QACL,EAAE,EAAE,KAAK;QACT,IAAI;QACJ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE;QACrD,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE;QAC1E,QAAQ,EAAE,CAAC,gFAAgF,CAAC;QAC5F,KAAK,EAAE,EAAE,IAAI,EAAE,qCAAqC,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE;KAC3F,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAAc;IACtD,MAAM,MAAM,GAAG,yBAAyB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACtD,OAAO,wBAAwB,CAAC,0CAA0C,EAAE,uBAAuB,EAAE,MAAM,CAAC,CAAC;AAC/G,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAc;IACjD,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjD,OAAO,wBAAwB,CAAC,oCAAoC,EAAE,uBAAuB,EAAE,MAAM,CAAC,CAAC;AACzG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAc;IAClD,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAClD,OAAO,wBAAwB,CAAC,qCAAqC,EAAE,wBAAwB,EAAE,MAAM,CAAC,CAAC;AAC3G,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAc;IACjD,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjD,OAAO,wBAAwB,CAAC,oCAAoC,EAAE,wCAAwC,EAAE,MAAM,CAAC,CAAC;AAC1H,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAc;IAClD,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAClD,OAAO,wBAAwB,CAAC,qCAAqC,EAAE,sCAAsC,EAAE,MAAM,CAAC,CAAC;AACzH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAAc;IACtD,MAAM,MAAM,GAAG,yBAAyB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACtD,OAAO,wBAAwB,CAAC,0CAA0C,EAAE,+BAA+B,EAAE,MAAM,CAAC,CAAC;AACvH,CAAC"}
@@ -0,0 +1,47 @@
1
+ import type { ProviderRegistry } from '../core/provider-registry.js';
2
+ export declare function findOutlierVideos(input: unknown, registry: ProviderRegistry): Promise<import("../core/envelope.js").ToolEnvelope<{
3
+ query: string;
4
+ outliers: {
5
+ videoId: any;
6
+ title: any;
7
+ channelId: any;
8
+ viewCount: number;
9
+ subscriberCount: number;
10
+ score: number;
11
+ reason: string;
12
+ }[];
13
+ }>>;
14
+ export declare function compareHooks(input: unknown, registry: ProviderRegistry): Promise<import("../core/envelope.js").ToolEnvelope<{
15
+ hooks: {
16
+ videoId: any;
17
+ hook: any;
18
+ pattern: string;
19
+ availability: any;
20
+ }[];
21
+ }>>;
22
+ export declare function extractTopicAngles(input: unknown, registry: ProviderRegistry): Promise<import("../core/envelope.js").ToolEnvelope<{
23
+ topic: string;
24
+ angles: {
25
+ angle: string;
26
+ evidence: any[];
27
+ sourceTitle: any;
28
+ channelTitle: any;
29
+ }[];
30
+ }>>;
31
+ export declare function summarizeCommentPainPoints(input: unknown, registry: ProviderRegistry): Promise<import("../core/envelope.js").ToolEnvelope<{
32
+ videoId: string;
33
+ painPoints: {
34
+ theme: string;
35
+ count: number;
36
+ examples: string[];
37
+ }[];
38
+ }>>;
39
+ export declare function generateVideoAngleMatrix(input: unknown, registry: ProviderRegistry): Promise<import("../core/envelope.js").ToolEnvelope<{
40
+ topic: string;
41
+ matrix: {
42
+ angle: string;
43
+ evidence: any[];
44
+ hypothesis: string;
45
+ suggestedHook: string;
46
+ }[];
47
+ }>>;
@@ -0,0 +1,140 @@
1
+ import { makeEnvelope } from '../core/envelope.js';
2
+ import { commentPainPointsSchema, compareHooksSchema, outlierVideosSchema, topicAnglesSchema, videoAngleMatrixSchema } from '../schemas/research.js';
3
+ function numberFrom(value, fallback = 0) {
4
+ const parsed = Number(value);
5
+ return Number.isFinite(parsed) ? parsed : fallback;
6
+ }
7
+ function patternForHook(hook) {
8
+ const lower = hook.toLowerCase();
9
+ if (lower.includes('?'))
10
+ return 'question';
11
+ if (lower.includes('secret') || lower.includes('hidden'))
12
+ return 'curiosity_gap';
13
+ if (lower.includes('mock') || lower.includes('this is'))
14
+ return 'direct_promise';
15
+ return 'statement';
16
+ }
17
+ function titleAngle(title, topic, index) {
18
+ const cleaned = title.replace(/\s+/g, ' ').trim();
19
+ if (cleaned.length > 0)
20
+ return cleaned;
21
+ return `${topic} angle ${index + 1}`;
22
+ }
23
+ function themeForComment(text) {
24
+ const lower = text.toLowerCase();
25
+ if (lower.includes('follow-up') || lower.includes('make'))
26
+ return 'follow-up requests';
27
+ if (lower.includes('?') || lower.includes('how') || lower.includes('why'))
28
+ return 'audience questions';
29
+ return 'positive feedback';
30
+ }
31
+ export async function findOutlierVideos(input, registry) {
32
+ const parsed = outlierVideosSchema.parse(input);
33
+ const searchProvider = registry.requireCapability('search');
34
+ const detailsProvider = registry.requireCapability('video_details');
35
+ const channelProvider = registry.requireCapability('channel_stats');
36
+ const search = await searchProvider.searchVideos({ query: parsed.query, maxResults: parsed.maxResults });
37
+ const videoIds = search.videos.map((video) => video.videoId).filter(Boolean);
38
+ const details = await detailsProvider.getVideoDetails({ videoIds, includeTags: false, descriptionDetail: 'snippet' });
39
+ const channelIds = [...new Set(details.videos.map((video) => video.channelId).filter(Boolean))];
40
+ const channels = await channelProvider.getChannelStatistics({ channelIds });
41
+ const subscriberByChannel = new Map(channels.channels.map((channel) => [channel.channelId, numberFrom(channel.subscriberCount, 1)]));
42
+ const outliers = details.videos.map((video) => {
43
+ const views = numberFrom(video.statistics?.viewCount);
44
+ const subscribers = Math.max(1, numberFrom(subscriberByChannel.get(video.channelId), 1));
45
+ const ratio = views / subscribers;
46
+ return {
47
+ videoId: video.videoId,
48
+ title: video.title,
49
+ channelId: video.channelId,
50
+ viewCount: views,
51
+ subscriberCount: subscribers,
52
+ score: Number(Math.max(ratio, ratio >= parsed.minViewToChannelRatio ? ratio * 2 : ratio).toFixed(4)),
53
+ reason: ratio >= parsed.minViewToChannelRatio ? 'views exceed configured channel-size ratio' : 'ranked by views-to-subscribers ratio'
54
+ };
55
+ }).sort((a, b) => b.score - a.score);
56
+ return makeEnvelope({
57
+ tool: 'youtube.research.find_outlier_videos',
58
+ provider: searchProvider.id,
59
+ authTier: searchProvider.authTier,
60
+ data: { query: parsed.query, outliers },
61
+ nextActions: ['youtube.research.compare_hooks', 'youtube.comments.summarize'],
62
+ quotaCost: searchProvider.authTier === 'api_key' ? 102 : 0
63
+ });
64
+ }
65
+ export async function compareHooks(input, registry) {
66
+ const parsed = compareHooksSchema.parse(input);
67
+ const provider = registry.requireCapability('transcript');
68
+ const data = await provider.getTranscriptSegments({ videoIds: parsed.videoIds, lang: parsed.lang, format: 'key_segments' });
69
+ const hooks = data.transcripts.map((transcript) => {
70
+ const hook = transcript.intro || '';
71
+ return { videoId: transcript.videoId, hook, pattern: patternForHook(hook), availability: transcript.availability ?? 'unknown' };
72
+ });
73
+ return makeEnvelope({
74
+ tool: 'youtube.research.compare_hooks',
75
+ provider: provider.id,
76
+ authTier: provider.authTier,
77
+ data: { hooks },
78
+ nextActions: ['youtube.research.generate_video_angle_matrix']
79
+ });
80
+ }
81
+ export async function extractTopicAngles(input, registry) {
82
+ const parsed = topicAnglesSchema.parse(input);
83
+ const provider = registry.requireCapability('search');
84
+ const data = await provider.searchVideos({ query: parsed.topic, maxResults: parsed.sampleSize });
85
+ const angles = data.videos.map((video, index) => ({
86
+ angle: titleAngle(video.title, parsed.topic, index),
87
+ evidence: [video.videoId].filter(Boolean),
88
+ sourceTitle: video.title,
89
+ channelTitle: video.channelTitle
90
+ }));
91
+ return makeEnvelope({
92
+ tool: 'youtube.research.extract_topic_angles',
93
+ provider: provider.id,
94
+ authTier: provider.authTier,
95
+ data: { topic: parsed.topic, angles },
96
+ nextActions: ['youtube.research.generate_video_angle_matrix']
97
+ });
98
+ }
99
+ export async function summarizeCommentPainPoints(input, registry) {
100
+ const parsed = commentPainPointsSchema.parse(input);
101
+ const provider = registry.requireCapability('comments');
102
+ const data = await provider.getVideoComments({ videoId: parsed.videoId, maxResults: parsed.maxComments, maxReplies: 0 });
103
+ const grouped = new Map();
104
+ for (const comment of data.comments) {
105
+ const text = String(comment.text ?? '');
106
+ const theme = themeForComment(text);
107
+ const existing = grouped.get(theme) ?? { theme, count: 0, examples: [] };
108
+ existing.count += 1;
109
+ if (existing.examples.length < 3)
110
+ existing.examples.push(text);
111
+ grouped.set(theme, existing);
112
+ }
113
+ const painPoints = [...grouped.values()].sort((a, b) => b.count - a.count);
114
+ return makeEnvelope({
115
+ tool: 'youtube.research.summarize_comment_pain_points',
116
+ provider: provider.id,
117
+ authTier: provider.authTier,
118
+ data: { videoId: parsed.videoId, painPoints },
119
+ nextActions: ['youtube.research.generate_video_angle_matrix']
120
+ });
121
+ }
122
+ export async function generateVideoAngleMatrix(input, registry) {
123
+ const parsed = videoAngleMatrixSchema.parse(input);
124
+ const provider = registry.requireCapability('search');
125
+ const data = await provider.searchVideos({ query: parsed.topic, maxResults: parsed.rows });
126
+ const matrix = data.videos.slice(0, parsed.rows).map((video, index) => ({
127
+ angle: titleAngle(video.title, parsed.topic, index),
128
+ evidence: [video.videoId].filter(Boolean),
129
+ hypothesis: `Use this angle to test demand for ${parsed.topic} with a clear hook and evidence-led payoff.`,
130
+ suggestedHook: `Why ${titleAngle(video.title, parsed.topic, index)} matters now`
131
+ }));
132
+ return makeEnvelope({
133
+ tool: 'youtube.research.generate_video_angle_matrix',
134
+ provider: provider.id,
135
+ authTier: provider.authTier,
136
+ data: { topic: parsed.topic, matrix },
137
+ nextActions: ['youtube.planning.generate_research_brief']
138
+ });
139
+ }
140
+ //# sourceMappingURL=research.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"research.js","sourceRoot":"","sources":["../../../src/tools/research.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,6 @@ export async function classifyActionRiskTool(input) {
5
5
  return makeEnvelope({ tool: 'youtube.safety.classify_action_risk', provider: 'core', authTier: 'none', data: risk, warnings: risk.allowedInV0 ? [] : ['This action is part of the full scope but locked in v0.'] });
6
6
  }
7
7
  export async function listCapabilities(_input) {
8
- return makeEnvelope({ tool: 'youtube.safety.list_capabilities', provider: 'core', authTier: 'none', data: { version: '0.0.0', phase: 'v0-read-only', enabledNamespaces: ['discovery', 'video', 'channel', 'transcript', 'comments', 'planning', 'safety'], lockedNamespaces: ['operations', 'community-write', 'analytics-oauth', 'reporting', 'media-download', 'shorts-render', 'music-private'] }, warnings: [] });
8
+ return makeEnvelope({ tool: 'youtube.safety.list_capabilities', provider: 'core', authTier: 'none', data: { version: '0.2.0', phase: 'v0.2-research-plus-governed-write-foundation', enabledNamespaces: ['discovery', 'video', 'channel', 'transcript', 'comments', 'planning', 'research', 'safety'], lockedNamespaces: ['operations', 'community-write', 'analytics-oauth', 'reporting', 'media-download', 'shorts-render', 'music-private'] }, warnings: [] });
9
9
  }
10
10
  //# sourceMappingURL=safety.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"safety.js","sourceRoot":"","sources":["../../../src/tools/safety.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,KAA2D;IACtG,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC9C,OAAO,YAAY,CAAC,EAAE,IAAI,EAAE,qCAAqC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,yDAAyD,CAAC,EAAE,CAAC,CAAC;AACtN,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAA6B;IAClE,OAAO,YAAY,CAAC,EAAE,IAAI,EAAE,kCAAkC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,CAAC,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAC,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,WAAW,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;AACxZ,CAAC"}
1
+ {"version":3,"file":"safety.js","sourceRoot":"","sources":["../../../src/tools/safety.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,KAA2D;IACtG,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC9C,OAAO,YAAY,CAAC,EAAE,IAAI,EAAE,qCAAqC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,yDAAyD,CAAC,EAAE,CAAC,CAAC;AACtN,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAA6B;IAClE,OAAO,YAAY,CAAC,EAAE,IAAI,EAAE,kCAAkC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,8CAA8C,EAAE,iBAAiB,EAAE,CAAC,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAC,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,WAAW,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;AACpc,CAAC"}
@@ -1,5 +1,33 @@
1
1
  # Safety Policy
2
2
 
3
- Source of truth: `research/safety-policy-2026-05-13.md` and `research/approval-audit-governance-2026-05-13.md`.
3
+ ## Default posture
4
4
 
5
- v0 blocks write, destructive, private analytics, and download surfaces. These are full-scope features, but require approval/OAuth/audit/copyright guards in later phases.
5
+ - Discovery, video, channel, transcript, comments, planning, research, and safety tools are read-only by default.
6
+ - Operations, community-write, analytics OAuth, reporting, media-download, Shorts render, and private music namespaces remain locked by default.
7
+ - Write/download/destructive tools must not be exposed unless explicit environment gates are enabled.
8
+
9
+ ## v0.2 governed write foundation
10
+
11
+ v0.2 may expose operation tools only when both flags are enabled:
12
+
13
+ ```text
14
+ YOUTUBE_OMNI_ENABLE_WRITE_TOOLS=true
15
+ YOUTUBE_OMNI_DRY_RUN_WRITES=true
16
+ ```
17
+
18
+ Even when exposed, operation tools are dry-run stubs. They return `APPROVAL_REQUIRED_OR_WRITE_DISABLED` and a `wouldCall` field instead of calling YouTube write APIs.
19
+
20
+ Live writes require a later phase with all of these controls:
21
+
22
+ - OAuth write credentials
23
+ - human approval ID
24
+ - preview/diff for the proposed mutation
25
+ - audit log storage
26
+ - double confirmation for destructive operations
27
+
28
+ ## Risk tiers
29
+
30
+ - `none` / tier 0: public metadata reads
31
+ - `low` / tier 1: transcript, comments, planning, research reads
32
+ - `high` / tier 4: upload, metadata, thumbnail, playlist, comment/community writes
33
+ - `destructive` / tier 5: delete/remove, download/clip, revenue/private data workflows
@@ -2,4 +2,53 @@
2
2
 
3
3
  Source of truth: `research/tool-schema-draft-2026-05-13.md` and full-scope schema documents under `research/`.
4
4
 
5
- v0 exposes read-only tools only. Operations/analytics/media schemas are documented for later phases.
5
+ ## v0.2 default exposed tools
6
+
7
+ v0.2 keeps all v0 read-only tools and adds Creator Research synthesis tools. Operations/analytics/media schemas are documented for later phases and remain gated.
8
+
9
+ ### Discovery
10
+
11
+ - `youtube.discovery.search_videos`
12
+ - `youtube.discovery.get_video_categories`
13
+
14
+ ### Video
15
+
16
+ - `youtube.video.get_details`
17
+ - `youtube.video.compare`
18
+
19
+ ### Channel
20
+
21
+ - `youtube.channel.get_statistics`
22
+ - `youtube.channel.get_top_videos`
23
+
24
+ ### Transcript
25
+
26
+ - `youtube.transcript.get_segments`
27
+ - `youtube.transcript.get_full_text`
28
+ - `youtube.transcript.analyze_structure`
29
+
30
+ ### Comments
31
+
32
+ - `youtube.comments.get`
33
+ - `youtube.comments.summarize`
34
+
35
+ ### Planning
36
+
37
+ - `youtube.planning.generate_research_brief`
38
+
39
+ ### Creator Research
40
+
41
+ - `youtube.research.find_outlier_videos` — ranks videos by simple views-to-channel-size signal.
42
+ - `youtube.research.compare_hooks` — compares transcript intro hooks and labels patterns.
43
+ - `youtube.research.extract_topic_angles` — derives content angles from discovered videos.
44
+ - `youtube.research.summarize_comment_pain_points` — groups audience questions/requests from comments.
45
+ - `youtube.research.generate_video_angle_matrix` — generates evidence-backed angle rows for planning.
46
+
47
+ ### Safety
48
+
49
+ - `youtube.safety.classify_action_risk`
50
+ - `youtube.safety.list_capabilities`
51
+
52
+ ## Gated operation tools
53
+
54
+ Operation tools are not exposed by default. v0.2 only permits dry-run operation stubs when explicit write and dry-run gates are enabled.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@liorium/youtube-omni-mcp",
3
- "version": "0.1.2",
3
+ "version": "0.2.0",
4
4
  "description": "YouTube Creator Intelligence, Analytics, Operations, and Production MCP server.",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",