summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md32
-rw-r--r--README.md14
-rw-r--r--pyproject.toml21
-rw-r--r--src/mml_composemusic_mcp/__init__.py3
-rw-r--r--src/mml_composemusic_mcp/server.py3
-rw-r--r--tests/test_version.py16
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
diff --git a/README.md b/README.md
index bd55daa..3a23e78 100644
--- a/README.md
+++ b/README.md
@@ -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__