diff options
| -rw-r--r-- | CHANGELOG.md | 32 | ||||
| -rw-r--r-- | README.md | 14 | ||||
| -rw-r--r-- | pyproject.toml | 21 | ||||
| -rw-r--r-- | src/mml_composemusic_mcp/__init__.py | 3 | ||||
| -rw-r--r-- | src/mml_composemusic_mcp/server.py | 3 | ||||
| -rw-r--r-- | tests/test_version.py | 16 |
6 files changed, 82 insertions, 7 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..0e9a35b --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,32 @@ +# Changelog + +このプロジェクトの主な変更をリリースごとに記録します。 + +## [0.3.0] - 2026-09-13 + +### Changed + +- `compose_mml`の合成成功時に、WAVのサーバーローカルパスではなくMCP標準の`AudioContent`を返すように変更しました。 +- WAVはファイルサイズにかかわらず`audio/wav`のbase64データとして返します。 +- MCPツール呼び出しの正式な成否判定を`CallToolResult.isError`へ統一しました。 +- composeの`success`とvalidateの`valid`は、各処理の構造化結果として維持します。 +- FastMCPの対応バージョンを`>=3.4.4,<4`へ更新しました。 +- MCPの`serverInfo.version`がパッケージバージョンを返すようにしました。 + +### Security + +- MCPレスポンスから`wav_path`を完全に削除し、サーバー内部のファイルパスを公開しないようにしました。 +- 合成、ファイル出力、音声変換、内部例外のエラー応答から内部パスと例外詳細を除去しました。 + +### Testing + +- `AudioContent`のMIMEタイプとbase64往復を検証するMCP境界テストを追加しました。 +- compose、validate、API入力エラーの`isError`セマンティクスを検証するテストを追加しました。 +- `ResourceLink`を返さないことと、公開結果に`wav_path`が含まれないことを検証するテストを追加しました。 + +### Breaking Changes + +- `compose_mml(action="compose")`の結果から`wav_path`を削除しました。クライアントは`content`内の`AudioContent`からWAVデータを取得してください。 +- composeおよびAPI入力の失敗は、MCPレベルで`isError: true`として返されます。validateが不正なMMLを検出した場合は、検証処理自体は成功しているため`isError: false`、`valid: false`となります。 + +[0.3.0]: https://github.com/takashi000/mml-composemusic-mcp/compare/v0.2.2...v0.3.0 @@ -22,12 +22,12 @@ Pulse 2ch、Triangle 1ch、Noise 1chの構成を持つ簡易2A03 APU風シンセ 実際にLLMを使用してこのMCPツールで作曲させてみたサンプルデータです。 ppmck版 -- [音声](samples/ppmck/output.wav) -- [mml](samples/ppmck/output.mml) +- [音声](https://github.com/takashi000/mml-composemusic-mcp/blob/main/samples/ppmck/output.wav) +- [mml](https://github.com/takashi000/mml-composemusic-mcp/blob/main/samples/ppmck/output.mml) pyxel版 -- [音声](samples/pyxel/output.wav) -- [mml](samples/pyxel/output.mml) +- [音声](https://github.com/takashi000/mml-composemusic-mcp/blob/main/samples/pyxel/output.wav) +- [mml](https://github.com/takashi000/mml-composemusic-mcp/blob/main/samples/pyxel/output.mml) ## 必要環境 @@ -235,7 +235,7 @@ N l8 v10 - `[...]N`: 回数付きリピート - `&`: スラー -値域や正確な文法は[MML構文規則](doc/MML_BNF.md)、MCPの入出力は[MCPツール仕様](doc/mcp.md)、内部構造は[設計書](doc/Design.md)を参照してください。 +値域や正確な文法は[MML構文規則](https://github.com/takashi000/mml-composemusic-mcp/blob/main/doc/MML_BNF.md)、MCPの入出力は[MCPツール仕様](https://github.com/takashi000/mml-composemusic-mcp/blob/main/doc/mcp.md)、内部構造は[設計書](https://github.com/takashi000/mml-composemusic-mcp/blob/main/doc/Design.md)を参照してください。 ## 現在の制約 @@ -263,6 +263,10 @@ uv run mml-composemusic-mcp --output-dir ./data 受理するMML文法を変更する場合は、実装・テストと合わせて`doc/MML_BNF.md`を更新してください。 +## 変更履歴 + +[CHANGELOG.md](https://github.com/takashi000/mml-composemusic-mcp/blob/main/CHANGELOG.md)を参照してください。 + ## ライセンス MIT diff --git a/pyproject.toml b/pyproject.toml index 328f6bc..ac64cc0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,14 +1,20 @@ [project] name = "mml-composemusic-mcp" -version = "0.2.2" +version = "0.3.0" description = "MCP server for LLM-driven retro chiptune-style MML composition" readme = "README.md" +license = "MIT" requires-python = ">=3.14" dependencies = [ "fastmcp>=3.4.4,<4", "numpy>=2.0.0", ] +[project.urls] +Homepage = "https://github.com/takashi000/mml-composemusic-mcp" +Repository = "https://github.com/takashi000/mml-composemusic-mcp" +Changelog = "https://github.com/takashi000/mml-composemusic-mcp/blob/main/CHANGELOG.md" + [dependency-groups] dev = [ "hypothesis>=6.0", @@ -23,6 +29,19 @@ build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["src/mml_composemusic_mcp"] +[tool.hatch.build.targets.sdist] +include = [ + "/CHANGELOG.md", + "/LICENSE", + "/README.md", + "/doc/Design.md", + "/doc/MML_BNF.md", + "/doc/mcp.md", + "/pyproject.toml", + "/src", + "/tests", +] + [tool.ruff] target-version = "py314" line-length = 88 diff --git a/src/mml_composemusic_mcp/__init__.py b/src/mml_composemusic_mcp/__init__.py index e69de29..ecf5eb2 100644 --- a/src/mml_composemusic_mcp/__init__.py +++ b/src/mml_composemusic_mcp/__init__.py @@ -0,0 +1,3 @@ +"""MML Compose Music MCP server package.""" + +__version__ = "0.3.0" diff --git a/src/mml_composemusic_mcp/server.py b/src/mml_composemusic_mcp/server.py index f0c8bd1..e647539 100644 --- a/src/mml_composemusic_mcp/server.py +++ b/src/mml_composemusic_mcp/server.py @@ -11,6 +11,7 @@ from fastmcp.tools import ToolResult from fastmcp.utilities.types import Audio from mcp.types import TextContent +from . import __version__ from .ir import ErrorCode, ErrorDetail, ErrorPhase, NoteSequence from .lexer import tokenize from .parser_ppmck import parse_ppmck @@ -20,7 +21,7 @@ from .semantic_pyxel import analyze_pyxel from .synthesizer import build_channel_summary, synthesize, write_wav from .templates import TEMPLATES, get_template -mcp = FastMCP("mml-composemusic-mcp") +mcp = FastMCP("mml-composemusic-mcp", version=__version__) OUTPUT_DIR = Path("./data") diff --git a/tests/test_version.py b/tests/test_version.py new file mode 100644 index 0000000..dbb4b9c --- /dev/null +++ b/tests/test_version.py @@ -0,0 +1,16 @@ +"""Release version consistency tests.""" + +import tomllib +from pathlib import Path + +from mml_composemusic_mcp import __version__ +from mml_composemusic_mcp.server import mcp + + +def test_release_versions_match(): + pyproject_path = Path(__file__).parents[1] / "pyproject.toml" + with pyproject_path.open("rb") as pyproject_file: + project_version = tomllib.load(pyproject_file)["project"]["version"] + + assert __version__ == project_version == "0.3.0" + assert mcp.version == __version__ |
