CMDC.MCP.Client (cmdc v0.3.0)

Copy Markdown View Source

Anubis MCP 客户端封装。

每个配置的 MCP server 对应一个 CMDC.MCP.Client 进程, 由 CMDC.MCP.Supervisor 管理。负责 transport 管理、协议协商, 并提供简洁的工具操作 API。

进程命名

使用 {:via, Registry, {CMDC.MCP.Registry, {:mcp_client, server_name}}} 注册, 避免动态创建 atom。

支持的 transport

  • {:stdio, [command: "cmd", args: ["arg1"]]} — 本地进程 stdio
  • {:streamable_http, [base_url: "...", mcp_path: "..."]} — HTTP Stream transport
  • {:sse, [base_url: "...", mcp_path: "..."]} — SSE(旧版)

Summary

Functions

Adds a root directory or resource.

等待命名 MCP server 完成初始化握手。

Calls a specific tool by name with optional arguments.

为命名 MCP server 连接构建 child spec。

Clears all registered roots.

返回 MCP server client GenServer 的注册进程名(via-tuple)。

Closes the client connection gracefully.

Completes a partial result reference.

Gets a specific prompt by name with optional arguments.

Gets the server's declared capabilities.

Gets the server information including name and version.

Lists all available prompts from the server.

Lists all available resource templates from the server.

Lists all available resources from the server.

Lists all registered roots.

Lists all available tools from the server.

Merges additional capabilities into the client.

Sends a ping request to the MCP server.

Reads a specific resource by URI.

Registers a callback for log messages.

Registers a callback for progress updates.

Removes a root directory or resource.

Sends a progress update for a token.

列出命名 MCP server 上的所有资源。

列出命名 MCP server 上的所有工具。

读取命名 MCP server 上的资源。

Sets the server's log level.

返回 MCP server transport 进程的注册进程名(via-tuple)。

Unregisters the log callback.

Unregisters a progress callback.

Functions

add_root(uri, name \\ nil, opts \\ [])

Adds a root directory or resource.

Examples

:ok = MyClient.add_root("file:///project", "My Project")

await_ready(server_name, timeout_ms \\ 5000)

@spec await_ready(String.t(), pos_integer()) :: :ok | {:error, :timeout}

等待命名 MCP server 完成初始化握手。

轮询 get_server_capabilities,直到非 nil 或超时。 就绪返回 :ok,超时返回 {:error, :timeout}

call_tool(name, args \\ nil, opts \\ [])

Calls a specific tool by name with optional arguments.

Examples

{:ok, result} = MyClient.call_tool("search", %{query: "elixir"})

cancel_all_requests(reason \\ "client_cancelled", opts \\ [])

Cancels all pending requests.

Examples

:ok = MyClient.cancel_all_requests("shutting_down")

cancel_request(request_id, reason \\ "client_cancelled", opts \\ [])

Cancels a specific request by ID.

Examples

:ok = MyClient.cancel_request("req-123")

child_spec(opts)

@spec child_spec(map()) :: Supervisor.child_spec()

为命名 MCP server 连接构建 child spec。

参数

  • server_config — 包含 :name(String)和 :transport(tuple)的 map

clear_roots(opts \\ [])

Clears all registered roots.

Examples

:ok = MyClient.clear_roots()

client_name(server_name)

@spec client_name(String.t()) :: {:via, module(), {module(), term()}}

返回 MCP server client GenServer 的注册进程名(via-tuple)。

close()

Closes the client connection gracefully.

Examples

:ok = MyClient.close()

complete(ref, argument, opts \\ [])

Completes a partial result reference.

Examples

{:ok, result} = MyClient.complete(ref, "completed")

get_prompt(name, args \\ nil, opts \\ [])

Gets a specific prompt by name with optional arguments.

Examples

{:ok, prompt} = MyClient.get_prompt("greeting", %{name: "Alice"})

get_server_capabilities(opts \\ [])

Gets the server's declared capabilities.

Examples

{:ok, capabilities} = MyClient.get_server_capabilities()

get_server_info(opts \\ [])

Gets the server information including name and version.

Examples

{:ok, info} = MyClient.get_server_info()

list_prompts(opts \\ [])

Lists all available prompts from the server.

Options

  • :cursor - Pagination cursor
  • :timeout - Request timeout in milliseconds

Examples

{:ok, prompts} = MyClient.list_prompts()

list_resource_templates(opts \\ [])

Lists all available resource templates from the server.

Options

  • :cursor - Pagination cursor
  • :timeout - Request timeout in milliseconds

Examples

{:ok, resources} = MyClient.list_resources_templates()

list_resources(opts \\ [])

Lists all available resources from the server.

Options

  • :cursor - Pagination cursor
  • :timeout - Request timeout in milliseconds

Examples

{:ok, resources} = MyClient.list_resources()

list_roots(opts \\ [])

Lists all registered roots.

Examples

{:ok, roots} = MyClient.list_roots()

list_tools(opts \\ [])

Lists all available tools from the server.

Options

  • :cursor - Pagination cursor
  • :timeout - Request timeout in milliseconds

Examples

{:ok, tools} = MyClient.list_tools()

merge_capabilities(add, opts \\ [])

Merges additional capabilities into the client.

Examples

:ok = MyClient.merge_capabilities(%{"experimental" => %{}})

ping(opts \\ [])

Sends a ping request to the MCP server.

Options

  • :timeout - Request timeout in milliseconds (default: 5000)

Examples

{:ok, :pong} = MyClient.ping()

read_resource(uri, opts \\ [])

Reads a specific resource by URI.

Examples

{:ok, content} = MyClient.read_resource("file:///path/to/file")

register_log_callback(cb, opts \\ [])

Registers a callback for log messages.

Examples

:ok = MyClient.register_log_callback(fn log -> IO.puts(log) end)

register_progress_callback(token, callback, opts \\ [])

Registers a callback for progress updates.

Examples

:ok = MyClient.register_progress_callback("task-1", fn progress -> 
  IO.puts("Progress: #{progress}")
end)

remove_root(uri, opts \\ [])

Removes a root directory or resource.

Examples

:ok = MyClient.remove_root("file:///project")

send_progress(token, progress, total \\ nil, opts \\ [])

Sends a progress update for a token.

Examples

:ok = MyClient.send_progress("task-1", 50, 100)

server_call_tool(server_name, tool_name, args \\ nil, opts \\ [])

@spec server_call_tool(String.t(), String.t(), map() | nil, keyword()) ::
  {:ok, term()} | {:error, term()}

调用命名 MCP server 上的工具。

server_list_resources(server_name, opts \\ [])

@spec server_list_resources(
  String.t(),
  keyword()
) :: {:ok, term()} | {:error, term()}

列出命名 MCP server 上的所有资源。

server_list_tools(server_name, opts \\ [])

@spec server_list_tools(
  String.t(),
  keyword()
) :: {:ok, term()} | {:error, term()}

列出命名 MCP server 上的所有工具。

server_read_resource(server_name, uri, opts \\ [])

@spec server_read_resource(String.t(), String.t(), keyword()) ::
  {:ok, term()} | {:error, term()}

读取命名 MCP server 上的资源。

set_log_level(level)

Sets the server's log level.

Examples

:ok = MyClient.set_log_level("debug")

start_link(opts)

transport_name(server_name)

@spec transport_name(String.t()) :: {:via, module(), {module(), term()}}

返回 MCP server transport 进程的注册进程名(via-tuple)。

unregister_log_callback(opts \\ [])

Unregisters the log callback.

unregister_progress_callback(token, opts \\ [])

Unregisters a progress callback.