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