| 56 | ) |
| 57 | |
| 58 | async def get_tools(self) -> Dict[str, Any]: |
| 59 | tools: Dict[str, List[Tool]] = { |
| 60 | 'spec_loader': [ |
| 61 | Tool( |
| 62 | tool_name='load_writing_specs', |
| 63 | server_name='spec_loader', |
| 64 | description= |
| 65 | ('Load one or more writing-style specs (rules + examples) and return ' |
| 66 | 'their curated Markdown content. Use this when you are unsure about ' |
| 67 | 'how to structure or phrase a financial report in an analyst-like style.\n\n' |
| 68 | 'Supported spec identifiers (case-insensitive, synonyms allowed):\n' |
| 69 | '- structure → section depth / headings\n' |
| 70 | '- methods → how much to expose MECE/SWOT/etc.\n' |
| 71 | '- bullets → bullets vs paragraphs\n' |
| 72 | '- focus → task focus and relevance\n' |
| 73 | '- tone → analyst-style voice\n' |
| 74 | '- density → length and information density control\n\n' |
| 75 | 'Provide a list of requested writing specs via the "writing_specs" parameter.\n\n' |
| 76 | f'{WRITING_SPEC_GUIDE}\n' |
| 77 | f'{WRITING_ROUTING_GUIDE}\n'), |
| 78 | parameters={ |
| 79 | 'type': 'object', |
| 80 | 'properties': { |
| 81 | 'writing_specs': { |
| 82 | 'type': |
| 83 | 'array', |
| 84 | 'items': { |
| 85 | 'type': 'string' |
| 86 | }, |
| 87 | 'description': |
| 88 | ('List of writing specs to load. Case-insensitive; supports synonyms.\n' |
| 89 | 'Allowed identifiers include (non-exhaustive):\n' |
| 90 | '- structure\n- methods\n- bullets\n- focus\n- tone\n- density\n' |
| 91 | ), |
| 92 | }, |
| 93 | 'format': { |
| 94 | 'type': |
| 95 | 'string', |
| 96 | 'enum': ['markdown', 'json'], |
| 97 | 'description': |
| 98 | ('Output format: "markdown" (combined Markdown string) or "json" ' |
| 99 | '(JSON object mapping spec to content). Default: "markdown".' |
| 100 | ), |
| 101 | }, |
| 102 | 'include_titles': { |
| 103 | 'type': |
| 104 | 'boolean', |
| 105 | 'description': |
| 106 | ('When format="markdown", if true, each section is prefixed with a ' |
| 107 | 'Markdown heading of the canonical spec title. Default: false.' |
| 108 | ), |
| 109 | }, |
| 110 | 'join_with': { |
| 111 | 'type': |
| 112 | 'string', |
| 113 | 'description': |
| 114 | ('When format="markdown", the delimiter used to join multiple ' |
| 115 | 'sections. Default: "\n\n---\n\n".'), |