summaryrefslogtreecommitdiff
path: root/src/mml_composemusic_mcp
diff options
context:
space:
mode:
authortanaka takashi <isazaka@gmail.com>2026-07-11 21:48:34 +0900
committertanaka takashi <isazaka@gmail.com>2026-07-11 21:48:34 +0900
commit4ed98f4ec8d354f8fdb009f0b7829c2628adb2a6 (patch)
tree07fd47ae951fa3ad776834e4876764adb09d5068 /src/mml_composemusic_mcp
parent79cd969c98893e04382fe6075f420589c3a1652e (diff)
fix: stdio transport 起動時の TypeError 修正とトラック外コマンド警告の追加
Diffstat (limited to 'src/mml_composemusic_mcp')
-rw-r--r--src/mml_composemusic_mcp/ir.py1
-rw-r--r--src/mml_composemusic_mcp/parser_ppmck.py14
-rw-r--r--src/mml_composemusic_mcp/parser_pyxel.py14
-rw-r--r--src/mml_composemusic_mcp/server.py9
4 files changed, 37 insertions, 1 deletions
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__":