Browse Source

feat(ai): The MCP tool does not interfere with the operation of other tools.

pull/1460/head
colin 11 hours ago
parent
commit
571be60e55
  1. 61
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Mcp/LINGYUN/Abp/AI/Tools/Mcp/McpAIToolProvider.cs

61
aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Mcp/LINGYUN/Abp/AI/Tools/Mcp/McpAIToolProvider.cs

@ -1,6 +1,7 @@
using LINGYUN.Abp.AI.Localization;
using Microsoft.Extensions.AI;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using ModelContextProtocol.Client;
using System;
using System.Collections.Generic;
@ -61,37 +62,47 @@ public class McpAIToolProvider : IAIToolProvider, ITransientDependency
public async virtual Task<AITool[]> CreateToolsAsync(AIToolDefinition definition)
{
var httpClient = HttpClientFactory.CreateMcpAIToolClient();
var httpClientTransportOptions = new HttpClientTransportOptions
try
{
Endpoint = new Uri(definition.GetMcpEndpoint()),
AdditionalHeaders = new Dictionary<string, string>(),
TransportMode = definition.GetMcpTransportMode(),
ConnectionTimeout = definition.GetMcpConnectionTimeout(),
MaxReconnectionAttempts = definition.GetMcpMaxReconnectionAttempts(),
};
var headers = definition.GetMcpHeaders();
foreach (var header in headers)
{
httpClientTransportOptions.AdditionalHeaders.TryAdd(header.Key, header.Value);
}
var httpClient = HttpClientFactory.CreateMcpAIToolClient();
var httpClientTransportOptions = new HttpClientTransportOptions
{
Endpoint = new Uri(definition.GetMcpEndpoint()),
AdditionalHeaders = new Dictionary<string, string>(),
TransportMode = definition.GetMcpTransportMode(),
ConnectionTimeout = definition.GetMcpConnectionTimeout(),
MaxReconnectionAttempts = definition.GetMcpMaxReconnectionAttempts(),
};
if (definition.IsUseMcpCurrentAccessToken())
{
var accessTokenProvider = ServiceProvider.GetRequiredService<IAbpAccessTokenProvider>();
var headers = definition.GetMcpHeaders();
foreach (var header in headers)
{
httpClientTransportOptions.AdditionalHeaders.TryAdd(header.Key, header.Value);
}
var token = await accessTokenProvider.GetTokenAsync();
if (!token.IsNullOrWhiteSpace())
if (definition.IsUseMcpCurrentAccessToken())
{
// TODO: 使用OAuth配置?
httpClientTransportOptions.AdditionalHeaders.TryAdd("Authorization", $"Bearer {token}");
var accessTokenProvider = ServiceProvider.GetRequiredService<IAbpAccessTokenProvider>();
var token = await accessTokenProvider.GetTokenAsync();
if (!token.IsNullOrWhiteSpace())
{
// TODO: 使用OAuth配置?
httpClientTransportOptions.AdditionalHeaders.TryAdd("Authorization", $"Bearer {token}");
}
}
}
var mcpClient = await McpClient.CreateAsync(
new HttpClientTransport(httpClientTransportOptions, httpClient));
var mcpClient = await McpClient.CreateAsync(
new HttpClientTransport(httpClientTransportOptions, httpClient));
return (await mcpClient.ListToolsAsync()).ToArray();
return (await mcpClient.ListToolsAsync()).ToArray();
}
catch (Exception ex)
{
ServiceProvider
.GetService<ILogger<McpAIToolProvider>>()
?.LogWarning(ex, "Mcp tool connection failed: {message}", ex.Message);
return [];
}
}
}

Loading…
Cancel
Save