Skip to main content
Glama
bschoepke

ableton-live-mcp

by bschoepke

live_events

Retrieve recent listener events from Ableton Live, with an optional limit to control how many events are returned.

Instructions

Drain retained Live listener events.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
limitNo

Implementation Reference

  • src/server.py:283-285 (registration)
    The 'live_events' tool is registered with the MCP server. It accepts a 'limit' integer parameter and forwards requests to the bridge method 'events'.
    server.add_tool(Tool("live_events", "Drain retained Live listener events.", schema({
        "limit": {"type": "integer", "minimum": 1},
    }), forward("events")))
  • The 'forward' helper generates a lambda that calls bridge.request(method, args), which is the generic handler used by live_events (forward('events')).
    def forward(method: str):
        return lambda args: bridge.request(method, args)
  • The bridge's 'request' method sends a JSON-RPC request over a socket to the Ableton Live bridge, handling retries and error responses.
    def request(self, method: str, params: dict[str, Any] | None = None) -> Any:
        params = params or {}
        payload = {
            "jsonrpc": "2.0",
            "id": next(self._ids),
            "method": method,
            "params": params,
        }
        with self._lock:
            try:
                response = self._send(payload)
            except OSError:
                self.close()
                try:
                    response = self._send(payload)
                except OSError as exc:
                    self.close()
                    raise AbletonBridgeError(f"Could not connect to Ableton bridge at {self.config.host}:{self.config.port}: {exc}") from exc
        message = json.loads(response.decode("utf-8"))
        if "error" in message:
            err = message["error"]
            detail = err.get("data") if os.environ.get("ABLETON_MCP_TRACEBACK") else ""
            suffix = f": {detail}" if detail else ""
            raise AbletonBridgeError(f"{err.get('code', -32000)} {err.get('message', 'Bridge error')}{suffix}")
        return message.get("result")
  • The schema for live_events defines a single 'limit' integer parameter (minimum: 1). No additional properties are allowed.
    server.add_tool(Tool("live_events", "Drain retained Live listener events.", schema({
        "limit": {"type": "integer", "minimum": 1},
    }), forward("events")))
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, and the description lacks behavioral details. The term 'drain' suggests a destructive or mutating operation, but this is not confirmed. Side effects, permissions, and response behavior are not disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very short but lacks essential information. It is not concise in a helpful way; it is under-specified, leaving ambiguity about the tool's operation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of annotations, output schema, and parameter descriptions, the description is completely insufficient. It does not explain what the tool returns, its side effects, or how it fits into the broader context of sibling tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter 'limit' has no description in the schema (0% coverage) and is not explained in the tool description. The description adds no meaning beyond the schema, failing to clarify its role (e.g., maximum number of events to drain).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Drain retained Live listener events' uses a specific verb 'Drain' and identifies a resource, but does not clarify what 'drain' means in this context (e.g., remove, process) or what 'retained Live listener events' are. It distinguishes from siblings like 'live_call' or 'live_set' but is still vague.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No usage guidelines are provided. The description does not indicate when to use this tool versus alternatives, nor does it mention prerequisites or when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

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/bschoepke/ableton-live-mcp'

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