setup
Initialize crossword puzzle state by loading grid layout and clue definitions to prepare for solving. Accepts grid text with cell positions and JSON-formatted clues for across and down directions.
Instructions
クロスワードの盤面とカギ定義を読み込み、状態を初期化する。
Args:
grid_text (str): 行番号つきの盤面テキスト。列・行番号は全角数字で表記し、
文字が入るマスは "?"、黒マスは "#" で記述する。各行のマス数が一致している
必要がある。
clue_text (str): JSON Lines 形式のカギ定義。各行は id/direction/row/col
/length/clue を持つ辞書で、direction は "across" か "down"。row と
col は 1 起点の正整数。
Returns: list[list[str]]: 正規化済みセル行列。各要素は "?" または "#" のシンボル。
Raises: ValueError: 盤面の行長不一致・未知のセル記号・カギ定義の欠損や不正値など、 入力内容が検証に失敗した場合。
Notes: この関数を呼び出すと既存の候補リストは破棄され、状態が再初期化される。
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| clue_text | Yes | ||
| grid_text | Yes |
Implementation Reference
- src/server.py:172-202 (handler)Core implementation of the 'setup' MCP tool. Decorated with @mcp.tool() for registration. Parses and validates grid_text and clue_text, populates the global PuzzleState, clears candidates, and returns the grid.@mcp.tool() async def setup(grid_text: str, clue_text: str) -> list[list[str]]: """クロスワードの盤面とカギ定義を読み込み、状態を初期化する。 Args: grid_text (str): 行番号つきの盤面テキスト。列・行番号は全角数字で表記し、 文字が入るマスは "?"、黒マスは "#" で記述する。各行のマス数が一致している 必要がある。 clue_text (str): JSON Lines 形式のカギ定義。各行は `id`/`direction`/`row`/`col` /`length`/`clue` を持つ辞書で、`direction` は "across" か "down"。`row` と `col` は 1 起点の正整数。 Returns: list[list[str]]: 正規化済みセル行列。各要素は "?" または "#" のシンボル。 Raises: ValueError: 盤面の行長不一致・未知のセル記号・カギ定義の欠損や不正値など、 入力内容が検証に失敗した場合。 Notes: この関数を呼び出すと既存の候補リストは破棄され、状態が再初期化される。 """ grid = _load_grid(grid_text) clues = _load_clues(clue_text, grid) state.grid = grid state.clues = clues state.candidates.clear() return grid
- src/server.py:44-73 (helper)Helper function to parse and validate the grid_text input into a list of lists representing the puzzle grid.def _load_grid(grid_text: str) -> list[list[str]]: "グリッド文字列を読み込み、全角表記の入力からセル行列を構築する" grid: list[list[str]] = [] for raw_line in grid_text.splitlines(): if FILLABLE_CELL not in raw_line and BLOCK_CELL not in raw_line: continue normalized_line = raw_line.translate(_FULLWIDTH_DIGIT_TO_ASCII) parts = normalized_line.strip().split() if not parts: continue if parts[0].isdigit(): tokens = parts[1:] else: tokens = parts if not tokens: continue for token in tokens: if token not in {FILLABLE_CELL, BLOCK_CELL}: raise ValueError(f"未知のマス表現を検出しました: {token}") if grid and len(tokens) != len(grid[0]): raise ValueError("行ごとのマス数が一致しません。入力を確認してください。") grid.append(tokens) return grid
- src/server.py:140-162 (helper)Helper function to parse JSON Lines clue_text into a dictionary of validated Clue objects.def _load_clues(clue_text: str, grid: list[list[str]]) -> dict[str, Clue]: "JSON Lines 形式のカギ定義を読み込み、検証した Clue オブジェクトへ変換する" lines = [line.strip() for line in clue_text.splitlines() if line.strip()] if not lines: raise ValueError("カギ情報が存在しません。") seen_ids: set[str] = set() clues: dict[str, Clue] = {} for line_no, raw in enumerate(lines, start=1): try: payload = json.loads(raw) except json.JSONDecodeError as exc: raise ValueError(f"{line_no} 行目のカギ情報を JSON として読み込めません。") from exc if not isinstance(payload, dict): raise ValueError(f"{line_no} 行目のカギ情報が辞書形式ではありません。") clue = _validate_clue_payload(payload, grid, seen_ids) clues[clue.clue_id] = clue return clues
- src/server.py:165-170 (helper)Helper function to ensure the puzzle state has been initialized by 'setup', used by other tools.def _ensure_setup() -> None: "セットアップ済みかを検査し、未設定なら利用者に通知する" if not state.clues or not state.grid: raise RuntimeError("setup を先に呼び出してください。")
- src/server.py:176-193 (schema)Input/output schema defined in the docstring of the setup handler.Args: grid_text (str): 行番号つきの盤面テキスト。列・行番号は全角数字で表記し、 文字が入るマスは "?"、黒マスは "#" で記述する。各行のマス数が一致している 必要がある。 clue_text (str): JSON Lines 形式のカギ定義。各行は `id`/`direction`/`row`/`col` /`length`/`clue` を持つ辞書で、`direction` は "across" か "down"。`row` と `col` は 1 起点の正整数。 Returns: list[list[str]]: 正規化済みセル行列。各要素は "?" または "#" のシンボル。 Raises: ValueError: 盤面の行長不一致・未知のセル記号・カギ定義の欠損や不正値など、 入力内容が検証に失敗した場合。 Notes: この関数を呼び出すと既存の候補リストは破棄され、状態が再初期化される。 """