feat(gateway): MCP client — connect to external MCP servers as agent tools (#127) (#141)
All checks were successful
ci/woodpecker/push/ci Pipeline was successful

Co-authored-by: Jason Woltje <jason@diversecanvas.com>
Co-committed-by: Jason Woltje <jason@diversecanvas.com>
This commit was merged in pull request #141.
This commit is contained in:
2026-03-15 18:28:31 +00:00
committed by jason.woltje
parent f208f72dc0
commit 09e649fc7e
6 changed files with 385 additions and 2 deletions

View File

@@ -5,10 +5,11 @@ import { RoutingService } from './routing.service.js';
import { ProvidersController } from './providers.controller.js';
import { SessionsController } from './sessions.controller.js';
import { CoordModule } from '../coord/coord.module.js';
import { McpClientModule } from '../mcp-client/mcp-client.module.js';
@Global()
@Module({
imports: [CoordModule],
imports: [CoordModule, McpClientModule],
providers: [ProviderService, RoutingService, AgentService],
controllers: [ProvidersController, SessionsController],
exports: [AgentService, ProviderService, RoutingService],

View File

@@ -13,6 +13,7 @@ import { MEMORY } from '../memory/memory.tokens.js';
import { EmbeddingService } from '../memory/embedding.service.js';
import { CoordService } from '../coord/coord.service.js';
import { ProviderService } from './provider.service.js';
import { McpClientService } from '../mcp-client/mcp-client.service.js';
import { createBrainTools } from './tools/brain-tools.js';
import { createCoordTools } from './tools/coord-tools.js';
import { createMemoryTools } from './tools/memory-tools.js';
@@ -53,6 +54,7 @@ export class AgentService implements OnModuleDestroy {
@Inject(MEMORY) private readonly memory: Memory,
@Inject(EmbeddingService) private readonly embeddingService: EmbeddingService,
@Inject(CoordService) private readonly coordService: CoordService,
@Inject(McpClientService) private readonly mcpClientService: McpClientService,
) {
const fileBaseDir = process.env['AGENT_FILE_SANDBOX_DIR'] ?? process.cwd();
const gitDefaultCwd = process.env['AGENT_GIT_CWD'] ?? process.cwd();
@@ -96,6 +98,13 @@ export class AgentService implements OnModuleDestroy {
`Creating agent session: ${sessionId} (provider=${providerName}, model=${modelId})`,
);
// Combine static tools with dynamically discovered MCP client tools
const mcpTools = this.mcpClientService.getToolDefinitions();
const allCustomTools = [...this.customTools, ...mcpTools];
if (mcpTools.length > 0) {
this.logger.log(`Attaching ${mcpTools.length} MCP client tool(s) to session ${sessionId}`);
}
let piSession: PiAgentSession;
try {
const result = await createAgentSession({
@@ -103,7 +112,7 @@ export class AgentService implements OnModuleDestroy {
modelRegistry: this.providerService.getRegistry(),
model: model ?? undefined,
tools: [],
customTools: this.customTools,
customTools: allCustomTools,
});
piSession = result.session;
} catch (err) {