Forge
csharp551a3611
1using System.Collections.Frozen;
2using System.Text.Json;
3using Microsoft.Build.Locator;
4using ModelContextProtocol;
5using ModelContextProtocol.Protocol;
6using ModelContextProtocol.Server;
7using RoslynMcp.Mcp;
8using Tool = ModelContextProtocol.Protocol.Tool;
9
10// MSBuildWorkspace и разрешение Analyzer/SourceGenerator-пакетов (в т.ч. CommunityToolkit.Mvvm) требуют зарегистрированный MSBuild.
11MSBuildLocator.RegisterDefaults();
12
13var toolsList = ToolCatalog.Build();
14
15var options = new McpServerOptions
16{
17 ServerInfo = new Implementation { Name = "RoslynMcp", Version = "0.5.0" },
18 ProtocolVersion = "2024-11-05",
19 Capabilities = new ServerCapabilities { Tools = new ToolsCapability { ListChanged = false } },
20 Handlers = new McpServerHandlers
21 {
22 ListToolsHandler = (_, _) => ValueTask.FromResult(new ListToolsResult { Tools = toolsList }),
23
24 CallToolHandler = async (request, cancellationToken) =>
25 {
26 var name = request.Params?.Name ?? "";
27 var args = request.Params?.Arguments is IReadOnlyDictionary<string, JsonElement> a
28 ? a
29 : FrozenDictionary<string, JsonElement>.Empty;
30 try
31 {
32 var text = await ToolHandlers.HandleAsync(name, args, cancellationToken).ConfigureAwait(false);
33 var isError = text.StartsWith("Error:", StringComparison.OrdinalIgnoreCase);
34 return new CallToolResult { Content = [new TextContentBlock { Text = text }], IsError = isError };
35 }
36 catch (ArgumentException ex)
37 {
38 return new CallToolResult { Content = [new TextContentBlock { Text = $"Error: {ex.Message}" }], IsError = true };
39 }
40 catch (Exception ex)
41 {
42 return new CallToolResult { Content = [new TextContentBlock { Text = $"Error: {ex.Message}" }], IsError = true };
43 }
44 }
45 }
46};
47
48var transport = new StdioServerTransport("RoslynMcp");
49await using var server = McpServer.Create(transport, options);
50await server.RunAsync();
51return 0;
52
View only · write via MCP/CIDE