#
tokens: 752/50000 4/4 files
lines: on (toggle) GitHub
raw markdown copy reset
# Directory Structure

```
├── .gitignore
├── .python-version
├── main.py
├── pyproject.toml
├── README.md
└── uv.lock
```

# Files

--------------------------------------------------------------------------------
/.python-version:
--------------------------------------------------------------------------------

```
1 | 3.13
2 | 
```

--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------

```
 1 | # Python-generated files
 2 | __pycache__/
 3 | *.py[oc]
 4 | build/
 5 | dist/
 6 | wheels/
 7 | *.egg-info
 8 | 
 9 | # Virtual environments
10 | .venv
11 | 
```

--------------------------------------------------------------------------------
/pyproject.toml:
--------------------------------------------------------------------------------

```toml
 1 | [project]
 2 | name = "mcp-qqmusic-test-server"
 3 | version = "0.1.0"
 4 | description = "Add your description here"
 5 | readme = "README.md"
 6 | requires-python = ">=3.13"
 7 | dependencies = [
 8 |     "mcp[cli]>=1.5.0",
 9 |     "qqmusic-api-python>=0.3.4",
10 | ]
11 | 
```

--------------------------------------------------------------------------------
/main.py:
--------------------------------------------------------------------------------

```python
 1 | import asyncio
 2 | from qqmusic_api import search
 3 | from mcp.server.fastmcp import FastMCP
 4 | import json
 5 | 
 6 | # Initialize FastMCP server
 7 | mcp = FastMCP("mcp-qqmusic-test-server")
 8 | 
 9 | @mcp.tool()
10 | async def search_music(keyword: str, page: int = 1, num: int = 20):
11 |     """
12 |     Search for music tracks
13 |     
14 |     Args:
15 |         keyword: Search keyword or phrase
16 |         page: Page number for pagination (default: 1)
17 |         num: Maximum number of results to return (default: 20)
18 |         
19 |     Returns:
20 |         List of music tracks matching the search criteria
21 |     """
22 |     result = await search.search_by_type(keyword=keyword, page=page, num=num)
23 |     
24 |     # 提取指定字段
25 |     # json.dumps(result, ensure_ascii=False) - 这行代码没有实际作用,因为结果没有被使用
26 |     if isinstance(result, list):
27 |         filtered_list = []
28 |         for item in result:
29 |             # 提取歌曲信息而不是专辑信息
30 |             song_info = {
31 |                 "id": item.get("id"),
32 |                 "mid": item.get("mid"),
33 |                 "name": item.get("name"),
34 |                 "pmid": item.get("pmid", ""),
35 |                 "subtitle": item.get("subtitle", ""),
36 |                 "time_public": item.get("time_public", ""),
37 |                 "title": item.get("title", item.get("name", ""))
38 |             }
39 |             filtered_list.append(song_info)
40 |     
41 |     return filtered_list
42 | 
43 | 
44 | if __name__ == "__main__":
45 |     # print(asyncio.run(search_music("周杰伦")))
46 |     mcp.run(transport='stdio')
47 | 
```