diff --git a/MoneyMap.Mcp/ConfigReceiptStorageOptions.cs b/MoneyMap.Mcp/ConfigReceiptStorageOptions.cs new file mode 100644 index 0000000..522cd51 --- /dev/null +++ b/MoneyMap.Mcp/ConfigReceiptStorageOptions.cs @@ -0,0 +1,15 @@ +using Microsoft.Extensions.Configuration; +using MoneyMap.Services; + +namespace MoneyMap.Mcp; + +public class ConfigReceiptStorageOptions : IReceiptStorageOptions +{ + public string ReceiptsBasePath { get; } + + public ConfigReceiptStorageOptions(IConfiguration config) + { + ReceiptsBasePath = config["Receipts:StoragePath"] + ?? throw new InvalidOperationException("Receipts:StoragePath not configured"); + } +} diff --git a/MoneyMap.Mcp/MoneyMap.Mcp.csproj b/MoneyMap.Mcp/MoneyMap.Mcp.csproj new file mode 100644 index 0000000..b5a3596 --- /dev/null +++ b/MoneyMap.Mcp/MoneyMap.Mcp.csproj @@ -0,0 +1,27 @@ + + + Exe + net8.0 + enable + enable + + + + + + + + + + + + + + + + + + PreserveNewest + + + diff --git a/MoneyMap.Mcp/Program.cs b/MoneyMap.Mcp/Program.cs new file mode 100644 index 0000000..148aa30 --- /dev/null +++ b/MoneyMap.Mcp/Program.cs @@ -0,0 +1,22 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using MoneyMap.Core; +using MoneyMap.Mcp; +using MoneyMap.Services; + +var builder = Host.CreateApplicationBuilder(args); + +builder.Logging.ClearProviders(); +builder.Logging.AddConsole(options => options.LogToStandardErrorThreshold = LogLevel.Trace); + +builder.Services.AddMoneyMapCore(builder.Configuration); +builder.Services.AddSingleton(); + +builder.Services + .AddMcpServer() + .WithStdioServerTransport() + .WithToolsFromAssembly(typeof(Program).Assembly); + +var app = builder.Build(); +await app.RunAsync(); diff --git a/MoneyMap.Mcp/appsettings.json b/MoneyMap.Mcp/appsettings.json new file mode 100644 index 0000000..0caf842 --- /dev/null +++ b/MoneyMap.Mcp/appsettings.json @@ -0,0 +1,8 @@ +{ + "ConnectionStrings": { + "MoneyMapDb": "Server=barge.lan;Database=MoneyMap;User Id=moneymap;Password=Cn87oXQPj7EEkx;TrustServerCertificate=True;" + }, + "Receipts": { + "StoragePath": "\\\\TRUENAS\\receipts" + } +} diff --git a/MoneyMap.sln b/MoneyMap.sln index 10734c0..0871417 100644 --- a/MoneyMap.sln +++ b/MoneyMap.sln @@ -9,6 +9,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MoneyMap.Tests", "MoneyMap. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MoneyMap.Core", "MoneyMap.Core\MoneyMap.Core.csproj", "{A927BF5C-8F88-43D0-9801-4587FEDFBAAF}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MoneyMap.Mcp", "MoneyMap.Mcp\MoneyMap.Mcp.csproj", "{6EBFB935-A23F-4A7B-B2DF-2C61458E88A8}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -55,6 +57,18 @@ Global {A927BF5C-8F88-43D0-9801-4587FEDFBAAF}.Release|x64.Build.0 = Release|Any CPU {A927BF5C-8F88-43D0-9801-4587FEDFBAAF}.Release|x86.ActiveCfg = Release|Any CPU {A927BF5C-8F88-43D0-9801-4587FEDFBAAF}.Release|x86.Build.0 = Release|Any CPU + {6EBFB935-A23F-4A7B-B2DF-2C61458E88A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6EBFB935-A23F-4A7B-B2DF-2C61458E88A8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6EBFB935-A23F-4A7B-B2DF-2C61458E88A8}.Debug|x64.ActiveCfg = Debug|Any CPU + {6EBFB935-A23F-4A7B-B2DF-2C61458E88A8}.Debug|x64.Build.0 = Debug|Any CPU + {6EBFB935-A23F-4A7B-B2DF-2C61458E88A8}.Debug|x86.ActiveCfg = Debug|Any CPU + {6EBFB935-A23F-4A7B-B2DF-2C61458E88A8}.Debug|x86.Build.0 = Debug|Any CPU + {6EBFB935-A23F-4A7B-B2DF-2C61458E88A8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6EBFB935-A23F-4A7B-B2DF-2C61458E88A8}.Release|Any CPU.Build.0 = Release|Any CPU + {6EBFB935-A23F-4A7B-B2DF-2C61458E88A8}.Release|x64.ActiveCfg = Release|Any CPU + {6EBFB935-A23F-4A7B-B2DF-2C61458E88A8}.Release|x64.Build.0 = Release|Any CPU + {6EBFB935-A23F-4A7B-B2DF-2C61458E88A8}.Release|x86.ActiveCfg = Release|Any CPU + {6EBFB935-A23F-4A7B-B2DF-2C61458E88A8}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE