# 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 |
```