| 1 | using ModelContextProtocol.Protocol; |
| 2 | using RoslynMcp.Mcp; |
| 3 | using Tool = ModelContextProtocol.Protocol.Tool; |
| 4 | |
| 5 | /// <summary>Каталог MCP-тулов. Согласован с <c>mcp-tools.manifest.json</c> и <c>docs/MCP-TOOLS.md</c> (генерация: <c>tools/ExportMcpManifest</c>, тесты <c>RoslynMcp.Tests</c>).</summary> |
| 6 | internal static class ToolCatalog |
| 7 | { |
| 8 | internal static List<Tool> Build() => |
| 9 | [ |
| 10 | new() { Name = "roslyn_ping", Description = "Проверка доступности сервера.", InputSchema = ToolSchemas.Ping() }, |
| 11 | new() |
| 12 | { |
| 13 | Name = "roslyn_get_document_symbols", |
| 14 | Description = "Структура C# файла: namespace, class, method, property, field с номерами строк.", |
| 15 | InputSchema = ToolSchemas.GetDocumentSymbols() |
| 16 | }, |
| 17 | new() |
| 18 | { |
| 19 | Name = "roslyn_get_symbol_at_position", |
| 20 | Description = "Символ в позиции (файл, строка, столбец — 1-based): kind и имя.", |
| 21 | InputSchema = ToolSchemas.GetSymbolAtPosition() |
| 22 | }, |
| 23 | new() |
| 24 | { |
| 25 | Name = "roslyn_find_usages", |
| 26 | Description = |
| 27 | "Все ссылки на символ в solution/project. line/column — на идентификаторе (имя метода, класса и т.д.), не на типе в сигнатуре.", |
| 28 | InputSchema = ToolSchemas.FindUsages() |
| 29 | }, |
| 30 | new() |
| 31 | { |
| 32 | Name = "roslyn_go_to_definition", |
| 33 | Description = |
| 34 | "Переход к определению символа: по позиции возвращает file:line:column объявления (1-based). Параметры: solution_or_project_path, file_path, line, column.", |
| 35 | InputSchema = ToolSchemas.GoToDefinition() |
| 36 | }, |
| 37 | new() |
| 38 | { |
| 39 | Name = "roslyn_rename", |
| 40 | Description = |
| 41 | "Переименовать символ по solution. apply: false — превью; true — записать. Чтобы затронуть комментарии/строки/перегрузки/файл — передай rename_in_comments, rename_in_strings, rename_overloads, rename_file (bool).", |
| 42 | InputSchema = ToolSchemas.Rename() |
| 43 | }, |
| 44 | new() |
| 45 | { |
| 46 | Name = "roslyn_get_code_actions", |
| 47 | Description = |
| 48 | "Список Quick Actions / рефакторингов в позиции (как лампочка в VS). Параметры: solution_or_project_path, file_path, line, column. Возвращает нумерованный список; применить — roslyn_apply_code_action с action_index.", |
| 49 | InputSchema = ToolSchemas.GetCodeActions() |
| 50 | }, |
| 51 | new() |
| 52 | { |
| 53 | Name = "roslyn_apply_code_action", |
| 54 | Description = |
| 55 | "Применить выбранное code action по индексу из roslyn_get_code_actions. Параметры: solution_or_project_path, file_path, line, column, action_index (0-based).", |
| 56 | InputSchema = ToolSchemas.ApplyCodeAction() |
| 57 | }, |
| 58 | new() |
| 59 | { |
| 60 | Name = "roslyn_get_diagnostics", |
| 61 | Description = |
| 62 | "Диагностики компиляции и анализаторов по solution/project (file:line:column, severity, id, message). Предпочтительно использовать вместо ReadLints/ручного просмотра для поиска неиспользуемых переменных (CS0219), предупреждений компилятора и анализаторов. Чтобы исправить: roslyn_get_code_actions по file:line:column из ответа, затем roslyn_apply_code_action (или fix_all_scope). Параметры: solution_or_project_path, опционально file_path.", |
| 63 | InputSchema = ToolSchemas.GetDiagnostics() |
| 64 | }, |
| 65 | new() |
| 66 | { |
| 67 | Name = "roslyn_get_solution_structure", |
| 68 | Description = |
| 69 | "Структура solution: список проектов (имя, путь к .csproj). Параметр: solution_or_project_path (.sln или .csproj). Обходной путь для реп с .slnx: передай путь к главному .csproj — вернётся полный список подгруженных проектов. Использовать, чтобы узнать состав решения и пути для остальных тулов.", |
| 70 | InputSchema = ToolSchemas.GetSolutionStructure() |
| 71 | }, |
| 72 | new() |
| 73 | { |
| 74 | Name = "roslyn_get_workspace_navigation_context", |
| 75 | Description = |
| 76 | "Семантическая навигация по solution (связанные файлы): режимы related и subgraph. Файлы из MSBuildWorkspace, эвристики как в Cascade IDE, но без .cascade/workspace.toml и без дерева IDE — только аргументы и встроенные пресеты (peers_only, no_namespace_noise, tests_and_peers, structure_only). Параметры: solution_or_project_path, file_path (якорь), mode; опционально line, column, max_*, include_kinds, exclude_kinds, preset.", |
| 77 | InputSchema = ToolSchemas.WorkspaceNavigationContext() |
| 78 | }, |
| 79 | new() |
| 80 | { |
| 81 | Name = "roslyn_sync_namespaces", |
| 82 | Description = |
| 83 | "Привести объявления namespace к структуре папок (RootNamespace + путь). Вызывать после переименования или перемещения папок в C# проекте: сначала dry_run для превью, затем без dry_run для применения. Обновляет также using в остальных файлах. Параметры: solution_or_project_path; опционально project_path, dry_run.", |
| 84 | InputSchema = ToolSchemas.SyncNamespaces() |
| 85 | }, |
| 86 | new() |
| 87 | { |
| 88 | Name = "roslyn_resolve_breakpoint", |
| 89 | Description = |
| 90 | "По имени символа (метод, свойство, конструктор) в файле вернуть file:line первой исполняемой строки — место для брейкпоинта. Параметры: solution_or_project_path, file_path, symbol_name.", |
| 91 | InputSchema = ToolSchemas.ResolveBreakpoint() |
| 92 | }, |
| 93 | new() |
| 94 | { |
| 95 | Name = "roslyn_generate_interface_from_class", |
| 96 | Description = |
| 97 | "Сгенерировать C# интерфейс по классу (без диалогов Roslyn). Позиция на класс в file_path:line:column. Опционально: interface_name, output_file_path, member_names (массив).", |
| 98 | InputSchema = ToolSchemas.GenerateInterfaceFromClass() |
| 99 | }, |
| 100 | new() |
| 101 | { |
| 102 | Name = "roslyn_generate_base_class_from_class", |
| 103 | Description = |
| 104 | "Сгенерировать абстрактный базовый класс по классу (без диалогов). Выбранные public-члены — abstract в новом классе. Опционально: base_class_name, output_file_path, member_names.", |
| 105 | InputSchema = ToolSchemas.GenerateBaseClassFromClass() |
| 106 | }, |
| 107 | new() |
| 108 | { |
| 109 | Name = "roslyn_generate_overrides", |
| 110 | Description = |
| 111 | "Generate Overrides без диалога: по позиции на класс генерирует override виртуальных/абстрактных членов базового типа. Опционально: member_names, insert_into_file.", |
| 112 | InputSchema = ToolSchemas.GenerateOverrides() |
| 113 | }, |
| 114 | new() |
| 115 | { |
| 116 | Name = "roslyn_generate_constructor_from_members", |
| 117 | Description = |
| 118 | "Generate constructor from members без диалога: по позиции на класс — конструктор по полям/свойствам. Опционально: member_names, insert_into_file.", |
| 119 | InputSchema = ToolSchemas.GenerateConstructorFromMembers() |
| 120 | }, |
| 121 | new() |
| 122 | { |
| 123 | Name = "roslyn_generate_equals_gethashcode", |
| 124 | Description = |
| 125 | "Generate Equals and GetHashCode без диалога: по позиции на класс — override по выбранным полям/свойствам. Опционально: member_names, insert_into_file.", |
| 126 | InputSchema = ToolSchemas.GenerateEqualsGetHashCode() |
| 127 | }, |
| 128 | new() |
| 129 | { |
| 130 | Name = "roslyn_move_members_to_partial_file", |
| 131 | Description = |
| 132 | "Перенести выбранные члены класса/структуры в новый .cs файл как вторую часть partial: те же using/namespace, в исходнике добавляется partial. member_names: имена методов/полей/свойств; конструктор — имя типа или .ctor; индексатор — this; перегрузки одного имени уходят вместе. output_file_path — путь нового файла (не должен существовать при apply). apply: false — превью, true — запись через TryApplyChanges (и новый файл в проекте). add_dependent_upon: по умолчанию true — после apply проставить DependentUpon в .csproj на исходный файл.", |
| 133 | InputSchema = ToolSchemas.MoveMembersToPartialFile() |
| 134 | }, |
| 135 | new() |
| 136 | { |
| 137 | Name = "roslyn_sync_dependent_upon_partials", |
| 138 | Description = |
| 139 | "Массово проставить DependentUpon для partial-файлов вида Type.Part.cs под Type.cs в той же папке (эвристика как в IDE). solution_or_project_path — .sln или .csproj; опционально project_path — один проект; dry_run — только отчёт без записи.", |
| 140 | InputSchema = ToolSchemas.SyncDependentUponPartials() |
| 141 | } |
| 142 | ]; |
| 143 | } |
| 144 | |