@withpica/mcp-server 2.35.0 → 2.40.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 (215) hide show
  1. package/CHANGELOG.md +289 -1
  2. package/dist/apps/release.d.ts +2 -0
  3. package/dist/apps/release.d.ts.map +1 -0
  4. package/dist/apps/release.js +69 -0
  5. package/dist/apps/release.js.map +1 -0
  6. package/dist/resources/agent-guide.d.ts +15 -0
  7. package/dist/resources/agent-guide.d.ts.map +1 -0
  8. package/dist/resources/agent-guide.js +120 -0
  9. package/dist/resources/agent-guide.js.map +1 -0
  10. package/dist/resources/index.d.ts.map +1 -1
  11. package/dist/resources/index.js +80 -0
  12. package/dist/resources/index.js.map +1 -1
  13. package/dist/resources/required-schemas.generated.d.ts +128 -0
  14. package/dist/resources/required-schemas.generated.d.ts.map +1 -0
  15. package/dist/resources/required-schemas.generated.js +344 -0
  16. package/dist/resources/required-schemas.generated.js.map +1 -0
  17. package/dist/resources/required-schemas.source.d.ts +53 -0
  18. package/dist/resources/required-schemas.source.d.ts.map +1 -0
  19. package/dist/resources/required-schemas.source.js +127 -0
  20. package/dist/resources/required-schemas.source.js.map +1 -0
  21. package/dist/server-instructions.d.ts +28 -0
  22. package/dist/server-instructions.d.ts.map +1 -1
  23. package/dist/server-instructions.js +34 -0
  24. package/dist/server-instructions.js.map +1 -1
  25. package/dist/server.d.ts.map +1 -1
  26. package/dist/server.js +11 -2
  27. package/dist/server.js.map +1 -1
  28. package/dist/tools/agent-identity.d.ts.map +1 -1
  29. package/dist/tools/agent-identity.js +5 -0
  30. package/dist/tools/agent-identity.js.map +1 -1
  31. package/dist/tools/agreement-types.d.ts.map +1 -1
  32. package/dist/tools/agreement-types.js +8 -0
  33. package/dist/tools/agreement-types.js.map +1 -1
  34. package/dist/tools/agreements.d.ts.map +1 -1
  35. package/dist/tools/agreements.js +6 -0
  36. package/dist/tools/agreements.js.map +1 -1
  37. package/dist/tools/analytics.d.ts.map +1 -1
  38. package/dist/tools/analytics.js +6 -0
  39. package/dist/tools/analytics.js.map +1 -1
  40. package/dist/tools/app-tools.d.ts.map +1 -1
  41. package/dist/tools/app-tools.js +3 -0
  42. package/dist/tools/app-tools.js.map +1 -1
  43. package/dist/tools/assets.d.ts.map +1 -1
  44. package/dist/tools/assets.js +11 -0
  45. package/dist/tools/assets.js.map +1 -1
  46. package/dist/tools/audio-files.d.ts.map +1 -1
  47. package/dist/tools/audio-files.js +6 -0
  48. package/dist/tools/audio-files.js.map +1 -1
  49. package/dist/tools/audit.d.ts +1 -1
  50. package/dist/tools/audit.d.ts.map +1 -1
  51. package/dist/tools/audit.js +2 -1
  52. package/dist/tools/audit.js.map +1 -1
  53. package/dist/tools/auth.d.ts.map +1 -1
  54. package/dist/tools/auth.js +2 -0
  55. package/dist/tools/auth.js.map +1 -1
  56. package/dist/tools/bulk.d.ts.map +1 -1
  57. package/dist/tools/bulk.js +2 -0
  58. package/dist/tools/bulk.js.map +1 -1
  59. package/dist/tools/calendar.d.ts.map +1 -1
  60. package/dist/tools/calendar.js +1 -0
  61. package/dist/tools/calendar.js.map +1 -1
  62. package/dist/tools/collaborators.d.ts.map +1 -1
  63. package/dist/tools/collaborators.js +7 -0
  64. package/dist/tools/collaborators.js.map +1 -1
  65. package/dist/tools/comparisons.d.ts.map +1 -1
  66. package/dist/tools/comparisons.js +2 -0
  67. package/dist/tools/comparisons.js.map +1 -1
  68. package/dist/tools/credits.d.ts +23 -0
  69. package/dist/tools/credits.d.ts.map +1 -1
  70. package/dist/tools/credits.js +202 -0
  71. package/dist/tools/credits.js.map +1 -1
  72. package/dist/tools/custody.d.ts.map +1 -1
  73. package/dist/tools/custody.js +6 -0
  74. package/dist/tools/custody.js.map +1 -1
  75. package/dist/tools/dashboard.d.ts.map +1 -1
  76. package/dist/tools/dashboard.js +8 -0
  77. package/dist/tools/dashboard.js.map +1 -1
  78. package/dist/tools/directory.d.ts.map +1 -1
  79. package/dist/tools/directory.js +1 -0
  80. package/dist/tools/directory.js.map +1 -1
  81. package/dist/tools/discovery.d.ts.map +1 -1
  82. package/dist/tools/discovery.js +27 -2
  83. package/dist/tools/discovery.js.map +1 -1
  84. package/dist/tools/disputes.d.ts.map +1 -1
  85. package/dist/tools/disputes.js +1 -0
  86. package/dist/tools/disputes.js.map +1 -1
  87. package/dist/tools/documents.d.ts.map +1 -1
  88. package/dist/tools/documents.js +1 -0
  89. package/dist/tools/documents.js.map +1 -1
  90. package/dist/tools/duplicates.d.ts.map +1 -1
  91. package/dist/tools/duplicates.js +2 -0
  92. package/dist/tools/duplicates.js.map +1 -1
  93. package/dist/tools/enrichment.d.ts.map +1 -1
  94. package/dist/tools/enrichment.js +11 -0
  95. package/dist/tools/enrichment.js.map +1 -1
  96. package/dist/tools/exports.d.ts.map +1 -1
  97. package/dist/tools/exports.js +5 -0
  98. package/dist/tools/exports.js.map +1 -1
  99. package/dist/tools/feedback.d.ts.map +1 -1
  100. package/dist/tools/feedback.js +1 -0
  101. package/dist/tools/feedback.js.map +1 -1
  102. package/dist/tools/import-documents.d.ts.map +1 -1
  103. package/dist/tools/import-documents.js +3 -0
  104. package/dist/tools/import-documents.js.map +1 -1
  105. package/dist/tools/import.d.ts.map +1 -1
  106. package/dist/tools/import.js +8 -0
  107. package/dist/tools/import.js.map +1 -1
  108. package/dist/tools/index.d.ts +21 -0
  109. package/dist/tools/index.d.ts.map +1 -1
  110. package/dist/tools/index.js +34 -1
  111. package/dist/tools/index.js.map +1 -1
  112. package/dist/tools/integrations.d.ts.map +1 -1
  113. package/dist/tools/integrations.js +1 -0
  114. package/dist/tools/integrations.js.map +1 -1
  115. package/dist/tools/labels.d.ts.map +1 -1
  116. package/dist/tools/labels.js +1 -0
  117. package/dist/tools/labels.js.map +1 -1
  118. package/dist/tools/licensing.d.ts.map +1 -1
  119. package/dist/tools/licensing.js +5 -0
  120. package/dist/tools/licensing.js.map +1 -1
  121. package/dist/tools/memory.d.ts.map +1 -1
  122. package/dist/tools/memory.js +4 -0
  123. package/dist/tools/memory.js.map +1 -1
  124. package/dist/tools/metadata.d.ts.map +1 -1
  125. package/dist/tools/metadata.js +39 -0
  126. package/dist/tools/metadata.js.map +1 -1
  127. package/dist/tools/multimedia.d.ts.map +1 -1
  128. package/dist/tools/multimedia.js +5 -0
  129. package/dist/tools/multimedia.js.map +1 -1
  130. package/dist/tools/my-reported-issues.d.ts.map +1 -1
  131. package/dist/tools/my-reported-issues.js +1 -0
  132. package/dist/tools/my-reported-issues.js.map +1 -1
  133. package/dist/tools/notes.d.ts.map +1 -1
  134. package/dist/tools/notes.js +4 -0
  135. package/dist/tools/notes.js.map +1 -1
  136. package/dist/tools/notifications.d.ts.map +1 -1
  137. package/dist/tools/notifications.js +6 -0
  138. package/dist/tools/notifications.js.map +1 -1
  139. package/dist/tools/onboarding.d.ts.map +1 -1
  140. package/dist/tools/onboarding.js +1 -0
  141. package/dist/tools/onboarding.js.map +1 -1
  142. package/dist/tools/people.d.ts.map +1 -1
  143. package/dist/tools/people.js +5 -0
  144. package/dist/tools/people.js.map +1 -1
  145. package/dist/tools/projects.d.ts.map +1 -1
  146. package/dist/tools/projects.js +6 -0
  147. package/dist/tools/projects.js.map +1 -1
  148. package/dist/tools/public-filter.d.ts.map +1 -1
  149. package/dist/tools/public-filter.js +2 -0
  150. package/dist/tools/public-filter.js.map +1 -1
  151. package/dist/tools/publishers.d.ts.map +1 -1
  152. package/dist/tools/publishers.js +2 -0
  153. package/dist/tools/publishers.js.map +1 -1
  154. package/dist/tools/recording-attribution-hints.d.ts +24 -0
  155. package/dist/tools/recording-attribution-hints.d.ts.map +1 -0
  156. package/dist/tools/recording-attribution-hints.js +27 -0
  157. package/dist/tools/recording-attribution-hints.js.map +1 -0
  158. package/dist/tools/recordings.d.ts.map +1 -1
  159. package/dist/tools/recordings.js +35 -3
  160. package/dist/tools/recordings.js.map +1 -1
  161. package/dist/tools/release-rich.d.ts +31 -0
  162. package/dist/tools/release-rich.d.ts.map +1 -0
  163. package/dist/tools/release-rich.js +241 -0
  164. package/dist/tools/release-rich.js.map +1 -0
  165. package/dist/tools/releases.d.ts.map +1 -1
  166. package/dist/tools/releases.js +14 -0
  167. package/dist/tools/releases.js.map +1 -1
  168. package/dist/tools/report-issue.d.ts.map +1 -1
  169. package/dist/tools/report-issue.js +1 -0
  170. package/dist/tools/report-issue.js.map +1 -1
  171. package/dist/tools/royalties.d.ts.map +1 -1
  172. package/dist/tools/royalties.js +5 -0
  173. package/dist/tools/royalties.js.map +1 -1
  174. package/dist/tools/search.d.ts.map +1 -1
  175. package/dist/tools/search.js +3 -0
  176. package/dist/tools/search.js.map +1 -1
  177. package/dist/tools/send.d.ts.map +1 -1
  178. package/dist/tools/send.js +3 -0
  179. package/dist/tools/send.js.map +1 -1
  180. package/dist/tools/sessions.d.ts.map +1 -1
  181. package/dist/tools/sessions.js +4 -0
  182. package/dist/tools/sessions.js.map +1 -1
  183. package/dist/tools/settings.d.ts.map +1 -1
  184. package/dist/tools/settings.js +9 -0
  185. package/dist/tools/settings.js.map +1 -1
  186. package/dist/tools/share-links.d.ts.map +1 -1
  187. package/dist/tools/share-links.js +5 -0
  188. package/dist/tools/share-links.js.map +1 -1
  189. package/dist/tools/signup.d.ts +26 -0
  190. package/dist/tools/signup.d.ts.map +1 -0
  191. package/dist/tools/signup.js +266 -0
  192. package/dist/tools/signup.js.map +1 -0
  193. package/dist/tools/split-sheets.d.ts.map +1 -1
  194. package/dist/tools/split-sheets.js +7 -0
  195. package/dist/tools/split-sheets.js.map +1 -1
  196. package/dist/tools/subscription.d.ts +60 -0
  197. package/dist/tools/subscription.d.ts.map +1 -0
  198. package/dist/tools/subscription.js +442 -0
  199. package/dist/tools/subscription.js.map +1 -0
  200. package/dist/tools/team.d.ts.map +1 -1
  201. package/dist/tools/team.js +5 -0
  202. package/dist/tools/team.js.map +1 -1
  203. package/dist/tools/telegram.d.ts.map +1 -1
  204. package/dist/tools/telegram.js +3 -0
  205. package/dist/tools/telegram.js.map +1 -1
  206. package/dist/tools/uploads.d.ts.map +1 -1
  207. package/dist/tools/uploads.js +2 -0
  208. package/dist/tools/uploads.js.map +1 -1
  209. package/dist/tools/works.d.ts.map +1 -1
  210. package/dist/tools/works.js +7 -0
  211. package/dist/tools/works.js.map +1 -1
  212. package/package.json +9 -5
  213. package/scripts/build-required-schemas.ts +233 -0
  214. package/scripts/refresh-schema-mirror.ts +182 -0
  215. package/server.json +2 -2
@@ -0,0 +1,182 @@
1
+ // Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
2
+
3
+ /**
4
+ * ADR-214 — refresh schema-mirror.json against staging or prod.
5
+ *
6
+ * Connects to the configured Postgres URL (env var SUPABASE_DB_URL or
7
+ * DATABASE_URL) and queries pg_constraint for CHECK constraints on the
8
+ * tables backing Phase 1 schema resources. Parses the constraint
9
+ * definitions, extracts enum values, writes a deterministic JSON file at
10
+ * mcp-server/src/resources/schema-mirror.json.
11
+ *
12
+ * NOT run by CI — humans run this when they suspect or know that a CHECK
13
+ * constraint changed in production. The mirror is committed to git so PR
14
+ * diffs surface drift.
15
+ *
16
+ * Usage:
17
+ * SUPABASE_DB_URL=postgres://... npx tsx mcp-server/scripts/refresh-schema-mirror.ts
18
+ *
19
+ * Optional dep: `pg` (added as devDependency on mcp-server).
20
+ */
21
+
22
+ import { readFileSync, writeFileSync } from "node:fs";
23
+ import { dirname, join } from "node:path";
24
+ import { fileURLToPath } from "node:url";
25
+
26
+ const __filename = fileURLToPath(import.meta.url);
27
+ const __dirname = dirname(__filename);
28
+ const MIRROR_PATH = join(
29
+ __dirname,
30
+ "..",
31
+ "src/resources/schema-mirror.json",
32
+ );
33
+
34
+ interface MirrorContent {
35
+ _generated_at: string;
36
+ _source: string;
37
+ _note: string;
38
+ [table: string]:
39
+ | string
40
+ | Record<string, string[]>;
41
+ }
42
+
43
+ const TABLES_TO_MIRROR: Array<{ table: string; columns: string[] }> = [
44
+ { table: "audio_files", columns: ["classification", "file_type"] },
45
+ { table: "recording_credits", columns: ["role"] },
46
+ { table: "recordings", columns: ["version_type"] },
47
+ {
48
+ table: "work_credits",
49
+ columns: ["attestation_status", "credit_type", "rights_type"],
50
+ },
51
+ { table: "works", columns: ["work_status", "work_type"] },
52
+ ];
53
+
54
+ function fail(msg: string): never {
55
+ console.error(`[refresh-schema-mirror] ERROR: ${msg}`);
56
+ process.exit(1);
57
+ }
58
+
59
+ /**
60
+ * Parse a CHECK constraint definition string for ANY-of-array shapes.
61
+ * Postgres formats vary; common shapes:
62
+ * CHECK ((work_type = ANY (ARRAY['song'::text, 'instrumental'::text, ...])))
63
+ * CHECK ((work_type::text = ANY (ARRAY['song'::text, ...])))
64
+ * CHECK (work_type IN ('song', 'instrumental', ...))
65
+ * Returns the literal values in source order; caller sorts for determinism.
66
+ */
67
+ function parseEnumFromCheckDef(def: string): string[] | null {
68
+ // Match ARRAY[...] form
69
+ const arrayMatch = def.match(/ARRAY\[([^\]]+)\]/);
70
+ if (arrayMatch) {
71
+ const inside = arrayMatch[1];
72
+ const literals = [...inside.matchAll(/'([^']+)'/g)].map((m) => m[1]);
73
+ return literals.length > 0 ? literals : null;
74
+ }
75
+ // Match IN (...) form
76
+ const inMatch = def.match(/IN\s*\(([^)]+)\)/i);
77
+ if (inMatch) {
78
+ const inside = inMatch[1];
79
+ const literals = [...inside.matchAll(/'([^']+)'/g)].map((m) => m[1]);
80
+ return literals.length > 0 ? literals : null;
81
+ }
82
+ return null;
83
+ }
84
+
85
+ async function main(): Promise<void> {
86
+ const dbUrl = process.env.SUPABASE_DB_URL ?? process.env.DATABASE_URL;
87
+ if (!dbUrl) {
88
+ fail(
89
+ "SUPABASE_DB_URL (or DATABASE_URL) env var not set. Provide a Postgres connection string for staging or prod.",
90
+ );
91
+ }
92
+
93
+ // Lazy-import pg so the file type-checks even if pg isn't installed.
94
+ // Generator is the hot path; refresh is operator-only.
95
+ let Client: typeof import("pg").Client;
96
+ try {
97
+ ({ Client } = await import("pg"));
98
+ } catch {
99
+ fail(
100
+ "pg npm package not installed. Run: cd mcp-server && npm install --save-dev pg @types/pg",
101
+ );
102
+ }
103
+
104
+ const client = new Client({ connectionString: dbUrl });
105
+ await client.connect();
106
+
107
+ const out: Record<string, Record<string, string[]>> = {};
108
+
109
+ for (const { table, columns } of TABLES_TO_MIRROR) {
110
+ out[table] = {};
111
+ for (const col of columns) {
112
+ // Find a CHECK constraint on this column. Look for any constraint
113
+ // whose pg_get_constraintdef text references the column name and
114
+ // contains an ANY/IN enum list.
115
+ const result = await client.query<{ def: string }>(
116
+ `
117
+ SELECT pg_get_constraintdef(oid) AS def
118
+ FROM pg_constraint
119
+ WHERE conrelid = $1::regclass
120
+ AND contype = 'c'
121
+ AND pg_get_constraintdef(oid) ILIKE $2
122
+ `,
123
+ [`public.${table}`, `%${col}%`],
124
+ );
125
+
126
+ let values: string[] | null = null;
127
+ for (const row of result.rows) {
128
+ const parsed = parseEnumFromCheckDef(row.def);
129
+ if (parsed && parsed.length > 0) {
130
+ values = parsed;
131
+ break;
132
+ }
133
+ }
134
+ if (!values) {
135
+ console.warn(
136
+ `[refresh-schema-mirror] warn: no enum CHECK found for ${table}.${col}; leaving empty array`,
137
+ );
138
+ values = [];
139
+ }
140
+ out[table][col] = [...values].sort();
141
+ }
142
+ }
143
+
144
+ await client.end();
145
+
146
+ // Preserve metadata from existing mirror if present.
147
+ let existingNote =
148
+ "CHECK constraint enums for tables backing ADR-214 Phase 1 schemas. Refresh via `npx tsx mcp-server/scripts/refresh-schema-mirror.ts` against staging. Committed so PR diffs surface schema drift. See ADR-214 Decision section, Drift Prevention #3.";
149
+ try {
150
+ const prev = JSON.parse(
151
+ readFileSync(MIRROR_PATH, "utf-8"),
152
+ ) as MirrorContent;
153
+ if (typeof prev._note === "string") existingNote = prev._note;
154
+ } catch {
155
+ // first run — fine
156
+ }
157
+
158
+ const sortedTables = Object.keys(out).sort();
159
+ const sortedOut: Record<string, Record<string, string[]>> = {};
160
+ for (const t of sortedTables) {
161
+ const cols = Object.keys(out[t]).sort();
162
+ sortedOut[t] = {};
163
+ for (const c of cols) sortedOut[t][c] = out[t][c];
164
+ }
165
+
166
+ const final: MirrorContent = {
167
+ _generated_at: new Date().toISOString(),
168
+ _source: dbUrl.replace(/:[^:@]+@/, ":***@"),
169
+ _note: existingNote,
170
+ ...sortedOut,
171
+ };
172
+
173
+ writeFileSync(MIRROR_PATH, JSON.stringify(final, null, 2) + "\n", "utf-8");
174
+ console.log(
175
+ `[refresh-schema-mirror] wrote ${sortedTables.length} tables to ${MIRROR_PATH}`,
176
+ );
177
+ }
178
+
179
+ main().catch((err) => {
180
+ console.error(err);
181
+ process.exit(1);
182
+ });
package/server.json CHANGED
@@ -6,12 +6,12 @@
6
6
  "url": "https://github.com/withpica/pica",
7
7
  "source": "github"
8
8
  },
9
- "version": "2.35.0",
9
+ "version": "2.40.0",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "identifier": "@withpica/mcp-server",
14
- "version": "2.35.0",
14
+ "version": "2.40.0",
15
15
  "transport": {
16
16
  "type": "stdio"
17
17
  }