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 --- src/mml_composemusic_mcp/ir.py | 1 + src/mml_composemusic_mcp/parser_ppmck.py | 14 ++++++++++++++ src/mml_composemusic_mcp/parser_pyxel.py | 14 ++++++++++++++ src/mml_composemusic_mcp/server.py | 9 ++++++++- 4 files changed, 37 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/mml_composemusic_mcp/ir.py b/src/mml_composemusic_mcp/ir.py index 42adc13..bd741a6 100644 --- a/src/mml_composemusic_mcp/ir.py +++ b/src/mml_composemusic_mcp/ir.py @@ -20,6 +20,7 @@ class ErrorCode(Enum): SYNTAX_EMPTY_TRACK = "SYNTAX_EMPTY_TRACK" SYNTAX_NOTE_OUT_OF_RANGE = "SYNTAX_NOTE_OUT_OF_RANGE" SYNTAX_CHANNEL_MISMATCH = "SYNTAX_CHANNEL_MISMATCH" + SYNTAX_OUTSIDE_TRACK = "SYNTAX_OUTSIDE_TRACK" SYNTAX_UNTERMINATED_HEADER = "SYNTAX_UNTERMINATED_HEADER" SYNTAX_UNDEFINED_REFERENCE = "SYNTAX_UNDEFINED_REFERENCE" diff --git a/src/mml_composemusic_mcp/parser_ppmck.py b/src/mml_composemusic_mcp/parser_ppmck.py index db91950..67e5093 100644 --- a/src/mml_composemusic_mcp/parser_ppmck.py +++ b/src/mml_composemusic_mcp/parser_ppmck.py @@ -62,6 +62,7 @@ class PpmckParser: self._parse_track_header() continue if self.current_channel is None: + self._warn_outside_track(token) self.ctx.advance() continue self._parse_statement() @@ -109,6 +110,19 @@ class PpmckParser: ) self.headers.append((key, value)) + def _warn_outside_track(self, token: Token) -> None: + if token.type in (TokenType.EOF, TokenType.COMMENT): + return + self.ctx.add_error( + code=ErrorCode.SYNTAX_OUTSIDE_TRACK, + line=token.line, + column=token.column, + message=f"'{token.raw}' はトラック外に書かれています。", + severity="warning", + hint="コマンドはトラックヘッダー(A, B, T, N)の後に記述してください。", + context=self._context_line(token), + ) + def _parse_track_header(self) -> None: token = self.ctx.advance() ch = token.value.upper() diff --git a/src/mml_composemusic_mcp/parser_pyxel.py b/src/mml_composemusic_mcp/parser_pyxel.py index 336a55e..f75c169 100644 --- a/src/mml_composemusic_mcp/parser_pyxel.py +++ b/src/mml_composemusic_mcp/parser_pyxel.py @@ -76,6 +76,7 @@ class PyxelParser: self._parse_track_header() continue if self.current_channel is None: + self._warn_outside_track(token) self.ctx.advance() continue self._parse_statement() @@ -102,6 +103,19 @@ class PyxelParser: return self.note_sequence, self.ctx.errors + def _warn_outside_track(self, token: Token) -> None: + if token.type == TokenType.EOF: + return + self.ctx.add_error( + code=ErrorCode.SYNTAX_OUTSIDE_TRACK, + line=token.line, + column=token.column, + message=f"'{token.raw}' はトラック外に書かれています。", + severity="warning", + hint="コマンドはトラックヘッダー(0:, 1:, 2:, 3:)の後に記述してください。", + context=self._context_line(token), + ) + def _parse_track_header(self) -> None: token = self.ctx.advance() ch = token.value diff --git a/src/mml_composemusic_mcp/server.py b/src/mml_composemusic_mcp/server.py index 3061e6d..f21159a 100644 --- a/src/mml_composemusic_mcp/server.py +++ b/src/mml_composemusic_mcp/server.py @@ -274,7 +274,14 @@ def main() -> None: args = parser.parse_args() global OUTPUT_DIR OUTPUT_DIR = Path(args.output_dir) - mcp.run(transport=args.transport, host=args.host, port=args.port) + if args.transport == "stdio": + mcp.run(transport="stdio") + else: + mcp.run( + transport=args.transport, + host=args.host, + port=args.port, + ) if __name__ == "__main__": -- cgit v1.2.3