Zuletzt aktiv 1751443983

sample_tools.cs Orginalformat
1using System.ComponentModel;
2using System.Data.SqlClient;
3using Microsoft.Extensions.Configuration;
4using ModelContextProtocol.Server;
5
6[McpServerToolType]
7public class DatabaseTools
8{
9 private readonly IConfiguration _configuration;
10 private readonly ILogger<DatabaseTools> _logger;
11
12 public DatabaseTools(IConfiguration configuration, ILogger<DatabaseTools> logger)
13 {
14 _configuration = configuration;
15 _logger = logger;
16 }
17
18 [McpServerTool, Description("데이터베이스에서 사용자 정보를 조회합니다.")]
19 public async Task<string> GetUserInfo(
20 [Description("조회할 사용자 ID")] int userId)
21 {
22 try
23 {
24 var connectionString = _configuration.GetConnectionString("DefaultConnection");
25 using var connection = new SqlConnection(connectionString);
26 await connection.OpenAsync();
27
28 var query = "SELECT Id, Name, Email, CreatedDate FROM Users WHERE Id = @UserId";
29 using var command = new SqlCommand(query, connection);
30 command.Parameters.AddWithValue("@UserId", userId);
31
32 using var reader = await command.ExecuteReaderAsync();
33 if (await reader.ReadAsync())
34 {
35 var user = new
36 {
37 Id = reader.GetInt32("Id"),
38 Name = reader.GetString("Name"),
39 Email = reader.GetString("Email"),
40 CreatedDate = reader.GetDateTime("CreatedDate")
41 };
42 return JsonSerializer.Serialize(user);
43 }
44 return "사용자를 찾을 수 없습니다.";
45 }
46 catch (Exception ex)
47 {
48 _logger.LogError(ex, "사용자 정보 조회 중 오류 발생");
49 return $"오류 발생: {ex.Message}";
50 }
51 }
52
53 [McpServerTool, Description("데이터베이스에서 주문 통계를 생성합니다.")]
54 public async Task<string> GetOrderStatistics(
55 [Description("시작 날짜 (yyyy-MM-dd)")] string startDate,
56 [Description("종료 날짜 (yyyy-MM-dd)")] string endDate)
57 {
58 try
59 {
60 var connectionString = _configuration.GetConnectionString("DefaultConnection");
61 using var connection = new SqlConnection(connectionString);
62 await connection.OpenAsync();
63
64 var query = @"
65 SELECT
66 COUNT(*) as TotalOrders,
67 SUM(Amount) as TotalAmount,
68 AVG(Amount) as AverageAmount,
69 MAX(Amount) as MaxAmount,
70 MIN(Amount) as MinAmount
71 FROM Orders
72 WHERE OrderDate BETWEEN @StartDate AND @EndDate";
73
74 using var command = new SqlCommand(query, connection);
75 command.Parameters.AddWithValue("@StartDate", DateTime.Parse(startDate));
76 command.Parameters.AddWithValue("@EndDate", DateTime.Parse(endDate));
77
78 using var reader = await command.ExecuteReaderAsync();
79 if (await reader.ReadAsync())
80 {
81 var stats = new
82 {
83 Period = $"{startDate} ~ {endDate}",
84 TotalOrders = reader.GetInt32("TotalOrders"),
85 TotalAmount = reader.GetDecimal("TotalAmount"),
86 AverageAmount = reader.GetDecimal("AverageAmount"),
87 MaxAmount = reader.GetDecimal("MaxAmount"),
88 MinAmount = reader.GetDecimal("MinAmount")
89 };
90 return JsonSerializer.Serialize(stats, new JsonSerializerOptions { WriteIndented = true });
91 }
92 return "통계 데이터를 찾을 수 없습니다.";
93 }
94 catch (Exception ex)
95 {
96 _logger.LogError(ex, "주문 통계 조회 중 오류 발생");
97 return $"오류 발생: {ex.Message}";
98 }
99 }
100}
101