@withpica/mcp-server 2.7.0 → 2.8.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 (251) hide show
  1. package/dist/__mocks__/mppx-mcp-sdk-server.d.ts +6 -0
  2. package/dist/__mocks__/mppx-mcp-sdk-server.d.ts.map +1 -0
  3. package/dist/__mocks__/mppx-mcp-sdk-server.js +6 -0
  4. package/dist/__mocks__/mppx-mcp-sdk-server.js.map +1 -0
  5. package/dist/__mocks__/mppx-server.d.ts +12 -0
  6. package/dist/__mocks__/mppx-server.d.ts.map +1 -0
  7. package/dist/__mocks__/mppx-server.js +12 -0
  8. package/dist/__mocks__/mppx-server.js.map +1 -0
  9. package/dist/apps/download.d.ts +2 -0
  10. package/dist/apps/download.d.ts.map +1 -0
  11. package/dist/apps/download.js +125 -0
  12. package/dist/apps/download.js.map +1 -0
  13. package/dist/apps/generated/shared-bundle.d.ts +5 -0
  14. package/dist/apps/generated/shared-bundle.d.ts.map +1 -0
  15. package/dist/apps/generated/shared-bundle.js +7 -0
  16. package/dist/apps/generated/shared-bundle.js.map +1 -0
  17. package/dist/apps/shared.d.ts +15 -0
  18. package/dist/apps/shared.d.ts.map +1 -0
  19. package/dist/apps/shared.js +480 -0
  20. package/dist/apps/shared.js.map +1 -0
  21. package/dist/apps/upload.d.ts +2 -0
  22. package/dist/apps/upload.d.ts.map +1 -0
  23. package/dist/apps/upload.js +280 -0
  24. package/dist/apps/upload.js.map +1 -0
  25. package/dist/config.d.ts +4 -25
  26. package/dist/config.d.ts.map +1 -1
  27. package/dist/config.js +36 -12
  28. package/dist/config.js.map +1 -1
  29. package/dist/index.d.ts +1 -1
  30. package/dist/index.js +3 -3
  31. package/dist/index.js.map +1 -1
  32. package/dist/prompts/index.d.ts +64 -64
  33. package/dist/prompts/index.js +24 -24
  34. package/dist/prompts/index.js.map +1 -1
  35. package/dist/resources/index.d.ts +55 -53
  36. package/dist/resources/index.d.ts.map +1 -1
  37. package/dist/resources/index.js +133 -54
  38. package/dist/resources/index.js.map +1 -1
  39. package/dist/resources/llms-primer.d.ts +2 -0
  40. package/dist/resources/llms-primer.d.ts.map +1 -0
  41. package/dist/resources/llms-primer.js +68 -0
  42. package/dist/resources/llms-primer.js.map +1 -0
  43. package/dist/server-instructions.d.ts +9 -0
  44. package/dist/server-instructions.d.ts.map +1 -0
  45. package/dist/server-instructions.js +34 -0
  46. package/dist/server-instructions.js.map +1 -0
  47. package/dist/server.d.ts +49 -32
  48. package/dist/server.d.ts.map +1 -1
  49. package/dist/server.js +103 -14
  50. package/dist/server.js.map +1 -1
  51. package/dist/tools/agreement-types.d.ts +27 -0
  52. package/dist/tools/agreement-types.d.ts.map +1 -0
  53. package/dist/tools/agreement-types.js +387 -0
  54. package/dist/tools/agreement-types.js.map +1 -0
  55. package/dist/tools/agreements.d.ts +20 -0
  56. package/dist/tools/agreements.d.ts.map +1 -0
  57. package/dist/tools/agreements.js +363 -0
  58. package/dist/tools/agreements.js.map +1 -0
  59. package/dist/tools/analytics.d.ts +20 -0
  60. package/dist/tools/analytics.d.ts.map +1 -0
  61. package/dist/tools/analytics.js +124 -0
  62. package/dist/tools/analytics.js.map +1 -0
  63. package/dist/tools/app-tools.d.ts +21 -0
  64. package/dist/tools/app-tools.d.ts.map +1 -0
  65. package/dist/tools/app-tools.js +248 -0
  66. package/dist/tools/app-tools.js.map +1 -0
  67. package/dist/tools/assets.d.ts +25 -0
  68. package/dist/tools/assets.d.ts.map +1 -0
  69. package/dist/tools/assets.js +631 -0
  70. package/dist/tools/assets.js.map +1 -0
  71. package/dist/tools/audio-files.d.ts +20 -0
  72. package/dist/tools/audio-files.d.ts.map +1 -0
  73. package/dist/tools/audio-files.js +384 -0
  74. package/dist/tools/audio-files.js.map +1 -0
  75. package/dist/tools/auth.d.ts +22 -0
  76. package/dist/tools/auth.d.ts.map +1 -0
  77. package/dist/tools/auth.js +210 -0
  78. package/dist/tools/auth.js.map +1 -0
  79. package/dist/tools/bulk.d.ts +16 -0
  80. package/dist/tools/bulk.d.ts.map +1 -0
  81. package/dist/tools/bulk.js +85 -0
  82. package/dist/tools/bulk.js.map +1 -0
  83. package/dist/tools/calendar.d.ts +15 -0
  84. package/dist/tools/calendar.d.ts.map +1 -0
  85. package/dist/tools/calendar.js +67 -0
  86. package/dist/tools/calendar.js.map +1 -0
  87. package/dist/tools/collaborators.d.ts +21 -0
  88. package/dist/tools/collaborators.d.ts.map +1 -0
  89. package/dist/tools/collaborators.js +311 -0
  90. package/dist/tools/collaborators.js.map +1 -0
  91. package/dist/tools/comparisons.d.ts +22 -0
  92. package/dist/tools/comparisons.d.ts.map +1 -0
  93. package/dist/tools/comparisons.js +78 -0
  94. package/dist/tools/comparisons.js.map +1 -0
  95. package/dist/tools/credits.d.ts +17 -0
  96. package/dist/tools/credits.d.ts.map +1 -0
  97. package/dist/tools/credits.js +312 -0
  98. package/dist/tools/credits.js.map +1 -0
  99. package/dist/tools/custody-hints.d.ts +16 -0
  100. package/dist/tools/custody-hints.d.ts.map +1 -0
  101. package/dist/tools/custody-hints.js +27 -0
  102. package/dist/tools/custody-hints.js.map +1 -0
  103. package/dist/tools/custody.d.ts +38 -0
  104. package/dist/tools/custody.d.ts.map +1 -0
  105. package/dist/tools/custody.js +274 -0
  106. package/dist/tools/custody.js.map +1 -0
  107. package/dist/tools/dashboard.d.ts +19 -0
  108. package/dist/tools/dashboard.d.ts.map +1 -0
  109. package/dist/tools/dashboard.js +146 -0
  110. package/dist/tools/dashboard.js.map +1 -0
  111. package/dist/tools/directory.d.ts +15 -0
  112. package/dist/tools/directory.d.ts.map +1 -0
  113. package/dist/tools/directory.js +106 -0
  114. package/dist/tools/directory.js.map +1 -0
  115. package/dist/tools/discovery.d.ts +28 -0
  116. package/dist/tools/discovery.d.ts.map +1 -0
  117. package/dist/tools/discovery.js +560 -0
  118. package/dist/tools/discovery.js.map +1 -0
  119. package/dist/tools/disputes.d.ts +18 -0
  120. package/dist/tools/disputes.d.ts.map +1 -0
  121. package/dist/tools/disputes.js +61 -0
  122. package/dist/tools/disputes.js.map +1 -0
  123. package/dist/tools/documents.d.ts +15 -0
  124. package/dist/tools/documents.d.ts.map +1 -0
  125. package/dist/tools/documents.js +36 -0
  126. package/dist/tools/documents.js.map +1 -0
  127. package/dist/tools/duplicates.d.ts +16 -0
  128. package/dist/tools/duplicates.d.ts.map +1 -0
  129. package/dist/tools/duplicates.js +87 -0
  130. package/dist/tools/duplicates.js.map +1 -0
  131. package/dist/tools/enrichment.d.ts +20 -0
  132. package/dist/tools/enrichment.d.ts.map +1 -0
  133. package/dist/tools/enrichment.js +154 -0
  134. package/dist/tools/enrichment.js.map +1 -0
  135. package/dist/tools/exports.d.ts +19 -0
  136. package/dist/tools/exports.d.ts.map +1 -0
  137. package/dist/tools/exports.js +175 -0
  138. package/dist/tools/exports.js.map +1 -0
  139. package/dist/tools/import-documents.d.ts +21 -0
  140. package/dist/tools/import-documents.d.ts.map +1 -0
  141. package/dist/tools/import-documents.js +203 -0
  142. package/dist/tools/import-documents.js.map +1 -0
  143. package/dist/tools/import.d.ts +30 -0
  144. package/dist/tools/import.d.ts.map +1 -0
  145. package/dist/tools/import.js +455 -0
  146. package/dist/tools/import.js.map +1 -0
  147. package/dist/tools/index.d.ts +83 -37
  148. package/dist/tools/index.d.ts.map +1 -1
  149. package/dist/tools/index.js +448 -84
  150. package/dist/tools/index.js.map +1 -1
  151. package/dist/tools/integrations.d.ts +15 -0
  152. package/dist/tools/integrations.d.ts.map +1 -0
  153. package/dist/tools/integrations.js +100 -0
  154. package/dist/tools/integrations.js.map +1 -0
  155. package/dist/tools/licensing.d.ts +40 -0
  156. package/dist/tools/licensing.d.ts.map +1 -0
  157. package/dist/tools/licensing.js +431 -0
  158. package/dist/tools/licensing.js.map +1 -0
  159. package/dist/tools/memory.d.ts +21 -0
  160. package/dist/tools/memory.d.ts.map +1 -0
  161. package/dist/tools/memory.js +116 -0
  162. package/dist/tools/memory.js.map +1 -0
  163. package/dist/tools/metadata.d.ts +15 -0
  164. package/dist/tools/metadata.d.ts.map +1 -0
  165. package/dist/tools/metadata.js +1106 -0
  166. package/dist/tools/metadata.js.map +1 -0
  167. package/dist/tools/multimedia.d.ts +19 -0
  168. package/dist/tools/multimedia.d.ts.map +1 -0
  169. package/dist/tools/multimedia.js +291 -0
  170. package/dist/tools/multimedia.js.map +1 -0
  171. package/dist/tools/notes.d.ts +21 -0
  172. package/dist/tools/notes.d.ts.map +1 -0
  173. package/dist/tools/notes.js +108 -0
  174. package/dist/tools/notes.js.map +1 -0
  175. package/dist/tools/notifications.d.ts +20 -0
  176. package/dist/tools/notifications.d.ts.map +1 -0
  177. package/dist/tools/notifications.js +266 -0
  178. package/dist/tools/notifications.js.map +1 -0
  179. package/dist/tools/people.d.ts +39 -47
  180. package/dist/tools/people.d.ts.map +1 -1
  181. package/dist/tools/people.js +148 -109
  182. package/dist/tools/people.js.map +1 -1
  183. package/dist/tools/projects.d.ts +19 -0
  184. package/dist/tools/projects.d.ts.map +1 -0
  185. package/dist/tools/projects.js +140 -0
  186. package/dist/tools/projects.js.map +1 -0
  187. package/dist/tools/publishers.d.ts +16 -0
  188. package/dist/tools/publishers.d.ts.map +1 -0
  189. package/dist/tools/publishers.js +69 -0
  190. package/dist/tools/publishers.js.map +1 -0
  191. package/dist/tools/purchases.d.ts +15 -0
  192. package/dist/tools/purchases.d.ts.map +1 -0
  193. package/dist/tools/purchases.js +63 -0
  194. package/dist/tools/purchases.js.map +1 -0
  195. package/dist/tools/recordings.d.ts +9 -9
  196. package/dist/tools/recordings.d.ts.map +1 -1
  197. package/dist/tools/recordings.js +136 -48
  198. package/dist/tools/recordings.js.map +1 -1
  199. package/dist/tools/recovery-hints.d.ts +14 -0
  200. package/dist/tools/recovery-hints.d.ts.map +1 -0
  201. package/dist/tools/recovery-hints.js +277 -0
  202. package/dist/tools/recovery-hints.js.map +1 -0
  203. package/dist/tools/releases.d.ts +18 -0
  204. package/dist/tools/releases.d.ts.map +1 -0
  205. package/dist/tools/releases.js +128 -0
  206. package/dist/tools/releases.js.map +1 -0
  207. package/dist/tools/royalties.d.ts +23 -0
  208. package/dist/tools/royalties.d.ts.map +1 -0
  209. package/dist/tools/royalties.js +257 -0
  210. package/dist/tools/royalties.js.map +1 -0
  211. package/dist/tools/search.d.ts +21 -21
  212. package/dist/tools/search.d.ts.map +1 -1
  213. package/dist/tools/search.js +3 -3
  214. package/dist/tools/search.js.map +1 -1
  215. package/dist/tools/send.d.ts +17 -0
  216. package/dist/tools/send.d.ts.map +1 -0
  217. package/dist/tools/send.js +185 -0
  218. package/dist/tools/send.js.map +1 -0
  219. package/dist/tools/sessions.d.ts +18 -0
  220. package/dist/tools/sessions.d.ts.map +1 -0
  221. package/dist/tools/sessions.js +115 -0
  222. package/dist/tools/sessions.js.map +1 -0
  223. package/dist/tools/settings.d.ts +18 -0
  224. package/dist/tools/settings.d.ts.map +1 -0
  225. package/dist/tools/settings.js +96 -0
  226. package/dist/tools/settings.js.map +1 -0
  227. package/dist/tools/share-links.d.ts +19 -0
  228. package/dist/tools/share-links.d.ts.map +1 -0
  229. package/dist/tools/share-links.js +121 -0
  230. package/dist/tools/share-links.js.map +1 -0
  231. package/dist/tools/split-sheets.d.ts +25 -0
  232. package/dist/tools/split-sheets.d.ts.map +1 -0
  233. package/dist/tools/split-sheets.js +307 -0
  234. package/dist/tools/split-sheets.js.map +1 -0
  235. package/dist/tools/team.d.ts +22 -0
  236. package/dist/tools/team.d.ts.map +1 -0
  237. package/dist/tools/team.js +134 -0
  238. package/dist/tools/team.js.map +1 -0
  239. package/dist/tools/telegram.d.ts +21 -0
  240. package/dist/tools/telegram.d.ts.map +1 -0
  241. package/dist/tools/telegram.js +141 -0
  242. package/dist/tools/telegram.js.map +1 -0
  243. package/dist/tools/uploads.d.ts +17 -0
  244. package/dist/tools/uploads.d.ts.map +1 -0
  245. package/dist/tools/uploads.js +156 -0
  246. package/dist/tools/uploads.js.map +1 -0
  247. package/dist/tools/works.d.ts +39 -47
  248. package/dist/tools/works.d.ts.map +1 -1
  249. package/dist/tools/works.js +216 -116
  250. package/dist/tools/works.js.map +1 -1
  251. package/package.json +1 -1
@@ -0,0 +1,274 @@
1
+ // Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
2
+ import { formatSuccess } from "@withpica/mcp-utils";
3
+ export class CustodyTools {
4
+ pica;
5
+ constructor(pica) {
6
+ this.pica = pica;
7
+ }
8
+ getTools() {
9
+ return [
10
+ {
11
+ definition: {
12
+ name: "pica_custody_claim",
13
+ description: "Request custody of a work's composition or master chain. " +
14
+ "If another org currently holds custody, creates a pending claim; the current " +
15
+ "custodian has 7 days to accept, decline, or dispute before the claim auto-approves. " +
16
+ "If you already hold custody, this errors. Admin/owner access required.",
17
+ inputSchema: {
18
+ type: "object",
19
+ properties: {
20
+ work_id: {
21
+ type: "string",
22
+ description: "UUID of the work to claim.",
23
+ },
24
+ chain: {
25
+ type: "string",
26
+ enum: ["composition", "master"],
27
+ description: "'composition' = publishing rights; 'master' = recording rights.",
28
+ },
29
+ reason: {
30
+ type: "string",
31
+ description: "Optional freetext shown to the current custodian in the notification.",
32
+ },
33
+ },
34
+ required: ["work_id", "chain"],
35
+ },
36
+ annotations: {
37
+ title: "claim custody",
38
+ destructiveHint: false,
39
+ idempotentHint: false,
40
+ },
41
+ },
42
+ executor: this.claim.bind(this),
43
+ },
44
+ {
45
+ definition: {
46
+ name: "pica_custody_respond",
47
+ description: "Respond to an incoming custody claim. Actions: 'accept' transfers custody " +
48
+ "to the claimant; 'decline' rejects the claim (custody unchanged); 'dispute' " +
49
+ "freezes the claim for human review. reason is required for dispute. Only the " +
50
+ "current custodian can accept or decline; the custodian OR any credited party " +
51
+ "can dispute. Admin/owner access required.",
52
+ inputSchema: {
53
+ type: "object",
54
+ properties: {
55
+ claim_id: {
56
+ type: "string",
57
+ description: "UUID of the custody_claims row to respond to.",
58
+ },
59
+ action: {
60
+ type: "string",
61
+ enum: ["accept", "decline", "dispute"],
62
+ },
63
+ reason: {
64
+ type: "string",
65
+ description: "Required when action='dispute'. Optional for decline.",
66
+ },
67
+ },
68
+ required: ["claim_id", "action"],
69
+ },
70
+ annotations: {
71
+ title: "respond to a custody claim",
72
+ destructiveHint: false,
73
+ idempotentHint: false,
74
+ },
75
+ },
76
+ executor: this.respond.bind(this),
77
+ },
78
+ {
79
+ definition: {
80
+ name: "pica_custody_list",
81
+ description: "List custody claims for your organisation — both incoming " +
82
+ "(claims others filed against your custody) and outgoing (claims you filed). " +
83
+ "Defaults to pending claims only. Available to any authenticated org member.",
84
+ inputSchema: {
85
+ type: "object",
86
+ properties: {
87
+ direction: {
88
+ type: "string",
89
+ enum: ["incoming", "outgoing", "both"],
90
+ description: "Default: both.",
91
+ },
92
+ status: {
93
+ type: "string",
94
+ description: "Filter by status (pending|accepted|declined|disputed|auto_approved|withdrawn|expired|all). Default: pending.",
95
+ },
96
+ limit: {
97
+ type: "number",
98
+ description: "1..200. Default 50.",
99
+ },
100
+ },
101
+ },
102
+ annotations: {
103
+ title: "list custody claims",
104
+ readOnlyHint: true,
105
+ idempotentHint: true,
106
+ },
107
+ },
108
+ executor: this.list.bind(this),
109
+ },
110
+ {
111
+ definition: {
112
+ name: "pica_custody_history",
113
+ description: "Return custody-related provenance_history rows for a work. Every row " +
114
+ "includes an attestation_hash so the history is cryptographically anchored. " +
115
+ "Use this to audit who changed custody when. Available to any authenticated org member.",
116
+ inputSchema: {
117
+ type: "object",
118
+ properties: {
119
+ work_id: {
120
+ type: "string",
121
+ description: "UUID of the work whose history to fetch.",
122
+ },
123
+ change_type: {
124
+ type: "string",
125
+ description: "Filter to one change_type (custody_claimed|custody_transferred|custody_released|custody_expired|custody_transfer_auto) or 'all'. Default 'all'.",
126
+ },
127
+ limit: {
128
+ type: "number",
129
+ description: "1..500. Default 100.",
130
+ },
131
+ },
132
+ required: ["work_id"],
133
+ },
134
+ annotations: {
135
+ title: "custody history",
136
+ readOnlyHint: true,
137
+ idempotentHint: true,
138
+ },
139
+ },
140
+ executor: this.history.bind(this),
141
+ },
142
+ {
143
+ definition: {
144
+ name: "pica_custody_resolve_pending",
145
+ description: "Preview works where this org (or a specific global_publisher_id) is named " +
146
+ "as canonical custodian via work_custodians.custodian_global_publisher_id but " +
147
+ "has not yet been claimed via a PICA org membership. The 'Warner Chappell signs " +
148
+ "up and finds 38 works waiting' view. Read-only — use pica_custody_reconcile " +
149
+ "to actually claim them. Admin/owner access required.",
150
+ inputSchema: {
151
+ type: "object",
152
+ properties: {
153
+ global_publisher_id: {
154
+ type: "string",
155
+ description: "Optional. If omitted, uses the caller org's own global_publisher_id bridge.",
156
+ },
157
+ },
158
+ },
159
+ annotations: {
160
+ title: "resolve pending custody",
161
+ readOnlyHint: true,
162
+ idempotentHint: true,
163
+ },
164
+ },
165
+ executor: this.resolvePending.bind(this),
166
+ },
167
+ {
168
+ definition: {
169
+ name: "pica_custody_reconcile",
170
+ description: "Bulk-claim every work where your org (or a specific global_publisher_id) " +
171
+ "is named as canonical custodian but hasn't been locally claimed yet. Writes " +
172
+ "one custody_claims row per matching work. Default is dry-run — pass confirm=true " +
173
+ "to execute. Admin/owner access required.",
174
+ inputSchema: {
175
+ type: "object",
176
+ properties: {
177
+ global_publisher_id: { type: "string" },
178
+ confirm: {
179
+ type: "boolean",
180
+ description: "Required to actually write claims. Default false = dry-run.",
181
+ },
182
+ },
183
+ },
184
+ annotations: {
185
+ title: "reconcile custody",
186
+ destructiveHint: false,
187
+ idempotentHint: false,
188
+ },
189
+ },
190
+ executor: this.reconcile.bind(this),
191
+ },
192
+ ];
193
+ }
194
+ async claim(args) {
195
+ const data = await this.pica.custody.claim({
196
+ work_id: args.work_id,
197
+ chain: args.chain,
198
+ reason: args.reason,
199
+ });
200
+ return formatSuccess(`Custody claim created (${args.chain} chain). The current custodian has 7 days to respond before the claim auto-approves.`, data);
201
+ }
202
+ async respond(args) {
203
+ const data = await this.pica.custody.respond({
204
+ claim_id: args.claim_id,
205
+ action: args.action,
206
+ reason: args.reason,
207
+ });
208
+ const verb = args.action === "accept"
209
+ ? "accepted"
210
+ : args.action === "decline"
211
+ ? "declined"
212
+ : "disputed";
213
+ return formatSuccess(`Custody claim ${verb}.`, data);
214
+ }
215
+ async list(args) {
216
+ const data = await this.pica.custody.list({
217
+ direction: args.direction,
218
+ status: args.status,
219
+ limit: args.limit,
220
+ });
221
+ const incoming = data?.incoming ?? [];
222
+ const outgoing = data?.outgoing ?? [];
223
+ const hints = [];
224
+ if (incoming.length > 0) {
225
+ hints.push({
226
+ gap: "custody_claims_incoming",
227
+ suggestion: `You have ${incoming.length} incoming custody claim(s) — respond via pica_custody_respond before the 7-day window closes.`,
228
+ count: incoming.length,
229
+ severity: "important",
230
+ });
231
+ }
232
+ return formatSuccess(`Found ${incoming.length} incoming + ${outgoing.length} outgoing custody claim(s).`, data, hints);
233
+ }
234
+ async history(args) {
235
+ const data = await this.pica.custody.history({
236
+ work_id: args.work_id,
237
+ change_type: args.change_type,
238
+ limit: args.limit,
239
+ });
240
+ const count = data?.count ?? 0;
241
+ return formatSuccess(count > 0
242
+ ? `Returned ${count} custody history row(s) for the work.`
243
+ : "No custody history rows for this work.", data);
244
+ }
245
+ async resolvePending(args) {
246
+ const data = await this.pica.custody.resolvePending({
247
+ global_publisher_id: args.global_publisher_id,
248
+ });
249
+ const count = data?.count ?? 0;
250
+ const hints = [];
251
+ if (count > 0) {
252
+ hints.push({
253
+ gap: "custody_inheritable",
254
+ suggestion: `${count} work(s) reference your publisher identity but haven't been claimed — run pica_custody_reconcile with confirm=true to claim them in bulk.`,
255
+ count,
256
+ severity: "important",
257
+ });
258
+ }
259
+ return formatSuccess(count > 0
260
+ ? `${count} inheritable work(s) found.`
261
+ : "No inheritable works found.", data, hints);
262
+ }
263
+ async reconcile(args) {
264
+ const data = await this.pica.custody.reconcile({
265
+ global_publisher_id: args.global_publisher_id,
266
+ confirm: args.confirm === true,
267
+ });
268
+ if (data?.dry_run) {
269
+ return formatSuccess(`Dry run — ${data.would_claim ?? 0} claim(s) would be created. Pass confirm=true to execute.`, data);
270
+ }
271
+ return formatSuccess(`Reconciliation complete — ${data?.claimed ?? 0} claimed, ${data?.failed ?? 0} failed.`, data);
272
+ }
273
+ }
274
+ //# sourceMappingURL=custody.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custody.js","sourceRoot":"","sources":["../../src/tools/custody.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Dashboard & Discovery Tools — surface what needs attention, what PICA found, and daily briefings
3
+ */
4
+ import { PicaClient } from "@withpica/mcp-sdk";
5
+ import { ToolDefinition, ToolExecutor } from "./index.js";
6
+ export declare class DashboardTools {
7
+ private pica;
8
+ constructor(pica: PicaClient);
9
+ getTools(): Array<{
10
+ definition: ToolDefinition;
11
+ executor: ToolExecutor;
12
+ }>;
13
+ private queryDiscoveries;
14
+ private reviewDiscovery;
15
+ private attentionItems;
16
+ private briefing;
17
+ private pulse;
18
+ }
19
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/tools/dashboard.ts"],"names":[],"mappings":"AAEA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAc,MAAM,YAAY,CAAC;AAOtE,qBAAa,cAAc;IACzB,OAAO,CAAC,IAAI,CAAa;gBAEb,IAAI,EAAE,UAAU;IAI5B,QAAQ,IAAI,KAAK,CAAC;QAAE,UAAU,EAAE,cAAc,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAA;KAAE,CAAC;YA2G3D,gBAAgB;YA8BhB,eAAe;YAaf,cAAc;YAYd,QAAQ;YAMR,KAAK;CAIpB"}
@@ -0,0 +1,146 @@
1
+ // Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
2
+ import { formatAsText, formatSuccess, formatStructuredList, } from "@withpica/mcp-utils";
3
+ export class DashboardTools {
4
+ pica;
5
+ constructor(pica) {
6
+ this.pica = pica;
7
+ }
8
+ getTools() {
9
+ return [
10
+ // --- Discoveries ---
11
+ {
12
+ definition: {
13
+ name: "pica_discoveries_query",
14
+ description: "Query discoveries — system-computed findings like ISRC matches, " +
15
+ "duplicate detection, enrichment opportunities, and registration gaps. " +
16
+ "Filter by status to see all, pending (needing review), or reviewed items.",
17
+ inputSchema: {
18
+ type: "object",
19
+ properties: {
20
+ status: {
21
+ type: "string",
22
+ enum: ["all", "pending", "reviewed"],
23
+ description: "Filter by status: 'all' for everything, 'pending' for items needing review, 'reviewed' for already-handled (default: all)",
24
+ },
25
+ limit: {
26
+ type: "number",
27
+ description: "Max results (default 50)",
28
+ },
29
+ },
30
+ },
31
+ },
32
+ executor: this.queryDiscoveries.bind(this),
33
+ },
34
+ {
35
+ definition: {
36
+ name: "pica_discoveries_review",
37
+ description: "Accept or reject a pending discovery. " +
38
+ "Accepted discoveries update your catalog automatically.",
39
+ inputSchema: {
40
+ type: "object",
41
+ properties: {
42
+ discovery_id: {
43
+ type: "string",
44
+ description: "The discovery ID to review",
45
+ },
46
+ status: {
47
+ type: "string",
48
+ enum: ["accepted", "rejected"],
49
+ description: "Accept or reject the discovery",
50
+ },
51
+ },
52
+ required: ["discovery_id", "status"],
53
+ },
54
+ },
55
+ executor: this.reviewDiscovery.bind(this),
56
+ },
57
+ // --- Dashboard ---
58
+ {
59
+ definition: {
60
+ name: "pica_dashboard_attention",
61
+ description: "What needs my attention? Shows items requiring action — " +
62
+ "incomplete works, unsigned agreements, overdue tasks, " +
63
+ "pending invites, and quality issues.",
64
+ inputSchema: {
65
+ type: "object",
66
+ properties: {
67
+ door: {
68
+ type: "string",
69
+ enum: ["respond", "catalog"],
70
+ description: "Focus area: 'respond' for urgent items, 'catalog' for data quality",
71
+ },
72
+ limit: {
73
+ type: "number",
74
+ description: "Max items (default 10)",
75
+ },
76
+ },
77
+ },
78
+ },
79
+ executor: this.attentionItems.bind(this),
80
+ },
81
+ {
82
+ definition: {
83
+ name: "pica_dashboard_briefing",
84
+ description: "Get your daily briefing — a summary of catalog health, " +
85
+ "recent activity, upcoming deadlines, and recommended actions.",
86
+ inputSchema: {
87
+ type: "object",
88
+ properties: {},
89
+ },
90
+ },
91
+ executor: this.briefing.bind(this),
92
+ },
93
+ {
94
+ definition: {
95
+ name: "pica_dashboard_pulse",
96
+ description: "Get the pulse of your catalog — works needing attention, " +
97
+ "upcoming deadlines, provenance status, and background task progress.",
98
+ inputSchema: {
99
+ type: "object",
100
+ properties: {},
101
+ },
102
+ },
103
+ executor: this.pulse.bind(this),
104
+ },
105
+ ];
106
+ }
107
+ async queryDiscoveries(args) {
108
+ const status = args.status || "all";
109
+ // "pending" delegates to the dedicated pending endpoint
110
+ if (status === "pending") {
111
+ const result = await this.pica.dashboard.pendingDiscoveries();
112
+ const items = result?.data || result || [];
113
+ return formatStructuredList(Array.isArray(items) ? items : [], "pending discovery");
114
+ }
115
+ // "all" or "reviewed" use the general discoveries endpoint
116
+ const result = await this.pica.dashboard.discoveries({
117
+ unread: status === "all" ? undefined : false,
118
+ limit: args.limit,
119
+ });
120
+ const items = result?.data || result || [];
121
+ const unreadCount = result?.unreadCount ?? 0;
122
+ return formatStructuredList(Array.isArray(items) ? items : [], "discovery", { unreadCount });
123
+ }
124
+ async reviewDiscovery(args) {
125
+ const result = await this.pica.dashboard.reviewDiscovery(args.discovery_id, args.status);
126
+ return formatSuccess(`Discovery ${args.discovery_id} ${args.status}`, result);
127
+ }
128
+ async attentionItems(args) {
129
+ const result = await this.pica.dashboard.attentionItems({
130
+ door: args.door,
131
+ limit: args.limit,
132
+ });
133
+ const items = result?.data?.items || result?.items || [];
134
+ return formatStructuredList(Array.isArray(items) ? items : [], "attention item");
135
+ }
136
+ async briefing(_args) {
137
+ const result = await this.pica.dashboard.briefing();
138
+ const insights = result?.data?.insights || result?.insights || result;
139
+ return formatSuccess("Daily briefing", insights);
140
+ }
141
+ async pulse(_args) {
142
+ const result = await this.pica.dashboard.pulse();
143
+ return formatAsText(result);
144
+ }
145
+ }
146
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/tools/dashboard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Directory Tools — manage directory visibility and settings
3
+ */
4
+ import { PicaClient } from "@withpica/mcp-sdk";
5
+ import { ToolDefinition, ToolExecutor } from "./index.js";
6
+ export declare class DirectoryTools {
7
+ private pica;
8
+ constructor(pica: PicaClient);
9
+ getTools(): Array<{
10
+ definition: ToolDefinition;
11
+ executor: ToolExecutor;
12
+ }>;
13
+ private directorySettings;
14
+ }
15
+ //# sourceMappingURL=directory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directory.d.ts","sourceRoot":"","sources":["../../src/tools/directory.ts"],"names":[],"mappings":"AAEA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1D,qBAAa,cAAc;IACzB,OAAO,CAAC,IAAI,CAAa;gBAEb,IAAI,EAAE,UAAU;IAI5B,QAAQ,IAAI,KAAK,CAAC;QAAE,UAAU,EAAE,cAAc,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAA;KAAE,CAAC;YA6D3D,iBAAiB;CAkDhC"}
@@ -0,0 +1,106 @@
1
+ // Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
2
+ import { formatAsText, formatSuccess } from "@withpica/mcp-utils";
3
+ export class DirectoryTools {
4
+ pica;
5
+ constructor(pica) {
6
+ this.pica = pica;
7
+ }
8
+ getTools() {
9
+ return [
10
+ {
11
+ definition: {
12
+ name: "pica_directory_settings",
13
+ description: "Get or update your organisation's directory visibility settings. " +
14
+ "Controls whether your catalogue appears in the PICA public directory " +
15
+ "and what information is shown (audio previews, splits, publishers, etc.).",
16
+ inputSchema: {
17
+ type: "object",
18
+ properties: {
19
+ action: {
20
+ type: "string",
21
+ enum: ["get", "update"],
22
+ description: "Action to perform. 'get' returns current settings. 'update' changes settings.",
23
+ },
24
+ opted_in: {
25
+ type: "boolean",
26
+ description: "Make catalogue discoverable in the PICA directory. " +
27
+ "When true, sync supervisors and AI agents can find your recordings.",
28
+ },
29
+ show_audio_preview: {
30
+ type: "boolean",
31
+ description: "Allow audio previews in directory listings. " +
32
+ "When true, visitors can listen to your tracks.",
33
+ },
34
+ show_splits: {
35
+ type: "boolean",
36
+ description: "Show credit split percentages in directory.",
37
+ },
38
+ show_publishers: {
39
+ type: "boolean",
40
+ description: "Show publisher information in directory.",
41
+ },
42
+ show_agreements: {
43
+ type: "boolean",
44
+ description: "Show agreement details in directory.",
45
+ },
46
+ show_stems: {
47
+ type: "boolean",
48
+ description: "Show stems/instrumentals in directory.",
49
+ },
50
+ contact_enabled: {
51
+ type: "boolean",
52
+ description: "Allow licensing enquiries from the directory. " +
53
+ "When true, supervisors can send enquiries directly.",
54
+ },
55
+ },
56
+ required: ["action"],
57
+ },
58
+ },
59
+ executor: this.directorySettings.bind(this),
60
+ },
61
+ ];
62
+ }
63
+ async directorySettings(args) {
64
+ if (args.action === "get") {
65
+ const result = await this.pica.directory.getSettings();
66
+ const s = result.settings;
67
+ const status = s.opted_in ? "discoverable" : "private";
68
+ const summary = [
69
+ `Directory status: ${status}`,
70
+ `Eligible works: ${result.eligible_work_count}`,
71
+ s.show_audio_preview ? "Audio preview: on" : "Audio preview: off",
72
+ s.contact_enabled ? "Enquiries: on" : "Enquiries: off",
73
+ s.show_splits ? "Splits: visible" : "Splits: hidden",
74
+ s.show_publishers ? "Publishers: visible" : "Publishers: hidden",
75
+ ].join("\n");
76
+ return {
77
+ content: [{ type: "text", text: summary }],
78
+ structuredContent: result,
79
+ };
80
+ }
81
+ // Update
82
+ const updates = {};
83
+ const boolFields = [
84
+ "opted_in",
85
+ "show_audio_preview",
86
+ "show_splits",
87
+ "show_publishers",
88
+ "show_agreements",
89
+ "show_stems",
90
+ "contact_enabled",
91
+ ];
92
+ for (const field of boolFields) {
93
+ if (args[field] !== undefined)
94
+ updates[field] = Boolean(args[field]);
95
+ }
96
+ if (Object.keys(updates).length === 0) {
97
+ return formatAsText({
98
+ error: "No settings to update. Provide at least one setting field.",
99
+ });
100
+ }
101
+ const result = await this.pica.directory.updateSettings(updates);
102
+ const status = result.opted_in ? "discoverable" : "private";
103
+ return formatSuccess(`Directory settings updated. Your catalogue is now ${status}.`, result);
104
+ }
105
+ }
106
+ //# sourceMappingURL=directory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directory.js","sourceRoot":"","sources":["../../src/tools/directory.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAQ7D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAElE,MAAM,OAAO,cAAc;IACjB,IAAI,CAAa;IAEzB,YAAY,IAAgB;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,QAAQ;QACN,OAAO;YACL;gBACE,UAAU,EAAE;oBACV,IAAI,EAAE,yBAAyB;oBAC/B,WAAW,EACT,mEAAmE;wBACnE,uEAAuE;wBACvE,2EAA2E;oBAC7E,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,MAAM,EAAE;gCACN,IAAI,EAAE,QAAQ;gCACd,IAAI,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC;gCACvB,WAAW,EACT,+EAA+E;6BAClF;4BACD,QAAQ,EAAE;gCACR,IAAI,EAAE,SAAS;gCACf,WAAW,EACT,qDAAqD;oCACrD,qEAAqE;6BACxE;4BACD,kBAAkB,EAAE;gCAClB,IAAI,EAAE,SAAS;gCACf,WAAW,EACT,8CAA8C;oCAC9C,gDAAgD;6BACnD;4BACD,WAAW,EAAE;gCACX,IAAI,EAAE,SAAS;gCACf,WAAW,EAAE,6CAA6C;6BAC3D;4BACD,eAAe,EAAE;gCACf,IAAI,EAAE,SAAS;gCACf,WAAW,EAAE,0CAA0C;6BACxD;4BACD,eAAe,EAAE;gCACf,IAAI,EAAE,SAAS;gCACf,WAAW,EAAE,sCAAsC;6BACpD;4BACD,UAAU,EAAE;gCACV,IAAI,EAAE,SAAS;gCACf,WAAW,EAAE,wCAAwC;6BACtD;4BACD,eAAe,EAAE;gCACf,IAAI,EAAE,SAAS;gCACf,WAAW,EACT,gDAAgD;oCAChD,qDAAqD;6BACxD;yBACF;wBACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;qBACrB;iBACF;gBACD,QAAQ,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;aAC5C;SACF,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,IAAyB;QACvD,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;YACvD,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;YAC1B,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;YAEvD,MAAM,OAAO,GAAG;gBACd,qBAAqB,MAAM,EAAE;gBAC7B,mBAAmB,MAAM,CAAC,mBAAmB,EAAE;gBAC/C,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,oBAAoB;gBACjE,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,gBAAgB;gBACtD,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,gBAAgB;gBACpD,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,oBAAoB;aACjE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEb,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;gBAC1C,iBAAiB,EAAE,MAA4C;aAChE,CAAC;QACJ,CAAC;QAED,SAAS;QACT,MAAM,OAAO,GAA4B,EAAE,CAAC;QAC5C,MAAM,UAAU,GAAG;YACjB,UAAU;YACV,oBAAoB;YACpB,aAAa;YACb,iBAAiB;YACjB,iBAAiB;YACjB,YAAY;YACZ,iBAAiB;SAClB,CAAC;QACF,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,SAAS;gBAAE,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACvE,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtC,OAAO,YAAY,CAAC;gBAClB,KAAK,EAAE,4DAA4D;aACpE,CAAC,CAAC;QACL,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;QAE5D,OAAO,aAAa,CAClB,qDAAqD,MAAM,GAAG,EAC9D,MAAM,CACP,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Layered Discovery Tools — ADR-149 Phase 5d
3
+ *
4
+ * When MCP_LAYERED_DISCOVERY=1, the catalog server handshake exposes only:
5
+ * pica_sign_in, pica_sign_out, pica_discover, pica_tool_details, pica_execute
6
+ *
7
+ * Agents use pica_discover → pica_tool_details → pica_execute to progressively
8
+ * discover and invoke the full tool set without overwhelming the context window.
9
+ */
10
+ import type { ToolDefinition, ToolExecutor } from "./index.js";
11
+ export declare class DiscoveryTools {
12
+ private executeToolFn;
13
+ private getToolDef;
14
+ constructor(executeToolFn: (name: string, args: Record<string, any>) => Promise<any>, getToolDef: (name: string) => {
15
+ definition: ToolDefinition;
16
+ executor: ToolExecutor;
17
+ metadata?: any;
18
+ } | undefined);
19
+ getTools(): Array<{
20
+ definition: ToolDefinition;
21
+ executor: ToolExecutor;
22
+ }>;
23
+ private buildDiscoverTool;
24
+ private buildToolDetailsTool;
25
+ private buildToolDetail;
26
+ private buildExecuteTool;
27
+ }
28
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/tools/discovery.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAc,MAAM,YAAY,CAAC;AAgS3E,qBAAa,cAAc;IAEvB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,UAAU;gBAJV,aAAa,EAAE,CACrB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KACtB,OAAO,CAAC,GAAG,CAAC,EACT,UAAU,EAAE,CAClB,IAAI,EAAE,MAAM,KAEV;QAAE,UAAU,EAAE,cAAc,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAC;QAAC,QAAQ,CAAC,EAAE,GAAG,CAAA;KAAE,GACtE,SAAS;IAGf,QAAQ,IAAI,KAAK,CAAC;QAAE,UAAU,EAAE,cAAc,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAA;KAAE,CAAC;IAQzE,OAAO,CAAC,iBAAiB;IAqDzB,OAAO,CAAC,oBAAoB;IAuH5B,OAAO,CAAC,eAAe;IAoCvB,OAAO,CAAC,gBAAgB;CAiHzB"}