From 4ed98f4ec8d354f8fdb009f0b7829c2628adb2a6 Mon Sep 17 00:00:00 2001 From: tanaka takashi Date: Sat, 11 Jul 2026 21:48:34 +0900 Subject: fix: stdio transport 起動時の TypeError 修正とトラック外コマンド警告の追加 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 364 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 335 insertions(+), 29 deletions(-) (limited to 'README.md') diff --git a/README.md b/README.md index 351c9c9..231c56e 100644 --- a/README.md +++ b/README.md @@ -1,53 +1,359 @@ # mml-composemusic-mcp -ファミコン音源(2A03 APU)風のMMLをLLMに作曲させるためのMCPサーバ。 +ファミコン音源(2A03 APU)風のMMLをLLMに作曲させるためのMCPサーバです。 -## 機能 +`compose_mml` という1つのツールで、MMLの**作曲(WAV生成)**、**構文検証**、**テンプレート生成**を行えます。 -- `compose_mml` ツールを提供 -- ppmck 形式と pyxel 形式のMMLを解析・合成 -- MIDIノート番号に変換後、NES APU風の矩形波/三角波/ノイズでWAV出力 -- バリデーション、テンプレート生成に対応 +--- -## ツール引数 +## 目次 -| 引数 | 説明 | -|------|------| -| `action` | `compose`, `validate`, `template` のいずれか | -| `mml` | MML文字列(compose/validate時必須) | -| `mode` | `ppmck` または `pyxel`(compose/validate時必須) | -| `template` | `basic`, `melody`, `chord`, `drum`, `empty`(action=template時) | -| `sample_rate` | WAV出力サンプリングレート(デフォルト44100) | -| `normalize` | 出力振幅の正規化(デフォルトtrue) | +1. [機能概要](#機能概要) +2. [動作環境](#動作環境) +3. [インストール](#インストール) +4. [MCPクライアントへの登録](#mcpクライアントへの登録) +5. [ツールの使い方](#ツールの使い方) +6. [MML形式](#mml形式) +7. [テスト・開発](#テスト開発) +8. [ディレクトリ構成](#ディレクトリ構成) +9. [ライセンス](#ライセンス) -## 実行 +--- + +## 機能概要 + +| 機能 | 説明 | +|---|---| +| `compose` | MMLを解析し、NES APU風の矩形波/三角波/ノイズでWAVファイルを生成する | +| `validate` | MMLの構文を検証し、エラー・警告・チャンネル概要を返す | +| `template` | `ppmck` / `pyxel` 用のテンプレートMMLを生成する | + +### 対応MML形式 + +| モード | 特徴 | +|---|---| +| `ppmck` | PPMCKインスパイアのFC準拠形式。小文字コマンド、`A`/`B`/`T`/`N` トラック | +| `pyxel` | Pyxel MML準拠形式。大文字コマンド、`0:`〜`3:` トラック、リピート・ゲートタイム対応 | + +--- + +## 動作環境 + +- Python 3.14 以上 +- [uv](https://docs.astral.sh/uv/)(推奨) +- 依存パッケージ: `fastmcp`, `numpy` + +--- + +## インストール + +### 1. リポジトリをクローンまたは配置 ```bash -uv run mml-composemusic-mcp --output-dir ./data +cd C:\\path\\to\\mml-composemusic-mcp ``` -または +### 2. 依存関係をインストール + +`uv` を使う場合: ```bash -uv run python -m mml_composemusic_mcp.server --output-dir ./data +uv sync ``` -## テスト +`pip` を使う場合: + +```bash +pip install -e . +``` + +### 3. 起動確認 + +```bash +uv run mml-composemusic-mcp --help +``` + +以下のように表示されればOKです。 + +``` +usage: mml-composemusic-mcp [-h] [--output-dir OUTPUT_DIR] + [--transport {stdio,http,sse,streamable-http}] [--host HOST] [--port PORT] +``` + +--- + +## MCPクライアントへの登録 + +### Claude Desktop の場合 + +1. 設定ファイルを開きます。 + + | OS | パス | + |---|---| + | Windows | `%APPDATA%\Claude\claude_desktop_config.json` | + | macOS | `~/Library/Application Support/Claude/claude_desktop_config.json` | + +2. `mcpServers` に以下を追加します。 + + ```json + { + "mcpServers": { + "mml-composemusic": { + "command": "uv", + "args": [ + "run", + "--project", + "C:\\path\\to\\mml-composemusic-mcp", + "mml-composemusic-mcp", + "--output-dir", + "C:\\path\\to\\mml-composemusic-mcp\\data" + ] + } + } + } + ``` + +3. Claude Desktop を再起動します。 + +### 設定ファイル例 + +[`doc/mcp-client-config-example.json`](doc/mcp-client-config-example.json) に設定例があります。必要に応じてコピーしてください。 + +### トランスポートの選択 + +| トランスポート | 用途 | 設定方法 | +|---|---|---| +| `stdio` | 標準的なMCPクライアント接続(デフォルト) | `command`/`args` で指定 | +| `http` | HTTPエンドポイント | `--transport http` で起動後、`url` で接続 | +| `sse` | Server-Sent Events | `--transport sse` で起動後、`url` で接続 | +| `streamable-http` | Streamable HTTP | `--transport streamable-http` で起動 | + +#### SSEで使う場合の例 + +```bash +uv run mml-composemusic-mcp --transport sse --port 8080 --output-dir ./data +``` + +```json +{ + "mcpServers": { + "mml-composemusic": { + "url": "http://127.0.0.1:8080/sse" + } + } +} +``` + +### 注意点 + +- `--output-dir` は相対パスでも動きますが、MCPクライアントの作業ディレクトリが不定なため、**絶対パスを推奨**します。 +- 初回起動時は `uv` が依存関係を解決するため、少し時間がかかることがあります。 + +--- + +## ツールの使い方 + +### ツール名 + +`compose_mml` + +### 引数 + +| 引数名 | 型 | 必須 | デフォルト | 説明 | +|---|---|---|---|---| +| `action` | string | yes | — | `compose`, `validate`, `template` のいずれか | +| `mml` | string | compose/validate時 | `""` | MMLソース文字列 | +| `mode` | string | compose/validate時 | `""` | `ppmck` または `pyxel` | +| `template` | string | template時 | `"basic"` | `basic`, `melody`, `chord`, `drum`, `empty` | +| `sample_rate` | integer | no | `44100` | 出力WAVのサンプリングレート(Hz) | +| `normalize` | boolean | no | `true` | 出力振幅を正規化するか | + +### action=`compose` — WAVを生成 + +```json +{ + "action": "compose", + "mml": "0: T120 L8 O4 V100 @1\n C D E F | G A B >C", + "mode": "pyxel", + "sample_rate": 44100, + "normalize": true +} +``` + +#### 戻り値 + +```json +{ + "success": true, + "wav_path": "./data/output.wav", + "duration_sec": 2.0, + "note_sequence": { ... }, + "validation": { + "errors": [], + "warnings": [] + } +} +``` + +- `success` が `false` の場合、`wav_path` は `null` になります。 +- エラーがある場合は `validation.errors` に詳細なエラー情報が入ります。 + +### action=`validate` — 構文チェック + +```json +{ + "action": "validate", + "mml": "A t120 l8 o4 v15 q2\n c d e f", + "mode": "ppmck" +} +``` + +#### 戻り値 + +```json +{ + "valid": true, + "errors": [], + "warnings": [], + "note_sequence": { ... }, + "channel_summary": [ + { + "channel": "Pulse1", + "note_count": 4, + "octave_range": [4, 5], + "duration_ticks": 768 + } + ] +} +``` + +### action=`template` — テンプレート生成 + +```json +{ + "action": "template", + "mode": "pyxel", + "template": "basic" +} +``` + +#### 戻り値 + +```json +{ + "mml": "0: T120 L8 O4 V100 @1\n C D E F | ...", + "description": "基本的な4ch構成(メロディ+和音+ベース+リズム)" +} +``` + +### テンプレート種別 + +| テンプレート | 内容 | +|---|---| +| `basic` | 基本的な4ch構成(メロディ+和音+ベース+リズム) | +| `melody` | メロディ重視(Pulse1主旋律、他は伴奏最小限) | +| `chord` | コード伴奏重視(Pulse2で和音、Triangleでベース) | +| `drum` | リズム重視(Noise中心のビートパターン) | +| `empty` | 各チャンネルのヘッダーのみ(空のテンプレート) | + +--- + +## MML形式 + +### ppmck 形式の例 + +``` +#TITLE "My Song" +#COMPOSER "LLM" + +A t150 l8 o4 v15 q2 + c d e f | g a b > c + +B l8 o3 v12 q1 + c r g r c r g r + +T l4 o3 v7 + c2 c2 g2 g2 + +N l8 v10 + r c r c r c r c +``` + +### pyxel 形式の例 + +``` +0: T150 L8 O4 V100 @1 + C D E F G A B >C + +1: L8 O3 V80 @2 + E G B R E G B R + +2: L4 O3 V60 + C2 G2 E2 C2 + +3: L8 V80 + C R C R C R C R +``` + +### 詳細仕様 + +詳細なMMLコマンド仕様、IR構造、エラーコードは [`doc/Design.md`](doc/Design.md) を参照してください。 + +--- + +## テスト・開発 + +### テスト実行 ```bash uv run pytest +``` + +### リント・フォーマット + +```bash uv run ruff check . uv run ruff format . ``` +### 手動でサーバを起動 + +```bash +uv run mml-composemusic-mcp --output-dir ./data +``` + +または: + +```bash +uv run python -m mml_composemusic_mcp.server --output-dir ./data +``` + +--- + ## ディレクトリ構成 -- `src/mml_composemusic_mcp/` - - `server.py` - MCPサーバ - - `lexer.py` - MML字句解析 - - `parser_ppmck.py`, `parser_pyxel.py` - 構文解析 - - `ir.py` - 中間表現・エラー型 - - `synthesizer.py` - APU風合成・WAV出力 - - `templates.py` - テンプレート -- `tests/` - テスト -- `doc/` - 設計書 +``` +. +├── doc/ # 設計書・設定例 +│ ├── Design.md # 統合設計書 +│ ├── mcp.md # MCPツールスキーマ +│ └── mcp-client-config-example.json # MCPクライアント設定例 +├── src/mml_composemusic_mcp/ # ソースコード +│ ├── server.py # MCPサーバ +│ ├── lexer.py # MML字句解析 +│ ├── parser_ppmck.py # ppmckパーサ +│ ├── parser_pyxel.py # pyxelパーサ +│ ├── parser_base.py # パーサ共通処理 +│ ├── ir.py # 中間表現・エラー型 +│ ├── synthesizer.py # APU風合成・WAV出力 +│ └── templates.py # テンプレート +├── tests/ # テスト +├── README.md # このファイル +└── pyproject.toml # プロジェクト設定 +``` + +--- + +## ライセンス + +(プロジェクトのライセンスをここに記載してください) -- cgit v1.2.3