@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,851 @@
1
+ // Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
2
+ import { getToolMetadata } from "./metadata.js";
3
+ import { RECOVERY_HINTS } from "./recovery-hints.js";
4
+ const SCHEMA_VERSION = "2026.1";
5
+ /**
6
+ * Hand-maintained category taxonomy for the catalog server.
7
+ * Grouped by natural entity/capability prefix.
8
+ * Cross-server depends_on declarations use "<server-slug>:<category>" format.
9
+ *
10
+ * Exported so `scripts/lint-mcp-tools.ts` can enforce taxonomy completeness
11
+ * (every registered tool ∈ taxonomy ∪ archetype-allowlist) at
12
+ * prepublishOnly time. Sealed after the bug class bit four times — silently
13
+ * for `pica_upload` + `pica_download` since ADR-152, for `pica_submit_feedback`
14
+ * since ADR-184, and again for `pica_report_issue` + `pica_my_reported_issues`
15
+ * (ADR-196 Phase 3) which were the exact failure mode they were designed to
16
+ * catch and so couldn't catch themselves. ~95 further pre-existing violators
17
+ * are grandfathered in `scripts/mcp-tool-lint-baseline.json` for retrofit.
18
+ */
19
+ export const CATEGORIES = {
20
+ works: {
21
+ description: "manage your musical works",
22
+ tools: [
23
+ "pica_works_query",
24
+ "pica_works_inspect",
25
+ "pica_works_create",
26
+ "pica_works_update",
27
+ "pica_works_delete",
28
+ "pica_works_bulk_delete",
29
+ "pica_works_bulk_update",
30
+ "pica_works_verify",
31
+ ],
32
+ depends_on: [],
33
+ },
34
+ people: {
35
+ description: "manage people in your catalog",
36
+ tools: [
37
+ "pica_people_query",
38
+ "pica_people_inspect",
39
+ "pica_people_create",
40
+ "pica_people_update",
41
+ "pica_people_delete",
42
+ "pica_people_bulk_update_roles",
43
+ "pica_group_add_member",
44
+ "pica_group_remove_member",
45
+ "pica_group_list_members",
46
+ "pica_person_list_groups",
47
+ ],
48
+ depends_on: [],
49
+ },
50
+ groups: {
51
+ description: "manage group → member relationships on people (ADR-223)",
52
+ tools: [
53
+ "pica_group_add_member",
54
+ "pica_group_remove_member",
55
+ "pica_group_list_members",
56
+ "pica_person_list_groups",
57
+ ],
58
+ depends_on: [],
59
+ },
60
+ recordings: {
61
+ description: "manage recordings linked to works",
62
+ tools: [
63
+ "pica_recordings_query",
64
+ "pica_recordings_inspect",
65
+ "pica_recordings_create",
66
+ "pica_recordings_update",
67
+ "pica_recordings_delete",
68
+ ],
69
+ depends_on: [],
70
+ },
71
+ credits: {
72
+ description: "manage work credits, contributors, and first-party recording-side production credits",
73
+ tools: [
74
+ "pica_credits_list",
75
+ "pica_credits_update",
76
+ "pica_recording_credits_update",
77
+ ],
78
+ depends_on: [],
79
+ },
80
+ multimedia: {
81
+ description: "manage photos, videos, and media linked to works",
82
+ tools: [
83
+ "pica_multimedia_search",
84
+ "pica_multimedia_create",
85
+ "pica_multimedia_import_url",
86
+ "pica_multimedia_link_youtube",
87
+ "pica_multimedia_link_work",
88
+ ],
89
+ depends_on: [],
90
+ },
91
+ audio: {
92
+ description: "manage and analyze audio files",
93
+ tools: [
94
+ "pica_audio_query",
95
+ "pica_audio_inspect",
96
+ "pica_audio_presigned_upload",
97
+ "pica_audio_complete_upload",
98
+ "pica_audio_analyze",
99
+ "pica_audio_identify",
100
+ ],
101
+ depends_on: [],
102
+ },
103
+ projects: {
104
+ description: "manage albums, EPs, and work groupings",
105
+ tools: [
106
+ "pica_projects_list",
107
+ "pica_projects_get",
108
+ "pica_projects_create",
109
+ "pica_projects_update",
110
+ "pica_projects_delete",
111
+ "pica_projects_attach_works",
112
+ ],
113
+ depends_on: [],
114
+ },
115
+ releases: {
116
+ description: "manage releases with dates, labels, and UPCs",
117
+ tools: [
118
+ "pica_releases_list",
119
+ "pica_releases_get",
120
+ "pica_releases_create",
121
+ "pica_releases_update",
122
+ // ADR-175 workflow tools
123
+ "pica_releases_bulk_attach_tracks",
124
+ "pica_releases_move_track",
125
+ "pica_releases_attach_track_by_identifier",
126
+ "pica_releases_create_with_tracks",
127
+ "pica_releases_completeness_check",
128
+ // Track attach/detach + ordering
129
+ "pica_releases_attach_track",
130
+ "pica_releases_attach_recording_with_work",
131
+ "pica_releases_detach_track",
132
+ "pica_releases_list_tracks",
133
+ "pica_releases_reorder_tracks",
134
+ // ADR-208 Phase 3 Primitive D — rich render
135
+ "pica_release_show",
136
+ ],
137
+ depends_on: [],
138
+ },
139
+ sessions: {
140
+ description: "track work sessions and studio time",
141
+ tools: [
142
+ "pica_sessions_list",
143
+ "pica_sessions_get",
144
+ "pica_sessions_create",
145
+ "pica_sessions_types",
146
+ ],
147
+ depends_on: [],
148
+ },
149
+ notes: {
150
+ description: "create and manage catalog notes",
151
+ tools: [
152
+ "pica_notes_list",
153
+ "pica_notes_get",
154
+ "pica_notes_create",
155
+ "pica_notes_delete",
156
+ ],
157
+ depends_on: [],
158
+ },
159
+ duplicates: {
160
+ description: "detect and merge duplicate records",
161
+ tools: ["pica_find_duplicates", "pica_merge_duplicates"],
162
+ depends_on: [],
163
+ },
164
+ import: {
165
+ description: "import catalog data from files and streaming services",
166
+ tools: [
167
+ "pica_import_fields",
168
+ "pica_import_template",
169
+ "pica_import_analyze",
170
+ "pica_import_validate",
171
+ "pica_import_execute",
172
+ "pica_import_streaming_link",
173
+ "pica_import_from_spotify",
174
+ "pica_import_documents_query",
175
+ "pica_import_documents_inspect",
176
+ "pica_import_youtube_link",
177
+ "pica_ingest_statement",
178
+ ],
179
+ depends_on: [],
180
+ },
181
+ export: {
182
+ description: "export catalog data in various formats",
183
+ tools: [
184
+ "pica_export_catalog_csv",
185
+ "pica_export_song_registration",
186
+ "pica_export_industry_ready",
187
+ "pica_export_catalog_asset_report",
188
+ "pica_export_ai_consent",
189
+ // Interactive download card (ADR-152) — pair with any export tool to
190
+ // deliver the file directly. Lives here rather than in `uploads`
191
+ // because it's the delivery side of the export flow.
192
+ "pica_download",
193
+ ],
194
+ depends_on: [
195
+ "mcp-server-business:agreements",
196
+ "mcp-server-business:splits",
197
+ ],
198
+ },
199
+ search: {
200
+ description: "search across the catalog and discover content",
201
+ tools: [
202
+ "pica_search_all",
203
+ "pica_catalog_stats",
204
+ "pica_graph_traverse",
205
+ "pica_discoveries_query",
206
+ "pica_discoveries_review",
207
+ "pica_claim_credit",
208
+ "pica_claim_custody",
209
+ "pica_claim_artist",
210
+ ],
211
+ depends_on: [],
212
+ },
213
+ analytics: {
214
+ description: "provenance, carbon, and catalog analytics",
215
+ tools: [
216
+ "pica_provenance_stats",
217
+ "pica_provenance_work",
218
+ "pica_provenance_certificate",
219
+ "pica_carbon_footprint",
220
+ "pica_carbon_live",
221
+ "pica_catalog_diligence",
222
+ // Reconciliation cascades + audit log + CAR preview
223
+ "pica_run_person_cascade",
224
+ "pica_run_work_cascade",
225
+ "pica_cascade_health",
226
+ "pica_car_preview",
227
+ "pica_audit_list",
228
+ ],
229
+ depends_on: ["mcp-server-business:agreements"],
230
+ },
231
+ documents: {
232
+ description: "analyse documents with ai",
233
+ tools: ["pica_documents_analyse"],
234
+ depends_on: [],
235
+ },
236
+ calendar: {
237
+ description: "view catalog calendar events",
238
+ tools: ["pica_calendar_events"],
239
+ depends_on: [],
240
+ },
241
+ publishers: {
242
+ description: "look up and create publishers",
243
+ tools: ["pica_publishers_query", "pica_publishers_create"],
244
+ depends_on: [],
245
+ },
246
+ briefing: {
247
+ description: "get your daily catalog briefing and dashboard",
248
+ tools: [
249
+ "pica_dashboard_attention",
250
+ "pica_dashboard_briefing",
251
+ "pica_dashboard_pulse",
252
+ ],
253
+ depends_on: [],
254
+ },
255
+ enrichment: {
256
+ description: "enrich your catalog metadata from external sources",
257
+ tools: [
258
+ // ADR-179 outcome-shaped resolvers own the enrichment surface;
259
+ // the seven per-source tombstones were removed in ADR-154 F13.
260
+ "pica_resolve_work",
261
+ "pica_resolve_person",
262
+ "pica_resolve_recording",
263
+ "pica_enrichment_candidates",
264
+ "pica_enrichment_compare",
265
+ "pica_registrations_compare",
266
+ // Agent-proposed enrichment (ADR-178) routes through review gates
267
+ "pica_enrichment_propose",
268
+ "pica_enrichment_proposal_apply",
269
+ "pica_enrichment_proposal_reject",
270
+ "pica_enrichment_proposals_list",
271
+ ],
272
+ depends_on: [],
273
+ },
274
+ team: {
275
+ description: "manage your team members and roles",
276
+ tools: [
277
+ "pica_team_list",
278
+ "pica_team_get",
279
+ "pica_team_invite",
280
+ "pica_team_update_role",
281
+ "pica_team_remove",
282
+ ],
283
+ depends_on: [],
284
+ },
285
+ feedback: {
286
+ description: "report problems and submit feedback to the PICA team — call proactively when you hit a workflow gap or the user says 'this is broken'",
287
+ tools: [
288
+ // Customer-facing issue + feedback surface (ADR-184 + ADR-196).
289
+ // Listed here so the layered-discovery flow exposes them — without
290
+ // this entry, agents using pica_discover cannot reach the tools and
291
+ // resort to pica_notes_create as the closest match (a real
292
+ // production failure caught 2026-04-25).
293
+ "pica_report_issue",
294
+ "pica_my_reported_issues",
295
+ "pica_submit_feedback",
296
+ ],
297
+ depends_on: [],
298
+ },
299
+ onboarding: {
300
+ description: "acknowledge MCP onboarding for OAuth-arrived users — call after walking the user through identity, security, and intent",
301
+ tools: [
302
+ // Listed so layered-discovery flows expose it; the auth-boundary
303
+ // gate in /api/mcp also unconditionally allows this tool through
304
+ // even when a customer key's scopes wouldn't ordinarily.
305
+ "pica_acknowledge_onboarding",
306
+ ],
307
+ depends_on: [],
308
+ },
309
+ signup: {
310
+ // ADR-211 Phase 1 — agent-discoverable signup verb. Listed so the
311
+ // layered-discovery flow surfaces the unauthenticated entry point;
312
+ // the public mint endpoint at /api/public/onboarding/signup-start
313
+ // enforces rate limits + claim shape, and the lobby tool-registry
314
+ // filter exposes only this tool (alongside pica_sign_in / pica_sign_out
315
+ // per the 2026-04-30 amendment) until the user authenticates.
316
+ description: "create a new withPICA account from inside the agent — for users without a connection key. existing users use pica_sign_in instead.",
317
+ tools: ["pica_signup_start"],
318
+ depends_on: [],
319
+ },
320
+ memory: {
321
+ description: "save and recall workspace memories across sessions",
322
+ tools: [
323
+ "pica_memory_list",
324
+ "pica_memory_search",
325
+ "pica_memory_save",
326
+ "pica_memory_delete",
327
+ ],
328
+ depends_on: [],
329
+ },
330
+ account: {
331
+ // ADR-217 — added pica_storage_configure_start + pica_storage_disconnect
332
+ // alongside the existing read tool so layered-discovery flows surface
333
+ // the full BYOC storage trio in one bucket.
334
+ description: "check storage and integrations; connect your own cloud storage (BYOC) or revert to PICA-managed",
335
+ tools: [
336
+ "pica_storage_status",
337
+ "pica_storage_configure_start",
338
+ "pica_storage_disconnect",
339
+ "pica_integrations_status",
340
+ ],
341
+ depends_on: [],
342
+ },
343
+ subscription: {
344
+ description: "view your billing state, manage your subscription, and pick a tier",
345
+ tools: ["pica_subscription_status", "pica_subscription_manage"],
346
+ depends_on: [],
347
+ },
348
+ profile: {
349
+ description: "manage your user, organisation, and directory profile",
350
+ tools: [
351
+ "pica_user_profile",
352
+ "pica_organisation_profile",
353
+ "pica_directory_settings",
354
+ "pica_update_my_identity",
355
+ "pica_update_organisation_profile",
356
+ ],
357
+ depends_on: [],
358
+ },
359
+ privacy: {
360
+ description: "self-service privacy & account controls — read/update marketing " +
361
+ "opt-ins, request GDPR data export, delete your account",
362
+ tools: [
363
+ "pica_get_privacy_settings",
364
+ "pica_update_privacy_settings",
365
+ "pica_export_my_data",
366
+ "pica_delete_my_account",
367
+ ],
368
+ depends_on: [],
369
+ },
370
+ uploads: {
371
+ description: "upload files to the platform",
372
+ tools: [
373
+ // Interactive iframe card (ADR-152) — for harness clients that can
374
+ // render UI. External clients (ChatGPT, Gemini) get told to upload
375
+ // at withpica.com/workspace via the tool's description.
376
+ "pica_upload",
377
+ // Programmatic two-step upload — for when file details are known.
378
+ "pica_upload_file",
379
+ "pica_upload_complete",
380
+ ],
381
+ depends_on: [],
382
+ },
383
+ agreements: {
384
+ description: "manage agreements, agreement templates, and agreement types",
385
+ tools: [
386
+ "pica_agreements_query",
387
+ "pica_agreements_inspect",
388
+ "pica_agreements_create",
389
+ "pica_agreements_update",
390
+ "pica_agreements_delete",
391
+ "pica_agreements_link_work",
392
+ "pica_agreement_templates_duplicate",
393
+ "pica_agreement_templates_render",
394
+ "pica_agreement_templates_set_default",
395
+ "pica_agreement_types_query",
396
+ "pica_agreement_types_inspect",
397
+ "pica_agreement_types_create",
398
+ "pica_agreement_types_update",
399
+ "pica_agreement_types_delete",
400
+ ],
401
+ depends_on: [],
402
+ },
403
+ collaborators: {
404
+ description: "invite, accept, and dispute catalog collaborators",
405
+ tools: [
406
+ "pica_collaborators_invite",
407
+ "pica_collaborators_invite_bulk",
408
+ "pica_collaborators_invite_resend",
409
+ "pica_collaborators_invites_list",
410
+ "pica_collaborators_incoming_list",
411
+ "pica_collaborators_accept",
412
+ "pica_collaborators_dispute",
413
+ "pica_disputes_list",
414
+ ],
415
+ depends_on: [],
416
+ },
417
+ custody: {
418
+ description: "manage catalog custody claims and reconciliation",
419
+ tools: [
420
+ "pica_custody_list",
421
+ "pica_custody_history",
422
+ "pica_custody_claim",
423
+ "pica_custody_respond",
424
+ "pica_custody_reconcile",
425
+ "pica_custody_resolve_pending",
426
+ ],
427
+ depends_on: [],
428
+ },
429
+ physical_assets: {
430
+ description: "manage physical assets (master tapes, hardware, artefacts)",
431
+ tools: [
432
+ "pica_physical_assets_query",
433
+ "pica_physical_assets_inspect",
434
+ "pica_physical_assets_create",
435
+ "pica_physical_assets_update",
436
+ "pica_physical_assets_delete",
437
+ "pica_physical_assets_export",
438
+ "pica_physical_assets_stats",
439
+ "pica_physical_assets_link_work",
440
+ "pica_physical_assets_link_recording",
441
+ "pica_physical_assets_unlink_work",
442
+ "pica_physical_assets_unlink_recording",
443
+ ],
444
+ depends_on: [],
445
+ },
446
+ recording_splits: {
447
+ description: "manage recording (master) splits between contributors",
448
+ tools: [
449
+ "pica_recording_splits_list",
450
+ "pica_recording_splits_create",
451
+ "pica_recording_splits_verify",
452
+ ],
453
+ depends_on: [],
454
+ },
455
+ royalties_statements: {
456
+ description: "view royalties and ingested statements",
457
+ tools: [
458
+ "pica_royalties_summary",
459
+ "pica_royalties_list",
460
+ "pica_royalties_get",
461
+ "pica_statements_list",
462
+ "pica_statements_get",
463
+ ],
464
+ depends_on: [],
465
+ },
466
+ share_links: {
467
+ description: "create, inspect, update, and delete share links for catalog content",
468
+ tools: [
469
+ "pica_share_links_create",
470
+ "pica_share_links_list",
471
+ "pica_share_links_inspect",
472
+ "pica_share_links_update",
473
+ "pica_share_links_delete",
474
+ ],
475
+ depends_on: [],
476
+ },
477
+ split_sheets: {
478
+ description: "generate, send, and look up split sheets",
479
+ tools: [
480
+ "pica_split_sheet_generate",
481
+ "pica_split_sheet_send",
482
+ "pica_split_sheet_get",
483
+ "pica_split_sheet_list",
484
+ ],
485
+ depends_on: [],
486
+ },
487
+ licensing: {
488
+ description: "submit, list, and respond to license enquiries; search for sync",
489
+ tools: [
490
+ "pica_submit_license_enquiry",
491
+ "pica_get_license_enquiry",
492
+ "pica_list_license_enquiries",
493
+ "pica_update_license_enquiry_status",
494
+ "pica_search_for_sync",
495
+ ],
496
+ depends_on: [],
497
+ },
498
+ sync_placements: {
499
+ description: "manage sync placements (films/TV/ads/games licensing your works) — placement records, evidence, verification state",
500
+ tools: [
501
+ "pica_sync_placements_query",
502
+ "pica_sync_placements_inspect",
503
+ "pica_sync_placements_create",
504
+ "pica_sync_placements_update",
505
+ "pica_sync_placements_delete",
506
+ "pica_sync_placements_cite",
507
+ ],
508
+ depends_on: [],
509
+ },
510
+ notifications: {
511
+ description: "list and schedule notifications to users and people",
512
+ tools: [
513
+ "pica_notifications_list",
514
+ "pica_notifications_mark_read",
515
+ "pica_notify_user",
516
+ "pica_notify_user_at",
517
+ "pica_notify_user_cancel",
518
+ "pica_notify_user_list_pending",
519
+ "pica_notify_person",
520
+ // ADR-218 — cross-transport awareness via discovery_events ledger
521
+ "pica_notifications_recent",
522
+ "pica_notification_acknowledge",
523
+ ],
524
+ depends_on: [],
525
+ },
526
+ messaging: {
527
+ description: "send and resend messages to collaborators and contacts",
528
+ tools: ["pica_send_message", "pica_send_resend", "pica_send_query"],
529
+ depends_on: [],
530
+ },
531
+ agent_identity: {
532
+ description: "manage AI agent identities, grants, and activity",
533
+ tools: [
534
+ "pica_create_agent_identity",
535
+ "pica_issue_agent_grant",
536
+ "pica_revoke_agent_grant",
537
+ "pica_list_my_agent_grants",
538
+ "pica_get_agent_activity",
539
+ ],
540
+ depends_on: [],
541
+ },
542
+ telegram: {
543
+ description: "connect and inspect Telegram channel for the workspace",
544
+ tools: ["pica_telegram_connect", "pica_telegram_status"],
545
+ depends_on: [],
546
+ },
547
+ labels: {
548
+ description: "look up record labels",
549
+ tools: ["pica_labels_query"],
550
+ depends_on: [],
551
+ },
552
+ };
553
+ /**
554
+ * Operational metadata defaults for pica_tool_details responses.
555
+ * These are reasonable defaults — _query tools return pages, _inspect/_get return one.
556
+ */
557
+ function getOperationalMeta(toolName) {
558
+ if (toolName.endsWith("_query") || toolName.endsWith("_list")) {
559
+ return { max_results_per_page: 100, paginated: true };
560
+ }
561
+ if (toolName.endsWith("_inspect") ||
562
+ toolName.endsWith("_get") ||
563
+ toolName.endsWith("_get_full")) {
564
+ return { max_results_per_page: 1, paginated: false };
565
+ }
566
+ return {};
567
+ }
568
+ export class DiscoveryTools {
569
+ executeToolFn;
570
+ getToolDef;
571
+ constructor(executeToolFn, getToolDef) {
572
+ this.executeToolFn = executeToolFn;
573
+ this.getToolDef = getToolDef;
574
+ }
575
+ getTools() {
576
+ return [
577
+ this.buildDiscoverTool(),
578
+ this.buildToolDetailsTool(),
579
+ this.buildExecuteTool(),
580
+ ];
581
+ }
582
+ buildDiscoverTool() {
583
+ return {
584
+ definition: {
585
+ name: "pica_discover",
586
+ description: "Discover available tool categories. Returns a versioned summary of categories with tool counts and names. " +
587
+ "Use pica_tool_details to drill into a category and get full schemas before calling tools.",
588
+ workflows: "infrastructure",
589
+ inputSchema: {
590
+ type: "object",
591
+ properties: {},
592
+ },
593
+ annotations: {
594
+ title: "discover tool categories",
595
+ readOnlyHint: true,
596
+ destructiveHint: false,
597
+ idempotentHint: true,
598
+ openWorldHint: false,
599
+ },
600
+ },
601
+ executor: async () => {
602
+ const categories = {};
603
+ for (const [key, cat] of Object.entries(CATEGORIES)) {
604
+ categories[key] = {
605
+ description: cat.description,
606
+ tool_count: cat.tools.length,
607
+ tools: cat.tools,
608
+ depends_on: cat.depends_on,
609
+ };
610
+ }
611
+ const cacheUntil = new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString();
612
+ const payload = {
613
+ schema_version: SCHEMA_VERSION,
614
+ cache_until: cacheUntil,
615
+ categories,
616
+ };
617
+ return {
618
+ content: [
619
+ {
620
+ type: "text",
621
+ text: JSON.stringify(payload, null, 2),
622
+ },
623
+ ],
624
+ structuredContent: payload,
625
+ };
626
+ },
627
+ };
628
+ }
629
+ buildToolDetailsTool() {
630
+ return {
631
+ definition: {
632
+ name: "pica_tool_details",
633
+ description: "Get full schema and metadata for one tool or all tools in a category. " +
634
+ "Pass either { tool: 'name' } or { category: 'name' } (from pica_discover). " +
635
+ "Returns schema, annotations, recovery hints, and operational metadata.",
636
+ workflows: "infrastructure",
637
+ inputSchema: {
638
+ type: "object",
639
+ properties: {
640
+ tool: {
641
+ type: "string",
642
+ description: "Specific tool name (e.g. pica_works_inspect)",
643
+ },
644
+ category: {
645
+ type: "string",
646
+ description: "Category name from pica_discover (e.g. works)",
647
+ },
648
+ },
649
+ },
650
+ annotations: {
651
+ title: "get tool details",
652
+ readOnlyHint: true,
653
+ destructiveHint: false,
654
+ idempotentHint: true,
655
+ openWorldHint: false,
656
+ },
657
+ },
658
+ executor: async (args) => {
659
+ if (args.tool) {
660
+ const detail = this.buildToolDetail(args.tool);
661
+ if (!detail) {
662
+ return {
663
+ content: [
664
+ {
665
+ type: "text",
666
+ text: JSON.stringify({
667
+ error_code: "TOOL_NOT_FOUND",
668
+ tool: args.tool,
669
+ message: `no tool named '${args.tool}' — use pica_discover to see available categories`,
670
+ retry_eligible: false,
671
+ }, null, 2),
672
+ },
673
+ ],
674
+ isError: true,
675
+ };
676
+ }
677
+ return {
678
+ content: [{ type: "text", text: JSON.stringify(detail, null, 2) }],
679
+ structuredContent: detail,
680
+ };
681
+ }
682
+ if (args.category) {
683
+ const cat = CATEGORIES[args.category];
684
+ if (!cat) {
685
+ return {
686
+ content: [
687
+ {
688
+ type: "text",
689
+ text: JSON.stringify({
690
+ error_code: "CATEGORY_NOT_FOUND",
691
+ category: args.category,
692
+ message: `no category '${args.category}' — use pica_discover to see available categories`,
693
+ retry_eligible: false,
694
+ }, null, 2),
695
+ },
696
+ ],
697
+ isError: true,
698
+ };
699
+ }
700
+ const details = cat.tools
701
+ .map((name) => this.buildToolDetail(name))
702
+ .filter((d) => d !== null);
703
+ const payload = {
704
+ category: args.category,
705
+ tool_count: details.length,
706
+ tools: details,
707
+ };
708
+ return {
709
+ content: [{ type: "text", text: JSON.stringify(payload, null, 2) }],
710
+ structuredContent: payload,
711
+ };
712
+ }
713
+ return {
714
+ content: [
715
+ {
716
+ type: "text",
717
+ text: JSON.stringify({
718
+ error_code: "VALIDATION_ERROR",
719
+ message: "provide either { tool: 'name' } or { category: 'name' }",
720
+ retry_eligible: false,
721
+ }, null, 2),
722
+ },
723
+ ],
724
+ isError: true,
725
+ };
726
+ },
727
+ };
728
+ }
729
+ buildToolDetail(toolName) {
730
+ const registered = this.getToolDef(toolName);
731
+ const metadata = getToolMetadata(toolName);
732
+ // Return null when the tool is completely unknown (not registered and not in metadata)
733
+ if (!registered && !metadata) {
734
+ return null;
735
+ }
736
+ // Collect all recovery hints for this tool (all error codes)
737
+ const hints = RECOVERY_HINTS[toolName] ?? [];
738
+ const definition = registered?.definition ?? null;
739
+ return {
740
+ tool: toolName,
741
+ description: definition?.description ?? metadata?.display_name ?? toolName,
742
+ schema: definition?.inputSchema ?? null,
743
+ annotations: definition?.annotations ?? null,
744
+ metadata: metadata
745
+ ? {
746
+ category: metadata.category,
747
+ risk: metadata.risk,
748
+ retry_safe: metadata.retry_safe,
749
+ display_name: metadata.display_name,
750
+ }
751
+ : null,
752
+ recovery_hints: hints,
753
+ operational: getOperationalMeta(toolName),
754
+ };
755
+ }
756
+ buildExecuteTool() {
757
+ return {
758
+ definition: {
759
+ name: "pica_execute",
760
+ description: "Execute any catalog tool by name. " +
761
+ "Use pica_discover to find categories, pica_tool_details to get the schema, then call here with { tool, args }.",
762
+ workflows: "infrastructure",
763
+ inputSchema: {
764
+ type: "object",
765
+ properties: {
766
+ tool: {
767
+ type: "string",
768
+ description: "Tool name to execute (e.g. pica_works_inspect). Use pica_discover + pica_tool_details to find available tools.",
769
+ },
770
+ args: {
771
+ type: "object",
772
+ additionalProperties: true,
773
+ description: "Arguments to pass to the tool",
774
+ },
775
+ },
776
+ required: ["tool"],
777
+ },
778
+ annotations: {
779
+ title: "execute a catalog tool",
780
+ readOnlyHint: false,
781
+ destructiveHint: false,
782
+ idempotentHint: false,
783
+ openWorldHint: false,
784
+ },
785
+ },
786
+ executor: async (args, ctx) => {
787
+ const toolName = args.tool;
788
+ const toolArgs = args.args ?? {};
789
+ if (!toolName || typeof toolName !== "string" || !toolName.trim()) {
790
+ return {
791
+ content: [
792
+ {
793
+ type: "text",
794
+ text: JSON.stringify({
795
+ error_code: "VALIDATION_ERROR",
796
+ tool: null,
797
+ message: "missing required field: tool",
798
+ retry_eligible: false,
799
+ }, null, 2),
800
+ },
801
+ ],
802
+ isError: true,
803
+ };
804
+ }
805
+ // Block meta-tool self-invocation to prevent infinite loops
806
+ const META_TOOLS = new Set([
807
+ "pica_discover",
808
+ "pica_tool_details",
809
+ "pica_execute",
810
+ ]);
811
+ if (META_TOOLS.has(toolName)) {
812
+ return {
813
+ content: [
814
+ {
815
+ type: "text",
816
+ text: JSON.stringify({
817
+ error_code: "INVALID_TOOL",
818
+ tool: toolName,
819
+ message: "meta-tools (pica_discover, pica_tool_details, pica_execute) cannot be invoked via pica_execute",
820
+ retry_eligible: false,
821
+ }, null, 2),
822
+ },
823
+ ],
824
+ isError: true,
825
+ };
826
+ }
827
+ try {
828
+ return await this.executeToolFn(toolName, toolArgs, ctx);
829
+ }
830
+ catch (err) {
831
+ const message = err instanceof Error ? err.message : String(err);
832
+ return {
833
+ content: [
834
+ {
835
+ type: "text",
836
+ text: JSON.stringify({
837
+ error_code: "EXECUTION_ERROR",
838
+ tool: toolName,
839
+ message,
840
+ retry_eligible: false,
841
+ }, null, 2),
842
+ },
843
+ ],
844
+ isError: true,
845
+ };
846
+ }
847
+ },
848
+ };
849
+ }
850
+ }
851
+ //# sourceMappingURL=discovery.js.map