@withpica/mcp-server 2.6.2 → 2.7.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 (256) hide show
  1. package/dist/config.d.ts +25 -4
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js +12 -36
  4. package/dist/config.js.map +1 -1
  5. package/dist/index.d.ts +1 -1
  6. package/dist/index.js +3 -3
  7. package/dist/index.js.map +1 -1
  8. package/dist/pica-sdk.d.ts +1231 -0
  9. package/dist/pica-sdk.d.ts.map +1 -0
  10. package/dist/pica-sdk.js +1403 -0
  11. package/dist/pica-sdk.js.map +1 -0
  12. package/dist/prompts/index.d.ts +64 -64
  13. package/dist/prompts/index.js +24 -24
  14. package/dist/prompts/index.js.map +1 -1
  15. package/dist/resources/index.d.ts +53 -55
  16. package/dist/resources/index.d.ts.map +1 -1
  17. package/dist/resources/index.js +54 -133
  18. package/dist/resources/index.js.map +1 -1
  19. package/dist/server.d.ts +32 -49
  20. package/dist/server.d.ts.map +1 -1
  21. package/dist/server.js +14 -103
  22. package/dist/server.js.map +1 -1
  23. package/dist/tools/index.d.ts +37 -83
  24. package/dist/tools/index.d.ts.map +1 -1
  25. package/dist/tools/index.js +84 -442
  26. package/dist/tools/index.js.map +1 -1
  27. package/dist/tools/people.d.ts +47 -39
  28. package/dist/tools/people.d.ts.map +1 -1
  29. package/dist/tools/people.js +109 -148
  30. package/dist/tools/people.js.map +1 -1
  31. package/dist/tools/recordings.d.ts +9 -9
  32. package/dist/tools/recordings.d.ts.map +1 -1
  33. package/dist/tools/recordings.js +48 -121
  34. package/dist/tools/recordings.js.map +1 -1
  35. package/dist/tools/search.d.ts +21 -21
  36. package/dist/tools/search.d.ts.map +1 -1
  37. package/dist/tools/search.js +3 -3
  38. package/dist/tools/search.js.map +1 -1
  39. package/dist/tools/works.d.ts +47 -39
  40. package/dist/tools/works.d.ts.map +1 -1
  41. package/dist/tools/works.js +116 -201
  42. package/dist/tools/works.js.map +1 -1
  43. package/dist/utils/errors.d.ts +29 -0
  44. package/dist/utils/errors.d.ts.map +1 -0
  45. package/dist/utils/errors.js +115 -0
  46. package/dist/utils/errors.js.map +1 -0
  47. package/dist/utils/formatting.d.ts +82 -0
  48. package/dist/utils/formatting.d.ts.map +1 -0
  49. package/dist/utils/formatting.js +125 -0
  50. package/dist/utils/formatting.js.map +1 -0
  51. package/package.json +1 -1
  52. package/server.json +1 -1
  53. package/dist/__mocks__/mppx-mcp-sdk-server.d.ts +0 -6
  54. package/dist/__mocks__/mppx-mcp-sdk-server.d.ts.map +0 -1
  55. package/dist/__mocks__/mppx-mcp-sdk-server.js +0 -6
  56. package/dist/__mocks__/mppx-mcp-sdk-server.js.map +0 -1
  57. package/dist/__mocks__/mppx-server.d.ts +0 -12
  58. package/dist/__mocks__/mppx-server.d.ts.map +0 -1
  59. package/dist/__mocks__/mppx-server.js +0 -12
  60. package/dist/__mocks__/mppx-server.js.map +0 -1
  61. package/dist/apps/download.d.ts +0 -2
  62. package/dist/apps/download.d.ts.map +0 -1
  63. package/dist/apps/download.js +0 -125
  64. package/dist/apps/download.js.map +0 -1
  65. package/dist/apps/generated/shared-bundle.d.ts +0 -5
  66. package/dist/apps/generated/shared-bundle.d.ts.map +0 -1
  67. package/dist/apps/generated/shared-bundle.js +0 -7
  68. package/dist/apps/generated/shared-bundle.js.map +0 -1
  69. package/dist/apps/shared.d.ts +0 -15
  70. package/dist/apps/shared.d.ts.map +0 -1
  71. package/dist/apps/shared.js +0 -480
  72. package/dist/apps/shared.js.map +0 -1
  73. package/dist/apps/upload.d.ts +0 -2
  74. package/dist/apps/upload.d.ts.map +0 -1
  75. package/dist/apps/upload.js +0 -280
  76. package/dist/apps/upload.js.map +0 -1
  77. package/dist/resources/llms-primer.d.ts +0 -2
  78. package/dist/resources/llms-primer.d.ts.map +0 -1
  79. package/dist/resources/llms-primer.js +0 -68
  80. package/dist/resources/llms-primer.js.map +0 -1
  81. package/dist/server-instructions.d.ts +0 -9
  82. package/dist/server-instructions.d.ts.map +0 -1
  83. package/dist/server-instructions.js +0 -34
  84. package/dist/server-instructions.js.map +0 -1
  85. package/dist/tools/agreement-types.d.ts +0 -27
  86. package/dist/tools/agreement-types.d.ts.map +0 -1
  87. package/dist/tools/agreement-types.js +0 -387
  88. package/dist/tools/agreement-types.js.map +0 -1
  89. package/dist/tools/agreements.d.ts +0 -20
  90. package/dist/tools/agreements.d.ts.map +0 -1
  91. package/dist/tools/agreements.js +0 -363
  92. package/dist/tools/agreements.js.map +0 -1
  93. package/dist/tools/analytics.d.ts +0 -20
  94. package/dist/tools/analytics.d.ts.map +0 -1
  95. package/dist/tools/analytics.js +0 -124
  96. package/dist/tools/analytics.js.map +0 -1
  97. package/dist/tools/app-tools.d.ts +0 -21
  98. package/dist/tools/app-tools.d.ts.map +0 -1
  99. package/dist/tools/app-tools.js +0 -248
  100. package/dist/tools/app-tools.js.map +0 -1
  101. package/dist/tools/assets.d.ts +0 -21
  102. package/dist/tools/assets.d.ts.map +0 -1
  103. package/dist/tools/assets.js +0 -441
  104. package/dist/tools/assets.js.map +0 -1
  105. package/dist/tools/audio-files.d.ts +0 -20
  106. package/dist/tools/audio-files.d.ts.map +0 -1
  107. package/dist/tools/audio-files.js +0 -384
  108. package/dist/tools/audio-files.js.map +0 -1
  109. package/dist/tools/auth.d.ts +0 -22
  110. package/dist/tools/auth.d.ts.map +0 -1
  111. package/dist/tools/auth.js +0 -210
  112. package/dist/tools/auth.js.map +0 -1
  113. package/dist/tools/bulk.d.ts +0 -16
  114. package/dist/tools/bulk.d.ts.map +0 -1
  115. package/dist/tools/bulk.js +0 -85
  116. package/dist/tools/bulk.js.map +0 -1
  117. package/dist/tools/calendar.d.ts +0 -15
  118. package/dist/tools/calendar.d.ts.map +0 -1
  119. package/dist/tools/calendar.js +0 -67
  120. package/dist/tools/calendar.js.map +0 -1
  121. package/dist/tools/collaborators.d.ts +0 -17
  122. package/dist/tools/collaborators.d.ts.map +0 -1
  123. package/dist/tools/collaborators.js +0 -131
  124. package/dist/tools/collaborators.js.map +0 -1
  125. package/dist/tools/comparisons.d.ts +0 -22
  126. package/dist/tools/comparisons.d.ts.map +0 -1
  127. package/dist/tools/comparisons.js +0 -78
  128. package/dist/tools/comparisons.js.map +0 -1
  129. package/dist/tools/credits.d.ts +0 -17
  130. package/dist/tools/credits.d.ts.map +0 -1
  131. package/dist/tools/credits.js +0 -312
  132. package/dist/tools/credits.js.map +0 -1
  133. package/dist/tools/dashboard.d.ts +0 -19
  134. package/dist/tools/dashboard.d.ts.map +0 -1
  135. package/dist/tools/dashboard.js +0 -146
  136. package/dist/tools/dashboard.js.map +0 -1
  137. package/dist/tools/directory.d.ts +0 -15
  138. package/dist/tools/directory.d.ts.map +0 -1
  139. package/dist/tools/directory.js +0 -106
  140. package/dist/tools/directory.js.map +0 -1
  141. package/dist/tools/discovery.d.ts +0 -28
  142. package/dist/tools/discovery.d.ts.map +0 -1
  143. package/dist/tools/discovery.js +0 -560
  144. package/dist/tools/discovery.js.map +0 -1
  145. package/dist/tools/disputes.d.ts +0 -18
  146. package/dist/tools/disputes.d.ts.map +0 -1
  147. package/dist/tools/disputes.js +0 -61
  148. package/dist/tools/disputes.js.map +0 -1
  149. package/dist/tools/documents.d.ts +0 -15
  150. package/dist/tools/documents.d.ts.map +0 -1
  151. package/dist/tools/documents.js +0 -36
  152. package/dist/tools/documents.js.map +0 -1
  153. package/dist/tools/duplicates.d.ts +0 -16
  154. package/dist/tools/duplicates.d.ts.map +0 -1
  155. package/dist/tools/duplicates.js +0 -87
  156. package/dist/tools/duplicates.js.map +0 -1
  157. package/dist/tools/enrichment.d.ts +0 -20
  158. package/dist/tools/enrichment.d.ts.map +0 -1
  159. package/dist/tools/enrichment.js +0 -154
  160. package/dist/tools/enrichment.js.map +0 -1
  161. package/dist/tools/exports.d.ts +0 -19
  162. package/dist/tools/exports.d.ts.map +0 -1
  163. package/dist/tools/exports.js +0 -175
  164. package/dist/tools/exports.js.map +0 -1
  165. package/dist/tools/import-documents.d.ts +0 -21
  166. package/dist/tools/import-documents.d.ts.map +0 -1
  167. package/dist/tools/import-documents.js +0 -203
  168. package/dist/tools/import-documents.js.map +0 -1
  169. package/dist/tools/import.d.ts +0 -30
  170. package/dist/tools/import.d.ts.map +0 -1
  171. package/dist/tools/import.js +0 -455
  172. package/dist/tools/import.js.map +0 -1
  173. package/dist/tools/integrations.d.ts +0 -15
  174. package/dist/tools/integrations.d.ts.map +0 -1
  175. package/dist/tools/integrations.js +0 -100
  176. package/dist/tools/integrations.js.map +0 -1
  177. package/dist/tools/licensing.d.ts +0 -40
  178. package/dist/tools/licensing.d.ts.map +0 -1
  179. package/dist/tools/licensing.js +0 -431
  180. package/dist/tools/licensing.js.map +0 -1
  181. package/dist/tools/memory.d.ts +0 -21
  182. package/dist/tools/memory.d.ts.map +0 -1
  183. package/dist/tools/memory.js +0 -116
  184. package/dist/tools/memory.js.map +0 -1
  185. package/dist/tools/metadata.d.ts +0 -15
  186. package/dist/tools/metadata.d.ts.map +0 -1
  187. package/dist/tools/metadata.js +0 -1069
  188. package/dist/tools/metadata.js.map +0 -1
  189. package/dist/tools/multimedia.d.ts +0 -19
  190. package/dist/tools/multimedia.d.ts.map +0 -1
  191. package/dist/tools/multimedia.js +0 -291
  192. package/dist/tools/multimedia.js.map +0 -1
  193. package/dist/tools/notes.d.ts +0 -21
  194. package/dist/tools/notes.d.ts.map +0 -1
  195. package/dist/tools/notes.js +0 -108
  196. package/dist/tools/notes.js.map +0 -1
  197. package/dist/tools/notifications.d.ts +0 -17
  198. package/dist/tools/notifications.d.ts.map +0 -1
  199. package/dist/tools/notifications.js +0 -117
  200. package/dist/tools/notifications.js.map +0 -1
  201. package/dist/tools/projects.d.ts +0 -19
  202. package/dist/tools/projects.d.ts.map +0 -1
  203. package/dist/tools/projects.js +0 -140
  204. package/dist/tools/projects.js.map +0 -1
  205. package/dist/tools/publishers.d.ts +0 -16
  206. package/dist/tools/publishers.d.ts.map +0 -1
  207. package/dist/tools/publishers.js +0 -69
  208. package/dist/tools/publishers.js.map +0 -1
  209. package/dist/tools/purchases.d.ts +0 -15
  210. package/dist/tools/purchases.d.ts.map +0 -1
  211. package/dist/tools/purchases.js +0 -63
  212. package/dist/tools/purchases.js.map +0 -1
  213. package/dist/tools/recovery-hints.d.ts +0 -14
  214. package/dist/tools/recovery-hints.d.ts.map +0 -1
  215. package/dist/tools/recovery-hints.js +0 -277
  216. package/dist/tools/recovery-hints.js.map +0 -1
  217. package/dist/tools/releases.d.ts +0 -18
  218. package/dist/tools/releases.d.ts.map +0 -1
  219. package/dist/tools/releases.js +0 -128
  220. package/dist/tools/releases.js.map +0 -1
  221. package/dist/tools/royalties.d.ts +0 -23
  222. package/dist/tools/royalties.d.ts.map +0 -1
  223. package/dist/tools/royalties.js +0 -257
  224. package/dist/tools/royalties.js.map +0 -1
  225. package/dist/tools/send.d.ts +0 -17
  226. package/dist/tools/send.d.ts.map +0 -1
  227. package/dist/tools/send.js +0 -185
  228. package/dist/tools/send.js.map +0 -1
  229. package/dist/tools/sessions.d.ts +0 -18
  230. package/dist/tools/sessions.d.ts.map +0 -1
  231. package/dist/tools/sessions.js +0 -115
  232. package/dist/tools/sessions.js.map +0 -1
  233. package/dist/tools/settings.d.ts +0 -18
  234. package/dist/tools/settings.d.ts.map +0 -1
  235. package/dist/tools/settings.js +0 -96
  236. package/dist/tools/settings.js.map +0 -1
  237. package/dist/tools/share-links.d.ts +0 -19
  238. package/dist/tools/share-links.d.ts.map +0 -1
  239. package/dist/tools/share-links.js +0 -121
  240. package/dist/tools/share-links.js.map +0 -1
  241. package/dist/tools/split-sheets.d.ts +0 -25
  242. package/dist/tools/split-sheets.d.ts.map +0 -1
  243. package/dist/tools/split-sheets.js +0 -307
  244. package/dist/tools/split-sheets.js.map +0 -1
  245. package/dist/tools/team.d.ts +0 -22
  246. package/dist/tools/team.d.ts.map +0 -1
  247. package/dist/tools/team.js +0 -134
  248. package/dist/tools/team.js.map +0 -1
  249. package/dist/tools/telegram.d.ts +0 -20
  250. package/dist/tools/telegram.d.ts.map +0 -1
  251. package/dist/tools/telegram.js +0 -88
  252. package/dist/tools/telegram.js.map +0 -1
  253. package/dist/tools/uploads.d.ts +0 -17
  254. package/dist/tools/uploads.d.ts.map +0 -1
  255. package/dist/tools/uploads.js +0 -156
  256. package/dist/tools/uploads.js.map +0 -1
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Response formatting utilities
3
+ *
4
+ * All formatters return FormattedResult — both human-readable text content
5
+ * AND a structuredContent object for machine parsing (ADR-104 §1.2).
6
+ */
7
+ export interface FormattedResult {
8
+ content: Array<{
9
+ type: string;
10
+ text: string;
11
+ }>;
12
+ structuredContent?: Record<string, unknown>;
13
+ }
14
+ /**
15
+ * Format data as JSON text for MCP response
16
+ */
17
+ export declare function formatAsText(data: any): FormattedResult;
18
+ /**
19
+ * Completion hint — tells the LLM what's missing on entities just touched.
20
+ * The LLM decides whether and how to surface these to the user.
21
+ */
22
+ export interface CompletionHint {
23
+ gap: string;
24
+ suggestion: string;
25
+ count?: number;
26
+ severity?: "critical" | "important" | "nice_to_have";
27
+ }
28
+ /**
29
+ * Format success message, with optional completion hints for the guided loop.
30
+ *
31
+ * Completion hints are structured data appended to the response so the LLM
32
+ * can naturally suggest the next step without PICA dictating the conversation.
33
+ * If no hints are provided, the response is identical to the old format.
34
+ */
35
+ export declare function formatSuccess(
36
+ message: string,
37
+ data?: any,
38
+ completionHints?: CompletionHint[],
39
+ ): FormattedResult;
40
+ /**
41
+ * Map raw gap objects from the completeness API into CompletionHints.
42
+ * The API response shape varies — this handles the known field names.
43
+ */
44
+ export declare function mapGapsToHints(
45
+ gaps: any[],
46
+ limit?: number,
47
+ ): CompletionHint[];
48
+ /**
49
+ * Format array of items with count
50
+ */
51
+ export declare function formatList<T>(
52
+ items: T[],
53
+ metadata?: Record<string, any>,
54
+ ): FormattedResult;
55
+ /**
56
+ * Truncate text to max length
57
+ */
58
+ export declare function truncate(text: string, maxLength?: number): string;
59
+ /**
60
+ * Format validation error
61
+ */
62
+ export declare function formatValidationError(
63
+ fields: Record<string, string>,
64
+ ): FormattedResult;
65
+ /**
66
+ * Format structured response with dual content blocks:
67
+ * - Human-readable text (includes full JSON so all MCP clients can read it)
68
+ * - Machine-parseable structuredContent object
69
+ */
70
+ export declare function formatStructured(
71
+ data: any,
72
+ summary?: string,
73
+ ): FormattedResult;
74
+ /**
75
+ * Format a list with both human summary and structured JSON
76
+ */
77
+ export declare function formatStructuredList<T>(
78
+ items: T[],
79
+ entityName: string,
80
+ metadata?: Record<string, any>,
81
+ ): FormattedResult;
82
+ //# sourceMappingURL=formatting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../../src/utils/formatting.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,GAAG,GAAG,eAAe,CAKvD;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,UAAU,GAAG,WAAW,GAAG,cAAc,CAAC;CACtD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,GAAG,EACV,eAAe,CAAC,EAAE,cAAc,EAAE,GACjC,eAAe,CA0BjB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,GAAG,EAAE,EACX,KAAK,GAAE,MAAU,GAChB,cAAc,EAAE,CAOlB;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAC1B,KAAK,EAAE,CAAC,EAAE,EACV,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC7B,eAAe,CAsBjB;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAa,GAAG,MAAM,CAKvE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,eAAe,CAWjB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe,CAW7E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EACpC,KAAK,EAAE,CAAC,EAAE,EACV,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC7B,eAAe,CAOjB"}
@@ -0,0 +1,125 @@
1
+ // Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
2
+ /**
3
+ * Format data as JSON text for MCP response
4
+ */
5
+ export function formatAsText(data) {
6
+ return {
7
+ content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
8
+ structuredContent: data,
9
+ };
10
+ }
11
+ /**
12
+ * Format success message, with optional completion hints for the guided loop.
13
+ *
14
+ * Completion hints are structured data appended to the response so the LLM
15
+ * can naturally suggest the next step without PICA dictating the conversation.
16
+ * If no hints are provided, the response is identical to the old format.
17
+ */
18
+ export function formatSuccess(message, data, completionHints) {
19
+ const response = {
20
+ success: true,
21
+ message,
22
+ };
23
+ if (data !== undefined) {
24
+ response.data = data;
25
+ }
26
+ if (completionHints && completionHints.length > 0) {
27
+ response.completion_hints = completionHints;
28
+ // Append a human-readable summary so all LLMs can see the hints
29
+ const hintLines = completionHints
30
+ .map((h) => `- ${h.suggestion}${h.count ? ` (${h.count} works)` : ""}`)
31
+ .join("\n");
32
+ message += `\n\nNext steps you could take:\n${hintLines}`;
33
+ response.message = message; // Keep structuredContent in sync with text
34
+ }
35
+ const jsonText = JSON.stringify(response, null, 2);
36
+ return {
37
+ content: [{ type: "text", text: `${message}\n\n${jsonText}` }],
38
+ structuredContent: response,
39
+ };
40
+ }
41
+ /**
42
+ * Map raw gap objects from the completeness API into CompletionHints.
43
+ * The API response shape varies — this handles the known field names.
44
+ */
45
+ export function mapGapsToHints(gaps, limit = 5) {
46
+ if (!Array.isArray(gaps))
47
+ return [];
48
+ return gaps.slice(0, limit).map((g) => ({
49
+ gap: g.key || g.field || g.type || "unknown",
50
+ suggestion: g.suggestion || g.label || g.description || "",
51
+ severity: g.severity || "important",
52
+ }));
53
+ }
54
+ /**
55
+ * Format array of items with count
56
+ */
57
+ export function formatList(items, metadata) {
58
+ const response = {
59
+ count: items.length,
60
+ items,
61
+ };
62
+ if (metadata) {
63
+ response.metadata = metadata;
64
+ }
65
+ const summary = `Found ${items.length} item${items.length !== 1 ? "s" : ""}.`;
66
+ const jsonText = JSON.stringify(response, null, 2);
67
+ return {
68
+ content: [
69
+ {
70
+ type: "text",
71
+ text: `${summary}\n\n${jsonText}`,
72
+ },
73
+ ],
74
+ structuredContent: response,
75
+ };
76
+ }
77
+ /**
78
+ * Truncate text to max length
79
+ */
80
+ export function truncate(text, maxLength = 1000) {
81
+ if (text.length <= maxLength) {
82
+ return text;
83
+ }
84
+ return text.substring(0, maxLength) + "... (truncated)";
85
+ }
86
+ /**
87
+ * Format validation error
88
+ */
89
+ export function formatValidationError(fields) {
90
+ const structured = {
91
+ error: "VALIDATION_ERROR",
92
+ message: "Validation failed",
93
+ fields,
94
+ };
95
+ return {
96
+ content: [{ type: "text", text: JSON.stringify(structured, null, 2) }],
97
+ structuredContent: structured,
98
+ };
99
+ }
100
+ /**
101
+ * Format structured response with dual content blocks:
102
+ * - Human-readable text (includes full JSON so all MCP clients can read it)
103
+ * - Machine-parseable structuredContent object
104
+ */
105
+ export function formatStructured(data, summary) {
106
+ const jsonText = JSON.stringify(data, null, 2);
107
+ return {
108
+ content: [
109
+ {
110
+ type: "text",
111
+ text: summary ? `${summary}\n\n${jsonText}` : jsonText,
112
+ },
113
+ ],
114
+ structuredContent: data,
115
+ };
116
+ }
117
+ /**
118
+ * Format a list with both human summary and structured JSON
119
+ */
120
+ export function formatStructuredList(items, entityName, metadata) {
121
+ const count = items.length;
122
+ const summary = `Found ${count} ${entityName}${count !== 1 ? "s" : ""}${metadata?.query ? ` matching "${metadata.query}"` : ""}.`;
123
+ return formatStructured({ count, items, ...metadata }, summary);
124
+ }
125
+ //# sourceMappingURL=formatting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../src/utils/formatting.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@withpica/mcp-server",
3
3
  "mcpName": "io.github.withpica/pica",
4
- "version": "2.6.2",
4
+ "version": "2.7.0",
5
5
  "description": "MCP Server for PICA Platform - enables AI assistants to interact with PICA",
6
6
  "type": "module",
7
7
  "main": "dist/index.js",
package/server.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
3
  "name": "io.github.withpica/pica",
4
- "description": "withPICA — manage your music catalog through conversation. 168 tools for works, recordings, credits, agreements, royalties, enrichment, licensing. lobby mode: no api key, sign in via magic link in chat. © 2024-2026 Withpica Ltd. All rights reserved.",
4
+ "description": "manage your music catalog through conversation works, recordings, credits, agreements, royalties",
5
5
  "repository": {
6
6
  "url": "https://github.com/withpica/pica",
7
7
  "source": "github"
@@ -1,6 +0,0 @@
1
- export declare const Transport: {
2
- mcpSdk: () => {
3
- name: string;
4
- };
5
- };
6
- //# sourceMappingURL=mppx-mcp-sdk-server.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mppx-mcp-sdk-server.d.ts","sourceRoot":"","sources":["../../src/__mocks__/mppx-mcp-sdk-server.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,SAAS;;;;CAErB,CAAC"}
@@ -1,6 +0,0 @@
1
- // Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
2
- // Mock for mppx/mcp-sdk/server — used in test environment where mppx is not installed
3
- export const Transport = {
4
- mcpSdk: () => ({ name: "mcp-sdk" }),
5
- };
6
- //# sourceMappingURL=mppx-mcp-sdk-server.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mppx-mcp-sdk-server.js","sourceRoot":"","sources":["../../src/__mocks__/mppx-mcp-sdk-server.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D,sFAAsF;AAEtF,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;CACpC,CAAC"}
@@ -1,12 +0,0 @@
1
- export declare const Mppx: {
2
- create: () => {
3
- charge: () => Promise<{
4
- success: boolean;
5
- }>;
6
- };
7
- };
8
- export declare const stripe: {
9
- charge: () => Promise<{}>;
10
- };
11
- export declare const Transport: {};
12
- //# sourceMappingURL=mppx-server.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mppx-server.d.ts","sourceRoot":"","sources":["../../src/__mocks__/mppx-server.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,IAAI;;;;;;CAIhB,CAAC;AAEF,eAAO,MAAM,MAAM;;CAElB,CAAC;AAEF,eAAO,MAAM,SAAS,IAAK,CAAC"}
@@ -1,12 +0,0 @@
1
- // Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
2
- // Mock for mppx/server — used in test environment where mppx is not installed
3
- export const Mppx = {
4
- create: () => ({
5
- charge: async () => ({ success: true }),
6
- }),
7
- };
8
- export const stripe = {
9
- charge: async () => ({}),
10
- };
11
- export const Transport = {};
12
- //# sourceMappingURL=mppx-server.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mppx-server.js","sourceRoot":"","sources":["../../src/__mocks__/mppx-server.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D,8EAA8E;AAE9E,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACb,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;KACxC,CAAC;CACH,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;CACzB,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC"}
@@ -1,2 +0,0 @@
1
- export declare const DOWNLOAD_HTML: string;
2
- //# sourceMappingURL=download.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/apps/download.ts"],"names":[],"mappings":"AAgIA,eAAO,MAAM,aAAa,QAIzB,CAAC"}
@@ -1,125 +0,0 @@
1
- // Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
2
- /**
3
- * pica_download MCP App card — file delivery.
4
- *
5
- * Shows filename, mime_type, size, and an optional description, then a copper
6
- * "download" button wired to app.downloadFile(). After dispatch the button
7
- * flips to a "downloaded" state with a secondary "download again" action.
8
- *
9
- * DOM API only — never innerHTML.
10
- */
11
- import { buildAppHtml } from "./shared.js";
12
- const DOWNLOAD_BODY = `
13
- <div class="stack gap-6">
14
- <header>
15
- <h1 class="heading heading-lg">download ready</h1>
16
- <p class="text-secondary">your file is ready to save</p>
17
- </header>
18
-
19
- <div class="card-flat dl-file">
20
- <div class="dl-icon" id="dl-icon">\u25CF</div>
21
- <div class="dl-meta">
22
- <div class="heading heading-sm" id="dl-filename">file</div>
23
- <div class="text-tertiary" id="dl-sub" style="font-size: 12px; margin-top: 4px;"></div>
24
- <div class="text-secondary" id="dl-description" style="font-size: 13px; margin-top: 8px; display: none;"></div>
25
- <div class="text-tertiary" id="dl-expires" style="font-size: 11px; margin-top: 6px; display: none;"></div>
26
- </div>
27
- </div>
28
-
29
- <div class="row" style="gap: 12px;">
30
- <button class="btn-copper" id="dl-button">download</button>
31
- <a class="btn-ghost" id="dl-fallback" href="#" target="_blank" rel="noopener">or open in browser</a>
32
- </div>
33
- </div>
34
-
35
- <style>
36
- .dl-file {
37
- display: flex;
38
- gap: 16px;
39
- align-items: flex-start;
40
- }
41
- .dl-icon {
42
- font-size: 32px;
43
- color: var(--accent);
44
- flex: 0 0 auto;
45
- line-height: 1;
46
- padding-top: 4px;
47
- }
48
- .dl-meta { flex: 1 1 auto; min-width: 0; }
49
- #dl-filename { word-break: break-all; }
50
- </style>
51
- `;
52
- const DOWNLOAD_JS = `
53
- var dlState = { file: null };
54
-
55
- function dlFormatBytes(bytes) {
56
- if (bytes == null || isNaN(bytes)) return "";
57
- if (bytes < 1024) return bytes + " B";
58
- if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + " KB";
59
- if (bytes < 1024 * 1024 * 1024) return (bytes / (1024 * 1024)).toFixed(1) + " MB";
60
- return (bytes / (1024 * 1024 * 1024)).toFixed(2) + " GB";
61
- }
62
-
63
- function dlRender() {
64
- var f = dlState.file;
65
- if (!f) return;
66
-
67
- var filenameEl = document.getElementById("dl-filename");
68
- if (filenameEl) filenameEl.textContent = f.filename;
69
-
70
- var subParts = [];
71
- if (f.mime_type) subParts.push(f.mime_type);
72
- if (f.size) subParts.push(dlFormatBytes(f.size));
73
- var subEl = document.getElementById("dl-sub");
74
- if (subEl) subEl.textContent = subParts.join(" \u00B7 ");
75
-
76
- if (f.description) {
77
- var descEl = document.getElementById("dl-description");
78
- if (descEl) {
79
- descEl.textContent = f.description;
80
- descEl.style.display = "block";
81
- }
82
- }
83
-
84
- if (f.expires_at) {
85
- var expEl = document.getElementById("dl-expires");
86
- if (expEl) {
87
- expEl.textContent = "link expires " + f.expires_at;
88
- expEl.style.display = "block";
89
- }
90
- }
91
-
92
- var fallback = document.getElementById("dl-fallback");
93
- if (fallback) fallback.setAttribute("href", f.url);
94
- }
95
-
96
- function dlTriggerDownload() {
97
- var f = dlState.file;
98
- if (!f) return;
99
- var btn = document.getElementById("dl-button");
100
-
101
- if (app && typeof app.downloadFile === "function") {
102
- try {
103
- app.downloadFile({ url: f.url, filename: f.filename });
104
- if (btn) {
105
- btn.textContent = "download again";
106
- btn.classList.remove("btn-copper");
107
- btn.classList.add("btn-ghost");
108
- }
109
- return;
110
- } catch (err) {
111
- console.warn("[pica_download] downloadFile failed:", err);
112
- }
113
- }
114
- }
115
-
116
- window.onPicaToolResult = function (data) {
117
- if (!data || !data.file) return;
118
- dlState.file = data.file;
119
- dlRender();
120
- var btn = document.getElementById("dl-button");
121
- if (btn) btn.addEventListener("click", dlTriggerDownload);
122
- };
123
- `;
124
- export const DOWNLOAD_HTML = buildAppHtml("pica \u2014 download", DOWNLOAD_BODY, DOWNLOAD_JS);
125
- //# sourceMappingURL=download.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"download.js","sourceRoot":"","sources":["../../src/apps/download.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCrB,CAAC;AAEF,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuEnB,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,YAAY,CACvC,sBAAsB,EACtB,aAAa,EACb,WAAW,CACZ,CAAC"}