Browse Source

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

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