51 lines
1.5 KiB
Python
51 lines
1.5 KiB
Python
'''
|
|
Function:
|
|
Implementation of Naive MCP Examples
|
|
Author:
|
|
Zhenchao Jin
|
|
WeChat Official Account (微信公众号):
|
|
Charles的皮卡丘
|
|
'''
|
|
import sys, logging
|
|
from mcp.server.fastmcp import FastMCP
|
|
from musicdl import musicdl as musicdl_pkg
|
|
|
|
|
|
'''settings'''
|
|
_client = None
|
|
mcp = FastMCP("musicdl")
|
|
logging.basicConfig(stream=sys.stderr, level=logging.INFO)
|
|
|
|
|
|
def getclient(music_sources=None, init_music_clients_cfg=None, clients_threadings=None, requests_overrides=None, search_rules=None):
|
|
"""get music client"""
|
|
global _client
|
|
if _client is None:
|
|
_client = musicdl_pkg.MusicClient(
|
|
music_sources=music_sources or ['NeteaseMusicClient'], init_music_clients_cfg=init_music_clients_cfg or {}, clients_threadings=clients_threadings or {},
|
|
requests_overrides=requests_overrides or {}, search_rules=search_rules or {},
|
|
)
|
|
return _client
|
|
|
|
|
|
@mcp.tool()
|
|
def search(keyword: str, music_sources: list[str] | None = None) -> dict:
|
|
"""Search tracks (only use content you have rights to access/download)."""
|
|
res = getclient(music_sources=music_sources).search(keyword=keyword)
|
|
flat = []
|
|
for source, items in res.items():
|
|
for i, it in enumerate(items):
|
|
flat.append({"source": source, "index": i, "song_info": it})
|
|
return {"results": flat}
|
|
|
|
|
|
@mcp.tool()
|
|
def download(song_infos: list[dict]) -> dict:
|
|
"""Download tracks described by song_infos."""
|
|
getclient().download(song_infos=song_infos)
|
|
return {"ok": True}
|
|
|
|
|
|
'''main'''
|
|
if __name__ == "__main__":
|
|
mcp.run(transport="stdio") |