diff --git a/.gitignore b/.gitignore
index 80c9c10a6..60c2b7e4c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -340,3 +340,9 @@ appcast.*.xml
*.tar.gz
.vscode/
Microsoft.AI.DirectML
+
+# Workspace build artifacts
+.dotnet/
+openutau-build/
+openutau-runtime/
+OpenUtau-linux-x64.zip
diff --git a/OpenUtau.Core/AgentBridge/BridgeCore.cs b/OpenUtau.Core/AgentBridge/BridgeCore.cs
new file mode 100644
index 000000000..4db5bfd31
--- /dev/null
+++ b/OpenUtau.Core/AgentBridge/BridgeCore.cs
@@ -0,0 +1,656 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Text.Json;
+using System.Threading;
+using System.Threading.Tasks;
+using OpenUtau.Api;
+using OpenUtau.Core.Format;
+using OpenUtau.Core.Render;
+using OpenUtau.Core.Ustx;
+using OpenUtau.Core.Util;
+using Serilog;
+
+namespace OpenUtau.Core.AgentBridge {
+ /// In-process MCP request dispatcher and local-file bridge. The HTTP listener is owned by McpService.
+ public static class BridgeCore {
+ private const int MaxRequestBytes = 1024 * 1024;
+ private static readonly JsonSerializerOptions JsonOptions = new() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
+ private static readonly object Gate = new();
+ private static CancellationTokenSource? cancellation;
+ private static Task? worker;
+ private static string? bridgeDirectory;
+ private static string sessionId = Guid.NewGuid().ToString("N");
+ private static UProject? currentProject;
+ private static readonly Dictionary