Skip to main content
Glama

delete_epic

Remove an epic from Taiga project management platform using its unique ID, enabling efficient project and task management through the Taiga MCP Bridge.

Instructions

Deletes an epic by its ID.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
epic_idYes
session_idYes

Implementation Reference

  • The main handler function for the delete_epic MCP tool. It validates the session, retrieves the Taiga client wrapper, calls the epics.delete API method, logs the action, and returns a success response or propagates errors.
    @mcp.tool("delete_epic", description="Deletes an epic by its ID.") def delete_epic(session_id: str, epic_id: int) -> Dict[str, Any]: """Deletes an epic by ID.""" logger.warning( f"Executing delete_epic ID {epic_id} for session {session_id[:8]}...") taiga_client_wrapper = _get_authenticated_client(session_id) # Use wrapper variable name try: # Use pytaigaclient syntax: client.resource.delete(id=...) taiga_client_wrapper.api.epics.delete(id=epic_id) logger.info(f"Epic {epic_id} deleted successfully.") return {"status": "deleted", "epic_id": epic_id} except TaigaException as e: logger.error( f"Taiga API error deleting epic {epic_id}: {e}", exc_info=False) raise e except Exception as e: logger.error( f"Unexpected error deleting epic {epic_id}: {e}", exc_info=True) raise RuntimeError(f"Server error deleting epic: {e}")
  • Helper function used by delete_epic (and other tools) to retrieve and validate the authenticated TaigaClientWrapper instance from the active_sessions dictionary based on the session_id.
    def _get_authenticated_client(session_id: str) -> TaigaClientWrapper: """ Retrieves the authenticated TaigaClientWrapper for a given session ID. Raises PermissionError if the session is invalid or not found. """ client = active_sessions.get(session_id) # Also check if the client object itself exists and is authenticated if not client or not client.is_authenticated: logger.warning(f"Invalid or expired session ID provided: {session_id}") # Raise PermissionError - FastMCP will map this to an appropriate error response raise PermissionError( f"Invalid or expired session ID: '{session_id}'. Please login again.") logger.debug(f"Retrieved valid client for session ID: {session_id}") return client
  • The TaigaClientWrapper class provides the authenticated API client instance (self.api) used by delete_epic to access taiga_client_wrapper.api.epics.delete. It handles login and authentication state.
    class TaigaClientWrapper: """ A wrapper around the pytaiga-client library to manage API instance and authentication state. """ def __init__(self, host: str): if not host: raise ValueError("Taiga host URL cannot be empty.") # Store host, but initialize client later during login/token auth self.host = host # Use the new client type self.api: Optional[TaigaClient] = None logger.info(f"TaigaClientWrapper initialized for host: {self.host}") def login(self, username: str, password: str) -> bool: """ Authenticates with the Taiga instance using username and password. Uses pytaigaclient. """ try: logger.info( f"Attempting login for user '{username}' on {self.host}") # Initialize the client here api_instance = TaigaClient(host=self.host) # Use the auth resource's login method api_instance.auth.login(username=username, password=password) self.api = api_instance logger.info( f"Login successful for user '{username}'. Auth token acquired.") return True except TaigaException as e: logger.error( f"Taiga login failed for user '{username}': {e}", exc_info=False) self.api = None raise e except Exception as e: logger.error( f"An unexpected error occurred during login for user '{username}': {e}", exc_info=True) self.api = None # Wrap unexpected errors in TaigaException if needed, or re-raise raise TaigaException(f"Unexpected login error: {e}") # Add method for token authentication if needed by pytaigaclient # def set_token(self, token: str, token_type: str = "Bearer"): # logger.info(f"Initializing TaigaClient with token on {self.host}") # self.api = TaigaClient(host=self.host, auth_token=token, token_type=token_type) # logger.info("TaigaClient initialized with token.") @property def is_authenticated(self) -> bool: """Checks if the client is currently authenticated (has an API instance with a token).""" # Check if api exists and has a token return self.api is not None and self.api.auth_token is not None def _ensure_authenticated(self): """Internal helper to check authentication before API calls.""" if not self.is_authenticated: logger.error( "Action required authentication, but client is not logged in.") # Use a standard exception type that FastMCP might handle better, # or a custom one if needed. PermissionError fits well. raise PermissionError( "Client not authenticated. Please login first.") # No changes needed to _ensure_authenticated or is_authenticated property logic, # just the types and method calls within login.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/talhaorak/pytaiga-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server