@withpica/mcp-server-directory 1.3.0 → 1.4.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 (97) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/client.d.ts +12 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/client.js +93 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/config.d.ts +9 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +15 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/index.d.ts +3 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +28 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/lib/changelog.d.ts +16 -0
  15. package/dist/lib/changelog.d.ts.map +1 -0
  16. package/dist/lib/changelog.generated.d.ts +4 -0
  17. package/dist/lib/changelog.generated.d.ts.map +1 -0
  18. package/dist/lib/changelog.generated.js +6 -0
  19. package/dist/lib/changelog.generated.js.map +1 -0
  20. package/dist/lib/changelog.js +84 -0
  21. package/dist/lib/changelog.js.map +1 -0
  22. package/dist/prompts/index.d.ts +32 -0
  23. package/dist/prompts/index.d.ts.map +1 -0
  24. package/dist/prompts/index.js +165 -0
  25. package/dist/prompts/index.js.map +1 -0
  26. package/dist/prompts/public-question-atlas.d.ts +121 -0
  27. package/dist/prompts/public-question-atlas.d.ts.map +1 -0
  28. package/dist/prompts/public-question-atlas.js +434 -0
  29. package/dist/prompts/public-question-atlas.js.map +1 -0
  30. package/dist/resources/llms-primer.d.ts +2 -0
  31. package/dist/resources/llms-primer.d.ts.map +1 -0
  32. package/dist/resources/llms-primer.js +35 -0
  33. package/dist/resources/llms-primer.js.map +1 -0
  34. package/dist/server.d.ts +33 -0
  35. package/dist/server.d.ts.map +1 -0
  36. package/dist/server.js +223 -0
  37. package/dist/server.js.map +1 -0
  38. package/dist/skills/index.d.ts +32 -0
  39. package/dist/skills/index.d.ts.map +1 -0
  40. package/dist/skills/index.js +50 -0
  41. package/dist/skills/index.js.map +1 -0
  42. package/dist/skills/skills.generated.d.ts +18 -0
  43. package/dist/skills/skills.generated.d.ts.map +1 -0
  44. package/dist/skills/skills.generated.js +14 -0
  45. package/dist/skills/skills.generated.js.map +1 -0
  46. package/dist/tools/__tests__/release-notes.test.d.ts +2 -0
  47. package/dist/tools/__tests__/release-notes.test.d.ts.map +1 -0
  48. package/dist/tools/__tests__/release-notes.test.js +49 -0
  49. package/dist/tools/__tests__/release-notes.test.js.map +1 -0
  50. package/dist/tools/chain.d.ts +12 -0
  51. package/dist/tools/chain.d.ts.map +1 -0
  52. package/dist/tools/chain.js +109 -0
  53. package/dist/tools/chain.js.map +1 -0
  54. package/dist/tools/index.d.ts +36 -0
  55. package/dist/tools/index.d.ts.map +1 -0
  56. package/dist/tools/index.js +49 -0
  57. package/dist/tools/index.js.map +1 -0
  58. package/dist/tools/people.d.ts +13 -0
  59. package/dist/tools/people.d.ts.map +1 -0
  60. package/dist/tools/people.js +177 -0
  61. package/dist/tools/people.js.map +1 -0
  62. package/dist/tools/recordings.d.ts +12 -0
  63. package/dist/tools/recordings.d.ts.map +1 -0
  64. package/dist/tools/recordings.js +145 -0
  65. package/dist/tools/recordings.js.map +1 -0
  66. package/dist/tools/release-notes.d.ts +22 -0
  67. package/dist/tools/release-notes.d.ts.map +1 -0
  68. package/dist/tools/release-notes.js +102 -0
  69. package/dist/tools/release-notes.js.map +1 -0
  70. package/dist/tools/search.d.ts +12 -0
  71. package/dist/tools/search.d.ts.map +1 -0
  72. package/dist/tools/search.js +56 -0
  73. package/dist/tools/search.js.map +1 -0
  74. package/dist/tools/skills.d.ts +19 -0
  75. package/dist/tools/skills.d.ts.map +1 -0
  76. package/dist/tools/skills.js +127 -0
  77. package/dist/tools/skills.js.map +1 -0
  78. package/dist/tools/works.d.ts +14 -0
  79. package/dist/tools/works.d.ts.map +1 -0
  80. package/dist/tools/works.js +248 -0
  81. package/dist/tools/works.js.map +1 -0
  82. package/dist/utils/errors.d.ts +14 -0
  83. package/dist/utils/errors.d.ts.map +1 -0
  84. package/dist/utils/errors.js +48 -0
  85. package/dist/utils/errors.js.map +1 -0
  86. package/dist/utils/formatting.d.ts +10 -0
  87. package/dist/utils/formatting.d.ts.map +1 -0
  88. package/dist/utils/formatting.js +16 -0
  89. package/dist/utils/formatting.js.map +1 -0
  90. package/package.json +4 -3
  91. package/scripts/build-changelog.ts +25 -0
  92. package/src/lib/changelog.ts +119 -0
  93. package/src/prompts/public-question-atlas.ts +19 -10
  94. package/src/server.ts +19 -0
  95. package/src/tools/__tests__/release-notes.test.ts +62 -0
  96. package/src/tools/index.ts +2 -0
  97. package/src/tools/release-notes.ts +148 -0
@@ -0,0 +1,49 @@
1
+ // Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
2
+ import { DirectoryWorksTools } from "./works.js";
3
+ import { DirectoryPeopleTools } from "./people.js";
4
+ import { DirectorySearchTools } from "./search.js";
5
+ import { DirectoryRecordingsTools } from "./recordings.js";
6
+ import { DirectoryChainTools } from "./chain.js";
7
+ import { DirectorySkillsTools } from "./skills.js";
8
+ import { DirectoryReleaseNotesTools } from "./release-notes.js";
9
+ import { formatError, logError, ToolExecutionError } from "../utils/errors.js";
10
+ export class ToolRegistry {
11
+ tools;
12
+ constructor(client) {
13
+ this.tools = new Map();
14
+ const groups = [
15
+ new DirectoryWorksTools(client),
16
+ new DirectoryPeopleTools(client),
17
+ new DirectorySearchTools(client),
18
+ new DirectoryRecordingsTools(client),
19
+ new DirectoryChainTools(client),
20
+ new DirectorySkillsTools(),
21
+ new DirectoryReleaseNotesTools(client),
22
+ ];
23
+ for (const group of groups) {
24
+ for (const tool of group.getTools()) {
25
+ this.tools.set(tool.definition.name, tool);
26
+ }
27
+ }
28
+ }
29
+ listTools() {
30
+ return Array.from(this.tools.values()).map((t) => t.definition);
31
+ }
32
+ async executeTool(name, args) {
33
+ const tool = this.tools.get(name);
34
+ if (!tool) {
35
+ throw new ToolExecutionError(`Tool not found: ${name}`);
36
+ }
37
+ try {
38
+ return await tool.executor(args);
39
+ }
40
+ catch (error) {
41
+ logError(`Tool execution: ${name}`, error);
42
+ return {
43
+ content: [formatError(error)],
44
+ isError: true,
45
+ };
46
+ }
47
+ }
48
+ }
49
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAG7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AA+B/E,MAAM,OAAO,YAAY;IACf,KAAK,CAGX;IAEF,YAAY,MAAuB;QACjC,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;QAEvB,MAAM,MAAM,GAAG;YACb,IAAI,mBAAmB,CAAC,MAAM,CAAC;YAC/B,IAAI,oBAAoB,CAAC,MAAM,CAAC;YAChC,IAAI,oBAAoB,CAAC,MAAM,CAAC;YAChC,IAAI,wBAAwB,CAAC,MAAM,CAAC;YACpC,IAAI,mBAAmB,CAAC,MAAM,CAAC;YAC/B,IAAI,oBAAoB,EAAE;YAC1B,IAAI,0BAA0B,CAAC,MAAM,CAAC;SACvC,CAAC;QAEF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;gBACpC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS;QACP,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAY,EAAE,IAAyB;QACvD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,kBAAkB,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,mBAAmB,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;YAC3C,OAAO;gBACL,OAAO,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBAC7B,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ import { DirectoryClient } from "../client.js";
2
+ import { ToolDefinition, ToolExecutor } from "./index.js";
3
+ export declare class DirectoryPeopleTools {
4
+ private client;
5
+ constructor(client: DirectoryClient);
6
+ getTools(): Array<{
7
+ definition: ToolDefinition;
8
+ executor: ToolExecutor;
9
+ }>;
10
+ private listPeople;
11
+ private lookupPerson;
12
+ }
13
+ //# sourceMappingURL=people.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"people.d.ts","sourceRoot":"","sources":["../../src/tools/people.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1D,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAkB;gBAEpB,MAAM,EAAE,eAAe;IAInC,QAAQ,IAAI,KAAK,CAAC;QAAE,UAAU,EAAE,cAAc,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAA;KAAE,CAAC;YAwE3D,UAAU;YAwBV,YAAY;CAsF3B"}
@@ -0,0 +1,177 @@
1
+ // Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
2
+ import { formatStructuredList } from "../utils/formatting.js";
3
+ export class DirectoryPeopleTools {
4
+ client;
5
+ constructor(client) {
6
+ this.client = client;
7
+ }
8
+ getTools() {
9
+ return [
10
+ {
11
+ definition: {
12
+ name: "directory_list_people",
13
+ tier: "read",
14
+ description: "Use when the user asks: 'list creators in PICA', 'people starting with B', " +
15
+ "'browse the people directory'. " +
16
+ "Browse and filter creators in the PICA public directory. " +
17
+ "Filter by free-text (q), ISNI, IPI, or starting letter (A–Z, or '#' for numeric). " +
18
+ "Returns paginated results. " +
19
+ "→ then: directory_lookup_person (full profile with works and identifiers)",
20
+ inputSchema: {
21
+ type: "object",
22
+ properties: {
23
+ q: {
24
+ type: "string",
25
+ description: "Text search across creator names",
26
+ },
27
+ isni: {
28
+ type: "string",
29
+ description: "Filter by ISNI identifier",
30
+ },
31
+ ipi: {
32
+ type: "string",
33
+ description: "Filter by IPI number",
34
+ },
35
+ letter: {
36
+ type: "string",
37
+ description: "Filter by last name starting letter (A–Z), or '#' for numeric",
38
+ },
39
+ page: {
40
+ type: "number",
41
+ description: "Page number (default: 1, 20 results per page)",
42
+ },
43
+ },
44
+ },
45
+ },
46
+ executor: this.listPeople.bind(this),
47
+ },
48
+ {
49
+ definition: {
50
+ name: "directory_lookup_person",
51
+ tier: "read",
52
+ description: "Use when the user asks: 'lookup IPI 12345', 'who is creator X?', " +
53
+ "'tell me about creator X', 'lookup ISNI X'. " +
54
+ "Also call this BEFORE directory_list_works when the input person name is ambiguous " +
55
+ "(e.g. 'Bowie', 'Sade', 'Madonna') to surface candidate persons for disambiguation. " +
56
+ "Get full details of a creator by global creator ID (UUID), ISNI, IPI number, or MusicBrainz ID. " +
57
+ "Returns identifiers, credited works with roles, collaborator network, and verification score " +
58
+ "as a structured markdown summary. " +
59
+ "→ then: directory_lookup_work (inspect a credited work), directory_search_recordings (find their recordings by audio)",
60
+ inputSchema: {
61
+ type: "object",
62
+ properties: {
63
+ id: {
64
+ type: "string",
65
+ description: "Global creator ID (UUID), ISNI, IPI number, or MusicBrainz ID",
66
+ },
67
+ },
68
+ required: ["id"],
69
+ },
70
+ },
71
+ executor: this.lookupPerson.bind(this),
72
+ },
73
+ ];
74
+ }
75
+ async listPeople(args) {
76
+ const page = Math.max(args.page || 1, 1);
77
+ const limit = 20;
78
+ const offset = (page - 1) * limit;
79
+ const params = {
80
+ limit: String(limit),
81
+ offset: String(offset),
82
+ };
83
+ if (args.q)
84
+ params.q = args.q;
85
+ if (args.isni)
86
+ params.isni = args.isni;
87
+ if (args.ipi)
88
+ params.ipi = args.ipi;
89
+ if (args.letter)
90
+ params.letter = args.letter;
91
+ const response = await this.client.request("/people", params);
92
+ return formatStructuredList(response.data || [], "creator", {
93
+ page,
94
+ total: response.pagination?.total || 0,
95
+ total_pages: Math.ceil((response.pagination?.total || 0) / limit),
96
+ });
97
+ }
98
+ async lookupPerson(args) {
99
+ const response = await this.client.request(`/people/${encodeURIComponent(args.id)}`);
100
+ const data = response.data;
101
+ if (!data) {
102
+ return {
103
+ content: [{ type: "text", text: "Person not found." }],
104
+ structuredContent: {},
105
+ };
106
+ }
107
+ const lines = [];
108
+ const name = data.name || data.full_name || data.display_name || "Unknown";
109
+ lines.push(`## ${name}`);
110
+ lines.push("");
111
+ if (data.score !== undefined && data.score !== null) {
112
+ const tier = data.score >= 80
113
+ ? "verified"
114
+ : data.score >= 50
115
+ ? "partial"
116
+ : "incomplete";
117
+ lines.push(`- **Score:** ${data.score}/100 (${tier})`);
118
+ lines.push("");
119
+ }
120
+ const identifiers = [];
121
+ if (data.ipi || data.ipi_number)
122
+ identifiers.push({ type: "IPI", value: data.ipi || data.ipi_number });
123
+ if (data.isni)
124
+ identifiers.push({ type: "ISNI", value: data.isni });
125
+ if (data.musicbrainz_id)
126
+ identifiers.push({ type: "MusicBrainz", value: data.musicbrainz_id });
127
+ if (data.ipn)
128
+ identifiers.push({ type: "IPN", value: data.ipn });
129
+ lines.push("### Identifiers");
130
+ if (identifiers.length > 0) {
131
+ lines.push("| Type | Value |");
132
+ lines.push("| --- | --- |");
133
+ for (const id of identifiers) {
134
+ lines.push(`| ${id.type} | ${id.value} |`);
135
+ }
136
+ }
137
+ else {
138
+ lines.push("_No identifiers recorded._");
139
+ }
140
+ lines.push("");
141
+ const works = data.works || data.credited_works || [];
142
+ lines.push(`### Works (${works.length})`);
143
+ if (works.length > 0) {
144
+ lines.push("| Title | Role |");
145
+ lines.push("| --- | --- |");
146
+ for (const w of works) {
147
+ const title = w.title || "—";
148
+ const role = w.role || w.credit_role || "—";
149
+ lines.push(`| ${title} | ${role} |`);
150
+ }
151
+ }
152
+ else {
153
+ lines.push("_No works recorded._");
154
+ }
155
+ lines.push("");
156
+ const collaborators = data.collaborators || [];
157
+ lines.push(`### Collaborators (${collaborators.length})`);
158
+ if (collaborators.length > 0) {
159
+ lines.push("| Name |");
160
+ lines.push("| --- |");
161
+ for (const c of collaborators) {
162
+ const colName = c.name || c.full_name || c.display_name || "—";
163
+ lines.push(`| ${colName} |`);
164
+ }
165
+ }
166
+ else {
167
+ lines.push("_No collaborators recorded._");
168
+ }
169
+ lines.push("");
170
+ const markdown = lines.join("\n");
171
+ return {
172
+ content: [{ type: "text", text: markdown }],
173
+ structuredContent: data,
174
+ };
175
+ }
176
+ }
177
+ //# sourceMappingURL=people.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"people.js","sourceRoot":"","sources":["../../src/tools/people.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { DirectoryClient } from "../client.js";
2
+ import { ToolDefinition, ToolExecutor } from "./index.js";
3
+ export declare class DirectoryRecordingsTools {
4
+ private client;
5
+ constructor(client: DirectoryClient);
6
+ getTools(): Array<{
7
+ definition: ToolDefinition;
8
+ executor: ToolExecutor;
9
+ }>;
10
+ private searchRecordings;
11
+ }
12
+ //# sourceMappingURL=recordings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recordings.d.ts","sourceRoot":"","sources":["../../src/tools/recordings.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1D,qBAAa,wBAAwB;IACnC,OAAO,CAAC,MAAM,CAAkB;gBAEpB,MAAM,EAAE,eAAe;IAInC,QAAQ,IAAI,KAAK,CAAC;QAAE,UAAU,EAAE,cAAc,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAA;KAAE,CAAC;YAqF3D,gBAAgB;CAkD/B"}
@@ -0,0 +1,145 @@
1
+ // Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
2
+ import { formatStructuredList } from "../utils/formatting.js";
3
+ export class DirectoryRecordingsTools {
4
+ client;
5
+ constructor(client) {
6
+ this.client = client;
7
+ }
8
+ getTools() {
9
+ return [
10
+ {
11
+ definition: {
12
+ name: "directory_search_recordings",
13
+ tier: "read",
14
+ description: "Use when the user asks: 'find upbeat tracks around 120 BPM', " +
15
+ "'find instrumental tracks in C minor', 'find energetic music for sync', " +
16
+ "'tracks at X BPM in [key]'. " +
17
+ "AUDIO-FEATURE search only — for name- or title-shaped queries use directory_lookup_work, " +
18
+ "directory_lookup_isrc, or directory_lookup_person, NOT this tool. " +
19
+ "Find tracks by BPM, key, energy, danceability, duration, and more. " +
20
+ "Only returns recordings from organisations that have opted into the directory. " +
21
+ "→ then: directory_lookup_work (credits and licensing details for a matched track)",
22
+ inputSchema: {
23
+ type: "object",
24
+ properties: {
25
+ min_bpm: {
26
+ type: "number",
27
+ description: "Minimum BPM (e.g. 100)",
28
+ },
29
+ max_bpm: {
30
+ type: "number",
31
+ description: "Maximum BPM (e.g. 140)",
32
+ },
33
+ key: {
34
+ type: "string",
35
+ description: "Musical key (e.g. 'C', 'F#', 'Bb'). Matches the detected key.",
36
+ },
37
+ key_mode: {
38
+ type: "string",
39
+ enum: ["major", "minor"],
40
+ description: "Key mode — major or minor",
41
+ },
42
+ min_energy: {
43
+ type: "number",
44
+ description: "Minimum energy (0-1). Higher = more energetic.",
45
+ },
46
+ max_energy: {
47
+ type: "number",
48
+ description: "Maximum energy (0-1).",
49
+ },
50
+ min_danceability: {
51
+ type: "number",
52
+ description: "Minimum danceability (0-1). Higher = more danceable.",
53
+ },
54
+ max_danceability: {
55
+ type: "number",
56
+ description: "Maximum danceability (0-1).",
57
+ },
58
+ min_duration: {
59
+ type: "number",
60
+ description: "Minimum duration in seconds.",
61
+ },
62
+ max_duration: {
63
+ type: "number",
64
+ description: "Maximum duration in seconds.",
65
+ },
66
+ vocals_only: {
67
+ type: "boolean",
68
+ description: "Only return tracks with vocals.",
69
+ },
70
+ instrumental_only: {
71
+ type: "boolean",
72
+ description: "Only return instrumental tracks.",
73
+ },
74
+ mood: {
75
+ type: "string",
76
+ description: "Filter by mood (exact match).",
77
+ },
78
+ limit: {
79
+ type: "number",
80
+ description: "Max results to return (default: 20, max: 100).",
81
+ },
82
+ },
83
+ },
84
+ },
85
+ executor: this.searchRecordings.bind(this),
86
+ },
87
+ ];
88
+ }
89
+ async searchRecordings(args) {
90
+ const params = {};
91
+ // Map all filters to query params
92
+ const numericKeys = [
93
+ "min_bpm",
94
+ "max_bpm",
95
+ "min_energy",
96
+ "max_energy",
97
+ "min_danceability",
98
+ "max_danceability",
99
+ "min_duration",
100
+ "max_duration",
101
+ "limit",
102
+ ];
103
+ for (const k of numericKeys) {
104
+ if (args[k] != null)
105
+ params[k] = String(args[k]);
106
+ }
107
+ if (args.key)
108
+ params.key = args.key;
109
+ if (args.key_mode)
110
+ params.key_mode = args.key_mode;
111
+ if (args.mood)
112
+ params.mood = args.mood;
113
+ if (args.vocals_only)
114
+ params.vocals_only = "true";
115
+ if (args.instrumental_only)
116
+ params.instrumental_only = "true";
117
+ const response = await this.client.request("/recordings", params);
118
+ const recordings = response.data || [];
119
+ // Format each recording for readability
120
+ const formatted = recordings.map((r) => {
121
+ const parts = [`${r.title} (${r.isrc})`];
122
+ if (r.artist_name)
123
+ parts.push(`Artist: ${r.artist_name}`);
124
+ if (r.bpm)
125
+ parts.push(`BPM: ${Math.round(r.bpm)}`);
126
+ if (r.key)
127
+ parts.push(`Key: ${r.key}${r.key_mode ? ` ${r.key_mode}` : ""}`);
128
+ if (r.energy != null)
129
+ parts.push(`Energy: ${r.energy}`);
130
+ if (r.duration_seconds)
131
+ parts.push(`Duration: ${Math.round(r.duration_seconds)}s`);
132
+ if (r.has_vocals != null)
133
+ parts.push(r.has_vocals ? "Vocals: yes" : "Instrumental");
134
+ if (r.owner_org_name)
135
+ parts.push(`Owner: ${r.owner_org_name}`);
136
+ if (r.work_title)
137
+ parts.push(`Work: ${r.work_title}`);
138
+ return { ...r, _summary: parts.join(" | ") };
139
+ });
140
+ return formatStructuredList(formatted, "recording", {
141
+ filters: args,
142
+ });
143
+ }
144
+ }
145
+ //# sourceMappingURL=recordings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recordings.js","sourceRoot":"","sources":["../../src/tools/recordings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * directory_release_notes — what shipped in the PICA directory MCP.
3
+ *
4
+ * Reads CHANGELOG.md embedded at build time via scripts/build-changelog.ts.
5
+ * Sister of pica_release_notes (creator MCP) and team_release_notes (team MCP).
6
+ *
7
+ * Public-facing MCP — no trade-secret content in the description (per
8
+ * .claude/rules/ip-protection.md). The CHANGELOG body is the same file
9
+ * shipped in the npm tarball, already vetted as public.
10
+ */
11
+ import { DirectoryClient } from "../client.js";
12
+ import { ToolDefinition, ToolExecutor } from "./index.js";
13
+ export declare class DirectoryReleaseNotesTools {
14
+ private client;
15
+ constructor(client: DirectoryClient);
16
+ getTools(): Array<{
17
+ definition: ToolDefinition;
18
+ executor: ToolExecutor;
19
+ }>;
20
+ private releaseNotes;
21
+ }
22
+ //# sourceMappingURL=release-notes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-notes.d.ts","sourceRoot":"","sources":["../../src/tools/release-notes.ts"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAc,MAAM,YAAY,CAAC;AAyBtE,qBAAa,0BAA0B;IACzB,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,eAAe;IAE3C,QAAQ,IAAI,KAAK,CAAC;QAAE,UAAU,EAAE,cAAc,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAA;KAAE,CAAC;IA6CzE,OAAO,CAAC,YAAY,CAyDlB;CACH"}
@@ -0,0 +1,102 @@
1
+ // Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
2
+ import { parseChangelogText, CHANGELOG_SECTION_NAMES, } from "../lib/changelog.js";
3
+ import { CHANGELOG_MD, PACKAGE_NAME, PACKAGE_VERSION, } from "../lib/changelog.generated.js";
4
+ const RESOURCE_URI = "release-notes://withpica/mcp-server-directory/latest";
5
+ const DEFAULT_LIMIT = 3;
6
+ const MAX_LIMIT = 20;
7
+ function compareSemver(a, b) {
8
+ const parse = (v) => v.split(".").map((n) => parseInt(n, 10) || 0);
9
+ const [a1, a2, a3] = parse(a);
10
+ const [b1, b2, b3] = parse(b);
11
+ if (a1 !== b1)
12
+ return a1 - b1;
13
+ if (a2 !== b2)
14
+ return a2 - b2;
15
+ return a3 - b3;
16
+ }
17
+ export class DirectoryReleaseNotesTools {
18
+ client;
19
+ constructor(client) {
20
+ this.client = client;
21
+ }
22
+ getTools() {
23
+ return [
24
+ {
25
+ definition: {
26
+ name: "directory_release_notes",
27
+ tier: "read",
28
+ description: "Use when the user asks: 'what's new in the directory mcp', " +
29
+ "'what changed in the directory', 'directory release notes', " +
30
+ "'what version is the directory on'. " +
31
+ "Returns recent releases of the PICA directory MCP server — " +
32
+ "what shipped in the public catalogue surface itself. " +
33
+ "NOT for catalogue content searches (use directory_search / " +
34
+ "directory_list_works / directory_chain for those). " +
35
+ "Returns { package, current_version, releases: [{ version, date, sections, markdown }], resource_uri }. " +
36
+ "Defaults to the last 3 releases; use `since_version` to bound the output " +
37
+ "or `sections` to filter to Added/Fixed/etc.",
38
+ inputSchema: {
39
+ type: "object",
40
+ properties: {
41
+ since_version: {
42
+ type: "string",
43
+ description: "If set, returns only releases strictly greater than this version " +
44
+ "(semver-compared). Versions equal to since_version are excluded.",
45
+ },
46
+ limit: {
47
+ type: "number",
48
+ description: `Maximum number of releases to return. Default ${DEFAULT_LIMIT}, max ${MAX_LIMIT}.`,
49
+ },
50
+ sections: {
51
+ type: "array",
52
+ items: { type: "string", enum: [...CHANGELOG_SECTION_NAMES] },
53
+ description: "Filter each release's sections to only these names " +
54
+ "(e.g. ['Added', 'Fixed']). Sections not in the list are omitted from output.",
55
+ },
56
+ },
57
+ },
58
+ },
59
+ executor: this.releaseNotes.bind(this),
60
+ },
61
+ ];
62
+ }
63
+ releaseNotes = async (args) => {
64
+ const sinceVersion = typeof args.since_version === "string" ? args.since_version : null;
65
+ const rawLimit = typeof args.limit === "number" ? args.limit : DEFAULT_LIMIT;
66
+ const limit = Math.max(1, Math.min(MAX_LIMIT, Math.floor(rawLimit)));
67
+ const sectionFilter = Array.isArray(args.sections)
68
+ ? args.sections.filter((s) => CHANGELOG_SECTION_NAMES.includes(s))
69
+ : null;
70
+ const all = parseChangelogText(CHANGELOG_MD);
71
+ let filtered = all;
72
+ if (sinceVersion) {
73
+ filtered = all.filter((e) => compareSemver(e.version, sinceVersion) > 0);
74
+ }
75
+ filtered = filtered.slice(0, limit);
76
+ const releases = filtered.map((e) => {
77
+ const sections = sectionFilter
78
+ ? Object.fromEntries(Object.entries(e.sections).filter(([k]) => sectionFilter.includes(k)))
79
+ : e.sections;
80
+ return {
81
+ version: e.version,
82
+ date: e.date,
83
+ sections,
84
+ markdown: e.markdown,
85
+ };
86
+ });
87
+ return {
88
+ content: [
89
+ {
90
+ type: "text",
91
+ text: JSON.stringify({
92
+ package: PACKAGE_NAME,
93
+ current_version: PACKAGE_VERSION,
94
+ releases,
95
+ resource_uri: RESOURCE_URI,
96
+ }, null, 2),
97
+ },
98
+ ],
99
+ };
100
+ };
101
+ }
102
+ //# sourceMappingURL=release-notes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-notes.js","sourceRoot":"","sources":["../../src/tools/release-notes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { DirectoryClient } from "../client.js";
2
+ import { ToolDefinition, ToolExecutor } from "./index.js";
3
+ export declare class DirectorySearchTools {
4
+ private client;
5
+ constructor(client: DirectoryClient);
6
+ getTools(): Array<{
7
+ definition: ToolDefinition;
8
+ executor: ToolExecutor;
9
+ }>;
10
+ private search;
11
+ }
12
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1D,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAkB;gBAEpB,MAAM,EAAE,eAAe;IAInC,QAAQ,IAAI,KAAK,CAAC;QAAE,UAAU,EAAE,cAAc,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAA;KAAE,CAAC;YAmC3D,MAAM;CAiBrB"}
@@ -0,0 +1,56 @@
1
+ // Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
2
+ import { formatStructuredList } from "../utils/formatting.js";
3
+ export class DirectorySearchTools {
4
+ client;
5
+ constructor(client) {
6
+ this.client = client;
7
+ }
8
+ getTools() {
9
+ return [
10
+ {
11
+ definition: {
12
+ name: "directory_search",
13
+ tier: "read",
14
+ description: "Use when the user asks: 'find me X', 'who or what is X?', " +
15
+ "'find any record of X'. " +
16
+ "Use when the entity type is not yet known. " +
17
+ "Convenience fan-out across works and creators — runs list_works and list_people with the same query and returns the union. " +
18
+ "No cross-type ranking; prefer list_works or list_people when the entity type is known. " +
19
+ "→ then: directory_lookup_work (work details), directory_lookup_person (creator details)",
20
+ inputSchema: {
21
+ type: "object",
22
+ properties: {
23
+ query: {
24
+ type: "string",
25
+ description: "Search query — matches work titles, ISWCs, creator names, ISNIs",
26
+ },
27
+ type: {
28
+ type: "string",
29
+ enum: ["works", "people"],
30
+ description: "Limit results to a specific entity type",
31
+ },
32
+ },
33
+ required: ["query"],
34
+ },
35
+ },
36
+ executor: this.search.bind(this),
37
+ },
38
+ ];
39
+ }
40
+ async search(args) {
41
+ const params = {
42
+ q: args.query,
43
+ limit: "20",
44
+ offset: "0",
45
+ };
46
+ if (args.type)
47
+ params.type = args.type;
48
+ const response = await this.client.request("/search", params);
49
+ return formatStructuredList(response.data || [], "result", {
50
+ query: args.query,
51
+ type: args.type || "all",
52
+ total: response.pagination?.total || 0,
53
+ });
54
+ }
55
+ }
56
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAI7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,OAAO,oBAAoB;IACvB,MAAM,CAAkB;IAEhC,YAAY,MAAuB;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,QAAQ;QACN,OAAO;YACL;gBACE,UAAU,EAAE;oBACV,IAAI,EAAE,kBAAkB;oBACxB,IAAI,EAAE,MAAM;oBACZ,WAAW,EACT,4DAA4D;wBAC5D,0BAA0B;wBAC1B,6CAA6C;wBAC7C,6HAA6H;wBAC7H,yFAAyF;wBACzF,yFAAyF;oBAC3F,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,KAAK,EAAE;gCACL,IAAI,EAAE,QAAQ;gCACd,WAAW,EACT,iEAAiE;6BACpE;4BACD,IAAI,EAAE;gCACJ,IAAI,EAAE,QAAQ;gCACd,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC;gCACzB,WAAW,EAAE,yCAAyC;6BACvD;yBACF;wBACD,QAAQ,EAAE,CAAC,OAAO,CAAC;qBACpB;iBACF;gBACD,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;aACjC;SACF,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,MAAM,CAAC,IAAyB;QAC5C,MAAM,MAAM,GAA2B;YACrC,CAAC,EAAE,IAAI,CAAC,KAAK;YACb,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,GAAG;SACZ,CAAC;QAEF,IAAI,IAAI,CAAC,IAAI;YAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAEvC,MAAM,QAAQ,GAAQ,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAEnE,OAAO,oBAAoB,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,EAAE,QAAQ,EAAE;YACzD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,KAAK;YACxB,KAAK,EAAE,QAAQ,CAAC,UAAU,EAAE,KAAK,IAAI,CAAC;SACvC,CAAC,CAAC;IACL,CAAC;CACF"}