Forge
csharp551a3611
1using ModelContextProtocol.Protocol;
2using RoslynMcp.Mcp;
3using 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>
6internal 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
View only · write via MCP/CIDE