Current section
Files
Jump to
Current section
Files
examples/live_app_server_mcp.exs
Mix.Task.run("app.start")
Code.require_file(Path.expand("support/example_helper.exs", __DIR__))
alias CodexExamples.Support
Support.init!()
defmodule CodexExamples.LiveAppServerMcp do
@moduledoc false
def main(_argv) do
codex_opts = Support.codex_options!()
:ok = Support.ensure_app_server_supported(codex_opts)
{:ok, conn} = Codex.AppServer.connect(codex_opts, init_timeout_ms: 30_000)
try do
IO.puts("Listing MCP servers via app-server:")
case Codex.AppServer.Mcp.list_servers(conn, detail: :tools_and_auth_only) do
{:ok, %{"data" => servers} = response} when is_list(servers) ->
IO.puts("Found #{length(servers)} MCP server(s).")
Enum.each(servers, &print_server/1)
if Map.has_key?(response, "nextCursor") do
IO.puts("\nnextCursor: #{inspect(response["nextCursor"])}")
end
other ->
IO.inspect(other)
end
IO.puts("""
Additional MCP helpers now available in the SDK:
- Codex.AppServer.Mcp.resource_read/4
- Codex.AppServer.Mcp.tool_call/5
Those calls are thread-scoped and should only be used against resources or
tools you trust. This example lists inventory only and avoids auto-running
mutable MCP tools.
""")
after
:ok = Codex.AppServer.disconnect(conn)
end
end
defp print_server(%{} = server) do
name = Map.get(server, "name") || "(unknown)"
requires_auth = Map.get(server, "requiresAuth")
tool_names = tool_names(server)
resources =
case Map.get(server, "resources") do
list when is_list(list) -> length(list)
_ -> 0
end
IO.puts("""
- #{name}
requiresAuth: #{inspect(requires_auth)}
tools: #{length(tool_names)}
resources: #{resources}
""")
Enum.each(tool_names, fn tool_name ->
qualified_name = Codex.MCP.Client.qualify_tool_name(name, tool_name)
IO.puts(" tool: #{tool_name}")
IO.puts(" qualified: #{qualified_name}")
end)
end
defp tool_names(%{"tools" => %{} = tools}) do
Map.keys(tools)
end
defp tool_names(%{"tools" => tools}) when is_list(tools) do
Enum.map(tools, fn
%{"name" => name} -> name
%{name: name} -> name
other -> inspect(other)
end)
end
defp tool_names(_server), do: []
end
CodexExamples.LiveAppServerMcp.main(System.argv())