@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.
- package/CHANGELOG.md +28 -0
- package/dist/client.d.ts +12 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +93 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +9 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +15 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/changelog.d.ts +16 -0
- package/dist/lib/changelog.d.ts.map +1 -0
- package/dist/lib/changelog.generated.d.ts +4 -0
- package/dist/lib/changelog.generated.d.ts.map +1 -0
- package/dist/lib/changelog.generated.js +6 -0
- package/dist/lib/changelog.generated.js.map +1 -0
- package/dist/lib/changelog.js +84 -0
- package/dist/lib/changelog.js.map +1 -0
- package/dist/prompts/index.d.ts +32 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +165 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/public-question-atlas.d.ts +121 -0
- package/dist/prompts/public-question-atlas.d.ts.map +1 -0
- package/dist/prompts/public-question-atlas.js +434 -0
- package/dist/prompts/public-question-atlas.js.map +1 -0
- package/dist/resources/llms-primer.d.ts +2 -0
- package/dist/resources/llms-primer.d.ts.map +1 -0
- package/dist/resources/llms-primer.js +35 -0
- package/dist/resources/llms-primer.js.map +1 -0
- package/dist/server.d.ts +33 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +223 -0
- package/dist/server.js.map +1 -0
- package/dist/skills/index.d.ts +32 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +50 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/skills.generated.d.ts +18 -0
- package/dist/skills/skills.generated.d.ts.map +1 -0
- package/dist/skills/skills.generated.js +14 -0
- package/dist/skills/skills.generated.js.map +1 -0
- package/dist/tools/__tests__/release-notes.test.d.ts +2 -0
- package/dist/tools/__tests__/release-notes.test.d.ts.map +1 -0
- package/dist/tools/__tests__/release-notes.test.js +49 -0
- package/dist/tools/__tests__/release-notes.test.js.map +1 -0
- package/dist/tools/chain.d.ts +12 -0
- package/dist/tools/chain.d.ts.map +1 -0
- package/dist/tools/chain.js +109 -0
- package/dist/tools/chain.js.map +1 -0
- package/dist/tools/index.d.ts +36 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +49 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/people.d.ts +13 -0
- package/dist/tools/people.d.ts.map +1 -0
- package/dist/tools/people.js +177 -0
- package/dist/tools/people.js.map +1 -0
- package/dist/tools/recordings.d.ts +12 -0
- package/dist/tools/recordings.d.ts.map +1 -0
- package/dist/tools/recordings.js +145 -0
- package/dist/tools/recordings.js.map +1 -0
- package/dist/tools/release-notes.d.ts +22 -0
- package/dist/tools/release-notes.d.ts.map +1 -0
- package/dist/tools/release-notes.js +102 -0
- package/dist/tools/release-notes.js.map +1 -0
- package/dist/tools/search.d.ts +12 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +56 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/skills.d.ts +19 -0
- package/dist/tools/skills.d.ts.map +1 -0
- package/dist/tools/skills.js +127 -0
- package/dist/tools/skills.js.map +1 -0
- package/dist/tools/works.d.ts +14 -0
- package/dist/tools/works.d.ts.map +1 -0
- package/dist/tools/works.js +248 -0
- package/dist/tools/works.js.map +1 -0
- package/dist/utils/errors.d.ts +14 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +48 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/formatting.d.ts +10 -0
- package/dist/utils/formatting.d.ts.map +1 -0
- package/dist/utils/formatting.js +16 -0
- package/dist/utils/formatting.js.map +1 -0
- package/package.json +4 -3
- package/scripts/build-changelog.ts +25 -0
- package/src/lib/changelog.ts +119 -0
- package/src/prompts/public-question-atlas.ts +19 -10
- package/src/server.ts +19 -0
- package/src/tools/__tests__/release-notes.test.ts +62 -0
- package/src/tools/index.ts +2 -0
- package/src/tools/release-notes.ts +148 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Directory MCP skill tools — ADR-140 Phase 2b
|
|
3
|
+
*
|
|
4
|
+
* Sister of mcp-server/src/tools/skills.ts. Two meta-tools — list and get —
|
|
5
|
+
* named `directory_skill_*` to match the directory MCP's `directory_*` prefix
|
|
6
|
+
* convention. Same lazy-loading shape as the creator MCP variant.
|
|
7
|
+
*/
|
|
8
|
+
import { ToolDefinition, ToolExecutor } from "./index.js";
|
|
9
|
+
export declare class DirectorySkillsTools {
|
|
10
|
+
private registry;
|
|
11
|
+
constructor();
|
|
12
|
+
getTools(): Array<{
|
|
13
|
+
definition: ToolDefinition;
|
|
14
|
+
executor: ToolExecutor;
|
|
15
|
+
}>;
|
|
16
|
+
private listSkills;
|
|
17
|
+
private getSkill;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=skills.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/tools/skills.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH,OAAO,EAAE,cAAc,EAAE,YAAY,EAAc,MAAM,YAAY,CAAC;AAGtE,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAiB;;IAMjC,QAAQ,IAAI,KAAK,CAAC;QAAE,UAAU,EAAE,cAAc,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAA;KAAE,CAAC;YA4C3D,UAAU;YAsBV,QAAQ;CA2DvB"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
|
|
2
|
+
import { SkillsRegistry, SkillNotFoundError } from "../skills/index.js";
|
|
3
|
+
export class DirectorySkillsTools {
|
|
4
|
+
registry;
|
|
5
|
+
constructor() {
|
|
6
|
+
this.registry = new SkillsRegistry();
|
|
7
|
+
}
|
|
8
|
+
getTools() {
|
|
9
|
+
return [
|
|
10
|
+
{
|
|
11
|
+
definition: {
|
|
12
|
+
name: "directory_skill_list",
|
|
13
|
+
tier: "read",
|
|
14
|
+
description: "Use when the user asks: 'what skills do you have?', 'what can you do?', 'show me your methodologies', 'how do I find music here?'. " +
|
|
15
|
+
"Returns the list of downloadable directory skill methodologies — name, description, trigger phrases. " +
|
|
16
|
+
"Cheap to call. Use directory_skill_get(name) to load a specific skill's full methodology body.",
|
|
17
|
+
inputSchema: {
|
|
18
|
+
type: "object",
|
|
19
|
+
properties: {},
|
|
20
|
+
additionalProperties: false,
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
executor: this.listSkills.bind(this),
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
definition: {
|
|
27
|
+
name: "directory_skill_get",
|
|
28
|
+
tier: "read",
|
|
29
|
+
description: "Use when the user asks: 'what skills do you have?', 'what can you do?', 'show me your methodologies'. " +
|
|
30
|
+
"Returns the full methodology body for one directory skill — markdown with step-by-step instructions and tool chains. " +
|
|
31
|
+
"Call directory_skill_list first to see available skill names, then directory_skill_get to load one. Read once at the start of the workflow; do not re-fetch on every step.",
|
|
32
|
+
inputSchema: {
|
|
33
|
+
type: "object",
|
|
34
|
+
properties: {
|
|
35
|
+
name: {
|
|
36
|
+
type: "string",
|
|
37
|
+
description: "Kebab-case skill name from directory_skill_list (e.g. 'find-music-for-sync-brief').",
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
required: ["name"],
|
|
41
|
+
additionalProperties: false,
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
executor: this.getSkill.bind(this),
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
}
|
|
48
|
+
async listSkills(_args) {
|
|
49
|
+
const skills = this.registry.listSkills();
|
|
50
|
+
return {
|
|
51
|
+
content: [
|
|
52
|
+
{
|
|
53
|
+
type: "text",
|
|
54
|
+
text: skills.length
|
|
55
|
+
? `Available directory skills (${skills.length}):\n\n` +
|
|
56
|
+
skills
|
|
57
|
+
.map((s) => `- ${s.name} — ${s.description}\n triggers: ${s.triggers.join(", ")}\n audience: ${s.audience}`)
|
|
58
|
+
.join("\n\n") +
|
|
59
|
+
"\n\nCall directory_skill_get(name) to load a skill's full methodology."
|
|
60
|
+
: "No directory skills available.",
|
|
61
|
+
},
|
|
62
|
+
],
|
|
63
|
+
structuredContent: { skills },
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
async getSkill(args) {
|
|
67
|
+
const name = String(args?.name ?? "").trim();
|
|
68
|
+
if (!name) {
|
|
69
|
+
return {
|
|
70
|
+
isError: true,
|
|
71
|
+
content: [
|
|
72
|
+
{
|
|
73
|
+
type: "text",
|
|
74
|
+
text: "Missing required argument: name. Call directory_skill_list to see available skill names.",
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
let skill;
|
|
80
|
+
try {
|
|
81
|
+
skill = this.registry.getSkill(name);
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
if (err instanceof SkillNotFoundError) {
|
|
85
|
+
return {
|
|
86
|
+
isError: true,
|
|
87
|
+
content: [
|
|
88
|
+
{
|
|
89
|
+
type: "text",
|
|
90
|
+
text: `Skill not found: ${name}. Call directory_skill_list to see available skill names.`,
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
throw err;
|
|
96
|
+
}
|
|
97
|
+
const frontmatterSummary = [
|
|
98
|
+
`# ${skill.name}`,
|
|
99
|
+
"",
|
|
100
|
+
`**Description:** ${skill.description}`,
|
|
101
|
+
`**Audience:** ${skill.audience}`,
|
|
102
|
+
`**Triggers:** ${skill.triggers.join(", ")}`,
|
|
103
|
+
`**Tools used:** ${skill.tools_required.join(", ")}`,
|
|
104
|
+
`**Output:** ${skill.output}`,
|
|
105
|
+
"",
|
|
106
|
+
"---",
|
|
107
|
+
"",
|
|
108
|
+
].join("\n");
|
|
109
|
+
return {
|
|
110
|
+
content: [
|
|
111
|
+
{
|
|
112
|
+
type: "text",
|
|
113
|
+
text: frontmatterSummary + skill.body,
|
|
114
|
+
},
|
|
115
|
+
],
|
|
116
|
+
structuredContent: {
|
|
117
|
+
name: skill.name,
|
|
118
|
+
description: skill.description,
|
|
119
|
+
triggers: skill.triggers,
|
|
120
|
+
audience: skill.audience,
|
|
121
|
+
tools_required: skill.tools_required,
|
|
122
|
+
output: skill.output,
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/tools/skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { DirectoryClient } from "../client.js";
|
|
2
|
+
import { ToolDefinition, ToolExecutor } from "./index.js";
|
|
3
|
+
export declare class DirectoryWorksTools {
|
|
4
|
+
private client;
|
|
5
|
+
constructor(client: DirectoryClient);
|
|
6
|
+
getTools(): Array<{
|
|
7
|
+
definition: ToolDefinition;
|
|
8
|
+
executor: ToolExecutor;
|
|
9
|
+
}>;
|
|
10
|
+
private listWorks;
|
|
11
|
+
private lookupWork;
|
|
12
|
+
private lookupIsrc;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=works.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"works.d.ts","sourceRoot":"","sources":["../../src/tools/works.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1D,qBAAa,mBAAmB;IAC9B,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;YA2G3D,SAAS;YA2BT,UAAU;YA0GV,UAAU;CAYzB"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
|
|
2
|
+
import { formatStructuredList } from "../utils/formatting.js";
|
|
3
|
+
export class DirectoryWorksTools {
|
|
4
|
+
client;
|
|
5
|
+
constructor(client) {
|
|
6
|
+
this.client = client;
|
|
7
|
+
}
|
|
8
|
+
getTools() {
|
|
9
|
+
return [
|
|
10
|
+
{
|
|
11
|
+
definition: {
|
|
12
|
+
name: "directory_list_works",
|
|
13
|
+
tier: "read",
|
|
14
|
+
description: "Use when the user asks: 'list works in PICA', 'works starting with B', " +
|
|
15
|
+
"'find works by publisher X', 'browse the catalog'. " +
|
|
16
|
+
"Browse and filter verified musical works in the PICA public directory. " +
|
|
17
|
+
"Filter by free-text (q), ISWC, ISRC, publisher, label, or starting letter (A–Z, or '#' for numeric). " +
|
|
18
|
+
"Sort by title (default) or recent. Returns paginated results. " +
|
|
19
|
+
"→ then: directory_lookup_work (full details with credits and audio)",
|
|
20
|
+
inputSchema: {
|
|
21
|
+
type: "object",
|
|
22
|
+
properties: {
|
|
23
|
+
q: {
|
|
24
|
+
type: "string",
|
|
25
|
+
description: "Text search across work titles and identifiers",
|
|
26
|
+
},
|
|
27
|
+
iswc: {
|
|
28
|
+
type: "string",
|
|
29
|
+
description: "Filter by ISWC (e.g. T-123.456.789-0)",
|
|
30
|
+
},
|
|
31
|
+
isrc: {
|
|
32
|
+
type: "string",
|
|
33
|
+
description: "Filter by ISRC (exact match, cross-table recording lookup)",
|
|
34
|
+
},
|
|
35
|
+
publisher: {
|
|
36
|
+
type: "string",
|
|
37
|
+
description: "Filter by publisher name (partial match)",
|
|
38
|
+
},
|
|
39
|
+
label: {
|
|
40
|
+
type: "string",
|
|
41
|
+
description: "Filter by record label (partial match)",
|
|
42
|
+
},
|
|
43
|
+
letter: {
|
|
44
|
+
type: "string",
|
|
45
|
+
description: "Filter by title starting letter (A–Z), or '#' for numeric",
|
|
46
|
+
},
|
|
47
|
+
sort: {
|
|
48
|
+
type: "string",
|
|
49
|
+
enum: ["title", "recent"],
|
|
50
|
+
description: "Sort order (default: title)",
|
|
51
|
+
},
|
|
52
|
+
page: {
|
|
53
|
+
type: "number",
|
|
54
|
+
description: "Page number (default: 1, 20 results per page)",
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
executor: this.listWorks.bind(this),
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
definition: {
|
|
63
|
+
name: "directory_lookup_work",
|
|
64
|
+
tier: "read",
|
|
65
|
+
description: "Use when the user asks: 'what's the ISWC for X?', 'who wrote X?', " +
|
|
66
|
+
"'tell me about song X', 'is this song registered?'. " +
|
|
67
|
+
"Get full details of a single work by ISWC or work UUID. " +
|
|
68
|
+
"Returns credits with IPI numbers and attestation status, recordings with ISRCs, " +
|
|
69
|
+
"audio analysis (BPM, key, energy), DSP links (Spotify, Apple Music), " +
|
|
70
|
+
"AI provenance, and registration score as a structured markdown summary. " +
|
|
71
|
+
"→ then: directory_lookup_person (research a credited writer), directory_search_recordings (find similar tracks by audio)",
|
|
72
|
+
inputSchema: {
|
|
73
|
+
type: "object",
|
|
74
|
+
properties: {
|
|
75
|
+
identifier: {
|
|
76
|
+
type: "string",
|
|
77
|
+
description: "ISWC (e.g. T-123.456.789-0) or work UUID",
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
required: ["identifier"],
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
executor: this.lookupWork.bind(this),
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
definition: {
|
|
87
|
+
name: "directory_lookup_isrc",
|
|
88
|
+
tier: "read",
|
|
89
|
+
description: "Use when the user asks: 'lookup ISRC X', 'what's the work for ISRC X?', " +
|
|
90
|
+
"'find the work for this recording'. " +
|
|
91
|
+
"Shortcut: look up the work(s) associated with a recording identifier (ISRC). " +
|
|
92
|
+
"Equivalent to directory_list_works with an isrc filter, pinned for recording-first discovery. " +
|
|
93
|
+
"→ then: directory_lookup_work (full details on the matched work)",
|
|
94
|
+
inputSchema: {
|
|
95
|
+
type: "object",
|
|
96
|
+
properties: {
|
|
97
|
+
isrc: {
|
|
98
|
+
type: "string",
|
|
99
|
+
description: "ISRC code (e.g. USABC1234567)",
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
required: ["isrc"],
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
executor: this.lookupIsrc.bind(this),
|
|
106
|
+
},
|
|
107
|
+
];
|
|
108
|
+
}
|
|
109
|
+
async listWorks(args) {
|
|
110
|
+
const page = Math.max(args.page || 1, 1);
|
|
111
|
+
const limit = 20;
|
|
112
|
+
const offset = (page - 1) * limit;
|
|
113
|
+
const params = {
|
|
114
|
+
limit: String(limit),
|
|
115
|
+
offset: String(offset),
|
|
116
|
+
};
|
|
117
|
+
if (args.q)
|
|
118
|
+
params.q = args.q;
|
|
119
|
+
if (args.iswc)
|
|
120
|
+
params.iswc = args.iswc;
|
|
121
|
+
if (args.isrc)
|
|
122
|
+
params.isrc = args.isrc;
|
|
123
|
+
if (args.publisher)
|
|
124
|
+
params.publisher = args.publisher;
|
|
125
|
+
if (args.label)
|
|
126
|
+
params.label = args.label;
|
|
127
|
+
if (args.letter)
|
|
128
|
+
params.letter = args.letter;
|
|
129
|
+
if (args.sort)
|
|
130
|
+
params.sort = args.sort;
|
|
131
|
+
const response = await this.client.request("/works", params);
|
|
132
|
+
return formatStructuredList(response.data || [], "work", {
|
|
133
|
+
page,
|
|
134
|
+
total: response.pagination?.total || 0,
|
|
135
|
+
total_pages: Math.ceil((response.pagination?.total || 0) / limit),
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
async lookupWork(args) {
|
|
139
|
+
const response = await this.client.request(`/works/${encodeURIComponent(args.identifier)}`);
|
|
140
|
+
const data = response.data;
|
|
141
|
+
if (!data) {
|
|
142
|
+
return {
|
|
143
|
+
content: [{ type: "text", text: "Work not found." }],
|
|
144
|
+
structuredContent: {},
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
const lines = [];
|
|
148
|
+
const artistName = data.artist_name || data.primary_artist || "";
|
|
149
|
+
lines.push(`## ${data.title}${artistName ? ` by ${artistName}` : ""}`);
|
|
150
|
+
lines.push("");
|
|
151
|
+
const metaParts = [];
|
|
152
|
+
if (data.iswc)
|
|
153
|
+
metaParts.push(`**ISWC:** ${data.iswc}`);
|
|
154
|
+
if (data.organisation_name)
|
|
155
|
+
metaParts.push(`**Organisation:** ${data.organisation_name}`);
|
|
156
|
+
if (metaParts.length > 0)
|
|
157
|
+
lines.push(metaParts.join(" | "));
|
|
158
|
+
if (data.score !== undefined && data.score !== null) {
|
|
159
|
+
const tier = data.score >= 80
|
|
160
|
+
? "verified"
|
|
161
|
+
: data.score >= 50
|
|
162
|
+
? "partial"
|
|
163
|
+
: "incomplete";
|
|
164
|
+
lines.push(`- **Score:** ${data.score}/100 (${tier})`);
|
|
165
|
+
}
|
|
166
|
+
lines.push("");
|
|
167
|
+
const credits = data.credits || [];
|
|
168
|
+
lines.push(`### Credits (${credits.length})`);
|
|
169
|
+
if (credits.length > 0) {
|
|
170
|
+
lines.push("| Role | Name | IPI | Attestation |");
|
|
171
|
+
lines.push("| --- | --- | --- | --- |");
|
|
172
|
+
for (const c of credits) {
|
|
173
|
+
const role = c.role || c.credit_role || "—";
|
|
174
|
+
const name = c.name || c.person_name || "—";
|
|
175
|
+
const ipi = c.ipi || c.ipi_number || "—";
|
|
176
|
+
const attestation = c.attestation_status || c.attestation || "—";
|
|
177
|
+
lines.push(`| ${role} | ${name} | ${ipi} | ${attestation} |`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
lines.push("_No credits recorded._");
|
|
182
|
+
}
|
|
183
|
+
lines.push("");
|
|
184
|
+
const recordings = data.recordings || [];
|
|
185
|
+
lines.push(`### Recordings (${recordings.length})`);
|
|
186
|
+
if (recordings.length > 0) {
|
|
187
|
+
lines.push("| ISRC | Type |");
|
|
188
|
+
lines.push("| --- | --- |");
|
|
189
|
+
for (const r of recordings) {
|
|
190
|
+
const isrc = r.isrc || "—";
|
|
191
|
+
const type = r.recording_type || r.type || "—";
|
|
192
|
+
lines.push(`| ${isrc} | ${type} |`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
lines.push("_No recordings linked._");
|
|
197
|
+
}
|
|
198
|
+
lines.push("");
|
|
199
|
+
const audio = data.audio_analysis || data.audio || null;
|
|
200
|
+
if (audio) {
|
|
201
|
+
lines.push("### Audio");
|
|
202
|
+
const audioParts = [];
|
|
203
|
+
if (audio.bpm !== undefined && audio.bpm !== null)
|
|
204
|
+
audioParts.push(`**BPM:** ${audio.bpm}`);
|
|
205
|
+
if (audio.key)
|
|
206
|
+
audioParts.push(`**Key:** ${audio.key}`);
|
|
207
|
+
if (audio.energy !== undefined && audio.energy !== null)
|
|
208
|
+
audioParts.push(`**Energy:** ${audio.energy}`);
|
|
209
|
+
if (audioParts.length > 0) {
|
|
210
|
+
lines.push(`- ${audioParts.join(" | ")}`);
|
|
211
|
+
}
|
|
212
|
+
lines.push("");
|
|
213
|
+
}
|
|
214
|
+
const dsp = data.dsp_links || data.streaming_links || null;
|
|
215
|
+
if (dsp && typeof dsp === "object" && Object.keys(dsp).length > 0) {
|
|
216
|
+
lines.push("### DSP Links");
|
|
217
|
+
if (dsp.spotify)
|
|
218
|
+
lines.push(`- Spotify: ${dsp.spotify}`);
|
|
219
|
+
if (dsp.apple_music)
|
|
220
|
+
lines.push(`- Apple Music: ${dsp.apple_music}`);
|
|
221
|
+
if (dsp.youtube)
|
|
222
|
+
lines.push(`- YouTube: ${dsp.youtube}`);
|
|
223
|
+
for (const [key, val] of Object.entries(dsp)) {
|
|
224
|
+
if (!["spotify", "apple_music", "youtube"].includes(key) && val) {
|
|
225
|
+
lines.push(`- ${key}: ${val}`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
lines.push("");
|
|
229
|
+
}
|
|
230
|
+
const markdown = lines.join("\n");
|
|
231
|
+
return {
|
|
232
|
+
content: [{ type: "text", text: markdown }],
|
|
233
|
+
structuredContent: data,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
async lookupIsrc(args) {
|
|
237
|
+
const response = await this.client.request("/works", {
|
|
238
|
+
isrc: args.isrc,
|
|
239
|
+
limit: "100",
|
|
240
|
+
offset: "0",
|
|
241
|
+
});
|
|
242
|
+
return formatStructuredList(response.data || [], "work", {
|
|
243
|
+
isrc: args.isrc,
|
|
244
|
+
total: response.pagination?.total || 0,
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=works.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"works.js","sourceRoot":"","sources":["../../src/tools/works.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare class McpServerError extends Error {
|
|
2
|
+
code: string;
|
|
3
|
+
details?: any | undefined;
|
|
4
|
+
constructor(message: string, code: string, details?: any | undefined);
|
|
5
|
+
}
|
|
6
|
+
export declare class ToolExecutionError extends McpServerError {
|
|
7
|
+
constructor(message: string, details?: any);
|
|
8
|
+
}
|
|
9
|
+
export declare function formatError(error: any): {
|
|
10
|
+
type: string;
|
|
11
|
+
text: string;
|
|
12
|
+
};
|
|
13
|
+
export declare function logError(context: string, error: any): void;
|
|
14
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAEA,qBAAa,cAAe,SAAQ,KAAK;IAG9B,IAAI,EAAE,MAAM;IACZ,OAAO,CAAC,EAAE,GAAG;gBAFpB,OAAO,EAAE,MAAM,EACR,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,GAAG,YAAA;CAMvB;AAED,qBAAa,kBAAmB,SAAQ,cAAc;gBACxC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG;CAI3C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CA+BtE;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI,CAS1D"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
|
|
2
|
+
export class McpServerError extends Error {
|
|
3
|
+
code;
|
|
4
|
+
details;
|
|
5
|
+
constructor(message, code, details) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.code = code;
|
|
8
|
+
this.details = details;
|
|
9
|
+
this.name = "McpServerError";
|
|
10
|
+
Object.setPrototypeOf(this, McpServerError.prototype);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class ToolExecutionError extends McpServerError {
|
|
14
|
+
constructor(message, details) {
|
|
15
|
+
super(message, "TOOL_EXECUTION_ERROR", details);
|
|
16
|
+
this.name = "ToolExecutionError";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export function formatError(error) {
|
|
20
|
+
if (error instanceof McpServerError) {
|
|
21
|
+
return {
|
|
22
|
+
type: "text",
|
|
23
|
+
text: JSON.stringify({ error: error.code, message: error.message, details: error.details }, null, 2),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
if (error instanceof Error) {
|
|
27
|
+
return {
|
|
28
|
+
type: "text",
|
|
29
|
+
text: JSON.stringify({ error: "UNKNOWN_ERROR", message: error.message }, null, 2),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
type: "text",
|
|
34
|
+
text: JSON.stringify({ error: "UNKNOWN_ERROR", message: String(error) }, null, 2),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export function logError(context, error) {
|
|
38
|
+
const entry = {
|
|
39
|
+
level: "error",
|
|
40
|
+
context,
|
|
41
|
+
message: error instanceof Error ? error.message : String(error),
|
|
42
|
+
timestamp: new Date().toISOString(),
|
|
43
|
+
};
|
|
44
|
+
if (error instanceof Error && error.stack)
|
|
45
|
+
entry.stack = error.stack;
|
|
46
|
+
console.error(JSON.stringify(entry));
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D,MAAM,OAAO,cAAe,SAAQ,KAAK;IAG9B;IACA;IAHT,YACE,OAAe,EACR,IAAY,EACZ,OAAa;QAEpB,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,SAAI,GAAJ,IAAI,CAAQ;QACZ,YAAO,GAAP,OAAO,CAAM;QAGpB,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;IACxD,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,cAAc;IACpD,YAAY,OAAe,EAAE,OAAa;QACxC,KAAK,CAAC,OAAO,EAAE,sBAAsB,EAAE,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,UAAU,WAAW,CAAC,KAAU;IACpC,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;QACpC,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EACrE,IAAI,EACJ,CAAC,CACF;SACF,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EAClD,IAAI,EACJ,CAAC,CACF;SACF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,EAClD,IAAI,EACJ,CAAC,CACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,KAAU;IAClD,MAAM,KAAK,GAA4B;QACrC,KAAK,EAAE,OAAO;QACd,OAAO;QACP,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QAC/D,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IACF,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,KAAK;QAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IACrE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface FormattedResult {
|
|
2
|
+
content: Array<{
|
|
3
|
+
type: string;
|
|
4
|
+
text: string;
|
|
5
|
+
}>;
|
|
6
|
+
structuredContent?: Record<string, unknown>;
|
|
7
|
+
}
|
|
8
|
+
export declare function formatAsText(data: any): FormattedResult;
|
|
9
|
+
export declare function formatStructuredList<T>(items: T[], entityName: string, metadata?: Record<string, any>): FormattedResult;
|
|
10
|
+
//# sourceMappingURL=formatting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../../src/utils/formatting.ts"],"names":[],"mappings":"AAEA,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,wBAAgB,YAAY,CAAC,IAAI,EAAE,GAAG,GAAG,eAAe,CAKvD;AAED,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,CASjB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
|
|
2
|
+
export function formatAsText(data) {
|
|
3
|
+
return {
|
|
4
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
5
|
+
structuredContent: data,
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
export function formatStructuredList(items, entityName, metadata) {
|
|
9
|
+
const count = items.length;
|
|
10
|
+
const summary = `Found ${count} ${entityName}${count !== 1 ? "s" : ""}${metadata?.query ? ` matching "${metadata.query}"` : ""}.`;
|
|
11
|
+
return {
|
|
12
|
+
content: [{ type: "text", text: summary }],
|
|
13
|
+
structuredContent: { count, items, ...metadata },
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=formatting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../src/utils/formatting.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAO7D,MAAM,UAAU,YAAY,CAAC,IAAS;IACpC,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAChE,iBAAiB,EAAE,IAA+B;KACnD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,KAAU,EACV,UAAkB,EAClB,QAA8B;IAE9B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IAC3B,MAAM,OAAO,GAAG,SAAS,KAAK,IAAI,UAAU,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GACnE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,cAAc,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EACtD,GAAG,CAAC;IACJ,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC1C,iBAAiB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,QAAQ,EAA6B;KAC5E,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@withpica/mcp-server-directory",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "MCP Server for PICA Public Directory — enables AI assistants to search verified works and creators",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -8,14 +8,15 @@
|
|
|
8
8
|
"pica-directory-mcp": "./dist/index.js"
|
|
9
9
|
},
|
|
10
10
|
"scripts": {
|
|
11
|
-
"prebuild": "tsx scripts/build-skills.ts",
|
|
11
|
+
"prebuild": "tsx scripts/build-changelog.ts && tsx scripts/build-skills.ts",
|
|
12
12
|
"build": "tsc",
|
|
13
13
|
"dev": "tsx src/index.ts",
|
|
14
14
|
"start": "node dist/index.js",
|
|
15
15
|
"test": "NODE_OPTIONS=--experimental-vm-modules jest",
|
|
16
16
|
"test:watch": "NODE_OPTIONS=--experimental-vm-modules jest --watch",
|
|
17
17
|
"test:coverage": "NODE_OPTIONS=--experimental-vm-modules jest --coverage",
|
|
18
|
-
"
|
|
18
|
+
"lint:changelog": "tsx ../scripts/lint-changelog.ts --package=.",
|
|
19
|
+
"prepublishOnly": "npm run build && npm run lint:changelog"
|
|
19
20
|
},
|
|
20
21
|
"author": "PICA Platform",
|
|
21
22
|
"license": "MIT",
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
|
|
2
|
+
|
|
3
|
+
import { readFileSync, writeFileSync } from "fs";
|
|
4
|
+
import { resolve, dirname } from "path";
|
|
5
|
+
import { fileURLToPath } from "url";
|
|
6
|
+
|
|
7
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
8
|
+
const root = resolve(__dirname, "..");
|
|
9
|
+
const changelogPath = resolve(root, "CHANGELOG.md");
|
|
10
|
+
const outPath = resolve(root, "src/lib/changelog.generated.ts");
|
|
11
|
+
const pkg = JSON.parse(readFileSync(resolve(root, "package.json"), "utf8"));
|
|
12
|
+
|
|
13
|
+
const md = readFileSync(changelogPath, "utf8");
|
|
14
|
+
const escaped = JSON.stringify(md);
|
|
15
|
+
|
|
16
|
+
writeFileSync(
|
|
17
|
+
outPath,
|
|
18
|
+
`// Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.\n` +
|
|
19
|
+
`// Generated by scripts/build-changelog.ts — do not edit.\n\n` +
|
|
20
|
+
`export const CHANGELOG_MD = ${escaped};\n` +
|
|
21
|
+
`export const PACKAGE_NAME = ${JSON.stringify(pkg.name)};\n` +
|
|
22
|
+
`export const PACKAGE_VERSION = ${JSON.stringify(pkg.version)};\n`,
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
console.log(`Wrote ${outPath} (${md.length} chars).`);
|