///|
pub(all) struct ListToolsResult {
  tools : Array[@types.ToolDefinition]
  next_cursor : String?
} derive(Debug, Eq)

///|
pub(all) struct CallToolResult {
  content : Array[@types.ContentItem]
  is_error : Bool
} derive(Debug, Eq)

///|
pub(all) struct ListResourcesResult {
  resources : Array[@resource.ResourceDefinition]
  next_cursor : String?
} derive(Debug, Eq)

///|
pub(all) struct ReadResourceResult {
  contents : Array[@resource.ResourceReadResult]
} derive(Debug, Eq)

///|
pub(all) struct ListPromptsResult {
  prompts : Array[@prompt.PromptDefinition]
  next_cursor : String?
} derive(Debug, Eq)

///|
pub(all) struct ResourceTemplate {
  uri_template : String
  name : String
  description : String?
  mime_type : String?
} derive(Debug, Eq)

///|
pub(all) struct ListResourceTemplatesResult {
  resource_templates : Array[ResourceTemplate]
  next_cursor : String?
} derive(Debug, Eq)

///|
pub(all) struct CompletionResult {
  values : Array[String]
  total : Int?
  has_more : Bool?
} derive(Debug, Eq)

///|
/// Filter for a `subscriptions/listen` request. Controls which server
/// notification channels the client wants multiplexed onto this single
/// long-lived request.
pub(all) struct ListenFilter {
  tools_list_changed : Bool
  prompts_list_changed : Bool
  resources_list_changed : Bool
  resource_subscriptions : Array[String]
} derive(Debug, Eq)

///|
/// Default filter: subscribe only to list-change notifications, with no
/// per-resource subscriptions.
pub fn ListenFilter::default() -> ListenFilter {
  {
    tools_list_changed: true,
    prompts_list_changed: true,
    resources_list_changed: true,
    resource_subscriptions: [],
  }
}