maimai-mcp 0.1.0__tar.gz
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.
- maimai_mcp-0.1.0/LICENSE +54 -0
- maimai_mcp-0.1.0/MANIFEST.in +17 -0
- maimai_mcp-0.1.0/PKG-INFO +377 -0
- maimai_mcp-0.1.0/README.md +332 -0
- maimai_mcp-0.1.0/maimai_mcp/.env.example +49 -0
- maimai_mcp-0.1.0/maimai_mcp/__init__.py +3 -0
- maimai_mcp-0.1.0/maimai_mcp/__main__.py +6 -0
- maimai_mcp-0.1.0/maimai_mcp/bootstrap.py +90 -0
- maimai_mcp-0.1.0/maimai_mcp/cli.py +523 -0
- maimai_mcp-0.1.0/maimai_mcp/config.py +70 -0
- maimai_mcp-0.1.0/maimai_mcp/constants.py +237 -0
- maimai_mcp-0.1.0/maimai_mcp/core/__init__.py +0 -0
- maimai_mcp-0.1.0/maimai_mcp/core/clients/__init__.py +1 -0
- maimai_mcp-0.1.0/maimai_mcp/core/clients/divingfish/__init__.py +1 -0
- maimai_mcp-0.1.0/maimai_mcp/core/clients/divingfish/client.py +148 -0
- maimai_mcp-0.1.0/maimai_mcp/core/clients/divingfish/exceptions.py +21 -0
- maimai_mcp-0.1.0/maimai_mcp/core/clients/divingfish/models/__init__.py +43 -0
- maimai_mcp-0.1.0/maimai_mcp/core/clients/divingfish/models/music.py +46 -0
- maimai_mcp-0.1.0/maimai_mcp/core/clients/divingfish/models/score.py +83 -0
- maimai_mcp-0.1.0/maimai_mcp/core/clients/exceptions.py +40 -0
- maimai_mcp-0.1.0/maimai_mcp/core/clients/http.py +68 -0
- maimai_mcp-0.1.0/maimai_mcp/core/clients/lxns/__init__.py +1 -0
- maimai_mcp-0.1.0/maimai_mcp/core/clients/lxns/client.py +292 -0
- maimai_mcp-0.1.0/maimai_mcp/core/clients/lxns/exceptions.py +29 -0
- maimai_mcp-0.1.0/maimai_mcp/core/clients/lxns/models/__init__.py +51 -0
- maimai_mcp-0.1.0/maimai_mcp/core/clients/lxns/models/base.py +8 -0
- maimai_mcp-0.1.0/maimai_mcp/core/clients/lxns/models/collection.py +36 -0
- maimai_mcp-0.1.0/maimai_mcp/core/clients/lxns/models/enum.py +55 -0
- maimai_mcp-0.1.0/maimai_mcp/core/clients/lxns/models/music.py +83 -0
- maimai_mcp-0.1.0/maimai_mcp/core/clients/lxns/models/oauth.py +12 -0
- maimai_mcp-0.1.0/maimai_mcp/core/clients/lxns/models/player.py +17 -0
- maimai_mcp-0.1.0/maimai_mcp/core/clients/lxns/models/score.py +48 -0
- maimai_mcp-0.1.0/maimai_mcp/core/clients/yuzuchan/__init__.py +1 -0
- maimai_mcp-0.1.0/maimai_mcp/core/clients/yuzuchan/client.py +152 -0
- maimai_mcp-0.1.0/maimai_mcp/core/clients/yuzuchan/exceptions.py +27 -0
- maimai_mcp-0.1.0/maimai_mcp/core/clients/yuzuchan/models/__init__.py +17 -0
- maimai_mcp-0.1.0/maimai_mcp/core/clients/yuzuchan/models/alias.py +16 -0
- maimai_mcp-0.1.0/maimai_mcp/core/clients/yuzuchan/models/enum.py +21 -0
- maimai_mcp-0.1.0/maimai_mcp/core/clients/yuzuchan/models/message.py +5 -0
- maimai_mcp-0.1.0/maimai_mcp/core/clients/yuzuchan/models/status.py +32 -0
- maimai_mcp-0.1.0/maimai_mcp/core/database/__init__.py +1 -0
- maimai_mcp-0.1.0/maimai_mcp/core/database/qq.py +89 -0
- maimai_mcp-0.1.0/maimai_mcp/core/domain/__init__.py +38 -0
- maimai_mcp-0.1.0/maimai_mcp/core/domain/auth.py +27 -0
- maimai_mcp-0.1.0/maimai_mcp/core/domain/chart.py +95 -0
- maimai_mcp-0.1.0/maimai_mcp/core/domain/player.py +122 -0
- maimai_mcp-0.1.0/maimai_mcp/core/domain/progress.py +88 -0
- maimai_mcp-0.1.0/maimai_mcp/core/domain/rise.py +133 -0
- maimai_mcp-0.1.0/maimai_mcp/core/errors.py +193 -0
- maimai_mcp-0.1.0/maimai_mcp/core/image/__init__.py +59 -0
- maimai_mcp-0.1.0/maimai_mcp/core/image/assets.py +197 -0
- maimai_mcp-0.1.0/maimai_mcp/core/image/base.py +256 -0
- maimai_mcp-0.1.0/maimai_mcp/core/image/best50.py +219 -0
- maimai_mcp-0.1.0/maimai_mcp/core/image/chart.py +369 -0
- maimai_mcp-0.1.0/maimai_mcp/core/image/chart_list.py +3 -0
- maimai_mcp-0.1.0/maimai_mcp/core/image/info.py +141 -0
- maimai_mcp-0.1.0/maimai_mcp/core/image/plate_table.py +654 -0
- maimai_mcp-0.1.0/maimai_mcp/core/image/rating_table.py +313 -0
- maimai_mcp-0.1.0/maimai_mcp/core/image/score.py +404 -0
- maimai_mcp-0.1.0/maimai_mcp/core/image/song.py +157 -0
- maimai_mcp-0.1.0/maimai_mcp/core/image/table.py +672 -0
- maimai_mcp-0.1.0/maimai_mcp/core/image/tools.py +278 -0
- maimai_mcp-0.1.0/maimai_mcp/core/image/update_table.py +367 -0
- maimai_mcp-0.1.0/maimai_mcp/core/io_image.py +64 -0
- maimai_mcp-0.1.0/maimai_mcp/core/merge/__init__.py +282 -0
- maimai_mcp-0.1.0/maimai_mcp/core/merge/alias.py +17 -0
- maimai_mcp-0.1.0/maimai_mcp/core/merge/alias_list.py +25 -0
- maimai_mcp-0.1.0/maimai_mcp/core/merge/models/__init__.py +61 -0
- maimai_mcp-0.1.0/maimai_mcp/core/merge/models/alias.py +12 -0
- maimai_mcp-0.1.0/maimai_mcp/core/merge/models/best50.py +10 -0
- maimai_mcp-0.1.0/maimai_mcp/core/merge/models/enum.py +84 -0
- maimai_mcp-0.1.0/maimai_mcp/core/merge/models/guess.py +25 -0
- maimai_mcp-0.1.0/maimai_mcp/core/merge/models/player.py +24 -0
- maimai_mcp-0.1.0/maimai_mcp/core/merge/models/score.py +81 -0
- maimai_mcp-0.1.0/maimai_mcp/core/merge/models/song.py +41 -0
- maimai_mcp-0.1.0/maimai_mcp/core/merge/music_list.py +153 -0
- maimai_mcp-0.1.0/maimai_mcp/core/merge/play_result.py +133 -0
- maimai_mcp-0.1.0/maimai_mcp/core/merge/player.py +68 -0
- maimai_mcp-0.1.0/maimai_mcp/core/qq_identity_store.py +476 -0
- maimai_mcp-0.1.0/maimai_mcp/core/query_common.py +37 -0
- maimai_mcp-0.1.0/maimai_mcp/core/service/__init__.py +200 -0
- maimai_mcp-0.1.0/maimai_mcp/core/service/diving_fish.py +53 -0
- maimai_mcp-0.1.0/maimai_mcp/core/service/lxns.py +24 -0
- maimai_mcp-0.1.0/maimai_mcp/core/service/yuzuchan.py +48 -0
- maimai_mcp-0.1.0/maimai_mcp/core/tool.py +53 -0
- maimai_mcp-0.1.0/maimai_mcp/core/user.py +113 -0
- maimai_mcp-0.1.0/maimai_mcp/core/utils/__init__.py +1 -0
- maimai_mcp-0.1.0/maimai_mcp/core/utils/calc.py +148 -0
- maimai_mcp-0.1.0/maimai_mcp/features/__init__.py +1 -0
- maimai_mcp-0.1.0/maimai_mcp/features/_cli.py +61 -0
- maimai_mcp-0.1.0/maimai_mcp/features/alias_query/__init__.py +1 -0
- maimai_mcp-0.1.0/maimai_mcp/features/alias_query/__main__.py +43 -0
- maimai_mcp-0.1.0/maimai_mcp/features/alias_query/query.py +45 -0
- maimai_mcp-0.1.0/maimai_mcp/features/best50/__init__.py +1 -0
- maimai_mcp-0.1.0/maimai_mcp/features/best50/__main__.py +47 -0
- maimai_mcp-0.1.0/maimai_mcp/features/best50/draw.py +37 -0
- maimai_mcp-0.1.0/maimai_mcp/features/best50/query.py +32 -0
- maimai_mcp-0.1.0/maimai_mcp/features/bind_lxns/__init__.py +1 -0
- maimai_mcp-0.1.0/maimai_mcp/features/bind_lxns/__main__.py +66 -0
- maimai_mcp-0.1.0/maimai_mcp/features/chart_info/__init__.py +1 -0
- maimai_mcp-0.1.0/maimai_mcp/features/chart_info/__main__.py +46 -0
- maimai_mcp-0.1.0/maimai_mcp/features/chart_info/draw.py +37 -0
- maimai_mcp-0.1.0/maimai_mcp/features/chart_info/query.py +33 -0
- maimai_mcp-0.1.0/maimai_mcp/features/fortune/__init__.py +1 -0
- maimai_mcp-0.1.0/maimai_mcp/features/fortune/__main__.py +36 -0
- maimai_mcp-0.1.0/maimai_mcp/features/fortune/draw.py +25 -0
- maimai_mcp-0.1.0/maimai_mcp/features/fortune/query.py +58 -0
- maimai_mcp-0.1.0/maimai_mcp/features/global_chart/__init__.py +1 -0
- maimai_mcp-0.1.0/maimai_mcp/features/global_chart/__main__.py +50 -0
- maimai_mcp-0.1.0/maimai_mcp/features/global_chart/draw.py +24 -0
- maimai_mcp-0.1.0/maimai_mcp/features/global_chart/query.py +36 -0
- maimai_mcp-0.1.0/maimai_mcp/features/level_progress/__init__.py +1 -0
- maimai_mcp-0.1.0/maimai_mcp/features/level_progress/__main__.py +36 -0
- maimai_mcp-0.1.0/maimai_mcp/features/level_progress/draw.py +73 -0
- maimai_mcp-0.1.0/maimai_mcp/features/level_progress/query.py +63 -0
- maimai_mcp-0.1.0/maimai_mcp/features/level_score_list/__init__.py +1 -0
- maimai_mcp-0.1.0/maimai_mcp/features/level_score_list/__main__.py +42 -0
- maimai_mcp-0.1.0/maimai_mcp/features/level_score_list/draw.py +46 -0
- maimai_mcp-0.1.0/maimai_mcp/features/level_score_list/query.py +47 -0
- maimai_mcp-0.1.0/maimai_mcp/features/mai_what/__init__.py +1 -0
- maimai_mcp-0.1.0/maimai_mcp/features/mai_what/__main__.py +33 -0
- maimai_mcp-0.1.0/maimai_mcp/features/mai_what/query.py +31 -0
- maimai_mcp-0.1.0/maimai_mcp/features/plate_table/__init__.py +1 -0
- maimai_mcp-0.1.0/maimai_mcp/features/plate_table/__main__.py +49 -0
- maimai_mcp-0.1.0/maimai_mcp/features/plate_table/draw.py +67 -0
- maimai_mcp-0.1.0/maimai_mcp/features/plate_table/query.py +33 -0
- maimai_mcp-0.1.0/maimai_mcp/features/play_score/__init__.py +1 -0
- maimai_mcp-0.1.0/maimai_mcp/features/play_score/__main__.py +44 -0
- maimai_mcp-0.1.0/maimai_mcp/features/play_score/draw.py +32 -0
- maimai_mcp-0.1.0/maimai_mcp/features/play_score/query.py +32 -0
- maimai_mcp-0.1.0/maimai_mcp/features/random_song/__init__.py +1 -0
- maimai_mcp-0.1.0/maimai_mcp/features/random_song/__main__.py +37 -0
- maimai_mcp-0.1.0/maimai_mcp/features/random_song/query.py +35 -0
- maimai_mcp-0.1.0/maimai_mcp/features/ranking/__init__.py +1 -0
- maimai_mcp-0.1.0/maimai_mcp/features/ranking/__main__.py +42 -0
- maimai_mcp-0.1.0/maimai_mcp/features/ranking/draw.py +17 -0
- maimai_mcp-0.1.0/maimai_mcp/features/ranking/query.py +73 -0
- maimai_mcp-0.1.0/maimai_mcp/features/rating_table/__init__.py +1 -0
- maimai_mcp-0.1.0/maimai_mcp/features/rating_table/__main__.py +39 -0
- maimai_mcp-0.1.0/maimai_mcp/features/rating_table/draw.py +36 -0
- maimai_mcp-0.1.0/maimai_mcp/features/rating_table/query.py +32 -0
- maimai_mcp-0.1.0/maimai_mcp/features/rise_score/__init__.py +1 -0
- maimai_mcp-0.1.0/maimai_mcp/features/rise_score/__main__.py +43 -0
- maimai_mcp-0.1.0/maimai_mcp/features/rise_score/draw.py +30 -0
- maimai_mcp-0.1.0/maimai_mcp/features/rise_score/query.py +40 -0
- maimai_mcp-0.1.0/maimai_mcp/features/score_line/__init__.py +1 -0
- maimai_mcp-0.1.0/maimai_mcp/features/score_line/__main__.py +39 -0
- maimai_mcp-0.1.0/maimai_mcp/features/score_line/query.py +48 -0
- maimai_mcp-0.1.0/maimai_mcp/features/search_song/__init__.py +1 -0
- maimai_mcp-0.1.0/maimai_mcp/features/search_song/__main__.py +46 -0
- maimai_mcp-0.1.0/maimai_mcp/features/search_song/draw.py +37 -0
- maimai_mcp-0.1.0/maimai_mcp/features/search_song/query.py +64 -0
- maimai_mcp-0.1.0/maimai_mcp/features/update_alias/__init__.py +1 -0
- maimai_mcp-0.1.0/maimai_mcp/features/update_alias/__main__.py +28 -0
- maimai_mcp-0.1.0/maimai_mcp/features/update_music/__init__.py +1 -0
- maimai_mcp-0.1.0/maimai_mcp/features/update_music/__main__.py +26 -0
- maimai_mcp-0.1.0/maimai_mcp/features/update_tables/__init__.py +1 -0
- maimai_mcp-0.1.0/maimai_mcp/features/update_tables/__main__.py +41 -0
- maimai_mcp-0.1.0/maimai_mcp/features/user_settings/__init__.py +1 -0
- maimai_mcp-0.1.0/maimai_mcp/features/user_settings/__main__.py +53 -0
- maimai_mcp-0.1.0/maimai_mcp/formatters.py +67 -0
- maimai_mcp-0.1.0/maimai_mcp/log.py +30 -0
- maimai_mcp-0.1.0/maimai_mcp/resources.py +45 -0
- maimai_mcp-0.1.0/maimai_mcp/result.py +185 -0
- maimai_mcp-0.1.0/maimai_mcp/runtime.py +41 -0
- maimai_mcp-0.1.0/maimai_mcp/schemas.py +229 -0
- maimai_mcp-0.1.0/maimai_mcp/server.py +19 -0
- maimai_mcp-0.1.0/maimai_mcp/tools/__init__.py +15 -0
- maimai_mcp-0.1.0/maimai_mcp/tools/catalog.py +242 -0
- maimai_mcp-0.1.0/maimai_mcp/tools/player.py +218 -0
- maimai_mcp-0.1.0/maimai_mcp/tools/tables.py +203 -0
- maimai_mcp-0.1.0/maimai_mcp/tools/user.py +282 -0
- maimai_mcp-0.1.0/maimai_mcp/tools/workflow.py +247 -0
- maimai_mcp-0.1.0/maimai_mcp.egg-info/PKG-INFO +377 -0
- maimai_mcp-0.1.0/maimai_mcp.egg-info/SOURCES.txt +180 -0
- maimai_mcp-0.1.0/maimai_mcp.egg-info/dependency_links.txt +1 -0
- maimai_mcp-0.1.0/maimai_mcp.egg-info/entry_points.txt +3 -0
- maimai_mcp-0.1.0/maimai_mcp.egg-info/requires.txt +17 -0
- maimai_mcp-0.1.0/maimai_mcp.egg-info/top_level.txt +1 -0
- maimai_mcp-0.1.0/mcp.example.json +24 -0
- maimai_mcp-0.1.0/pyproject.toml +78 -0
- maimai_mcp-0.1.0/setup.cfg +4 -0
maimai_mcp-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
================================================================================
|
|
2
|
+
maimai-mcp — BSD 2-Clause License
|
|
3
|
+
================================================================================
|
|
4
|
+
|
|
5
|
+
Copyright (c) 2026, antinomie1 and maimai-mcp contributors
|
|
6
|
+
|
|
7
|
+
Redistribution and use in source and binary forms, with or without
|
|
8
|
+
modification, are permitted provided that the following conditions are met:
|
|
9
|
+
|
|
10
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
|
11
|
+
list of conditions and the following disclaimer.
|
|
12
|
+
|
|
13
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
14
|
+
this list of conditions and the following disclaimer in the documentation
|
|
15
|
+
and/or other materials provided with the distribution.
|
|
16
|
+
|
|
17
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
18
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
19
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
20
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
21
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
22
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
23
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
24
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
25
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
26
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
27
|
+
|
|
28
|
+
================================================================================
|
|
29
|
+
Third-party / upstream — MIT License
|
|
30
|
+
Yuri-YuzuChaN/maimaiDX
|
|
31
|
+
https://github.com/Yuri-YuzuChaN/maimaiDX
|
|
32
|
+
================================================================================
|
|
33
|
+
|
|
34
|
+
MIT License
|
|
35
|
+
|
|
36
|
+
Copyright (c) 2021 Yuri-YuzuChaN
|
|
37
|
+
|
|
38
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
39
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
40
|
+
in the Software without restriction, including without limitation the rights
|
|
41
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
42
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
43
|
+
furnished to do so, subject to the following conditions:
|
|
44
|
+
|
|
45
|
+
The above copyright notice and this permission notice shall be included in all
|
|
46
|
+
copies or substantial portions of the Software.
|
|
47
|
+
|
|
48
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
49
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
50
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
51
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
52
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
53
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
54
|
+
SOFTWARE.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
include LICENSE
|
|
2
|
+
include README.md
|
|
3
|
+
include mcp.example.json
|
|
4
|
+
include pyproject.toml
|
|
5
|
+
include maimai_mcp/.env.example
|
|
6
|
+
|
|
7
|
+
recursive-exclude * __pycache__
|
|
8
|
+
recursive-exclude * *.py[cod]
|
|
9
|
+
recursive-exclude * .env
|
|
10
|
+
global-exclude *.pyc *.pyo *.pyd
|
|
11
|
+
|
|
12
|
+
prune maimai_mcp/logs
|
|
13
|
+
prune output
|
|
14
|
+
prune static
|
|
15
|
+
prune qq-identity-cache
|
|
16
|
+
prune mcps
|
|
17
|
+
prune .git
|
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: maimai-mcp
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: maimaiDX query library, CLI and MCP (stdio) server for maimai DX
|
|
5
|
+
Author: antinomie1
|
|
6
|
+
License-Expression: BSD-2-Clause
|
|
7
|
+
Project-URL: Homepage, https://github.com/antinomie1/maimai-mcp
|
|
8
|
+
Project-URL: Repository, https://github.com/antinomie1/maimai-mcp
|
|
9
|
+
Project-URL: Issues, https://github.com/antinomie1/maimai-mcp/issues
|
|
10
|
+
Keywords: maimai,maimaidx,mcp,model-context-protocol,diving-fish,lxns,stdio
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Intended Audience :: End Users/Desktop
|
|
15
|
+
Classifier: Operating System :: OS Independent
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
22
|
+
Classifier: Topic :: Games/Entertainment
|
|
23
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
24
|
+
Classifier: Typing :: Typed
|
|
25
|
+
Requires-Python: >=3.10
|
|
26
|
+
Description-Content-Type: text/markdown
|
|
27
|
+
License-File: LICENSE
|
|
28
|
+
Requires-Dist: aiofiles>=25.1.0
|
|
29
|
+
Requires-Dist: aiosqlite>=0.22.1
|
|
30
|
+
Requires-Dist: httpx>=0.28.1
|
|
31
|
+
Requires-Dist: loguru>=0.7.3
|
|
32
|
+
Requires-Dist: Pillow~=12.2.0
|
|
33
|
+
Requires-Dist: pydantic>=2.13.4
|
|
34
|
+
Requires-Dist: pydantic-settings>=2.14.1
|
|
35
|
+
Requires-Dist: python-dotenv>=1.2.2
|
|
36
|
+
Requires-Dist: pyecharts>=2.1.0
|
|
37
|
+
Requires-Dist: playwright>=1.60.0
|
|
38
|
+
Requires-Dist: sqlmodel>=0.0.38
|
|
39
|
+
Requires-Dist: numpy~=2.2.6
|
|
40
|
+
Requires-Dist: mcp>=1.0.0
|
|
41
|
+
Provides-Extra: dev
|
|
42
|
+
Requires-Dist: build>=1.2.0; extra == "dev"
|
|
43
|
+
Requires-Dist: twine>=5.0.0; extra == "dev"
|
|
44
|
+
Dynamic: license-file
|
|
45
|
+
|
|
46
|
+
# maimai-mcp
|
|
47
|
+
|
|
48
|
+
本地可用的舞萌 DX **查询库 / CLI / MCP 服务**:查曲、查分、进度与绘图,供命令行或任意 Agent / 宿主调用。
|
|
49
|
+
|
|
50
|
+
- 仓库:https://github.com/antinomie1/maimai-mcp
|
|
51
|
+
- 绘图与业务参考:[Yuri-YuzuChaN/maimaiDX](https://github.com/Yuri-YuzuChaN/maimaiDX)
|
|
52
|
+
|
|
53
|
+
## 功能概览
|
|
54
|
+
|
|
55
|
+
| 类别 | 能力 |
|
|
56
|
+
|------|------|
|
|
57
|
+
| 曲库 | 搜歌、别名、谱面信息、随机曲、分数线 |
|
|
58
|
+
| 成绩 | 水鱼 / 落雪 B50、单曲成绩、等级/定数分数列表 |
|
|
59
|
+
| 进度 | 牌子完成表、定数表、等级进度、上分推荐 |
|
|
60
|
+
| 其它 | 排名、今日运势、曲目全服统计(ginfo) |
|
|
61
|
+
| 用户设定 | 按 QQ 存主题 / 默认查分器 / 落雪 token(`user.db`) |
|
|
62
|
+
| 身份缓存 | 经 **NapCat** HTTP API 拉取好友/群成员 → `identity_cache.json`,昵称反查 QQ |
|
|
63
|
+
|
|
64
|
+
默认主题 **circle**;需要 `prism_plus` 时再切换。
|
|
65
|
+
**水鱼**为主路径;**落雪**可选(需 Token / OAuth 绑定)。
|
|
66
|
+
|
|
67
|
+
> **重要:** MCP **不会**自动读取聊天上下文里的 QQ。Agent **每次**查分须在 `params` 中显式传 `qq`(或 `username`)。
|
|
68
|
+
> **禁止把群号填进 `qq`**(例如会话 `GroupMessage:用户QQ_群号` 中,第二段是群号)。
|
|
69
|
+
|
|
70
|
+
## 目录结构
|
|
71
|
+
|
|
72
|
+
```text
|
|
73
|
+
maimai_mcp/ 主包(业务 + CLI + MCP)
|
|
74
|
+
core/ 客户端、领域逻辑、绘图、QQ 身份缓存(NapCat 拉取)
|
|
75
|
+
features/ 功能拆分(query / draw)
|
|
76
|
+
tools/ MCP 工具注册
|
|
77
|
+
skills/ Agent skill(maimai-mcp 调用规则)
|
|
78
|
+
scripts/ Inspector、冒烟脚本
|
|
79
|
+
static/ 曲库 JSON、字体、封面等资源(自备)
|
|
80
|
+
output/ 默认出图目录
|
|
81
|
+
mcp.example.json MCP 客户端配置示例
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## 安装
|
|
85
|
+
|
|
86
|
+
要求 **Python ≥ 3.10**。包名:[`maimai-mcp`](https://pypi.org/project/maimai-mcp/)(import 名 `maimai_mcp`)。
|
|
87
|
+
|
|
88
|
+
> **静态资源不随 PyPI 包分发**(体积约数百 MB)。请单独下载资源包,并通过 `MAIMAIDX_PATH` 指向其中的 `static` 目录。
|
|
89
|
+
|
|
90
|
+
### 从 PyPI 安装(推荐)
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
pip install maimai-mcp
|
|
94
|
+
# ginfo 饼图需要:
|
|
95
|
+
# playwright install chromium
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
安装后可用入口:
|
|
99
|
+
|
|
100
|
+
| 命令 | 说明 |
|
|
101
|
+
|------|------|
|
|
102
|
+
| `maimai` | CLI |
|
|
103
|
+
| `maimai-mcp` | MCP stdio 服务 |
|
|
104
|
+
| `python -m maimai_mcp` | 同上(MCP) |
|
|
105
|
+
| `python -m maimai_mcp.cli ...` | CLI 子命令 |
|
|
106
|
+
|
|
107
|
+
环境变量请写在 **MCP 客户端配置的 `env`**,或系统/用户环境中(见下方)。`pip install` 后不建议在 site-packages 里写 `.env`。
|
|
108
|
+
|
|
109
|
+
### 从源码开发安装
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
git clone https://github.com/antinomie1/maimai-mcp.git
|
|
113
|
+
cd maimai-mcp
|
|
114
|
+
pip install -e .
|
|
115
|
+
# playwright install chromium
|
|
116
|
+
|
|
117
|
+
cp maimai_mcp/.env.example maimai_mcp/.env
|
|
118
|
+
# 编辑 maimai_mcp/.env,至少填写 MAIMAIDX_PATH
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### 静态资源
|
|
122
|
+
|
|
123
|
+
与 maimaiDX 相同资源包,解压后将 `MAIMAIDX_PATH` 指向其中的 `static` 目录:
|
|
124
|
+
|
|
125
|
+
- [Cloudreve](https://cloud.yuzuchan.moe/f/34s7/Resource%20CN1.55.7z)
|
|
126
|
+
- [OneDrive](https://yuzuai-my.sharepoint.com/:u:/g/personal/yuzu_yuzuchan_moe/IQBGKHie6MAaTZy3rME7Q-ruAVKgXDCKROqz5e25KtMeeVY?e=53eC6a)
|
|
127
|
+
|
|
128
|
+
请遵守上游美术相关声明。首次使用表类指令前建议生成表图:
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
maimai update tables
|
|
132
|
+
# 或:python -m maimai_mcp.cli update tables
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## 环境变量
|
|
136
|
+
|
|
137
|
+
配置从 `maimai_mcp/.env` 读取(`pydantic-settings`),也可在 MCP 客户端 `env` 中注入。
|
|
138
|
+
完整注释见 [`maimai_mcp/.env.example`](maimai_mcp/.env.example)。**不要提交含 Token 的 `.env` / `mcp.json`。**
|
|
139
|
+
|
|
140
|
+
### 路径与资源
|
|
141
|
+
|
|
142
|
+
| 变量 | 必填 | 默认 | 说明 |
|
|
143
|
+
|------|------|------|------|
|
|
144
|
+
| `MAIMAIDX_PATH` | **是** | — | `static` 资源目录的**绝对路径** |
|
|
145
|
+
| `MAIMAIDX_ALIAS_PROXY` | 否 | `false` | `true` 时别名走国内域名 |
|
|
146
|
+
| `SAVE_IN_MEMORY` | 否 | `true` | 预载主题贴图(更快、更吃内存) |
|
|
147
|
+
| `ASSETS_ONLINE` | 否 | `true` | 封面等缺失时是否允许在线补全 |
|
|
148
|
+
| `BOT_NAME` | 否 | `maimai` | 展示名(运势、落雪授权提示) |
|
|
149
|
+
| `OUTPUT_DIR` | 否 | 仓库 `output/` | 出图默认目录 |
|
|
150
|
+
| `QQ_IDENTITY_CACHE_DIR` | 否 | `./qq-identity-cache` | 身份缓存目录(`identity_cache.json`) |
|
|
151
|
+
| `NAPCAT_BASE_URL` | 刷新身份缓存时需要 | — | NapCat HTTP 地址,如 `http://127.0.0.1:3000`(也可用 `ONEBOT_BASE_URL`) |
|
|
152
|
+
| `NAPCAT_ACCESS_TOKEN` | 否 | — | NapCat HTTP 鉴权 Token(也可用 `ONEBOT_ACCESS_TOKEN`) |
|
|
153
|
+
| `QQ_IDENTITY_GROUP_DELAY_MS` | 否 | `250` | 拉群成员时的组间间隔(毫秒) |
|
|
154
|
+
|
|
155
|
+
### 水鱼 Diving-Fish
|
|
156
|
+
|
|
157
|
+
| 变量 | 说明 |
|
|
158
|
+
|------|------|
|
|
159
|
+
| `DIVINGFISH_TOKEN` | 开发者 Token(强烈建议;无则查分可能仅限 b50) |
|
|
160
|
+
| `DIVINGFISH_PROBER_PROXY` | 是否走代理访问水鱼 |
|
|
161
|
+
|
|
162
|
+
申请:[水鱼查分器](https://www.diving-fish.com/maimaidx/prober/)
|
|
163
|
+
|
|
164
|
+
### 落雪 Lxns(可选)
|
|
165
|
+
|
|
166
|
+
| 变量 | 说明 |
|
|
167
|
+
|------|------|
|
|
168
|
+
| `LXNS_DEV_TOKEN` | 开发者 Token;曲库合并 / 落雪数据源依赖 |
|
|
169
|
+
| `LX_CLIENT_ID` / `LX_CLIENT_SECRET` | OAuth 绑定 |
|
|
170
|
+
| `REDIRECT_URI` | 本机常用 `urn:ietf:wg:oauth:2.0:oob` |
|
|
171
|
+
|
|
172
|
+
### 最小示例
|
|
173
|
+
|
|
174
|
+
```env
|
|
175
|
+
MAIMAIDX_PATH=C:\path\to\maimai-mcp\static
|
|
176
|
+
DIVINGFISH_TOKEN=你的水鱼Token
|
|
177
|
+
OUTPUT_DIR=C:\path\to\maimai-mcp\output
|
|
178
|
+
# 需要身份缓存(昵称反查 / 防群号当 QQ)时:
|
|
179
|
+
# NAPCAT_BASE_URL=http://127.0.0.1:3000
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## CLI
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
# 未 pip install -e 时:set PYTHONPATH=.
|
|
186
|
+
python -m maimai_mcp.cli b50 --username <水鱼用户名> --out out/b50.png
|
|
187
|
+
python -m maimai_mcp.cli b50 --qq <QQ>
|
|
188
|
+
python -m maimai_mcp.cli chart 834
|
|
189
|
+
python -m maimai_mcp.cli search --mode 定数 14.0 --format json
|
|
190
|
+
python -m maimai_mcp.cli plate --ver 檄 --plan 极 --mode progress --qq <QQ>
|
|
191
|
+
python -m maimai_mcp.cli user theme prism_plus --qq <QQ>
|
|
192
|
+
python -m maimai_mcp.cli update music
|
|
193
|
+
python -m maimai_mcp.cli update alias
|
|
194
|
+
python -m maimai_mcp.cli update tables
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
入口脚本(install 后):`maimai`、`maimai-mcp`。
|
|
198
|
+
|
|
199
|
+
## MCP
|
|
200
|
+
|
|
201
|
+
### 启动
|
|
202
|
+
|
|
203
|
+
```bash
|
|
204
|
+
python -m maimai_mcp
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### 客户端配置
|
|
208
|
+
|
|
209
|
+
**PyPI 安装后**(推荐):用入口脚本,不必设置 `cwd` / `PYTHONPATH`:
|
|
210
|
+
|
|
211
|
+
```json
|
|
212
|
+
{
|
|
213
|
+
"mcpServers": {
|
|
214
|
+
"maimai": {
|
|
215
|
+
"command": "maimai-mcp",
|
|
216
|
+
"env": {
|
|
217
|
+
"MAIMAIDX_PATH": "/path/to/static",
|
|
218
|
+
"OUTPUT_DIR": "/path/to/output",
|
|
219
|
+
"DIVINGFISH_TOKEN": ""
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
**源码 / 可编辑安装**时可参考 [`mcp.example.json`](mcp.example.json);密钥也可写在 `maimai_mcp/.env`。本地私有配置可用 `mcp.json`(已 gitignore)。
|
|
227
|
+
|
|
228
|
+
### 联调
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
./scripts/run_inspector.ps1 # 或 run_inspector.sh
|
|
232
|
+
python scripts/smoke_mcp_tools.py --username <水鱼用户名>
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### 主要 Tools
|
|
236
|
+
|
|
237
|
+
参数一般包在 `params` 对象中。查分类工具 **每次**传 `qq` / `username`(无 session 粘性补全)。
|
|
238
|
+
|
|
239
|
+
| 工具 | 说明 |
|
|
240
|
+
|------|------|
|
|
241
|
+
| **昵称身份缓存(高级)** | |
|
|
242
|
+
| `maimai_refresh_identity` | 经 **NapCat** 拉取好友/群/成员并写入身份缓存 |
|
|
243
|
+
| `maimai_identity_status` | 身份缓存路径与统计 |
|
|
244
|
+
| `maimai_resolve_qq` | 昵称/群名片反查 QQ(依赖缓存) |
|
|
245
|
+
| `maimai_get_qq_identity` | 按 QQ 读缓存中的昵称信息 |
|
|
246
|
+
| **用户设置** | |
|
|
247
|
+
| `maimai_user_show` | 主题 / 数据源 |
|
|
248
|
+
| `maimai_user_set_theme` | `circle` / `prism_plus` |
|
|
249
|
+
| `maimai_user_set_source` | 水鱼 / 落雪 |
|
|
250
|
+
| `maimai_user_bind_lxns` | 落雪 OAuth |
|
|
251
|
+
| **成绩 / 进度** | |
|
|
252
|
+
| `maimai_b50` | Best50 / AP50 |
|
|
253
|
+
| `maimai_minfo` | 单曲成绩 |
|
|
254
|
+
| `maimai_score_list` | 等级或定数分数列表 |
|
|
255
|
+
| `maimai_plate` / `maimai_plate_status` | 牌子完成表 / 进度 |
|
|
256
|
+
| `maimai_rating_table` | 定数表 |
|
|
257
|
+
| `maimai_level_progress` | 等级进度 |
|
|
258
|
+
| `maimai_rise` | 上分推荐 |
|
|
259
|
+
| `maimai_ranking` | 水鱼公开 rating 榜 |
|
|
260
|
+
| **曲库** | |
|
|
261
|
+
| `maimai_search` / `maimai_lookup_song` | 搜歌 / 搜+出图 |
|
|
262
|
+
| `maimai_chart` / `maimai_ginfo` | 谱面信息 / 全服统计 |
|
|
263
|
+
| `maimai_random` / `maimai_mai_what` | 随机 / 带上分偏向 |
|
|
264
|
+
| `maimai_score_line` | 分数线容错 |
|
|
265
|
+
| `maimai_alias_query` / `maimai_alias_local_add` | 别名 |
|
|
266
|
+
| `maimai_update_catalog` | 刷新曲库 / 别名 / 表图 |
|
|
267
|
+
| **组合** | |
|
|
268
|
+
| `maimai_player_overview` | B50 + 可选上分 |
|
|
269
|
+
| `maimai_push_plan` | 上分计划串联 |
|
|
270
|
+
| `maimai_fortune` | 今日运势 |
|
|
271
|
+
|
|
272
|
+
### 玩家身份(Agent 必读)
|
|
273
|
+
|
|
274
|
+
1. **仅当用户意图是舞萌查分/查歌/进度等时** 才调用 `maimai_*`;闲聊、发消息失败、`stop` 等 **不要** 调 MCP。
|
|
275
|
+
2. **每次**在 `params` 中传玩家 `qq`(发送者或被 @)或 `username`;**禁止**把群号填进 `qq`。
|
|
276
|
+
3. 主题 / 默认查分器按该 `qq` 存在 `user.db`,带对 qq 即自动生效;**仅用户明确要求**时再改设定。
|
|
277
|
+
4. 若工具提示像是群号:改用正确玩家 id,**不要**对调字段碰运气,也 **不要** 对错误 id 改主题/数据源。
|
|
278
|
+
5. 会话 `...:<用户QQ>_<群号>`:后半段是群号。宿主日志 `昵称/数字` **勿默认当玩家 QQ**,以 OneBot `user_id` 为准。
|
|
279
|
+
|
|
280
|
+
完整调用规则见 skill:**[`skills/maimai-mcp/SKILL.md`](skills/maimai-mcp/SKILL.md)**。
|
|
281
|
+
|
|
282
|
+
### QQ 身份缓存(NapCat 主动拉取)
|
|
283
|
+
|
|
284
|
+
依赖已启动的 **[NapCat](https://github.com/NapNeko/NapCatQQ)**(或其它兼容 OneBot 11 HTTP 的实现),用于:
|
|
285
|
+
|
|
286
|
+
- 拉取机器人**好友列表**、**所在群**、**各群成员**(QQ / 昵称 / 群名片)
|
|
287
|
+
- 写入本地 `identity_cache.json`
|
|
288
|
+
- 供 `maimai_resolve_qq` 按昵称反查,并减少「把群号当成玩家 QQ」的误用
|
|
289
|
+
|
|
290
|
+
#### 1. NapCat 侧
|
|
291
|
+
|
|
292
|
+
1. 安装并登录 [NapCat](https://github.com/NapNeko/NapCatQQ)。
|
|
293
|
+
2. 开启 **HTTP 服务**(端口自行配置,下文示例 `3000`)。
|
|
294
|
+
3. 若启用了 Token 鉴权,记下 access token。
|
|
295
|
+
4. 确认本机可访问:`http://127.0.0.1:3000`(或 Docker 内网地址,如 `http://napcat:3000`)。
|
|
296
|
+
|
|
297
|
+
#### 2. maimai-mcp 配置
|
|
298
|
+
|
|
299
|
+
```env
|
|
300
|
+
# 推荐直接用 NapCat 变量名
|
|
301
|
+
NAPCAT_BASE_URL=http://127.0.0.1:3000
|
|
302
|
+
# NAPCAT_ACCESS_TOKEN=你的token
|
|
303
|
+
|
|
304
|
+
# 等价写法(二选一即可)
|
|
305
|
+
# ONEBOT_BASE_URL=http://127.0.0.1:3000
|
|
306
|
+
# ONEBOT_ACCESS_TOKEN=
|
|
307
|
+
|
|
308
|
+
# 可选:缓存目录(默认仓库下 qq-identity-cache/)
|
|
309
|
+
# QQ_IDENTITY_CACHE_DIR=C:\path\to\qq-identity-cache
|
|
310
|
+
# QQ_IDENTITY_GROUP_DELAY_MS=250
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
MCP 客户端 `env` 示例:
|
|
314
|
+
|
|
315
|
+
```json
|
|
316
|
+
"NAPCAT_BASE_URL": "http://127.0.0.1:3000",
|
|
317
|
+
"NAPCAT_ACCESS_TOKEN": ""
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
#### 3. 刷新与使用
|
|
321
|
+
|
|
322
|
+
```text
|
|
323
|
+
maimai_refresh_identity
|
|
324
|
+
→ NapCat: get_friend_list / get_group_list / get_group_member_list
|
|
325
|
+
→ 写入 identity_cache.json
|
|
326
|
+
|
|
327
|
+
maimai_identity_status # 查看统计
|
|
328
|
+
maimai_resolve_qq # 昵称 / 群名片 → 玩家 QQ(给工具参数用)
|
|
329
|
+
maimai_get_qq_identity # 按 QQ 读缓存昵称
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
`maimai_refresh_identity` 可选参数:`timeout_ms`、`group_delay_ms`、`max_groups`(测试用)、`base_url`(临时覆盖地址)。
|
|
333
|
+
|
|
334
|
+
群很多时拉取会较久,属正常现象。对用户回复仍 **不要念出 QQ/群号**(见 [maimai-mcp skill](skills/maimai-mcp/SKILL.md))。
|
|
335
|
+
|
|
336
|
+
### 曲库与孤儿成绩
|
|
337
|
+
|
|
338
|
+
落雪全量成绩中可能含本地曲库没有的谱面。转换时会 **跳过并打日志**,避免整次查询 `KeyError`。请定期:
|
|
339
|
+
|
|
340
|
+
```bash
|
|
341
|
+
# MCP: maimai_update_catalog what=["music","alias","tables"]
|
|
342
|
+
python -m maimai_mcp.cli update music
|
|
343
|
+
python -m maimai_mcp.cli update tables
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
## Agent / 宿主集成
|
|
347
|
+
|
|
348
|
+
1. 配置 MCP:`python -m maimai_mcp`(见上文配置示例)。
|
|
349
|
+
2. 调用规则 skill:[`skills/maimai-mcp/`](skills/maimai-mcp/)(`SKILL.md` + `references/tools.md`,中文)。
|
|
350
|
+
宿主将 skill 纳入系统提示或 skill 加载路径即可。
|
|
351
|
+
3. **仅在用户明确查舞萌相关内容时** 调用 `maimai_*`;勿在无关对话里乱调查分。
|
|
352
|
+
4. **用户可见文本不得出现 QQ 号 / 群号**;身份数字仅作工具参数。
|
|
353
|
+
5. 更稳妥:宿主在工具参数中注入玩家 `user_id` 作为 `params.qq`,避免模型猜号。
|
|
354
|
+
|
|
355
|
+
## 数据源说明
|
|
356
|
+
|
|
357
|
+
| 源 | 用途 |
|
|
358
|
+
|----|------|
|
|
359
|
+
| Diving-Fish 水鱼 | 默认成绩源、曲库、排名 |
|
|
360
|
+
| Lxns 落雪 | 用户可切换的成绩源、曲库合并、OAuth |
|
|
361
|
+
| Yuzu 柚子 | 别名 |
|
|
362
|
+
| NapCat | 身份缓存:好友/群/群成员 HTTP 拉取 |
|
|
363
|
+
|
|
364
|
+
本地用户偏好(主题、数据源、落雪 token)存在 `static/data/user.db`。
|
|
365
|
+
|
|
366
|
+
## 致谢
|
|
367
|
+
|
|
368
|
+
- [Yuri-YuzuChaN/maimaiDX](https://github.com/Yuri-YuzuChaN/maimaiDX) — 绘图与业务参考
|
|
369
|
+
- [Diving-Fish 查分器](https://www.diving-fish.com/maimaidx/prober/)
|
|
370
|
+
- [落雪查分器](https://maimai.lxns.net/)
|
|
371
|
+
- [柚子别名](https://www.yuzuchan.moe/)
|
|
372
|
+
- [NapCat](https://github.com/NapNeko/NapCatQQ) — 身份缓存数据源(HTTP)
|
|
373
|
+
|
|
374
|
+
|
|
375
|
+
## License
|
|
376
|
+
|
|
377
|
+
见 [LICENSE](LICENSE)(BSD-2-Clause)。静态资源版权以 maimaiDX / 官方素材声明为准。
|