get_section
Retrieve a specific section from a PineScript documentation file by its header. Use after listing available sections or identifying the relevant file through search.
Instructions
Get a specific section from a documentation file by its header.
Use after list_sections() shows available headers, or after resolve_topic() / search_docs() identifies the relevant file.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Documentation file path (e.g., "reference/functions/strategy.md") | |
| header | Yes | Header text to find (e.g., "strategy.exit()" or "## strategy.exit()") | |
| include_children | No | Include nested subsections under the header (default: True) |
Implementation Reference
- src/pinescript_mcp/server.py:508-511 (registration)Registration of the get_section MCP tool via @mcp.tool decorator with tags and annotations.
@mcp.tool( tags={"reference"}, annotations={"readOnlyHint": True, "idempotentHint": True, "openWorldHint": False} ) - src/pinescript_mcp/server.py:512-533 (handler)The get_section async handler function that validates the path, reads the doc content, and calls _find_section to extract the section matching the header.
async def get_section(path: str, header: str, include_children: bool = True): """Get a specific section from a documentation file by its header. Use after list_sections() shows available headers, or after resolve_topic() / search_docs() identifies the relevant file. Args: path: Documentation file path (e.g., "reference/functions/strategy.md") header: Header text to find (e.g., "strategy.exit()" or "## strategy.exit()") include_children: Include nested subsections under the header (default: True) Returns the section content from the header to the next same-level header. """ with _timed_tool("get_section", path=path, header=header) as log: try: _validate_path(path) # check path is allowed content = _get_doc_content(path) section, start_line, end_line = _find_section(content, header, include_children) return f"# {path} (lines {start_line}-{end_line})\n\n{section}" except ValueError as e: log["error"] = str(e) raise ToolError(str(e)) - src/pinescript_mcp/server.py:316-356 (helper)_find_section helper: parses markdown headers to locate a section by header text, supporting include_children to stop at same-level or any header.
def _find_section(content: str, header: str, include_children: bool = True) -> tuple[str, int, int]: """Find a section in markdown content by header text. Returns (section_content, start_line, end_line) or raises ValueError. """ lines = content.splitlines() # Normalize header query (strip leading #'s if present, collapse whitespace) header_text = re.sub(r'\s+', ' ', re.sub(r'^#+\s*', '', header).strip().lower()) start_idx = None start_level = None for i, line in enumerate(lines): if line.startswith('#'): # Parse header level and text match = re.match(r'^(#+)\s*(.+)', line) if match: level = len(match.group(1)) text = re.sub(r'\s+', ' ', match.group(2).strip().lower()) if start_idx is None: # Looking for start if header_text in text or text in header_text: start_idx = i start_level = level else: # Looking for end if include_children: # Stop at same level or higher (smaller number) if level <= start_level: return '\n'.join(lines[start_idx:i]), start_idx + 1, i else: # Stop at any header return '\n'.join(lines[start_idx:i]), start_idx + 1, i if start_idx is not None: # Section goes to end of file return '\n'.join(lines[start_idx:]), start_idx + 1, len(lines) raise ValueError(f"Header not found: {header}")