use core::future::Future;
use turbomcp_core::{Implementation, McpResult, ProtocolVersion};
use turbomcp_protocol::neutral;
use crate::context::{
CallToolContext, CompleteContext, GetPromptContext, ListPromptsContext,
ListResourceTemplatesContext, ListResourcesContext, ListToolsContext, ReadResourceContext,
};
pub trait McpServerCore: Clone + Send + Sync + 'static {
fn server_info(&self) -> Implementation;
fn supported_versions(&self) -> &'static [ProtocolVersion] {
ProtocolVersion::SUPPORTED
}
fn instructions(&self) -> Option<String> {
None
}
}
pub trait WithTools: McpServerCore {
fn list_tools(
&self,
ctx: &ListToolsContext,
params: neutral::ListParams,
) -> impl Future<Output = McpResult<neutral::ListToolsResult>> + Send;
fn call_tool(
&self,
ctx: &CallToolContext,
params: neutral::CallToolParams,
) -> impl Future<Output = McpResult<neutral::CallToolResult>> + Send;
}
pub trait WithResources: McpServerCore {
fn list_resources(
&self,
ctx: &ListResourcesContext,
params: neutral::ListParams,
) -> impl Future<Output = McpResult<neutral::ListResourcesResult>> + Send;
fn read_resource(
&self,
ctx: &ReadResourceContext,
params: neutral::ReadResourceParams,
) -> impl Future<Output = McpResult<neutral::ReadResourceResult>> + Send;
fn list_resource_templates(
&self,
_ctx: &ListResourceTemplatesContext,
_params: neutral::ListParams,
) -> impl Future<Output = McpResult<neutral::ListResourceTemplatesResult>> + Send {
core::future::ready(Ok(neutral::ListResourceTemplatesResult::default()))
}
}
pub trait WithPrompts: McpServerCore {
fn list_prompts(
&self,
ctx: &ListPromptsContext,
params: neutral::ListParams,
) -> impl Future<Output = McpResult<neutral::ListPromptsResult>> + Send;
fn get_prompt(
&self,
ctx: &GetPromptContext,
params: neutral::GetPromptParams,
) -> impl Future<Output = McpResult<neutral::GetPromptResult>> + Send;
}
pub trait WithCompletions: McpServerCore {
fn complete(
&self,
ctx: &CompleteContext,
params: neutral::CompleteParams,
) -> impl Future<Output = McpResult<neutral::CompleteResult>> + Send;
}