@withpica/mcp-sdk 3.3.1 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -11,6 +11,27 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
11
11
 
12
12
  ## [Unreleased]
13
13
 
14
+ ## [3.5.0] - 2026-07-07
15
+
16
+ ### Added
17
+
18
+ - `catalogStats()` accepts an optional `{ entity, group_by }` argument and
19
+ serialises it to the query string, powering the Oracle aggregation on
20
+ `pica_catalog_stats` (one-dimension breakdowns + entity totals). Overloaded so
21
+ a no-arg call still returns the precise `CatalogStats` envelope type; a call
22
+ with params returns the widened breakdown shape. Backward-compatible — the
23
+ no-arg request is byte-identical to before.
24
+
25
+ ## [3.4.0] - 2026-07-06
26
+
27
+ ### Changed
28
+
29
+ - `recordings.search()` now delegates a text `query` to the server-side unified
30
+ search endpoint (`GET /admin/recordings/search`) instead of fetching up to 200
31
+ rows and filtering client-side on `title`/`isrc` only. Recordings are now
32
+ findable by `artist_name` (and without the 200-row ceiling). The no-query path
33
+ (structured/score filters) is unchanged.
34
+
14
35
  ## [3.3.1] - 2026-07-04
15
36
 
16
37
  ### Removed
package/dist/index.d.ts CHANGED
@@ -854,6 +854,40 @@ declare class WorksResource extends BaseResource {
854
854
  sort?: "completeness_score:asc" | "completeness_score:desc" | "missing_field_count:asc" | "missing_field_count:desc" | "streaming_activity:asc" | "streaming_activity:desc";
855
855
  /** Filter to works registered with a collection society (case-insensitive code, e.g. 'ASCAP', 'PRS', 'GEMA'). */
856
856
  society_code?: string;
857
+ /** Filter by work type (song, instrumental, library, demo, sample). */
858
+ work_type?: string;
859
+ /** Filter by work status (demo, unreleased, released, pitched, placed, archived). */
860
+ work_status?: string;
861
+ /** Filter to works tagged with this genre (case-sensitive array-contains). */
862
+ genre?: string;
863
+ /** Filter to works whose primary recording carries this mood tag. */
864
+ mood?: string;
865
+ /** Filter to works whose primary recording tempo is >= this BPM. */
866
+ tempo_min?: number;
867
+ /** Filter to works whose primary recording tempo is <= this BPM. */
868
+ tempo_max?: number;
869
+ /** Exact primary-artist name match. */
870
+ primary_artist?: string;
871
+ /** Exact primary-artist name match (alias of primary_artist). */
872
+ artist?: string;
873
+ /** Filter by derived label (primary recording label, else primary release parent_label). */
874
+ label?: string;
875
+ /** Filter to works available (true) / not available (false) for licensing. */
876
+ available_for_licensing?: boolean;
877
+ /** Filter by the primary release's format (single, ep, album, compilation). */
878
+ release_format?: string;
879
+ /** Filter to featured (true) / non-featured (false) works. */
880
+ is_featured?: boolean;
881
+ /** Filter by directory-published state. */
882
+ published?: boolean;
883
+ /** Only works added/composed on or after this ISO date (YYYY-MM-DD). */
884
+ created_from?: string;
885
+ /** Only works added/composed on or before this ISO date (YYYY-MM-DD). */
886
+ created_to?: string;
887
+ /** Filter to works that have (true) or lack (false) an ISWC. */
888
+ has_iswc?: boolean;
889
+ /** Filter to works that have (true) or lack (false) a publisher_name. */
890
+ has_publisher?: boolean;
857
891
  }): Promise<PaginatedResult<Work>>;
858
892
  get(id: string): Promise<Work>;
859
893
  create(data: Partial<Work>): Promise<Work>;
@@ -960,6 +994,14 @@ declare class PeopleResource extends BaseResource {
960
994
  record_kind?: "individual" | "placeholder" | "artefact";
961
995
  /** Filter by outreach readiness. */
962
996
  outreach_state?: "ready" | "needs_email" | "needs_disambiguation" | "not_a_target" | "do_not_contact" | "previously_declined";
997
+ /** Filter to people who have (true) / lack (false) an email address. */
998
+ has_email?: boolean;
999
+ /** Filter to people who have (true) / lack (false) a phone number. */
1000
+ has_phone?: boolean;
1001
+ /** Filter to people holding ANY of these roles (array-overlap). */
1002
+ roles?: string[];
1003
+ /** Filter to people carrying ANY of these tags (array-overlap). */
1004
+ tags?: string[];
963
1005
  }): Promise<PaginatedResult<Person>>;
964
1006
  get(id: string): Promise<Person>;
965
1007
  create(data: Partial<Person>): Promise<Person>;
@@ -1273,6 +1315,18 @@ declare class AgreementsResource extends BaseResource {
1273
1315
  * the hood.
1274
1316
  */
1275
1317
  awaiting_signature?: boolean;
1318
+ /** Agreements with start_date on/after this ISO date (YYYY-MM-DD). */
1319
+ start_date_from?: string;
1320
+ /** Agreements with start_date on/before this ISO date. */
1321
+ start_date_to?: string;
1322
+ /** Agreements with end_date on/after this ISO date. */
1323
+ end_date_from?: string;
1324
+ /** Agreements with end_date on/before this ISO date. */
1325
+ end_date_to?: string;
1326
+ /** Active agreements whose end_date falls within N days from today. */
1327
+ expiring_within_days?: number;
1328
+ /** true → only agreements that have an end_date; false → only open-ended. */
1329
+ has_end_date?: boolean;
1276
1330
  limit?: number;
1277
1331
  offset?: number;
1278
1332
  }): Promise<Agreement[]>;
@@ -1467,8 +1521,17 @@ declare class RecordingsResource extends BaseResource {
1467
1521
  limit?: number;
1468
1522
  }): Promise<Recording[]>;
1469
1523
  /**
1470
- * Search recordings. The recordings API doesn't support text search,
1471
- * so we fetch all and filter client-side for text queries.
1524
+ * Search recordings. A text `query` delegates to the server-side unified
1525
+ * catalog matcher (`GET /admin/recordings/search`, backed by
1526
+ * `chainService.searchFlat`) which matches title + artist_name + isrc —
1527
+ * replacing the old fetch-200-and-filter-client-side-on-title/isrc
1528
+ * approach, which both capped results at 200 rows and never matched on
1529
+ * artist_name (e.g. a query for an artist whose name doesn't appear in
1530
+ * the recording title, like "gwazai" against `artist_name: 'Gwazai'`,
1531
+ * returned zero results).
1532
+ *
1533
+ * Without a `query`, behaviour is unchanged: forward filter/sort params
1534
+ * to the plain list route.
1472
1535
  *
1473
1536
  * ADR-270 Phase (b): sort, streaming_activity_gt, streaming_activity_lt
1474
1537
  * are forwarded as query params to the server-side filter/sort path.
@@ -1487,6 +1550,18 @@ declare class RecordingsResource extends BaseResource {
1487
1550
  missing_field_count_gt?: number;
1488
1551
  /** ADR-270 §3.4 — filter: missing_field_count strictly less than this */
1489
1552
  missing_field_count_lt?: number;
1553
+ /** Structured Recall — filter to recordings with (true) or without (false) an ISRC */
1554
+ has_isrc?: boolean;
1555
+ /** Structured Recall — filter by version type */
1556
+ version_type?: string;
1557
+ /** Structured Recall — inclusive ISO date range on recordings.recorded_at */
1558
+ recorded_from?: string;
1559
+ /** Structured Recall — inclusive ISO date range on recordings.recorded_at */
1560
+ recorded_to?: string;
1561
+ /** Structured Recall — inclusive ISO date range on recordings.created_at */
1562
+ created_from?: string;
1563
+ /** Structured Recall — inclusive ISO date range on recordings.created_at */
1564
+ created_to?: string;
1490
1565
  }): Promise<PaginatedResult<Recording>>;
1491
1566
  get(id: string): Promise<Recording>;
1492
1567
  create(data: Partial<Recording>): Promise<Recording>;
@@ -3643,6 +3718,8 @@ declare class ReleasesResource extends BaseResource {
3643
3718
  query?: string;
3644
3719
  upc?: string;
3645
3720
  spotify_album_id?: string;
3721
+ release_date_from?: string;
3722
+ release_date_to?: string;
3646
3723
  }): Promise<any>;
3647
3724
  get(id: string): Promise<any>;
3648
3725
  /**
@@ -4202,6 +4279,10 @@ export declare class PicaClient {
4202
4279
  * Get accurate catalog stats via SQL counts (no pagination limits)
4203
4280
  */
4204
4281
  catalogStats(): Promise<CatalogStats>;
4282
+ catalogStats(params: {
4283
+ entity?: string;
4284
+ group_by?: string;
4285
+ }): Promise<CatalogStats | Record<string, unknown>>;
4205
4286
  constructor(config: PicaClientConfig);
4206
4287
  }
4207
4288
  export type { Work, Person, Recording, PaginatedResult, PicaClientConfig, SyncSearchParams, SyncTrack, SyncSearchResult, LicenseEnquiryInput, LicenseEnquiry, BookingEnquiry, WorkCredit, WorkCreditsInput, PicaScore, PicaScorePillar, AudioFile, AudioAnalysisStatus, PresignedUploadResult, CompleteUploadResult, IdentifyResult, MultimediaItem, Agreement, AgreementWorkLink, CreateAgreementFromTemplateParams, AgreementSendForSignatureResult, AgreementSendForSignatureSentEntry, AgreementSendForSignatureSkippedEntry, AgreementSendForSignatureSkipReason, SyncPlacement, SyncPlacementSource, SyncPlacementRecording, SyncPlacementWithRelations, SyncPlacementContactInput, SyncPlacementRecordingInput, SyncPlacementSourceInput, CreateSyncPlacementInput, UpdateSyncPlacementInput, SyncPlacementQueryParams, SyncPlacementStatus, SyncPlacementVerificationStatus, SyncPlacementConfidentialityLevel, SyncPlacementSourceKind, CatalogStats, NotificationsSummary, CreateUploadSessionInput, CreateUploadSessionResult, };