# SPDX-License-Identifier: Apache-2.0 # Copyright (c) 2025 Dashbit defmodule Corex.MCP.Tools.Components do @moduledoc false alias Corex.MCP.ComponentDocs def tools do [ %{ name: "list_components", description: "List all Corex component ids from the package registry (atoms serialized as strings, e.g. accordion, date_picker).", inputSchema: %{ type: "object", properties: %{} }, annotations: %{"readOnlyHint" => true, "idempotentHint" => true}, callback: &list_components/1 }, %{ name: "get_component", description: """ Return the Elixir module, function component names/arity, optional markdown module docs, source path when known, and docs_note when docs are absent or non-markdown. Pass id as from list_components (e.g. accordion, date_picker). """, inputSchema: %{ type: "object", required: ["id"], properties: %{ id: %{ type: "string", description: "Component id, e.g. accordion or data_table" } } }, annotations: %{"readOnlyHint" => true, "idempotentHint" => true}, callback: &get_component/1 } ] end def list_components(_args) do ids = for id <- Corex.component_ids(), do: to_string(id) {:ok, Corex.Json.encode!(%{"components" => ids})} end def get_component(%{"id" => id}) when is_binary(id) do case Corex.component_module_for_mcp_id(id) do {:ok, mod} -> atom_id = String.to_existing_atom(id) case Corex.component_spec(atom_id) do {:ok, spec} -> payload = ComponentDocs.enrich(spec, mod) {:ok, Corex.Json.encode!(payload)} :error -> {:error, "Unknown component id. Use list_components for valid ids."} end :error -> {:error, "Unknown component id. Use list_components for valid ids."} end end def get_component(_), do: {:error, :invalid_arguments} end