< Summary

Information
Class: UIBlazor.Components.Settings.MCPTestRun
Assembly: UIBlazor
File(s): /home/runner/work/InvAit/InvAit/UIBlazor/Components/Settings/MCPTestRun.razor
Tag: 71_26091983037
Line coverage
0%
Covered lines: 0
Uncovered lines: 41
Coverable lines: 41
Total lines: 97
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 18
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
BuildRenderTree(...)0%620%
get_ToolManager()100%210%
get_ServerName()100%210%
get_Tool()100%210%
.ctor()100%210%
OnParametersSet()100%210%
RunMcpToolAsync()0%272160%

File(s)

/home/runner/work/InvAit/InvAit/UIBlazor/Components/Settings/MCPTestRun.razor

#LineLine coverage
 1@using Shared.Contracts.Mcp
 2@using System.Dynamic
 3
 4<Details Text=@SharedResource.Description" IsRounded>
 5    <MarkdownBlock Content="@Tool.Description" />
 6</Details>
 7
 8<RadzenTemplateForm TItem="JsonSchemaProperty" Data="@_jsonSchemaProperty" Submit="RunMcpToolAsync">
 9    <RadzenStack Gap="1em">
 10        <MCPShemaProperties SchemaProperty="_jsonSchemaProperty" Values="@_formData" />
 11        <RadzenButton ButtonType="ButtonType.Submit" Text="@Tool.Name" IsBusy="@IsBusy" />
 12    </RadzenStack>
 13</RadzenTemplateForm>
 14
 015@if (!string.IsNullOrEmpty(Result))
 16{
 17    <RadzenText Text="Result" TextStyle="TextStyle.Overline" />
 18    <MarkdownBlock Content="@Result" />
 19}
 20
 21@code {
 022    [Inject] IToolManager ToolManager { get; set; } = null!;
 023    [Parameter] public string ServerName { get; set; } = null!;
 024    [Parameter] public McpToolConfig Tool { get; set; } = null!;
 25
 26    private JsonSchemaProperty? _jsonSchemaProperty;
 027    private Dictionary<string, object?> _formData = [];
 028    private string Result = string.Empty;
 29    private bool IsBusy = false;
 30
 31    protected override void OnParametersSet()
 32    {
 033        base.OnParametersSet();
 034        _jsonSchemaProperty = SchemaProcessor.DeserializeSchema(Tool.InputSchema);
 035    }
 36
 37    private async Task RunMcpToolAsync()
 38    {
 039        IsBusy = true;
 040        var tool = ToolManager.GetMcpTools().FirstOrDefault(t => t.Name == $"mcp__{ServerName}__{Tool.Name}");
 41
 042        if (tool is not null)
 43        {
 044            var filterdArgs = _formData
 045                .Where(f => f.Value is not null)
 046                .ToDictionary(f => f.Key, f => f.Value!);
 47
 048            var vsToolResult = await tool.ExecuteAsync(filterdArgs, CancellationToken.None);
 49#if DEBUG
 50            vsToolResult = HeadlessMocker.GetVsToolResult(vsToolResult);
 51#endif
 052            if (vsToolResult.Success)
 53            {
 54                try
 55                {
 056                    var mcpToolResult = JsonUtils.Deserialize<MCPToolResult>(vsToolResult.Result);
 057                    if (mcpToolResult is null)
 58                    {
 059                        Result = "## Error";
 60                    }
 61                    else
 62                    {
 063                        var sb = new StringBuilder();
 064                        foreach (var content in mcpToolResult.Content)
 65                        {
 066                            sb.AppendLine(
 067                                content.Type switch
 068                                {
 069                                    "text" => content.Text,
 070                                    "image" => $"## Image\n{content.Data}\n##MimeType\n{content.MimeType}",
 071                                    "resource" => $"## Resource\n{(content.Resource != null ? JsonUtils.Serialize(conten
 072                                    _ => "## Error - undefined content type"
 073                                }
 074                            );
 75                        }
 076                        Result = sb.ToString();
 77                    }
 078                }
 079                catch
 80                {
 081                    Result = vsToolResult.Result;
 082                }
 83            }
 84            else
 85            {
 086                Result = $"## Error: {vsToolResult.ErrorMessage}";
 87            }
 88        }
 89        else
 90        {
 091            Result = "## Error: Tool is not find";
 92        }
 93
 094        IsBusy = false;
 095        await InvokeAsync(StateHasChanged);
 096    }
 97}