Skip to content

Commit 14c54cd

Browse files
committed
Replace duplicated MCP DI registrations with shared helpers
Replace the inline service registration blocks in MCP HTTP mode, MCP stdio mode, and co-hosted web mode with calls to the new AddMcpApplicationServices() and AddMcpResourcesAndTools() extension methods, removing ~50 lines of duplicated code. Closes #951 (DEBT-05).
1 parent c4d2a99 commit 14c54cd

1 file changed

Lines changed: 7 additions & 60 deletions

File tree

backend/src/Taskdeck.Api/Program.cs

Lines changed: 7 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -69,26 +69,8 @@
6969
// Infrastructure (DbContext, Repositories, UoW)
7070
mcpHttpBuilder.Services.AddInfrastructure(mcpHttpBuilder.Configuration);
7171

72-
// Register Application services needed by MCP resources and tools.
73-
mcpHttpBuilder.Services.AddScoped<Taskdeck.Application.Services.AuthorizationService>();
74-
mcpHttpBuilder.Services.AddScoped<Taskdeck.Application.Services.IAuthorizationService>(
75-
sp => sp.GetRequiredService<Taskdeck.Application.Services.AuthorizationService>());
76-
mcpHttpBuilder.Services.AddScoped<Taskdeck.Application.Services.BoardService>(sp =>
77-
new Taskdeck.Application.Services.BoardService(
78-
sp.GetRequiredService<IUnitOfWork>(),
79-
sp.GetRequiredService<Taskdeck.Application.Services.IAuthorizationService>()));
80-
mcpHttpBuilder.Services.AddScoped<Taskdeck.Application.Services.ColumnService>();
81-
mcpHttpBuilder.Services.AddScoped<Taskdeck.Application.Services.CardService>();
82-
mcpHttpBuilder.Services.AddScoped<Taskdeck.Application.Services.LabelService>();
83-
mcpHttpBuilder.Services.AddScoped<Taskdeck.Application.Services.AutomationProposalService>();
84-
mcpHttpBuilder.Services.AddScoped<Taskdeck.Application.Services.IAutomationProposalService>(
85-
sp => sp.GetRequiredService<Taskdeck.Application.Services.AutomationProposalService>());
86-
mcpHttpBuilder.Services.AddScoped<Taskdeck.Application.Services.CaptureService>();
87-
mcpHttpBuilder.Services.AddScoped<Taskdeck.Application.Services.ICaptureService>(
88-
sp => sp.GetRequiredService<Taskdeck.Application.Services.CaptureService>());
89-
mcpHttpBuilder.Services.AddScoped<Taskdeck.Application.Services.NotificationService>();
90-
mcpHttpBuilder.Services.AddScoped<Taskdeck.Application.Services.INotificationService>(
91-
sp => sp.GetRequiredService<Taskdeck.Application.Services.NotificationService>());
72+
// Application services needed by MCP resources and tools (shared with stdio mode).
73+
mcpHttpBuilder.Services.AddMcpApplicationServices();
9274

9375
// HTTP identity: maps API key to user via HttpUserContextProvider.
9476
mcpHttpBuilder.Services.AddHttpContextAccessor();
@@ -119,12 +101,7 @@
119101
// MCP server: HTTP transport + all resources and tools.
120102
mcpHttpBuilder.Services.AddMcpServer()
121103
.WithHttpTransport()
122-
.WithResources<BoardResources>()
123-
.WithResources<CaptureResources>()
124-
.WithResources<ProposalResources>()
125-
.WithTools<ReadTools>()
126-
.WithTools<WriteTools>()
127-
.WithTools<ProposalTools>();
104+
.AddMcpResourcesAndTools();
128105

129106
var mcpHttpApp = mcpHttpBuilder.Build();
130107

@@ -189,28 +166,8 @@
189166
// Infrastructure (DbContext, Repositories, UoW)
190167
services.AddInfrastructure(ctx.Configuration);
191168

192-
// Register Application services needed by MCP resources and tools.
193-
// We deliberately skip web-only services (SignalR notifiers, workers,
194-
// LLM providers, rate limiting, etc.) to keep the MCP host minimal.
195-
services.AddScoped<Taskdeck.Application.Services.AuthorizationService>();
196-
services.AddScoped<Taskdeck.Application.Services.IAuthorizationService>(
197-
sp => sp.GetRequiredService<Taskdeck.Application.Services.AuthorizationService>());
198-
services.AddScoped<Taskdeck.Application.Services.BoardService>(sp =>
199-
new Taskdeck.Application.Services.BoardService(
200-
sp.GetRequiredService<IUnitOfWork>(),
201-
sp.GetRequiredService<Taskdeck.Application.Services.IAuthorizationService>()));
202-
services.AddScoped<Taskdeck.Application.Services.ColumnService>();
203-
services.AddScoped<Taskdeck.Application.Services.CardService>();
204-
services.AddScoped<Taskdeck.Application.Services.LabelService>();
205-
services.AddScoped<Taskdeck.Application.Services.AutomationProposalService>();
206-
services.AddScoped<Taskdeck.Application.Services.IAutomationProposalService>(
207-
sp => sp.GetRequiredService<Taskdeck.Application.Services.AutomationProposalService>());
208-
services.AddScoped<Taskdeck.Application.Services.CaptureService>();
209-
services.AddScoped<Taskdeck.Application.Services.ICaptureService>(
210-
sp => sp.GetRequiredService<Taskdeck.Application.Services.CaptureService>());
211-
services.AddScoped<Taskdeck.Application.Services.NotificationService>();
212-
services.AddScoped<Taskdeck.Application.Services.INotificationService>(
213-
sp => sp.GetRequiredService<Taskdeck.Application.Services.NotificationService>());
169+
// Application services needed by MCP resources and tools (shared with HTTP mode).
170+
services.AddMcpApplicationServices();
214171

215172
// Stdio identity: maps the OS process owner to the local default user.
216173
services.AddScoped<IUserContextProvider, StdioUserContextProvider>();
@@ -221,12 +178,7 @@
221178
// MCP server: stdio transport + all resources and tools.
222179
services.AddMcpServer()
223180
.WithStdioServerTransport()
224-
.WithResources<BoardResources>()
225-
.WithResources<CaptureResources>()
226-
.WithResources<ProposalResources>()
227-
.WithTools<ReadTools>()
228-
.WithTools<WriteTools>()
229-
.WithTools<ProposalTools>();
181+
.AddMcpResourcesAndTools();
230182
})
231183
.Build();
232184

@@ -357,12 +309,7 @@
357309
builder.Services.AddMcpTelemetry();
358310
builder.Services.AddMcpServer()
359311
.WithHttpTransport()
360-
.WithResources<BoardResources>()
361-
.WithResources<CaptureResources>()
362-
.WithResources<ProposalResources>()
363-
.WithTools<ReadTools>()
364-
.WithTools<WriteTools>()
365-
.WithTools<ProposalTools>();
312+
.AddMcpResourcesAndTools();
366313

367314
// Add JWT Authentication (with optional GitHub OAuth and OIDC providers, circuit-breaker-protected backchannel)
368315
// CircuitBreakerStateTracker is already registered as a singleton by AddLlmProviders above.

0 commit comments

Comments
 (0)