# capture_since

Source: https://libtmux.org/en/ts/latest/mcp/tools/capture_since/

> Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. What a pane has printed since you last looked. Call it once with no cursor to start watching and get the current screen; keep the cursor it returns and pass it back each time after that, and you are charged only for what is new. This is the tool for watching a build, a log, or a test run — not a capture_pane loop. Set waitMs to block until something arrives rather than returning empty. Reports the stream in the order it was written, so a program that draws by moving the cursor (a progress bar, a full-screen TUI) reads jumbled here — capture_pane renders those.

tool MCPlatest

MCP concept example

A working example of the core library. It can change without notice.

[What concept means](https://libtmux.org/en/meta/support/#concept-and-alpha)

* **capture_since**( [cursor](https://libtmux.org/en/ts/latest/mcp/tools/capture_since/#mcp.tool.capture_since.input%2Fproperties%2Fcursor)?: [string](https://json-schema.org/understanding-json-schema/reference/string "string (JSON Schema)"), [maxLines](https://libtmux.org/en/ts/latest/mcp/tools/capture_since/#mcp.tool.capture_since.input%2Fproperties%2FmaxLines)?: [integer](https://json-schema.org/understanding-json-schema/reference/numeric "numeric (JSON Schema)"), [paneId](https://libtmux.org/en/ts/latest/mcp/tools/capture_since/#mcp.tool.capture_since.input%2Fproperties%2FpaneId): [string](https://json-schema.org/understanding-json-schema/reference/string "string (JSON Schema)"), [waitMs](https://libtmux.org/en/ts/latest/mcp/tools/capture_since/#mcp.tool.capture_since.input%2Fproperties%2FwaitMs)?: [integer](https://json-schema.org/understanding-json-schema/reference/numeric "numeric (JSON Schema)"), )

  tool \[[source](https://github.com/libtmux/libtmux-ts/blob/46cccfef2a546de55ce8b308249b8c76339089a0/packages/mcp/src/tools/capture.ts#L132)][¶](https://libtmux.org/en/ts/latest/mcp/tools/capture_since/#mcp.tool.capture_since)

  Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. What a pane has printed since you last looked. Call it once with no cursor to start watching and get the current screen; keep the cursor it returns and pass it back each time after that, and you are charged only for what is new. This is the tool for watching a build, a log, or a test run — not a [capture_pane](https://libtmux.org/en/ts/latest/mcp/tools/capture_pane/) loop. Set waitMs to block until something arrives rather than returning empty. Reports the stream in the order it was written, so a program that draws by moving the cursor (a progress bar, a full-screen TUI) reads jumbled here — [capture_pane](https://libtmux.org/en/ts/latest/mcp/tools/capture_pane/) renders those.

  * MCP request method

    `tools/call` Send `capture_since` as the tool name, with the arguments below.

  ## Arguments[#](https://libtmux.org/en/ts/latest/mcp/tools/capture_since/#mcp.tool.capture_since.parameters)

  * **[`cursor`](https://libtmux.org/en/ts/latest/mcp/tools/capture_since/#mcp.tool.capture_since.input%2Fproperties%2Fcursor)**? ([string](https://json-schema.org/understanding-json-schema/reference/string "string (JSON Schema)"))

    The cursor from your previous capture_since. Omit on the first call.

    * pattern

      `"^ltxc1\\.[0-9a-f]{32}\\.(?:0|[1-9][0-9]*)$"`

  * **[`maxLines`](https://libtmux.org/en/ts/latest/mcp/tools/capture_since/#mcp.tool.capture_since.input%2Fproperties%2FmaxLines)**? ([integer](https://json-schema.org/understanding-json-schema/reference/numeric "numeric (JSON Schema)"))

    Keep at most this many lines, from the end. Defaults to the server limit.

    * maximum

      `9007199254740991`

    * exclusiveMinimum

      `0`

  * **[`paneId`](https://libtmux.org/en/ts/latest/mcp/tools/capture_since/#mcp.tool.capture_since.input%2Fproperties%2FpaneId)** ([string](https://json-schema.org/understanding-json-schema/reference/string "string (JSON Schema)"))

    Stable pane id, e.g. %1.

    * pattern

      `"^%\\d+$"`

  * **[`waitMs`](https://libtmux.org/en/ts/latest/mcp/tools/capture_since/#mcp.tool.capture_since.input%2Fproperties%2FwaitMs)**? ([integer](https://json-schema.org/understanding-json-schema/reference/numeric "numeric (JSON Schema)"))

    Wait up to this long for new output before answering. Default 0.

    * minimum

      `0`

    * maximum

      `9007199254740991`

  ## Result[#](https://libtmux.org/en/ts/latest/mcp/tools/capture_since/#mcp.tool.capture_since.result)

  Returns [object](https://json-schema.org/understanding-json-schema/reference/object "object (JSON Schema)")

  * **[`byteClamped`](https://libtmux.org/en/ts/latest/mcp/tools/capture_since/#mcp.tool.capture_since.output%2Fproperties%2FbyteClamped)** ([boolean](https://json-schema.org/understanding-json-schema/reference/boolean "boolean (JSON Schema)"))

    Whether the byte ceiling shortened this result.

  * **[`cursor`](https://libtmux.org/en/ts/latest/mcp/tools/capture_since/#mcp.tool.capture_since.output%2Fproperties%2Fcursor)** ([string](https://json-schema.org/understanding-json-schema/reference/string "string (JSON Schema)") | [null](https://json-schema.org/understanding-json-schema/reference/null "null (JSON Schema)"))

    Pass this to the next capture_since call; null means streaming was unavailable.

    Matches one or more variants.

    * **[Variant 1](https://libtmux.org/en/ts/latest/mcp/tools/capture_since/#mcp.tool.capture_since.output%2Fproperties%2Fcursor%2FanyOf%2F0)** ([string](https://json-schema.org/understanding-json-schema/reference/string "string (JSON Schema)"))

      * pattern

        `"^ltxc1\\.[0-9a-f]{32}\\.(?:0|[1-9][0-9]*)$"`

  * **[`droppedLines`](https://libtmux.org/en/ts/latest/mcp/tools/capture_since/#mcp.tool.capture_since.output%2Fproperties%2FdroppedLines)** ([integer](https://json-schema.org/understanding-json-schema/reference/numeric "numeric (JSON Schema)"))

    * minimum

      `-9007199254740991`

    * maximum

      `9007199254740991`

  * **[`effectiveTimeoutMs`](https://libtmux.org/en/ts/latest/mcp/tools/capture_since/#mcp.tool.capture_since.output%2Fproperties%2FeffectiveTimeoutMs)** ([integer](https://json-schema.org/understanding-json-schema/reference/numeric "numeric (JSON Schema)"))

    The wait ceiling applied; zero when this call did not wait on a live stream.

    * minimum

      `-9007199254740991`

    * maximum

      `9007199254740991`

  * **[`missedBytes`](https://libtmux.org/en/ts/latest/mcp/tools/capture_since/#mcp.tool.capture_since.output%2Fproperties%2FmissedBytes)** ([integer](https://json-schema.org/understanding-json-schema/reference/numeric "numeric (JSON Schema)"))

    Output that scrolled past before this read reached it. Non-zero means you fell behind.

    * minimum

      `-9007199254740991`

    * maximum

      `9007199254740991`

  * **[`omittedBytes`](https://libtmux.org/en/ts/latest/mcp/tools/capture_since/#mcp.tool.capture_since.output%2Fproperties%2FomittedBytes)** ([integer](https://json-schema.org/understanding-json-schema/reference/numeric "numeric (JSON Schema)"))

    Result bytes omitted after capture or streaming.

    * minimum

      `-9007199254740991`

    * maximum

      `9007199254740991`

  * **[`paneId`](https://libtmux.org/en/ts/latest/mcp/tools/capture_since/#mcp.tool.capture_since.output%2Fproperties%2FpaneId)** ([string](https://json-schema.org/understanding-json-schema/reference/string "string (JSON Schema)"))

    Stable pane id, e.g. %1.

    * pattern

      `"^%\\d+$"`

  * **[`rangeClamped`](https://libtmux.org/en/ts/latest/mcp/tools/capture_since/#mcp.tool.capture_since.output%2Fproperties%2FrangeClamped)** ([boolean](https://json-schema.org/understanding-json-schema/reference/boolean "boolean (JSON Schema)"))

    Whether result limits shortened a grid capture.

  * **[`returnedBytes`](https://libtmux.org/en/ts/latest/mcp/tools/capture_since/#mcp.tool.capture_since.output%2Fproperties%2FreturnedBytes)** ([integer](https://json-schema.org/understanding-json-schema/reference/numeric "numeric (JSON Schema)"))

    * minimum

      `-9007199254740991`

    * maximum

      `9007199254740991`

  * **[`seeded`](https://libtmux.org/en/ts/latest/mcp/tools/capture_since/#mcp.tool.capture_since.output%2Fproperties%2Fseeded)** ([boolean](https://json-schema.org/understanding-json-schema/reference/boolean "boolean (JSON Schema)"))

    True when this call started the watch and returned the screen.

  * **[`streaming`](https://libtmux.org/en/ts/latest/mcp/tools/capture_since/#mcp.tool.capture_since.output%2Fproperties%2Fstreaming)** ([boolean](https://json-schema.org/understanding-json-schema/reference/boolean "boolean (JSON Schema)"))

    False when no control connection was available and this fell back to capturing.

  * **[`text`](https://libtmux.org/en/ts/latest/mcp/tools/capture_since/#mcp.tool.capture_since.output%2Fproperties%2Ftext)** ([string](https://json-schema.org/understanding-json-schema/reference/string "string (JSON Schema)"))

  No other properties are accepted.

  ## Annotations[#](https://libtmux.org/en/ts/latest/mcp/tools/capture_since/#mcp.tool.capture_since.annotations)

  * [`destructiveHint`](https://libtmux.org/en/ts/latest/mcp/reference/glossary/#destructiveHint)

    `true`

  * [`idempotentHint`](https://libtmux.org/en/ts/latest/mcp/reference/glossary/#idempotentHint)

    `false`

  * [`openWorldHint`](https://libtmux.org/en/ts/latest/mcp/reference/glossary/#openWorldHint)

    `true`

  * [`readOnlyHint`](https://libtmux.org/en/ts/latest/mcp/reference/glossary/#readOnlyHint)

    `false`

  ## Protocol data[#](https://libtmux.org/en/ts/latest/mcp/tools/capture_since/#mcp.tool.capture_since.schemas)

  Use the complete advertised contract for validation and client integration.

  Input schema

  ```json
  {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "properties": {
      "cursor": {
        "description": "The cursor from your previous capture_since. Omit on the first call.",
        "pattern": "^ltxc1\\.[0-9a-f]{32}\\.(?:0|[1-9][0-9]*)$",
        "type": "string"
      },
      "maxLines": {
        "description": "Keep at most this many lines, from the end. Defaults to the server limit.",
        "exclusiveMinimum": 0,
        "maximum": 9007199254740991,
        "type": "integer"
      },
      "paneId": {
        "description": "Stable pane id, e.g. %1.",
        "pattern": "^%\\d+$",
        "type": "string"
      },
      "waitMs": {
        "description": "Wait up to this long for new output before answering. Default 0.",
        "maximum": 9007199254740991,
        "minimum": 0,
        "type": "integer"
      }
    },
    "required": [
      "paneId"
    ],
    "type": "object"
  }
  ```

  Output schema

  ```json
  {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "additionalProperties": false,
    "properties": {
      "byteClamped": {
        "description": "Whether the byte ceiling shortened this result.",
        "type": "boolean"
      },
      "cursor": {
        "anyOf": [
          {
            "pattern": "^ltxc1\\.[0-9a-f]{32}\\.(?:0|[1-9][0-9]*)$",
            "type": "string"
          },
          {
            "type": "null"
          }
        ],
        "description": "Pass this to the next capture_since call; null means streaming was unavailable."
      },
      "droppedLines": {
        "maximum": 9007199254740991,
        "minimum": -9007199254740991,
        "type": "integer"
      },
      "effectiveTimeoutMs": {
        "description": "The wait ceiling applied; zero when this call did not wait on a live stream.",
        "maximum": 9007199254740991,
        "minimum": -9007199254740991,
        "type": "integer"
      },
      "missedBytes": {
        "description": "Output that scrolled past before this read reached it. Non-zero means you fell behind.",
        "maximum": 9007199254740991,
        "minimum": -9007199254740991,
        "type": "integer"
      },
      "omittedBytes": {
        "description": "Result bytes omitted after capture or streaming.",
        "maximum": 9007199254740991,
        "minimum": -9007199254740991,
        "type": "integer"
      },
      "paneId": {
        "description": "Stable pane id, e.g. %1.",
        "pattern": "^%\\d+$",
        "type": "string"
      },
      "rangeClamped": {
        "description": "Whether result limits shortened a grid capture.",
        "type": "boolean"
      },
      "returnedBytes": {
        "maximum": 9007199254740991,
        "minimum": -9007199254740991,
        "type": "integer"
      },
      "seeded": {
        "description": "True when this call started the watch and returned the screen.",
        "type": "boolean"
      },
      "streaming": {
        "description": "False when no control connection was available and this fell back to capturing.",
        "type": "boolean"
      },
      "text": {
        "type": "string"
      }
    },
    "required": [
      "byteClamped",
      "cursor",
      "droppedLines",
      "effectiveTimeoutMs",
      "missedBytes",
      "paneId",
      "omittedBytes",
      "rangeClamped",
      "returnedBytes",
      "seeded",
      "streaming",
      "text"
    ],
    "type": "object"
  }
  ```
