@rocksky/cli 0.1.1 → 0.3.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 (184) hide show
  1. package/README.md +270 -1
  2. package/TOOLS.md +194 -0
  3. package/bun.lock +28 -0
  4. package/dist/drizzle/0000_parallel_paper_doll.sql +220 -0
  5. package/dist/drizzle/meta/0000_snapshot.json +1559 -0
  6. package/dist/drizzle/meta/_journal.json +13 -0
  7. package/dist/index.js +8718 -165
  8. package/drizzle/0000_parallel_paper_doll.sql +220 -0
  9. package/drizzle/meta/0000_snapshot.json +1559 -0
  10. package/drizzle/meta/_journal.json +13 -0
  11. package/drizzle.config.ts +18 -0
  12. package/package.json +34 -4
  13. package/src/client.ts +32 -14
  14. package/src/cmd/mcp.ts +8 -0
  15. package/src/cmd/scrobble-api.ts +457 -0
  16. package/src/cmd/scrobble.ts +14 -61
  17. package/src/cmd/search.ts +27 -25
  18. package/src/cmd/sync.ts +812 -0
  19. package/src/cmd/whoami.ts +36 -7
  20. package/src/context.ts +24 -0
  21. package/src/drizzle.ts +53 -0
  22. package/src/index.ts +72 -23
  23. package/src/jetstream.ts +285 -0
  24. package/src/lexicon/index.ts +1321 -0
  25. package/src/lexicon/lexicons.ts +5453 -0
  26. package/src/lexicon/types/app/bsky/actor/profile.ts +38 -0
  27. package/src/lexicon/types/app/rocksky/actor/defs.ts +146 -0
  28. package/src/lexicon/types/app/rocksky/actor/getActorAlbums.ts +56 -0
  29. package/src/lexicon/types/app/rocksky/actor/getActorArtists.ts +56 -0
  30. package/src/lexicon/types/app/rocksky/actor/getActorCompatibility.ts +48 -0
  31. package/src/lexicon/types/app/rocksky/actor/getActorLovedSongs.ts +52 -0
  32. package/src/lexicon/types/app/rocksky/actor/getActorNeighbours.ts +48 -0
  33. package/src/lexicon/types/app/rocksky/actor/getActorPlaylists.ts +52 -0
  34. package/src/lexicon/types/app/rocksky/actor/getActorScrobbles.ts +52 -0
  35. package/src/lexicon/types/app/rocksky/actor/getActorSongs.ts +56 -0
  36. package/src/lexicon/types/app/rocksky/actor/getProfile.ts +43 -0
  37. package/src/lexicon/types/app/rocksky/album/defs.ts +85 -0
  38. package/src/lexicon/types/app/rocksky/album/getAlbum.ts +43 -0
  39. package/src/lexicon/types/app/rocksky/album/getAlbumTracks.ts +48 -0
  40. package/src/lexicon/types/app/rocksky/album/getAlbums.ts +50 -0
  41. package/src/lexicon/types/app/rocksky/album.ts +51 -0
  42. package/src/lexicon/types/app/rocksky/apikey/createApikey.ts +51 -0
  43. package/src/lexicon/types/app/rocksky/apikey/defs.ts +31 -0
  44. package/src/lexicon/types/app/rocksky/apikey/getApikeys.ts +50 -0
  45. package/src/lexicon/types/app/rocksky/apikey/removeApikey.ts +43 -0
  46. package/src/lexicon/types/app/rocksky/apikey/updateApikey.ts +53 -0
  47. package/src/lexicon/types/app/rocksky/apikeys/defs.ts +7 -0
  48. package/src/lexicon/types/app/rocksky/artist/defs.ts +140 -0
  49. package/src/lexicon/types/app/rocksky/artist/getArtist.ts +43 -0
  50. package/src/lexicon/types/app/rocksky/artist/getArtistAlbums.ts +48 -0
  51. package/src/lexicon/types/app/rocksky/artist/getArtistListeners.ts +52 -0
  52. package/src/lexicon/types/app/rocksky/artist/getArtistTracks.ts +52 -0
  53. package/src/lexicon/types/app/rocksky/artist/getArtists.ts +52 -0
  54. package/src/lexicon/types/app/rocksky/artist.ts +41 -0
  55. package/src/lexicon/types/app/rocksky/charts/defs.ts +44 -0
  56. package/src/lexicon/types/app/rocksky/charts/getScrobblesChart.ts +49 -0
  57. package/src/lexicon/types/app/rocksky/dropbox/defs.ts +71 -0
  58. package/src/lexicon/types/app/rocksky/dropbox/downloadFile.ts +42 -0
  59. package/src/lexicon/types/app/rocksky/dropbox/getFiles.ts +43 -0
  60. package/src/lexicon/types/app/rocksky/dropbox/getMetadata.ts +43 -0
  61. package/src/lexicon/types/app/rocksky/dropbox/getTemporaryLink.ts +43 -0
  62. package/src/lexicon/types/app/rocksky/feed/defs.ts +182 -0
  63. package/src/lexicon/types/app/rocksky/feed/describeFeedGenerator.ts +48 -0
  64. package/src/lexicon/types/app/rocksky/feed/generator.ts +29 -0
  65. package/src/lexicon/types/app/rocksky/feed/getFeed.ts +47 -0
  66. package/src/lexicon/types/app/rocksky/feed/getFeedGenerator.ts +48 -0
  67. package/src/lexicon/types/app/rocksky/feed/getFeedGenerators.ts +43 -0
  68. package/src/lexicon/types/app/rocksky/feed/getFeedSkeleton.ts +56 -0
  69. package/src/lexicon/types/app/rocksky/feed/getNowPlayings.ts +43 -0
  70. package/src/lexicon/types/app/rocksky/feed/search.ts +43 -0
  71. package/src/lexicon/types/app/rocksky/googledrive/defs.ts +42 -0
  72. package/src/lexicon/types/app/rocksky/googledrive/downloadFile.ts +42 -0
  73. package/src/lexicon/types/app/rocksky/googledrive/getFile.ts +43 -0
  74. package/src/lexicon/types/app/rocksky/googledrive/getFiles.ts +43 -0
  75. package/src/lexicon/types/app/rocksky/graph/defs.ts +47 -0
  76. package/src/lexicon/types/app/rocksky/graph/follow.ts +28 -0
  77. package/src/lexicon/types/app/rocksky/graph/followAccount.ts +50 -0
  78. package/src/lexicon/types/app/rocksky/graph/getFollowers.ts +56 -0
  79. package/src/lexicon/types/app/rocksky/graph/getFollows.ts +56 -0
  80. package/src/lexicon/types/app/rocksky/graph/getKnownFollowers.ts +52 -0
  81. package/src/lexicon/types/app/rocksky/graph/unfollowAccount.ts +50 -0
  82. package/src/lexicon/types/app/rocksky/like/dislikeShout.ts +49 -0
  83. package/src/lexicon/types/app/rocksky/like/dislikeSong.ts +49 -0
  84. package/src/lexicon/types/app/rocksky/like/likeShout.ts +49 -0
  85. package/src/lexicon/types/app/rocksky/like/likeSong.ts +49 -0
  86. package/src/lexicon/types/app/rocksky/like.ts +27 -0
  87. package/src/lexicon/types/app/rocksky/player/addDirectoryToQueue.ts +40 -0
  88. package/src/lexicon/types/app/rocksky/player/addItemsToQueue.ts +39 -0
  89. package/src/lexicon/types/app/rocksky/player/defs.ts +57 -0
  90. package/src/lexicon/types/app/rocksky/player/getCurrentlyPlaying.ts +44 -0
  91. package/src/lexicon/types/app/rocksky/player/getPlaybackQueue.ts +42 -0
  92. package/src/lexicon/types/app/rocksky/player/next.ts +34 -0
  93. package/src/lexicon/types/app/rocksky/player/pause.ts +34 -0
  94. package/src/lexicon/types/app/rocksky/player/play.ts +34 -0
  95. package/src/lexicon/types/app/rocksky/player/playDirectory.ts +38 -0
  96. package/src/lexicon/types/app/rocksky/player/playFile.ts +35 -0
  97. package/src/lexicon/types/app/rocksky/player/previous.ts +34 -0
  98. package/src/lexicon/types/app/rocksky/player/seek.ts +36 -0
  99. package/src/lexicon/types/app/rocksky/playlist/createPlaylist.ts +37 -0
  100. package/src/lexicon/types/app/rocksky/playlist/defs.ts +86 -0
  101. package/src/lexicon/types/app/rocksky/playlist/getPlaylist.ts +43 -0
  102. package/src/lexicon/types/app/rocksky/playlist/getPlaylists.ts +50 -0
  103. package/src/lexicon/types/app/rocksky/playlist/insertDirectory.ts +39 -0
  104. package/src/lexicon/types/app/rocksky/playlist/insertFiles.ts +38 -0
  105. package/src/lexicon/types/app/rocksky/playlist/removePlaylist.ts +35 -0
  106. package/src/lexicon/types/app/rocksky/playlist/removeTrack.ts +37 -0
  107. package/src/lexicon/types/app/rocksky/playlist/startPlaylist.ts +39 -0
  108. package/src/lexicon/types/app/rocksky/playlist.ts +43 -0
  109. package/src/lexicon/types/app/rocksky/radio/defs.ts +63 -0
  110. package/src/lexicon/types/app/rocksky/radio.ts +37 -0
  111. package/src/lexicon/types/app/rocksky/scrobble/createScrobble.ts +91 -0
  112. package/src/lexicon/types/app/rocksky/scrobble/defs.ts +93 -0
  113. package/src/lexicon/types/app/rocksky/scrobble/getScrobble.ts +43 -0
  114. package/src/lexicon/types/app/rocksky/scrobble/getScrobbles.ts +54 -0
  115. package/src/lexicon/types/app/rocksky/scrobble.ts +75 -0
  116. package/src/lexicon/types/app/rocksky/shout/createShout.ts +49 -0
  117. package/src/lexicon/types/app/rocksky/shout/defs.ts +58 -0
  118. package/src/lexicon/types/app/rocksky/shout/getAlbumShouts.ts +52 -0
  119. package/src/lexicon/types/app/rocksky/shout/getArtistShouts.ts +52 -0
  120. package/src/lexicon/types/app/rocksky/shout/getProfileShouts.ts +52 -0
  121. package/src/lexicon/types/app/rocksky/shout/getShoutReplies.ts +52 -0
  122. package/src/lexicon/types/app/rocksky/shout/getTrackShouts.ts +48 -0
  123. package/src/lexicon/types/app/rocksky/shout/removeShout.ts +43 -0
  124. package/src/lexicon/types/app/rocksky/shout/replyShout.ts +51 -0
  125. package/src/lexicon/types/app/rocksky/shout/reportShout.ts +51 -0
  126. package/src/lexicon/types/app/rocksky/shout.ts +30 -0
  127. package/src/lexicon/types/app/rocksky/song/createSong.ts +71 -0
  128. package/src/lexicon/types/app/rocksky/song/defs.ts +103 -0
  129. package/src/lexicon/types/app/rocksky/song/getSong.ts +43 -0
  130. package/src/lexicon/types/app/rocksky/song/getSongs.ts +50 -0
  131. package/src/lexicon/types/app/rocksky/song.ts +74 -0
  132. package/src/lexicon/types/app/rocksky/spotify/defs.ts +35 -0
  133. package/src/lexicon/types/app/rocksky/spotify/getCurrentlyPlaying.ts +43 -0
  134. package/src/lexicon/types/app/rocksky/spotify/next.ts +32 -0
  135. package/src/lexicon/types/app/rocksky/spotify/pause.ts +32 -0
  136. package/src/lexicon/types/app/rocksky/spotify/play.ts +32 -0
  137. package/src/lexicon/types/app/rocksky/spotify/previous.ts +32 -0
  138. package/src/lexicon/types/app/rocksky/spotify/seek.ts +35 -0
  139. package/src/lexicon/types/app/rocksky/stats/defs.ts +33 -0
  140. package/src/lexicon/types/app/rocksky/stats/getStats.ts +43 -0
  141. package/src/lexicon/types/com/atproto/repo/strongRef.ts +26 -0
  142. package/src/lexicon/util.ts +13 -0
  143. package/src/lib/agent.ts +56 -0
  144. package/src/lib/cleanUpJetstreamLock.ts +66 -0
  145. package/src/lib/cleanUpSyncLock.ts +56 -0
  146. package/src/lib/didUnstorageCache.ts +72 -0
  147. package/src/lib/env.ts +25 -0
  148. package/src/lib/extractPdsFromDid.ts +33 -0
  149. package/src/lib/getDidAndHandle.ts +39 -0
  150. package/src/lib/idResolver.ts +52 -0
  151. package/src/lib/lastfm.ts +26 -0
  152. package/src/lib/matchTrack.ts +47 -0
  153. package/src/logger.ts +18 -0
  154. package/src/mcp/index.ts +269 -0
  155. package/src/mcp/tools/albums.ts +13 -0
  156. package/src/mcp/tools/artists.ts +17 -0
  157. package/src/mcp/tools/create.ts +27 -0
  158. package/src/mcp/tools/myscrobbles.ts +42 -0
  159. package/src/mcp/tools/nowplaying.ts +53 -0
  160. package/src/mcp/tools/scrobbles.ts +39 -0
  161. package/src/mcp/tools/search.ts +88 -0
  162. package/src/mcp/tools/stats.ts +40 -0
  163. package/src/mcp/tools/tracks.ts +15 -0
  164. package/src/mcp/tools/whoami.ts +27 -0
  165. package/src/schema/album-tracks.ts +30 -0
  166. package/src/schema/albums.ts +29 -0
  167. package/src/schema/artist-albums.ts +29 -0
  168. package/src/schema/artist-genres.ts +17 -0
  169. package/src/schema/artist-tracks.ts +29 -0
  170. package/src/schema/artists.ts +30 -0
  171. package/src/schema/auth-session.ts +18 -0
  172. package/src/schema/genres.ts +18 -0
  173. package/src/schema/index.ts +33 -0
  174. package/src/schema/loved-tracks.ts +27 -0
  175. package/src/schema/scrobbles.ts +30 -0
  176. package/src/schema/tracks.ts +39 -0
  177. package/src/schema/user-albums.ts +31 -0
  178. package/src/schema/user-artists.ts +32 -0
  179. package/src/schema/user-tracks.ts +31 -0
  180. package/src/schema/users.ts +21 -0
  181. package/src/scrobble.ts +410 -0
  182. package/src/sqliteKv.ts +173 -0
  183. package/src/types.ts +308 -0
  184. package/tsconfig.json +26 -29
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ## Rocksky CLI
2
2
 
3
- 🎧 The official command-line interface for [Rocksky](https://rocksky.app) — a modern, decentralized music tracking and discovery platform built on the [AT Protocol](https://atproto.com).
3
+ 🎧 The official command-line interface for [Rocksky](https://rocksky.app) — a modern, decentralized music tracking and discovery platform built on [AT Protocol](https://atproto.com).
4
4
 
5
5
  ## Features
6
6
  - 🔐 Authenticate with your Rocksky account using OAuth
@@ -8,6 +8,34 @@
8
8
  - 📈 See your recent scrobbles
9
9
  - 📤 Manually scrobble tracks
10
10
  - 🛠️ Useful developer tools for integrating Rocksky into your workflows
11
+ - 🤖 MCP Server
12
+
13
+ ## Table of Contents
14
+ - [Installation](#installation)
15
+ - [Run in development](#run-in-development)
16
+ - [Usage](#usage)
17
+ - [Available Commands](#available-commands)
18
+ - [Rocksky MCP Server Tools](#rocksky-mcp-server-tools)
19
+ - [whoami](#whoami)
20
+ - [nowplaying](#nowplaying)
21
+ - [scrobbles](#scrobbles)
22
+ - [search](#search)
23
+ - [stats](#stats)
24
+ - [artists](#artists)
25
+ - [albums](#albums)
26
+ - [tracks](#tracks)
27
+
28
+ ## Installation
29
+
30
+ ```sh
31
+ npm install -g @rocksky/cli
32
+ ```
33
+
34
+ You can also use the CLI without installing it globally by running `npx`:
35
+
36
+ ```sh
37
+ npx @rocksky/cli --help
38
+ ```
11
39
 
12
40
  ## Run in development
13
41
  To run the CLI in development mode, install the dependencies:
@@ -43,6 +71,12 @@ rocksky login
43
71
  rocksky nowplaying
44
72
  ```
45
73
 
74
+ `scrobble` - Manually scrobbles a track.
75
+
76
+ ```bash
77
+ rocksky scrobble "Karma Police" "Radiohead"
78
+ ```
79
+
46
80
  `scrobbles` - Lists all recently scrobbled tracks.
47
81
 
48
82
  ```bash
@@ -84,3 +118,238 @@ rocksky tracks [did]
84
118
  ```bash
85
119
  rocksky scrobble "Karma Police" "Radiohead"
86
120
  ```
121
+
122
+ `scrobble-api` - Start a local listenbrainz/lastfm compatibility server
123
+
124
+ ```bash
125
+ rocksky scrobble-api
126
+ ```
127
+
128
+ `sync` - Sync your local Rocksky data from AT Protocol
129
+
130
+ ```bash
131
+ rocksky sync
132
+ ```
133
+
134
+ `whoami` - Displays the current user's information.
135
+
136
+ ```bash
137
+ rocksky whoami
138
+ ```
139
+
140
+ `mcp` - Starts the Rocksky MCP server.
141
+
142
+ ```bash
143
+ rocksky mcp
144
+ ```
145
+
146
+ ## Rocksky MCP Server Tools
147
+
148
+ Here is a list of tools provided by the Rocksky MCP server:
149
+
150
+ ### whoami
151
+
152
+ Get the current user's information.
153
+
154
+ **Example:**
155
+ ```json
156
+ {
157
+ "name": "whoami"
158
+ }
159
+ ```
160
+
161
+ **Returns:**
162
+
163
+ The current user's information, including their DID, handle, and other relevant details.
164
+
165
+ ### nowplaying
166
+
167
+ Get the currently playing track.
168
+
169
+ **Parameters:**
170
+
171
+ - `did` (optional): The DID or handle of the user to get the now playing track for. If not provided, it defaults to the current user.
172
+
173
+ **Example:**
174
+ ```json
175
+ {
176
+ "name": "nowplaying",
177
+ "args": {
178
+ "did": "did:plc:7vdlgi2bflelz7mmuxoqjfcr"
179
+ }
180
+ }
181
+ ```
182
+
183
+ **Returns:**
184
+
185
+ The currently playing track for the specified user.
186
+
187
+ ### scrobbles
188
+
189
+ Display recently played tracks (recent scrobbles).
190
+
191
+ **Parameters:**
192
+ - `did` (optional): The DID or handle of the user to get scrobbles for. If not provided, it returns all recent scrobbles from Rocksky.
193
+
194
+ **Example:**
195
+ ```json
196
+ {
197
+ "name": "scrobbles",
198
+ "args": {
199
+ "did": "did:plc:7vdlgi2bflelz7mmuxoqjfcr"
200
+ }
201
+ }
202
+ ```
203
+
204
+ **Returns:**
205
+
206
+ A list of recently played tracks for the specified user.
207
+
208
+ ### my-scrobbles
209
+
210
+ Display recently played tracks (recent scrobbles) for the current user.
211
+
212
+ **Example:**
213
+ ```json
214
+ {
215
+ "name": "my-scrobbles"
216
+ }
217
+ ```
218
+
219
+ **Returns:**
220
+
221
+ A list of recently played tracks for the current user.
222
+
223
+ ### search
224
+ Search for tracks, albums, artists, or Rocksky users.
225
+
226
+ **Parameters:**
227
+ - `query`: The search query string.
228
+ - `limit` (optional): The maximum number of results to return. Defaults to 10.
229
+ - `albums` (optional): If true, search for albums. Defaults to false.
230
+ - `artists` (optional): If true, search for artists. Defaults to false.
231
+ - `tracks` (optional): If true, search for tracks. Defaults to false.
232
+ - `users` (optional): If true, search for Rocksky users. Defaults to false.
233
+
234
+ **Example:**
235
+ ```json
236
+ {
237
+ "name": "search",
238
+ "args": {
239
+ "query": "Radiohead",
240
+ "limit": 5,
241
+ "albums": false,
242
+ "artists": false,
243
+ "tracks": false,
244
+ "users": false
245
+ }
246
+ }
247
+ ```
248
+
249
+ **Returns:**
250
+
251
+ A list of search results based on the specified query and filters.
252
+
253
+ ### artists
254
+ List the user's top artists or current user's top artists if no `did` is provided.
255
+
256
+ **Parameters:**
257
+ - `did` (optional): The DID or handle of the user to get top artists for. If not provided, it defaults to the current user.
258
+ - `limit` (optional): The maximum number of artists to return. Defaults to 20.
259
+
260
+ **Example:**
261
+ ```json
262
+ {
263
+ "name": "artists",
264
+ "args": {
265
+ "did": "did:plc:7vdlgi2bflelz7mmuxoqjfcr",
266
+ "limit": 20
267
+ }
268
+ }
269
+ ```
270
+
271
+ **Returns:**
272
+
273
+ A list of the user's top artists, including their names and play counts.
274
+
275
+ ### albums
276
+ List the user's top albums or current user's top albums if no `did` is provided.
277
+
278
+ **Parameters:**
279
+ - `did` (optional): The DID or handle of the user to get top albums for. If not provided, it defaults to the current user.
280
+ - `limit` (optional): The maximum number of albums to return. Defaults to 20.
281
+
282
+ **Example:**
283
+ ```json
284
+ {
285
+ "name": "albums",
286
+ "args": {
287
+ "did": "did:plc:7vdlgi2bflelz7mmuxoqjfcr",
288
+ "limit": 20
289
+ }
290
+ }
291
+ ```
292
+
293
+ **Returns:**
294
+
295
+ A list of the user's top albums, including their names and play counts.
296
+
297
+ ### tracks
298
+ List the user's top tracks or current user's top tracks if no `did` is provided.
299
+
300
+ **Parameters:**
301
+ - `did` (optional): The DID or handle of the user to get top tracks for. If not provided, it defaults to the current user.
302
+ - `limit` (optional): The maximum number of tracks to return. Defaults to 20.
303
+
304
+ **Example:**
305
+ ```json
306
+ {
307
+ "name": "tracks",
308
+ "args": {
309
+ "did": "did:plc:7vdlgi2bflelz7mmuxoqjfcr",
310
+ "limit": 20
311
+ }
312
+ }
313
+ ```
314
+
315
+ **Returns:**
316
+
317
+ A list of the user's top tracks, including their names and play counts.
318
+
319
+ ### stats
320
+ Display the user's Rocksky account statistics or current user's statistics if no `did` is provided.
321
+
322
+ **Parameters:**
323
+ - `did` (optional): The DID or handle of the user to get statistics for. If not provided, it defaults to the current user.
324
+
325
+ **Example:**
326
+ ```json
327
+ {
328
+ "name": "stats",
329
+ "args": {
330
+ "did": "did:plc:7vdlgi2bflelz7mmuxoqjfcr"
331
+ }
332
+ }
333
+ ```
334
+
335
+ ### create-apikey
336
+ Create a new API key for the current user.
337
+
338
+ **Parameters:**
339
+ - `name`: The name of the API key.
340
+ - `description` (optional): A description of the API key.
341
+
342
+ **Example:**
343
+ ```json
344
+ {
345
+ "name": "create-apikey",
346
+ "args": {
347
+ "name": "My API Key",
348
+ "description": "This is my API key."
349
+ }
350
+ }
351
+ ```
352
+
353
+ **Returns:**
354
+
355
+ A confirmation message indicating that the API key was created successfully.
package/TOOLS.md ADDED
@@ -0,0 +1,194 @@
1
+ # Rocksky MCP Tools
2
+
3
+ This document provides a comprehensive list of all tools available in the Rocksky MCP server.
4
+
5
+ ## whoami
6
+
7
+ Get the current user's information.
8
+
9
+ ## nowplaying
10
+
11
+ Get the currently playing track.
12
+
13
+ **Parameters:**
14
+
15
+ - `did` (optional): The DID or handle of the user to get the now playing track for. If not provided, it defaults to the current user.
16
+
17
+ **Example:**
18
+ ```json
19
+ {
20
+ "name": "nowplaying",
21
+ "args": {
22
+ "did": "did:plc:7vdlgi2bflelz7mmuxoqjfcr"
23
+ }
24
+ }
25
+ ```
26
+
27
+ **Returns:**
28
+ The currently playing track for the specified user.
29
+
30
+ ## scrobbles
31
+
32
+ Display recently played tracks (recent scrobbles).
33
+
34
+ **Parameters:**
35
+ - `did` (optional): The DID or handle of the user to get scrobbles for. If not provided, it returns all recent scrobbles from Rocksky.
36
+
37
+ **Example:**
38
+ ```json
39
+ {
40
+ "name": "scrobbles",
41
+ "args": {
42
+ "did": "did:plc:7vdlgi2bflelz7mmuxoqjfcr"
43
+ }
44
+ }
45
+ ```
46
+
47
+ **Returns:**
48
+ A list of recently played tracks for the specified user.
49
+
50
+ ## my-scrobbles
51
+
52
+ Display recently played tracks (recent scrobbles) for the current user.
53
+
54
+ **Example:**
55
+ ```json
56
+ {
57
+ "name": "my-scrobbles"
58
+ }
59
+ ```
60
+
61
+ **Returns:**
62
+ A list of recently played tracks for the current user.
63
+
64
+ ## search
65
+ Search for tracks, albums, artists, or Rocksky users.
66
+
67
+ **Parameters:**
68
+ - `query`: The search query string.
69
+ - `limit` (optional): The maximum number of results to return. Defaults to 10.
70
+ - `albums` (optional): If true, search for albums. Defaults to false.
71
+ - `artists` (optional): If true, search for artists. Defaults to false.
72
+ - `tracks` (optional): If true, search for tracks. Defaults to false.
73
+ - `users` (optional): If true, search for Rocksky users. Defaults to false.
74
+
75
+ **Example:**
76
+ ```json
77
+ {
78
+ "name": "search",
79
+ "args": {
80
+ "query": "Radiohead",
81
+ "limit": 5,
82
+ "albums": false,
83
+ "artists": false,
84
+ "tracks": false,
85
+ "users": false
86
+ }
87
+ }
88
+ ```
89
+
90
+ **Returns:**
91
+ A list of search results based on the specified query and filters.
92
+
93
+ ## artists
94
+ List the user's top artists or current user's top artists if no `did` is provided.
95
+
96
+ **Parameters:**
97
+ - `did` (optional): The DID or handle of the user to get top artists for. If not provided, it defaults to the current user.
98
+ - `limit` (optional): The maximum number of artists to return. Defaults to 20.
99
+
100
+ **Example:**
101
+ ```json
102
+ {
103
+ "name": "artists",
104
+ "args": {
105
+ "did": "did:plc:7vdlgi2bflelz7mmuxoqjfcr",
106
+ "limit": 20
107
+ }
108
+ }
109
+ ```
110
+
111
+ **Returns:**
112
+ A list of the user's top artists, including their names and play counts.
113
+
114
+ ## albums
115
+ List the user's top albums or current user's top albums if no `did` is provided.
116
+
117
+ **Parameters:**
118
+ - `did` (optional): The DID or handle of the user to get top albums for. If not provided, it defaults to the current user.
119
+ - `limit` (optional): The maximum number of albums to return. Defaults to 20.
120
+
121
+ **Example:**
122
+ ```json
123
+ {
124
+ "name": "albums",
125
+ "args": {
126
+ "did": "did:plc:7vdlgi2bflelz7mmuxoqjfcr",
127
+ "limit": 20
128
+ }
129
+ }
130
+ ```
131
+
132
+ **Returns:**
133
+ A list of the user's top albums, including their names and play counts.
134
+
135
+ ## tracks
136
+ List the user's top tracks or current user's top tracks if no `did` is provided.
137
+
138
+ **Parameters:**
139
+ - `did` (optional): The DID or handle of the user to get top tracks for. If not provided, it defaults to the current user.
140
+ - `limit` (optional): The maximum number of tracks to return. Defaults to 20.
141
+
142
+ **Example:**
143
+ ```json
144
+ {
145
+ "name": "tracks",
146
+ "args": {
147
+ "did": "did:plc:7vdlgi2bflelz7mmuxoqjfcr",
148
+ "limit": 20
149
+ }
150
+ }
151
+ ```
152
+
153
+ **Returns:**
154
+ A list of the user's top tracks, including their names and play counts.
155
+
156
+ ## stats
157
+ Display the user's Rocksky account statistics or current user's statistics if no `did` is provided.
158
+
159
+ **Parameters:**
160
+ - `did` (optional): The DID or handle of the user to get statistics for. If not provided, it defaults to the current user.
161
+
162
+ **Example:**
163
+ ```json
164
+ {
165
+ "name": "stats",
166
+ "args": {
167
+ "did": "did:plc:7vdlgi2bflelz7mmuxoqjfcr"
168
+ }
169
+ }
170
+ ```
171
+
172
+ ## create-apikey
173
+ Create a new API key for the current user.
174
+
175
+ **Parameters:**
176
+ - `name`: The name of the API key.
177
+ - `description` (optional): A description of the API key.
178
+
179
+ **Example:**
180
+ ```json
181
+ {
182
+ "name": "create-apikey",
183
+ "args": {
184
+ "name": "My API Key",
185
+ "description": "This is my API key."
186
+ }
187
+ }
188
+ ```
189
+
190
+ **Returns:**
191
+ A confirmation message indicating that the API key was created successfully.
192
+
193
+
194
+
package/bun.lock CHANGED
@@ -4,6 +4,7 @@
4
4
  "": {
5
5
  "name": "rocksky",
6
6
  "dependencies": {
7
+ "@modelcontextprotocol/sdk": "^1.10.2",
7
8
  "axios": "^1.8.4",
8
9
  "chalk": "^5.4.1",
9
10
  "commander": "^13.1.0",
@@ -13,6 +14,7 @@
13
14
  "md5": "^2.3.0",
14
15
  "open": "^10.1.0",
15
16
  "table": "^6.9.0",
17
+ "zod": "^3.24.3",
16
18
  },
17
19
  "devDependencies": {
18
20
  "@types/express": "^5.0.1",
@@ -76,6 +78,8 @@
76
78
 
77
79
  "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="],
78
80
 
81
+ "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.10.2", "", { "dependencies": { "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.3", "eventsource": "^3.0.2", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-rb6AMp2DR4SN+kc6L1ta2NCpApyA9WYNx3CrTSZvGxq9wH71bRur+zRqPfg0vQ9mjywR7qZdX2RGHOPq3ss+tA=="],
82
+
79
83
  "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
80
84
 
81
85
  "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="],
@@ -214,6 +218,8 @@
214
218
 
215
219
  "cors": ["cors@2.8.5", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g=="],
216
220
 
221
+ "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
222
+
217
223
  "crypt": ["crypt@0.0.2", "", {}, "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow=="],
218
224
 
219
225
  "dayjs": ["dayjs@1.11.13", "", {}, "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="],
@@ -256,8 +262,14 @@
256
262
 
257
263
  "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="],
258
264
 
265
+ "eventsource": ["eventsource@3.0.6", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-l19WpE2m9hSuyP06+FbuUUf1G+R0SFLrtQfbRb9PRr+oimOfxQhgGCbVaXg5IvZyyTThJsxh6L/srkMiCeBPDA=="],
266
+
267
+ "eventsource-parser": ["eventsource-parser@3.0.1", "", {}, "sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA=="],
268
+
259
269
  "express": ["express@5.1.0", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.0", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA=="],
260
270
 
271
+ "express-rate-limit": ["express-rate-limit@7.5.0", "", { "peerDependencies": { "express": "^4.11 || 5 || ^5.0.0-beta.1" } }, "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg=="],
272
+
261
273
  "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
262
274
 
263
275
  "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="],
@@ -332,6 +344,8 @@
332
344
 
333
345
  "is-wsl": ["is-wsl@3.1.0", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw=="],
334
346
 
347
+ "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
348
+
335
349
  "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
336
350
 
337
351
  "lodash.truncate": ["lodash.truncate@4.4.2", "", {}, "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw=="],
@@ -370,12 +384,16 @@
370
384
 
371
385
  "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="],
372
386
 
387
+ "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
388
+
373
389
  "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="],
374
390
 
375
391
  "path-to-regexp": ["path-to-regexp@8.2.0", "", {}, "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ=="],
376
392
 
377
393
  "picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="],
378
394
 
395
+ "pkce-challenge": ["pkce-challenge@5.0.0", "", {}, "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ=="],
396
+
379
397
  "pkgroll": ["pkgroll@2.12.1", "", { "dependencies": { "@rollup/plugin-alias": "^5.1.1", "@rollup/plugin-commonjs": "^28.0.2", "@rollup/plugin-dynamic-import-vars": "^2.1.5", "@rollup/plugin-inject": "^5.0.5", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^16.0.0", "@rollup/pluginutils": "^5.1.4", "esbuild": "^0.25.1", "magic-string": "^0.30.17", "rollup": "^4.34.6", "rollup-pluginutils": "^2.8.2" }, "peerDependencies": { "typescript": "^4.1 || ^5.0" }, "optionalPeers": ["typescript"], "bin": { "pkgroll": "dist/cli.mjs" } }, "sha512-MpooedkVk28Sl1I5q8YO2QZmdlHdEtCzv1nReZdHNRhY0CzbZ14TewN47JopF+0rGCaQOERSPfcIOgPZDQXlZA=="],
380
398
 
381
399
  "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="],
@@ -418,6 +436,10 @@
418
436
 
419
437
  "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="],
420
438
 
439
+ "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
440
+
441
+ "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
442
+
421
443
  "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="],
422
444
 
423
445
  "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="],
@@ -454,8 +476,14 @@
454
476
 
455
477
  "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="],
456
478
 
479
+ "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
480
+
457
481
  "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="],
458
482
 
483
+ "zod": ["zod@3.24.3", "", {}, "sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg=="],
484
+
485
+ "zod-to-json-schema": ["zod-to-json-schema@3.24.5", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g=="],
486
+
459
487
  "form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="],
460
488
 
461
489
  "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],