@withpica/mcp-server 2.7.0 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/dist/__mocks__/mppx-mcp-sdk-server.d.ts +6 -0
  2. package/dist/__mocks__/mppx-mcp-sdk-server.d.ts.map +1 -0
  3. package/dist/__mocks__/mppx-mcp-sdk-server.js +6 -0
  4. package/dist/__mocks__/mppx-mcp-sdk-server.js.map +1 -0
  5. package/dist/__mocks__/mppx-server.d.ts +12 -0
  6. package/dist/__mocks__/mppx-server.d.ts.map +1 -0
  7. package/dist/__mocks__/mppx-server.js +12 -0
  8. package/dist/__mocks__/mppx-server.js.map +1 -0
  9. package/dist/apps/download.d.ts +2 -0
  10. package/dist/apps/download.d.ts.map +1 -0
  11. package/dist/apps/download.js +125 -0
  12. package/dist/apps/download.js.map +1 -0
  13. package/dist/apps/generated/shared-bundle.d.ts +5 -0
  14. package/dist/apps/generated/shared-bundle.d.ts.map +1 -0
  15. package/dist/apps/generated/shared-bundle.js +7 -0
  16. package/dist/apps/generated/shared-bundle.js.map +1 -0
  17. package/dist/apps/shared.d.ts +15 -0
  18. package/dist/apps/shared.d.ts.map +1 -0
  19. package/dist/apps/shared.js +480 -0
  20. package/dist/apps/shared.js.map +1 -0
  21. package/dist/apps/upload.d.ts +2 -0
  22. package/dist/apps/upload.d.ts.map +1 -0
  23. package/dist/apps/upload.js +280 -0
  24. package/dist/apps/upload.js.map +1 -0
  25. package/dist/config.d.ts +4 -25
  26. package/dist/config.d.ts.map +1 -1
  27. package/dist/config.js +36 -12
  28. package/dist/config.js.map +1 -1
  29. package/dist/index.d.ts +1 -1
  30. package/dist/index.js +3 -3
  31. package/dist/index.js.map +1 -1
  32. package/dist/prompts/index.d.ts +64 -64
  33. package/dist/prompts/index.js +24 -24
  34. package/dist/prompts/index.js.map +1 -1
  35. package/dist/resources/index.d.ts +55 -53
  36. package/dist/resources/index.d.ts.map +1 -1
  37. package/dist/resources/index.js +133 -54
  38. package/dist/resources/index.js.map +1 -1
  39. package/dist/resources/llms-primer.d.ts +2 -0
  40. package/dist/resources/llms-primer.d.ts.map +1 -0
  41. package/dist/resources/llms-primer.js +68 -0
  42. package/dist/resources/llms-primer.js.map +1 -0
  43. package/dist/server-instructions.d.ts +9 -0
  44. package/dist/server-instructions.d.ts.map +1 -0
  45. package/dist/server-instructions.js +34 -0
  46. package/dist/server-instructions.js.map +1 -0
  47. package/dist/server.d.ts +49 -32
  48. package/dist/server.d.ts.map +1 -1
  49. package/dist/server.js +103 -14
  50. package/dist/server.js.map +1 -1
  51. package/dist/tools/agreement-types.d.ts +27 -0
  52. package/dist/tools/agreement-types.d.ts.map +1 -0
  53. package/dist/tools/agreement-types.js +387 -0
  54. package/dist/tools/agreement-types.js.map +1 -0
  55. package/dist/tools/agreements.d.ts +20 -0
  56. package/dist/tools/agreements.d.ts.map +1 -0
  57. package/dist/tools/agreements.js +363 -0
  58. package/dist/tools/agreements.js.map +1 -0
  59. package/dist/tools/analytics.d.ts +20 -0
  60. package/dist/tools/analytics.d.ts.map +1 -0
  61. package/dist/tools/analytics.js +124 -0
  62. package/dist/tools/analytics.js.map +1 -0
  63. package/dist/tools/app-tools.d.ts +21 -0
  64. package/dist/tools/app-tools.d.ts.map +1 -0
  65. package/dist/tools/app-tools.js +248 -0
  66. package/dist/tools/app-tools.js.map +1 -0
  67. package/dist/tools/assets.d.ts +25 -0
  68. package/dist/tools/assets.d.ts.map +1 -0
  69. package/dist/tools/assets.js +631 -0
  70. package/dist/tools/assets.js.map +1 -0
  71. package/dist/tools/audio-files.d.ts +20 -0
  72. package/dist/tools/audio-files.d.ts.map +1 -0
  73. package/dist/tools/audio-files.js +384 -0
  74. package/dist/tools/audio-files.js.map +1 -0
  75. package/dist/tools/auth.d.ts +22 -0
  76. package/dist/tools/auth.d.ts.map +1 -0
  77. package/dist/tools/auth.js +210 -0
  78. package/dist/tools/auth.js.map +1 -0
  79. package/dist/tools/bulk.d.ts +16 -0
  80. package/dist/tools/bulk.d.ts.map +1 -0
  81. package/dist/tools/bulk.js +85 -0
  82. package/dist/tools/bulk.js.map +1 -0
  83. package/dist/tools/calendar.d.ts +15 -0
  84. package/dist/tools/calendar.d.ts.map +1 -0
  85. package/dist/tools/calendar.js +67 -0
  86. package/dist/tools/calendar.js.map +1 -0
  87. package/dist/tools/collaborators.d.ts +21 -0
  88. package/dist/tools/collaborators.d.ts.map +1 -0
  89. package/dist/tools/collaborators.js +311 -0
  90. package/dist/tools/collaborators.js.map +1 -0
  91. package/dist/tools/comparisons.d.ts +22 -0
  92. package/dist/tools/comparisons.d.ts.map +1 -0
  93. package/dist/tools/comparisons.js +78 -0
  94. package/dist/tools/comparisons.js.map +1 -0
  95. package/dist/tools/credits.d.ts +17 -0
  96. package/dist/tools/credits.d.ts.map +1 -0
  97. package/dist/tools/credits.js +312 -0
  98. package/dist/tools/credits.js.map +1 -0
  99. package/dist/tools/custody-hints.d.ts +16 -0
  100. package/dist/tools/custody-hints.d.ts.map +1 -0
  101. package/dist/tools/custody-hints.js +27 -0
  102. package/dist/tools/custody-hints.js.map +1 -0
  103. package/dist/tools/custody.d.ts +38 -0
  104. package/dist/tools/custody.d.ts.map +1 -0
  105. package/dist/tools/custody.js +274 -0
  106. package/dist/tools/custody.js.map +1 -0
  107. package/dist/tools/dashboard.d.ts +19 -0
  108. package/dist/tools/dashboard.d.ts.map +1 -0
  109. package/dist/tools/dashboard.js +146 -0
  110. package/dist/tools/dashboard.js.map +1 -0
  111. package/dist/tools/directory.d.ts +15 -0
  112. package/dist/tools/directory.d.ts.map +1 -0
  113. package/dist/tools/directory.js +106 -0
  114. package/dist/tools/directory.js.map +1 -0
  115. package/dist/tools/discovery.d.ts +28 -0
  116. package/dist/tools/discovery.d.ts.map +1 -0
  117. package/dist/tools/discovery.js +560 -0
  118. package/dist/tools/discovery.js.map +1 -0
  119. package/dist/tools/disputes.d.ts +18 -0
  120. package/dist/tools/disputes.d.ts.map +1 -0
  121. package/dist/tools/disputes.js +61 -0
  122. package/dist/tools/disputes.js.map +1 -0
  123. package/dist/tools/documents.d.ts +15 -0
  124. package/dist/tools/documents.d.ts.map +1 -0
  125. package/dist/tools/documents.js +36 -0
  126. package/dist/tools/documents.js.map +1 -0
  127. package/dist/tools/duplicates.d.ts +16 -0
  128. package/dist/tools/duplicates.d.ts.map +1 -0
  129. package/dist/tools/duplicates.js +87 -0
  130. package/dist/tools/duplicates.js.map +1 -0
  131. package/dist/tools/enrichment.d.ts +20 -0
  132. package/dist/tools/enrichment.d.ts.map +1 -0
  133. package/dist/tools/enrichment.js +154 -0
  134. package/dist/tools/enrichment.js.map +1 -0
  135. package/dist/tools/exports.d.ts +19 -0
  136. package/dist/tools/exports.d.ts.map +1 -0
  137. package/dist/tools/exports.js +175 -0
  138. package/dist/tools/exports.js.map +1 -0
  139. package/dist/tools/import-documents.d.ts +21 -0
  140. package/dist/tools/import-documents.d.ts.map +1 -0
  141. package/dist/tools/import-documents.js +203 -0
  142. package/dist/tools/import-documents.js.map +1 -0
  143. package/dist/tools/import.d.ts +30 -0
  144. package/dist/tools/import.d.ts.map +1 -0
  145. package/dist/tools/import.js +455 -0
  146. package/dist/tools/import.js.map +1 -0
  147. package/dist/tools/index.d.ts +83 -37
  148. package/dist/tools/index.d.ts.map +1 -1
  149. package/dist/tools/index.js +448 -84
  150. package/dist/tools/index.js.map +1 -1
  151. package/dist/tools/integrations.d.ts +15 -0
  152. package/dist/tools/integrations.d.ts.map +1 -0
  153. package/dist/tools/integrations.js +100 -0
  154. package/dist/tools/integrations.js.map +1 -0
  155. package/dist/tools/licensing.d.ts +40 -0
  156. package/dist/tools/licensing.d.ts.map +1 -0
  157. package/dist/tools/licensing.js +431 -0
  158. package/dist/tools/licensing.js.map +1 -0
  159. package/dist/tools/memory.d.ts +21 -0
  160. package/dist/tools/memory.d.ts.map +1 -0
  161. package/dist/tools/memory.js +116 -0
  162. package/dist/tools/memory.js.map +1 -0
  163. package/dist/tools/metadata.d.ts +15 -0
  164. package/dist/tools/metadata.d.ts.map +1 -0
  165. package/dist/tools/metadata.js +1106 -0
  166. package/dist/tools/metadata.js.map +1 -0
  167. package/dist/tools/multimedia.d.ts +19 -0
  168. package/dist/tools/multimedia.d.ts.map +1 -0
  169. package/dist/tools/multimedia.js +291 -0
  170. package/dist/tools/multimedia.js.map +1 -0
  171. package/dist/tools/notes.d.ts +21 -0
  172. package/dist/tools/notes.d.ts.map +1 -0
  173. package/dist/tools/notes.js +108 -0
  174. package/dist/tools/notes.js.map +1 -0
  175. package/dist/tools/notifications.d.ts +20 -0
  176. package/dist/tools/notifications.d.ts.map +1 -0
  177. package/dist/tools/notifications.js +266 -0
  178. package/dist/tools/notifications.js.map +1 -0
  179. package/dist/tools/people.d.ts +39 -47
  180. package/dist/tools/people.d.ts.map +1 -1
  181. package/dist/tools/people.js +148 -109
  182. package/dist/tools/people.js.map +1 -1
  183. package/dist/tools/projects.d.ts +19 -0
  184. package/dist/tools/projects.d.ts.map +1 -0
  185. package/dist/tools/projects.js +140 -0
  186. package/dist/tools/projects.js.map +1 -0
  187. package/dist/tools/publishers.d.ts +16 -0
  188. package/dist/tools/publishers.d.ts.map +1 -0
  189. package/dist/tools/publishers.js +69 -0
  190. package/dist/tools/publishers.js.map +1 -0
  191. package/dist/tools/purchases.d.ts +15 -0
  192. package/dist/tools/purchases.d.ts.map +1 -0
  193. package/dist/tools/purchases.js +63 -0
  194. package/dist/tools/purchases.js.map +1 -0
  195. package/dist/tools/recordings.d.ts +9 -9
  196. package/dist/tools/recordings.d.ts.map +1 -1
  197. package/dist/tools/recordings.js +136 -48
  198. package/dist/tools/recordings.js.map +1 -1
  199. package/dist/tools/recovery-hints.d.ts +14 -0
  200. package/dist/tools/recovery-hints.d.ts.map +1 -0
  201. package/dist/tools/recovery-hints.js +277 -0
  202. package/dist/tools/recovery-hints.js.map +1 -0
  203. package/dist/tools/releases.d.ts +18 -0
  204. package/dist/tools/releases.d.ts.map +1 -0
  205. package/dist/tools/releases.js +128 -0
  206. package/dist/tools/releases.js.map +1 -0
  207. package/dist/tools/royalties.d.ts +23 -0
  208. package/dist/tools/royalties.d.ts.map +1 -0
  209. package/dist/tools/royalties.js +257 -0
  210. package/dist/tools/royalties.js.map +1 -0
  211. package/dist/tools/search.d.ts +21 -21
  212. package/dist/tools/search.d.ts.map +1 -1
  213. package/dist/tools/search.js +3 -3
  214. package/dist/tools/search.js.map +1 -1
  215. package/dist/tools/send.d.ts +17 -0
  216. package/dist/tools/send.d.ts.map +1 -0
  217. package/dist/tools/send.js +185 -0
  218. package/dist/tools/send.js.map +1 -0
  219. package/dist/tools/sessions.d.ts +18 -0
  220. package/dist/tools/sessions.d.ts.map +1 -0
  221. package/dist/tools/sessions.js +115 -0
  222. package/dist/tools/sessions.js.map +1 -0
  223. package/dist/tools/settings.d.ts +18 -0
  224. package/dist/tools/settings.d.ts.map +1 -0
  225. package/dist/tools/settings.js +96 -0
  226. package/dist/tools/settings.js.map +1 -0
  227. package/dist/tools/share-links.d.ts +19 -0
  228. package/dist/tools/share-links.d.ts.map +1 -0
  229. package/dist/tools/share-links.js +121 -0
  230. package/dist/tools/share-links.js.map +1 -0
  231. package/dist/tools/split-sheets.d.ts +25 -0
  232. package/dist/tools/split-sheets.d.ts.map +1 -0
  233. package/dist/tools/split-sheets.js +307 -0
  234. package/dist/tools/split-sheets.js.map +1 -0
  235. package/dist/tools/team.d.ts +22 -0
  236. package/dist/tools/team.d.ts.map +1 -0
  237. package/dist/tools/team.js +134 -0
  238. package/dist/tools/team.js.map +1 -0
  239. package/dist/tools/telegram.d.ts +21 -0
  240. package/dist/tools/telegram.d.ts.map +1 -0
  241. package/dist/tools/telegram.js +141 -0
  242. package/dist/tools/telegram.js.map +1 -0
  243. package/dist/tools/uploads.d.ts +17 -0
  244. package/dist/tools/uploads.d.ts.map +1 -0
  245. package/dist/tools/uploads.js +156 -0
  246. package/dist/tools/uploads.js.map +1 -0
  247. package/dist/tools/works.d.ts +39 -47
  248. package/dist/tools/works.d.ts.map +1 -1
  249. package/dist/tools/works.js +216 -116
  250. package/dist/tools/works.js.map +1 -1
  251. package/package.json +1 -1
@@ -0,0 +1,280 @@
1
+ // Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
2
+ /**
3
+ * pica_upload MCP App card — generic drop zone.
4
+ *
5
+ * Renders a drop zone + file input, instantiates createUploadManager() from
6
+ * shared.ts, and reports uploaded file metadata back to the agent via
7
+ * app.updateModelContext() once all files have settled.
8
+ *
9
+ * DOM API only — never innerHTML.
10
+ */
11
+ import { buildAppHtml } from "./shared.js";
12
+ const UPLOAD_BODY = `
13
+ <div class="stack gap-6">
14
+ <header>
15
+ <h1 class="heading heading-lg" id="up-title">upload files</h1>
16
+ <p class="text-secondary" id="up-subtitle">drop files here or click to browse</p>
17
+ </header>
18
+
19
+ <section>
20
+ <div id="up-dropzone" class="up-dropzone">
21
+ <p class="text-secondary" id="up-dropzone-label">drop files here or click to browse</p>
22
+ <input type="file" id="up-input" multiple style="display: none;" />
23
+ </div>
24
+ <div id="up-thumbnails" class="up-thumbnails"></div>
25
+ <p class="text-tertiary" id="up-max-msg" style="margin-top: 8px; display: none;"></p>
26
+ <p class="text-tertiary" id="up-status" style="margin-top: 12px; display: none;"></p>
27
+ </section>
28
+ </div>
29
+
30
+ <style>
31
+ .up-dropzone {
32
+ background: rgba(255,255,255,0.03);
33
+ border: 1px dashed rgba(255,255,255,0.15);
34
+ border-radius: 12px;
35
+ padding: 64px 24px;
36
+ text-align: center;
37
+ cursor: pointer;
38
+ transition: background 0.15s, border-color 0.15s;
39
+ }
40
+ .up-dropzone.dragover {
41
+ background: rgba(184,115,51,0.05);
42
+ border-color: var(--accent);
43
+ }
44
+ .up-thumbnails {
45
+ display: flex;
46
+ gap: 12px;
47
+ flex-wrap: wrap;
48
+ margin-top: 16px;
49
+ }
50
+ .up-thumb {
51
+ position: relative;
52
+ min-width: 120px;
53
+ max-width: 180px;
54
+ padding: 12px;
55
+ border-radius: 8px;
56
+ border: 1px solid var(--card-border);
57
+ background: rgba(255,255,255,0.03);
58
+ font-size: 12px;
59
+ }
60
+ .up-thumb-filename {
61
+ color: var(--text-primary);
62
+ word-break: break-all;
63
+ margin-bottom: 4px;
64
+ }
65
+ .up-thumb-state {
66
+ color: var(--text-tertiary);
67
+ font-size: 11px;
68
+ }
69
+ .up-thumb-state-failed { border-color: rgba(255,80,80,0.5); }
70
+ .up-thumb-state-network_error { border-color: rgba(255,165,0,0.4); }
71
+ .up-thumb-state-uploaded { border-color: rgba(135,169,107,0.5); }
72
+ .up-thumb-remove {
73
+ position: absolute; top: 4px; right: 4px;
74
+ width: 18px; height: 18px; border-radius: 50%;
75
+ background: rgba(0,0,0,0.6);
76
+ color: white; font-size: 11px; border: none; cursor: pointer;
77
+ display: flex; align-items: center; justify-content: center;
78
+ }
79
+ @media (max-width: 600px) {
80
+ .up-dropzone { padding: 40px 16px; }
81
+ }
82
+ </style>
83
+ `;
84
+ const UPLOAD_JS = `
85
+ var upState = {
86
+ config: { accept: "any", purpose: null, max_files: null },
87
+ manager: null,
88
+ reported: false,
89
+ };
90
+
91
+ function upAcceptToAttr(accept) {
92
+ switch (accept) {
93
+ case "image": return "image/*";
94
+ case "audio": return "audio/*";
95
+ case "video": return "video/*";
96
+ case "document": return ".pdf,.doc,.docx,.txt,.csv,.xls,.xlsx,.rtf,.md";
97
+ default: return "";
98
+ }
99
+ }
100
+
101
+ function upRender(files) {
102
+ var container = document.getElementById("up-thumbnails");
103
+ if (!container) return;
104
+ container.textContent = "";
105
+
106
+ files.forEach(function (f) {
107
+ var thumb = document.createElement("div");
108
+ thumb.className = "up-thumb up-thumb-state-" + f.state;
109
+
110
+ var name = document.createElement("div");
111
+ name.className = "up-thumb-filename";
112
+ name.textContent = f.filename;
113
+ thumb.appendChild(name);
114
+
115
+ var stateEl = document.createElement("div");
116
+ stateEl.className = "up-thumb-state";
117
+ if (f.state === "uploading") stateEl.textContent = "uploading...";
118
+ else if (f.state === "uploaded") stateEl.textContent = "uploaded";
119
+ else if (f.state === "failed") stateEl.textContent = "failed — click to retry";
120
+ else if (f.state === "network_error") stateEl.textContent = "network error — check connection or use web dashboard";
121
+ else stateEl.textContent = f.state;
122
+ thumb.appendChild(stateEl);
123
+
124
+ if (f.state === "failed") {
125
+ thumb.style.cursor = "pointer";
126
+ thumb.onclick = function () { upState.manager.retryFile(f.id); };
127
+ }
128
+
129
+ var removeBtn = document.createElement("button");
130
+ removeBtn.className = "up-thumb-remove";
131
+ removeBtn.textContent = "\\u00D7";
132
+ removeBtn.onclick = function (e) {
133
+ e.stopPropagation();
134
+ upState.manager.removeFile(f.id);
135
+ };
136
+ thumb.appendChild(removeBtn);
137
+
138
+ container.appendChild(thumb);
139
+ });
140
+
141
+ upMaybeReport(files);
142
+ }
143
+
144
+ function upMaybeReport(files) {
145
+ if (upState.reported) return;
146
+ if (files.length === 0) return;
147
+ var settled = files.every(function (f) {
148
+ return f.state === "uploaded" || f.state === "failed" || f.state === "network_error";
149
+ });
150
+ if (!settled) return;
151
+
152
+ var uploaded = files
153
+ .filter(function (f) { return f.state === "uploaded"; })
154
+ .map(function (f) {
155
+ return {
156
+ id: f.upload_id || null,
157
+ url: f.url,
158
+ mime_type: f.mime_type,
159
+ size: f.size,
160
+ filename: f.filename,
161
+ uploaded_at: f.uploaded_at,
162
+ };
163
+ });
164
+
165
+ upState.reported = true;
166
+
167
+ var status = document.getElementById("up-status");
168
+ if (status) {
169
+ status.style.display = "block";
170
+ status.textContent = uploaded.length + " file(s) uploaded — returning to agent";
171
+ }
172
+
173
+ if (app && typeof app.updateModelContext === "function") {
174
+ try {
175
+ app.updateModelContext({
176
+ context: [{
177
+ type: "text",
178
+ text: JSON.stringify({ uploaded: uploaded }),
179
+ }],
180
+ });
181
+ } catch (err) {
182
+ console.warn("[pica_upload] updateModelContext failed:", err);
183
+ }
184
+ }
185
+ }
186
+
187
+ function upEnforceMaxFiles(incoming) {
188
+ var maxMsgEl = document.getElementById("up-max-msg");
189
+ if (maxMsgEl) {
190
+ maxMsgEl.style.display = "none";
191
+ maxMsgEl.textContent = "";
192
+ }
193
+ var max = upState.config.max_files;
194
+ if (!max || !upState.manager) return incoming;
195
+ var currentCount = upState.manager.getFiles().length;
196
+ var remaining = max - currentCount;
197
+ if (remaining <= 0) {
198
+ if (maxMsgEl) {
199
+ maxMsgEl.textContent = "max " + max + " files — extras ignored";
200
+ maxMsgEl.style.display = "block";
201
+ }
202
+ return [];
203
+ }
204
+ if (incoming.length > remaining) {
205
+ if (maxMsgEl) {
206
+ maxMsgEl.textContent = "max " + max + " files — extras ignored";
207
+ maxMsgEl.style.display = "block";
208
+ }
209
+ return Array.prototype.slice.call(incoming, 0, remaining);
210
+ }
211
+ return incoming;
212
+ }
213
+
214
+ function upSetup() {
215
+ var dz = document.getElementById("up-dropzone");
216
+ var input = document.getElementById("up-input");
217
+ var title = document.getElementById("up-title");
218
+ var subtitle = document.getElementById("up-subtitle");
219
+ var dzLabel = document.getElementById("up-dropzone-label");
220
+
221
+ if (upState.config.purpose && title) {
222
+ title.textContent = "upload: " + upState.config.purpose;
223
+ }
224
+ if (upState.config.accept && upState.config.accept !== "any" && subtitle) {
225
+ subtitle.textContent = "drop " + upState.config.accept + " files here or click to browse";
226
+ if (dzLabel) dzLabel.textContent = "drop " + upState.config.accept + " files here";
227
+ }
228
+
229
+ if (input) {
230
+ input.accept = upAcceptToAttr(upState.config.accept);
231
+ }
232
+ if (!dz || !input) return;
233
+
234
+ dz.addEventListener("click", function () { input.click(); });
235
+ input.addEventListener("change", function (e) {
236
+ if (e.target.files && e.target.files.length) {
237
+ var allowed = upEnforceMaxFiles(e.target.files);
238
+ if (allowed.length) {
239
+ upState.reported = false;
240
+ upState.manager.addFiles(allowed);
241
+ }
242
+ }
243
+ input.value = "";
244
+ });
245
+ dz.addEventListener("dragover", function (e) {
246
+ e.preventDefault();
247
+ dz.classList.add("dragover");
248
+ });
249
+ dz.addEventListener("dragleave", function () { dz.classList.remove("dragover"); });
250
+ dz.addEventListener("drop", function (e) {
251
+ e.preventDefault();
252
+ dz.classList.remove("dragover");
253
+ if (e.dataTransfer && e.dataTransfer.files && e.dataTransfer.files.length) {
254
+ var allowed = upEnforceMaxFiles(e.dataTransfer.files);
255
+ if (allowed.length) {
256
+ upState.reported = false;
257
+ upState.manager.addFiles(allowed);
258
+ }
259
+ }
260
+ });
261
+ }
262
+
263
+ window.onPicaToolResult = function (data) {
264
+ if (data && data.config) {
265
+ upState.config = {
266
+ accept: data.config.accept || "any",
267
+ purpose: data.config.purpose || null,
268
+ max_files: data.config.max_files || null,
269
+ };
270
+ }
271
+ upState.manager = createUploadManager({
272
+ accept: upState.config.accept,
273
+ onStateChange: upRender,
274
+ app: app,
275
+ });
276
+ upSetup();
277
+ };
278
+ `;
279
+ export const UPLOAD_HTML = buildAppHtml("pica \u2014 upload", UPLOAD_BODY, UPLOAD_JS);
280
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/apps/upload.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuEnB,CAAC;AAEF,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkMjB,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CACrC,oBAAoB,EACpB,WAAW,EACX,SAAS,CACV,CAAC"}
package/dist/config.d.ts CHANGED
@@ -1,34 +1,13 @@
1
- /**
2
- * MCP Server Configuration
3
- */
4
1
  export interface ServerConfig {
5
- /**
6
- * PICA API key for authentication
7
- */
8
- picaApiKey: string;
9
- /**
10
- * PICA API base URL
11
- */
2
+ picaApiKey: string | null;
12
3
  picaApiUrl: string;
13
- /**
14
- * Server name shown to AI assistants
15
- */
16
4
  serverName: string;
17
- /**
18
- * Server version
19
- */
20
5
  version: string;
21
- /**
22
- * Enable debug logging
23
- */
24
6
  debug: boolean;
7
+ lobbyMode: boolean;
8
+ credentialsPath: string;
9
+ discoveryMode: boolean;
25
10
  }
26
- /**
27
- * Load configuration from environment variables
28
- */
29
11
  export declare function loadConfig(): ServerConfig;
30
- /**
31
- * Validate configuration
32
- */
33
12
  export declare function validateConfig(config: ServerConfig): void;
34
13
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA;;GAEG;AAEH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,YAAY,CAkBzC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAQzD"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,UAAU,IAAI,YAAY,CA8CzC;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAWzD"}
package/dist/config.js CHANGED
@@ -1,28 +1,52 @@
1
1
  // Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
2
2
  /**
3
- * Load configuration from environment variables
3
+ * MCP Server Configuration
4
4
  */
5
+ import { readCredentials, getDefaultCredentialsPath, } from "@withpica/mcp-utils";
5
6
  export function loadConfig() {
6
- const picaApiKey = process.env.PICA_API_KEY;
7
+ const credentialsPath = process.env.PICA_CREDENTIALS_PATH || getDefaultCredentialsPath();
8
+ const debug = process.env.DEBUG === "true" || process.env.DEBUG === "1";
9
+ // Priority 1: env var
10
+ let picaApiKey = process.env.PICA_API_KEY || null;
11
+ // Priority 2: credentials file
7
12
  if (!picaApiKey) {
8
- throw new Error("PICA_API_KEY environment variable is required.\n" +
9
- "Please set it to your PICA API key:\n" +
10
- 'export PICA_API_KEY="your-api-key-here"');
13
+ const creds = readCredentials(credentialsPath);
14
+ if (creds) {
15
+ picaApiKey = creds.api_key;
16
+ if (debug) {
17
+ console.error(`[MCP Server] Loaded credentials for ${creds.email}`);
18
+ }
19
+ }
20
+ }
21
+ const lobbyMode = !picaApiKey;
22
+ const discoveryMode = process.env.MCP_LAYERED_DISCOVERY === "1";
23
+ if (lobbyMode && debug) {
24
+ console.error("[MCP Server] No API key found — starting in lobby mode");
25
+ }
26
+ if (discoveryMode && debug) {
27
+ console.error("[MCP Server] Layered discovery mode enabled");
11
28
  }
12
29
  return {
13
30
  picaApiKey,
14
31
  picaApiUrl: process.env.PICA_API_URL || "https://withpica.com/api",
15
32
  serverName: "pica-mcp-server",
16
- version: "2.4.0",
17
- debug: process.env.DEBUG === "true" || process.env.DEBUG === "1",
33
+ // KEEP IN SYNC with mcp-server/package.json `version` field. This
34
+ // string surfaces in the boot banner ([MCP Server] Version: ...) and
35
+ // in the MCP `initialize` handshake response under `serverInfo.version`,
36
+ // which is what clients display in their connector UIs. Drift from
37
+ // package.json was caught 2026-04-08 — banner read 2.5.0 long after
38
+ // npm was on 2.6.1.
39
+ version: "2.6.2",
40
+ debug,
41
+ lobbyMode,
42
+ credentialsPath,
43
+ discoveryMode,
18
44
  };
19
45
  }
20
- /**
21
- * Validate configuration
22
- */
23
46
  export function validateConfig(config) {
24
- if (!config.picaApiKey || config.picaApiKey.trim() === "") {
25
- throw new Error("PICA API key cannot be empty");
47
+ if (!config.lobbyMode &&
48
+ (!config.picaApiKey || config.picaApiKey.trim() === "")) {
49
+ throw new Error("PICA API key cannot be empty when not in lobby mode");
26
50
  }
27
51
  if (!config.picaApiUrl || !config.picaApiUrl.startsWith("http")) {
28
52
  throw new Error("Invalid PICA API URL");
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAiC7D;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAE5C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACb,kDAAkD;YAChD,uCAAuC;YACvC,yCAAyC,CAC5C,CAAC;IACJ,CAAC;IAED,OAAO;QACL,UAAU;QACV,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,0BAA0B;QAClE,UAAU,EAAE,iBAAiB;QAC7B,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG;KACjE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAoB;IACjD,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D;;GAEG;AAEH,OAAO,EACL,eAAe,EACf,yBAAyB,GAC1B,MAAM,qBAAqB,CAAC;AAa7B,MAAM,UAAU,UAAU;IACxB,MAAM,eAAe,GACnB,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,yBAAyB,EAAE,CAAC;IACnE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC;IAExE,sBAAsB;IACtB,IAAI,UAAU,GAAkB,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC;IAEjE,+BAA+B;IAC/B,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,KAAK,GAAG,eAAe,CAAC,eAAe,CAAC,CAAC;QAC/C,IAAI,KAAK,EAAE,CAAC;YACV,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC;YAC3B,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,KAAK,CAAC,uCAAuC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,UAAU,CAAC;IAC9B,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,GAAG,CAAC;IAEhE,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI,aAAa,IAAI,KAAK,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO;QACL,UAAU;QACV,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,0BAA0B;QAClE,UAAU,EAAE,iBAAiB;QAC7B,kEAAkE;QAClE,qEAAqE;QACrE,yEAAyE;QACzE,mEAAmE;QACnE,oEAAoE;QACpE,oBAAoB;QACpB,OAAO,EAAE,OAAO;QAChB,KAAK;QACL,SAAS;QACT,eAAe;QACf,aAAa;KACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAoB;IACjD,IACE,CAAC,MAAM,CAAC,SAAS;QACjB,CAAC,CAAC,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EACvD,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
2
  export {};
3
- //# sourceMappingURL=index.d.ts.map
3
+ //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -8,13 +8,13 @@ import { loadConfig, validateConfig } from "./config.js";
8
8
  import { PicaMcpServer } from "./server.js";
9
9
  async function main() {
10
10
  try {
11
- // Load and validate configuration
12
11
  const config = loadConfig();
13
12
  validateConfig(config);
14
- // Create and start server
13
+ if (config.lobbyMode) {
14
+ console.error('[MCP Server] Starting in lobby mode — say "sign me in" to connect');
15
+ }
15
16
  const server = new PicaMcpServer(config);
16
17
  await server.start();
17
- // Handle graceful shutdown
18
18
  process.on("SIGINT", async () => {
19
19
  console.error("[MCP Server] Shutting down...");
20
20
  await server.stop();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,6DAA6D;AAG7D;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,kCAAkC;QAClC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,cAAc,CAAC,MAAM,CAAC,CAAC;QAEvB,0BAA0B;QAC1B,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QAErB,2BAA2B;QAC3B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;YAC9B,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAC/C,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;YAC/B,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAC/C,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,2BAA2B,EAC3B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,6DAA6D;AAE7D;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,cAAc,CAAC,MAAM,CAAC,CAAC;QAEvB,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,OAAO,CAAC,KAAK,CACX,mEAAmE,CACpE,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QAErB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;YAC9B,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAC/C,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;YAC/B,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAC/C,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,2BAA2B,EAC3B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
@@ -3,76 +3,76 @@
3
3
  * Manages pre-configured prompts for common workflows
4
4
  */
5
5
  export interface PromptDefinition {
6
- name: string;
7
- description: string;
8
- arguments?: Array<{
9
6
  name: string;
10
7
  description: string;
11
- required?: boolean;
12
- }>;
8
+ arguments?: Array<{
9
+ name: string;
10
+ description: string;
11
+ required?: boolean;
12
+ }>;
13
13
  }
14
14
  export interface PromptMessage {
15
- role: "user" | "assistant";
16
- content: {
17
- type: string;
18
- text: string;
19
- };
15
+ role: "user" | "assistant";
16
+ content: {
17
+ type: string;
18
+ text: string;
19
+ };
20
20
  }
21
21
  export interface PromptResult {
22
- messages: PromptMessage[];
22
+ messages: PromptMessage[];
23
23
  }
24
24
  export declare class PromptRegistry {
25
- /**
26
- * List all available prompts
27
- */
28
- listPrompts(): PromptDefinition[];
29
- /**
30
- * Get a prompt by name
31
- */
32
- getPrompt(name: string, args?: Record<string, any>): Promise<any>;
33
- /**
34
- * Analyze catalog prompt
35
- */
36
- private getAnalyzeCatalogPrompt;
37
- /**
38
- * Find duplicates prompt
39
- */
40
- private getFindDuplicatesPrompt;
41
- /**
42
- * Enrich metadata prompt
43
- */
44
- private getEnrichMetadataPrompt;
45
- /**
46
- * Verify works prompt
47
- */
48
- private getVerifyWorksPrompt;
49
- /**
50
- * Assess catalog health prompt
51
- */
52
- private getAssessCatalogHealthPrompt;
53
- /**
54
- * Audit credits prompt
55
- */
56
- private getAuditCreditsPrompt;
57
- /**
58
- * New catalog setup prompt — first-time onboarding
59
- */
60
- private getNewCatalogSetupPrompt;
61
- /**
62
- * Close the loop — check a specific work's gaps and offer to fix each one
63
- */
64
- private getCloseTheLoopPrompt;
65
- /**
66
- * Register my works — check registration status and prepare for PRO submission
67
- */
68
- private getRegisterMyWorksPrompt;
69
- /**
70
- * Workspace autopilot — assess state and route to the right workflow
71
- */
72
- private getWorkspaceAutopilotPrompt;
73
- /**
74
- * Prepare for sync — get catalog sync-ready
75
- */
76
- private getPrepareForSyncPrompt;
25
+ /**
26
+ * List all available prompts
27
+ */
28
+ listPrompts(): PromptDefinition[];
29
+ /**
30
+ * Get a prompt by name
31
+ */
32
+ getPrompt(name: string, args?: Record<string, any>): Promise<any>;
33
+ /**
34
+ * Analyze catalog prompt
35
+ */
36
+ private getAnalyzeCatalogPrompt;
37
+ /**
38
+ * Find duplicates prompt
39
+ */
40
+ private getFindDuplicatesPrompt;
41
+ /**
42
+ * Enrich metadata prompt
43
+ */
44
+ private getEnrichMetadataPrompt;
45
+ /**
46
+ * Verify works prompt
47
+ */
48
+ private getVerifyWorksPrompt;
49
+ /**
50
+ * Assess catalog health prompt
51
+ */
52
+ private getAssessCatalogHealthPrompt;
53
+ /**
54
+ * Audit credits prompt
55
+ */
56
+ private getAuditCreditsPrompt;
57
+ /**
58
+ * New catalog setup prompt — first-time onboarding
59
+ */
60
+ private getNewCatalogSetupPrompt;
61
+ /**
62
+ * Close the loop — check a specific work's gaps and offer to fix each one
63
+ */
64
+ private getCloseTheLoopPrompt;
65
+ /**
66
+ * Register my works — check registration status and prepare for PRO submission
67
+ */
68
+ private getRegisterMyWorksPrompt;
69
+ /**
70
+ * Workspace autopilot — assess state and route to the right workflow
71
+ */
72
+ private getWorkspaceAutopilotPrompt;
73
+ /**
74
+ * Prepare for sync — get catalog sync-ready
75
+ */
76
+ private getPrepareForSyncPrompt;
77
77
  }
78
- //# sourceMappingURL=index.d.ts.map
78
+ //# sourceMappingURL=index.d.ts.map