mirror of
https://github.com/aljazceru/goose.git
synced 2026-01-18 05:44:28 +01:00
Co-authored-by: Michael Neale <michael.neale@gmail.com> Co-authored-by: Wendy Tang <wendytang@squareup.com> Co-authored-by: Jarrod Sibbison <72240382+jsibbison-square@users.noreply.github.com> Co-authored-by: Alex Hancock <alex.hancock@example.com> Co-authored-by: Alex Hancock <alexhancock@block.xyz> Co-authored-by: Lifei Zhou <lifei@squareup.com> Co-authored-by: Wes <141185334+wesrblock@users.noreply.github.com> Co-authored-by: Max Novich <maksymstepanenko1990@gmail.com> Co-authored-by: Zaki Ali <zaki@squareup.com> Co-authored-by: Salman Mohammed <smohammed@squareup.com> Co-authored-by: Kalvin C <kalvinnchau@users.noreply.github.com> Co-authored-by: Alec Thomas <alec@swapoff.org> Co-authored-by: lily-de <119957291+lily-de@users.noreply.github.com> Co-authored-by: kalvinnchau <kalvin@block.xyz> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Rizel Scarlett <rizel@squareup.com> Co-authored-by: bwrage <bwrage@squareup.com> Co-authored-by: Kalvin Chau <kalvin@squareup.com> Co-authored-by: Alice Hau <110418948+ahau-square@users.noreply.github.com> Co-authored-by: Alistair Gray <ajgray@stripe.com> Co-authored-by: Nahiyan Khan <nahiyan.khan@gmail.com> Co-authored-by: Alex Hancock <alexhancock@squareup.com> Co-authored-by: Nahiyan Khan <nahiyan@squareup.com> Co-authored-by: marcelle <1852848+laanak08@users.noreply.github.com> Co-authored-by: Yingjie He <yingjiehe@block.xyz> Co-authored-by: Yingjie He <yingjiehe@squareup.com> Co-authored-by: Lily Delalande <ldelalande@block.xyz> Co-authored-by: Adewale Abati <acekyd01@gmail.com> Co-authored-by: Ebony Louis <ebony774@gmail.com> Co-authored-by: Angie Jones <jones.angie@gmail.com> Co-authored-by: Ebony Louis <55366651+EbonyLouis@users.noreply.github.com>
74 lines
2.0 KiB
Rust
74 lines
2.0 KiB
Rust
use async_trait::async_trait;
|
|
use schemars::JsonSchema;
|
|
use serde::{Deserialize, Serialize};
|
|
use serde_json::Value;
|
|
use thiserror::Error;
|
|
|
|
#[non_exhaustive]
|
|
#[derive(Error, Debug, Clone, Deserialize, Serialize, PartialEq)]
|
|
pub enum ToolError {
|
|
#[error("Invalid parameters: {0}")]
|
|
InvalidParameters(String),
|
|
#[error("Execution failed: {0}")]
|
|
ExecutionError(String),
|
|
#[error("Schema error: {0}")]
|
|
SchemaError(String),
|
|
#[error("Tool not found: {0}")]
|
|
NotFound(String),
|
|
}
|
|
|
|
pub type ToolResult<T> = std::result::Result<T, ToolError>;
|
|
|
|
#[derive(Error, Debug)]
|
|
pub enum ResourceError {
|
|
#[error("Execution failed: {0}")]
|
|
ExecutionError(String),
|
|
#[error("Resource not found: {0}")]
|
|
NotFound(String),
|
|
}
|
|
|
|
#[derive(Error, Debug)]
|
|
pub enum PromptError {
|
|
#[error("Invalid parameters: {0}")]
|
|
InvalidParameters(String),
|
|
#[error("Internal error: {0}")]
|
|
InternalError(String),
|
|
#[error("Prompt not found: {0}")]
|
|
NotFound(String),
|
|
}
|
|
|
|
/// Trait for implementing MCP tools
|
|
#[async_trait]
|
|
pub trait ToolHandler: Send + Sync + 'static {
|
|
/// The name of the tool
|
|
fn name(&self) -> &'static str;
|
|
|
|
/// A description of what the tool does
|
|
fn description(&self) -> &'static str;
|
|
|
|
/// JSON schema describing the tool's parameters
|
|
fn schema(&self) -> Value;
|
|
|
|
/// Execute the tool with the given parameters
|
|
async fn call(&self, params: Value) -> ToolResult<Value>;
|
|
}
|
|
|
|
/// Trait for implementing MCP resources
|
|
#[async_trait]
|
|
pub trait ResourceTemplateHandler: Send + Sync + 'static {
|
|
/// The URL template for this resource
|
|
fn template() -> &'static str;
|
|
|
|
/// JSON schema describing the resource parameters
|
|
fn schema() -> Value;
|
|
|
|
/// Get the resource value
|
|
async fn get(&self, params: Value) -> ToolResult<String>;
|
|
}
|
|
|
|
/// Helper function to generate JSON schema for a type
|
|
pub fn generate_schema<T: JsonSchema>() -> ToolResult<Value> {
|
|
let schema = schemars::schema_for!(T);
|
|
serde_json::to_value(schema).map_err(|e| ToolError::SchemaError(e.to_string()))
|
|
}
|