Module: AgentHarness::McpConfigTranslator

Defined in:
lib/agent_harness/mcp_config_translator.rb

Class Method Summary collapse

Class Method Details

.for_provider(provider, mcp_servers) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
# File 'lib/agent_harness/mcp_config_translator.rb', line 7

def for_provider(provider, mcp_servers)
  servers = normalize_servers(mcp_servers)

  case provider.to_sym
  when :anthropic, :claude, :claude_code
    translate_for_claude(servers)
  when :codex
    translate_for_codex(servers)
  when :openai
    translate_for_openai(servers)
  else
    servers.map(&:to_h)
  end
end

.normalize_servers(mcp_servers) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/agent_harness/mcp_config_translator.rb', line 22

def normalize_servers(mcp_servers)
  Array(mcp_servers).map do |server|
    case server
    when McpServer
      server
    when Hash
      McpServer.from_hash(server)
    else
      raise McpConfigurationError, "MCP server must be a Hash or McpServer, got #{server.class}"
    end
  end
end

.translate_for_claude(mcp_servers) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
# File 'lib/agent_harness/mcp_config_translator.rb', line 35

def translate_for_claude(mcp_servers)
  {
    mcpServers: mcp_servers.each_with_object({}) do |server, memo|
      entry = server.stdio? ? {command: server.command} : {url: server.url}
      entry[:args] = server.args if server.stdio? && !server.args.empty?
      entry[:env] = server.env unless server.env.empty?
      entry[:headers] = server.headers if server.http? && !server.headers.empty?
      memo[server.name] = entry
    end
  }
end

.translate_for_codex(mcp_servers) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
# File 'lib/agent_harness/mcp_config_translator.rb', line 47

def translate_for_codex(mcp_servers)
  {
    mcp_servers: mcp_servers.each_with_object({}) do |server, memo|
      entry = server.stdio? ? {command: server.command, transport: server.transport} : {url: server.url, transport: server.transport}
      entry[:args] = server.args if server.stdio? && !server.args.empty?
      entry[:env] = server.env unless server.env.empty?
      entry[:headers] = server.headers if server.http? && !server.headers.empty?
      memo[server.name] = entry
    end
  }
end

.translate_for_openai(mcp_servers) ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/agent_harness/mcp_config_translator.rb', line 59

def translate_for_openai(mcp_servers)
  mcp_servers.map do |server|
    unless server.http?
      raise McpTransportUnsupportedError.new(
        "Provider 'openai' only supports remote MCP servers over HTTP/SSE (server: '#{server.name}')",
        provider: :openai
      )
    end

    unsupported_headers = server.headers.keys - ["Authorization"]
    unless unsupported_headers.empty?
      raise McpConfigurationError,
        "OpenAI MCP translation only supports the Authorization header (server: '#{server.name}')"
    end

    tool = {
      type: "mcp",
      server_label: server.name,
      server_url: server.url,
      require_approval: "never"
    }
    tool[:authorization] = server.headers["Authorization"] if server.headers.key?("Authorization")
    tool
  end
end