diff --git a/packages/server/src/server/agent/providers/claude-agent.ts b/packages/server/src/server/agent/providers/claude-agent.ts index e82dbf1f2..c7292b110 100644 --- a/packages/server/src/server/agent/providers/claude-agent.ts +++ b/packages/server/src/server/agent/providers/claude-agent.ts @@ -231,6 +231,17 @@ const DEFAULT_AGENT_CONTROL_MCP: AgentControlMcpConfig = { }, }; +function appendCallerAgentId(url: string, agentId: string): string { + try { + const parsed = new URL(url); + parsed.searchParams.set("callerAgentId", agentId); + return parsed.toString(); + } catch { + const separator = url.includes("?") ? "&" : "?"; + return `${url}${separator}callerAgentId=${encodeURIComponent(agentId)}`; + } +} + export function extractUserMessageText( content: string | ClaudeContentChunk[] ): string | null { @@ -690,16 +701,14 @@ class ClaudeAgentSession implements AgentSession { // Always include the agent-control MCP server so agents can launch other agents const agentControlConfig = this.agentControlMcp ?? DEFAULT_AGENT_CONTROL_MCP; - // Merge base headers with the caller agent ID header for parent-child relationships - const agentControlHeaders: Record = { - ...agentControlConfig.headers, - ...(this.managedAgentId ? { "X-Caller-Agent-Id": this.managedAgentId } : {}), - }; + const agentControlUrl = this.managedAgentId + ? appendCallerAgentId(agentControlConfig.url, this.managedAgentId) + : agentControlConfig.url; const defaultMcpServers: Record = { "agent-control": { type: "http", - url: agentControlConfig.url, - ...(Object.keys(agentControlHeaders).length > 0 ? { headers: agentControlHeaders } : {}), + url: agentControlUrl, + ...(agentControlConfig.headers ? { headers: agentControlConfig.headers } : {}), }, playwright: { type: "stdio", diff --git a/packages/server/src/server/index.ts b/packages/server/src/server/index.ts index 06abf0224..1663c4318 100644 --- a/packages/server/src/server/index.ts +++ b/packages/server/src/server/index.ts @@ -185,8 +185,14 @@ async function main() { }); return; } - // Extract caller agent ID from header (sent by agents when connecting) - const callerAgentId = req.header("X-Caller-Agent-Id"); + // Extract optional caller agent ID from query string (sent by agents when connecting) + const callerAgentIdRaw = req.query.callerAgentId; + const callerAgentId = + typeof callerAgentIdRaw === "string" + ? callerAgentIdRaw + : Array.isArray(callerAgentIdRaw) + ? callerAgentIdRaw[0] + : undefined; transport = await createAgentMcpTransport(callerAgentId); }