mcpscraper-cli 0.50.1 → 0.51.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 (3) hide show
  1. package/README.md +25 -6
  2. package/dist/bin/cli.js +444 -436
  3. package/package.json +2 -2
package/dist/bin/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  // src/cli.ts
4
- import { Command } from "commander";
4
+ import { Command, Option } from "commander";
5
5
  import { fileURLToPath } from "url";
6
6
  import { mkdirSync, realpathSync, writeFileSync } from "fs";
7
7
  import { homedir } from "os";
@@ -10,7 +10,7 @@ import { randomUUID } from "crypto";
10
10
  import { ScraperClient, ScraperApiError } from "mcpscraper-sdk";
11
11
 
12
12
  // src/version.ts
13
- var CLI_VERSION = "0.50.1";
13
+ var CLI_VERSION = "0.51.0";
14
14
 
15
15
  // src/generated-tools.ts
16
16
  var MCP_TOOL_CATALOG = [
@@ -151,7 +151,7 @@ var MCP_TOOL_CATALOG = [
151
151
  "type": "boolean"
152
152
  },
153
153
  "index": {
154
- "description": "Ordered zero-based or one-based position defined by the surrounding collection.",
154
+ "description": "Whether this scope permits indexing Memory content.",
155
155
  "type": "boolean"
156
156
  },
157
157
  "admin": {
@@ -432,7 +432,7 @@ var MCP_TOOL_CATALOG = [
432
432
  "type": "boolean"
433
433
  },
434
434
  "index": {
435
- "description": "Ordered zero-based or one-based position defined by the surrounding collection.",
435
+ "description": "Whether this scope permits indexing Memory content.",
436
436
  "type": "boolean"
437
437
  },
438
438
  "admin": {
@@ -893,7 +893,7 @@ var MCP_TOOL_CATALOG = [
893
893
  "type": "string",
894
894
  "minLength": 1,
895
895
  "maxLength": 180,
896
- "description": "Optional source or provenance constraint appropriate to this tool; omit when no source restriction is intended."
896
+ "description": "Required utm_source value identifying the acquisition source, such as google or a newsletter name."
897
897
  },
898
898
  "medium": {
899
899
  "type": "string",
@@ -913,7 +913,7 @@ var MCP_TOOL_CATALOG = [
913
913
  "maxLength": 240
914
914
  },
915
915
  "content": {
916
- "description": "Complete content to route, validate, or store; do not substitute a partial excerpt when full content is required.",
916
+ "description": "Optional utm_content label identifying the ad creative or link variant; this is not document content.",
917
917
  "type": "string",
918
918
  "maxLength": 240
919
919
  },
@@ -2361,10 +2361,10 @@ var MCP_TOOL_CATALOG = [
2361
2361
  "type": "string",
2362
2362
  "minLength": 1,
2363
2363
  "maxLength": 160,
2364
- "description": "Optional normalized analytics event-name filter."
2364
+ "description": "Required canonical event name that this score predicate must match."
2365
2365
  },
2366
2366
  "withinDays": {
2367
- "description": "Optional bounded lookback window in days.",
2367
+ "description": "Lookback window in days for this predicate; required for event_recency and optional for other supported predicates.",
2368
2368
  "type": "integer",
2369
2369
  "minimum": 1,
2370
2370
  "maximum": 3650
@@ -2388,16 +2388,16 @@ var MCP_TOOL_CATALOG = [
2388
2388
  "type": "string",
2389
2389
  "minLength": 1,
2390
2390
  "maxLength": 160,
2391
- "description": "Optional normalized analytics event-name filter."
2391
+ "description": "Required canonical event name that this score predicate must match."
2392
2392
  },
2393
2393
  "minimum": {
2394
2394
  "type": "integer",
2395
2395
  "minimum": 1,
2396
2396
  "maximum": 1e3,
2397
- "description": "Overall lower bound for the governed score or range."
2397
+ "description": "Minimum number of matching events required by an event_frequency predicate."
2398
2398
  },
2399
2399
  "withinDays": {
2400
- "description": "Optional bounded lookback window in days.",
2400
+ "description": "Lookback window in days for this predicate; required for event_recency and optional for other supported predicates.",
2401
2401
  "type": "integer",
2402
2402
  "minimum": 1,
2403
2403
  "maximum": 3650
@@ -2422,13 +2422,13 @@ var MCP_TOOL_CATALOG = [
2422
2422
  "type": "string",
2423
2423
  "minLength": 1,
2424
2424
  "maxLength": 160,
2425
- "description": "Optional normalized analytics event-name filter."
2425
+ "description": "Required canonical event name that this score predicate must match."
2426
2426
  },
2427
2427
  "withinDays": {
2428
2428
  "type": "integer",
2429
2429
  "minimum": 1,
2430
2430
  "maximum": 3650,
2431
- "description": "Optional bounded lookback window in days."
2431
+ "description": "Lookback window in days for this predicate; required for event_recency and optional for other supported predicates."
2432
2432
  }
2433
2433
  },
2434
2434
  "required": [
@@ -2453,7 +2453,7 @@ var MCP_TOOL_CATALOG = [
2453
2453
  "description": "Exact path value used by this tool; preserve its leading slash or vault-relative form as required."
2454
2454
  },
2455
2455
  "withinDays": {
2456
- "description": "Optional bounded lookback window in days.",
2456
+ "description": "Lookback window in days for this predicate; required for event_recency and optional for other supported predicates.",
2457
2457
  "type": "integer",
2458
2458
  "minimum": 1,
2459
2459
  "maximum": 3650
@@ -2522,7 +2522,7 @@ var MCP_TOOL_CATALOG = [
2522
2522
  "description": "Canonical call or pipeline outcome matched by this rule."
2523
2523
  },
2524
2524
  "withinDays": {
2525
- "description": "Optional bounded lookback window in days.",
2525
+ "description": "Lookback window in days for this predicate; required for event_recency and optional for other supported predicates.",
2526
2526
  "type": "integer",
2527
2527
  "minimum": 1,
2528
2528
  "maximum": 3650
@@ -2992,8 +2992,7 @@ var MCP_TOOL_CATALOG = [
2992
2992
  "entered",
2993
2993
  "advanced",
2994
2994
  "median_time_seconds"
2995
- ],
2996
- "description": "Allowlisted report column selected for sorting."
2995
+ ]
2997
2996
  },
2998
2997
  "description": "Ordered allowlisted columns for the selected report family."
2999
2998
  },
@@ -3525,7 +3524,7 @@ var MCP_TOOL_CATALOG = [
3525
3524
  "description": "Analytics Site id returned by analytics_list_sites."
3526
3525
  },
3527
3526
  "fields": {
3528
- "description": "Ordered form-field definitions to render and validate for submissions.",
3527
+ "description": "Optional allowlisted CRM export columns; advertising identifiers require the advertising_measurement purpose acknowledgement.",
3529
3528
  "minItems": 1,
3530
3529
  "maxItems": 16,
3531
3530
  "type": "array",
@@ -8808,7 +8807,7 @@ var MCP_TOOL_CATALOG = [
8808
8807
  "type": "string",
8809
8808
  "minLength": 1,
8810
8809
  "maxLength": 80,
8811
- "description": "Optional source or provenance constraint appropriate to this tool; omit when no source restriction is intended."
8810
+ "description": "Required source-system name for the event being recorded; this is provenance, not a report filter."
8812
8811
  },
8813
8812
  "sourceAccountRef": {
8814
8813
  "type": "string",
@@ -8839,7 +8838,7 @@ var MCP_TOOL_CATALOG = [
8839
8838
  "eventName": {
8840
8839
  "type": "string",
8841
8840
  "pattern": "^[a-z][a-z0-9_]{1,79}$",
8842
- "description": "Optional normalized analytics event-name filter."
8841
+ "description": "Required canonical name for the event being recorded; use lowercase letters, digits, and underscores starting with a letter."
8843
8842
  },
8844
8843
  "occurredAt": {
8845
8844
  "type": "string",
@@ -9098,7 +9097,7 @@ var MCP_TOOL_CATALOG = [
9098
9097
  "type": "string",
9099
9098
  "minLength": 1,
9100
9099
  "maxLength": 160,
9101
- "description": "Optional source or provenance constraint appropriate to this tool; omit when no source restriction is intended."
9100
+ "description": "Required canonical source event name used by this activation mapping."
9102
9101
  },
9103
9102
  "providerEvent": {
9104
9103
  "type": "string",
@@ -10494,6 +10493,104 @@ var MCP_TOOL_CATALOG = [
10494
10493
  "openWorldHint": false
10495
10494
  }
10496
10495
  },
10496
+ {
10497
+ "name": "artifact_describe",
10498
+ "category": "artifacts",
10499
+ "title": "Describe Retained File",
10500
+ "description": "Inspect owned artifactId MIME, bytes, SHA-256, capabilities, expiry and download access. Denies foreign or expired files.",
10501
+ "inputSchema": {
10502
+ "type": "object",
10503
+ "properties": {
10504
+ "artifactId": {
10505
+ "type": "string",
10506
+ "minLength": 1,
10507
+ "maxLength": 1024,
10508
+ "description": "Artifact ID returned by a completed MCP result. Access remains bound to this authenticated caller."
10509
+ }
10510
+ },
10511
+ "required": [
10512
+ "artifactId"
10513
+ ],
10514
+ "$schema": "https://json-schema.org/draft/2020-12/schema"
10515
+ },
10516
+ "annotations": {
10517
+ "title": "Describe Retained File",
10518
+ "readOnlyHint": true,
10519
+ "destructiveHint": false,
10520
+ "idempotentHint": true,
10521
+ "openWorldHint": false
10522
+ }
10523
+ },
10524
+ {
10525
+ "name": "artifact_download",
10526
+ "category": "artifacts",
10527
+ "title": "Download Retained File",
10528
+ "description": "Get or renew owned artifactId downloads without reacquisition. Links expire in 15 minutes; retention is separate. Local paths are server-side; client access is unqualified. Denies expired or foreign files.",
10529
+ "inputSchema": {
10530
+ "type": "object",
10531
+ "properties": {
10532
+ "artifactId": {
10533
+ "type": "string",
10534
+ "minLength": 1,
10535
+ "maxLength": 1024,
10536
+ "description": "Artifact ID returned by a completed MCP result. Access remains bound to this authenticated caller."
10537
+ }
10538
+ },
10539
+ "required": [
10540
+ "artifactId"
10541
+ ],
10542
+ "$schema": "https://json-schema.org/draft/2020-12/schema"
10543
+ },
10544
+ "annotations": {
10545
+ "title": "Download Retained File",
10546
+ "readOnlyHint": true,
10547
+ "destructiveHint": false,
10548
+ "idempotentHint": false,
10549
+ "openWorldHint": false
10550
+ }
10551
+ },
10552
+ {
10553
+ "name": "artifact_read",
10554
+ "category": "artifacts",
10555
+ "title": "Read Retained File",
10556
+ "description": "Read owned retained text by artifactId. Follow nextOffset until null for complete UTF-8 content. Binary files need artifact_download or a format reader. Denies expired or foreign files; no reacquisition.",
10557
+ "inputSchema": {
10558
+ "type": "object",
10559
+ "properties": {
10560
+ "artifactId": {
10561
+ "type": "string",
10562
+ "minLength": 1,
10563
+ "maxLength": 1024,
10564
+ "description": "Artifact ID returned by a completed MCP result. Access remains bound to this authenticated caller."
10565
+ },
10566
+ "offset": {
10567
+ "default": 0,
10568
+ "description": "UTF-8 byte offset; use the exact nextOffset from the previous read.",
10569
+ "type": "integer",
10570
+ "minimum": 0,
10571
+ "maximum": 9007199254740991
10572
+ },
10573
+ "maxBytes": {
10574
+ "default": 8e3,
10575
+ "description": "Requested maximum bytes. The common serialized response budget may return a smaller window; follow nextOffset until null for the complete file.",
10576
+ "type": "integer",
10577
+ "minimum": 4,
10578
+ "maximum": 1e5
10579
+ }
10580
+ },
10581
+ "required": [
10582
+ "artifactId"
10583
+ ],
10584
+ "$schema": "https://json-schema.org/draft/2020-12/schema"
10585
+ },
10586
+ "annotations": {
10587
+ "title": "Read Retained File",
10588
+ "readOnlyHint": true,
10589
+ "destructiveHint": false,
10590
+ "idempotentHint": true,
10591
+ "openWorldHint": false
10592
+ }
10593
+ },
10497
10594
  {
10498
10595
  "name": "audit_site",
10499
10596
  "category": "web",
@@ -10877,7 +10974,7 @@ var MCP_TOOL_CATALOG = [
10877
10974
  "name": "browser_open",
10878
10975
  "category": "browser",
10879
10976
  "title": "Open Browser Session",
10880
- "description": "Open a hosted browser session you can drive. By default it is direct/no-proxy. Pass a saved profile name for authenticated sites, or serp_identity to load that identity's saved browser state and fixed network address. Returns a session_id used by all other browser_* tools.",
10977
+ "description": "Open a hosted browser session you can drive. By default it is direct/no-proxy. Pass a saved profile name for authenticated sites, or serp_identity to load that identity's saved browser state and fixed network address. Returns a session_id used by all other browser_* tools. Billed at 120 Credits per minute for the entire time the session is open, including idle time and waiting. Call browser_close with the session_id when finished to stop billing; browser_list_sessions can recover a lost ID.",
10881
10978
  "inputSchema": {
10882
10979
  "type": "object",
10883
10980
  "properties": {
@@ -12376,7 +12473,7 @@ var MCP_TOOL_CATALOG = [
12376
12473
  "format": "uri"
12377
12474
  },
12378
12475
  "source": {
12379
- "description": "Optional source or provenance constraint appropriate to this tool; omit when no source restriction is intended.",
12476
+ "description": "Source or publisher name for this citation, preserved as attribution.",
12380
12477
  "type": "string",
12381
12478
  "maxLength": 240
12382
12479
  },
@@ -13404,7 +13501,7 @@ var MCP_TOOL_CATALOG = [
13404
13501
  "format": "uri"
13405
13502
  },
13406
13503
  "source": {
13407
- "description": "Optional source or provenance constraint appropriate to this tool; omit when no source restriction is intended.",
13504
+ "description": "Source or publisher name for this citation or claim reference, preserved as attribution.",
13408
13505
  "type": "string",
13409
13506
  "maxLength": 240
13410
13507
  },
@@ -13548,7 +13645,7 @@ var MCP_TOOL_CATALOG = [
13548
13645
  "format": "uri"
13549
13646
  },
13550
13647
  "source": {
13551
- "description": "Optional source or provenance constraint appropriate to this tool; omit when no source restriction is intended.",
13648
+ "description": "Source or publisher name for this citation or claim reference, preserved as attribution.",
13552
13649
  "type": "string",
13553
13650
  "maxLength": 240
13554
13651
  },
@@ -13680,7 +13777,7 @@ var MCP_TOOL_CATALOG = [
13680
13777
  "format": "uri"
13681
13778
  },
13682
13779
  "source": {
13683
- "description": "Optional source or provenance constraint appropriate to this tool; omit when no source restriction is intended.",
13780
+ "description": "Source or publisher name for this citation or claim reference, preserved as attribution.",
13684
13781
  "type": "string",
13685
13782
  "maxLength": 240
13686
13783
  },
@@ -14329,7 +14426,7 @@ var MCP_TOOL_CATALOG = [
14329
14426
  "format": "uri"
14330
14427
  },
14331
14428
  "source": {
14332
- "description": "Optional source or provenance constraint appropriate to this tool; omit when no source restriction is intended.",
14429
+ "description": "Source or publisher name for this citation or claim reference, preserved as attribution.",
14333
14430
  "type": "string",
14334
14431
  "maxLength": 240
14335
14432
  },
@@ -14473,7 +14570,7 @@ var MCP_TOOL_CATALOG = [
14473
14570
  "format": "uri"
14474
14571
  },
14475
14572
  "source": {
14476
- "description": "Optional source or provenance constraint appropriate to this tool; omit when no source restriction is intended.",
14573
+ "description": "Source or publisher name for this citation or claim reference, preserved as attribution.",
14477
14574
  "type": "string",
14478
14575
  "maxLength": 240
14479
14576
  },
@@ -14605,7 +14702,7 @@ var MCP_TOOL_CATALOG = [
14605
14702
  "format": "uri"
14606
14703
  },
14607
14704
  "source": {
14608
- "description": "Optional source or provenance constraint appropriate to this tool; omit when no source restriction is intended.",
14705
+ "description": "Source or publisher name for this citation or claim reference, preserved as attribution.",
14609
14706
  "type": "string",
14610
14707
  "maxLength": 240
14611
14708
  },
@@ -15380,35 +15477,35 @@ var MCP_TOOL_CATALOG = [
15380
15477
  "properties": {
15381
15478
  "navigation": {
15382
15479
  "type": "boolean",
15383
- "description": "Validated navigation labels and destinations for the rendered site."
15480
+ "description": "Whether the renderer includes the navigation section."
15384
15481
  },
15385
15482
  "socialLinks": {
15386
15483
  "type": "boolean",
15387
- "description": "Curated public social profile links for the publication identity."
15484
+ "description": "Whether the renderer includes social profile links."
15388
15485
  },
15389
15486
  "authority": {
15390
15487
  "type": "boolean",
15391
- "description": "Source authority or ownership context supporting this content."
15488
+ "description": "Whether the renderer includes the authority section."
15392
15489
  },
15393
15490
  "consultation": {
15394
15491
  "type": "boolean",
15395
- "description": "Consultation-call presentation and link settings."
15492
+ "description": "Whether the renderer includes the consultation call-to-action."
15396
15493
  },
15397
15494
  "learning": {
15398
15495
  "type": "boolean",
15399
- "description": "Learning-section configuration for the editorial renderer."
15496
+ "description": "Whether the renderer includes the learning section."
15400
15497
  },
15401
15498
  "services": {
15402
15499
  "type": "boolean",
15403
- "description": "Source-backed services associated with the business listing."
15500
+ "description": "Whether the renderer includes the services section."
15404
15501
  },
15405
15502
  "proof": {
15406
15503
  "type": "boolean",
15407
- "description": "Proof-section content and evidence references."
15504
+ "description": "Whether the renderer includes the proof section."
15408
15505
  },
15409
15506
  "finalCta": {
15410
15507
  "type": "boolean",
15411
- "description": "Final call-to-action content shown after the authored collection."
15508
+ "description": "Whether the renderer includes the final call-to-action."
15412
15509
  }
15413
15510
  },
15414
15511
  "required": [
@@ -15537,7 +15634,7 @@ var MCP_TOOL_CATALOG = [
15537
15634
  "modern-sans",
15538
15635
  "humanist-sans"
15539
15636
  ],
15540
- "description": "Registered self-contained display-font family selected for prominent headings."
15637
+ "description": "Registered self-contained body-font family selected for article and paragraph text."
15541
15638
  }
15542
15639
  },
15543
15640
  "required": [
@@ -15551,35 +15648,35 @@ var MCP_TOOL_CATALOG = [
15551
15648
  "properties": {
15552
15649
  "navigation": {
15553
15650
  "type": "boolean",
15554
- "description": "Validated navigation labels and destinations for the rendered site."
15651
+ "description": "Whether the renderer includes the navigation section."
15555
15652
  },
15556
15653
  "socialLinks": {
15557
15654
  "type": "boolean",
15558
- "description": "Curated public social profile links for the publication identity."
15655
+ "description": "Whether the renderer includes social profile links."
15559
15656
  },
15560
15657
  "authority": {
15561
15658
  "type": "boolean",
15562
- "description": "Source authority or ownership context supporting this content."
15659
+ "description": "Whether the renderer includes the authority section."
15563
15660
  },
15564
15661
  "consultation": {
15565
15662
  "type": "boolean",
15566
- "description": "Consultation-call presentation and link settings."
15663
+ "description": "Whether the renderer includes the consultation call-to-action."
15567
15664
  },
15568
15665
  "learning": {
15569
15666
  "type": "boolean",
15570
- "description": "Learning-section configuration for the editorial renderer."
15667
+ "description": "Whether the renderer includes the learning section."
15571
15668
  },
15572
15669
  "services": {
15573
15670
  "type": "boolean",
15574
- "description": "Source-backed services associated with the business listing."
15671
+ "description": "Whether the renderer includes the services section."
15575
15672
  },
15576
15673
  "proof": {
15577
15674
  "type": "boolean",
15578
- "description": "Proof-section content and evidence references."
15675
+ "description": "Whether the renderer includes the proof section."
15579
15676
  },
15580
15677
  "finalCta": {
15581
15678
  "type": "boolean",
15582
- "description": "Final call-to-action content shown after the authored collection."
15679
+ "description": "Whether the renderer includes the final call-to-action."
15583
15680
  }
15584
15681
  },
15585
15682
  "required": [
@@ -15669,35 +15766,35 @@ var MCP_TOOL_CATALOG = [
15669
15766
  "properties": {
15670
15767
  "breakingTicker": {
15671
15768
  "type": "boolean",
15672
- "description": "Optional short breaking-news ticker shown by the renderer."
15769
+ "description": "Whether the renderer includes the breaking-news ticker."
15673
15770
  },
15674
15771
  "navigation": {
15675
15772
  "type": "boolean",
15676
- "description": "Validated navigation labels and destinations for the rendered site."
15773
+ "description": "Whether the renderer includes the navigation section."
15677
15774
  },
15678
15775
  "leadGrid": {
15679
15776
  "type": "boolean",
15680
- "description": "Lead-story grid configuration for the editorial renderer."
15777
+ "description": "Whether the renderer includes the lead-story grid."
15681
15778
  },
15682
15779
  "latestNews": {
15683
15780
  "type": "boolean",
15684
- "description": "Latest-news section configuration for the editorial renderer."
15781
+ "description": "Whether the renderer includes the latest-news section."
15685
15782
  },
15686
15783
  "categorySections": {
15687
15784
  "type": "boolean",
15688
- "description": "Ordered category sections and their assigned article references."
15785
+ "description": "Whether the renderer includes article sections grouped by category."
15689
15786
  },
15690
15787
  "newsletter": {
15691
15788
  "type": "boolean",
15692
- "description": "Newsletter-callout presentation and subscription link settings."
15789
+ "description": "Whether the renderer includes the newsletter call-to-action."
15693
15790
  },
15694
15791
  "pressRoom": {
15695
15792
  "type": "boolean",
15696
- "description": "Press-room section configuration for the editorial renderer."
15793
+ "description": "Whether the renderer includes the press-room section."
15697
15794
  },
15698
15795
  "trustFooter": {
15699
15796
  "type": "boolean",
15700
- "description": "Trust and provenance footer configuration for the rendered site."
15797
+ "description": "Whether the renderer includes the trust and provenance footer."
15701
15798
  }
15702
15799
  },
15703
15800
  "required": [
@@ -16487,7 +16584,7 @@ var MCP_TOOL_CATALOG = [
16487
16584
  "name": "crm-activity-append",
16488
16585
  "category": "crm",
16489
16586
  "title": "Append CRM Activity",
16490
- "description": "Append one idempotent governed CRM activity to canonical Communication, linked only to stable CRM\u2026",
16587
+ "description": "Append one idempotent governed CRM activity to canonical Communication, linked only to stable CRM entity IDs. Use for actual calls, meetings, messages, forms, conversions, or notes about a managed relationship; never pass a Research record ID. This is native Memory CRM and does not write to an external provider.",
16491
16588
  "inputSchema": {
16492
16589
  "type": "object",
16493
16590
  "properties": {
@@ -16500,12 +16597,12 @@ var MCP_TOOL_CATALOG = [
16500
16597
  "entityId": {
16501
16598
  "type": "string",
16502
16599
  "format": "uuid",
16503
- "description": "Existing governed entity identifier for this relation or edit."
16600
+ "description": "Optional stable ID for this new activity work record, not a CRM person or organization ID."
16504
16601
  },
16505
16602
  "personEntityId": {
16506
16603
  "type": "string",
16507
16604
  "format": "uuid",
16508
- "description": "Stable CRM Person entity identifier; Research identifiers are rejected."
16605
+ "description": "CRM Person entity ID to associate with this activity."
16509
16606
  },
16510
16607
  "entityIds": {
16511
16608
  "type": "array",
@@ -16515,7 +16612,7 @@ var MCP_TOOL_CATALOG = [
16515
16612
  },
16516
16613
  "maxItems": 100,
16517
16614
  "default": [],
16518
- "description": "Stable CRM entity identifiers associated with this CRM activity, task, or deal."
16615
+ "description": "CRM person or organization entity IDs associated with this activity; at least one association is required."
16519
16616
  },
16520
16617
  "activityType": {
16521
16618
  "type": "string",
@@ -16563,7 +16660,7 @@ var MCP_TOOL_CATALOG = [
16563
16660
  "source": {
16564
16661
  "type": "object",
16565
16662
  "additionalProperties": {},
16566
- "description": "Optional source or provenance constraint appropriate to this tool; omit when no source restriction is intended."
16663
+ "description": "Optional source provenance stored with the CRM activity; this is not a record filter."
16567
16664
  },
16568
16665
  "props": {
16569
16666
  "type": "object",
@@ -16591,14 +16688,14 @@ var MCP_TOOL_CATALOG = [
16591
16688
  "name": "crm-counterpart-apply",
16592
16689
  "category": "crm",
16593
16690
  "title": "Apply CRM Counterpart Link",
16594
- "description": "Apply an unexpired owner-scoped counterpart link preview using its exact handle and digest. The\u2026",
16691
+ "description": "Apply an unexpired owner-scoped counterpart link preview using its exact handle and digest. The operation is idempotent, copies no fields, and keeps the Research and CRM records independently editable.",
16595
16692
  "inputSchema": {
16596
16693
  "type": "object",
16597
16694
  "properties": {
16598
16695
  "planId": {
16599
16696
  "type": "string",
16600
16697
  "format": "uuid",
16601
- "description": "Durable CRM provisioning-plan identifier returned by the planning operation."
16698
+ "description": "Exact owner-scoped counterpart plan identifier returned by crm-counterpart-preview; use its matching unexpired planHandle and digest."
16602
16699
  },
16603
16700
  "planHandle": {
16604
16701
  "type": "string",
@@ -16639,7 +16736,7 @@ var MCP_TOOL_CATALOG = [
16639
16736
  "name": "crm-counterpart-preview",
16640
16737
  "category": "crm",
16641
16738
  "title": "Preview CRM Counterpart Link",
16642
- "description": "Preview an explicit link between one Research record and one CRM record of the same kind. Link-only is\u2026",
16739
+ "description": "Preview an explicit link between one Research record and one CRM record of the same kind. Link-only is the safe default and the only mode in this release: copiedFields is always empty, and neither record is promoted, merged, relocated, or synchronized. The returned owner-scoped handle and digest expire.",
16643
16740
  "inputSchema": {
16644
16741
  "type": "object",
16645
16742
  "properties": {
@@ -16693,7 +16790,7 @@ var MCP_TOOL_CATALOG = [
16693
16790
  "name": "crm-deal-transition",
16694
16791
  "category": "crm",
16695
16792
  "title": "Transition CRM Deal",
16696
- "description": "Apply one governed deal-stage transition after enforcing the pipeline\u2019s allowed forward/backward moves\u2026",
16793
+ "description": "Apply one governed deal-stage transition after enforcing the pipeline\u2019s allowed forward/backward moves, required fields, probability, and won/lost semantics. Returns an audit receipt and rejects stale revisions.",
16697
16794
  "inputSchema": {
16698
16795
  "type": "object",
16699
16796
  "properties": {
@@ -16727,7 +16824,7 @@ var MCP_TOOL_CATALOG = [
16727
16824
  "type": "object",
16728
16825
  "additionalProperties": {},
16729
16826
  "default": {},
16730
- "description": "Ordered form-field definitions to render and validate for submissions."
16827
+ "description": "Deal field values to apply during this stage transition, including values required by the destination stage."
16731
16828
  }
16732
16829
  },
16733
16830
  "required": [
@@ -16752,7 +16849,7 @@ var MCP_TOOL_CATALOG = [
16752
16849
  "name": "crm-deal-upsert",
16753
16850
  "category": "crm",
16754
16851
  "title": "Upsert CRM Deal",
16755
- "description": "Create or revision-check a canonical Deal associated only with stable CRM people or organizations. A\u2026",
16852
+ "description": "Create or revision-check a Deal for an actual commercial opportunity associated with CRM people or organizations. Read crm-pipeline-list for pipelineId, stageId, and probability. From crm-work-search with objectKind:deal, use workId as dealId and revision as baseRevision. Use baseRevision:0 for creation and keep idempotencyKey/input unchanged on retry.",
16756
16853
  "inputSchema": {
16757
16854
  "type": "object",
16758
16855
  "properties": {
@@ -16764,7 +16861,7 @@ var MCP_TOOL_CATALOG = [
16764
16861
  "baseRevision": {
16765
16862
  "type": "integer",
16766
16863
  "minimum": 0,
16767
- "description": "Last revision read by the caller; supply it to reject an update if the record changed meanwhile."
16864
+ "description": "Use 0 to create a deal; for an edit, supply dealId and the current positive revision read from crm-work-get."
16768
16865
  },
16769
16866
  "idempotencyKey": {
16770
16867
  "type": "string",
@@ -16808,12 +16905,12 @@ var MCP_TOOL_CATALOG = [
16808
16905
  "type": "number",
16809
16906
  "minimum": 0,
16810
16907
  "maximum": 1,
16811
- "description": "Deal probability from zero through one hundred for the selected governed stage."
16908
+ "description": "Deal probability from 0 through 1; must equal the selected stage probability returned by crm-pipeline-list."
16812
16909
  },
16813
16910
  "party": {
16814
16911
  "type": "string",
16815
16912
  "format": "uuid",
16816
- "description": "Stable CRM person or organization party associated with the deal."
16913
+ "description": "Stable CRM person or organization party for the deal; this identifier must also appear in entityIds."
16817
16914
  },
16818
16915
  "enteredAt": {
16819
16916
  "type": "string",
@@ -16877,7 +16974,7 @@ var MCP_TOOL_CATALOG = [
16877
16974
  "name": "crm-duplicate-search",
16878
16975
  "category": "crm",
16879
16976
  "title": "Search CRM Duplicates",
16880
- "description": "Search reviewable duplicate candidates within one CRM person or organization domain using stable\u2026",
16977
+ "description": "Search reviewable duplicate candidates within one CRM person or organization domain using stable owner-scoped evidence. This never merges, links, or promotes records and never searches Research records.",
16881
16978
  "inputSchema": {
16882
16979
  "type": "object",
16883
16980
  "properties": {
@@ -16936,7 +17033,7 @@ var MCP_TOOL_CATALOG = [
16936
17033
  "name": "crm-import-apply",
16937
17034
  "category": "crm",
16938
17035
  "title": "Apply CRM Import",
16939
- "description": "Apply an unexpired CRM import preview with its exact owner-scoped handle, digest, explicit confirmation\u2026",
17036
+ "description": "Apply an unexpired CRM import preview with its exact owner-scoped handle, digest, explicit confirmation token, and idempotency key. Upload or preview alone can never apply rows. Research domains are unreachable.",
16940
17037
  "inputSchema": {
16941
17038
  "type": "object",
16942
17039
  "properties": {
@@ -16990,7 +17087,7 @@ var MCP_TOOL_CATALOG = [
16990
17087
  "name": "crm-import-preview",
16991
17088
  "category": "crm",
16992
17089
  "title": "Preview CRM Import",
16993
- "description": "Preview a CRM-owned import before any row is applied. Rows may target only CRM People or CRM\u2026",
17090
+ "description": "Preview a CRM-owned import before any row is applied. Rows may target only CRM People or CRM Organizations. Returns validation issues, duplicate candidates, an owner-scoped expiring handle, and an exact digest; raw rows remain in Memory-owned storage and never enter X-Ray.",
16994
17091
  "inputSchema": {
16995
17092
  "type": "object",
16996
17093
  "properties": {
@@ -17070,7 +17167,7 @@ var MCP_TOOL_CATALOG = [
17070
17167
  "name": "crm-merge-apply",
17071
17168
  "category": "crm",
17072
17169
  "title": "Apply CRM Merge",
17073
- "description": "Apply an explicitly owner-confirmed, unexpired CRM merge plan with its exact handle, digest, and\u2026",
17170
+ "description": "Apply an explicitly owner-confirmed, unexpired CRM merge plan with its exact handle, digest, and idempotency key. The duplicate becomes a reversible archived alias; canonical source history is retained. This destructive operation is disabled without owner scope and confirmation.",
17074
17171
  "inputSchema": {
17075
17172
  "type": "object",
17076
17173
  "properties": {
@@ -17124,7 +17221,7 @@ var MCP_TOOL_CATALOG = [
17124
17221
  "name": "crm-merge-preview",
17125
17222
  "category": "crm",
17126
17223
  "title": "Preview CRM Merge",
17127
- "description": "Preview a reversible duplicate merge inside one CRM domain. Shows field conflicts and affected\u2026",
17224
+ "description": "Preview a reversible duplicate merge inside one CRM domain. Shows field conflicts and affected associations; the duplicate will become an archived alias and source history will not be deleted. Preview does not apply the merge.",
17128
17225
  "inputSchema": {
17129
17226
  "type": "object",
17130
17227
  "properties": {
@@ -17172,7 +17269,7 @@ var MCP_TOOL_CATALOG = [
17172
17269
  "name": "crm-organization-get",
17173
17270
  "category": "crm",
17174
17271
  "title": "Get CRM Organization",
17175
- "description": "Get one managed CRM Organization by stable entity ID with aliases, associations, and optional Research\u2026",
17272
+ "description": "Get one managed CRM Organization by stable entity ID with aliases, associations, and optional Research counterpart ID. Linking does not synchronize fields.",
17176
17273
  "inputSchema": {
17177
17274
  "type": "object",
17178
17275
  "properties": {
@@ -17200,7 +17297,7 @@ var MCP_TOOL_CATALOG = [
17200
17297
  "name": "crm-organization-search",
17201
17298
  "category": "crm",
17202
17299
  "title": "Search CRM Organizations",
17203
- "description": "Search owner-managed CRM Organizations such as prospect accounts, customers, employers, vendors\u2026",
17300
+ "description": "Search owner-managed CRM Organizations such as prospect accounts, customers, employers, vendors, partners, communities, or publications. Never returns Research Organizations and never infers an account solely from an email domain.",
17204
17301
  "inputSchema": {
17205
17302
  "type": "object",
17206
17303
  "properties": {
@@ -17282,7 +17379,7 @@ var MCP_TOOL_CATALOG = [
17282
17379
  "name": "crm-organization-upsert",
17283
17380
  "category": "crm",
17284
17381
  "title": "Upsert CRM Organization",
17285
- "description": "Create or revision-check a managed CRM Organization. Relationship type is required while commercial\u2026",
17382
+ "description": "Create or revision-check a managed CRM Organization. Relationship type is required while commercial lifecycle is optional. Rejects Research claims/citations/roles/topics, does not infer an account from email, and does not activate an external provider.",
17286
17383
  "inputSchema": {
17287
17384
  "type": "object",
17288
17385
  "properties": {
@@ -17294,7 +17391,7 @@ var MCP_TOOL_CATALOG = [
17294
17391
  "baseRevision": {
17295
17392
  "type": "integer",
17296
17393
  "minimum": 0,
17297
- "description": "Last revision read by the caller; supply it to reject an update if the record changed meanwhile."
17394
+ "description": "Use 0 to create a CRM Organization; for an edit, supply entityId and the current positive revision read from crm-organization-get."
17298
17395
  },
17299
17396
  "idempotencyKey": {
17300
17397
  "type": "string",
@@ -17450,7 +17547,7 @@ var MCP_TOOL_CATALOG = [
17450
17547
  "type": "null"
17451
17548
  }
17452
17549
  ],
17453
- "description": "Original source URL or opaque artifact reference preserved as image provenance."
17550
+ "description": "Source URL, retained artifact reference, or other identifier for this CRM field provenance."
17454
17551
  },
17455
17552
  "observedAt": {
17456
17553
  "type": "string",
@@ -17500,7 +17597,7 @@ var MCP_TOOL_CATALOG = [
17500
17597
  "name": "crm-person-get",
17501
17598
  "category": "crm",
17502
17599
  "title": "Get CRM Person",
17503
- "description": "Get one owner-managed CRM Person by stable entity ID with its governed relationship record, aliases\u2026",
17600
+ "description": "Get one owner-managed CRM Person by stable entity ID with its governed relationship record, aliases, associations, and optional Research counterpart ID. It does not copy Research fields or expose provider setup.",
17504
17601
  "inputSchema": {
17505
17602
  "type": "object",
17506
17603
  "properties": {
@@ -17528,7 +17625,7 @@ var MCP_TOOL_CATALOG = [
17528
17625
  "name": "crm-person-search",
17529
17626
  "category": "crm",
17530
17627
  "title": "Search CRM People",
17531
- "description": "Search owner-managed CRM People: prospects, customers, friends, coworkers, collaborators, vendors\u2026",
17628
+ "description": "Search owner-managed CRM People: prospects, customers, friends, coworkers, collaborators, vendors, partners, advisors, media, community contacts, or other relationships. This is not research search and never returns Research People.",
17532
17629
  "inputSchema": {
17533
17630
  "type": "object",
17534
17631
  "properties": {
@@ -17610,7 +17707,7 @@ var MCP_TOOL_CATALOG = [
17610
17707
  "name": "crm-person-upsert",
17611
17708
  "category": "crm",
17612
17709
  "title": "Upsert CRM Person",
17613
- "description": "Create or revision-check a managed CRM Person. Relationship type is required, but sales lifecycle and\u2026",
17710
+ "description": "Create or revision-check a managed CRM Person. Relationship type is required, but sales lifecycle and deals are optional so friends, coworkers, and collaborators are first-class. Rejects Research claims/citations/roles/topics and never activates an external CRM provider.",
17614
17711
  "inputSchema": {
17615
17712
  "type": "object",
17616
17713
  "properties": {
@@ -17623,7 +17720,7 @@ var MCP_TOOL_CATALOG = [
17623
17720
  "type": "integer",
17624
17721
  "minimum": 0,
17625
17722
  "default": 0,
17626
- "description": "Last revision read by the caller; supply it to reject an update if the record changed meanwhile."
17723
+ "description": "Use 0 to create a CRM Person; for an edit, supply entityId and the current positive revision read from crm-person-get."
17627
17724
  },
17628
17725
  "idempotencyKey": {
17629
17726
  "type": "string",
@@ -17779,7 +17876,7 @@ var MCP_TOOL_CATALOG = [
17779
17876
  "observedAt"
17780
17877
  ],
17781
17878
  "additionalProperties": false,
17782
- "description": "Optional source or provenance constraint appropriate to this tool; omit when no source restriction is intended."
17879
+ "description": "Optional governed form-source receipt associated with this CRM Person; this records provenance rather than filtering records."
17783
17880
  },
17784
17881
  "props": {
17785
17882
  "type": "object",
@@ -17823,7 +17920,7 @@ var MCP_TOOL_CATALOG = [
17823
17920
  "type": "null"
17824
17921
  }
17825
17922
  ],
17826
- "description": "Original source URL or opaque artifact reference preserved as image provenance."
17923
+ "description": "Source URL, form submission reference, retained artifact reference, or other identifier for this CRM field provenance."
17827
17924
  },
17828
17925
  "observedAt": {
17829
17926
  "type": "string",
@@ -17848,7 +17945,7 @@ var MCP_TOOL_CATALOG = [
17848
17945
  "observedAt"
17849
17946
  ],
17850
17947
  "additionalProperties": false,
17851
- "description": "Field authority, sensitivity, source, observation time, and confidence recorded with this governed write."
17948
+ "description": "Supply explicit unchanged lineage, including observedAt, for reliable idempotency replay. If both lineage and source are omitted, a timestamp is generated on every call; the same key prevents another write but a retry may report an idempotency conflict."
17852
17949
  }
17853
17950
  },
17854
17951
  "required": [
@@ -17871,7 +17968,7 @@ var MCP_TOOL_CATALOG = [
17871
17968
  "name": "crm-pipeline-list",
17872
17969
  "category": "crm",
17873
17970
  "title": "List CRM Pipelines",
17874
- "description": "List owner-scoped native CRM deal pipelines with ordered stages, required fields, allowed transitions\u2026",
17971
+ "description": "List owner-scoped native CRM deal pipelines with ordered stages, required fields, allowed transitions, probabilities, and versions. Use pipelineId, stageId, and probability for crm-deal-upsert, or version as crm-pipeline-upsert baseVersion. This reads native Memory CRM, not an external provider.",
17875
17972
  "inputSchema": {
17876
17973
  "type": "object",
17877
17974
  "properties": {},
@@ -17890,7 +17987,7 @@ var MCP_TOOL_CATALOG = [
17890
17987
  "name": "crm-pipeline-upsert",
17891
17988
  "category": "crm",
17892
17989
  "title": "Upsert CRM Pipeline",
17893
- "description": "Create or revision-check an owner-scoped native CRM deal pipeline with governed stages and transitions\u2026",
17990
+ "description": "Create or revise a native CRM deal pipeline with its complete ordered stages and transitions. Use crm-pipeline-list to obtain pipelineId and current baseVersion for edits; use baseVersion:0 for creation. Creation has no replay key: after an unknown outcome inspect crm-pipeline-list before retrying, or you may create duplicates. This changes native Memory CRM only.",
17894
17991
  "inputSchema": {
17895
17992
  "type": "object",
17896
17993
  "properties": {
@@ -17992,7 +18089,7 @@ var MCP_TOOL_CATALOG = [
17992
18089
  "title": "Upsert CRM Pipeline",
17993
18090
  "readOnlyHint": false,
17994
18091
  "destructiveHint": false,
17995
- "idempotentHint": true,
18092
+ "idempotentHint": false,
17996
18093
  "openWorldHint": false
17997
18094
  }
17998
18095
  },
@@ -18000,7 +18097,7 @@ var MCP_TOOL_CATALOG = [
18000
18097
  "name": "crm-quality-list",
18001
18098
  "category": "crm",
18002
18099
  "title": "List CRM Quality Issues",
18003
- "description": "List owner-scoped relationship quality issues for classification, invalid names, duplicates, imports\u2026",
18100
+ "description": "List owner-scoped relationship quality issues for classification, invalid names, duplicates, imports, merges, or canonical work. This is an audit queue only: it never auto-classifies, auto-merges, or activates providers.",
18004
18101
  "inputSchema": {
18005
18102
  "type": "object",
18006
18103
  "properties": {
@@ -18014,7 +18111,7 @@ var MCP_TOOL_CATALOG = [
18014
18111
  "merges",
18015
18112
  "work"
18016
18113
  ],
18017
- "description": "Governance queue to list: classification, naming, identity, duplicates, or delivery."
18114
+ "description": "Governance queue to list: classification, naming, duplicates, imports, merges, or work."
18018
18115
  },
18019
18116
  "limit": {
18020
18117
  "type": "integer",
@@ -18039,25 +18136,25 @@ var MCP_TOOL_CATALOG = [
18039
18136
  "name": "crm-task-upsert",
18040
18137
  "category": "crm",
18041
18138
  "title": "Upsert CRM Task",
18042
- "description": "Create or revision-check a canonical Task linked only to stable CRM entity IDs. Tasks remain in the\u2026",
18139
+ "description": "Create or revision-check a canonical Task associated with CRM people or organizations. From crm-work-search with objectKind:task, use workId as taskId and revision as baseRevision; use baseRevision:0 for new tasks. Keep idempotencyKey and input unchanged on retry. This writes the shared Tasks authority.",
18043
18140
  "inputSchema": {
18044
18141
  "type": "object",
18045
18142
  "properties": {
18046
18143
  "taskId": {
18047
18144
  "type": "string",
18048
18145
  "format": "uuid",
18049
- "description": "Stable CRM Task entity identifier for create or revision-checked update."
18146
+ "description": "Task workId returned by crm-work-search; omit to create a new task."
18050
18147
  },
18051
18148
  "entityId": {
18052
18149
  "type": "string",
18053
18150
  "format": "uuid",
18054
- "description": "Existing governed entity identifier for this relation or edit."
18151
+ "description": "Compatibility alias for taskId, not a CRM relationship ID; taskId takes precedence."
18055
18152
  },
18056
18153
  "baseRevision": {
18057
18154
  "type": "integer",
18058
18155
  "minimum": 0,
18059
18156
  "default": 0,
18060
- "description": "Last revision read by the caller; supply it to reject an update if the record changed meanwhile."
18157
+ "description": "Use 0 to create a Task; for an edit, supply taskId or entityId and the current positive revision read from crm-work-get."
18061
18158
  },
18062
18159
  "idempotencyKey": {
18063
18160
  "type": "string",
@@ -18124,7 +18221,7 @@ var MCP_TOOL_CATALOG = [
18124
18221
  "source": {
18125
18222
  "type": "object",
18126
18223
  "additionalProperties": {},
18127
- "description": "Optional source or provenance constraint appropriate to this tool; omit when no source restriction is intended."
18224
+ "description": "Optional source provenance stored with the Task; this is not a record filter."
18128
18225
  },
18129
18226
  "props": {
18130
18227
  "type": "object",
@@ -18152,261 +18249,129 @@ var MCP_TOOL_CATALOG = [
18152
18249
  "name": "crm-work-search",
18153
18250
  "category": "crm",
18154
18251
  "title": "Search CRM Work",
18155
- "description": "Search owner-scoped canonical CRM activities, tasks, or deals in deterministic updated-time order\u2026",
18252
+ "description": "Search owner-scoped CRM activities, tasks, or deals in updated-time order. Select exactly one objectKind and use only its valid filters; follow pageInfo.endCursor for more. Returned workId identifies the work record; entityIds identify its CRM relationships. Long content and fields may be truncated. This reads native Memory CRM, not an external provider.",
18156
18253
  "inputSchema": {
18157
18254
  "type": "object",
18158
- "properties": {},
18159
- "anyOf": [
18160
- {
18161
- "type": "object",
18162
- "properties": {
18163
- "apiKey": {
18164
- "type": "string",
18165
- "description": "Caller API key. Omit when the MCP transport already authenticated this request."
18166
- },
18167
- "sessionId": {
18168
- "type": "string",
18169
- "description": "Optional MCP session identifier used for active account context."
18170
- },
18171
- "entityId": {
18172
- "type": "string",
18173
- "format": "uuid",
18174
- "description": "Optional stable CRM person or organization entity ID associated with the work record."
18175
- },
18176
- "entityIds": {
18177
- "type": "array",
18178
- "items": {
18179
- "type": "string",
18180
- "format": "uuid"
18181
- },
18182
- "minItems": 1,
18183
- "maxItems": 10,
18184
- "description": "Optional stable CRM entity IDs that must all be associated with the work record."
18185
- },
18186
- "workId": {
18187
- "type": "string",
18188
- "format": "uuid",
18189
- "description": "Optional exact canonical CRM activity, task, or deal work ID."
18190
- },
18191
- "query": {
18192
- "type": "string",
18193
- "minLength": 1,
18194
- "maxLength": 300,
18195
- "description": "Optional case-insensitive title search."
18196
- },
18197
- "cursor": {
18198
- "type": "string",
18199
- "minLength": 1,
18200
- "maxLength": 2048,
18201
- "description": "Opaque cursor returned by the previous crm-work-search page."
18202
- },
18203
- "limit": {
18204
- "type": "integer",
18205
- "minimum": 1,
18206
- "maximum": 100,
18207
- "default": 25,
18208
- "description": "Maximum work records to return before cursor pagination."
18209
- },
18210
- "objectKind": {
18211
- "type": "string",
18212
- "const": "activity",
18213
- "description": "Search only canonical CRM activity records."
18214
- }
18255
+ "properties": {
18256
+ "entityId": {
18257
+ "type": "string",
18258
+ "format": "uuid",
18259
+ "description": "Optional stable CRM person or organization entity ID associated with the work record."
18260
+ },
18261
+ "entityIds": {
18262
+ "type": "array",
18263
+ "items": {
18264
+ "type": "string",
18265
+ "format": "uuid"
18215
18266
  },
18216
- "required": [
18217
- "objectKind"
18267
+ "minItems": 1,
18268
+ "maxItems": 10,
18269
+ "description": "Optional stable CRM entity IDs that must all be associated with the work record."
18270
+ },
18271
+ "workId": {
18272
+ "type": "string",
18273
+ "format": "uuid",
18274
+ "description": "Optional exact canonical CRM activity, task, or deal work ID."
18275
+ },
18276
+ "query": {
18277
+ "type": "string",
18278
+ "minLength": 1,
18279
+ "maxLength": 300,
18280
+ "description": "Optional case-insensitive title search."
18281
+ },
18282
+ "cursor": {
18283
+ "type": "string",
18284
+ "minLength": 1,
18285
+ "maxLength": 2048,
18286
+ "description": "Opaque cursor returned by the previous crm-work-search page."
18287
+ },
18288
+ "limit": {
18289
+ "type": "integer",
18290
+ "minimum": 1,
18291
+ "maximum": 100,
18292
+ "default": 25,
18293
+ "description": "Maximum work records to return before cursor pagination."
18294
+ },
18295
+ "objectKind": {
18296
+ "type": "string",
18297
+ "enum": [
18298
+ "activity",
18299
+ "task",
18300
+ "deal"
18218
18301
  ],
18219
- "additionalProperties": false
18302
+ "description": "Search exactly one canonical CRM work kind."
18220
18303
  },
18221
- {
18222
- "type": "object",
18223
- "properties": {
18224
- "apiKey": {
18225
- "type": "string",
18226
- "description": "Caller API key. Omit when the MCP transport already authenticated this request."
18227
- },
18228
- "sessionId": {
18229
- "type": "string",
18230
- "description": "Optional MCP session identifier used for active account context."
18231
- },
18232
- "entityId": {
18233
- "type": "string",
18234
- "format": "uuid",
18235
- "description": "Optional stable CRM person or organization entity ID associated with the work record."
18236
- },
18237
- "entityIds": {
18238
- "type": "array",
18239
- "items": {
18240
- "type": "string",
18241
- "format": "uuid"
18242
- },
18243
- "minItems": 1,
18244
- "maxItems": 10,
18245
- "description": "Optional stable CRM entity IDs that must all be associated with the work record."
18246
- },
18247
- "workId": {
18248
- "type": "string",
18249
- "format": "uuid",
18250
- "description": "Optional exact canonical CRM activity, task, or deal work ID."
18251
- },
18252
- "query": {
18253
- "type": "string",
18254
- "minLength": 1,
18255
- "maxLength": 300,
18256
- "description": "Optional case-insensitive title search."
18257
- },
18258
- "cursor": {
18259
- "type": "string",
18260
- "minLength": 1,
18261
- "maxLength": 2048,
18262
- "description": "Opaque cursor returned by the previous crm-work-search page."
18263
- },
18264
- "limit": {
18265
- "type": "integer",
18266
- "minimum": 1,
18267
- "maximum": 100,
18268
- "default": 25,
18269
- "description": "Maximum work records to return before cursor pagination."
18270
- },
18271
- "objectKind": {
18272
- "type": "string",
18273
- "const": "task",
18274
- "description": "Search only canonical Task records through the CRM lens."
18275
- },
18276
- "taskStatuses": {
18277
- "type": "array",
18278
- "items": {
18279
- "type": "string",
18280
- "enum": [
18281
- "todo",
18282
- "in_progress",
18283
- "blocked",
18284
- "done",
18285
- "cancelled"
18286
- ]
18287
- },
18288
- "minItems": 1,
18289
- "maxItems": 100,
18290
- "description": "Optional canonical Task statuses to include."
18291
- },
18292
- "dueBefore": {
18293
- "type": "string",
18294
- "format": "date-time",
18295
- "description": "Inclusive upper due-time bound for canonical Tasks."
18296
- },
18297
- "dueAfter": {
18298
- "type": "string",
18299
- "format": "date-time",
18300
- "description": "Inclusive lower due-time bound for canonical Tasks."
18301
- },
18302
- "dueUnscheduled": {
18303
- "type": "boolean",
18304
- "description": "Set true to return only canonical Tasks without a due date."
18305
- },
18306
- "taskOwnerId": {
18307
- "type": "string",
18308
- "minLength": 1,
18309
- "maxLength": 200,
18310
- "description": "Exact owner identifier stored on the canonical Task."
18311
- },
18312
- "dealId": {
18313
- "type": "string",
18314
- "format": "uuid",
18315
- "description": "Exact native CRM deal UUID linked from the canonical Task."
18316
- }
18304
+ "taskStatuses": {
18305
+ "type": "array",
18306
+ "items": {
18307
+ "type": "string",
18308
+ "enum": [
18309
+ "todo",
18310
+ "in_progress",
18311
+ "blocked",
18312
+ "done",
18313
+ "cancelled"
18314
+ ]
18317
18315
  },
18318
- "required": [
18319
- "objectKind"
18320
- ],
18321
- "additionalProperties": false
18316
+ "minItems": 1,
18317
+ "maxItems": 100,
18318
+ "description": "Task-only statuses to include."
18322
18319
  },
18323
- {
18324
- "type": "object",
18325
- "properties": {
18326
- "apiKey": {
18327
- "type": "string",
18328
- "description": "Caller API key. Omit when the MCP transport already authenticated this request."
18329
- },
18330
- "sessionId": {
18331
- "type": "string",
18332
- "description": "Optional MCP session identifier used for active account context."
18333
- },
18334
- "entityId": {
18335
- "type": "string",
18336
- "format": "uuid",
18337
- "description": "Optional stable CRM person or organization entity ID associated with the work record."
18338
- },
18339
- "entityIds": {
18340
- "type": "array",
18341
- "items": {
18342
- "type": "string",
18343
- "format": "uuid"
18344
- },
18345
- "minItems": 1,
18346
- "maxItems": 10,
18347
- "description": "Optional stable CRM entity IDs that must all be associated with the work record."
18348
- },
18349
- "workId": {
18350
- "type": "string",
18351
- "format": "uuid",
18352
- "description": "Optional exact canonical CRM activity, task, or deal work ID."
18353
- },
18354
- "query": {
18355
- "type": "string",
18356
- "minLength": 1,
18357
- "maxLength": 300,
18358
- "description": "Optional case-insensitive title search."
18359
- },
18360
- "cursor": {
18361
- "type": "string",
18362
- "minLength": 1,
18363
- "maxLength": 2048,
18364
- "description": "Opaque cursor returned by the previous crm-work-search page."
18365
- },
18366
- "limit": {
18367
- "type": "integer",
18368
- "minimum": 1,
18369
- "maximum": 100,
18370
- "default": 25,
18371
- "description": "Maximum work records to return before cursor pagination."
18372
- },
18373
- "objectKind": {
18374
- "type": "string",
18375
- "const": "deal",
18376
- "description": "Search only native CRM deal records."
18377
- },
18378
- "pipelineId": {
18379
- "type": "string",
18380
- "format": "uuid",
18381
- "description": "Optional exact native CRM pipeline UUID."
18382
- },
18383
- "stageIds": {
18384
- "type": "array",
18385
- "items": {
18386
- "type": "string",
18387
- "format": "uuid"
18388
- },
18389
- "minItems": 1,
18390
- "maxItems": 100,
18391
- "description": "Optional native CRM stage UUIDs to include."
18392
- },
18393
- "minValue": {
18394
- "type": "number",
18395
- "minimum": 0,
18396
- "description": "Optional inclusive minimum deal value in the stored currency."
18397
- },
18398
- "maxValue": {
18399
- "type": "number",
18400
- "minimum": 0,
18401
- "description": "Optional inclusive maximum deal value in the stored currency."
18402
- }
18320
+ "dueBefore": {
18321
+ "type": "string",
18322
+ "format": "date-time",
18323
+ "description": "Task-only inclusive upper due-time bound."
18324
+ },
18325
+ "dueAfter": {
18326
+ "type": "string",
18327
+ "format": "date-time",
18328
+ "description": "Task-only inclusive lower due-time bound."
18329
+ },
18330
+ "dueUnscheduled": {
18331
+ "type": "boolean",
18332
+ "description": "Task-only filter for records without a due date."
18333
+ },
18334
+ "taskOwnerId": {
18335
+ "type": "string",
18336
+ "minLength": 1,
18337
+ "maxLength": 200,
18338
+ "description": "Task-only exact owner identifier."
18339
+ },
18340
+ "dealId": {
18341
+ "type": "string",
18342
+ "format": "uuid",
18343
+ "description": "Task-only native CRM deal UUID."
18344
+ },
18345
+ "pipelineId": {
18346
+ "type": "string",
18347
+ "format": "uuid",
18348
+ "description": "Deal-only native CRM pipeline UUID."
18349
+ },
18350
+ "stageIds": {
18351
+ "type": "array",
18352
+ "items": {
18353
+ "type": "string",
18354
+ "format": "uuid"
18403
18355
  },
18404
- "required": [
18405
- "objectKind"
18406
- ],
18407
- "additionalProperties": false
18356
+ "minItems": 1,
18357
+ "maxItems": 100,
18358
+ "description": "Deal-only native CRM stage UUIDs."
18359
+ },
18360
+ "minValue": {
18361
+ "type": "number",
18362
+ "minimum": 0,
18363
+ "description": "Deal-only inclusive minimum value."
18364
+ },
18365
+ "maxValue": {
18366
+ "type": "number",
18367
+ "minimum": 0,
18368
+ "description": "Deal-only inclusive maximum value."
18408
18369
  }
18370
+ },
18371
+ "required": [
18372
+ "objectKind"
18409
18373
  ],
18374
+ "additionalProperties": false,
18410
18375
  "$schema": "http://json-schema.org/draft-07/schema#"
18411
18376
  },
18412
18377
  "annotations": {
@@ -18660,9 +18625,9 @@ var MCP_TOOL_CATALOG = [
18660
18625
  },
18661
18626
  "annotations": {
18662
18627
  "title": "Directory Workflow: Markets + Maps",
18663
- "readOnlyHint": true,
18628
+ "readOnlyHint": false,
18664
18629
  "destructiveHint": false,
18665
- "idempotentHint": false,
18630
+ "idempotentHint": true,
18666
18631
  "openWorldHint": true
18667
18632
  }
18668
18633
  },
@@ -20854,7 +20819,7 @@ var MCP_TOOL_CATALOG = [
20854
20819
  "name": "harvest_paa",
20855
20820
  "category": "search",
20856
20821
  "title": "Google PAA + SERP Harvest",
20857
- "description": "Expand one Google People Also Ask SERP into questions, answers, every preserved source, AI Overview evidence, ranking URLs, and entity IDs. Set pages to 2 to add the second organic-results page when available; PAA is still expanded once on the preserved first page, and pagination reports what was captured. maxQuestions is a target count, not traversal depth. Results distinguish target_reached, proven frontier_exhausted, interruption, and recovery_exhausted; a failed click or browser timeout is never reported as exhaustion. This compatibility tool waits; use harvest_paa_start plus harvest_paa_status for long runs. Optional SERP modules require their include flags. Use gl and location for regional context. Costs 400 Credits per harvest plus 10 Credits per question actually returned; unused hold is refunded. After a timeout or unknown response, reuse the same idempotencyKey. Call credits_info for current pricing and balance.",
20822
+ "description": "Expand one Google People Also Ask SERP into full captured answers, every source with available titles/descriptions, organic snippets, AI Overview evidence, ranking URLs, and entity IDs. Unfinished answer expansion is partial. Set pages to 2 for a second organic page when available; PAA expands once on page one, and pagination reports captured coverage. maxQuestions is a target count, not traversal depth. Results distinguish target_reached, proven frontier_exhausted, interruption, and recovery_exhausted; failed clicks and timeouts never prove exhaustion. This tool waits; use harvest_paa_start and harvest_paa_status for long runs. Optional SERP modules require include flags. Use gl and location for regional context. Costs 400 Credits per harvest plus 10 Credits per question actually returned; unused hold is refunded. After a timeout or unknown response, reuse the same idempotencyKey. Call credits_info for current pricing and balance.",
20858
20823
  "inputSchema": {
20859
20824
  "type": "object",
20860
20825
  "properties": {
@@ -21069,7 +21034,7 @@ var MCP_TOOL_CATALOG = [
21069
21034
  "name": "harvest_paa_status",
21070
21035
  "category": "other",
21071
21036
  "title": "Check Durable Google PAA Harvest",
21072
- "description": "Poll an owner-scoped harvest_paa_start job. Returns the job/operation/task correlation ID, saved progress, automatic-recovery count, target and discovery status, material completeness, bounded organic-page pagination, recent per-control interaction outcomes with 0.7/1.0/1.4-second confirmation telemetry, provider-session-correlated attempts, terminal rows, and billing. Page-two outcomes describe organic results only; the PAA graph always comes from the preserved first page. frontier_exhausted means every observed eligible PAA control was processed plus three healthy no-growth confirmations; interruption never means exhaustion. Polling never starts or bills another run.",
21037
+ "description": "Poll an owner-scoped harvest_paa_start job for saved answers and source descriptions, progress, recovery count, target/discovery status, material completeness, pagination, interaction outcomes, correlated provider attempts, terminal rows, and billing. Unfinished answer expansion is partial. Page two adds organic results; PAA comes from page one. frontier_exhausted requires every observed eligible PAA control processed plus three healthy no-growth confirmations; interruption never means exhaustion. Polling never starts or bills another run.",
21073
21038
  "inputSchema": {
21074
21039
  "type": "object",
21075
21040
  "properties": {
@@ -22319,7 +22284,7 @@ var MCP_TOOL_CATALOG = [
22319
22284
  "name": "library-ingest",
22320
22285
  "category": "library",
22321
22286
  "title": "Library Ingest",
22322
- "description": "Deposit a scrape, transcript, or generated output into the tenant Library vault for later semantic recall. Content is embedded for per-tenant search and best-effort mirrored to a local vault when configured. Requires write scope on the target vault.",
22287
+ "description": "Deposit the complete text of a scrape, transcript, or generated output into the tenant Library vault and index it for semantic recall. Requires write scope on the target vault. Preserve capturedAt and title when retrying: omitting capturedAt generates a new timestamp and can create another note. After an unknown outcome, inspect the saved note before repeating.",
22323
22288
  "inputSchema": {
22324
22289
  "type": "object",
22325
22290
  "properties": {
@@ -22343,7 +22308,7 @@ var MCP_TOOL_CATALOG = [
22343
22308
  "description": "Provenance of the content, e.g. a URL or tool name. Must be non-empty."
22344
22309
  },
22345
22310
  "capturedAt": {
22346
- "description": "ISO-8601 capture timestamp. Optional; defaults to now. Also seeds the deterministic storage path.",
22311
+ "description": "ISO-8601 capture timestamp. Defaults to now and seeds the storage path with title. Preserve this timestamp and title on retries; omitting it can create another note.",
22347
22312
  "type": "string"
22348
22313
  },
22349
22314
  "summary": {
@@ -22394,7 +22359,7 @@ var MCP_TOOL_CATALOG = [
22394
22359
  "title": "Library Ingest",
22395
22360
  "readOnlyHint": false,
22396
22361
  "destructiveHint": false,
22397
- "idempotentHint": true,
22362
+ "idempotentHint": false,
22398
22363
  "openWorldHint": true
22399
22364
  }
22400
22365
  },
@@ -22727,7 +22692,7 @@ var MCP_TOOL_CATALOG = [
22727
22692
  "name": "local_sourcebook_refresh",
22728
22693
  "category": "directory",
22729
22694
  "title": "Refresh a Local Sourcebook Listing",
22730
- "description": "Queue a new broad crawl and review/media acquisition pass for a listing owned by the authenticated MCP Scraper account. A refresh costs 2 Credits total, including acquisition; idempotent retries are not charged twice, and a replayed retry still re-runs the acquisition, so a failed listing is always recoverable. Read local_sourcebook_submission_status first: a refresh repeats the same acquisition, so fix whatever acquisitionError reports before spending another pass. The last published revision remains public until the refreshed evidence revision completes and auto-publishes.",
22695
+ "description": "Queue a new broad crawl and review/media acquisition pass for a listing owned by the authenticated MCP Scraper account. A refresh costs 2 Credits total, including acquisition. Read local_sourcebook_submission_status first and inspect acquisitionError after a failed attempt. After an unknown response, check status before calling again: this tool has no caller retry key, and another accepted call can start another acquisition. Listings already queued or enriching reject refreshes. The last published revision remains public until refreshed evidence completes and auto-publishes.",
22731
22696
  "inputSchema": {
22732
22697
  "type": "object",
22733
22698
  "properties": {
@@ -22744,7 +22709,7 @@ var MCP_TOOL_CATALOG = [
22744
22709
  },
22745
22710
  "annotations": {
22746
22711
  "title": "Refresh a Local Sourcebook Listing",
22747
- "readOnlyHint": true,
22712
+ "readOnlyHint": false,
22748
22713
  "destructiveHint": false,
22749
22714
  "idempotentHint": false,
22750
22715
  "openWorldHint": true
@@ -23008,9 +22973,9 @@ var MCP_TOOL_CATALOG = [
23008
22973
  },
23009
22974
  "annotations": {
23010
22975
  "title": "Capture Governed Local Sourcebook Listing",
23011
- "readOnlyHint": true,
22976
+ "readOnlyHint": false,
23012
22977
  "destructiveHint": false,
23013
- "idempotentHint": false,
22978
+ "idempotentHint": true,
23014
22979
  "openWorldHint": true
23015
22980
  }
23016
22981
  },
@@ -23214,7 +23179,7 @@ var MCP_TOOL_CATALOG = [
23214
23179
  "name": "maps_place_intel",
23215
23180
  "category": "maps",
23216
23181
  "title": "Google Maps Business Profile Details",
23217
- "description": 'Deep-dive one known/named Google Business Profile: rating, reviews, category, address, phone, website, full hours, About attributes, entity IDs/CID, configured services/areas, and optional photos. Use include:["all"] for every supported field group, with maxReviews and maxImages as limits; existing includeReviews, includeServices, and includeImages flags also work. Set includeImages:true for a provenance-aware manifest, bounded AI image blocks, and an owner-scoped ZIP; choose imageScope:"owner" for listing-owner photos only. Not for category searches or multi-business prospect lists; use maps_search for those. Split business name from location.',
23182
+ "description": 'Inspect one named Google Business Profile: rating, reviews, category, address, phone, website, hours, About attributes, entity IDs/CID, services/areas, and optional photos when available. Use include:["all"] or includeReviews/includeServices/includeImages; maxReviews and maxImages bound collection. Page saved reviews/images with maps_place_status and returned cursors. includeImages:true supplies a manifest, bounded AI image blocks, and an owner-scoped ZIP; imageScope:"owner" selects listing-owner photos. For category searches or multi-business lists use maps_search. Split business name from location.',
23218
23183
  "inputSchema": {
23219
23184
  "type": "object",
23220
23185
  "properties": {
@@ -23249,7 +23214,7 @@ var MCP_TOOL_CATALOG = [
23249
23214
  },
23250
23215
  "maxReviews": {
23251
23216
  "default": 50,
23252
- "description": "Max review cards when includeReviews is true. Default 50, maximum 1,000. Collection is resumable; actual availability depends on the profile.",
23217
+ "description": "Max review cards when includeReviews is true. Default 50, maximum 1,000. Availability depends on the profile. Partial or interrupted runs can resume.",
23253
23218
  "type": "integer",
23254
23219
  "minimum": 1,
23255
23220
  "maximum": 1e3
@@ -23322,7 +23287,7 @@ var MCP_TOOL_CATALOG = [
23322
23287
  "name": "maps_place_resume",
23323
23288
  "category": "maps",
23324
23289
  "title": "Resume Google Maps Place Run",
23325
- "description": "Explicitly resume a partial Maps place run using a fresh idempotency key. This may launch a new paid provider attempt and requires a new maximum credit authorization. Repeating the same key only reads its status.",
23290
+ "description": "Start another paid acquisition attempt for a partial or interrupted Maps place run after its previous billing is reconciled. Read maps_place_status first. Use a new resumeIdempotencyKey for this intended attempt; repeating the same key reads the existing run without starting or charging another attempt. The server reserves the declared maximum credits again before acquisition.",
23326
23291
  "inputSchema": {
23327
23292
  "type": "object",
23328
23293
  "properties": {
@@ -23347,9 +23312,9 @@ var MCP_TOOL_CATALOG = [
23347
23312
  },
23348
23313
  "annotations": {
23349
23314
  "title": "Resume Google Maps Place Run",
23350
- "readOnlyHint": true,
23315
+ "readOnlyHint": false,
23351
23316
  "destructiveHint": false,
23352
- "idempotentHint": false,
23317
+ "idempotentHint": true,
23353
23318
  "openWorldHint": true
23354
23319
  }
23355
23320
  },
@@ -23392,8 +23357,8 @@ var MCP_TOOL_CATALOG = [
23392
23357
  "title": "Google Maps Place Run Status",
23393
23358
  "readOnlyHint": true,
23394
23359
  "destructiveHint": false,
23395
- "idempotentHint": false,
23396
- "openWorldHint": true
23360
+ "idempotentHint": true,
23361
+ "openWorldHint": false
23397
23362
  }
23398
23363
  },
23399
23364
  {
@@ -23546,7 +23511,7 @@ var MCP_TOOL_CATALOG = [
23546
23511
  "name": "memory-capture",
23547
23512
  "category": "capture",
23548
23513
  "title": "Capture Governed Memory",
23549
- "description": "Strict normal-create path for durable memory. Before capture, list the complete tag vocabulary, call prepare-memory-write, run hybrid memory-search for related notes, and read the strongest link candidates. This tool refuses incomplete notes and invalid relationship-domain writes: projects need a project kind, tasks may be independent Inbox todos but must use a matched project when linked, deals need a known party, and draft emails need a pending approval state. It writes through memory-put, registers canonical tags, and verifies persisted content and props. Reserve memory-put for low-level migrations or deliberate edits.",
23514
+ "description": "Strict normal-create path for ordinary durable memory. Before capture, list the complete tag vocabulary, call prepare-memory-write, run hybrid memory-search for related notes, and read the strongest link candidates. Research People/Organizations and CRM People/Organizations are rejected and must use their specialized tools. Projects need a project kind, tasks may be independent Inbox todos but must use a matched project when linked, deals need a known party, and draft emails need pending approval. It writes through memory-put, registers canonical tags, and verifies persisted content and props.",
23550
23515
  "inputSchema": {
23551
23516
  "type": "object",
23552
23517
  "properties": {
@@ -23925,12 +23890,12 @@ var MCP_TOOL_CATALOG = [
23925
23890
  "name": "memory-put",
23926
23891
  "category": "memory",
23927
23892
  "title": "Put Memory Note",
23928
- "description": "Create or deliberately edit one note at a stable vault+path. On an existing note, first call memory-get, merge the requested change into its full body, and pass that complete body plus baseRevision: content is replace-all, while supplied props patch the stored props. A conflict returns the current body for reconciliation; never retry the stale full body unchanged. Use purpose-built tools instead of rewriting system-managed Agent Inbox, optimizer, or channel backing notes. For normal new People, Organizations, Deals, Projects, Tasks, or Communication records, use prepare-memory-write then memory-capture. For row-shaped datasets use table tools. Ordinary vaults are indexed and shareable; store real secrets only in a secure vault. Requires write scope.",
23893
+ "description": "Create or deliberately edit one ordinary note at a stable vault+path. On an existing note, first call memory-get, merge the requested change into its full body, and pass that complete body plus baseRevision: content is replace-all, while supplied props patch the stored props. A conflict returns the current body for reconciliation; never retry the stale full body unchanged. Use purpose-built tools instead of rewriting system-managed Agent Inbox, optimizer, or channel backing notes. Research People/Organizations and CRM People/Organizations cannot be written here; use their specialized research-* or crm-* tools. For new Deals, Projects, Tasks, or Communication records, use prepare-memory-write then memory-capture. For row-shaped datasets use table tools. Ordinary vaults are indexed and shareable; store real secrets only in a secure vault. Requires write scope.",
23929
23894
  "inputSchema": {
23930
23895
  "type": "object",
23931
23896
  "properties": {
23932
23897
  "vault": {
23933
- "description": "Vault to write to. Optional; defaults to the session active vault, then the first vault the caller is entitled to. On a default-provisioned account, pick the vault whose job matches the content (see the server instructions for the full 16-vault guide) rather than defaulting blindly \u2014 e.g. a lesson learned goes in Knowledge, the raw source it came from goes in Library, a broken feature goes in Issues, a named real-world initiative goes in Projects. Do not use this low-level tool to create ordinary People, Organizations, Deals, Projects, Tasks, or Communication records: first use prepare-memory-write then memory-capture so relationships and approval state are validated.",
23898
+ "description": "Vault to write to. Optional; defaults to the session active vault, then the first vault the caller is entitled to. Pick the vault whose job matches the content; use prepare-memory-write for the live vault contract or list-vaults for vault inventory rather than defaulting blindly \u2014 e.g. a lesson learned goes in Knowledge, the raw source it came from goes in Library, a broken feature goes in Issues, a named real-world initiative goes in Projects. Research People/Organizations and CRM People/Organizations require their specialized tools and are always rejected here. For Deals, Projects, Tasks, or Communication records, first use prepare-memory-write then memory-capture so relationships and approval state are validated.",
23934
23899
  "type": "string"
23935
23900
  },
23936
23901
  "path": {
@@ -24773,7 +24738,7 @@ var MCP_TOOL_CATALOG = [
24773
24738
  "name": "prepare-memory-write",
24774
24739
  "category": "capture",
24775
24740
  "title": "Prepare Memory Write",
24776
- "description": "Mandatory planning pass for a normal new memory. First inspect the complete tag vocabulary with list-memory-tags; then this pass routes the note, returns the live template and natural vault relationships, resolves proposed tags, and shortlists interlinks. For People, Organizations, Deals, Projects, Tasks, and Communication, it also returns relationship and approval guidance: search existing records before linking, but do not invent a project or party. A Task can remain an independent Inbox todo. Use hybrid memory-search (3 focused queries, 50 fused candidates, bounded graph expansion, rerank to 30 by default) and read strong related notes before capture. This is an explicit AI workflow directive, not a claim of persisted call-order enforcement.",
24741
+ "description": "Mandatory planning pass for ordinary non-entity memory. First inspect the complete tag vocabulary with list-memory-tags; then this pass routes the note, returns the live template and natural vault relationships, resolves proposed tags, and shortlists interlinks. Research People/Organizations and CRM People/Organizations are intentionally rejected here: use the matching research-*-capture or crm-*-upsert tool so generic writes cannot cross their authority boundary. Deals, Projects, Tasks, and Communication retain relationship and approval guidance. A Task can remain an independent Inbox todo. Use hybrid memory-search and read strong related notes before capture.",
24777
24742
  "inputSchema": {
24778
24743
  "type": "object",
24779
24744
  "properties": {
@@ -24881,17 +24846,17 @@ var MCP_TOOL_CATALOG = [
24881
24846
  "name": "provision-defaults",
24882
24847
  "category": "vaults",
24883
24848
  "title": "Provision Default Vaults",
24884
- "description": "Provision the standard 16-vault memory structure (Ideas, Examples and Inspirations, Knowledge, Library, People, Organizations, Deals, Communication, Calendar, Tasks, Projects, Issues, Improvement Log, Experiments, Sprint, Skills) for an identity. Idempotent \u2014 existing records are untouched and existing vault contracts are refreshed. Optionally issues a fresh API key entitled to all 16. Requires admin scope.",
24849
+ "description": "Provision the current default Memory vault structure for an identity. Requires admin scope. Repeated provisioning preserves existing records and refreshes vault contracts. With issueKey=true, every call issues a fresh key entitled to the default vaults; do not replay key issuance after an unknown outcome.",
24885
24850
  "inputSchema": {
24886
24851
  "type": "object",
24887
24852
  "properties": {
24888
24853
  "granteeIdentity": {
24889
24854
  "type": "string",
24890
24855
  "minLength": 1,
24891
- "description": "Identity that should OWN the 16 default vaults (e.g. an email or user id)."
24856
+ "description": "Identity that should own the current default vaults, such as an email or user id."
24892
24857
  },
24893
24858
  "issueKey": {
24894
- "description": "When true, also issue a new API key for the identity entitled to all 16 vaults and return its secret once. Default false.",
24859
+ "description": "When true, issue a fresh API key for the default vaults and return its secret once. Default false. Repeating this call issues another key.",
24895
24860
  "type": "boolean"
24896
24861
  },
24897
24862
  "plan": {
@@ -24914,7 +24879,7 @@ var MCP_TOOL_CATALOG = [
24914
24879
  "title": "Provision Default Vaults",
24915
24880
  "readOnlyHint": false,
24916
24881
  "destructiveHint": false,
24917
- "idempotentHint": true,
24882
+ "idempotentHint": false,
24918
24883
  "openWorldHint": false
24919
24884
  }
24920
24885
  },
@@ -25250,6 +25215,12 @@ var MCP_TOOL_CATALOG = [
25250
25215
  "inputSchema": {
25251
25216
  "type": "object",
25252
25217
  "properties": {
25218
+ "idempotencyKey": {
25219
+ "description": "One logical request identity. Retry identical inputs with the same key to replay or recover without repeating provider work. Omit for a fresh intent; use the key returned with the result or transport error for retries.",
25220
+ "type": "string",
25221
+ "minLength": 1,
25222
+ "maxLength": 512
25223
+ },
25253
25224
  "url": {
25254
25225
  "type": "string",
25255
25226
  "minLength": 1,
@@ -25283,6 +25254,12 @@ var MCP_TOOL_CATALOG = [
25283
25254
  "inputSchema": {
25284
25255
  "type": "object",
25285
25256
  "properties": {
25257
+ "idempotencyKey": {
25258
+ "description": "One logical request identity. Retry identical inputs with the same key to replay or recover without repeating provider work. Omit for a fresh intent; use the key returned with the result or transport error for retries.",
25259
+ "type": "string",
25260
+ "minLength": 1,
25261
+ "maxLength": 512
25262
+ },
25286
25263
  "topic": {
25287
25264
  "type": "string",
25288
25265
  "minLength": 1,
@@ -25527,7 +25504,7 @@ var MCP_TOOL_CATALOG = [
25527
25504
  "name": "research-organization-capture",
25528
25505
  "category": "research",
25529
25506
  "title": "Capture Research Organization",
25530
- "description": "Create or revision-check a sourced Research Organization. Requires evidence and rejects CRM\u2026",
25507
+ "description": "Create or revision-check a sourced Research Organization. Requires evidence and rejects CRM relationship, lifecycle, owner, consent, outreach, deal, and task state. This tool never creates a CRM account.",
25531
25508
  "inputSchema": {
25532
25509
  "type": "object",
25533
25510
  "properties": {
@@ -25539,7 +25516,7 @@ var MCP_TOOL_CATALOG = [
25539
25516
  "baseRevision": {
25540
25517
  "type": "integer",
25541
25518
  "minimum": 0,
25542
- "description": "Last revision read by the caller; supply it to reject an update if the record changed meanwhile."
25519
+ "description": "Use 0 to create a Research Organization; for an edit, supply the current positive revision read from research-organization-get."
25543
25520
  },
25544
25521
  "idempotencyKey": {
25545
25522
  "type": "string",
@@ -25568,7 +25545,7 @@ var MCP_TOOL_CATALOG = [
25568
25545
  "type": "string",
25569
25546
  "minLength": 1,
25570
25547
  "maxLength": 2e3,
25571
- "description": "Original source URL or opaque artifact reference preserved as image provenance."
25548
+ "description": "Source URL, retained artifact reference, or other source identifier supporting the Research evidence or field provenance."
25572
25549
  },
25573
25550
  "claim": {
25574
25551
  "type": "string",
@@ -25648,7 +25625,7 @@ var MCP_TOOL_CATALOG = [
25648
25625
  "type": "null"
25649
25626
  }
25650
25627
  ],
25651
- "description": "Original source URL or opaque artifact reference preserved as image provenance."
25628
+ "description": "Source URL, retained artifact reference, or other source identifier supporting the Research evidence or field provenance."
25652
25629
  },
25653
25630
  "observedAt": {
25654
25631
  "type": "string",
@@ -25699,7 +25676,7 @@ var MCP_TOOL_CATALOG = [
25699
25676
  "name": "research-organization-get",
25700
25677
  "category": "research",
25701
25678
  "title": "Get Research Organization",
25702
- "description": "Get one sourced Research Organization by stable entity ID with aliases, associations, and optional\u2026",
25679
+ "description": "Get one sourced Research Organization by stable entity ID with aliases, associations, and optional explicit CRM counterpart link. Linking never copies fields.",
25703
25680
  "inputSchema": {
25704
25681
  "type": "object",
25705
25682
  "properties": {
@@ -25727,7 +25704,7 @@ var MCP_TOOL_CATALOG = [
25727
25704
  "name": "research-organization-search",
25728
25705
  "category": "research",
25729
25706
  "title": "Search Research Organizations",
25730
- "description": "Search sourced Research Organizations studied as knowledge. Never infer an organization from an email\u2026",
25707
+ "description": "Search sourced Research Organizations studied as knowledge. Never infer an organization from an email domain and never use this for prospect/customer/vendor relationship operations; use crm-organization-search for managed accounts.",
25731
25708
  "inputSchema": {
25732
25709
  "type": "object",
25733
25710
  "properties": {
@@ -25744,7 +25721,7 @@ var MCP_TOOL_CATALOG = [
25744
25721
  "role": {
25745
25722
  "type": "string",
25746
25723
  "maxLength": 200,
25747
- "description": "Primary conversion or supporting observation role for this enabled mapping."
25724
+ "description": "Optional sourced Research role to match on knowledge subjects; this is not a CRM relationship type."
25748
25725
  },
25749
25726
  "cursor": {
25750
25727
  "type": "string",
@@ -25773,7 +25750,7 @@ var MCP_TOOL_CATALOG = [
25773
25750
  "name": "research-person-capture",
25774
25751
  "category": "research",
25775
25752
  "title": "Capture Research Person",
25776
- "description": "Create or revision-check an independently governed Research Person for sourced knowledge, including\u2026",
25753
+ "description": "Create or revision-check an independently governed Research Person for sourced knowledge, including historical figures. Requires evidence and rejects relationship type, lifecycle, owner, consent, outreach, deal, and task state. An email may be retained only as sourced evidence and never promotes the subject into CRM.",
25777
25754
  "inputSchema": {
25778
25755
  "type": "object",
25779
25756
  "properties": {
@@ -25785,7 +25762,7 @@ var MCP_TOOL_CATALOG = [
25785
25762
  "baseRevision": {
25786
25763
  "type": "integer",
25787
25764
  "minimum": 0,
25788
- "description": "Last revision read by the caller; supply it to reject an update if the record changed meanwhile."
25765
+ "description": "Use 0 to create a Research Person; for an edit, supply the current positive revision read from research-person-get."
25789
25766
  },
25790
25767
  "idempotencyKey": {
25791
25768
  "type": "string",
@@ -25814,7 +25791,7 @@ var MCP_TOOL_CATALOG = [
25814
25791
  "type": "string",
25815
25792
  "minLength": 1,
25816
25793
  "maxLength": 2e3,
25817
- "description": "Original source URL or opaque artifact reference preserved as image provenance."
25794
+ "description": "Source URL, retained artifact reference, or other source identifier supporting the Research evidence or field provenance."
25818
25795
  },
25819
25796
  "claim": {
25820
25797
  "type": "string",
@@ -25894,7 +25871,7 @@ var MCP_TOOL_CATALOG = [
25894
25871
  "type": "null"
25895
25872
  }
25896
25873
  ],
25897
- "description": "Original source URL or opaque artifact reference preserved as image provenance."
25874
+ "description": "Source URL, retained artifact reference, or other source identifier supporting the Research evidence or field provenance."
25898
25875
  },
25899
25876
  "observedAt": {
25900
25877
  "type": "string",
@@ -25945,7 +25922,7 @@ var MCP_TOOL_CATALOG = [
25945
25922
  "name": "research-person-get",
25946
25923
  "category": "research",
25947
25924
  "title": "Get Research Person",
25948
- "description": "Get one sourced Research Person by stable entity ID with aliases, associations, and an optional\u2026",
25925
+ "description": "Get one sourced Research Person by stable entity ID with aliases, associations, and an optional explicit CRM counterpart link. This does not expose CRM operational state or copy counterpart fields.",
25949
25926
  "inputSchema": {
25950
25927
  "type": "object",
25951
25928
  "properties": {
@@ -25973,7 +25950,7 @@ var MCP_TOOL_CATALOG = [
25973
25950
  "name": "research-person-search",
25974
25951
  "category": "research",
25975
25952
  "title": "Search Research People",
25976
- "description": "Search sourced Research People, including historical figures and living subjects studied as knowledge\u2026",
25953
+ "description": "Search sourced Research People, including historical figures and living subjects studied as knowledge. Never use this to find or manage contacts, prospects, customers, friends, coworkers, outreach, deals, or tasks; use crm-person-search for managed relationships. Results are owner-scoped, cursor-paged, and deterministically ordered.",
25977
25954
  "inputSchema": {
25978
25955
  "type": "object",
25979
25956
  "properties": {
@@ -25990,7 +25967,7 @@ var MCP_TOOL_CATALOG = [
25990
25967
  "role": {
25991
25968
  "type": "string",
25992
25969
  "maxLength": 200,
25993
- "description": "Primary conversion or supporting observation role for this enabled mapping."
25970
+ "description": "Optional sourced Research role to match on knowledge subjects; this is not a CRM relationship type."
25994
25971
  },
25995
25972
  "cursor": {
25996
25973
  "type": "string",
@@ -26075,7 +26052,7 @@ var MCP_TOOL_CATALOG = [
26075
26052
  "name": "resolve-memory-tags",
26076
26053
  "category": "tags",
26077
26054
  "title": "Resolve Memory Tags",
26078
- "description": "Resolve proposed concepts against the live tag vocabulary. Always inspect the complete vocabulary with list-memory-tags first. Returns reuse, review, create, or omit: spelling and singular/plural variants resolve to the canonical tag silently, while close and semantically related tags come back as ranked candidates for you to choose from. A new tag is appropriate only when no equivalent exists and the concept is central and reusable.",
26055
+ "description": "Resolve proposed concepts against the live tag vocabulary. Inspect the complete vocabulary with list-memory-tags first. Returns reuse, review, create, or omit: spelling variants reuse canonical tags, while related tags return ranked candidates for review. With accept and write permission, saves the proposed spelling as an alias of the selected canonical tag. Create a new tag only when no equivalent exists and the concept is central and reusable.",
26079
26056
  "inputSchema": {
26080
26057
  "type": "object",
26081
26058
  "properties": {
@@ -26128,7 +26105,7 @@ var MCP_TOOL_CATALOG = [
26128
26105
  },
26129
26106
  "annotations": {
26130
26107
  "title": "Resolve Memory Tags",
26131
- "readOnlyHint": true,
26108
+ "readOnlyHint": false,
26132
26109
  "destructiveHint": false,
26133
26110
  "idempotentHint": true,
26134
26111
  "openWorldHint": false
@@ -26323,7 +26300,7 @@ var MCP_TOOL_CATALOG = [
26323
26300
  "name": "search_serp",
26324
26301
  "category": "search",
26325
26302
  "title": "Google SERP Lookup",
26326
- "description": "Search Google. Light mode returns organic listings. Set mode:full on an unfiltered one-page search to request available same-page local-pack, forum, video, AI, entity, and PAA-preview features; includeLocalPack alone does not enable local-pack extraction. Feature status shows presence and completeness. One page is the default. Set pages:2 only when the user asks for two pages. Set recency:week or recency:month for Google's past-week or past-month filter. Filtered searches use a managed browser and return organic results only at 35 Credits per delivered page (70 for two). Unfiltered searches use browser as final backup. Browser/two-page results mark rich features unsupported. If page 2 fails, available page 1 is marked partial and billed for one page. Unfiltered light costs 20 Credits per delivered page, or 35 if a backup supplies it; one-page full costs 35; unfiltered two-page full costs 40 for organic results. Full does not open result sites, expand PAA, or open Maps profiles. Reuse the same idempotencyKey after an uncertain response. A saved serpIdentity keeps its 60-Credit search rate and cannot be combined with full mode. Call credits_info for current pricing and balance.",
26303
+ "description": "Search Google. Light mode returns organic listings. Set mode:full on an unfiltered one-page search to request available same-page local-pack, forum, video, AI, entity, and PAA-preview features; includeLocalPack alone does not enable local-pack extraction. Feature status shows presence and completeness. One page is the default. Set pages:2 only when the user asks for two pages. Set recency:week or recency:month for Google's past-week or past-month filter. Filtered searches use a managed browser and return organic results only at 35 Credits per delivered page (70 for two). Unfiltered light tries twice, then an API fallback. Browser/two-page results mark rich features unsupported. If page 2 fails, available page 1 is marked partial and billed for one page. Unfiltered light costs 20 Credits per delivered page, or 35 if a backup supplies it; one-page full costs 35; unfiltered two-page full costs 40 for organic results. Full does not open result sites, expand PAA, or open Maps profiles. Reuse the same idempotencyKey after an uncertain response. A saved serpIdentity keeps its 60-Credit search rate and cannot be combined with full mode. Call credits_info for current pricing and balance.",
26327
26304
  "inputSchema": {
26328
26305
  "type": "object",
26329
26306
  "properties": {
@@ -27480,8 +27457,7 @@ var MCP_TOOL_CATALOG = [
27480
27457
  "showSourceRail",
27481
27458
  "showGeneratedAt"
27482
27459
  ],
27483
- "additionalProperties": false,
27484
- "description": "Validated renderer configuration for the new immutable template version; arbitrary code is rejected."
27460
+ "additionalProperties": false
27485
27461
  },
27486
27462
  {
27487
27463
  "type": "object",
@@ -27510,35 +27486,35 @@ var MCP_TOOL_CATALOG = [
27510
27486
  "properties": {
27511
27487
  "navigation": {
27512
27488
  "type": "boolean",
27513
- "description": "Validated navigation labels and destinations for the rendered site."
27489
+ "description": "Whether the renderer includes the navigation section."
27514
27490
  },
27515
27491
  "socialLinks": {
27516
27492
  "type": "boolean",
27517
- "description": "Curated public social profile links for the publication identity."
27493
+ "description": "Whether the renderer includes social profile links."
27518
27494
  },
27519
27495
  "authority": {
27520
27496
  "type": "boolean",
27521
- "description": "Source authority or ownership context supporting this content."
27497
+ "description": "Whether the renderer includes the authority section."
27522
27498
  },
27523
27499
  "consultation": {
27524
27500
  "type": "boolean",
27525
- "description": "Consultation-call presentation and link settings."
27501
+ "description": "Whether the renderer includes the consultation call-to-action."
27526
27502
  },
27527
27503
  "learning": {
27528
27504
  "type": "boolean",
27529
- "description": "Learning-section configuration for the editorial renderer."
27505
+ "description": "Whether the renderer includes the learning section."
27530
27506
  },
27531
27507
  "services": {
27532
27508
  "type": "boolean",
27533
- "description": "Source-backed services associated with the business listing."
27509
+ "description": "Whether the renderer includes the services section."
27534
27510
  },
27535
27511
  "proof": {
27536
27512
  "type": "boolean",
27537
- "description": "Proof-section content and evidence references."
27513
+ "description": "Whether the renderer includes the proof section."
27538
27514
  },
27539
27515
  "finalCta": {
27540
27516
  "type": "boolean",
27541
- "description": "Final call-to-action content shown after the authored collection."
27517
+ "description": "Whether the renderer includes the final call-to-action."
27542
27518
  }
27543
27519
  },
27544
27520
  "required": [
@@ -27560,8 +27536,7 @@ var MCP_TOOL_CATALOG = [
27560
27536
  "showGeneratedAt",
27561
27537
  "featureFlags"
27562
27538
  ],
27563
- "additionalProperties": false,
27564
- "description": "Validated renderer configuration for the new immutable template version; arbitrary code is rejected."
27539
+ "additionalProperties": false
27565
27540
  },
27566
27541
  {
27567
27542
  "type": "object",
@@ -27633,7 +27608,7 @@ var MCP_TOOL_CATALOG = [
27633
27608
  "modern-sans",
27634
27609
  "humanist-sans"
27635
27610
  ],
27636
- "description": "Registered self-contained display-font family selected for prominent headings."
27611
+ "description": "Registered self-contained body-font family selected for article and paragraph text."
27637
27612
  }
27638
27613
  },
27639
27614
  "required": [
@@ -27647,35 +27622,35 @@ var MCP_TOOL_CATALOG = [
27647
27622
  "properties": {
27648
27623
  "navigation": {
27649
27624
  "type": "boolean",
27650
- "description": "Validated navigation labels and destinations for the rendered site."
27625
+ "description": "Whether the renderer includes the navigation section."
27651
27626
  },
27652
27627
  "socialLinks": {
27653
27628
  "type": "boolean",
27654
- "description": "Curated public social profile links for the publication identity."
27629
+ "description": "Whether the renderer includes social profile links."
27655
27630
  },
27656
27631
  "authority": {
27657
27632
  "type": "boolean",
27658
- "description": "Source authority or ownership context supporting this content."
27633
+ "description": "Whether the renderer includes the authority section."
27659
27634
  },
27660
27635
  "consultation": {
27661
27636
  "type": "boolean",
27662
- "description": "Consultation-call presentation and link settings."
27637
+ "description": "Whether the renderer includes the consultation call-to-action."
27663
27638
  },
27664
27639
  "learning": {
27665
27640
  "type": "boolean",
27666
- "description": "Learning-section configuration for the editorial renderer."
27641
+ "description": "Whether the renderer includes the learning section."
27667
27642
  },
27668
27643
  "services": {
27669
27644
  "type": "boolean",
27670
- "description": "Source-backed services associated with the business listing."
27645
+ "description": "Whether the renderer includes the services section."
27671
27646
  },
27672
27647
  "proof": {
27673
27648
  "type": "boolean",
27674
- "description": "Proof-section content and evidence references."
27649
+ "description": "Whether the renderer includes the proof section."
27675
27650
  },
27676
27651
  "finalCta": {
27677
27652
  "type": "boolean",
27678
- "description": "Final call-to-action content shown after the authored collection."
27653
+ "description": "Whether the renderer includes the final call-to-action."
27679
27654
  }
27680
27655
  },
27681
27656
  "required": [
@@ -27697,8 +27672,7 @@ var MCP_TOOL_CATALOG = [
27697
27672
  "showGeneratedAt",
27698
27673
  "featureFlags"
27699
27674
  ],
27700
- "additionalProperties": false,
27701
- "description": "Validated renderer configuration for the new immutable template version; arbitrary code is rejected."
27675
+ "additionalProperties": false
27702
27676
  },
27703
27677
  {
27704
27678
  "type": "object",
@@ -27731,35 +27705,35 @@ var MCP_TOOL_CATALOG = [
27731
27705
  "properties": {
27732
27706
  "breakingTicker": {
27733
27707
  "type": "boolean",
27734
- "description": "Optional short breaking-news ticker shown by the renderer."
27708
+ "description": "Whether the renderer includes the breaking-news ticker."
27735
27709
  },
27736
27710
  "navigation": {
27737
27711
  "type": "boolean",
27738
- "description": "Validated navigation labels and destinations for the rendered site."
27712
+ "description": "Whether the renderer includes the navigation section."
27739
27713
  },
27740
27714
  "leadGrid": {
27741
27715
  "type": "boolean",
27742
- "description": "Lead-story grid configuration for the editorial renderer."
27716
+ "description": "Whether the renderer includes the lead-story grid."
27743
27717
  },
27744
27718
  "latestNews": {
27745
27719
  "type": "boolean",
27746
- "description": "Latest-news section configuration for the editorial renderer."
27720
+ "description": "Whether the renderer includes the latest-news section."
27747
27721
  },
27748
27722
  "categorySections": {
27749
27723
  "type": "boolean",
27750
- "description": "Ordered category sections and their assigned article references."
27724
+ "description": "Whether the renderer includes article sections grouped by category."
27751
27725
  },
27752
27726
  "newsletter": {
27753
27727
  "type": "boolean",
27754
- "description": "Newsletter-callout presentation and subscription link settings."
27728
+ "description": "Whether the renderer includes the newsletter call-to-action."
27755
27729
  },
27756
27730
  "pressRoom": {
27757
27731
  "type": "boolean",
27758
- "description": "Press-room section configuration for the editorial renderer."
27732
+ "description": "Whether the renderer includes the press-room section."
27759
27733
  },
27760
27734
  "trustFooter": {
27761
27735
  "type": "boolean",
27762
- "description": "Trust and provenance footer configuration for the rendered site."
27736
+ "description": "Whether the renderer includes the trust and provenance footer."
27763
27737
  }
27764
27738
  },
27765
27739
  "required": [
@@ -27782,8 +27756,7 @@ var MCP_TOOL_CATALOG = [
27782
27756
  "showBylines",
27783
27757
  "featureFlags"
27784
27758
  ],
27785
- "additionalProperties": false,
27786
- "description": "Validated renderer configuration for the new immutable template version; arbitrary code is rejected."
27759
+ "additionalProperties": false
27787
27760
  },
27788
27761
  {
27789
27762
  "type": "object",
@@ -27857,8 +27830,7 @@ var MCP_TOOL_CATALOG = [
27857
27830
  "showGeneratedAt",
27858
27831
  "featureFlags"
27859
27832
  ],
27860
- "additionalProperties": false,
27861
- "description": "Validated renderer configuration for the new immutable template version; arbitrary code is rejected."
27833
+ "additionalProperties": false
27862
27834
  }
27863
27835
  ]
27864
27836
  },
@@ -28412,14 +28384,14 @@ var MCP_TOOL_CATALOG = [
28412
28384
  "name": "video_frame_analysis",
28413
28385
  "category": "video",
28414
28386
  "title": "Video Breakdown (frame-by-frame + transcript)",
28415
- "description": "Produce a deep frame-by-frame + transcript breakdown of a video \u2014 pacing, hook, visual style, and how to replicate it. Accepts a YouTube, Facebook, Instagram, TikTok, or Vimeo URL directly (downloaded for you), or a direct video file URL (.mp4/.webm/.mov). Costs $1 per 120 frames requested (max 480 = $4; refunded down if the video can't use them; refunded fully on failure): returns a runId immediately; poll video_frame_analysis_status until done. Videos up to 30 minutes.",
28387
+ "description": "Analyze a video's visuals and transcript: pacing, hook, style, and how to replicate it. For spoken text only, use the platform transcription tool. Accepts YouTube, Facebook, Instagram, TikTok, or Vimeo URLs, or direct video files (.mp4/.webm/.mov), up to 60 minutes. Reserves 6667 Credits per requested 120-frame tier, up to 480 frames. Unused frame tiers are refunded; a failed run's frame charge is refunded. Analysis-model usage is billed separately, including usage before a failure. Returns a runId immediately; poll video_frame_analysis_status until done or failed for the report and settlement. Call credits_info for current rates and balance.",
28416
28388
  "inputSchema": {
28417
28389
  "type": "object",
28418
28390
  "properties": {
28419
28391
  "sourceUrl": {
28420
28392
  "type": "string",
28421
28393
  "minLength": 1,
28422
- "description": "A YouTube, Facebook, Instagram, TikTok, or Vimeo URL (downloaded automatically), or a direct video file URL (.mp4/.webm/.mov). Videos up to 30 minutes are supported."
28394
+ "description": "A YouTube, Facebook, Instagram, TikTok, or Vimeo URL (downloaded automatically), or a direct video file URL (.mp4/.webm/.mov). Videos up to 60 minutes are supported."
28423
28395
  },
28424
28396
  "intervalS": {
28425
28397
  "description": "Preferred seconds between sampled frames (1-30, default 2). Automatically widened for long videos so the whole duration is covered within the frame budget.",
@@ -28428,7 +28400,7 @@ var MCP_TOOL_CATALOG = [
28428
28400
  "maximum": 30
28429
28401
  },
28430
28402
  "maxFrames": {
28431
- "description": "Max frames analyzed (<=480, default 120). $1 per 120 frames requested \u2014 120=$1 \u2026 480=$4 \u2014 automatically refunded down if the video cannot use them (minimum 1s between frames). Frames are spread evenly across the whole video.",
28403
+ "description": "Max frames analyzed (<=480, default 120). Reserves the number of 120-frame tiers requested; unused tiers are refunded. Analysis-model usage is billed separately. Frames are spread evenly across the whole video, with at least 1 second between frames.",
28432
28404
  "type": "integer",
28433
28405
  "minimum": 1,
28434
28406
  "maximum": 480
@@ -28465,7 +28437,7 @@ var MCP_TOOL_CATALOG = [
28465
28437
  "name": "video_frame_analysis_status",
28466
28438
  "category": "video",
28467
28439
  "title": "Video Breakdown Status",
28468
- "description": 'Check progress of a video breakdown started with video_frame_analysis, using its runId. Free to call. When status is "done" it returns the full report and vault path; stop polling on "done" or "failed". Reports the billed tier reconciliation when done.',
28440
+ "description": "Check the original runId returned by video_frame_analysis without starting another analysis. Returns progress and, when done, the full report and Memory path. Terminal checks reconcile frame-tier refunds and settle incurred analysis-model usage; a failed run can still have model-usage charges. Repeated checks do not duplicate settlement. Stop polling on done or failed.",
28469
28441
  "inputSchema": {
28470
28442
  "type": "object",
28471
28443
  "properties": {
@@ -28482,7 +28454,7 @@ var MCP_TOOL_CATALOG = [
28482
28454
  },
28483
28455
  "annotations": {
28484
28456
  "title": "Video Breakdown Status",
28485
- "readOnlyHint": true,
28457
+ "readOnlyHint": false,
28486
28458
  "destructiveHint": false,
28487
28459
  "idempotentHint": true,
28488
28460
  "openWorldHint": false
@@ -28492,14 +28464,14 @@ var MCP_TOOL_CATALOG = [
28492
28464
  "name": "video-analyze-start",
28493
28465
  "category": "video",
28494
28466
  "title": "Start Video Breakdown",
28495
- "description": "Start a deep async breakdown of a video: samples frames, transcribes audio, and runs parallel analyses (summary, pacing, WPM, topic outline, key points, hook analysis, visual style, replication recipe) into one saved report. Returns a runId immediately \u2014 poll video-analyze-status. Accepts a YouTube, Facebook, Instagram, TikTok, or Vimeo URL directly (downloaded for you), or a direct video file URL (.mp4/.webm/.mov). Videos up to 1 hour.",
28467
+ "description": "Queue a video breakdown directly in Memory and save its report to a writable vault. Prefer video_frame_analysis for standard Scraper analysis with published credit pricing. Accepts supported social video or direct file URLs, up to 60 minutes; samples frames, transcribes audio and analyzes pacing, topics, hooks and visual style. Each call creates a new run. Preserve the returned runId and poll video-analyze-status rather than starting replacement work after an unknown outcome.",
28496
28468
  "inputSchema": {
28497
28469
  "type": "object",
28498
28470
  "properties": {
28499
28471
  "sourceUrl": {
28500
28472
  "type": "string",
28501
28473
  "format": "uri",
28502
- "description": "A YouTube, Facebook, Instagram, TikTok, or Vimeo URL (downloaded automatically), or a direct video file URL (.mp4/.webm/.mov/.gif)."
28474
+ "description": "A YouTube, Facebook, Instagram, TikTok, or Vimeo URL, or a direct video file URL (.mp4/.webm/.mov/.gif). Maximum duration: 60 minutes."
28503
28475
  },
28504
28476
  "intervalS": {
28505
28477
  "description": "Preferred seconds between sampled frames (1-30). Default 2. For long videos the interval is automatically widened so the whole video is covered within the frame budget. Lower = denser sampling where the video is short enough to allow it.",
@@ -28544,7 +28516,7 @@ var MCP_TOOL_CATALOG = [
28544
28516
  "name": "video-analyze-status",
28545
28517
  "category": "video",
28546
28518
  "title": "Video Breakdown Status",
28547
- "description": "Check the status of a video breakdown started with video-analyze-start. Returns phase and frame progress; when done, returns the saved report's vault path and markdown. Poll every few seconds until done or failed.",
28519
+ "description": "Inspect an existing Memory video breakdown using its runId. Returns phase, frame progress and reported analysis-model costUsd; when done, returns the saved report path and Markdown. Can mark a stale run as failed; does not start new analysis. For runs started with video_frame_analysis, use video_frame_analysis_status to reconcile the original Scraper charges and refunds.",
28548
28520
  "inputSchema": {
28549
28521
  "type": "object",
28550
28522
  "properties": {
@@ -28560,7 +28532,7 @@ var MCP_TOOL_CATALOG = [
28560
28532
  },
28561
28533
  "annotations": {
28562
28534
  "title": "Video Breakdown Status",
28563
- "readOnlyHint": true,
28535
+ "readOnlyHint": false,
28564
28536
  "destructiveHint": false,
28565
28537
  "idempotentHint": true,
28566
28538
  "openWorldHint": false
@@ -28842,7 +28814,7 @@ var MCP_TOOL_CATALOG = [
28842
28814
  "name": "youtube_transcribe",
28843
28815
  "category": "youtube",
28844
28816
  "title": "YouTube Transcription",
28845
- "description": "Fetch and transcribe captions from a YouTube video. Pass videoId from youtube_harvest, or a url the user pasted. Returns full transcript, timestamped chunks, and word count.",
28817
+ "description": "Get a YouTube video's full transcript, timestamped chunks, and word count. Tries available captions first, then speech-to-text from resolved audio when captions cannot be retrieved and audio retrieval is available. Pass a videoId returned by youtube_harvest or the user's URL; set language for non-English speech. Costs 200 Credits plus 2 per rounded-up minute of video whichever transcription path succeeds. The duration hold is reconciled after completion and refunded on failure. Call credits_info for current rates and balance.",
28846
28818
  "inputSchema": {
28847
28819
  "type": "object",
28848
28820
  "properties": {
@@ -29178,6 +29150,15 @@ async function run(fn) {
29178
29150
  process.exitCode = 1;
29179
29151
  }
29180
29152
  }
29153
+ function observedInstallChannel(executablePath = process.argv[1]) {
29154
+ if (!executablePath) return void 0;
29155
+ let resolvedPath = executablePath;
29156
+ try {
29157
+ resolvedPath = realpathSync(executablePath);
29158
+ } catch {
29159
+ }
29160
+ return [executablePath, resolvedPath].some((path) => path.replace(/\\/g, "/").includes("/_npx/")) ? "npx" : void 0;
29161
+ }
29181
29162
  function createProgram(fetchImpl = globalThis.fetch) {
29182
29163
  function resolveApiKey(cmd) {
29183
29164
  const opts = cmd.optsWithGlobals();
@@ -29188,11 +29169,36 @@ function createProgram(fetchImpl = globalThis.fetch) {
29188
29169
  }
29189
29170
  return key;
29190
29171
  }
29191
- function client(cmd) {
29192
- return new ScraperClient({ apiKey: resolveApiKey(cmd), fetch: fetchImpl });
29172
+ function client(cmd, surface = "rest") {
29173
+ const opts = cmd.optsWithGlobals();
29174
+ if (opts.baseUrl !== void 0) {
29175
+ let baseUrl;
29176
+ try {
29177
+ baseUrl = new URL(opts.baseUrl);
29178
+ } catch {
29179
+ throw new Error("--base-url must be an HTTP(S) URL without credentials, query or fragment");
29180
+ }
29181
+ if (!["http:", "https:"].includes(baseUrl.protocol) || baseUrl.username || baseUrl.password || baseUrl.search || baseUrl.hash) {
29182
+ throw new Error("--base-url must be an HTTP(S) URL without credentials, query or fragment");
29183
+ }
29184
+ }
29185
+ if (opts.aiModel !== void 0 && !/^[a-zA-Z0-9][a-zA-Z0-9._:/-]{0,79}$/.test(opts.aiModel)) {
29186
+ throw new Error("--ai-model must be a model identifier of 1\u201380 letters, digits, dots, underscores, colons, slashes or hyphens, starting with a letter or digit");
29187
+ }
29188
+ return new ScraperClient({
29189
+ apiKey: resolveApiKey(cmd),
29190
+ baseUrl: opts.baseUrl?.replace(/\/+$/, ""),
29191
+ fetch: fetchImpl,
29192
+ clientAttribution: {
29193
+ surface,
29194
+ installChannel: opts.installChannel ?? observedInstallChannel(),
29195
+ aiClient: opts.aiClient,
29196
+ aiModel: opts.aiModel
29197
+ }
29198
+ });
29193
29199
  }
29194
29200
  const program = new Command();
29195
- program.name("mcpscraper").description(`CLI for all ${MCP_TOOL_COUNT} mcpscraper.dev MCP tools plus ergonomic shortcuts`).version(CLI_VERSION).option("--api-key <key>", "mcpscraper.dev API key (or set MCPSCRAPER_API_KEY)");
29201
+ program.name("mcpscraper").description(`CLI for all ${MCP_TOOL_COUNT} mcpscraper.dev MCP tools plus ergonomic shortcuts`).version(CLI_VERSION).option("--api-key <key>", "mcpscraper.dev API key (or set MCPSCRAPER_API_KEY)").addOption(new Option("--base-url <url>", "API base URL for a selected deployment (or MCPSCRAPER_BASE_URL)").env("MCPSCRAPER_BASE_URL")).addOption(new Option("--install-channel <channel>", "declared installation channel (or MCP_SCRAPER_INSTALL_CHANNEL)").choices(["npx", "npm", "source", "mcpb"]).env("MCP_SCRAPER_INSTALL_CHANNEL")).addOption(new Option("--ai-client <client>", "declared AI client (or MCP_SCRAPER_AI_CLIENT)").choices(["claude", "claude-desktop", "claude-code", "chatgpt", "codex", "cursor", "gemini", "other"]).env("MCP_SCRAPER_AI_CLIENT")).addOption(new Option("--ai-model <model>", "declared model identifier (or MCP_SCRAPER_AI_MODEL)").env("MCP_SCRAPER_AI_MODEL"));
29196
29202
  program.command("search <query>").description("Run a Google SERP search").option("--location <location>", "geographic location to search from").option("--json", "print the complete JSON result (inline binary data is saved and replaced with file metadata)").action(async (query, opts, cmd) => {
29197
29203
  await run(async () => {
29198
29204
  const result = await client(cmd).searchSerp({
@@ -29375,7 +29381,7 @@ ${catalog.length}/${MCP_TOOL_COUNT} tools`);
29375
29381
  if (!tool) throw new Error(`Unknown tool "${name}". Run "mcpscraper tools list" for all ${MCP_TOOL_COUNT} names.`);
29376
29382
  console.log(JSON.stringify(tool, null, 2));
29377
29383
  });
29378
- tools.command("call <name>").description(`Call any of the ${MCP_TOOL_COUNT} MCP tools by exact wire name`).option("--args <json>", "tool arguments as a JSON object", "{}").option("--yes", "confirm a tool marked destructive").option("--media-dir <path>", "directory for inline MCP images (defaults to ~/Downloads/mcp-scraper)").option("--json", "print raw JSON").action(async (name, opts, cmd) => {
29384
+ tools.command("call <name>").description(`Call any of the ${MCP_TOOL_COUNT} MCP tools by exact wire name`).option("--args <json>", "tool arguments as a JSON object", "{}").option("--yes", "confirm a tool marked destructive").option("--media-dir <path>", "directory for inline MCP images (defaults to ~/Downloads/mcp-scraper)").option("--json", "print raw JSON").option("--raw-result", "preserve the MCP envelope, metadata and resource links; inline binary becomes saved-file metadata").action(async (name, opts, cmd) => {
29379
29385
  await run(async () => {
29380
29386
  const tool = MCP_TOOL_CATALOG.find((entry) => entry.name === name);
29381
29387
  if (!tool) throw new Error(`Unknown tool "${name}". Run "mcpscraper tools list" for all ${MCP_TOOL_COUNT} names.`);
@@ -29383,9 +29389,10 @@ ${catalog.length}/${MCP_TOOL_COUNT} tools`);
29383
29389
  if (annotations.destructiveHint && !opts.yes) {
29384
29390
  throw new Error(`Tool "${name}" is marked destructive. Re-run with --yes to confirm.`);
29385
29391
  }
29386
- const rawResult = await client(cmd).tools.callToolResult(name, parseToolArgs(opts.args));
29387
- const result = printableToolResult(saveToolMedia(name, rawResult, opts.mediaDir));
29388
- if (opts.json || typeof result !== "string") console.log(JSON.stringify(result, null, 2));
29392
+ const rawResult = await client(cmd, "mcp-http").tools.callToolResult(name, parseToolArgs(opts.args));
29393
+ const savedResult = saveToolMedia(name, rawResult, opts.mediaDir);
29394
+ const result = opts.rawResult ? savedResult : printableToolResult(savedResult);
29395
+ if (opts.json || opts.rawResult || typeof result !== "string") console.log(JSON.stringify(result, null, 2));
29389
29396
  else console.log(result);
29390
29397
  });
29391
29398
  });
@@ -29405,5 +29412,6 @@ if (isMain) {
29405
29412
  }
29406
29413
  export {
29407
29414
  createProgram,
29408
- isMainModule
29415
+ isMainModule,
29416
+ observedInstallChannel
29409
29417
  };