do-memory-mcp 0.1.31

Model Context Protocol (MCP) server for AI agents
Documentation
use crate::types::Tool;
use serde_json::json;

pub(super) fn append_episode_relationship_tools(tools: &mut Vec<Tool>) {
    tools.push(Tool::new(
        "add_episode_relationship".to_string(),
        "Add a relationship between two episodes with validation".to_string(),
        json!({
            "type": "object",
            "properties": {
                "from_episode_id": {"type": "string", "description": "Source episode UUID", "format": "uuid"},
                "to_episode_id": {"type": "string", "description": "Target episode UUID", "format": "uuid"},
                "relationship_type": {
                    "type": "string",
                    "enum": ["parent_child", "depends_on", "follows", "related_to", "blocks", "duplicates", "references"],
                    "description": "Type of relationship"
                },
                "reason": {"type": "string", "description": "Optional explanation"},
                "priority": {"type": "integer", "minimum": 1, "maximum": 10, "description": "Optional priority (1-10)"},
                "created_by": {"type": "string", "description": "Optional creator identifier"}
            },
            "required": ["from_episode_id", "to_episode_id", "relationship_type"]
        }),
    ));

    tools.push(Tool::new(
        "remove_episode_relationship".to_string(),
        "Remove a relationship by ID".to_string(),
        json!({
            "type": "object",
            "properties": {
                "relationship_id": {"type": "string", "format": "uuid", "description": "Relationship UUID to remove"}
            },
            "required": ["relationship_id"]
        }),
    ));

    tools.push(Tool::new(
        "get_episode_relationships".to_string(),
        "Get relationships for an episode".to_string(),
        json!({
            "type": "object",
            "properties": {
                "episode_id": {"type": "string", "format": "uuid", "description": "Episode UUID to query"},
                "direction": {"type": "string", "enum": ["outgoing", "incoming", "both"], "default": "both", "description": "Direction filter"},
                "relationship_type": {
                    "type": "string",
                    "enum": ["parent_child", "depends_on", "follows", "related_to", "blocks", "duplicates", "references"],
                    "description": "Optional relationship type filter"
                }
            },
            "required": ["episode_id"]
        }),
    ));

    tools.push(Tool::new(
        "find_related_episodes".to_string(),
        "Find episodes related to a given episode".to_string(),
        json!({
            "type": "object",
            "properties": {
                "episode_id": {"type": "string", "format": "uuid", "description": "Episode UUID to find relationships for"},
                "relationship_type": {"type": "string", "description": "Optional relationship type filter"},
                "limit": {"type": "integer", "minimum": 1, "default": 10, "description": "Maximum number of results"},
                "include_metadata": {"type": "boolean", "default": false, "description": "Whether to include relationship metadata"}
            },
            "required": ["episode_id"]
        }),
    ));

    tools.push(Tool::new(
        "check_relationship_exists".to_string(),
        "Check if a specific relationship exists".to_string(),
        json!({
            "type": "object",
            "properties": {
                "from_episode_id": {"type": "string", "format": "uuid", "description": "Source episode UUID"},
                "to_episode_id": {"type": "string", "format": "uuid", "description": "Target episode UUID"},
                "relationship_type": {"type": "string", "description": "Type of relationship to check"}
            },
            "required": ["from_episode_id", "to_episode_id", "relationship_type"]
        }),
    ));

    tools.push(Tool::new(
        "get_dependency_graph".to_string(),
        "Get relationship graph for visualization".to_string(),
        json!({
            "type": "object",
            "properties": {
                "episode_id": {"type": "string", "format": "uuid", "description": "Root episode UUID"},
                "depth": {"type": "integer", "minimum": 1, "maximum": 5, "default": 2, "description": "Maximum traversal depth"},
                "format": {"type": "string", "enum": ["json", "dot"], "default": "json", "description": "Output format"}
            },
            "required": ["episode_id"]
        }),
    ));

    tools.push(Tool::new(
        "validate_no_cycles".to_string(),
        "Check if adding a relationship would create a cycle".to_string(),
        json!({
            "type": "object",
            "properties": {
                "from_episode_id": {"type": "string", "format": "uuid", "description": "Source episode UUID"},
                "to_episode_id": {"type": "string", "format": "uuid", "description": "Target episode UUID"},
                "relationship_type": {"type": "string", "description": "Type of relationship being added"}
            },
            "required": ["from_episode_id", "to_episode_id", "relationship_type"]
        }),
    ));

    tools.push(Tool::new(
        "get_topological_order".to_string(),
        "Get topological ordering of episodes".to_string(),
        json!({
            "type": "object",
            "properties": {
                "episode_ids": {
                    "type": "array",
                    "items": {"type": "string", "format": "uuid"},
                    "minItems": 1,
                    "description": "Array of episode UUIDs to sort"
                }
            },
            "required": ["episode_ids"]
        }),
    ));
}