Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions apps/server/src/jobs/service.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -116,6 +116,17 @@ export class JobService {
}
}

async getJobById(jobId: string): Promise<JobRecord | null> {
return this.store.getJob(jobId);
}

async getJobByName(
directory: string,
name: string
): Promise<JobRecord | null> {
return this.store.getJobByDirectoryAndName(directory, name);
}

async runJob(input: RunJobInput): Promise<RunJobResult> {
const job = await this.getJobOrThrow(input.directory, input.name);

Expand Down
51 changes: 50 additions & 1 deletion apps/server/src/routes/mcp.ts
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
import path from "node:path";

import type { FastifyInstance } from "fastify";

import type { AgentManager } from "../agents/manager.js";
import type { BrainStore } from "../brain/store.js";
import type { JobService } from "../jobs/service.js";
import type { AddJobInput, JobService } from "../jobs/service.js";
import type {
TemplateService,
AddTemplateInput,
} from "../templates/service.js";
import {
resolveRepoRoot,
resolveWorktreeRoot,
} from "../shared/git/git-context.js";
import type { CrudToolCallbacks } from "../shared/mcp/crud-tools.js";
import { handleMcpRequest } from "../shared/mcp/server.js";

type McpRouteDeps = {
Expand All@@ -15,6 +22,7 @@ type McpRouteDeps = {
};
agentManager: AgentManager;
jobService: JobService;
templateService: TemplateService;
brainStore: BrainStore;
publishBrainChanged: (repoRoot: string) => void;
getBearerToken: (request: {
Expand DownExpand Up@@ -56,6 +64,45 @@ type McpRouteDeps = {
mcpMethodNotAllowed: () => unknown;
};

function buildCrudCallbacks(deps: McpRouteDeps): CrudToolCallbacks {
return {
listJobs: async (directory) => {
const jobs = await deps.jobService.listJobs();
if (!directory) return jobs;
const resolved = path.resolve(directory);
return jobs.filter((j) => j.directory === resolved);
},
getJobById: (jobId) => deps.jobService.getJobById(jobId),
getJobByName: (directory, name) =>
deps.jobService.getJobByName(directory, name),
createJob: (input) => deps.jobService.addJob(input as AddJobInput),
updateJob: (input) => deps.jobService.updateJob(input as AddJobInput),
deleteJob: (name, directory) =>
deps.jobService.removeJob({ name, directory }),
runJob: (name, directory) =>
deps.jobService.runJob({ name, directory, wait: false }),
listTemplates: async (directory) => {
const templates = await deps.templateService.listTemplates();
if (!directory) return templates;
const resolved = path.resolve(directory);
return templates.filter((t) => t.directory === resolved);
},
getTemplateById: (templateId) =>
deps.templateService.getTemplate(templateId),
getTemplateByName: (directory, name) =>
deps.templateService.getTemplateByName(directory, name),
createTemplate: (input) =>
deps.templateService.addTemplate(input as AddTemplateInput),
updateTemplate: (templateId, input) =>
deps.templateService.updateTemplate(
templateId,
input as Partial<AddTemplateInput>
),
deleteTemplate: (templateId) =>
deps.templateService.removeTemplate(templateId),
};
}

export async function registerMcpRoutes(
app: FastifyInstance,
deps: McpRouteDeps
Expand DownExpand Up@@ -171,6 +218,7 @@ export async function registerMcpRoutes(
>,
toolScope: run ? "job" : "agent",
jobTools,
crudTools: buildCrudCallbacks(deps),
brainStore: deps.brainStore,
publishBrainChanged: deps.publishBrainChanged,
} as Parameters<typeof handleMcpRequest>[3]);
Expand DownExpand Up@@ -255,6 +303,7 @@ export async function registerMcpRoutes(
deps.agentManager.getFeedbackSummary(params as never) as Promise<
Record<string, unknown>
>,
crudTools: buildCrudCallbacks(deps),
brainStore: deps.brainStore,
publishBrainChanged: deps.publishBrainChanged,
} as Parameters<typeof handleMcpRequest>[3]);
Expand Down
1 change: 1 addition & 0 deletions apps/server/src/server.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -442,6 +442,7 @@ async function registerRoutes() {
config,
agentManager,
jobService,
templateService,
brainStore,
publishBrainChanged: (repoRoot: string) =>
uiEventBroker.publish({ type: "brain.changed", repoRoot }),
Expand Down
Loading
Loading