get_browser_items_at_path_tool
Retrieve browser items stored at a specified path in Ableton Live to organize or access project files and samples directly within the music production workflow.
Instructions
Get browser items at a specific path in Ableton's browser.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Implementation Reference
- MCP_Server/server.py:152-156 (handler)MCP tool handler and registration for 'get_browser_items_at_path_tool'. This is the entry point for the tool in the MCP server, delegating to the browser tools implementation.@mcp.tool() def get_browser_items_at_path_tool(ctx: Context, path: str) -> str: """Get browser items at a specific path in Ableton's browser.""" return get_browser_items_at_path(ctx, path)
- Server-side helper function that handles the tool logic by sending the 'get_browser_items_at_path' command to the Ableton remote script and formatting the response.def get_browser_items_at_path(ctx: Context, path: str) -> str: """ Get browser items at a specific path in Ableton's browser. Parameters: - path: Path in the format "category/folder/subfolder" where category is one of the available browser categories in Ableton """ try: ableton = get_ableton_connection() result = ableton.send_command("get_browser_items_at_path", {"path": path}) # Check if there was an error with available categories if "error" in result and "available_categories" in result: error = result.get("error", "") available_cats = result.get("available_categories", []) return f"Error: {error}\n" f"Available browser categories: {', '.join(available_cats)}" return json.dumps(result, indent=2) except Exception as e: error_msg = str(e) if "Browser is not available" in error_msg: logger.error(f"Browser is not available in Ableton: {error_msg}") return "Error: The Ableton browser is not available. Make sure Ableton Live is fully loaded and try again." elif "Could not access Live application" in error_msg: logger.error(f"Could not access Live application: {error_msg}") return "Error: Could not access the Ableton Live application. Make sure Ableton Live is running and the Remote Script is loaded." elif "Unknown or unavailable category" in error_msg: logger.error(f"Invalid browser category: {error_msg}") return f"Error: {error_msg}. Please check the available categories using get_browser_tree." elif "Path part" in error_msg and "not found" in error_msg: logger.error(f"Path not found: {error_msg}") return f"Error: {error_msg}. Please check the path and try again." else: logger.error(f"Error getting browser items at path: {error_msg}") return f"Error getting browser items at path: {error_msg}"
- Core handler implementation in the Ableton Live remote script that performs the actual browser navigation and retrieves items at the given path using Live's API.def get_browser_items_at_path(self, path: str) -> dict[str, Any]: """ Get browser items at a specific path. Args: path: Path in the format "category/folder/subfolder" where category is one of: instruments, sounds, drums, audio_effects, midi_effects or any other available browser category Returns: Dictionary with items at the specified path """ try: # Access the application's browser instance instead of creating a new one app = self.control_surface.application() if not app: raise RuntimeError("Could not access Live application") # Check if browser is available if not hasattr(app, "browser") or app.browser is None: raise RuntimeError("Browser is not available in the Live application") # Log available browser attributes to help diagnose issues browser_attrs = [attr for attr in dir(app.browser) if not attr.startswith("_")] self.log_message(f"Available browser attributes: {browser_attrs}") # Parse the path path_parts = path.split("/") if not path_parts: raise ValueError("Invalid path") # Determine the root category root_category = path_parts[0].lower() current_item = None # Check standard categories first if root_category == "instruments" and hasattr(app.browser, "instruments"): current_item = app.browser.instruments elif root_category == "sounds" and hasattr(app.browser, "sounds"): current_item = app.browser.sounds elif root_category == "drums" and hasattr(app.browser, "drums"): current_item = app.browser.drums elif root_category == "audio_effects" and hasattr(app.browser, "audio_effects"): current_item = app.browser.audio_effects elif root_category == "midi_effects" and hasattr(app.browser, "midi_effects"): current_item = app.browser.midi_effects else: # Try to find the category in other browser attributes found = False for attr in browser_attrs: if attr.lower() == root_category: try: current_item = getattr(app.browser, attr) found = True break except Exception as e: self.log_message(f"Error accessing browser attribute {attr}: {str(e)}") if not found: # If we still haven't found the category, return available categories return { "path": path, "error": f"Unknown or unavailable category: {root_category}", "available_categories": browser_attrs, "items": [], } # Navigate through the path for i in range(1, len(path_parts)): part = path_parts[i] if not part: # Skip empty parts continue if not hasattr(current_item, "children"): return { "path": path, "error": "Item at '{0}' has no children".format("/".join(path_parts[:i])), "items": [], } found = False for child in current_item.children: if hasattr(child, "name") and child.name.lower() == part.lower(): current_item = child found = True break if not found: return { "path": path, "error": f"Path part '{part}' not found", "items": [], } # Get items at the current path items = [] if hasattr(current_item, "children"): for child in current_item.children: item_info = { "name": child.name if hasattr(child, "name") else "Unknown", "is_folder": hasattr(child, "children") and bool(child.children), "is_device": hasattr(child, "is_device") and child.is_device, "is_loadable": hasattr(child, "is_loadable") and child.is_loadable, "uri": child.uri if hasattr(child, "uri") else None, } items.append(item_info) result = { "path": path, "name": current_item.name if hasattr(current_item, "name") else "Unknown", "uri": current_item.uri if hasattr(current_item, "uri") else None, "is_folder": hasattr(current_item, "children") and bool(current_item.children), "is_device": hasattr(current_item, "is_device") and current_item.is_device, "is_loadable": hasattr(current_item, "is_loadable") and current_item.is_loadable, "items": items, } self.log_message(f"Retrieved {len(items)} items at path: {path}") return result except Exception as e: self.log_message(f"Error getting browser items at path: {str(e)}") self.log_message(traceback.format_exc()) raise