@darrenjaws/spotify-mcp 1.0.1 → 1.2.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/README.md +14 -7
- package/build/bin.js +4 -4
- package/build/index.js +151 -24
- package/build/index.js.map +1 -1
- package/build/setup.d.ts.map +1 -1
- package/build/setup.js +156 -156
- package/build/setup.js.map +1 -1
- package/build/spotify/auth.d.ts +4 -0
- package/build/spotify/auth.d.ts.map +1 -1
- package/build/spotify/auth.js +38 -15
- package/build/spotify/auth.js.map +1 -1
- package/build/spotify/client.d.ts +8 -2
- package/build/spotify/client.d.ts.map +1 -1
- package/build/spotify/client.js +72 -4
- package/build/spotify/client.js.map +1 -1
- package/build/tools/library.d.ts.map +1 -1
- package/build/tools/library.js +58 -30
- package/build/tools/library.js.map +1 -1
- package/build/tools/playback.d.ts +3 -1
- package/build/tools/playback.d.ts.map +1 -1
- package/build/tools/playback.js +98 -21
- package/build/tools/playback.js.map +1 -1
- package/build/tools/playlists.d.ts.map +1 -1
- package/build/tools/playlists.js +39 -17
- package/build/tools/playlists.js.map +1 -1
- package/build/tools/search.d.ts.map +1 -1
- package/build/tools/search.js +11 -5
- package/build/tools/search.js.map +1 -1
- package/build/tools/user.d.ts.map +1 -1
- package/build/tools/user.js +11 -6
- package/build/tools/user.js.map +1 -1
- package/build/types.d.ts +52 -0
- package/build/types.d.ts.map +1 -1
- package/build/utils/logger.d.ts.map +1 -1
- package/build/utils/logger.js +32 -16
- package/build/utils/logger.js.map +1 -1
- package/build/utils/validation.d.ts +40 -0
- package/build/utils/validation.d.ts.map +1 -0
- package/build/utils/validation.js +57 -0
- package/build/utils/validation.js.map +1 -0
- package/package.json +7 -2
package/build/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwFH,eAAO,MAAM,MAAM;mBACF,MAAM,WAAW,GAAG,EAAE;kBAMvB,MAAM,WAAW,GAAG,EAAE;kBAMtB,MAAM,WAAW,GAAG,EAAE;mBAMrB,MAAM,WAAW,GAAG,EAAE;CAKtC,CAAC"}
|
package/build/utils/logger.js
CHANGED
|
@@ -12,9 +12,20 @@ const levels = {
|
|
|
12
12
|
};
|
|
13
13
|
// Sensitive field names that should be redacted
|
|
14
14
|
const SENSITIVE_FIELDS = [
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
"token",
|
|
16
|
+
"accessToken",
|
|
17
|
+
"refreshToken",
|
|
18
|
+
"access_token",
|
|
19
|
+
"refresh_token",
|
|
20
|
+
"secret",
|
|
21
|
+
"clientSecret",
|
|
22
|
+
"client_secret",
|
|
23
|
+
"password",
|
|
24
|
+
"apiKey",
|
|
25
|
+
"api_key",
|
|
26
|
+
"authorization",
|
|
27
|
+
"auth",
|
|
28
|
+
"bearer",
|
|
18
29
|
];
|
|
19
30
|
/**
|
|
20
31
|
* Recursively redact sensitive fields from objects
|
|
@@ -23,21 +34,21 @@ function redactSensitiveData(obj) {
|
|
|
23
34
|
if (obj === null || obj === undefined) {
|
|
24
35
|
return obj;
|
|
25
36
|
}
|
|
26
|
-
if (typeof obj ===
|
|
37
|
+
if (typeof obj === "string") {
|
|
27
38
|
// Redact if string looks like a token (long alphanumeric strings)
|
|
28
39
|
if (obj.length > 20 && /^[A-Za-z0-9_-]+$/.test(obj)) {
|
|
29
|
-
return
|
|
40
|
+
return "[REDACTED]";
|
|
30
41
|
}
|
|
31
42
|
return obj;
|
|
32
43
|
}
|
|
33
44
|
if (Array.isArray(obj)) {
|
|
34
|
-
return obj.map(item => redactSensitiveData(item));
|
|
45
|
+
return obj.map((item) => redactSensitiveData(item));
|
|
35
46
|
}
|
|
36
|
-
if (typeof obj ===
|
|
47
|
+
if (typeof obj === "object") {
|
|
37
48
|
const redacted = {};
|
|
38
49
|
for (const [key, value] of Object.entries(obj)) {
|
|
39
|
-
if (SENSITIVE_FIELDS.some(field => key.toLowerCase().includes(field.toLowerCase()))) {
|
|
40
|
-
redacted[key] =
|
|
50
|
+
if (SENSITIVE_FIELDS.some((field) => key.toLowerCase().includes(field.toLowerCase()))) {
|
|
51
|
+
redacted[key] = "[REDACTED]";
|
|
41
52
|
}
|
|
42
53
|
else {
|
|
43
54
|
redacted[key] = redactSensitiveData(value);
|
|
@@ -52,13 +63,18 @@ function shouldLog(level) {
|
|
|
52
63
|
}
|
|
53
64
|
function formatMessage(level, message, ...args) {
|
|
54
65
|
const timestamp = new Date().toISOString();
|
|
55
|
-
const formattedArgs = args.length > 0
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
66
|
+
const formattedArgs = args.length > 0
|
|
67
|
+
? " " +
|
|
68
|
+
args
|
|
69
|
+
.map((arg) => {
|
|
70
|
+
if (typeof arg === "object") {
|
|
71
|
+
const redacted = redactSensitiveData(arg);
|
|
72
|
+
return JSON.stringify(redacted);
|
|
73
|
+
}
|
|
74
|
+
return String(arg);
|
|
75
|
+
})
|
|
76
|
+
.join(" ")
|
|
77
|
+
: "";
|
|
62
78
|
return `[${timestamp}] [${level.toUpperCase()}] ${message}${formattedArgs}`;
|
|
63
79
|
}
|
|
64
80
|
export const logger = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,SAAS,GAAc,OAAO,CAAC,GAAG,CAAC,SAAsB,IAAI,MAAM,CAAC;AAE1E,MAAM,MAAM,GAA6B;IACvC,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,gDAAgD;AAChD,MAAM,gBAAgB,GAAG;IACvB,OAAO,
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input validation utilities for Spotify MCP tool handlers.
|
|
3
|
+
*
|
|
4
|
+
* These provide domain-specific validation beyond what Zod schemas enforce.
|
|
5
|
+
* The MCP SDK already validates tool inputs against Zod schemas at runtime
|
|
6
|
+
* (see McpServer.validateToolInput in @modelcontextprotocol/sdk), so these
|
|
7
|
+
* validators focus on Spotify-specific constraints like URI format and
|
|
8
|
+
* API batch size limits.
|
|
9
|
+
*/
|
|
10
|
+
type SpotifyUriType = "track" | "album" | "artist" | "playlist";
|
|
11
|
+
/**
|
|
12
|
+
* Validates that a string is a well-formed Spotify URI.
|
|
13
|
+
*
|
|
14
|
+
* @param uri - The URI string to validate
|
|
15
|
+
* @param allowedTypes - Optional subset of URI types to accept (defaults to all)
|
|
16
|
+
* @throws Error with a user-friendly message if invalid
|
|
17
|
+
*/
|
|
18
|
+
export declare function validateSpotifyUri(uri: string, allowedTypes?: SpotifyUriType[]): void;
|
|
19
|
+
/**
|
|
20
|
+
* Validates that an array does not exceed a maximum size.
|
|
21
|
+
* Spotify's batch endpoints typically accept at most 50 items.
|
|
22
|
+
*
|
|
23
|
+
* @param arr - The array to check
|
|
24
|
+
* @param max - Maximum allowed length
|
|
25
|
+
* @param fieldName - Field name for the error message
|
|
26
|
+
* @throws Error with a user-friendly message if exceeded
|
|
27
|
+
*/
|
|
28
|
+
export declare function validateArraySize(arr: unknown[], max: number, fieldName: string): void;
|
|
29
|
+
/**
|
|
30
|
+
* Validates that a number falls within an inclusive range.
|
|
31
|
+
*
|
|
32
|
+
* @param value - The number to check
|
|
33
|
+
* @param min - Minimum allowed value (inclusive)
|
|
34
|
+
* @param max - Maximum allowed value (inclusive)
|
|
35
|
+
* @param fieldName - Field name for the error message
|
|
36
|
+
* @throws Error with a user-friendly message if out of range
|
|
37
|
+
*/
|
|
38
|
+
export declare function validateRange(value: number, min: number, max: number, fieldName: string): void;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,KAAK,cAAc,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEhE;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,cAAc,EAAE,GAAG,IAAI,CAerF;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAItF;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAI9F"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input validation utilities for Spotify MCP tool handlers.
|
|
3
|
+
*
|
|
4
|
+
* These provide domain-specific validation beyond what Zod schemas enforce.
|
|
5
|
+
* The MCP SDK already validates tool inputs against Zod schemas at runtime
|
|
6
|
+
* (see McpServer.validateToolInput in @modelcontextprotocol/sdk), so these
|
|
7
|
+
* validators focus on Spotify-specific constraints like URI format and
|
|
8
|
+
* API batch size limits.
|
|
9
|
+
*/
|
|
10
|
+
const SPOTIFY_URI_PATTERN = /^spotify:(track|album|artist|playlist):[\w]+$/;
|
|
11
|
+
/**
|
|
12
|
+
* Validates that a string is a well-formed Spotify URI.
|
|
13
|
+
*
|
|
14
|
+
* @param uri - The URI string to validate
|
|
15
|
+
* @param allowedTypes - Optional subset of URI types to accept (defaults to all)
|
|
16
|
+
* @throws Error with a user-friendly message if invalid
|
|
17
|
+
*/
|
|
18
|
+
export function validateSpotifyUri(uri, allowedTypes) {
|
|
19
|
+
if (!SPOTIFY_URI_PATTERN.test(uri)) {
|
|
20
|
+
throw new Error(`Invalid Spotify URI: "${uri}". Expected format: spotify:(track|album|artist|playlist):<id>`);
|
|
21
|
+
}
|
|
22
|
+
if (allowedTypes && allowedTypes.length > 0) {
|
|
23
|
+
const uriType = uri.split(":")[1];
|
|
24
|
+
if (!allowedTypes.includes(uriType)) {
|
|
25
|
+
throw new Error(`Invalid Spotify URI type: "${uriType}". Expected one of: ${allowedTypes.join(", ")}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Validates that an array does not exceed a maximum size.
|
|
31
|
+
* Spotify's batch endpoints typically accept at most 50 items.
|
|
32
|
+
*
|
|
33
|
+
* @param arr - The array to check
|
|
34
|
+
* @param max - Maximum allowed length
|
|
35
|
+
* @param fieldName - Field name for the error message
|
|
36
|
+
* @throws Error with a user-friendly message if exceeded
|
|
37
|
+
*/
|
|
38
|
+
export function validateArraySize(arr, max, fieldName) {
|
|
39
|
+
if (arr.length > max) {
|
|
40
|
+
throw new Error(`${fieldName} exceeds maximum size of ${max} (got ${arr.length})`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Validates that a number falls within an inclusive range.
|
|
45
|
+
*
|
|
46
|
+
* @param value - The number to check
|
|
47
|
+
* @param min - Minimum allowed value (inclusive)
|
|
48
|
+
* @param max - Maximum allowed value (inclusive)
|
|
49
|
+
* @param fieldName - Field name for the error message
|
|
50
|
+
* @throws Error with a user-friendly message if out of range
|
|
51
|
+
*/
|
|
52
|
+
export function validateRange(value, min, max, fieldName) {
|
|
53
|
+
if (value < min || value > max) {
|
|
54
|
+
throw new Error(`${fieldName} must be between ${min} and ${max} (got ${value})`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,mBAAmB,GAAG,+CAA+C,CAAC;AAI5E;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW,EAAE,YAA+B;IAC7E,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CACb,yBAAyB,GAAG,gEAAgE,CAC7F,CAAC;IACJ,CAAC;IAED,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAmB,CAAC;QACpD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CACb,8BAA8B,OAAO,uBAAuB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACtF,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAc,EAAE,GAAW,EAAE,SAAiB;IAC9E,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,GAAG,SAAS,4BAA4B,GAAG,SAAS,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IACrF,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW,EAAE,SAAiB;IACtF,IAAI,KAAK,GAAG,GAAG,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,GAAG,SAAS,oBAAoB,GAAG,QAAQ,GAAG,SAAS,KAAK,GAAG,CAAC,CAAC;IACnF,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@darrenjaws/spotify-mcp",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "Model Context Protocol server for Spotify integration",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -16,7 +16,10 @@
|
|
|
16
16
|
"test:watch": "vitest",
|
|
17
17
|
"lint": "eslint src --ext .ts",
|
|
18
18
|
"lint:fix": "eslint src --ext .ts --fix",
|
|
19
|
-
"
|
|
19
|
+
"format": "prettier --write .",
|
|
20
|
+
"format:check": "prettier --check .",
|
|
21
|
+
"inspect": "npm run build && npx @modelcontextprotocol/inspector node build/bin.js",
|
|
22
|
+
"static-checks": "npm run lint && npm run format:check && npm run build && npm test"
|
|
20
23
|
},
|
|
21
24
|
"keywords": [
|
|
22
25
|
"mcp",
|
|
@@ -60,6 +63,8 @@
|
|
|
60
63
|
"@typescript-eslint/eslint-plugin": "^8.19.1",
|
|
61
64
|
"@typescript-eslint/parser": "^8.19.1",
|
|
62
65
|
"eslint": "^9.17.0",
|
|
66
|
+
"eslint-config-prettier": "^10.1.8",
|
|
67
|
+
"prettier": "^3.8.1",
|
|
63
68
|
"typescript": "^5.7.2",
|
|
64
69
|
"typescript-eslint": "^8.55.0",
|
|
65
70
|
"vitest": "^4.0.18"
|