navidrome-mcp 1.0.1

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 (195) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +397 -0
  3. package/dist/capabilities.d.ts +20 -0
  4. package/dist/capabilities.d.ts.map +1 -0
  5. package/dist/capabilities.js +25 -0
  6. package/dist/capabilities.js.map +1 -0
  7. package/dist/client/auth-manager.d.ts +27 -0
  8. package/dist/client/auth-manager.d.ts.map +1 -0
  9. package/dist/client/auth-manager.js +54 -0
  10. package/dist/client/auth-manager.js.map +1 -0
  11. package/dist/client/navidrome-client.d.ts +28 -0
  12. package/dist/client/navidrome-client.d.ts.map +1 -0
  13. package/dist/client/navidrome-client.js +84 -0
  14. package/dist/client/navidrome-client.js.map +1 -0
  15. package/dist/config.d.ts +41 -0
  16. package/dist/config.d.ts.map +1 -0
  17. package/dist/config.js +132 -0
  18. package/dist/config.js.map +1 -0
  19. package/dist/constants/defaults.d.ts +29 -0
  20. package/dist/constants/defaults.d.ts.map +1 -0
  21. package/dist/constants/defaults.js +37 -0
  22. package/dist/constants/defaults.js.map +1 -0
  23. package/dist/constants/timeouts.d.ts +66 -0
  24. package/dist/constants/timeouts.d.ts.map +1 -0
  25. package/dist/constants/timeouts.js +66 -0
  26. package/dist/constants/timeouts.js.map +1 -0
  27. package/dist/index.d.ts +20 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +70 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/resources/index.d.ts +21 -0
  32. package/dist/resources/index.d.ts.map +1 -0
  33. package/dist/resources/index.js +83 -0
  34. package/dist/resources/index.js.map +1 -0
  35. package/dist/schemas/common.d.ts +68 -0
  36. package/dist/schemas/common.d.ts.map +1 -0
  37. package/dist/schemas/common.js +69 -0
  38. package/dist/schemas/common.js.map +1 -0
  39. package/dist/schemas/index.d.ts +21 -0
  40. package/dist/schemas/index.d.ts.map +1 -0
  41. package/dist/schemas/index.js +24 -0
  42. package/dist/schemas/index.js.map +1 -0
  43. package/dist/schemas/pagination.d.ts +153 -0
  44. package/dist/schemas/pagination.d.ts.map +1 -0
  45. package/dist/schemas/pagination.js +93 -0
  46. package/dist/schemas/pagination.js.map +1 -0
  47. package/dist/schemas/validation.d.ts +147 -0
  48. package/dist/schemas/validation.d.ts.map +1 -0
  49. package/dist/schemas/validation.js +143 -0
  50. package/dist/schemas/validation.js.map +1 -0
  51. package/dist/tools/handlers/lastfm-handlers.d.ts +5 -0
  52. package/dist/tools/handlers/lastfm-handlers.d.ts.map +1 -0
  53. package/dist/tools/handlers/lastfm-handlers.js +143 -0
  54. package/dist/tools/handlers/lastfm-handlers.js.map +1 -0
  55. package/dist/tools/handlers/lyrics-handlers.d.ts +5 -0
  56. package/dist/tools/handlers/lyrics-handlers.d.ts.map +1 -0
  57. package/dist/tools/handlers/lyrics-handlers.js +51 -0
  58. package/dist/tools/handlers/lyrics-handlers.js.map +1 -0
  59. package/dist/tools/handlers/playlist-handlers.d.ts +5 -0
  60. package/dist/tools/handlers/playlist-handlers.d.ts.map +1 -0
  61. package/dist/tools/handlers/playlist-handlers.js +316 -0
  62. package/dist/tools/handlers/playlist-handlers.js.map +1 -0
  63. package/dist/tools/handlers/queue-handlers.d.ts +5 -0
  64. package/dist/tools/handlers/queue-handlers.d.ts.map +1 -0
  65. package/dist/tools/handlers/queue-handlers.js +135 -0
  66. package/dist/tools/handlers/queue-handlers.js.map +1 -0
  67. package/dist/tools/handlers/radio-handlers.d.ts +5 -0
  68. package/dist/tools/handlers/radio-handlers.d.ts.map +1 -0
  69. package/dist/tools/handlers/radio-handlers.js +323 -0
  70. package/dist/tools/handlers/radio-handlers.js.map +1 -0
  71. package/dist/tools/handlers/registry.d.ts +26 -0
  72. package/dist/tools/handlers/registry.d.ts.map +1 -0
  73. package/dist/tools/handlers/registry.js +77 -0
  74. package/dist/tools/handlers/registry.js.map +1 -0
  75. package/dist/tools/handlers/search-handlers.d.ts +5 -0
  76. package/dist/tools/handlers/search-handlers.d.ts.map +1 -0
  77. package/dist/tools/handlers/search-handlers.js +125 -0
  78. package/dist/tools/handlers/search-handlers.js.map +1 -0
  79. package/dist/tools/handlers/tag-handlers.d.ts +5 -0
  80. package/dist/tools/handlers/tag-handlers.d.ts.map +1 -0
  81. package/dist/tools/handlers/tag-handlers.js +155 -0
  82. package/dist/tools/handlers/tag-handlers.js.map +1 -0
  83. package/dist/tools/handlers/user-preferences-handlers.d.ts +5 -0
  84. package/dist/tools/handlers/user-preferences-handlers.d.ts.map +1 -0
  85. package/dist/tools/handlers/user-preferences-handlers.js +155 -0
  86. package/dist/tools/handlers/user-preferences-handlers.js.map +1 -0
  87. package/dist/tools/index.d.ts +19 -0
  88. package/dist/tools/index.d.ts.map +1 -0
  89. package/dist/tools/index.js +20 -0
  90. package/dist/tools/index.js.map +1 -0
  91. package/dist/tools/lastfm-discovery.d.ts +107 -0
  92. package/dist/tools/lastfm-discovery.d.ts.map +1 -0
  93. package/dist/tools/lastfm-discovery.js +238 -0
  94. package/dist/tools/lastfm-discovery.js.map +1 -0
  95. package/dist/tools/library.d.ts +31 -0
  96. package/dist/tools/library.d.ts.map +1 -0
  97. package/dist/tools/library.js +272 -0
  98. package/dist/tools/library.js.map +1 -0
  99. package/dist/tools/listening-history.d.ts +51 -0
  100. package/dist/tools/listening-history.d.ts.map +1 -0
  101. package/dist/tools/listening-history.js +126 -0
  102. package/dist/tools/listening-history.js.map +1 -0
  103. package/dist/tools/lyrics.d.ts +35 -0
  104. package/dist/tools/lyrics.d.ts.map +1 -0
  105. package/dist/tools/lyrics.js +222 -0
  106. package/dist/tools/lyrics.js.map +1 -0
  107. package/dist/tools/media-library.d.ts +46 -0
  108. package/dist/tools/media-library.d.ts.map +1 -0
  109. package/dist/tools/media-library.js +179 -0
  110. package/dist/tools/media-library.js.map +1 -0
  111. package/dist/tools/playlist-management.d.ts +80 -0
  112. package/dist/tools/playlist-management.d.ts.map +1 -0
  113. package/dist/tools/playlist-management.js +384 -0
  114. package/dist/tools/playlist-management.js.map +1 -0
  115. package/dist/tools/queue-management.d.ts +48 -0
  116. package/dist/tools/queue-management.d.ts.map +1 -0
  117. package/dist/tools/queue-management.js +83 -0
  118. package/dist/tools/queue-management.js.map +1 -0
  119. package/dist/tools/radio-discovery.d.ts +95 -0
  120. package/dist/tools/radio-discovery.d.ts.map +1 -0
  121. package/dist/tools/radio-discovery.js +352 -0
  122. package/dist/tools/radio-discovery.js.map +1 -0
  123. package/dist/tools/radio-validation.d.ts +49 -0
  124. package/dist/tools/radio-validation.d.ts.map +1 -0
  125. package/dist/tools/radio-validation.js +463 -0
  126. package/dist/tools/radio-validation.js.map +1 -0
  127. package/dist/tools/radio.d.ts +38 -0
  128. package/dist/tools/radio.d.ts.map +1 -0
  129. package/dist/tools/radio.js +315 -0
  130. package/dist/tools/radio.js.map +1 -0
  131. package/dist/tools/search.d.ts +54 -0
  132. package/dist/tools/search.d.ts.map +1 -0
  133. package/dist/tools/search.js +165 -0
  134. package/dist/tools/search.js.map +1 -0
  135. package/dist/tools/tags.d.ts +63 -0
  136. package/dist/tools/tags.d.ts.map +1 -0
  137. package/dist/tools/tags.js +260 -0
  138. package/dist/tools/tags.js.map +1 -0
  139. package/dist/tools/test.d.ts +50 -0
  140. package/dist/tools/test.d.ts.map +1 -0
  141. package/dist/tools/test.js +121 -0
  142. package/dist/tools/test.js.map +1 -0
  143. package/dist/tools/user-preferences.d.ts +73 -0
  144. package/dist/tools/user-preferences.d.ts.map +1 -0
  145. package/dist/tools/user-preferences.js +231 -0
  146. package/dist/tools/user-preferences.js.map +1 -0
  147. package/dist/transformers/song-transformer.d.ts +122 -0
  148. package/dist/transformers/song-transformer.d.ts.map +1 -0
  149. package/dist/transformers/song-transformer.js +232 -0
  150. package/dist/transformers/song-transformer.js.map +1 -0
  151. package/dist/types/core.d.ts +147 -0
  152. package/dist/types/core.d.ts.map +1 -0
  153. package/dist/types/core.js +19 -0
  154. package/dist/types/core.js.map +1 -0
  155. package/dist/types/index.d.ts +23 -0
  156. package/dist/types/index.d.ts.map +1 -0
  157. package/dist/types/index.js +19 -0
  158. package/dist/types/index.js.map +1 -0
  159. package/dist/types/lyrics.d.ts +58 -0
  160. package/dist/types/lyrics.d.ts.map +1 -0
  161. package/dist/types/lyrics.js +19 -0
  162. package/dist/types/lyrics.js.map +1 -0
  163. package/dist/types/playlists.d.ts +150 -0
  164. package/dist/types/playlists.d.ts.map +1 -0
  165. package/dist/types/playlists.js +19 -0
  166. package/dist/types/playlists.js.map +1 -0
  167. package/dist/types/radio.d.ts +192 -0
  168. package/dist/types/radio.d.ts.map +1 -0
  169. package/dist/types/radio.js +19 -0
  170. package/dist/types/radio.js.map +1 -0
  171. package/dist/types/tags.d.ts +72 -0
  172. package/dist/types/tags.d.ts.map +1 -0
  173. package/dist/types/tags.js +19 -0
  174. package/dist/types/tags.js.map +1 -0
  175. package/dist/utils/cache.d.ts +32 -0
  176. package/dist/utils/cache.d.ts.map +1 -0
  177. package/dist/utils/cache.js +84 -0
  178. package/dist/utils/cache.js.map +1 -0
  179. package/dist/utils/error-formatter.d.ts +108 -0
  180. package/dist/utils/error-formatter.d.ts.map +1 -0
  181. package/dist/utils/error-formatter.js +161 -0
  182. package/dist/utils/error-formatter.js.map +1 -0
  183. package/dist/utils/logger.d.ts +33 -0
  184. package/dist/utils/logger.d.ts.map +1 -0
  185. package/dist/utils/logger.js +52 -0
  186. package/dist/utils/logger.js.map +1 -0
  187. package/dist/utils/message-manager.d.ts +74 -0
  188. package/dist/utils/message-manager.d.ts.map +1 -0
  189. package/dist/utils/message-manager.js +134 -0
  190. package/dist/utils/message-manager.js.map +1 -0
  191. package/dist/utils/version.d.ts +5 -0
  192. package/dist/utils/version.d.ts.map +1 -0
  193. package/dist/utils/version.js +19 -0
  194. package/dist/utils/version.js.map +1 -0
  195. package/package.json +78 -0
@@ -0,0 +1,155 @@
1
+ // Import tool functions
2
+ import { listTags, getTag, searchByTags, getTagDistribution, listUniqueTags, } from '../tags.js';
3
+ // Tool definitions for tags category
4
+ const tools = [
5
+ {
6
+ name: 'list_tags',
7
+ description: 'List all metadata tags with optional filtering by tag name and pagination',
8
+ inputSchema: {
9
+ type: 'object',
10
+ properties: {
11
+ limit: {
12
+ type: 'number',
13
+ description: 'Maximum number of tags to return (1-500)',
14
+ minimum: 1,
15
+ maximum: 500,
16
+ default: 100,
17
+ },
18
+ offset: {
19
+ type: 'number',
20
+ description: 'Number of tags to skip for pagination',
21
+ minimum: 0,
22
+ default: 0,
23
+ },
24
+ sort: {
25
+ type: 'string',
26
+ description: 'Field to sort by',
27
+ enum: ['tagName', 'tagValue', 'albumCount', 'songCount'],
28
+ default: 'tagName',
29
+ },
30
+ order: {
31
+ type: 'string',
32
+ description: 'Sort order',
33
+ enum: ['ASC', 'DESC'],
34
+ default: 'ASC',
35
+ },
36
+ tagName: {
37
+ type: 'string',
38
+ description: 'Filter by specific tag name (e.g., "genre", "composer", "label")',
39
+ },
40
+ },
41
+ },
42
+ },
43
+ {
44
+ name: 'get_tag',
45
+ description: 'Get detailed information about a specific tag by ID',
46
+ inputSchema: {
47
+ type: 'object',
48
+ properties: {
49
+ id: {
50
+ type: 'string',
51
+ description: 'The unique ID of the tag',
52
+ },
53
+ },
54
+ required: ['id'],
55
+ },
56
+ },
57
+ {
58
+ name: 'search_by_tags',
59
+ description: 'Search for songs/albums by specific tag criteria (e.g., find all songs with genre "Jazz" or composer "Bach")',
60
+ inputSchema: {
61
+ type: 'object',
62
+ properties: {
63
+ tagName: {
64
+ type: 'string',
65
+ description: 'Tag name to search by (e.g., "genre", "composer", "label")',
66
+ },
67
+ tagValue: {
68
+ type: 'string',
69
+ description: 'Optional tag value to match exactly',
70
+ },
71
+ limit: {
72
+ type: 'number',
73
+ description: 'Maximum number of matching tags to return',
74
+ minimum: 1,
75
+ maximum: 100,
76
+ default: 100,
77
+ },
78
+ },
79
+ required: ['tagName'],
80
+ },
81
+ },
82
+ {
83
+ name: 'get_tag_distribution',
84
+ description: 'Analyze tag usage patterns and distribution across the music library',
85
+ inputSchema: {
86
+ type: 'object',
87
+ properties: {
88
+ tagNames: {
89
+ type: 'array',
90
+ items: { type: 'string' },
91
+ description: 'Specific tag names to analyze (if omitted, analyzes all)',
92
+ },
93
+ limit: {
94
+ type: 'number',
95
+ description: 'Maximum number of tag names to analyze',
96
+ minimum: 1,
97
+ maximum: 50,
98
+ default: 10,
99
+ },
100
+ distributionLimit: {
101
+ type: 'number',
102
+ description: 'Maximum number of tag values to show in distribution (prevents huge output)',
103
+ minimum: 1,
104
+ maximum: 100,
105
+ default: 20,
106
+ },
107
+ },
108
+ },
109
+ },
110
+ {
111
+ name: 'list_unique_tags',
112
+ description: 'List all unique tag names with statistics (how many unique values, total usage)',
113
+ inputSchema: {
114
+ type: 'object',
115
+ properties: {
116
+ limit: {
117
+ type: 'number',
118
+ description: 'Maximum number of tag names to return',
119
+ minimum: 1,
120
+ maximum: 100,
121
+ default: 100,
122
+ },
123
+ minUsage: {
124
+ type: 'number',
125
+ description: 'Minimum song count to include a tag name',
126
+ minimum: 1,
127
+ default: 1,
128
+ },
129
+ },
130
+ },
131
+ },
132
+ ];
133
+ // Factory function for creating tags tool category with dependencies
134
+ export function createTagsToolCategory(client, _config) {
135
+ return {
136
+ tools,
137
+ async handleToolCall(name, args) {
138
+ switch (name) {
139
+ case 'list_tags':
140
+ return await listTags(client, args);
141
+ case 'get_tag':
142
+ return await getTag(client, args);
143
+ case 'search_by_tags':
144
+ return await searchByTags(client, args);
145
+ case 'get_tag_distribution':
146
+ return await getTagDistribution(client, args);
147
+ case 'list_unique_tags':
148
+ return await listUniqueTags(client, args);
149
+ default:
150
+ throw new Error(`Unknown tags tool: ${name}`);
151
+ }
152
+ }
153
+ };
154
+ }
155
+ //# sourceMappingURL=tag-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag-handlers.js","sourceRoot":"","sources":["../../../src/tools/handlers/tag-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { NavidromeClient } from '../../client/navidrome-client.js';
2
+ import type { Config } from '../../config.js';
3
+ import type { ToolCategory } from './registry.js';
4
+ export declare function createUserPreferencesToolCategory(client: NavidromeClient, config: Config): ToolCategory;
5
+ //# sourceMappingURL=user-preferences-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-preferences-handlers.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/user-preferences-handlers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AA+IlD,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CAoBvG"}
@@ -0,0 +1,155 @@
1
+ import { ErrorFormatter } from '../../utils/error-formatter.js';
2
+ // Import tool functions
3
+ import { starItem, unstarItem, setRating, listStarredItems, listTopRated, } from '../user-preferences.js';
4
+ // Tool definitions for user preferences category
5
+ const tools = [
6
+ {
7
+ name: 'star_item',
8
+ description: 'Star/favorite a song, album, or artist',
9
+ inputSchema: {
10
+ type: 'object',
11
+ properties: {
12
+ id: {
13
+ type: 'string',
14
+ description: 'The unique ID of the item to star',
15
+ },
16
+ type: {
17
+ type: 'string',
18
+ description: 'The type of item to star',
19
+ enum: ['song', 'album', 'artist'],
20
+ },
21
+ },
22
+ required: ['id', 'type'],
23
+ },
24
+ },
25
+ {
26
+ name: 'unstar_item',
27
+ description: 'Unstar/unfavorite a song, album, or artist',
28
+ inputSchema: {
29
+ type: 'object',
30
+ properties: {
31
+ id: {
32
+ type: 'string',
33
+ description: 'The unique ID of the item to unstar',
34
+ },
35
+ type: {
36
+ type: 'string',
37
+ description: 'The type of item to unstar',
38
+ enum: ['song', 'album', 'artist'],
39
+ },
40
+ },
41
+ required: ['id', 'type'],
42
+ },
43
+ },
44
+ {
45
+ name: 'set_rating',
46
+ description: 'Set a rating (0-5 stars) for a song, album, or artist',
47
+ inputSchema: {
48
+ type: 'object',
49
+ properties: {
50
+ id: {
51
+ type: 'string',
52
+ description: 'The unique ID of the item to rate',
53
+ },
54
+ type: {
55
+ type: 'string',
56
+ description: 'The type of item to rate',
57
+ enum: ['song', 'album', 'artist'],
58
+ },
59
+ rating: {
60
+ type: 'number',
61
+ description: 'Rating from 0-5 stars (0 removes rating)',
62
+ minimum: 0,
63
+ maximum: 5,
64
+ },
65
+ },
66
+ required: ['id', 'type', 'rating'],
67
+ },
68
+ },
69
+ {
70
+ name: 'list_starred_items',
71
+ description: 'List starred/favorited songs, albums, or artists',
72
+ inputSchema: {
73
+ type: 'object',
74
+ properties: {
75
+ type: {
76
+ type: 'string',
77
+ description: 'Type of starred items to list',
78
+ enum: ['songs', 'albums', 'artists'],
79
+ },
80
+ limit: {
81
+ type: 'number',
82
+ description: 'Maximum number of items to return (1-500)',
83
+ minimum: 1,
84
+ maximum: 500,
85
+ default: 100,
86
+ },
87
+ offset: {
88
+ type: 'number',
89
+ description: 'Number of items to skip for pagination',
90
+ minimum: 0,
91
+ default: 0,
92
+ },
93
+ },
94
+ required: ['type'],
95
+ },
96
+ },
97
+ {
98
+ name: 'list_top_rated',
99
+ description: 'List top-rated songs, albums, or artists',
100
+ inputSchema: {
101
+ type: 'object',
102
+ properties: {
103
+ type: {
104
+ type: 'string',
105
+ description: 'Type of items to list',
106
+ enum: ['songs', 'albums', 'artists'],
107
+ },
108
+ minRating: {
109
+ type: 'number',
110
+ description: 'Minimum rating to include (1-5)',
111
+ minimum: 1,
112
+ maximum: 5,
113
+ default: 4,
114
+ },
115
+ limit: {
116
+ type: 'number',
117
+ description: 'Maximum number of items to return (1-500)',
118
+ minimum: 1,
119
+ maximum: 500,
120
+ default: 100,
121
+ },
122
+ offset: {
123
+ type: 'number',
124
+ description: 'Number of items to skip for pagination',
125
+ minimum: 0,
126
+ default: 0,
127
+ },
128
+ },
129
+ required: ['type'],
130
+ },
131
+ },
132
+ ];
133
+ // Factory function for creating user preferences tool category with dependencies
134
+ export function createUserPreferencesToolCategory(client, config) {
135
+ return {
136
+ tools,
137
+ async handleToolCall(name, args) {
138
+ switch (name) {
139
+ case 'star_item':
140
+ return await starItem(client, config, args);
141
+ case 'unstar_item':
142
+ return await unstarItem(client, config, args);
143
+ case 'set_rating':
144
+ return await setRating(client, config, args);
145
+ case 'list_starred_items':
146
+ return await listStarredItems(client, args);
147
+ case 'list_top_rated':
148
+ return await listTopRated(client, args);
149
+ default:
150
+ throw new Error(ErrorFormatter.toolUnknown(`user preference ${name}`));
151
+ }
152
+ }
153
+ };
154
+ }
155
+ //# sourceMappingURL=user-preferences-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-preferences-handlers.js","sourceRoot":"","sources":["../../../src/tools/handlers/user-preferences-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Navidrome MCP Server - Tool Registry
3
+ * Copyright (C) 2025
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU Affero General Public License as published
7
+ * by the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU Affero General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU Affero General Public License
16
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+ */
18
+ export { registerTools, createToolResponse } from './handlers/registry.js';
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Navidrome MCP Server - Tool Registry
3
+ * Copyright (C) 2025
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU Affero General Public License as published
7
+ * by the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU Affero General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU Affero General Public License
16
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+ */
18
+ // Re-export the coordinated registry system
19
+ export { registerTools, createToolResponse } from './handlers/registry.js';
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,4CAA4C;AAC5C,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Navidrome MCP Server - Last.fm Music Discovery Tools
3
+ * Copyright (C) 2025
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU Affero General Public License as published
7
+ * by the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU Affero General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU Affero General Public License
16
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+ */
18
+ import type { Config } from '../config.js';
19
+ export interface LastFmArtist {
20
+ name: string;
21
+ match: number;
22
+ url: string;
23
+ mbid: string | null;
24
+ }
25
+ export interface SimilarArtistsResult {
26
+ artist: string;
27
+ count: number;
28
+ similarArtists: LastFmArtist[];
29
+ }
30
+ export interface LastFmTrack {
31
+ name: string;
32
+ artist: string;
33
+ match: number;
34
+ url: string;
35
+ mbid: string | null;
36
+ }
37
+ export interface SimilarTracksResult {
38
+ originalTrack: {
39
+ artist: string;
40
+ track: string;
41
+ };
42
+ count: number;
43
+ similarTracks: LastFmTrack[];
44
+ }
45
+ export interface LastFmTag {
46
+ name: string;
47
+ url: string;
48
+ }
49
+ export interface ArtistInfoResult {
50
+ name: string;
51
+ mbid: string | null;
52
+ url: string;
53
+ listeners: number;
54
+ playcount: number;
55
+ biography: string | null;
56
+ tags: LastFmTag[];
57
+ similar: string[];
58
+ }
59
+ export interface TopTrackResult {
60
+ rank: number;
61
+ name: string;
62
+ playcount: number;
63
+ listeners: number;
64
+ url: string;
65
+ mbid: string | null;
66
+ }
67
+ export interface TopTracksByArtistResult {
68
+ artist: string;
69
+ count: number;
70
+ tracks: TopTrackResult[];
71
+ }
72
+ export interface TrendingArtistItem {
73
+ rank: number;
74
+ name: string;
75
+ playcount: number;
76
+ listeners: number;
77
+ url: string;
78
+ mbid: string | null;
79
+ }
80
+ export interface TrendingTrackItem {
81
+ rank: number;
82
+ name: string;
83
+ artist: string;
84
+ playcount: number;
85
+ listeners: number;
86
+ url: string;
87
+ mbid: string | null;
88
+ }
89
+ export interface TrendingTagItem {
90
+ rank: number;
91
+ name: string;
92
+ count: number;
93
+ url: string;
94
+ }
95
+ export interface TrendingMusicResult {
96
+ type: string;
97
+ page: number;
98
+ perPage: number;
99
+ count: number;
100
+ items: TrendingArtistItem[] | TrendingTrackItem[] | TrendingTagItem[];
101
+ }
102
+ export declare function getSimilarArtists(config: Config, args: unknown): Promise<SimilarArtistsResult>;
103
+ export declare function getSimilarTracks(config: Config, args: unknown): Promise<SimilarTracksResult>;
104
+ export declare function getArtistInfo(config: Config, args: unknown): Promise<ArtistInfoResult>;
105
+ export declare function getTopTracksByArtist(config: Config, args: unknown): Promise<TopTracksByArtistResult>;
106
+ export declare function getTrendingMusic(config: Config, args: unknown): Promise<TrendingMusicResult>;
107
+ //# sourceMappingURL=lastfm-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lastfm-discovery.d.ts","sourceRoot":"","sources":["../../src/tools/lastfm-discovery.ts"],"names":[],"mappings":"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"}