@withpica/mcp-server 2.7.0 → 2.9.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 (261) 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 +9 -30
  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.js +3 -3
  30. package/dist/index.js.map +1 -1
  31. package/dist/prompts/index.js +24 -24
  32. package/dist/prompts/index.js.map +1 -1
  33. package/dist/resources/index.d.ts +4 -2
  34. package/dist/resources/index.d.ts.map +1 -1
  35. package/dist/resources/index.js +133 -54
  36. package/dist/resources/index.js.map +1 -1
  37. package/dist/resources/llms-primer.d.ts +2 -0
  38. package/dist/resources/llms-primer.d.ts.map +1 -0
  39. package/dist/resources/llms-primer.js +68 -0
  40. package/dist/resources/llms-primer.js.map +1 -0
  41. package/dist/server-instructions.d.ts +9 -0
  42. package/dist/server-instructions.d.ts.map +1 -0
  43. package/dist/server-instructions.js +34 -0
  44. package/dist/server-instructions.js.map +1 -0
  45. package/dist/server.d.ts +17 -0
  46. package/dist/server.d.ts.map +1 -1
  47. package/dist/server.js +103 -14
  48. package/dist/server.js.map +1 -1
  49. package/dist/tools/agreement-types.d.ts +27 -0
  50. package/dist/tools/agreement-types.d.ts.map +1 -0
  51. package/dist/tools/agreement-types.js +387 -0
  52. package/dist/tools/agreement-types.js.map +1 -0
  53. package/dist/tools/agreements.d.ts +20 -0
  54. package/dist/tools/agreements.d.ts.map +1 -0
  55. package/dist/tools/agreements.js +363 -0
  56. package/dist/tools/agreements.js.map +1 -0
  57. package/dist/tools/analytics.d.ts +20 -0
  58. package/dist/tools/analytics.d.ts.map +1 -0
  59. package/dist/tools/analytics.js +124 -0
  60. package/dist/tools/analytics.js.map +1 -0
  61. package/dist/tools/app-tools.d.ts +21 -0
  62. package/dist/tools/app-tools.d.ts.map +1 -0
  63. package/dist/tools/app-tools.js +248 -0
  64. package/dist/tools/app-tools.js.map +1 -0
  65. package/dist/tools/assets.d.ts +25 -0
  66. package/dist/tools/assets.d.ts.map +1 -0
  67. package/dist/tools/assets.js +631 -0
  68. package/dist/tools/assets.js.map +1 -0
  69. package/dist/tools/audio-files.d.ts +20 -0
  70. package/dist/tools/audio-files.d.ts.map +1 -0
  71. package/dist/tools/audio-files.js +384 -0
  72. package/dist/tools/audio-files.js.map +1 -0
  73. package/dist/tools/auth.d.ts +22 -0
  74. package/dist/tools/auth.d.ts.map +1 -0
  75. package/dist/tools/auth.js +210 -0
  76. package/dist/tools/auth.js.map +1 -0
  77. package/dist/tools/bulk.d.ts +16 -0
  78. package/dist/tools/bulk.d.ts.map +1 -0
  79. package/dist/tools/bulk.js +85 -0
  80. package/dist/tools/bulk.js.map +1 -0
  81. package/dist/tools/calendar.d.ts +15 -0
  82. package/dist/tools/calendar.d.ts.map +1 -0
  83. package/dist/tools/calendar.js +67 -0
  84. package/dist/tools/calendar.js.map +1 -0
  85. package/dist/tools/collaborators.d.ts +21 -0
  86. package/dist/tools/collaborators.d.ts.map +1 -0
  87. package/dist/tools/collaborators.js +311 -0
  88. package/dist/tools/collaborators.js.map +1 -0
  89. package/dist/tools/comparisons.d.ts +22 -0
  90. package/dist/tools/comparisons.d.ts.map +1 -0
  91. package/dist/tools/comparisons.js +78 -0
  92. package/dist/tools/comparisons.js.map +1 -0
  93. package/dist/tools/credits.d.ts +17 -0
  94. package/dist/tools/credits.d.ts.map +1 -0
  95. package/dist/tools/credits.js +312 -0
  96. package/dist/tools/credits.js.map +1 -0
  97. package/dist/tools/custody-hints.d.ts +16 -0
  98. package/dist/tools/custody-hints.d.ts.map +1 -0
  99. package/dist/tools/custody-hints.js +27 -0
  100. package/dist/tools/custody-hints.js.map +1 -0
  101. package/dist/tools/custody.d.ts +38 -0
  102. package/dist/tools/custody.d.ts.map +1 -0
  103. package/dist/tools/custody.js +274 -0
  104. package/dist/tools/custody.js.map +1 -0
  105. package/dist/tools/dashboard.d.ts +19 -0
  106. package/dist/tools/dashboard.d.ts.map +1 -0
  107. package/dist/tools/dashboard.js +146 -0
  108. package/dist/tools/dashboard.js.map +1 -0
  109. package/dist/tools/directory.d.ts +15 -0
  110. package/dist/tools/directory.d.ts.map +1 -0
  111. package/dist/tools/directory.js +106 -0
  112. package/dist/tools/directory.js.map +1 -0
  113. package/dist/tools/discovery.d.ts +28 -0
  114. package/dist/tools/discovery.d.ts.map +1 -0
  115. package/dist/tools/discovery.js +560 -0
  116. package/dist/tools/discovery.js.map +1 -0
  117. package/dist/tools/disputes.d.ts +18 -0
  118. package/dist/tools/disputes.d.ts.map +1 -0
  119. package/dist/tools/disputes.js +61 -0
  120. package/dist/tools/disputes.js.map +1 -0
  121. package/dist/tools/documents.d.ts +15 -0
  122. package/dist/tools/documents.d.ts.map +1 -0
  123. package/dist/tools/documents.js +36 -0
  124. package/dist/tools/documents.js.map +1 -0
  125. package/dist/tools/duplicates.d.ts +16 -0
  126. package/dist/tools/duplicates.d.ts.map +1 -0
  127. package/dist/tools/duplicates.js +87 -0
  128. package/dist/tools/duplicates.js.map +1 -0
  129. package/dist/tools/enrichment.d.ts +23 -0
  130. package/dist/tools/enrichment.d.ts.map +1 -0
  131. package/dist/tools/enrichment.js +220 -0
  132. package/dist/tools/enrichment.js.map +1 -0
  133. package/dist/tools/exports.d.ts +19 -0
  134. package/dist/tools/exports.d.ts.map +1 -0
  135. package/dist/tools/exports.js +175 -0
  136. package/dist/tools/exports.js.map +1 -0
  137. package/dist/tools/import-documents.d.ts +21 -0
  138. package/dist/tools/import-documents.d.ts.map +1 -0
  139. package/dist/tools/import-documents.js +203 -0
  140. package/dist/tools/import-documents.js.map +1 -0
  141. package/dist/tools/import.d.ts +30 -0
  142. package/dist/tools/import.d.ts.map +1 -0
  143. package/dist/tools/import.js +455 -0
  144. package/dist/tools/import.js.map +1 -0
  145. package/dist/tools/index.d.ts +67 -5
  146. package/dist/tools/index.d.ts.map +1 -1
  147. package/dist/tools/index.js +448 -84
  148. package/dist/tools/index.js.map +1 -1
  149. package/dist/tools/integrations.d.ts +15 -0
  150. package/dist/tools/integrations.d.ts.map +1 -0
  151. package/dist/tools/integrations.js +100 -0
  152. package/dist/tools/integrations.js.map +1 -0
  153. package/dist/tools/licensing.d.ts +40 -0
  154. package/dist/tools/licensing.d.ts.map +1 -0
  155. package/dist/tools/licensing.js +431 -0
  156. package/dist/tools/licensing.js.map +1 -0
  157. package/dist/tools/memory.d.ts +21 -0
  158. package/dist/tools/memory.d.ts.map +1 -0
  159. package/dist/tools/memory.js +116 -0
  160. package/dist/tools/memory.js.map +1 -0
  161. package/dist/tools/metadata.d.ts +15 -0
  162. package/dist/tools/metadata.d.ts.map +1 -0
  163. package/dist/tools/metadata.js +1106 -0
  164. package/dist/tools/metadata.js.map +1 -0
  165. package/dist/tools/multimedia.d.ts +19 -0
  166. package/dist/tools/multimedia.d.ts.map +1 -0
  167. package/dist/tools/multimedia.js +291 -0
  168. package/dist/tools/multimedia.js.map +1 -0
  169. package/dist/tools/notes.d.ts +21 -0
  170. package/dist/tools/notes.d.ts.map +1 -0
  171. package/dist/tools/notes.js +108 -0
  172. package/dist/tools/notes.js.map +1 -0
  173. package/dist/tools/notifications.d.ts +20 -0
  174. package/dist/tools/notifications.d.ts.map +1 -0
  175. package/dist/tools/notifications.js +266 -0
  176. package/dist/tools/notifications.js.map +1 -0
  177. package/dist/tools/people.d.ts +5 -13
  178. package/dist/tools/people.d.ts.map +1 -1
  179. package/dist/tools/people.js +148 -109
  180. package/dist/tools/people.js.map +1 -1
  181. package/dist/tools/projects.d.ts +19 -0
  182. package/dist/tools/projects.d.ts.map +1 -0
  183. package/dist/tools/projects.js +140 -0
  184. package/dist/tools/projects.js.map +1 -0
  185. package/dist/tools/publishers.d.ts +16 -0
  186. package/dist/tools/publishers.d.ts.map +1 -0
  187. package/dist/tools/publishers.js +69 -0
  188. package/dist/tools/publishers.js.map +1 -0
  189. package/dist/tools/purchases.d.ts +15 -0
  190. package/dist/tools/purchases.d.ts.map +1 -0
  191. package/dist/tools/purchases.js +63 -0
  192. package/dist/tools/purchases.js.map +1 -0
  193. package/dist/tools/recordings.d.ts +35 -35
  194. package/dist/tools/recordings.d.ts.map +1 -1
  195. package/dist/tools/recordings.js +136 -48
  196. package/dist/tools/recordings.js.map +1 -1
  197. package/dist/tools/recovery-hints.d.ts +14 -0
  198. package/dist/tools/recovery-hints.d.ts.map +1 -0
  199. package/dist/tools/recovery-hints.js +277 -0
  200. package/dist/tools/recovery-hints.js.map +1 -0
  201. package/dist/tools/releases.d.ts +18 -0
  202. package/dist/tools/releases.d.ts.map +1 -0
  203. package/dist/tools/releases.js +128 -0
  204. package/dist/tools/releases.js.map +1 -0
  205. package/dist/tools/royalties.d.ts +23 -0
  206. package/dist/tools/royalties.d.ts.map +1 -0
  207. package/dist/tools/royalties.js +257 -0
  208. package/dist/tools/royalties.js.map +1 -0
  209. package/dist/tools/search.d.ts +1 -1
  210. package/dist/tools/search.d.ts.map +1 -1
  211. package/dist/tools/search.js +3 -3
  212. package/dist/tools/search.js.map +1 -1
  213. package/dist/tools/send.d.ts +17 -0
  214. package/dist/tools/send.d.ts.map +1 -0
  215. package/dist/tools/send.js +185 -0
  216. package/dist/tools/send.js.map +1 -0
  217. package/dist/tools/sessions.d.ts +18 -0
  218. package/dist/tools/sessions.d.ts.map +1 -0
  219. package/dist/tools/sessions.js +115 -0
  220. package/dist/tools/sessions.js.map +1 -0
  221. package/dist/tools/settings.d.ts +18 -0
  222. package/dist/tools/settings.d.ts.map +1 -0
  223. package/dist/tools/settings.js +96 -0
  224. package/dist/tools/settings.js.map +1 -0
  225. package/dist/tools/share-links.d.ts +19 -0
  226. package/dist/tools/share-links.d.ts.map +1 -0
  227. package/dist/tools/share-links.js +121 -0
  228. package/dist/tools/share-links.js.map +1 -0
  229. package/dist/tools/split-sheets.d.ts +25 -0
  230. package/dist/tools/split-sheets.d.ts.map +1 -0
  231. package/dist/tools/split-sheets.js +307 -0
  232. package/dist/tools/split-sheets.js.map +1 -0
  233. package/dist/tools/team.d.ts +22 -0
  234. package/dist/tools/team.d.ts.map +1 -0
  235. package/dist/tools/team.js +134 -0
  236. package/dist/tools/team.js.map +1 -0
  237. package/dist/tools/telegram.d.ts +21 -0
  238. package/dist/tools/telegram.d.ts.map +1 -0
  239. package/dist/tools/telegram.js +141 -0
  240. package/dist/tools/telegram.js.map +1 -0
  241. package/dist/tools/uploads.d.ts +17 -0
  242. package/dist/tools/uploads.d.ts.map +1 -0
  243. package/dist/tools/uploads.js +156 -0
  244. package/dist/tools/uploads.js.map +1 -0
  245. package/dist/tools/works.d.ts +5 -13
  246. package/dist/tools/works.d.ts.map +1 -1
  247. package/dist/tools/works.js +219 -116
  248. package/dist/tools/works.js.map +1 -1
  249. package/package.json +1 -1
  250. package/dist/pica-sdk.d.ts +0 -1231
  251. package/dist/pica-sdk.d.ts.map +0 -1
  252. package/dist/pica-sdk.js +0 -1403
  253. package/dist/pica-sdk.js.map +0 -1
  254. package/dist/utils/errors.d.ts +0 -29
  255. package/dist/utils/errors.d.ts.map +0 -1
  256. package/dist/utils/errors.js +0 -115
  257. package/dist/utils/errors.js.map +0 -1
  258. package/dist/utils/formatting.d.ts +0 -82
  259. package/dist/utils/formatting.d.ts.map +0 -1
  260. package/dist/utils/formatting.js +0 -125
  261. package/dist/utils/formatting.js.map +0 -1
@@ -0,0 +1,78 @@
1
+ // Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
2
+ import { formatSuccess } from "@withpica/mcp-utils";
3
+ export class ComparisonTools {
4
+ pica;
5
+ constructor(pica) {
6
+ this.pica = pica;
7
+ }
8
+ getTools() {
9
+ return [
10
+ {
11
+ definition: {
12
+ name: "pica_enrichment_compare",
13
+ description: "Compare enrichment source data vs catalog for a work or person. " +
14
+ "Returns a side-by-side comparison showing what each source (MusicBrainz, MLC, Spotify, " +
15
+ "YouTube, Discogs, ISNI) has vs what's in the catalog, with match status and suggested actions. " +
16
+ "Use this to identify gaps, discrepancies, and enrichment opportunities.",
17
+ inputSchema: {
18
+ type: "object",
19
+ properties: {
20
+ entity_type: {
21
+ type: "string",
22
+ description: "Type of entity to compare",
23
+ enum: ["work", "person"],
24
+ },
25
+ entity_id: {
26
+ type: "string",
27
+ description: "Work ID or Person ID",
28
+ },
29
+ },
30
+ required: ["entity_type", "entity_id"],
31
+ },
32
+ },
33
+ executor: this.enrichmentCompare.bind(this),
34
+ },
35
+ {
36
+ definition: {
37
+ name: "pica_registrations_compare",
38
+ description: "Compare registration status across PROs (PRS, MCPS, PPL, VPL) for a work. " +
39
+ "Returns which PROs the work is registered with, registration dates/IDs, and " +
40
+ "suggested actions for missing registrations. Also identifies cascade opportunities " +
41
+ "(e.g. ISRC available → PPL registration is ready).",
42
+ inputSchema: {
43
+ type: "object",
44
+ properties: {
45
+ work_id: {
46
+ type: "string",
47
+ description: "Work ID to check registrations for",
48
+ },
49
+ },
50
+ required: ["work_id"],
51
+ },
52
+ },
53
+ executor: this.registrationsCompare.bind(this),
54
+ },
55
+ ];
56
+ }
57
+ async enrichmentCompare(args) {
58
+ const result = await this.pica.comparisons.enrichmentCompare({
59
+ entityType: args.entity_type,
60
+ entityId: args.entity_id,
61
+ });
62
+ // SDK request() unwraps data.data, so result is the inner object directly
63
+ const data = result;
64
+ const fieldCount = data.fields?.length || 0;
65
+ const fieldsWithValue = data.fields?.filter((f) => f.currentValue != null).length || 0;
66
+ const actionCount = data.suggestedActions?.length || 0;
67
+ return formatSuccess(`Enrichment comparison for "${data.title}": ${fieldsWithValue}/${fieldCount} fields populated. ${actionCount} suggested action${actionCount !== 1 ? "s" : ""}.`, result);
68
+ }
69
+ async registrationsCompare(args) {
70
+ const result = await this.pica.comparisons.registrationsCompare(args.work_id);
71
+ const data = result;
72
+ const registeredCount = data.registrations?.filter((r) => r.registered === true).length || 0;
73
+ const totalPros = data.registrations?.length || 0;
74
+ const actionCount = data.suggestedActions?.length || 0;
75
+ return formatSuccess(`Registration status for "${data.title}": ${registeredCount}/${totalPros} PROs registered. ${actionCount} suggested action${actionCount !== 1 ? "s" : ""}.`, result);
76
+ }
77
+ }
78
+ //# sourceMappingURL=comparisons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comparisons.js","sourceRoot":"","sources":["../../src/tools/comparisons.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAc7D,OAAO,EAAgB,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAElE,MAAM,OAAO,eAAe;IAClB,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,kEAAkE;wBAClE,yFAAyF;wBACzF,iGAAiG;wBACjG,yEAAyE;oBAC3E,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,WAAW,EAAE;gCACX,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,2BAA2B;gCACxC,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC;6BACzB;4BACD,SAAS,EAAE;gCACT,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,sBAAsB;6BACpC;yBACF;wBACD,QAAQ,EAAE,CAAC,aAAa,EAAE,WAAW,CAAC;qBACvC;iBACF;gBACD,QAAQ,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;aAC5C;YACD;gBACE,UAAU,EAAE;oBACV,IAAI,EAAE,4BAA4B;oBAClC,WAAW,EACT,4EAA4E;wBAC5E,8EAA8E;wBAC9E,qFAAqF;wBACrF,oDAAoD;oBACtD,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,OAAO,EAAE;gCACP,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,oCAAoC;6BAClD;yBACF;wBACD,QAAQ,EAAE,CAAC,SAAS,CAAC;qBACtB;iBACF;gBACD,QAAQ,EAAE,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;aAC/C;SACF,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAC7B,IAAyB;QAEzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC;YAC3D,UAAU,EAAE,IAAI,CAAC,WAAW;YAC5B,QAAQ,EAAE,IAAI,CAAC,SAAS;SACzB,CAAC,CAAC;QAEH,0EAA0E;QAC1E,MAAM,IAAI,GAAG,MAAa,CAAC;QAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC;QAC5C,MAAM,eAAe,GACnB,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;QACtE,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,EAAE,MAAM,IAAI,CAAC,CAAC;QAEvD,OAAO,aAAa,CAClB,8BAA8B,IAAI,CAAC,KAAK,MAAM,eAAe,IAAI,UAAU,sBAAsB,WAAW,oBAAoB,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAC/J,MAAM,CACP,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAChC,IAAyB;QAEzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAC7D,IAAI,CAAC,OAAO,CACb,CAAC;QAEF,MAAM,IAAI,GAAG,MAAa,CAAC;QAC3B,MAAM,eAAe,GACnB,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;QAC5E,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,MAAM,IAAI,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,EAAE,MAAM,IAAI,CAAC,CAAC;QAEvD,OAAO,aAAa,CAClB,4BAA4B,IAAI,CAAC,KAAK,MAAM,eAAe,IAAI,SAAS,qBAAqB,WAAW,oBAAoB,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAC3J,MAAM,CACP,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Credits Tools - MCP tools for managing work credits (collaborators and splits)
3
+ */
4
+ import { PicaClient } from "@withpica/mcp-sdk";
5
+ import { ToolDefinition, ToolExecutor } from "./index.js";
6
+ export declare class CreditsTools {
7
+ private pica;
8
+ constructor(pica: PicaClient);
9
+ getTools(): Array<{
10
+ definition: ToolDefinition;
11
+ executor: ToolExecutor;
12
+ }>;
13
+ private getBalance;
14
+ private listCredits;
15
+ private updateCredits;
16
+ }
17
+ //# sourceMappingURL=credits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credits.d.ts","sourceRoot":"","sources":["../../src/tools/credits.ts"],"names":[],"mappings":"AAEA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAc,MAAM,YAAY,CAAC;AActE,qBAAa,YAAY;IACvB,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;YA4I3D,UAAU;YAeV,WAAW;YA2BX,aAAa;CA+L5B"}
@@ -0,0 +1,312 @@
1
+ // Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
2
+ import { formatSuccess, formatStructuredList, mapGapsToHints, } from "@withpica/mcp-utils";
3
+ import { notifyParties, summarizeNotifications, } from "@withpica/mcp-utils";
4
+ export class CreditsTools {
5
+ pica;
6
+ constructor(pica) {
7
+ this.pica = pica;
8
+ }
9
+ getTools() {
10
+ return [
11
+ {
12
+ definition: {
13
+ name: "pica_credits_balance",
14
+ description: "Check your current credit balance and see what each operation costs. " +
15
+ "Use this before triggering audio analysis or identification to check affordability. If balance is low, use pica_credits_purchase to generate a checkout link.",
16
+ inputSchema: {
17
+ type: "object",
18
+ properties: {},
19
+ },
20
+ },
21
+ executor: this.getBalance.bind(this),
22
+ },
23
+ {
24
+ definition: {
25
+ name: "pica_credits_list",
26
+ description: "Get all credits (collaborators, roles, and splits) for a specific work. Returns who wrote, composed, arranged, or produced the work and their percentage splits. " +
27
+ "→ then: pica_credits_update (fix credits), pica_people_inspect (inspect a credited person)",
28
+ inputSchema: {
29
+ type: "object",
30
+ properties: {
31
+ work_id: {
32
+ type: "string",
33
+ description: "The work ID to get credits for",
34
+ },
35
+ },
36
+ required: ["work_id"],
37
+ },
38
+ },
39
+ executor: this.listCredits.bind(this),
40
+ },
41
+ {
42
+ definition: {
43
+ name: "pica_credits_update",
44
+ description: "Set credits on a work. Replaces all existing credits. Splits must total 100%. " +
45
+ "15 roles: writer, composer, arranger, lyricist, producer, performer, engineer, mixer, mastering, owner, vocalist, instrumentalist, conductor, programmer, remixer. " +
46
+ "Supports publisher fields (publisher_name, publisher_ipi, publisher_split_percentage) and territory/rights metadata. " +
47
+ "IMPORTANT: After updating, call pica_credits_list to verify the credits actually persisted — silent failures are possible if roles are invalid. " +
48
+ "→ then: pica_credits_list (verify saved), pica_works_inspect (check progress)",
49
+ inputSchema: {
50
+ type: "object",
51
+ properties: {
52
+ work_id: {
53
+ type: "string",
54
+ description: "The work ID to set credits on",
55
+ },
56
+ credits: {
57
+ type: "array",
58
+ description: "Array of credit entries. Splits must total 100%.",
59
+ items: {
60
+ type: "object",
61
+ properties: {
62
+ person_id: {
63
+ type: "string",
64
+ description: "Person ID of the credited collaborator",
65
+ },
66
+ role: {
67
+ type: "string",
68
+ description: "Role: writer, composer, arranger, lyricist, producer, performer, engineer, mixer, mastering, owner, vocalist, instrumentalist, conductor, programmer, remixer",
69
+ enum: [
70
+ "writer",
71
+ "composer",
72
+ "arranger",
73
+ "lyricist",
74
+ "producer",
75
+ "performer",
76
+ "engineer",
77
+ "mixer",
78
+ "mastering",
79
+ "owner",
80
+ "vocalist",
81
+ "instrumentalist",
82
+ "conductor",
83
+ "programmer",
84
+ "remixer",
85
+ ],
86
+ },
87
+ splits: {
88
+ type: "number",
89
+ description: "Percentage split (0-100). All splits must total 100%.",
90
+ },
91
+ publisher_name: {
92
+ type: "string",
93
+ description: "Publisher name for this credit (optional — for publishing credits)",
94
+ },
95
+ publisher_ipi: {
96
+ type: "string",
97
+ description: "Publisher's IPI number (9-11 digits)",
98
+ },
99
+ publisher_split_percentage: {
100
+ type: "number",
101
+ description: "Publisher's share percentage (0-100). Separate from writer split.",
102
+ },
103
+ territory: {
104
+ type: "array",
105
+ items: { type: "string" },
106
+ description: 'Territories where this credit applies (e.g., ["worldwide"], ["UK", "US"]). Default: ["worldwide"].',
107
+ },
108
+ rights_type: {
109
+ type: "string",
110
+ enum: [
111
+ "all",
112
+ "performing",
113
+ "mechanical",
114
+ "synchronization",
115
+ ],
116
+ description: "Type of rights covered. Default: all.",
117
+ },
118
+ start_date: {
119
+ type: "string",
120
+ description: "When rights start (ISO date). Null = from inception.",
121
+ },
122
+ end_date: {
123
+ type: "string",
124
+ description: "When rights end (ISO date). Null = perpetual.",
125
+ },
126
+ },
127
+ required: ["person_id", "role", "splits"],
128
+ },
129
+ },
130
+ },
131
+ required: ["work_id", "credits"],
132
+ },
133
+ },
134
+ executor: this.updateCredits.bind(this),
135
+ },
136
+ ];
137
+ }
138
+ async getBalance(_args) {
139
+ const result = await this.pica.creditsBalance.getBalance();
140
+ const balance = result.balance ?? 0;
141
+ const costs = result.credit_costs ?? [];
142
+ const costSummary = costs
143
+ .map((c) => `${c.action_key}: ${c.credits_required} credit(s)`)
144
+ .join(", ");
145
+ return formatSuccess(`Credit balance: ${balance}. Operations: ${costSummary}`, result);
146
+ }
147
+ async listCredits(args) {
148
+ // Fetch both publishing collaborators and recording credits
149
+ const [collabSettled, creditsSettled] = await Promise.allSettled([
150
+ this.pica.credits.listCollaborators(args.work_id),
151
+ this.pica.credits.listForWork(args.work_id),
152
+ ]);
153
+ const collaborators = collabSettled.status === "fulfilled"
154
+ ? collabSettled.value
155
+ : { collaborators: [], count: 0 };
156
+ const recordingCredits = creditsSettled.status === "fulfilled" ? creditsSettled.value : [];
157
+ // Merge both into a single list
158
+ const collabArray = Array.isArray(collaborators)
159
+ ? collaborators
160
+ : collaborators?.collaborators || [];
161
+ const creditArray = Array.isArray(recordingCredits)
162
+ ? recordingCredits
163
+ : recordingCredits?.credits || [];
164
+ const allCredits = [...collabArray, ...creditArray];
165
+ return formatStructuredList(allCredits, "credit", {
166
+ work_id: args.work_id,
167
+ });
168
+ }
169
+ async updateCredits(args) {
170
+ // Validate splits total 100% before saving
171
+ const splitTotal = args.credits.reduce((sum, c) => sum + (c.splits || 0), 0);
172
+ if (splitTotal !== 100) {
173
+ return {
174
+ content: [
175
+ {
176
+ type: "text",
177
+ text: `Splits total ${splitTotal}%, must be exactly 100%. Adjust the splits and try again.`,
178
+ },
179
+ ],
180
+ isError: true,
181
+ };
182
+ }
183
+ // Split credits by role type: publishing roles → /collaborators, recording roles → /credits
184
+ const PUBLISHING_ROLES = new Set([
185
+ "writer",
186
+ "composer",
187
+ "lyricist",
188
+ "arranger",
189
+ ]);
190
+ const allCredits = args.credits.map((c) => {
191
+ const credit = {
192
+ person_id: c.person_id,
193
+ role: c.role,
194
+ splits: c.splits || 0,
195
+ };
196
+ if (c.publisher_name)
197
+ credit.publisher_name = c.publisher_name;
198
+ if (c.publisher_ipi)
199
+ credit.publisher_ipi = c.publisher_ipi;
200
+ if (c.publisher_split_percentage !== undefined)
201
+ credit.publisher_split_percentage = c.publisher_split_percentage;
202
+ if (c.territory)
203
+ credit.territory = c.territory;
204
+ if (c.rights_type)
205
+ credit.rights_type = c.rights_type;
206
+ if (c.start_date)
207
+ credit.start_date = c.start_date;
208
+ if (c.end_date)
209
+ credit.end_date = c.end_date;
210
+ return credit;
211
+ });
212
+ const publishingCredits = allCredits.filter((c) => PUBLISHING_ROLES.has(String(c.role || "writer")
213
+ .split(", ")[0]
214
+ .trim()));
215
+ const recordingCredits = allCredits.filter((c) => !PUBLISHING_ROLES.has(String(c.role || "writer")
216
+ .split(", ")[0]
217
+ .trim()));
218
+ let credits;
219
+ // Route to correct endpoint(s)
220
+ if (publishingCredits.length > 0 && recordingCredits.length > 0) {
221
+ // Mixed — call both endpoints, use allSettled so a partial failure is reported not silently swallowed
222
+ const [pubSettled, recSettled] = await Promise.allSettled([
223
+ this.pica.credits.updateCollaborators(args.work_id, {
224
+ credits: publishingCredits,
225
+ }),
226
+ this.pica.credits.updateForWork(args.work_id, {
227
+ credits: recordingCredits,
228
+ }),
229
+ ]);
230
+ const pubResult = pubSettled.status === "fulfilled" ? pubSettled.value : null;
231
+ const recResult = recSettled.status === "fulfilled" ? recSettled.value : null;
232
+ const pubError = pubSettled.status === "rejected"
233
+ ? pubSettled.reason
234
+ : null;
235
+ const recError = recSettled.status === "rejected"
236
+ ? recSettled.reason
237
+ : null;
238
+ if (pubError && recError) {
239
+ return {
240
+ content: [
241
+ {
242
+ type: "text",
243
+ text: `both publishing and recording credits failed to save — publishing error: ${pubError?.message ?? pubError}, recording error: ${recError?.message ?? recError}`,
244
+ },
245
+ ],
246
+ isError: true,
247
+ };
248
+ }
249
+ if (pubError) {
250
+ return {
251
+ content: [
252
+ {
253
+ type: "text",
254
+ text: `recording credits updated, but publishing credits failed — ${pubError?.message ?? pubError}. retry the publishing portion.`,
255
+ },
256
+ ],
257
+ isError: true,
258
+ };
259
+ }
260
+ if (recError) {
261
+ return {
262
+ content: [
263
+ {
264
+ type: "text",
265
+ text: `publishing credits updated, but recording credits failed — ${recError?.message ?? recError}. retry the recording portion.`,
266
+ },
267
+ ],
268
+ isError: true,
269
+ };
270
+ }
271
+ credits = { collaborators: pubResult, credits: recResult };
272
+ }
273
+ else if (publishingCredits.length > 0) {
274
+ credits = await this.pica.credits.updateCollaborators(args.work_id, {
275
+ credits: publishingCredits,
276
+ });
277
+ }
278
+ else {
279
+ credits = await this.pica.credits.updateForWork(args.work_id, {
280
+ credits: recordingCredits,
281
+ });
282
+ }
283
+ // Check completeness for hints about next steps
284
+ const hints = [];
285
+ try {
286
+ const completeness = await this.pica.health.getWorkCompleteness(args.work_id);
287
+ hints.push(...mapGapsToHints(completeness?.gaps || completeness?.missing || [], 3));
288
+ }
289
+ catch {
290
+ // Best-effort
291
+ }
292
+ // Notify all credited people about their credit
293
+ const parties = args.credits
294
+ .filter((c) => c.person_id)
295
+ .map((c) => ({
296
+ person_id: c.person_id,
297
+ message: `you've been credited as ${c.role || "writer"} (${c.splits || 0}%) on a work — please verify`,
298
+ work_id: args.work_id,
299
+ notification_type: "credit_added",
300
+ }));
301
+ let notifySummary = "";
302
+ if (parties.length > 0) {
303
+ const results = await notifyParties(this.pica, parties);
304
+ notifySummary = summarizeNotifications(results);
305
+ }
306
+ const msg = notifySummary
307
+ ? `Credits updated. ${notifySummary}`
308
+ : "Credits updated successfully";
309
+ return formatSuccess(msg, credits, hints);
310
+ }
311
+ }
312
+ //# sourceMappingURL=credits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credits.js","sourceRoot":"","sources":["../../src/tools/credits.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAQ7D,OAAO,EAEL,aAAa,EACb,oBAAoB,EAEpB,cAAc,GACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,aAAa,EACb,sBAAsB,GAEvB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,OAAO,YAAY;IACf,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,sBAAsB;oBAC5B,WAAW,EACT,uEAAuE;wBACvE,+JAA+J;oBACjK,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE,EAAE;qBACf;iBACF;gBACD,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;aACrC;YACD;gBACE,UAAU,EAAE;oBACV,IAAI,EAAE,mBAAmB;oBACzB,WAAW,EACT,mKAAmK;wBACnK,4FAA4F;oBAC9F,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,OAAO,EAAE;gCACP,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,gCAAgC;6BAC9C;yBACF;wBACD,QAAQ,EAAE,CAAC,SAAS,CAAC;qBACtB;iBACF;gBACD,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;aACtC;YACD;gBACE,UAAU,EAAE;oBACV,IAAI,EAAE,qBAAqB;oBAC3B,WAAW,EACT,gFAAgF;wBAChF,qKAAqK;wBACrK,uHAAuH;wBACvH,kJAAkJ;wBAClJ,+EAA+E;oBACjF,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,OAAO,EAAE;gCACP,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,+BAA+B;6BAC7C;4BACD,OAAO,EAAE;gCACP,IAAI,EAAE,OAAO;gCACb,WAAW,EAAE,kDAAkD;gCAC/D,KAAK,EAAE;oCACL,IAAI,EAAE,QAAQ;oCACd,UAAU,EAAE;wCACV,SAAS,EAAE;4CACT,IAAI,EAAE,QAAQ;4CACd,WAAW,EAAE,wCAAwC;yCACtD;wCACD,IAAI,EAAE;4CACJ,IAAI,EAAE,QAAQ;4CACd,WAAW,EACT,+JAA+J;4CACjK,IAAI,EAAE;gDACJ,QAAQ;gDACR,UAAU;gDACV,UAAU;gDACV,UAAU;gDACV,UAAU;gDACV,WAAW;gDACX,UAAU;gDACV,OAAO;gDACP,WAAW;gDACX,OAAO;gDACP,UAAU;gDACV,iBAAiB;gDACjB,WAAW;gDACX,YAAY;gDACZ,SAAS;6CACV;yCACF;wCACD,MAAM,EAAE;4CACN,IAAI,EAAE,QAAQ;4CACd,WAAW,EACT,uDAAuD;yCAC1D;wCACD,cAAc,EAAE;4CACd,IAAI,EAAE,QAAQ;4CACd,WAAW,EACT,oEAAoE;yCACvE;wCACD,aAAa,EAAE;4CACb,IAAI,EAAE,QAAQ;4CACd,WAAW,EAAE,sCAAsC;yCACpD;wCACD,0BAA0B,EAAE;4CAC1B,IAAI,EAAE,QAAQ;4CACd,WAAW,EACT,mEAAmE;yCACtE;wCACD,SAAS,EAAE;4CACT,IAAI,EAAE,OAAO;4CACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4CACzB,WAAW,EACT,oGAAoG;yCACvG;wCACD,WAAW,EAAE;4CACX,IAAI,EAAE,QAAQ;4CACd,IAAI,EAAE;gDACJ,KAAK;gDACL,YAAY;gDACZ,YAAY;gDACZ,iBAAiB;6CAClB;4CACD,WAAW,EAAE,uCAAuC;yCACrD;wCACD,UAAU,EAAE;4CACV,IAAI,EAAE,QAAQ;4CACd,WAAW,EACT,sDAAsD;yCACzD;wCACD,QAAQ,EAAE;4CACR,IAAI,EAAE,QAAQ;4CACd,WAAW,EACT,+CAA+C;yCAClD;qCACF;oCACD,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC;iCAC1C;6BACF;yBACF;wBACD,QAAQ,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;qBACjC;iBACF;gBACD,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;aACxC;SACF,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,KAA0B;QACjD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC;QAC3D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC;QAExC,MAAM,WAAW,GAAG,KAAK;aACtB,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,gBAAgB,YAAY,CAAC;aACnE,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,OAAO,aAAa,CAClB,mBAAmB,OAAO,iBAAiB,WAAW,EAAE,EACxD,MAAM,CACP,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,IAAyB;QACjD,4DAA4D;QAC5D,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;YAC/D,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC;YACjD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC;SAC5C,CAAC,CAAC;QACH,MAAM,aAAa,GACjB,aAAa,CAAC,MAAM,KAAK,WAAW;YAClC,CAAC,CAAC,aAAa,CAAC,KAAK;YACrB,CAAC,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACtC,MAAM,gBAAgB,GACpB,cAAc,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAEpE,gCAAgC;QAChC,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC;YAC9C,CAAC,CAAC,aAAa;YACf,CAAC,CAAE,aAAqB,EAAE,aAAa,IAAI,EAAE,CAAC;QAChD,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC;YACjD,CAAC,CAAC,gBAAgB;YAClB,CAAC,CAAE,gBAAwB,EAAE,OAAO,IAAI,EAAE,CAAC;QAC7C,MAAM,UAAU,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,WAAW,CAAC,CAAC;QAEpD,OAAO,oBAAoB,CAAC,UAAU,EAAE,QAAQ,EAAE;YAChD,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,IAAyB;QACnD,2CAA2C;QAC3C,MAAM,UAAU,GAAI,IAAI,CAAC,OAAsC,CAAC,MAAM,CACpE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,EACjC,CAAC,CACF,CAAC;QACF,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;YACvB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,gBAAgB,UAAU,2DAA2D;qBAC5F;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,4FAA4F;QAC5F,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;YAC/B,QAAQ;YACR,UAAU;YACV,UAAU;YACV,UAAU;SACX,CAAC,CAAC;QACH,MAAM,UAAU,GACd,IAAI,CAAC,OAYN,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACV,MAAM,MAAM,GAKR;gBACF,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC;aACtB,CAAC;YACF,IAAI,CAAC,CAAC,cAAc;gBAAE,MAAM,CAAC,cAAc,GAAG,CAAC,CAAC,cAAc,CAAC;YAC/D,IAAI,CAAC,CAAC,aAAa;gBAAE,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC,aAAa,CAAC;YAC5D,IAAI,CAAC,CAAC,0BAA0B,KAAK,SAAS;gBAC5C,MAAM,CAAC,0BAA0B,GAAG,CAAC,CAAC,0BAA0B,CAAC;YACnE,IAAI,CAAC,CAAC,SAAS;gBAAE,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC;YAChD,IAAI,CAAC,CAAC,WAAW;gBAAE,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC;YACtD,IAAI,CAAC,CAAC,UAAU;gBAAE,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;YACnD,IAAI,CAAC,CAAC,QAAQ;gBAAE,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;YAC7C,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,MAAM,iBAAiB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAChD,gBAAgB,CAAC,GAAG,CAClB,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC;aACvB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACd,IAAI,EAAE,CACV,CACF,CAAC;QACF,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,CACxC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,gBAAgB,CAAC,GAAG,CACnB,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC;aACvB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACd,IAAI,EAAE,CACV,CACJ,CAAC;QAEF,IAAI,OAAY,CAAC;QAEjB,+BAA+B;QAC/B,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChE,sGAAsG;YACtG,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;gBACxD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,EAAE;oBAClD,OAAO,EAAE,iBAAiB;iBAC3B,CAAC;gBACF,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE;oBAC5C,OAAO,EAAE,gBAAgB;iBAC1B,CAAC;aACH,CAAC,CAAC;YAEH,MAAM,SAAS,GACb,UAAU,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;YAC9D,MAAM,SAAS,GACb,UAAU,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;YAC9D,MAAM,QAAQ,GACZ,UAAU,CAAC,MAAM,KAAK,UAAU;gBAC9B,CAAC,CAAE,UAAoC,CAAC,MAAM;gBAC9C,CAAC,CAAC,IAAI,CAAC;YACX,MAAM,QAAQ,GACZ,UAAU,CAAC,MAAM,KAAK,UAAU;gBAC9B,CAAC,CAAE,UAAoC,CAAC,MAAM;gBAC9C,CAAC,CAAC,IAAI,CAAC;YAEX,IAAI,QAAQ,IAAI,QAAQ,EAAE,CAAC;gBACzB,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,4EAA4E,QAAQ,EAAE,OAAO,IAAI,QAAQ,sBAAsB,QAAQ,EAAE,OAAO,IAAI,QAAQ,EAAE;yBACrK;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,8DAA8D,QAAQ,EAAE,OAAO,IAAI,QAAQ,iCAAiC;yBACnI;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,8DAA8D,QAAQ,EAAE,OAAO,IAAI,QAAQ,gCAAgC;yBAClI;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,OAAO,GAAG,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;QAC7D,CAAC;aAAM,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,EAAE;gBAClE,OAAO,EAAE,iBAAiB;aAC3B,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE;gBAC5D,OAAO,EAAE,gBAAgB;aAC1B,CAAC,CAAC;QACL,CAAC;QAED,gDAAgD;QAChD,MAAM,KAAK,GAAqB,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAC7D,IAAI,CAAC,OAAO,CACb,CAAC;YACF,KAAK,CAAC,IAAI,CACR,GAAG,cAAc,CAAC,YAAY,EAAE,IAAI,IAAI,YAAY,EAAE,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC,CACxE,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;QAED,gDAAgD;QAChD,MAAM,OAAO,GACX,IAAI,CAAC,OAMN;aACE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;aAC1B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACX,SAAS,EAAE,CAAC,CAAC,SAAU;YACvB,OAAO,EAAE,2BAA2B,CAAC,CAAC,IAAI,IAAI,QAAQ,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,8BAA8B;YACtG,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,iBAAiB,EAAE,cAAc;SAClC,CAAC,CAAC,CAAC;QAEN,IAAI,aAAa,GAAG,EAAE,CAAC;QACvB,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACxD,aAAa,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,GAAG,GAAG,aAAa;YACvB,CAAC,CAAC,oBAAoB,aAAa,EAAE;YACrC,CAAC,CAAC,8BAA8B,CAAC;QACnC,OAAO,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;CACF"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * ADR-158 Plan C Phase 2 — completion hints for pica_works_create.
3
+ *
4
+ * When a fresh work is created, the custody columns default to
5
+ * "entry_default" (the org that typed it in is the placeholder custodian
6
+ * until an actual claim is made). These hints nudge the agent to have
7
+ * the rights conversation immediately rather than leaving custody dangling.
8
+ *
9
+ * The helper is intentionally defensive — the SDK's `Work` TS interface
10
+ * does not declare `composition_custody_source` / `master_custody_source`,
11
+ * but the API returns them as JSON pass-through from `worksService.create`.
12
+ * Callers pass the raw work object; we read the fields with a typed wrapper.
13
+ */
14
+ import type { CompletionHint } from "@withpica/mcp-utils";
15
+ export declare function buildCustodyHints(work: unknown): CompletionHint[];
16
+ //# sourceMappingURL=custody-hints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custody-hints.d.ts","sourceRoot":"","sources":["../../src/tools/custody-hints.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAO1D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,cAAc,EAAE,CA+BjE"}
@@ -0,0 +1,27 @@
1
+ // Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
2
+ export function buildCustodyHints(work) {
3
+ const w = (work ?? {});
4
+ const hints = [];
5
+ if (w.composition_custody_source === "entry_default") {
6
+ hints.push({
7
+ gap: "custody_unclaimed_composition",
8
+ severity: "important",
9
+ suggestion: "Who holds the publishing (composition) rights? If you, call pica_custody_claim with chain='composition'. If someone else (publisher, co-writer), invite them via pica_collaborators_invite and let them claim custody on acceptance.",
10
+ });
11
+ }
12
+ if (w.master_custody_source === "entry_default") {
13
+ hints.push({
14
+ gap: "custody_unclaimed_master",
15
+ severity: "important",
16
+ suggestion: "Who holds the recording (master) rights? Label, distributor, self-released? Same pattern — claim it yourself via pica_custody_claim with chain='master', or invite the rightsholder.",
17
+ });
18
+ }
19
+ // Always fire the split hint — we never know splits from a single work row.
20
+ hints.push({
21
+ gap: "rights_share_unknown",
22
+ severity: "nice_to_have",
23
+ suggestion: "Is the publishing 100% yours or split with co-writers? If split, add co-writers via pica_work_credits_add with their percentage shares so the splits sum to 100. Then invite them via pica_collaborators_invite to confirm.",
24
+ });
25
+ return hints;
26
+ }
27
+ //# sourceMappingURL=custody-hints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custody-hints.js","sourceRoot":"","sources":["../../src/tools/custody-hints.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAuB7D,MAAM,UAAU,iBAAiB,CAAC,IAAa;IAC7C,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAoB,CAAC;IAC1C,MAAM,KAAK,GAAqB,EAAE,CAAC;IAEnC,IAAI,CAAC,CAAC,0BAA0B,KAAK,eAAe,EAAE,CAAC;QACrD,KAAK,CAAC,IAAI,CAAC;YACT,GAAG,EAAE,+BAA+B;YACpC,QAAQ,EAAE,WAAW;YACrB,UAAU,EACR,sOAAsO;SACzO,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,CAAC,qBAAqB,KAAK,eAAe,EAAE,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC;YACT,GAAG,EAAE,0BAA0B;YAC/B,QAAQ,EAAE,WAAW;YACrB,UAAU,EACR,sLAAsL;SACzL,CAAC,CAAC;IACL,CAAC;IAED,4EAA4E;IAC5E,KAAK,CAAC,IAAI,CAAC;QACT,GAAG,EAAE,sBAAsB;QAC3B,QAAQ,EAAE,cAAc;QACxB,UAAU,EACR,6NAA6N;KAChO,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Custody MCP Tools — ADR-158 Plan C Phase 1
3
+ *
4
+ * Six tools covering the custody claim lifecycle + reconciliation, exposed
5
+ * on the stdio transport. Thin wrappers around this.pica.custody.* which
6
+ * calls the HTTP routes under /api/admin/custody/.
7
+ *
8
+ * Tools:
9
+ * pica_custody_claim — request custody of a work's chain
10
+ * pica_custody_respond — accept/decline/dispute an incoming claim
11
+ * pica_custody_list — list incoming + outgoing claims
12
+ * pica_custody_history — custody-related provenance_history rows
13
+ * pica_custody_resolve_pending — preview inheritable works for a global_publisher_id
14
+ * pica_custody_reconcile — bulk-claim inheritable works
15
+ *
16
+ * RBAC (enforced at the HTTP route layer, see app/api/admin/custody/*):
17
+ * claim, respond, resolve_pending, reconcile → admin/owner only
18
+ * list, history → any authenticated member
19
+ *
20
+ * Pricing: FREE. ADR-162 deprecates credit gating as a user-facing concept.
21
+ */
22
+ import { PicaClient } from "@withpica/mcp-sdk";
23
+ import type { ToolDefinition, ToolExecutor } from "./index.js";
24
+ export declare class CustodyTools {
25
+ private pica;
26
+ constructor(pica: PicaClient);
27
+ getTools(): Array<{
28
+ definition: ToolDefinition;
29
+ executor: ToolExecutor;
30
+ }>;
31
+ private claim;
32
+ private respond;
33
+ private list;
34
+ private history;
35
+ private resolvePending;
36
+ private reconcile;
37
+ }
38
+ //# sourceMappingURL=custody.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custody.d.ts","sourceRoot":"","sources":["../../src/tools/custody.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAc,MAAM,YAAY,CAAC;AAG3E,qBAAa,YAAY;IACvB,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;YAwM3D,KAAK;YAYL,OAAO;YAeP,IAAI;YA0BJ,OAAO;YAeP,cAAc;YAuBd,SAAS;CAgBxB"}