@withpica/mcp-server 2.97.0 → 2.97.2
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 +154 -0
- package/README.md +7 -3
- package/dist/lib/changelog.generated.d.ts +2 -2
- package/dist/lib/changelog.generated.d.ts.map +1 -1
- package/dist/lib/changelog.generated.js +2 -2
- package/dist/lib/changelog.generated.js.map +1 -1
- package/dist/resources/agent-guide.d.ts.map +1 -1
- package/dist/resources/agent-guide.js +26 -11
- package/dist/resources/agent-guide.js.map +1 -1
- package/dist/resources/required-schemas.generated.d.ts +10 -1
- package/dist/resources/required-schemas.generated.d.ts.map +1 -1
- package/dist/resources/required-schemas.generated.js +19 -2
- package/dist/resources/required-schemas.generated.js.map +1 -1
- package/dist/resources/required-schemas.source.d.ts.map +1 -1
- package/dist/resources/required-schemas.source.js +19 -1
- package/dist/resources/required-schemas.source.js.map +1 -1
- package/dist/server-instructions.d.ts +12 -2
- package/dist/server-instructions.d.ts.map +1 -1
- package/dist/server-instructions.js +13 -2
- package/dist/server-instructions.js.map +1 -1
- package/dist/skills/skills.generated.js +1 -1
- package/dist/skills/skills.generated.js.map +1 -1
- package/dist/tools/api-error-body.d.ts +48 -0
- package/dist/tools/api-error-body.d.ts.map +1 -0
- package/dist/tools/api-error-body.js +88 -0
- package/dist/tools/api-error-body.js.map +1 -0
- package/dist/tools/approvals.d.ts.map +1 -1
- package/dist/tools/approvals.js +18 -1
- package/dist/tools/approvals.js.map +1 -1
- package/dist/tools/arg-aliases.d.ts.map +1 -1
- package/dist/tools/arg-aliases.js +11 -0
- package/dist/tools/arg-aliases.js.map +1 -1
- package/dist/tools/audio-files.d.ts +9 -0
- package/dist/tools/audio-files.d.ts.map +1 -1
- package/dist/tools/audio-files.js +109 -8
- package/dist/tools/audio-files.js.map +1 -1
- package/dist/tools/credits.d.ts +13 -0
- package/dist/tools/credits.d.ts.map +1 -1
- package/dist/tools/credits.js +194 -9
- package/dist/tools/credits.js.map +1 -1
- package/dist/tools/dashboard.d.ts.map +1 -1
- package/dist/tools/dashboard.js +24 -2
- package/dist/tools/dashboard.js.map +1 -1
- package/dist/tools/discovery.d.ts.map +1 -1
- package/dist/tools/discovery.js +64 -19
- package/dist/tools/discovery.js.map +1 -1
- package/dist/tools/duplicates.d.ts +7 -0
- package/dist/tools/duplicates.d.ts.map +1 -1
- package/dist/tools/duplicates.js +64 -8
- package/dist/tools/duplicates.js.map +1 -1
- package/dist/tools/import.d.ts.map +1 -1
- package/dist/tools/import.js +20 -0
- package/dist/tools/import.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +9 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/metadata.d.ts.map +1 -1
- package/dist/tools/metadata.js +39 -0
- package/dist/tools/metadata.js.map +1 -1
- package/dist/tools/recovery-hints.d.ts.map +1 -1
- package/dist/tools/recovery-hints.js +48 -0
- package/dist/tools/recovery-hints.js.map +1 -1
- package/dist/tools/releases.d.ts.map +1 -1
- package/dist/tools/releases.js +3 -1
- package/dist/tools/releases.js.map +1 -1
- package/dist/tools/selections.d.ts +42 -0
- package/dist/tools/selections.d.ts.map +1 -0
- package/dist/tools/selections.js +361 -0
- package/dist/tools/selections.js.map +1 -0
- package/dist/tools/share-links.d.ts.map +1 -1
- package/dist/tools/share-links.js +8 -1
- package/dist/tools/share-links.js.map +1 -1
- package/dist/tools/split-sheets.d.ts.map +1 -1
- package/dist/tools/split-sheets.js +7 -3
- package/dist/tools/split-sheets.js.map +1 -1
- package/dist/tools/subscription.d.ts.map +1 -1
- package/dist/tools/subscription.js +8 -2
- package/dist/tools/subscription.js.map +1 -1
- package/dist/tools/works.d.ts.map +1 -1
- package/dist/tools/works.js +9 -1
- package/dist/tools/works.js.map +1 -1
- package/package.json +16 -2
- package/server.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -11,6 +11,160 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
11
11
|
|
|
12
12
|
## [Unreleased]
|
|
13
13
|
|
|
14
|
+
## [2.97.2] - 2026-09-13
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
|
|
18
|
+
- **`pica_credit_update` now actually returns `allocation.status`.** The
|
|
19
|
+
description promised it and the route sent it, but `@withpica/mcp-sdk`
|
|
20
|
+
< 3.17.0 unwrapped it away, so the response never carried it and the
|
|
21
|
+
"writer shares now total N%" hints could never fire. Requires mcp-sdk 3.17.0.
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
|
|
25
|
+
- **`pica_credit_update` — edit ONE credit in place.** The verb between
|
|
26
|
+
`pica_credit_add` and `pica_credit_remove`: change a writer's share, an
|
|
27
|
+
instrumentalist's instrument, a role, the displayed name or notes, leaving
|
|
28
|
+
every other credit untouched and keeping the row's id and attestation state.
|
|
29
|
+
`pica_credits_update` remained replace-all, so one split change meant
|
|
30
|
+
re-listing every work and re-sending the whole array (ops issue bff0af25);
|
|
31
|
+
nothing edited a recording credit by its id — beyond the natural-key
|
|
32
|
+
upsert, a change meant remove-then-re-add (17f27449). Agents had already been calling this exact
|
|
33
|
+
name — it was the `TOOL_NOT_FOUND` miss in 167bb804, six times. Writer-split
|
|
34
|
+
closure is deliberately NOT enforced on a single edit; the response's
|
|
35
|
+
`allocation.status` (closed / open / incomplete) reports whether the set
|
|
36
|
+
still adds up instead. Backed by a new `PATCH
|
|
37
|
+
/admin/works/{id}/credits/{creditId}`, scoped to the work in the path.
|
|
38
|
+
- **`pica_recording_credits_update` batch mode accepts `instrument` per
|
|
39
|
+
credit** (`credits[].instrument`), applied on every target recording. Until
|
|
40
|
+
now crediting an instrumentalist across N recordings took N single calls.
|
|
41
|
+
- **`pica_import_streaming_link` returns `STREAMING_LINK_NOT_FOUND`** for a
|
|
42
|
+
link the provider cannot resolve — user input, not a PICA fault, and no
|
|
43
|
+
longer opens an ops issue. `STREAMING_IMPORT_FAILED` is now reserved for
|
|
44
|
+
genuine failures (timeouts, upstream errors). ⚠️ A client matching on the
|
|
45
|
+
old code for the not-found case will need the new one.
|
|
46
|
+
- **`pica_find_duplicates` accepts `entity_type: "audio_files"`** — the same
|
|
47
|
+
file uploaded twice, grouped on exact byte size + normalised filename
|
|
48
|
+
(`audio_files` carries no content hash). Each item reports `storage_bucket`;
|
|
49
|
+
a `withpica-*` bucket is storage PICA pays for. ⚠️ **Findable, not
|
|
50
|
+
mergeable:** `pica_merge_duplicates` refuses `audio_files` by design — the
|
|
51
|
+
outcome is a person deleting a redundant upload, and there is no merge
|
|
52
|
+
semantics for a file. The two entity lists are now deliberately different
|
|
53
|
+
sizes.
|
|
54
|
+
- **`pica_publishers_query` works at all.** `GET /admin/publishers` did not
|
|
55
|
+
exist, so every call since the tool shipped drew a bare 405 and surfaced as
|
|
56
|
+
`UNKNOWN_ERROR`. Searches by name (substring, on name and legal_name) or by
|
|
57
|
+
exact IPI.
|
|
58
|
+
- **`pica_approval_status` called with no `approval_id`** now explains what the
|
|
59
|
+
dashboard's "N awaiting approval" count is and who can act on it, instead of
|
|
60
|
+
answering "approval_id is required". There is deliberately no tool that lists
|
|
61
|
+
approvals — an agent grant cannot enumerate the approvals it is itself
|
|
62
|
+
waiting on.
|
|
63
|
+
|
|
64
|
+
### Changed
|
|
65
|
+
|
|
66
|
+
- ⚠️ **Wire change: `pica_execute` now FORWARDS `pica_discover` and
|
|
67
|
+
`pica_tool_details`** instead of refusing them. A client matching on the old
|
|
68
|
+
literal `"meta-tools (pica_discover, pica_tool_details, pica_execute) cannot
|
|
69
|
+
be invoked via pica_execute"` will stop seeing that refusal. Only
|
|
70
|
+
`pica_execute` invoking ITSELF is still refused (that is the only case that
|
|
71
|
+
can recurse); its message changed accordingly. A connector that surfaces only
|
|
72
|
+
the wrapper teaches its agent to wrap everything, so refusing the two
|
|
73
|
+
read-only meta-tools blocked discovery for exactly the clients that need it.
|
|
74
|
+
- ⚠️ **`pica_audio_query`'s `query` filter now applies to ALL results.** It was
|
|
75
|
+
honoured only when `unassigned: true` was also set; a plain
|
|
76
|
+
`pica_audio_query {query: "…"}` returned the whole library in upload order
|
|
77
|
+
and truncated at the 100KB response cap. The parameter description said
|
|
78
|
+
"with unassigned:true" and no longer does.
|
|
79
|
+
- **`pica_audio_query` rows are a lean LIST shape.** The route flattens the
|
|
80
|
+
analysis satellite onto every row — `waveform_data` alone is ~4.9KB per file
|
|
81
|
+
on prod, three times the rest of the row — so the 100KB response guard was
|
|
82
|
+
trimming a page to about 8 files. List rows now carry identity, size,
|
|
83
|
+
duration, bpm/key/energy/mood, links, bucket and `probable_match`;
|
|
84
|
+
waveform, full analysis, `metadata` and the recording/work embeds are on
|
|
85
|
+
`pica_audio_inspect`. ⚠️ A client reading those fields off the list will
|
|
86
|
+
need the inspect call.
|
|
87
|
+
- **`pica_recording_splits_verify` records WHICH PERSON attested.** It now
|
|
88
|
+
resolves the signed-in user to their person record and stamps that as
|
|
89
|
+
`verified_by` (the column has always referenced `people`). ⚠️ Wire change:
|
|
90
|
+
an API-key / agent-grant call is refused with
|
|
91
|
+
`VERIFICATION_REQUIRES_HUMAN_SESSION` (message text changed), and a
|
|
92
|
+
signed-in user with no person record in the org gets
|
|
93
|
+
`ATTESTING_PERSON_NOT_FOUND`. Before this the endpoint had never succeeded
|
|
94
|
+
for anyone.
|
|
95
|
+
- **`pica_credits_update` accepts a signed sheet within ±0.01.** Its own
|
|
96
|
+
pre-flight used `!== 100`, so 33.34/33.34/33.33 (=100.01) and
|
|
97
|
+
33.33×3 (=99.99) were refused before the API was called; the message text
|
|
98
|
+
changed.
|
|
99
|
+
- **`pica_share_links_create` returns `share_url`** beside `token`, so the
|
|
100
|
+
agent can hand the user a working link rather than sending them to the
|
|
101
|
+
dashboard to find it. `pica_share_links_query` returns it too. `token` is
|
|
102
|
+
unchanged.
|
|
103
|
+
- **`pica_recording_credits_update` no longer reports `PERSON_NOT_FOUND` when
|
|
104
|
+
the RECORDING is the missing one.** It dispatches on the route's own error
|
|
105
|
+
code rather than matching "not found" anywhere in the message, and a foreign
|
|
106
|
+
or non-existent `person_id` is now validated org-scoped before the write
|
|
107
|
+
(it previously reached the FK unchecked, which also accepted another
|
|
108
|
+
organisation's person).
|
|
109
|
+
- **`pica_tool_details` offers near-miss suggestions** (`did_you_mean`) for an
|
|
110
|
+
unknown tool name, in `structuredContent` as well as text — the same shape
|
|
111
|
+
`pica_execute`'s unknown-tool branch has returned since 2.96.
|
|
112
|
+
- **`pica_catalog_health_fix` accepts `actionIds` / `action_ids`** as aliases
|
|
113
|
+
for `accept` on the `pica_execute` path, and `INVALID_PLAN_TOKEN` now names
|
|
114
|
+
the remedy rather than only the reason.
|
|
115
|
+
|
|
116
|
+
## [2.97.1] - 2026-09-08
|
|
117
|
+
|
|
118
|
+
### Added
|
|
119
|
+
|
|
120
|
+
- **`pica_catalog_health_fix` accepts `selections: [{actionId, chosenPersonId}]`**
|
|
121
|
+
— the human choice a `resolve_person` action needs (one of its
|
|
122
|
+
`preview.candidates[].personId`). A selection accepts its action; a choice
|
|
123
|
+
the plan never offered is skipped `guard_blocked` with the reason. Until now
|
|
124
|
+
the applier required a chosen person the tool had no way to pass, so every
|
|
125
|
+
accepted `resolve_person` came back `stale` (feedback 2026-09-05).
|
|
126
|
+
- **`pica_find_duplicates` sees identifier-less copies.** Recordings group on
|
|
127
|
+
title + artist and releases on title + equal track count when the ISRC/UPC
|
|
128
|
+
pass cannot see them (`match_kind: "title_artist"`, keep-separate default);
|
|
129
|
+
a UPC shared by releases with different titles is reported as
|
|
130
|
+
`shared_upc_different_title` — the decision is "correct the UPC", with no
|
|
131
|
+
fold option (feedback 2026-09-05).
|
|
132
|
+
|
|
133
|
+
### Fixed
|
|
134
|
+
|
|
135
|
+
- **`pica_works_update {collaborators}` is refused with a redirect** to
|
|
136
|
+
`pica_credits_update` / `pica_credit_add`. `works.collaborators` is a
|
|
137
|
+
legacy jsonb mirror; the write showed correct splits on inspect while the
|
|
138
|
+
`work_collaborators` rows every health check reads still disagreed, and the
|
|
139
|
+
health plan then proposed "fixing" them (feedback 2026-09-05).
|
|
140
|
+
- **Accepting a held finding is a typed 409, not `INTERNAL_ERROR`.** The
|
|
141
|
+
apply route now maps every "is already <status>" refusal to
|
|
142
|
+
`PROPOSAL_ALREADY_CLOSED`, and a held one carries the unlock sentence
|
|
143
|
+
(`pica_billing_pay`, offer `unlock`, `entity_id` the work) — a ChatGPT user
|
|
144
|
+
hit "internal server error" three times on 2026-09-04.
|
|
145
|
+
- **`pica_credit_add` never invents a share.** An omitted `share_pct` on a
|
|
146
|
+
composition credit is stored as NULL (unknown), not 0 — a 0 read as a real
|
|
147
|
+
share, so the health plan rescaled the other writer to 100 and the second
|
|
148
|
+
writer's stake vanished (holdout lock, 2026-09-06). For `credit_type:
|
|
149
|
+
"owner"` the share is now REQUIRED (`OWNER_SHARE_REQUIRED`, 422): master
|
|
150
|
+
ownership is recorded as given, never assumed to be 100.
|
|
151
|
+
- **`pica_releases_update` documents the UPC backfill trigger** — it fires
|
|
152
|
+
only on a write to `spotify_album_id`, so re-sending the existing id is the
|
|
153
|
+
way to backfill a UPC (ops issue 9f33cc59).
|
|
154
|
+
|
|
155
|
+
- **`pica_subscription_status` is callable on the hosted connector.** It was
|
|
156
|
+
declared `scope: admin`, `audiences: ["stdio"]` while `pica_billing_pay` was
|
|
157
|
+
`read:catalog` on both surfaces, so a connected agent could mint a pay link
|
|
158
|
+
but not read the plan it would be paying for (`callable_on_this_surface:
|
|
159
|
+
false` on claude.ai, 2026-09-04). Both now share the catalogue-read floor;
|
|
160
|
+
`pica_subscription_manage` stays stdio + admin.
|
|
161
|
+
- **The pay path is visible to an agent that never calls `pica_discover`.**
|
|
162
|
+
The server instructions name `pica_subscription_status` and
|
|
163
|
+
`pica_billing_pay` with the exact `pica_execute` shape inside the first
|
|
164
|
+
2,000 characters (the observed cut on the claude.ai connector), and the
|
|
165
|
+
`pica_discover` description lists "how do i pay pica" among its example
|
|
166
|
+
queries for clients that surface tool descriptions but not instructions.
|
|
167
|
+
|
|
14
168
|
PR #2118 (`fix/avatar-import-path-2026-09-03`) is merged into the release branch, so its changes ship in the version below; publish in the order mcp-utils → mcp-sdk → mcp-server.
|
|
15
169
|
|
|
16
170
|
## [2.97.0] - 2026-09-04
|
package/README.md
CHANGED
|
@@ -65,7 +65,7 @@ Read tools are annotated read-only and are safe to call freely. Write tools repo
|
|
|
65
65
|
|
|
66
66
|
## Tools
|
|
67
67
|
|
|
68
|
-
|
|
68
|
+
336 tools, grouped below by the taxonomy `pica_discover` uses. The server's own `tools/list` is authoritative — not every registered tool is filed under a category yet, so the names below are a map, not a census.
|
|
69
69
|
|
|
70
70
|
**works** — manage your musical works
|
|
71
71
|
|
|
@@ -119,7 +119,7 @@ Read tools are annotated read-only and are safe to call freely. Write tools repo
|
|
|
119
119
|
|
|
120
120
|
`pica_notes_query`, `pica_notes_inspect`, `pica_notes_create`, `pica_notes_delete`
|
|
121
121
|
|
|
122
|
-
**duplicates** — detect and merge duplicate
|
|
122
|
+
**duplicates** — detect duplicate records and merge them (audio_files can be found but not merged — a duplicate file is deleted)
|
|
123
123
|
|
|
124
124
|
`pica_find_duplicates`, `pica_merge_duplicates`
|
|
125
125
|
|
|
@@ -235,6 +235,10 @@ Read tools are annotated read-only and are safe to call freely. Write tools repo
|
|
|
235
235
|
|
|
236
236
|
`pica_royalties_summary`, `pica_royalties_list`, `pica_royalties_get`, `pica_statements_query`, `pica_statements_inspect`, `pica_ingest_statement`, `pica_statements_pending`, `pica_statement_ingest_document`, `pica_royalties_unmatched`, `pica_royalties_attribute`
|
|
237
237
|
|
|
238
|
+
**selections** — save, recall, and resolve named catalog selections — persisted predicates over the catalogue with an honest coverage report
|
|
239
|
+
|
|
240
|
+
`pica_selections_create`, `pica_selections_query`, `pica_selections_inspect`, `pica_selections_update`, `pica_selections_delete`
|
|
241
|
+
|
|
238
242
|
**share links** — create, inspect, update, and delete share links for catalog content
|
|
239
243
|
|
|
240
244
|
`pica_share_links_create`, `pica_share_links_query`, `pica_share_links_inspect`, `pica_share_links_update`, `pica_share_links_delete`
|
|
@@ -285,4 +289,4 @@ Read tools are annotated read-only and are safe to call freely. Write tools repo
|
|
|
285
289
|
|
|
286
290
|
---
|
|
287
291
|
|
|
288
|
-
Generated for `@withpica/mcp-server@2.97.
|
|
292
|
+
Generated for `@withpica/mcp-server@2.97.1`. © 2024-2026 Withpica Ltd. All rights reserved. MIT licensed.
|