@withpica/mcp-server 1.3.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 (347) hide show
  1. package/.claude/settings.local.json +5 -0
  2. package/CHANGELOG.md +1850 -0
  3. package/README.md +304 -0
  4. package/assets/fonts/GeistSans-Light.woff2 +0 -0
  5. package/assets/fonts/InstrumentSerif-Italic.woff2 +0 -0
  6. package/assets/fonts/InstrumentSerif-Regular.woff2 +0 -0
  7. package/dist/apps/download.d.ts +2 -0
  8. package/dist/apps/download.d.ts.map +1 -0
  9. package/dist/apps/download.js +125 -0
  10. package/dist/apps/download.js.map +1 -0
  11. package/dist/apps/generated/shared-bundle.d.ts +5 -0
  12. package/dist/apps/generated/shared-bundle.d.ts.map +1 -0
  13. package/dist/apps/generated/shared-bundle.js +7 -0
  14. package/dist/apps/generated/shared-bundle.js.map +1 -0
  15. package/dist/apps/release.d.ts +2 -0
  16. package/dist/apps/release.d.ts.map +1 -0
  17. package/dist/apps/release.js +69 -0
  18. package/dist/apps/release.js.map +1 -0
  19. package/dist/apps/shared.d.ts +15 -0
  20. package/dist/apps/shared.d.ts.map +1 -0
  21. package/dist/apps/shared.js +480 -0
  22. package/dist/apps/shared.js.map +1 -0
  23. package/dist/apps/upload.d.ts +2 -0
  24. package/dist/apps/upload.d.ts.map +1 -0
  25. package/dist/apps/upload.js +280 -0
  26. package/dist/apps/upload.js.map +1 -0
  27. package/dist/config.d.ts +14 -0
  28. package/dist/config.d.ts.map +1 -0
  29. package/dist/config.js +73 -0
  30. package/dist/config.js.map +1 -0
  31. package/dist/index.d.ts +3 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +35 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/prompts/index.d.ts +86 -0
  36. package/dist/prompts/index.d.ts.map +1 -0
  37. package/dist/prompts/index.js +645 -0
  38. package/dist/prompts/index.js.map +1 -0
  39. package/dist/resources/agent-guide.d.ts +15 -0
  40. package/dist/resources/agent-guide.d.ts.map +1 -0
  41. package/dist/resources/agent-guide.js +284 -0
  42. package/dist/resources/agent-guide.js.map +1 -0
  43. package/dist/resources/index.d.ts +66 -0
  44. package/dist/resources/index.d.ts.map +1 -0
  45. package/dist/resources/index.js +510 -0
  46. package/dist/resources/index.js.map +1 -0
  47. package/dist/resources/llms-primer.d.ts +2 -0
  48. package/dist/resources/llms-primer.d.ts.map +1 -0
  49. package/dist/resources/llms-primer.js +68 -0
  50. package/dist/resources/llms-primer.js.map +1 -0
  51. package/dist/resources/required-schemas.generated.d.ts +455 -0
  52. package/dist/resources/required-schemas.generated.d.ts.map +1 -0
  53. package/dist/resources/required-schemas.generated.js +1041 -0
  54. package/dist/resources/required-schemas.generated.js.map +1 -0
  55. package/dist/resources/required-schemas.source.d.ts +53 -0
  56. package/dist/resources/required-schemas.source.d.ts.map +1 -0
  57. package/dist/resources/required-schemas.source.js +493 -0
  58. package/dist/resources/required-schemas.source.js.map +1 -0
  59. package/dist/resources/welcome.d.ts +14 -0
  60. package/dist/resources/welcome.d.ts.map +1 -0
  61. package/dist/resources/welcome.js +26 -0
  62. package/dist/resources/welcome.js.map +1 -0
  63. package/dist/server-instructions.d.ts +60 -0
  64. package/dist/server-instructions.d.ts.map +1 -0
  65. package/dist/server-instructions.js +93 -0
  66. package/dist/server-instructions.js.map +1 -0
  67. package/dist/server.d.ts +52 -0
  68. package/dist/server.d.ts.map +1 -0
  69. package/dist/server.js +334 -0
  70. package/dist/server.js.map +1 -0
  71. package/dist/tools/access-simulate.d.ts +23 -0
  72. package/dist/tools/access-simulate.d.ts.map +1 -0
  73. package/dist/tools/access-simulate.js +162 -0
  74. package/dist/tools/access-simulate.js.map +1 -0
  75. package/dist/tools/agent-identity.d.ts +36 -0
  76. package/dist/tools/agent-identity.d.ts.map +1 -0
  77. package/dist/tools/agent-identity.js +274 -0
  78. package/dist/tools/agent-identity.js.map +1 -0
  79. package/dist/tools/agreement-types.d.ts +27 -0
  80. package/dist/tools/agreement-types.d.ts.map +1 -0
  81. package/dist/tools/agreement-types.js +281 -0
  82. package/dist/tools/agreement-types.js.map +1 -0
  83. package/dist/tools/agreements.d.ts +20 -0
  84. package/dist/tools/agreements.d.ts.map +1 -0
  85. package/dist/tools/agreements.js +282 -0
  86. package/dist/tools/agreements.js.map +1 -0
  87. package/dist/tools/analytics.d.ts +20 -0
  88. package/dist/tools/analytics.d.ts.map +1 -0
  89. package/dist/tools/analytics.js +130 -0
  90. package/dist/tools/analytics.js.map +1 -0
  91. package/dist/tools/app-tools.d.ts +15 -0
  92. package/dist/tools/app-tools.d.ts.map +1 -0
  93. package/dist/tools/app-tools.js +388 -0
  94. package/dist/tools/app-tools.js.map +1 -0
  95. package/dist/tools/assets.d.ts +25 -0
  96. package/dist/tools/assets.d.ts.map +1 -0
  97. package/dist/tools/assets.js +454 -0
  98. package/dist/tools/assets.js.map +1 -0
  99. package/dist/tools/audio-files.d.ts +20 -0
  100. package/dist/tools/audio-files.d.ts.map +1 -0
  101. package/dist/tools/audio-files.js +409 -0
  102. package/dist/tools/audio-files.js.map +1 -0
  103. package/dist/tools/audit.d.ts +19 -0
  104. package/dist/tools/audit.d.ts.map +1 -0
  105. package/dist/tools/audit.js +58 -0
  106. package/dist/tools/audit.js.map +1 -0
  107. package/dist/tools/auth.d.ts +22 -0
  108. package/dist/tools/auth.d.ts.map +1 -0
  109. package/dist/tools/auth.js +212 -0
  110. package/dist/tools/auth.js.map +1 -0
  111. package/dist/tools/bulk.d.ts +22 -0
  112. package/dist/tools/bulk.d.ts.map +1 -0
  113. package/dist/tools/bulk.js +164 -0
  114. package/dist/tools/bulk.js.map +1 -0
  115. package/dist/tools/calendar.d.ts +15 -0
  116. package/dist/tools/calendar.d.ts.map +1 -0
  117. package/dist/tools/calendar.js +68 -0
  118. package/dist/tools/calendar.js.map +1 -0
  119. package/dist/tools/collaborators.d.ts +21 -0
  120. package/dist/tools/collaborators.d.ts.map +1 -0
  121. package/dist/tools/collaborators.js +381 -0
  122. package/dist/tools/collaborators.js.map +1 -0
  123. package/dist/tools/comparisons.d.ts +22 -0
  124. package/dist/tools/comparisons.d.ts.map +1 -0
  125. package/dist/tools/comparisons.js +80 -0
  126. package/dist/tools/comparisons.js.map +1 -0
  127. package/dist/tools/credits.d.ts +39 -0
  128. package/dist/tools/credits.d.ts.map +1 -0
  129. package/dist/tools/credits.js +541 -0
  130. package/dist/tools/credits.js.map +1 -0
  131. package/dist/tools/custody-hints.d.ts +16 -0
  132. package/dist/tools/custody-hints.d.ts.map +1 -0
  133. package/dist/tools/custody-hints.js +27 -0
  134. package/dist/tools/custody-hints.js.map +1 -0
  135. package/dist/tools/custody.d.ts +38 -0
  136. package/dist/tools/custody.d.ts.map +1 -0
  137. package/dist/tools/custody.js +281 -0
  138. package/dist/tools/custody.js.map +1 -0
  139. package/dist/tools/dashboard.d.ts +22 -0
  140. package/dist/tools/dashboard.d.ts.map +1 -0
  141. package/dist/tools/dashboard.js +258 -0
  142. package/dist/tools/dashboard.js.map +1 -0
  143. package/dist/tools/directory.d.ts +15 -0
  144. package/dist/tools/directory.d.ts.map +1 -0
  145. package/dist/tools/directory.js +107 -0
  146. package/dist/tools/directory.js.map +1 -0
  147. package/dist/tools/discovery.d.ts +49 -0
  148. package/dist/tools/discovery.d.ts.map +1 -0
  149. package/dist/tools/discovery.js +851 -0
  150. package/dist/tools/discovery.js.map +1 -0
  151. package/dist/tools/disputes.d.ts +18 -0
  152. package/dist/tools/disputes.d.ts.map +1 -0
  153. package/dist/tools/disputes.js +62 -0
  154. package/dist/tools/disputes.js.map +1 -0
  155. package/dist/tools/documents.d.ts +15 -0
  156. package/dist/tools/documents.d.ts.map +1 -0
  157. package/dist/tools/documents.js +37 -0
  158. package/dist/tools/documents.js.map +1 -0
  159. package/dist/tools/duplicates.d.ts +25 -0
  160. package/dist/tools/duplicates.d.ts.map +1 -0
  161. package/dist/tools/duplicates.js +108 -0
  162. package/dist/tools/duplicates.js.map +1 -0
  163. package/dist/tools/enrichment.d.ts +56 -0
  164. package/dist/tools/enrichment.d.ts.map +1 -0
  165. package/dist/tools/enrichment.js +616 -0
  166. package/dist/tools/enrichment.js.map +1 -0
  167. package/dist/tools/exports.d.ts +19 -0
  168. package/dist/tools/exports.d.ts.map +1 -0
  169. package/dist/tools/exports.js +184 -0
  170. package/dist/tools/exports.js.map +1 -0
  171. package/dist/tools/feedback.d.ts +22 -0
  172. package/dist/tools/feedback.d.ts.map +1 -0
  173. package/dist/tools/feedback.js +100 -0
  174. package/dist/tools/feedback.js.map +1 -0
  175. package/dist/tools/forbidden-keywords.d.ts +62 -0
  176. package/dist/tools/forbidden-keywords.d.ts.map +1 -0
  177. package/dist/tools/forbidden-keywords.js +99 -0
  178. package/dist/tools/forbidden-keywords.js.map +1 -0
  179. package/dist/tools/gap-hints.d.ts +53 -0
  180. package/dist/tools/gap-hints.d.ts.map +1 -0
  181. package/dist/tools/gap-hints.js +245 -0
  182. package/dist/tools/gap-hints.js.map +1 -0
  183. package/dist/tools/groups.d.ts +29 -0
  184. package/dist/tools/groups.d.ts.map +1 -0
  185. package/dist/tools/groups.js +186 -0
  186. package/dist/tools/groups.js.map +1 -0
  187. package/dist/tools/import-documents.d.ts +21 -0
  188. package/dist/tools/import-documents.d.ts.map +1 -0
  189. package/dist/tools/import-documents.js +206 -0
  190. package/dist/tools/import-documents.js.map +1 -0
  191. package/dist/tools/import.d.ts +31 -0
  192. package/dist/tools/import.d.ts.map +1 -0
  193. package/dist/tools/import.js +610 -0
  194. package/dist/tools/import.js.map +1 -0
  195. package/dist/tools/index.d.ts +293 -0
  196. package/dist/tools/index.d.ts.map +1 -0
  197. package/dist/tools/index.js +1182 -0
  198. package/dist/tools/index.js.map +1 -0
  199. package/dist/tools/integrations.d.ts +19 -0
  200. package/dist/tools/integrations.d.ts.map +1 -0
  201. package/dist/tools/integrations.js +120 -0
  202. package/dist/tools/integrations.js.map +1 -0
  203. package/dist/tools/labels.d.ts +20 -0
  204. package/dist/tools/labels.d.ts.map +1 -0
  205. package/dist/tools/labels.js +48 -0
  206. package/dist/tools/labels.js.map +1 -0
  207. package/dist/tools/licensing.d.ts +40 -0
  208. package/dist/tools/licensing.d.ts.map +1 -0
  209. package/dist/tools/licensing.js +436 -0
  210. package/dist/tools/licensing.js.map +1 -0
  211. package/dist/tools/memory.d.ts +21 -0
  212. package/dist/tools/memory.d.ts.map +1 -0
  213. package/dist/tools/memory.js +120 -0
  214. package/dist/tools/memory.js.map +1 -0
  215. package/dist/tools/metadata.d.ts +15 -0
  216. package/dist/tools/metadata.d.ts.map +1 -0
  217. package/dist/tools/metadata.js +1532 -0
  218. package/dist/tools/metadata.js.map +1 -0
  219. package/dist/tools/multimedia.d.ts +19 -0
  220. package/dist/tools/multimedia.d.ts.map +1 -0
  221. package/dist/tools/multimedia.js +371 -0
  222. package/dist/tools/multimedia.js.map +1 -0
  223. package/dist/tools/my-reported-issues.d.ts +32 -0
  224. package/dist/tools/my-reported-issues.d.ts.map +1 -0
  225. package/dist/tools/my-reported-issues.js +123 -0
  226. package/dist/tools/my-reported-issues.js.map +1 -0
  227. package/dist/tools/notes.d.ts +21 -0
  228. package/dist/tools/notes.d.ts.map +1 -0
  229. package/dist/tools/notes.js +115 -0
  230. package/dist/tools/notes.js.map +1 -0
  231. package/dist/tools/notifications.d.ts +28 -0
  232. package/dist/tools/notifications.d.ts.map +1 -0
  233. package/dist/tools/notifications.js +417 -0
  234. package/dist/tools/notifications.js.map +1 -0
  235. package/dist/tools/onboarding.d.ts +24 -0
  236. package/dist/tools/onboarding.d.ts.map +1 -0
  237. package/dist/tools/onboarding.js +81 -0
  238. package/dist/tools/onboarding.js.map +1 -0
  239. package/dist/tools/people.d.ts +254 -0
  240. package/dist/tools/people.d.ts.map +1 -0
  241. package/dist/tools/people.js +481 -0
  242. package/dist/tools/people.js.map +1 -0
  243. package/dist/tools/projects.d.ts +20 -0
  244. package/dist/tools/projects.d.ts.map +1 -0
  245. package/dist/tools/projects.js +316 -0
  246. package/dist/tools/projects.js.map +1 -0
  247. package/dist/tools/public-filter.d.ts +43 -0
  248. package/dist/tools/public-filter.d.ts.map +1 -0
  249. package/dist/tools/public-filter.js +356 -0
  250. package/dist/tools/public-filter.js.map +1 -0
  251. package/dist/tools/publishers.d.ts +30 -0
  252. package/dist/tools/publishers.d.ts.map +1 -0
  253. package/dist/tools/publishers.js +105 -0
  254. package/dist/tools/publishers.js.map +1 -0
  255. package/dist/tools/purchases.d.ts +27 -0
  256. package/dist/tools/purchases.d.ts.map +1 -0
  257. package/dist/tools/purchases.js +9 -0
  258. package/dist/tools/purchases.js.map +1 -0
  259. package/dist/tools/recording-attribution-hints.d.ts +24 -0
  260. package/dist/tools/recording-attribution-hints.d.ts.map +1 -0
  261. package/dist/tools/recording-attribution-hints.js +27 -0
  262. package/dist/tools/recording-attribution-hints.js.map +1 -0
  263. package/dist/tools/recordings.d.ts +96 -0
  264. package/dist/tools/recordings.d.ts.map +1 -0
  265. package/dist/tools/recordings.js +564 -0
  266. package/dist/tools/recordings.js.map +1 -0
  267. package/dist/tools/recovery-hints.d.ts +40 -0
  268. package/dist/tools/recovery-hints.d.ts.map +1 -0
  269. package/dist/tools/recovery-hints.js +827 -0
  270. package/dist/tools/recovery-hints.js.map +1 -0
  271. package/dist/tools/release-rich.d.ts +31 -0
  272. package/dist/tools/release-rich.d.ts.map +1 -0
  273. package/dist/tools/release-rich.js +245 -0
  274. package/dist/tools/release-rich.js.map +1 -0
  275. package/dist/tools/releases.d.ts +36 -0
  276. package/dist/tools/releases.d.ts.map +1 -0
  277. package/dist/tools/releases.js +649 -0
  278. package/dist/tools/releases.js.map +1 -0
  279. package/dist/tools/report-issue.d.ts +21 -0
  280. package/dist/tools/report-issue.d.ts.map +1 -0
  281. package/dist/tools/report-issue.js +101 -0
  282. package/dist/tools/report-issue.js.map +1 -0
  283. package/dist/tools/royalties.d.ts +23 -0
  284. package/dist/tools/royalties.d.ts.map +1 -0
  285. package/dist/tools/royalties.js +262 -0
  286. package/dist/tools/royalties.js.map +1 -0
  287. package/dist/tools/search.d.ts +30 -0
  288. package/dist/tools/search.d.ts.map +1 -0
  289. package/dist/tools/search.js +115 -0
  290. package/dist/tools/search.js.map +1 -0
  291. package/dist/tools/send.d.ts +17 -0
  292. package/dist/tools/send.d.ts.map +1 -0
  293. package/dist/tools/send.js +188 -0
  294. package/dist/tools/send.js.map +1 -0
  295. package/dist/tools/sessions.d.ts +18 -0
  296. package/dist/tools/sessions.d.ts.map +1 -0
  297. package/dist/tools/sessions.js +153 -0
  298. package/dist/tools/sessions.js.map +1 -0
  299. package/dist/tools/settings.d.ts +23 -0
  300. package/dist/tools/settings.d.ts.map +1 -0
  301. package/dist/tools/settings.js +365 -0
  302. package/dist/tools/settings.js.map +1 -0
  303. package/dist/tools/share-links.d.ts +22 -0
  304. package/dist/tools/share-links.d.ts.map +1 -0
  305. package/dist/tools/share-links.js +188 -0
  306. package/dist/tools/share-links.js.map +1 -0
  307. package/dist/tools/signup.d.ts +26 -0
  308. package/dist/tools/signup.d.ts.map +1 -0
  309. package/dist/tools/signup.js +266 -0
  310. package/dist/tools/signup.js.map +1 -0
  311. package/dist/tools/split-sheets.d.ts +25 -0
  312. package/dist/tools/split-sheets.d.ts.map +1 -0
  313. package/dist/tools/split-sheets.js +309 -0
  314. package/dist/tools/split-sheets.js.map +1 -0
  315. package/dist/tools/storage-config.d.ts +13 -0
  316. package/dist/tools/storage-config.d.ts.map +1 -0
  317. package/dist/tools/storage-config.js +245 -0
  318. package/dist/tools/storage-config.js.map +1 -0
  319. package/dist/tools/subscription.d.ts +60 -0
  320. package/dist/tools/subscription.d.ts.map +1 -0
  321. package/dist/tools/subscription.js +440 -0
  322. package/dist/tools/subscription.js.map +1 -0
  323. package/dist/tools/sync-placements.d.ts +31 -0
  324. package/dist/tools/sync-placements.d.ts.map +1 -0
  325. package/dist/tools/sync-placements.js +431 -0
  326. package/dist/tools/sync-placements.js.map +1 -0
  327. package/dist/tools/team.d.ts +22 -0
  328. package/dist/tools/team.d.ts.map +1 -0
  329. package/dist/tools/team.js +144 -0
  330. package/dist/tools/team.js.map +1 -0
  331. package/dist/tools/telegram.d.ts +21 -0
  332. package/dist/tools/telegram.d.ts.map +1 -0
  333. package/dist/tools/telegram.js +144 -0
  334. package/dist/tools/telegram.js.map +1 -0
  335. package/dist/tools/uploads.d.ts +17 -0
  336. package/dist/tools/uploads.d.ts.map +1 -0
  337. package/dist/tools/uploads.js +165 -0
  338. package/dist/tools/uploads.js.map +1 -0
  339. package/dist/tools/works.d.ts +71 -0
  340. package/dist/tools/works.d.ts.map +1 -0
  341. package/dist/tools/works.js +694 -0
  342. package/dist/tools/works.js.map +1 -0
  343. package/package.json +54 -0
  344. package/scripts/build-required-schemas.ts +233 -0
  345. package/scripts/bundle-apps.ts +61 -0
  346. package/scripts/refresh-schema-mirror.ts +182 -0
  347. package/server.json +20 -0
@@ -0,0 +1,356 @@
1
+ // Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
2
+ import { PUBLIC_FORBIDDEN_KEYWORDS_FULL } from "./forbidden-keywords.js";
3
+ // ── Class C: explicit exclude (Phase 1: empty per ADR-202 sign-off 2026-04-27) ──
4
+ const CLASS_C_EXCLUDE = new Set([]);
5
+ // ── Class B: include name, sanitized description ──
6
+ // The source-of-truth descriptions in the per-domain tool files name third-party
7
+ // services (MLC / ISNI / MusicBrainz / Spotify / YouTube / Discogs / ACRCloud /
8
+ // Librosa / Groq) or internal architecture (cascade engine / Tier A/B / identity
9
+ // graph / CAR scoring). The strings here are rewrites that preserve capability
10
+ // signal without leaking the algorithm or vendor binding.
11
+ const CLASS_B_SANITIZED = {
12
+ // Reclassified from Class C → B per 2026-04-27 sign-off
13
+ pica_graph_traverse: "Traverse identifier-based connections from any external identifier. Returns connected works, recordings, and people across the catalog.",
14
+ pica_run_work_cascade: "Re-run metadata enrichment for a work to fill gaps from external sources.",
15
+ pica_run_person_cascade: "Re-run metadata enrichment for a person to fill gaps from external identity sources.",
16
+ pica_cascade_health: "Snapshot of recent metadata-enrichment activity — outcome counts and recent failures.",
17
+ pica_export_catalog_asset_report: "Generate a catalog asset report — a structured summary of catalog completeness and provenance.",
18
+ pica_car_preview: "Preview a catalog asset report inline before generating the full export.",
19
+ // Original Class B
20
+ pica_resolve_work: "Resolve a work against external metadata sources. Returns structured proposals and applied updates.",
21
+ pica_resolve_person: "Resolve a person against external identity sources. Returns structured proposals and applied updates.",
22
+ pica_resolve_recording: "Resolve a recording against external metadata sources. Returns structured proposals and applied updates.",
23
+ pica_enrichment_candidates: "Find catalog entries that are good candidates for metadata enrichment.",
24
+ pica_enrichment_compare: "Compare what external sources say about a catalog entry, side by side.",
25
+ pica_registrations_compare: "Compare a work's registration status across society and platform records.",
26
+ pica_enrichment_propose: "Propose a metadata enrichment from agent research; goes to a review queue.",
27
+ pica_enrichment_proposals_list: "List pending metadata-enrichment proposals awaiting review.",
28
+ pica_enrichment_proposal_apply: "Apply a previously proposed metadata enrichment.",
29
+ pica_enrichment_proposal_reject: "Reject a previously proposed metadata enrichment.",
30
+ pica_audio_analyze: "Analyze an audio file for tempo, key, energy, and lyric transcription.",
31
+ pica_audio_identify: "Identify a track via audio fingerprinting. Returns matched metadata with confidence score.",
32
+ pica_documents_analyse: "Analyse a document with AI. Extracts structured fields from invoices, statements, contracts.",
33
+ pica_import_streaming_link: "Import a work or recording from a public streaming-service link.",
34
+ pica_import_from_spotify: "Import a work or recording from a Spotify link.",
35
+ pica_import_youtube_link: "Import a recording from a YouTube link.",
36
+ pica_multimedia_import_url: "Import multimedia from a public URL.",
37
+ pica_multimedia_link_youtube: "Link a YouTube video to a work.",
38
+ pica_ingest_statement: "Ingest a royalty statement document into the catalog.",
39
+ };
40
+ // ── Class A: explicit allowlist, descriptions ship as-is ──
41
+ // Every Class A tool is enumerated here. New tools added to ToolRegistry must
42
+ // also be added to this list (or to CLASS_B_SANITIZED / CLASS_C_EXCLUDE) to
43
+ // appear on the public surface — default-exclude.
44
+ const CLASS_A_ALLOWLIST = new Set([
45
+ // Works
46
+ "pica_works_query",
47
+ "pica_works_inspect",
48
+ "pica_works_create",
49
+ "pica_works_update",
50
+ "pica_works_delete",
51
+ "pica_works_verify",
52
+ "pica_works_bulk_delete",
53
+ "pica_works_bulk_update",
54
+ // People
55
+ "pica_people_query",
56
+ "pica_people_inspect",
57
+ "pica_people_create",
58
+ "pica_people_update",
59
+ "pica_people_delete",
60
+ "pica_people_bulk_update_roles",
61
+ // Recordings
62
+ "pica_recordings_query",
63
+ "pica_recordings_inspect",
64
+ "pica_recordings_create",
65
+ "pica_recordings_update",
66
+ "pica_recordings_delete",
67
+ // Credits (work_credits)
68
+ "pica_credits_list",
69
+ "pica_credits_update",
70
+ // Agreements
71
+ "pica_agreements_query",
72
+ "pica_agreements_inspect",
73
+ "pica_agreements_create",
74
+ "pica_agreements_update",
75
+ "pica_agreements_delete",
76
+ "pica_agreements_link_work",
77
+ // Agreement types & templates
78
+ "pica_agreement_types_query",
79
+ "pica_agreement_types_inspect",
80
+ "pica_agreement_types_create",
81
+ "pica_agreement_types_update",
82
+ "pica_agreement_types_delete",
83
+ "pica_agreement_templates_render",
84
+ "pica_agreement_templates_duplicate",
85
+ "pica_agreement_templates_set_default",
86
+ // Splits
87
+ "pica_split_sheet_list",
88
+ "pica_split_sheet_get",
89
+ "pica_split_sheet_generate",
90
+ "pica_split_sheet_send",
91
+ "pica_recording_splits_list",
92
+ "pica_recording_splits_create",
93
+ "pica_recording_splits_verify",
94
+ // Royalties & statements
95
+ "pica_royalties_list",
96
+ "pica_royalties_get",
97
+ "pica_royalties_summary",
98
+ "pica_statements_list",
99
+ "pica_statements_get",
100
+ // Disputes
101
+ "pica_disputes_list",
102
+ // Custody (chain/ trade-secret service backs these — names + read-side
103
+ // descriptions are publicly used product language; algorithm stays sealed)
104
+ "pica_custody_list",
105
+ "pica_custody_history",
106
+ "pica_custody_claim",
107
+ "pica_custody_respond",
108
+ "pica_custody_resolve_pending",
109
+ "pica_custody_reconcile",
110
+ // Search & discovery substrate
111
+ "pica_search_all",
112
+ "pica_catalog_stats",
113
+ "pica_search_for_sync",
114
+ "pica_submit_license_enquiry",
115
+ "pica_claim_credit",
116
+ "pica_claim_custody",
117
+ "pica_claim_artist",
118
+ "pica_discoveries_query",
119
+ "pica_discoveries_review",
120
+ // Dashboard
121
+ "pica_dashboard_attention",
122
+ "pica_dashboard_briefing",
123
+ "pica_dashboard_pulse",
124
+ // MCP Apps cards (UI-only render, safe)
125
+ "pica_upload",
126
+ "pica_download",
127
+ // Audio (analyze + identify are Class B; the rest are A)
128
+ "pica_audio_query",
129
+ "pica_audio_inspect",
130
+ "pica_audio_presigned_upload",
131
+ "pica_audio_complete_upload",
132
+ // Multimedia (import_url + link_youtube are Class B; the rest are A)
133
+ "pica_multimedia_search",
134
+ "pica_multimedia_create",
135
+ "pica_multimedia_link_work",
136
+ // Uploads
137
+ "pica_upload_file",
138
+ "pica_upload_complete",
139
+ // Exports (CAR is Class B; the rest are A)
140
+ "pica_export_catalog_csv",
141
+ "pica_export_song_registration",
142
+ "pica_export_industry_ready",
143
+ "pica_export_ai_consent",
144
+ // Calendar
145
+ "pica_calendar_events",
146
+ // Duplicates
147
+ "pica_find_duplicates",
148
+ "pica_merge_duplicates",
149
+ // Projects
150
+ "pica_projects_list",
151
+ "pica_projects_get",
152
+ "pica_projects_create",
153
+ "pica_projects_update",
154
+ "pica_projects_delete",
155
+ "pica_projects_attach_works",
156
+ // Releases
157
+ "pica_releases_list",
158
+ "pica_releases_get",
159
+ "pica_releases_create",
160
+ "pica_releases_update",
161
+ "pica_releases_attach_track",
162
+ "pica_releases_list_tracks",
163
+ "pica_releases_detach_track",
164
+ "pica_releases_reorder_tracks",
165
+ "pica_releases_attach_recording_with_work",
166
+ "pica_releases_bulk_attach_tracks",
167
+ "pica_releases_move_track",
168
+ "pica_releases_attach_track_by_identifier",
169
+ "pica_releases_create_with_tracks",
170
+ "pica_releases_completeness_check",
171
+ // ADR-208 Phase 3 Primitive D — rich render
172
+ "pica_release_show",
173
+ // Sessions
174
+ "pica_sessions_list",
175
+ "pica_sessions_get",
176
+ "pica_sessions_create",
177
+ "pica_sessions_types",
178
+ // Notes
179
+ "pica_notes_list",
180
+ "pica_notes_get",
181
+ "pica_notes_create",
182
+ "pica_notes_delete",
183
+ // Physical assets
184
+ "pica_physical_assets_query",
185
+ "pica_physical_assets_inspect",
186
+ "pica_physical_assets_create",
187
+ "pica_physical_assets_update",
188
+ "pica_physical_assets_delete",
189
+ "pica_physical_assets_stats",
190
+ "pica_physical_assets_export",
191
+ "pica_physical_assets_link_work",
192
+ "pica_physical_assets_link_recording",
193
+ "pica_physical_assets_unlink_work",
194
+ "pica_physical_assets_unlink_recording",
195
+ // Analytics
196
+ "pica_carbon_footprint",
197
+ "pica_carbon_live",
198
+ "pica_provenance_stats",
199
+ "pica_provenance_work",
200
+ "pica_provenance_certificate",
201
+ "pica_catalog_diligence",
202
+ // Import (streaming/spotify/youtube/ingest_statement are Class B; the rest are A)
203
+ "pica_import_analyze",
204
+ "pica_import_validate",
205
+ "pica_import_execute",
206
+ "pica_import_fields",
207
+ "pica_import_template",
208
+ "pica_import_documents_query",
209
+ "pica_import_documents_inspect",
210
+ // Notifications
211
+ "pica_notifications_list",
212
+ "pica_notify_person",
213
+ "pica_notifications_mark_read",
214
+ // Collaborators
215
+ "pica_collaborators_invite",
216
+ "pica_collaborators_invites_list",
217
+ "pica_collaborators_invite_resend",
218
+ "pica_collaborators_incoming_list",
219
+ "pica_collaborators_accept",
220
+ "pica_collaborators_dispute",
221
+ "pica_collaborators_invite_bulk",
222
+ // Send hub
223
+ "pica_send_message",
224
+ "pica_send_query",
225
+ "pica_send_resend",
226
+ // Share links
227
+ "pica_share_links_list",
228
+ "pica_share_links_create",
229
+ // Telegram
230
+ "pica_telegram_status",
231
+ "pica_telegram_connect",
232
+ "pica_notify_user",
233
+ "pica_notify_user_at",
234
+ "pica_notify_user_list_pending",
235
+ "pica_notify_user_cancel",
236
+ // Publishers / labels
237
+ "pica_publishers_query",
238
+ "pica_publishers_create",
239
+ "pica_labels_query",
240
+ // Licensing
241
+ "pica_list_license_enquiries",
242
+ "pica_get_license_enquiry",
243
+ "pica_update_license_enquiry_status",
244
+ // Team
245
+ "pica_team_list",
246
+ "pica_team_get",
247
+ "pica_team_invite",
248
+ "pica_team_update_role",
249
+ "pica_team_remove",
250
+ // Audit
251
+ "pica_audit_list",
252
+ // Memory
253
+ "pica_memory_list",
254
+ "pica_memory_search",
255
+ "pica_memory_save",
256
+ "pica_memory_delete",
257
+ // Settings
258
+ "pica_storage_status",
259
+ "pica_organisation_profile",
260
+ "pica_user_profile",
261
+ "pica_directory_settings",
262
+ "pica_integrations_status",
263
+ "pica_get_privacy_settings",
264
+ "pica_update_privacy_settings",
265
+ "pica_export_my_data",
266
+ "pica_delete_my_account",
267
+ "pica_update_my_identity",
268
+ "pica_update_organisation_profile",
269
+ // Feedback / report-issue
270
+ "pica_submit_feedback",
271
+ "pica_report_issue",
272
+ "pica_my_reported_issues",
273
+ // Agent identity
274
+ "pica_create_agent_identity",
275
+ "pica_issue_agent_grant",
276
+ "pica_list_my_agent_grants",
277
+ "pica_revoke_agent_grant",
278
+ "pica_get_agent_activity",
279
+ ]);
280
+ // ── Meta-tools — never on the public surface ──
281
+ // pica_discover / pica_tool_details / pica_execute only make sense once
282
+ // authenticated; pica_sign_in / pica_sign_out are stdio-lobby tools.
283
+ const META_TOOL_EXCLUDE = new Set([
284
+ "pica_discover",
285
+ "pica_tool_details",
286
+ "pica_execute",
287
+ "pica_sign_in",
288
+ "pica_sign_out",
289
+ ]);
290
+ // ── Forbidden keywords (AC-4 in ADR-202) ──
291
+ // Source-of-truth list lives at `./forbidden-keywords.ts` and is shared
292
+ // with the `scripts/lint-mcp-tools.ts` description-hygiene check
293
+ // (ADR-180 Rule 9, 2026-05-02 amendment).
294
+ //
295
+ // The lobby surface uses the full union (PUBLIC ∪ AUTHENTICATED) — every
296
+ // vendor / data-source / infra / library / concept term that's banned for
297
+ // any audience is also banned at the unauthenticated boundary.
298
+ const FORBIDDEN_KEYWORD_FRAGMENTS = PUBLIC_FORBIDDEN_KEYWORDS_FULL;
299
+ /**
300
+ * Apply ADR-202 filtering to a list of ToolDefinitions.
301
+ *
302
+ * Order of operations:
303
+ * 1. Drop META_TOOL_EXCLUDE
304
+ * 2. Drop CLASS_C_EXCLUDE
305
+ * 3. Drop anything not in CLASS_A_ALLOWLIST and not in CLASS_B_SANITIZED
306
+ * (default-exclude)
307
+ * 4. If readOnlyOnly: drop tools whose risk metadata is not "safe"
308
+ * 5. Replace description for CLASS_B_SANITIZED entries
309
+ * 6. Strip executor reference (return PublicToolDefinition only)
310
+ */
311
+ export function filterToolsForPublicDiscovery(tools, options) {
312
+ const readOnlyOnly = options.readOnlyOnly ?? true;
313
+ const result = [];
314
+ for (const tool of tools) {
315
+ if (META_TOOL_EXCLUDE.has(tool.name))
316
+ continue;
317
+ if (CLASS_C_EXCLUDE.has(tool.name))
318
+ continue;
319
+ const isB = tool.name in CLASS_B_SANITIZED;
320
+ const isA = CLASS_A_ALLOWLIST.has(tool.name);
321
+ if (!isA && !isB)
322
+ continue; // default-exclude
323
+ if (readOnlyOnly) {
324
+ const meta = options.metadataLookup(tool.name);
325
+ if (meta?.risk !== "safe")
326
+ continue;
327
+ }
328
+ const description = isB ? CLASS_B_SANITIZED[tool.name] : tool.description;
329
+ result.push({
330
+ name: tool.name,
331
+ description,
332
+ inputSchema: tool.inputSchema,
333
+ annotations: tool.annotations,
334
+ });
335
+ }
336
+ return result;
337
+ }
338
+ /** Returns the first forbidden keyword found in a string, or null. */
339
+ export function findForbiddenKeyword(text) {
340
+ const lower = text.toLowerCase();
341
+ for (const fragment of FORBIDDEN_KEYWORD_FRAGMENTS) {
342
+ if (lower.includes(fragment.toLowerCase()))
343
+ return fragment;
344
+ }
345
+ return null;
346
+ }
347
+ // Internal exports for test introspection only — consumers use
348
+ // filterToolsForPublicDiscovery + findForbiddenKeyword.
349
+ export const _internal = {
350
+ CLASS_A_ALLOWLIST,
351
+ CLASS_B_SANITIZED,
352
+ CLASS_C_EXCLUDE,
353
+ META_TOOL_EXCLUDE,
354
+ FORBIDDEN_KEYWORD_FRAGMENTS,
355
+ };
356
+ //# sourceMappingURL=public-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-filter.js","sourceRoot":"","sources":["../../src/tools/public-filter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Publishers Tools - MCP tools for querying and creating publisher records.
3
+ *
4
+ * ADR-174 Phase 2 item 22: `pica_publishers_create` is stdio-only (no
5
+ * mcp-server-business counterpart) so the schema lives inline rather than
6
+ * going through `@withpica/mcp-utils/write-schemas`. The route-layer
7
+ * allow-list at `lib/services/publishers-write-constants.ts` is the
8
+ * authoritative enforcement boundary; this schema is the agent-facing
9
+ * contract and surfaces the same shape so the tool advertises every
10
+ * writable column on `global_publishers`.
11
+ *
12
+ * Pre-slice the schema accepted `{ name, ipi }` and every other DB
13
+ * column was invisible to agents. Post-slice all 8 audit-row-22
14
+ * Add-candidates are exposed, and the `ipi → ipi_number` rename is
15
+ * explicit (the route returns a PHANTOM_FIELD error with a rename hint
16
+ * if `ipi` is still sent).
17
+ */
18
+ import { PicaClient } from "@withpica/mcp-sdk";
19
+ import { ToolDefinition, ToolExecutor } from "./index.js";
20
+ export declare class PublishersTools {
21
+ private pica;
22
+ constructor(pica: PicaClient);
23
+ getTools(): Array<{
24
+ definition: ToolDefinition;
25
+ executor: ToolExecutor;
26
+ }>;
27
+ private queryPublishers;
28
+ private createPublisher;
29
+ }
30
+ //# sourceMappingURL=publishers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publishers.d.ts","sourceRoot":"","sources":["../../src/tools/publishers.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAc,MAAM,YAAY,CAAC;AAGtE,qBAAa,eAAe;IAC1B,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;YA0F3D,eAAe;YAaf,eAAe;CAQ9B"}
@@ -0,0 +1,105 @@
1
+ // Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
2
+ import { formatStructuredList, formatSuccess } from "@withpica/mcp-utils";
3
+ export class PublishersTools {
4
+ pica;
5
+ constructor(pica) {
6
+ this.pica = pica;
7
+ }
8
+ getTools() {
9
+ return [
10
+ {
11
+ definition: {
12
+ name: "pica_publishers_query",
13
+ description: "Find publishers by name or IPI. Use before setting publisher on credits. " +
14
+ "→ then: pica_credits_update (link publisher to a credit)",
15
+ workflows: "infrastructure",
16
+ inputSchema: {
17
+ type: "object",
18
+ properties: {
19
+ query: {
20
+ type: "string",
21
+ description: "Search by publisher name or IPI",
22
+ },
23
+ limit: {
24
+ type: "number",
25
+ description: "Max results (default: 50)",
26
+ },
27
+ },
28
+ },
29
+ },
30
+ executor: this.queryPublishers.bind(this),
31
+ },
32
+ {
33
+ definition: {
34
+ name: "pica_publishers_create",
35
+ description: "Create (or fetch existing) publisher in the catalog-wide " +
36
+ "`global_publishers` table. Idempotent by ipi_number — if a " +
37
+ "publisher with the same IPI already exists, returns the existing " +
38
+ "row. Check `pica_publishers_query` first to avoid duplicates and " +
39
+ "to resolve parent_publisher_id.",
40
+ workflows: "infrastructure",
41
+ inputSchema: {
42
+ type: "object",
43
+ properties: {
44
+ name: { type: "string", description: "Publisher name." },
45
+ ipi_number: {
46
+ type: "string",
47
+ description: "Publisher IPI number (9-11 digits; normalised to 11 with " +
48
+ "leading zero-padding). Required.",
49
+ },
50
+ legal_name: {
51
+ type: "string",
52
+ description: "Legal entity name (e.g. 'Example Publishing Ltd.') — optional.",
53
+ },
54
+ country: {
55
+ type: "string",
56
+ description: "ISO country code (e.g. 'GB', 'US').",
57
+ },
58
+ isni: {
59
+ type: "string",
60
+ description: "ISNI identifier (16-character alphanumeric) if the publisher has one.",
61
+ },
62
+ publisher_type: {
63
+ type: "string",
64
+ description: "Category label (e.g. 'major', 'indie', 'admin', 'self_published'). Freeform — no backend CHECK.",
65
+ },
66
+ wikidata_id: {
67
+ type: "string",
68
+ description: "Wikidata Q-number (e.g. 'Q123456').",
69
+ },
70
+ parent_publisher_id: {
71
+ type: "string",
72
+ description: "UUID of parent publisher for subsidiary/admin relationships. FK → global_publishers.id. Use `pica_publishers_query` to find the parent's ID before passing it here; the route returns FK_NOT_FOUND if the UUID does not exist.",
73
+ },
74
+ founded_date: {
75
+ type: "string",
76
+ description: "Founding date (YYYY-MM-DD).",
77
+ },
78
+ headquarters: {
79
+ type: "string",
80
+ description: "Freeform location (e.g. 'London, UK').",
81
+ },
82
+ },
83
+ required: ["name", "ipi_number"],
84
+ },
85
+ },
86
+ executor: this.createPublisher.bind(this),
87
+ },
88
+ ];
89
+ }
90
+ async queryPublishers(args) {
91
+ const result = await this.pica.publishers.list({
92
+ query: args.query,
93
+ limit: args.limit || 50,
94
+ });
95
+ const publishers = Array.isArray(result) ? result : result?.data || [];
96
+ return formatStructuredList(publishers, "publisher", {
97
+ total: publishers.length,
98
+ });
99
+ }
100
+ async createPublisher(args) {
101
+ const result = await this.pica.publishers.create(args);
102
+ return formatSuccess("Publisher created", result);
103
+ }
104
+ }
105
+ //# sourceMappingURL=publishers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publishers.js","sourceRoot":"","sources":["../../src/tools/publishers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Purchases Tools — intentionally empty.
3
+ *
4
+ * `pica_credits_purchase` was removed from the MCP surface 2026-04-22 (see
5
+ * docs/MCP_REFINEMENT_LOG.md entry B-001). The underlying SDK method,
6
+ * `POST /api/admin/credits/purchase` route, and `createCreditPurchaseSession`
7
+ * were retired 2026-05-06 with the move to capacity-tier subscriptions
8
+ * (ADR-205). The Stripe webhook handler still recognises the legacy
9
+ * `credit_purchase` metadata to award credits if any stale checkout session
10
+ * completes; `creditsService.getPackageById` and `getPackages` are retained
11
+ * for that webhook path plus historical revenue reporting in
12
+ * `app/api/team/finances/overview/route.ts`. Do not delete those helpers
13
+ * even though the active surface looks dead.
14
+ *
15
+ * Kept as a class with an empty `getTools()` so tools/index.ts doesn't need
16
+ * to change imports or wiring — the class is a deliberate tombstone.
17
+ */
18
+ import { PicaClient } from "@withpica/mcp-sdk";
19
+ import { ToolDefinition, ToolExecutor } from "./index.js";
20
+ export declare class PurchasesTools {
21
+ constructor(_pica: PicaClient);
22
+ getTools(): Array<{
23
+ definition: ToolDefinition;
24
+ executor: ToolExecutor;
25
+ }>;
26
+ }
27
+ //# sourceMappingURL=purchases.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"purchases.d.ts","sourceRoot":"","sources":["../../src/tools/purchases.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1D,qBAAa,cAAc;gBAEb,KAAK,EAAE,UAAU;IAE7B,QAAQ,IAAI,KAAK,CAAC;QAAE,UAAU,EAAE,cAAc,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAA;KAAE,CAAC;CAG1E"}
@@ -0,0 +1,9 @@
1
+ // Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
2
+ export class PurchasesTools {
3
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
4
+ constructor(_pica) { }
5
+ getTools() {
6
+ return [];
7
+ }
8
+ }
9
+ //# sourceMappingURL=purchases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"purchases.js","sourceRoot":"","sources":["../../src/tools/purchases.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAuB7D,MAAM,OAAO,cAAc;IACzB,6DAA6D;IAC7D,YAAY,KAAiB,IAAG,CAAC;IAEjC,QAAQ;QACN,OAAO,EAAE,CAAC;IACZ,CAAC;CACF"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * ADR-213 Primitive A — completion hints for pica_recordings_create.
3
+ *
4
+ * Mirror of buildCustodyHints (works-side) for recordings. When a fresh
5
+ * recording is created, three Important-severity hints prompt the rights
6
+ * conversation by default:
7
+ *
8
+ * 1. recording_ownership_unset — fires when ownership_percentage IS NULL.
9
+ * NULL = "not set"; 0 = explicit zero (no hint, user has declared no
10
+ * ownership); 1-100 = already declared.
11
+ * 2. recording_no_credits — always fires (we never know credits from a
12
+ * single fresh row). Points at pica_recording_credits_update.
13
+ * 3. recording_master_unclaimed — fires when ownership_percentage IS NULL.
14
+ * Alternative path to #1 for orgs that want a formal chain claim
15
+ * (label / co-producer scenarios) rather than a flat percentage.
16
+ *
17
+ * Defensive shape — the SDK's `Recording` TS interface does not declare
18
+ * `ownership_percentage`, but the API returns it as JSON pass-through
19
+ * from `recordingsService.create`. Callers pass the raw recording object;
20
+ * we read fields with a typed wrapper.
21
+ */
22
+ import type { CompletionHint } from "@withpica/mcp-utils";
23
+ export declare function buildRecordingAttributionHints(recording: unknown): CompletionHint[];
24
+ //# sourceMappingURL=recording-attribution-hints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recording-attribution-hints.d.ts","sourceRoot":"","sources":["../../src/tools/recording-attribution-hints.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAM1D,wBAAgB,8BAA8B,CAC5C,SAAS,EAAE,OAAO,GACjB,cAAc,EAAE,CAiClB"}
@@ -0,0 +1,27 @@
1
+ // Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
2
+ export function buildRecordingAttributionHints(recording) {
3
+ const r = (recording ?? {});
4
+ const hints = [];
5
+ const ownershipUnset = r.ownership_percentage === null || r.ownership_percentage === undefined;
6
+ if (ownershipUnset) {
7
+ hints.push({
8
+ gap: "recording_ownership_unset",
9
+ severity: "important",
10
+ suggestion: "What % of this recording's master is owned by your org? Call pica_recordings_update with ownership_percentage:N (0-100). Skip if you hold no master stake.",
11
+ });
12
+ }
13
+ hints.push({
14
+ gap: "recording_no_credits",
15
+ severity: "important",
16
+ suggestion: "Who performed on this recording? Add performer / producer / engineer credits via pica_recording_credits_update — one call per credited person. Resolve names to person_id via pica_people_query first.",
17
+ });
18
+ if (ownershipUnset) {
19
+ hints.push({
20
+ gap: "recording_master_unclaimed",
21
+ severity: "important",
22
+ suggestion: "If the master is co-owned (label, co-producer, multi-party), claim a formal chain stake via pica_custody_claim with chain='master' instead of just setting ownership_percentage. Same outcome, richer attribution.",
23
+ });
24
+ }
25
+ return hints;
26
+ }
27
+ //# sourceMappingURL=recording-attribution-hints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recording-attribution-hints.js","sourceRoot":"","sources":["../../src/tools/recording-attribution-hints.ts"],"names":[],"mappings":"AAAA,6DAA6D;AA8B7D,MAAM,UAAU,8BAA8B,CAC5C,SAAkB;IAElB,MAAM,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,CAA6B,CAAC;IACxD,MAAM,KAAK,GAAqB,EAAE,CAAC;IAEnC,MAAM,cAAc,GAClB,CAAC,CAAC,oBAAoB,KAAK,IAAI,IAAI,CAAC,CAAC,oBAAoB,KAAK,SAAS,CAAC;IAE1E,IAAI,cAAc,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC;YACT,GAAG,EAAE,2BAA2B;YAChC,QAAQ,EAAE,WAAW;YACrB,UAAU,EACR,4JAA4J;SAC/J,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC;QACT,GAAG,EAAE,sBAAsB;QAC3B,QAAQ,EAAE,WAAW;QACrB,UAAU,EACR,wMAAwM;KAC3M,CAAC,CAAC;IAEH,IAAI,cAAc,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC;YACT,GAAG,EAAE,4BAA4B;YACjC,QAAQ,EAAE,WAAW;YACrB,UAAU,EACR,oNAAoN;SACvN,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}